summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorJi Luo <ji.luo@nxp.com>2019-06-21 08:52:40 +0800
committerJi Luo <ji.luo@nxp.com>2019-07-17 11:44:42 +0800
commit7a18b1643d7cd7c454b653e8cf1db83043824764 (patch)
tree2f4e1fba9fa2e41e80a81d98c59200380f6f805b /lib
parent52eb9a780f1d6c5097d8bc82b16946192f025d9e (diff)
MA-15015 Add sha256_hmac support
Add sha256 hmac support in u-boot. Test: hmac calculation. Change-Id: I0f1438fed8290620a1bb0663d19c21e20098eb5a Signed-off-by: Ji Luo <ji.luo@nxp.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/sha256.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/lib/sha256.c b/lib/sha256.c
index 7f5a3618d0..f9b6bce72e 100644
--- a/lib/sha256.c
+++ b/lib/sha256.c
@@ -290,3 +290,43 @@ void sha256_csum_wd(const unsigned char *input, unsigned int ilen,
sha256_finish(&ctx, output);
}
+
+/*
+ * Output = HMAC-SHA-256( input buffer, hmac key )
+ */
+void sha256_hmac(const unsigned char *key, int keylen,
+ const unsigned char *input, unsigned int ilen,
+ unsigned char *output)
+{
+ int i;
+ sha256_context ctx;
+ unsigned char k_ipad[64];
+ unsigned char k_opad[64];
+ unsigned char tmpbuf[32];
+
+ memset (k_ipad, 0x36, 64);
+ memset (k_opad, 0x5C, 64);
+
+ for (i = 0; i < keylen; i++) {
+ if (i >= 64)
+ break;
+
+ k_ipad[i] ^= key[i];
+ k_opad[i] ^= key[i];
+ }
+
+ sha256_starts (&ctx);
+ sha256_update (&ctx, k_ipad, 64);
+ sha256_update (&ctx, input, ilen);
+ sha256_finish (&ctx, tmpbuf);
+
+ sha256_starts (&ctx);
+ sha256_update (&ctx, k_opad, 64);
+ sha256_update (&ctx, tmpbuf, 32);
+ sha256_finish (&ctx, output);
+
+ memset (k_ipad, 0, 64);
+ memset (k_opad, 0, 64);
+ memset (tmpbuf, 0, 32);
+ memset (&ctx, 0, sizeof (sha256_context));
+}