]> git.cryptolib.org Git - avr-crypto-lib.git/blobdiff - hmac-sha256.c
+RC5 +size-statistics tool +small modification to nessie_bc_test (optional free(...
[avr-crypto-lib.git] / hmac-sha256.c
index 3483f1224957cf5902244420328873c2d365d550..4e23f8e5de18d62d81be3b5f66d7b85ef3683c13 100644 (file)
@@ -12,6 +12,7 @@
 
 #include <stdint.h>
 #include <string.h>
+#include "config.h"
 #include "sha256.h"
 
 #define IPAD 0x36
 
 typedef sha256_ctx_t hmac_sha256_ctx_t;
 
+#ifndef HMAC_SHORTONLY
+
 void hmac_sha256_init(hmac_sha256_ctx_t *s, void* key, uint16_t kl){
        uint8_t buffer[SHA256_BLOCK_BITS/8];
        uint8_t i;
        
+       memset(buffer, 0, SHA256_BLOCK_BITS/8);
        if (kl > SHA256_BLOCK_BITS){
                sha256((void*)buffer, key, kl);
        } else {
-               memcpy(buffer, key, kl/8 + (kl & 0x7)?1:0);
+               memcpy(buffer, key, (kl+7)/8);
        }
        
        for (i=0; i<SHA256_BLOCK_BITS/8; ++i){
@@ -45,10 +49,11 @@ void hmac_sha256_final(hmac_sha256_ctx_t *s, void* key, uint16_t kl){
        uint8_t i;
        sha256_ctx_t a;
        
+       memset(buffer, 0, SHA256_BLOCK_BITS/8);
        if (kl > SHA256_BLOCK_BITS){
                sha256((void*)buffer, key, kl);
        } else {
-               memcpy(buffer, key, kl/8 + (kl & 0x7)?1:0);
+               memcpy(buffer, key, (kl+7)/8);
        }
        
        for (i=0; i<SHA256_BLOCK_BITS/8; ++i){
@@ -58,13 +63,16 @@ void hmac_sha256_final(hmac_sha256_ctx_t *s, void* key, uint16_t kl){
        sha256_init(&a);
        sha256_nextBlock(&a, buffer); /* hash key ^ opad */
        sha256_ctx2hash((void*)buffer, s);  /* copy hash(key ^ ipad, msg) to buffer */
-       sha256_lastBlock(s, buffer, SHA256_HASH_BITS);
+       sha256_lastBlock(&a, buffer, SHA256_HASH_BITS);
+       memcpy(s, &a, sizeof(sha256_ctx_t));
 #if defined SECURE_WIPE_BUFFER
        memset(buffer, 0, SHA256_BLOCK_BITS/8);
        memset(a.h, 0, 8*4);
 #endif 
 }
 
+#endif
+
 /*
 void hmac_sha256_nextBlock()
 void hmac_sha256_lastBlock()
@@ -79,11 +87,13 @@ void hmac_sha256(void* dest, void* key, uint16_t kl, void* msg, uint64_t ml){ /*
        uint8_t i;
        uint8_t buffer[SHA256_BLOCK_BITS/8];
        
+       memset(buffer, 0, SHA256_BLOCK_BITS/8);
+       
        /* if key is larger than a block we have to hash it*/
        if (kl > SHA256_BLOCK_BITS){
                sha256((void*)buffer, key, kl);
        } else {
-               memcpy(buffer, key, kl/8 + (kl & 0x7)?1:0);
+               memcpy(buffer, key, (kl+7)/8);
        }
        
        for (i=0; i<SHA256_BLOCK_BITS/8; ++i){
@@ -93,7 +103,7 @@ void hmac_sha256(void* dest, void* key, uint16_t kl, void* msg, uint64_t ml){ /*
        sha256_nextBlock(&s, buffer);
        while (ml >= SHA256_BLOCK_BITS){
                sha256_nextBlock(&s, msg);
-               msg += SHA256_BLOCK_BITS/8;
+               msg = (uint8_t*)msg + SHA256_BLOCK_BITS/8;
                ml -=  SHA256_BLOCK_BITS;
        }
        sha256_lastBlock(&s, msg, ml);
@@ -101,9 +111,9 @@ void hmac_sha256(void* dest, void* key, uint16_t kl, void* msg, uint64_t ml){ /*
        for (i=0; i<SHA256_BLOCK_BITS/8; ++i){
                buffer[i] ^= IPAD ^ OPAD;
        }
-       sha265_ctx2hash(dest, &s); /* save inner hash temporary to dest */
+       sha256_ctx2hash(dest, &s); /* save inner hash temporary to dest */
        sha256_init(&s);
        sha256_nextBlock(&s, buffer);
        sha256_lastBlock(&s, dest, SHA256_HASH_BITS);
-       sha265_ctx2hash(dest, &s);
+       sha256_ctx2hash(dest, &s);
 }