mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-11-21 23:18:13 +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
|
||||
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
|
||||
|
||||
|
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