From 48d0f114bbdad41d280e2f0f741574a1b7811890 Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Mon, 8 May 2017 22:01:27 +0800 Subject: [PATCH] Introduce HMAC functions operating on vectors --- crypto/crypto.h | 10 ++++++++++ crypto/hmac.c | 33 ++++++++++++++++++++++++++++++--- ssl/crypto_misc.h | 3 +++ 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/crypto/crypto.h b/crypto/crypto.h index 9914afeec..da24d31c5 100644 --- a/crypto/crypto.h +++ b/crypto/crypto.h @@ -203,6 +203,16 @@ void hmac_sha1(const uint8_t *msg, int length, const uint8_t *key, void hmac_sha256(const uint8_t *msg, int length, const uint8_t *key, int key_len, uint8_t *digest); +/************************************************************************** + * HMAC functions operating on vectors + **************************************************************************/ +void hmac_md5_v(const uint8_t **msg, int* length, int count, const uint8_t *key, + int key_len, uint8_t *digest); +void hmac_sha1_v(const uint8_t **msg, int* length, int count, const uint8_t *key, + int key_len, uint8_t *digest); +void hmac_sha256_v(const uint8_t **msg, int* length, int count, const uint8_t *key, + int key_len, uint8_t *digest); + /************************************************************************** * RSA declarations **************************************************************************/ diff --git a/crypto/hmac.c b/crypto/hmac.c index e618ee2eb..a0ae84ccf 100644 --- a/crypto/hmac.c +++ b/crypto/hmac.c @@ -44,6 +44,12 @@ */ void hmac_md5(const uint8_t *msg, int length, const uint8_t *key, int key_len, uint8_t *digest) +{ + hmac_md5_v(&msg, &length, 1, key, key_len, digest); +} + +void hmac_md5_v(const uint8_t **msg, int* length, int count, const uint8_t *key, + int key_len, uint8_t *digest) { MD5_CTX context; uint8_t k_ipad[64]; @@ -63,7 +69,10 @@ void hmac_md5(const uint8_t *msg, int length, const uint8_t *key, MD5_Init(&context); MD5_Update(&context, k_ipad, 64); - MD5_Update(&context, msg, length); + for (i = 0; i < count; ++i) + { + MD5_Update(&context, msg[i], length[i]); + } MD5_Final(digest, &context); MD5_Init(&context); MD5_Update(&context, k_opad, 64); @@ -77,6 +86,12 @@ void hmac_md5(const uint8_t *msg, int length, const uint8_t *key, */ void hmac_sha1(const uint8_t *msg, int length, const uint8_t *key, int key_len, uint8_t *digest) +{ + hmac_sha1_v(&msg, &length, 1, key, key_len, digest); +} + +void hmac_sha1_v(const uint8_t **msg, int *length, int count, const uint8_t *key, + int key_len, uint8_t *digest) { SHA1_CTX context; uint8_t k_ipad[64]; @@ -96,7 +111,10 @@ void hmac_sha1(const uint8_t *msg, int length, const uint8_t *key, SHA1_Init(&context); SHA1_Update(&context, k_ipad, 64); - SHA1_Update(&context, msg, length); + for (i = 0; i < count; ++i) + { + SHA1_Update(&context, msg[i], length[i]); + } SHA1_Final(digest, &context); SHA1_Init(&context); SHA1_Update(&context, k_opad, 64); @@ -110,6 +128,12 @@ void hmac_sha1(const uint8_t *msg, int length, const uint8_t *key, */ void hmac_sha256(const uint8_t *msg, int length, const uint8_t *key, int key_len, uint8_t *digest) +{ + hmac_sha256_v(&msg, &length, 1, key, key_len, digest); +} + +void hmac_sha256_v(const uint8_t **msg, int *length, int count, const uint8_t *key, + int key_len, uint8_t *digest) { SHA256_CTX context; uint8_t k_ipad[64]; @@ -129,7 +153,10 @@ void hmac_sha256(const uint8_t *msg, int length, const uint8_t *key, SHA256_Init(&context); SHA256_Update(&context, k_ipad, 64); - SHA256_Update(&context, msg, length); + for (i = 0; i < count; ++i) + { + SHA256_Update(&context, msg[i], length[i]); + } SHA256_Final(digest, &context); SHA256_Init(&context); SHA256_Update(&context, k_opad, 64); diff --git a/ssl/crypto_misc.h b/ssl/crypto_misc.h index 5dd392197..77712f509 100644 --- a/ssl/crypto_misc.h +++ b/ssl/crypto_misc.h @@ -195,6 +195,9 @@ extern const char * const unsupported_str; typedef void (*crypt_func)(void *, const uint8_t *, uint8_t *, int); typedef void (*hmac_func)(const uint8_t *msg, int length, const uint8_t *key, int key_len, uint8_t *digest); +typedef void (*hmac_func_v)(const uint8_t **msg, int *length, int count, const uint8_t *key, + int key_len, uint8_t *digest); + int get_file(const char *filename, uint8_t **buf);