mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-11-22 07:28:10 +00:00
add hmac-sha256/512
This commit is contained in:
parent
40fa3f52e4
commit
047b30cf2f
2
Makefile
2
Makefile
@ -1,6 +1,6 @@
|
|||||||
CC = gcc
|
CC = gcc
|
||||||
CFLAGS = -Wall -Os
|
CFLAGS = -Wall -Os
|
||||||
OBJS = aux.o ecdsa.o secp256k1.o sha2.o rand.o
|
OBJS = aux.o ecdsa.o secp256k1.o sha2.o rand.o hmac.o
|
||||||
|
|
||||||
all: test-speed test-verify
|
all: test-speed test-verify
|
||||||
|
|
||||||
|
62
hmac.c
Normal file
62
hmac.c
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "hmac.h"
|
||||||
|
#include "sha2.h"
|
||||||
|
|
||||||
|
void hmac_sha256(const uint8_t *key, const uint32_t keylen, const uint8_t *msg, const uint32_t msglen, uint8_t *hmac)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
uint8_t buf[SHA256_BLOCK_LENGTH], o_key_pad[SHA256_BLOCK_LENGTH], i_key_pad[SHA256_BLOCK_LENGTH];
|
||||||
|
SHA256_CTX ctx;
|
||||||
|
|
||||||
|
memset(buf, 0, SHA256_BLOCK_LENGTH);
|
||||||
|
if (keylen > SHA256_BLOCK_LENGTH) {
|
||||||
|
SHA256_Raw(key, keylen, buf);
|
||||||
|
} else {
|
||||||
|
memcpy(buf, key, keylen);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < SHA256_BLOCK_LENGTH; i++) {
|
||||||
|
o_key_pad[i] = buf[i] ^ 0x5c;
|
||||||
|
i_key_pad[i] = buf[i] ^ 0x36;
|
||||||
|
}
|
||||||
|
|
||||||
|
SHA256_Init(&ctx);
|
||||||
|
SHA256_Update(&ctx, i_key_pad, SHA256_BLOCK_LENGTH);
|
||||||
|
SHA256_Update(&ctx, msg, msglen);
|
||||||
|
SHA256_Final(buf, &ctx);
|
||||||
|
|
||||||
|
SHA256_Init(&ctx);
|
||||||
|
SHA256_Update(&ctx, o_key_pad, SHA256_BLOCK_LENGTH);
|
||||||
|
SHA256_Update(&ctx, buf, SHA256_DIGEST_LENGTH);
|
||||||
|
SHA256_Final(hmac, &ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
void hmac_sha512(const uint8_t *key, const uint32_t keylen, const uint8_t *msg, const uint32_t msglen, uint8_t *hmac)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
uint8_t buf[SHA512_BLOCK_LENGTH], o_key_pad[SHA512_BLOCK_LENGTH], i_key_pad[SHA512_BLOCK_LENGTH];
|
||||||
|
SHA512_CTX ctx;
|
||||||
|
|
||||||
|
memset(buf, 0, SHA512_BLOCK_LENGTH);
|
||||||
|
if (keylen > SHA512_BLOCK_LENGTH) {
|
||||||
|
SHA512_Raw(key, keylen, buf);
|
||||||
|
} else {
|
||||||
|
memcpy(buf, key, keylen);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < SHA512_BLOCK_LENGTH; i++) {
|
||||||
|
o_key_pad[i] = buf[i] ^ 0x5c;
|
||||||
|
i_key_pad[i] = buf[i] ^ 0x36;
|
||||||
|
}
|
||||||
|
|
||||||
|
SHA512_Init(&ctx);
|
||||||
|
SHA512_Update(&ctx, i_key_pad, SHA512_BLOCK_LENGTH);
|
||||||
|
SHA512_Update(&ctx, msg, msglen);
|
||||||
|
SHA512_Final(buf, &ctx);
|
||||||
|
|
||||||
|
SHA512_Init(&ctx);
|
||||||
|
SHA512_Update(&ctx, o_key_pad, SHA512_BLOCK_LENGTH);
|
||||||
|
SHA512_Update(&ctx, buf, SHA512_DIGEST_LENGTH);
|
||||||
|
SHA512_Final(hmac, &ctx);
|
||||||
|
}
|
9
hmac.h
Normal file
9
hmac.h
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#ifndef __HMAC_H__
|
||||||
|
#define __HMAC_H__
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
void hmac_sha256(const uint8_t *key, const uint32_t keylen, const uint8_t *msg, const uint32_t msglen, uint8_t *hmac);
|
||||||
|
void hmac_sha512(const uint8_t *key, const uint32_t keylen, const uint8_t *msg, const uint32_t msglen, uint8_t *hmac);
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user