MA-15015 Add sha256_hmac support
authorJi Luo <ji.luo@nxp.com>
Fri, 21 Jun 2019 00:52:40 +0000 (08:52 +0800)
committerJi Luo <ji.luo@nxp.com>
Thu, 13 May 2021 01:49:17 +0000 (09:49 +0800)
Add sha256 hmac support in u-boot.

Test: hmac calculation.

Change-Id: I0f1438fed8290620a1bb0663d19c21e20098eb5a
Signed-off-by: Ji Luo <ji.luo@nxp.com>
(cherry picked from 1e06de6ef23c1ae9d51383f3c57bb045ea180c03)

include/u-boot/sha256.h
lib/sha256.c

index 9aa1251..6fbf542 100644 (file)
@@ -22,4 +22,7 @@ void sha256_finish(sha256_context * ctx, uint8_t digest[SHA256_SUM_LEN]);
 void sha256_csum_wd(const unsigned char *input, unsigned int ilen,
                unsigned char *output, unsigned int chunk_sz);
 
+void sha256_hmac(const unsigned char *key, int keylen,
+               const unsigned char *input, unsigned int ilen,
+               unsigned char *output);
 #endif /* _SHA256_H */
index c1fe93d..70123c1 100644 (file)
@@ -289,3 +289,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));
+}