A simple library to support serving https.

Dependents:   oldheating gps motorhome heating

Committer:
andrewboyson
Date:
Wed Apr 01 12:48:52 2020 +0000
Revision:
24:cb43290fc439
Parent:
9:f354b4859b0b
Added check so that if the client closes the TCP connection before the TLS connection is established then respond that we have finished and the TCP connection is to be closed.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
andrewboyson 9:f354b4859b0b 1 #include <stdint.h>
andrewboyson 9:f354b4859b0b 2
andrewboyson 9:f354b4859b0b 3 #include "hmac-sha256.h"
andrewboyson 9:f354b4859b0b 4 #include "sha256.h"
andrewboyson 9:f354b4859b0b 5
andrewboyson 9:f354b4859b0b 6 #define BLOCK_SIZE 64
andrewboyson 9:f354b4859b0b 7 #define HASH_SIZE 32
andrewboyson 9:f354b4859b0b 8
andrewboyson 9:f354b4859b0b 9 void HmacSha256Start(struct HmacSha256Struct* md, const uint8_t* key, int keyLength)
andrewboyson 9:f354b4859b0b 10 {
andrewboyson 9:f354b4859b0b 11 //Make the key BLOCK_SIZE bytes long by hashing longer ones or padding shorter one with 0s
andrewboyson 9:f354b4859b0b 12 if (keyLength > BLOCK_SIZE)
andrewboyson 9:f354b4859b0b 13 {
andrewboyson 9:f354b4859b0b 14 Sha256(key, keyLength, md->hmacKey);
andrewboyson 9:f354b4859b0b 15 for (int i = HASH_SIZE; i < BLOCK_SIZE; i++) md->hmacKey[i] = 0;
andrewboyson 9:f354b4859b0b 16 }
andrewboyson 9:f354b4859b0b 17 else
andrewboyson 9:f354b4859b0b 18 {
andrewboyson 9:f354b4859b0b 19 for (int i = 0; i < keyLength; i++) md->hmacKey[i] = key[i];
andrewboyson 9:f354b4859b0b 20 for (int i = keyLength; i < BLOCK_SIZE; i++) md->hmacKey[i] = 0;
andrewboyson 9:f354b4859b0b 21 }
andrewboyson 9:f354b4859b0b 22 Sha256Start(&md->shaStruct);
andrewboyson 9:f354b4859b0b 23
andrewboyson 9:f354b4859b0b 24 //Make the inner and outer padded keys
andrewboyson 9:f354b4859b0b 25 uint8_t iKeyPad[BLOCK_SIZE];
andrewboyson 9:f354b4859b0b 26 for (int i = 0; i < BLOCK_SIZE; i++)
andrewboyson 9:f354b4859b0b 27 {
andrewboyson 9:f354b4859b0b 28 iKeyPad[i] = md->hmacKey[i] ^ 0x36; //Inner padded key
andrewboyson 9:f354b4859b0b 29 }
andrewboyson 9:f354b4859b0b 30 Sha256Add(&md->shaStruct, iKeyPad, BLOCK_SIZE);
andrewboyson 9:f354b4859b0b 31 }
andrewboyson 9:f354b4859b0b 32 void HmacSha256Add(struct HmacSha256Struct* md, const uint8_t* message, int messageLength)
andrewboyson 9:f354b4859b0b 33 {
andrewboyson 9:f354b4859b0b 34 Sha256Add(&md->shaStruct, message, messageLength);
andrewboyson 9:f354b4859b0b 35 }
andrewboyson 9:f354b4859b0b 36 void HmacSha256Finish(struct HmacSha256Struct* md, uint8_t* mac)
andrewboyson 9:f354b4859b0b 37 {
andrewboyson 9:f354b4859b0b 38 //Make the inner and outer padded keys
andrewboyson 9:f354b4859b0b 39 uint8_t oKeyPad[BLOCK_SIZE];
andrewboyson 9:f354b4859b0b 40 for (int i = 0; i < BLOCK_SIZE; i++)
andrewboyson 9:f354b4859b0b 41 {
andrewboyson 9:f354b4859b0b 42 oKeyPad[i] = md->hmacKey[i] ^ 0x5c; //Outer padded key
andrewboyson 9:f354b4859b0b 43 }
andrewboyson 9:f354b4859b0b 44
andrewboyson 9:f354b4859b0b 45 uint8_t innerHash[HASH_SIZE];
andrewboyson 9:f354b4859b0b 46 Sha256Finish(&md->shaStruct, innerHash);
andrewboyson 9:f354b4859b0b 47
andrewboyson 9:f354b4859b0b 48 Sha256Start(&md->shaStruct);
andrewboyson 9:f354b4859b0b 49 Sha256Add(&md->shaStruct, oKeyPad, BLOCK_SIZE);
andrewboyson 9:f354b4859b0b 50 Sha256Add(&md->shaStruct, innerHash, HASH_SIZE);
andrewboyson 9:f354b4859b0b 51
andrewboyson 9:f354b4859b0b 52 Sha256Finish(&md->shaStruct, mac);
andrewboyson 9:f354b4859b0b 53 }
andrewboyson 9:f354b4859b0b 54
andrewboyson 9:f354b4859b0b 55 void HmacSha256(const uint8_t* key, int keyLength, const uint8_t* message, int messageLength, uint8_t* mac)
andrewboyson 9:f354b4859b0b 56 {
andrewboyson 9:f354b4859b0b 57 struct HmacSha256Struct md;
andrewboyson 9:f354b4859b0b 58 HmacSha256Start (&md, key, keyLength);
andrewboyson 9:f354b4859b0b 59 HmacSha256Add (&md, message, messageLength);
andrewboyson 9:f354b4859b0b 60 HmacSha256Finish(&md, mac);
andrewboyson 9:f354b4859b0b 61 }