A simple library to support serving https.

Dependents:   oldheating gps motorhome heating

Revision:
9:f354b4859b0b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hmac/hmac-sha256.c	Wed Sep 11 07:24:21 2019 +0000
@@ -0,0 +1,61 @@
+#include <stdint.h>
+
+#include "hmac-sha256.h"
+#include "sha256.h"
+
+#define BLOCK_SIZE 64
+#define  HASH_SIZE 32
+
+void HmacSha256Start(struct HmacSha256Struct* md, const uint8_t* key, int keyLength)
+{
+    //Make the key BLOCK_SIZE bytes long by hashing longer ones or padding shorter one with 0s
+    if (keyLength > BLOCK_SIZE)
+    {
+        Sha256(key, keyLength, md->hmacKey);
+        for (int i = HASH_SIZE; i < BLOCK_SIZE; i++) md->hmacKey[i] = 0;
+    }
+    else
+    {
+        for (int i = 0;         i < keyLength;  i++) md->hmacKey[i] = key[i];
+        for (int i = keyLength; i < BLOCK_SIZE; i++) md->hmacKey[i] = 0;
+    }
+    Sha256Start(&md->shaStruct);
+    
+    //Make the inner and outer padded keys
+    uint8_t iKeyPad[BLOCK_SIZE];
+    for (int i = 0; i < BLOCK_SIZE; i++)
+    {
+        iKeyPad[i] = md->hmacKey[i] ^ 0x36; //Inner padded key
+    }
+    Sha256Add(&md->shaStruct, iKeyPad, BLOCK_SIZE);
+}
+void HmacSha256Add(struct HmacSha256Struct* md, const uint8_t* message, int messageLength)
+{
+    Sha256Add(&md->shaStruct, message, messageLength);
+}
+void HmacSha256Finish(struct HmacSha256Struct* md, uint8_t* mac)
+{
+    //Make the inner and outer padded keys
+    uint8_t oKeyPad[BLOCK_SIZE];
+    for (int i = 0; i < BLOCK_SIZE; i++)
+    {
+        oKeyPad[i] = md->hmacKey[i] ^ 0x5c; //Outer padded key
+    }
+    
+    uint8_t innerHash[HASH_SIZE];
+    Sha256Finish(&md->shaStruct, innerHash);
+    
+    Sha256Start(&md->shaStruct);
+    Sha256Add(&md->shaStruct, oKeyPad, BLOCK_SIZE);
+    Sha256Add(&md->shaStruct, innerHash, HASH_SIZE);
+    
+    Sha256Finish(&md->shaStruct, mac);
+}
+
+void HmacSha256(const uint8_t* key, int keyLength, const uint8_t* message, int messageLength, uint8_t* mac)
+{
+    struct HmacSha256Struct md;
+    HmacSha256Start (&md, key, keyLength);
+    HmacSha256Add   (&md, message, messageLength);
+    HmacSha256Finish(&md, mac);
+}
\ No newline at end of file