summaryrefslogtreecommitdiff
path: root/firmware/2lib/2sha_utility.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/2lib/2sha_utility.c')
-rw-r--r--firmware/2lib/2sha_utility.c130
1 files changed, 130 insertions, 0 deletions
diff --git a/firmware/2lib/2sha_utility.c b/firmware/2lib/2sha_utility.c
new file mode 100644
index 00000000..66e8b692
--- /dev/null
+++ b/firmware/2lib/2sha_utility.c
@@ -0,0 +1,130 @@
+/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ *
+ * Utility functions for message digest functions.
+ */
+
+#include "2sysincludes.h"
+#include "2common.h"
+#include "2rsa.h"
+#include "2sha.h"
+
+/* Hash algorithms. Note that they line up with key algorithms. */
+enum vb2_hash_algorithm {
+ VB2_HASH_SHA1 = VB2_ALG_RSA1024_SHA1,
+ VB2_HASH_SHA256 = VB2_ALG_RSA1024_SHA256,
+ VB2_HASH_SHA512 = VB2_ALG_RSA1024_SHA512,
+
+ /* Number of hash algorithms */
+ VB2_HASH_COUNT
+};
+
+/**
+ * Convert key algorithm to hash algorithm.
+ */
+static enum vb2_hash_algorithm vb2_hash_alg(uint32_t algorithm)
+{
+ if (algorithm < VB2_ALG_COUNT)
+ return algorithm % VB2_HASH_COUNT;
+ else
+ return VB2_HASH_COUNT;
+}
+
+int vb2_digest_size(uint32_t algorithm)
+{
+ switch (vb2_hash_alg(algorithm)) {
+#if VB2_SUPPORT_SHA1
+ case VB2_HASH_SHA1:
+ return VB2_SHA1_DIGEST_SIZE;
+#endif
+#if VB2_SUPPORT_SHA256
+ case VB2_HASH_SHA256:
+ return VB2_SHA256_DIGEST_SIZE;
+#endif
+#if VB2_SUPPORT_SHA512
+ case VB2_HASH_SHA512:
+ return VB2_SHA512_DIGEST_SIZE;
+#endif
+ default:
+ return 0;
+ }
+}
+
+int vb2_digest_init(struct vb2_digest_context *dc, uint32_t algorithm)
+{
+ dc->algorithm = algorithm;
+
+ switch (vb2_hash_alg(dc->algorithm)) {
+#if VB2_SUPPORT_SHA1
+ case VB2_HASH_SHA1:
+ vb2_sha1_init(&dc->sha1);
+ return VB2_SUCCESS;
+#endif
+#if VB2_SUPPORT_SHA256
+ case VB2_HASH_SHA256:
+ vb2_sha256_init(&dc->sha256);
+ return VB2_SUCCESS;
+#endif
+#if VB2_SUPPORT_SHA512
+ case VB2_HASH_SHA512:
+ vb2_sha512_init(&dc->sha512);
+ return VB2_SUCCESS;
+#endif
+ default:
+ return VB2_ERROR_BAD_ALGORITHM;
+ }
+}
+
+int vb2_digest_extend(struct vb2_digest_context *dc,
+ const uint8_t *buf,
+ uint32_t size)
+{
+ switch (vb2_hash_alg(dc->algorithm)) {
+#if VB2_SUPPORT_SHA1
+ case VB2_HASH_SHA1:
+ vb2_sha1_update(&dc->sha1, buf, size);
+ return VB2_SUCCESS;
+#endif
+#if VB2_SUPPORT_SHA256
+ case VB2_HASH_SHA256:
+ vb2_sha256_update(&dc->sha256, buf, size);
+ return VB2_SUCCESS;
+#endif
+#if VB2_SUPPORT_SHA512
+ case VB2_HASH_SHA512:
+ vb2_sha512_update(&dc->sha512, buf, size);
+ return VB2_SUCCESS;
+#endif
+ default:
+ return VB2_ERROR_BAD_ALGORITHM;
+ }
+}
+
+int vb2_digest_finalize(struct vb2_digest_context *dc,
+ uint8_t *digest,
+ uint32_t digest_size)
+{
+ if (digest_size < vb2_digest_size(dc->algorithm))
+ return VB2_ERROR_BUFFER_TOO_SMALL;
+
+ switch (vb2_hash_alg(dc->algorithm)) {
+#if VB2_SUPPORT_SHA1
+ case VB2_HASH_SHA1:
+ vb2_sha1_finalize(&dc->sha1, digest);
+ return VB2_SUCCESS;
+#endif
+#if VB2_SUPPORT_SHA256
+ case VB2_HASH_SHA256:
+ vb2_sha256_finalize(&dc->sha256, digest);
+ return VB2_SUCCESS;
+#endif
+#if VB2_SUPPORT_SHA512
+ case VB2_HASH_SHA512:
+ vb2_sha512_finalize(&dc->sha512, digest);
+ return VB2_SUCCESS;
+#endif
+ default:
+ return VB2_ERROR_BAD_ALGORITHM;
+ }
+}