Add hash functions using OTP as feed when available.
Signed-off-by: Pol Henarejos <pol.henarejos@cttc.es>
This commit is contained in:
parent
d63ed56e0e
commit
5048e07f81
2 changed files with 32 additions and 2 deletions
|
|
@ -25,6 +25,7 @@
|
||||||
#include "mbedtls/aes.h"
|
#include "mbedtls/aes.h"
|
||||||
#include "crypto_utils.h"
|
#include "crypto_utils.h"
|
||||||
#include "pico_keys.h"
|
#include "pico_keys.h"
|
||||||
|
#include "otp.h"
|
||||||
|
|
||||||
void double_hash_pin(const uint8_t *pin, uint16_t len, uint8_t output[32]) {
|
void double_hash_pin(const uint8_t *pin, uint16_t len, uint8_t output[32]) {
|
||||||
uint8_t o1[32];
|
uint8_t o1[32];
|
||||||
|
|
@ -35,14 +36,28 @@ void double_hash_pin(const uint8_t *pin, uint16_t len, uint8_t output[32]) {
|
||||||
hash_multi(o1, sizeof(o1), output);
|
hash_multi(o1, sizeof(o1), output);
|
||||||
}
|
}
|
||||||
|
|
||||||
void hash_multi(const uint8_t *input, uint16_t len, uint8_t output[32]) {
|
void double_hash_pin_otp(const uint8_t *pin, uint16_t len, uint8_t output[32]) {
|
||||||
|
uint8_t o1[32];
|
||||||
|
hash_multi_otp(pin, len, o1);
|
||||||
|
for (int i = 0; i < sizeof(o1); i++) {
|
||||||
|
o1[i] ^= pin[i % len];
|
||||||
|
}
|
||||||
|
hash_multi_otp(o1, sizeof(o1), output);
|
||||||
|
}
|
||||||
|
|
||||||
|
void hash_multi_ext(const uint8_t *input, uint16_t len, const uint8_t *init, uint16_t len_init, uint8_t output[32]) {
|
||||||
mbedtls_sha256_context ctx;
|
mbedtls_sha256_context ctx;
|
||||||
mbedtls_sha256_init(&ctx);
|
mbedtls_sha256_init(&ctx);
|
||||||
uint16_t iters = 256;
|
uint16_t iters = 256;
|
||||||
mbedtls_sha256_starts(&ctx, 0);
|
mbedtls_sha256_starts(&ctx, 0);
|
||||||
|
if (init && len_init > 0) {
|
||||||
|
mbedtls_sha256_update(&ctx, init, len_init);
|
||||||
|
}
|
||||||
|
else {
|
||||||
#ifndef ENABLE_EMULATION
|
#ifndef ENABLE_EMULATION
|
||||||
mbedtls_sha256_update(&ctx, pico_serial.id, sizeof(pico_serial.id));
|
mbedtls_sha256_update(&ctx, pico_serial.id, sizeof(pico_serial.id));
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
while (iters > len) {
|
while (iters > len) {
|
||||||
mbedtls_sha256_update(&ctx, input, len);
|
mbedtls_sha256_update(&ctx, input, len);
|
||||||
|
|
@ -55,6 +70,18 @@ void hash_multi(const uint8_t *input, uint16_t len, uint8_t output[32]) {
|
||||||
mbedtls_sha256_free(&ctx);
|
mbedtls_sha256_free(&ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void hash_multi(const uint8_t *input, uint16_t len, uint8_t output[32]) {
|
||||||
|
hash_multi_ext(input, len, NULL, 0, output);
|
||||||
|
}
|
||||||
|
|
||||||
|
void hash_multi_otp(const uint8_t *input, uint16_t len, uint8_t output[32]) {
|
||||||
|
if (otp_key_1) {
|
||||||
|
hash_multi_ext(input, len, otp_key_1, 32, output);
|
||||||
|
} else {
|
||||||
|
hash_multi(input, len, output);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void hash256(const uint8_t *input, size_t len, uint8_t output[32]) {
|
void hash256(const uint8_t *input, size_t len, uint8_t output[32]) {
|
||||||
mbedtls_sha256_context ctx;
|
mbedtls_sha256_context ctx;
|
||||||
mbedtls_sha256_init(&ctx);
|
mbedtls_sha256_init(&ctx);
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,10 @@
|
||||||
#define IV_SIZE 16
|
#define IV_SIZE 16
|
||||||
|
|
||||||
extern void double_hash_pin(const uint8_t *pin, uint16_t len, uint8_t output[32]);
|
extern void double_hash_pin(const uint8_t *pin, uint16_t len, uint8_t output[32]);
|
||||||
|
extern void double_hash_pin_otp(const uint8_t *pin, uint16_t len, uint8_t output[32]);
|
||||||
|
extern void hash_multi_ext(const uint8_t *input, uint16_t len, const uint8_t *init, uint16_t len_init, uint8_t output[32]);
|
||||||
extern void hash_multi(const uint8_t *input, uint16_t len, uint8_t output[32]);
|
extern void hash_multi(const uint8_t *input, uint16_t len, uint8_t output[32]);
|
||||||
|
extern void hash_multi_otp(const uint8_t *input, uint16_t len, uint8_t output[32]);
|
||||||
extern void hash256(const uint8_t *input, size_t len, uint8_t output[32]);
|
extern void hash256(const uint8_t *input, size_t len, uint8_t output[32]);
|
||||||
extern void generic_hash(mbedtls_md_type_t md, const uint8_t *input, size_t len, uint8_t *output);
|
extern void generic_hash(mbedtls_md_type_t md, const uint8_t *input, size_t len, uint8_t *output);
|
||||||
extern int aes_encrypt(const uint8_t *key, const uint8_t *iv, uint16_t key_size, int mode, uint8_t *data, uint16_t len);
|
extern int aes_encrypt(const uint8_t *key, const uint8_t *iv, uint16_t key_size, int mode, uint8_t *data, uint16_t len);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue