// ESP32 HMAC SHA-256
// https://emn178.github.io/online-tools/sha256.html
// Hello, World!
// dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f
// https://wokwi.com/projects/407044309018040321 - ESP32 SHA-256 Accelerator Test (MicroPython)
// https://wokwi.com/projects/407045956475773953 - ESP32 SHA-256 (C Algoritm)
#include "mbedtls/md.h"
void md_sha256(const char* inputString, const uint16_t len, uint8_t* outputHash) {
mbedtls_md_context_t context;
mbedtls_md_type_t md_type = MBEDTLS_MD_SHA256;
mbedtls_md_init(&context);
mbedtls_md_setup(&context, mbedtls_md_info_from_type(md_type), 1); // 0 - HMAC Off, 1 - HMAC on
mbedtls_md_starts(&context);
mbedtls_md_update(&context, (const unsigned char*)inputString, len);
mbedtls_md_finish(&context, outputHash);
mbedtls_md_free(&context);
}
void md_ripemd160(const char* inputString, const uint16_t len, uint8_t* outputHash) {
mbedtls_md_context_t context;
mbedtls_md_type_t md_type = MBEDTLS_MD_RIPEMD160;
mbedtls_md_init(&context);
mbedtls_md_setup(&context, mbedtls_md_info_from_type(md_type), 1); // 0 - HMAC Off, 1 - HMAC on
mbedtls_md_starts(&context);
mbedtls_md_update(&context, (const unsigned char*)inputString, len);
mbedtls_md_finish(&context, outputHash);
mbedtls_md_free(&context);
}
void printHex(uint8_t *data, size_t len) {
for(uint16_t i=0; i<len; i++) {
char str[3];
sprintf(str, "%02x", (uint16_t)data[i]);
Serial.print(str);
}
}
void setup() {
Serial.begin(115200);
Serial.println();
char* input = "Hello, World!";
Serial.println(input);
uint16_t len = strlen(input); // len = 13
uint8_t hash[32];
uint64_t time = micros();
md_sha256(input, len, hash);
time = micros()-time;
printHex(hash, 32);
Serial.printf("\nTime: %llu us", time); // Time: 262 us
Serial.println("\n");
Serial.println(input);
uint8_t hash2[32];
time = micros();
md_sha256(input, len, hash2);
time = micros()-time;
printHex(hash2, 32);
Serial.printf("\nTime: %llu us", time); // Time: 284 us
Serial.println("\n");
Serial.println(input);
uint8_t ripemd[20];
time = micros();
md_ripemd160(input, len, ripemd);
time = micros()-time;
printHex(ripemd, 20);
Serial.printf("\nTime: %llu us", time); // Time: 20 us
}
void loop() {}