]> git.cryptolib.org Git - avr-crypto-lib.git/commitdiff
some bugs fixed for SHA1-C (some may be left)
authorbg <bg@b1d182e4-1ff8-0310-901f-bddb46175740>
Fri, 2 Oct 2009 19:51:03 +0000 (19:51 +0000)
committerbg <bg@b1d182e4-1ff8-0310-901f-bddb46175740>
Fri, 2 Oct 2009 19:51:03 +0000 (19:51 +0000)
debug.h
host/shavs_test.rb
sha1/sha1.c
test_src/main-sha1-test.c

diff --git a/debug.h b/debug.h
index b285dfe57b177470d24c0f1b69536c982428e8a7..acc0a09f37d313ff17c419b708cddd36632d3e6f 100644 (file)
--- a/debug.h
+++ b/debug.h
        #define DEBUG_C(_c) debug_char(_c)
        #define DEBUG_S(_s) debug_str(_s)
        #define DEBUG_B(_b) debug_byte(_b)
+       #include "cli.h"
 #else
        #define DEBUG_INIT()
-       #define DEBUG_C(_c) 
-       #define DEBUG_S(_s) 
-       #define DEBUG_B(_b) 
+       #define DEBUG_C(_c)
+       #define DEBUG_S(_s)
+       #define DEBUG_B(_b)
 #endif
 
 
index 4c8589dc902938b5926bfb7fda3e036c5dea5a68..cba4dd4617fc4c05917c4ea1f4d12c45047a67c1 100644 (file)
@@ -1,4 +1,4 @@
-#!/usr/bin/ruby 
+#!/usr/bin/ruby
 # shavs_test.rb
 =begin
     This file is part of the AVR-Crypto-Lib.
@@ -50,7 +50,7 @@ def get_md
        line = "" if line==nil
        puts("DBG g: "+line) if $debug
   end while not /[\s]*MD[\s]*=.*/.match(line)
-  return line  
+  return line
 end
 
 def send_md(md_string)
@@ -59,12 +59,12 @@ def send_md(md_string)
 #      print("DBG s: "+ md_string[i].chr) if $debug
        if(i%20==19)
                sleep(0.1)
-       end             
+       end
   end
 end
 
 def run_test(filename)
-  errors = 0
+  nerrors = 0
   line=1
   if not File.exist?(filename)
        puts("ERROR file "+filename+" does not exist!")
@@ -101,12 +101,12 @@ def run_test(filename)
          putc('*')
        else
          putc('!')
-       #  printf("\nshould: %s\ngot:   %s\n",lb,avr_md)
-         errors += 1;
-       end  
+         printf("\nshould: %s\ngot:   %s\n",lb,avr_md)
+         nerrors += 1
+       end
        pos += 1
   end
-  return errors
+  return nerrors.to_i
 end
 
 if ARGV.size < 6
@@ -119,9 +119,9 @@ end
 puts("\nPort: "+ARGV[0]+ "@"+ARGV[1]+" "+ARGV[2]+"N"+ARGV[3]+"\n");
 puts("serial port interface version: " + SerialPort::VERSION);
 $linewidth = 64
-$params = { "baud"      => ARGV[1].to_i, 
-            "data_bits" => ARGV[2].to_i, 
-            "stop_bits" => ARGV[3].to_i, 
+$params = { "baud"      => ARGV[1].to_i,
+            "data_bits" => ARGV[2].to_i,
+            "stop_bits" => ARGV[3].to_i,
             "parity"    => SerialPort::NONE }
 $sp = SerialPort.new(ARGV[0], $params)
 #$sp = SerialPort.new(ARGV[0], ARGV[1].to_i, ARGV[2].to_i, ARGV[3].to_i, SerialPort::NONE);
@@ -133,13 +133,13 @@ $algo_select = ARGV[4]
 
 init_system()
 
-errors = 0
+nerrors = 0
 for i in (5..(ARGV.size-1))
-  errors = run_test(ARGV[i])
-  if errors == 0
+  nerrors = run_test(ARGV[i])
+  if nerrors == 0
     puts("\n[ok]")
   else
-    puts("\n[errors: "+errors.to_s+"]")
+    puts("\n[errors: "+ nerrors.to_s() +"]")
   end
 end
  $sp.print("EXIT\r");
index 97cde32814fbfd5264167e35060915e6ed9df641..38126df744ebbd648cdb5009f001e4ae7570fbdf 100644 (file)
  * \date       2006-10-08
  * \license GPLv3 or later
  * \brief SHA-1 implementation.
- * 
+ *
  */
+
 #include <string.h> /* memcpy & co */
 #include <stdint.h>
 #include "config.h"
 #undef DEBUG
+//#define DEBUG UART
 #include "debug.h"
 #include "sha1.h"
 
 #define LITTLE_ENDIAN
 
 /********************************************************************************************************/
+
 /**
  * \brief initialises given SHA-1 context
- * 
+ *
  */
 void sha1_init(sha1_ctx_t *state){
        DEBUG_S("\r\nSHA1_INIT");
@@ -81,10 +82,10 @@ uint32_t parity(uint32_t x, uint32_t y, uint32_t z){
 /**
  * \brief "add" a block to the hash
  * This is the core function of the hash algorithm. To understand how it's working
- * and what thoese variables do, take a look at FIPS-182. This is an "alternativ" implementation 
+ * and what thoese variables do, take a look at FIPS-182. This is an "alternativ" implementation
  */
 
-#define MASK 0x0000000f 
+#define MASK 0x0000000f
 
 typedef uint32_t (*pf_t)(uint32_t x, uint32_t y, uint32_t z);
 
@@ -94,11 +95,11 @@ void sha1_nextBlock (sha1_ctx_t *state, const void* block){
        uint32_t temp;
        uint8_t t,s;
        pf_t f[] = {ch,parity,maj,parity};
-       uint32_t k[4]={ 0x5a827999, 
-                                       0x6ed9eba1, 
-                                       0x8f1bbcdc, 
+       uint32_t k[4]={ 0x5a827999,
+                                       0x6ed9eba1,
+                                       0x8f1bbcdc,
                                        0xca62c1d6};
-       
+
        /* load the w array (changing the endian and so) */
        for(t=0; t<16; ++t){
                w[t] = change_endian32(((uint32_t*)block)[t]);
@@ -113,32 +114,32 @@ void sha1_nextBlock (sha1_ctx_t *state, const void* block){
                        cli_hexdump(&(w[dbgi]) ,4);
                #endif
        }
-       
-       
+
+
        /* load the state */
        memcpy(a, state->h, 5*sizeof(uint32_t));
-       
-       
+
+
        /* the fun stuff */
        for(t=0; t<=79; ++t){
                s = t & MASK;
                if(t>=16){
                        #ifdef DEBUG
-                        DEBUG_S("\r\n ws = "); cli_hexdump(&ws, 4);
+                        DEBUG_S("\r\n ws = "); cli_hexdump(&(w[s]), 4);
                        #endif
-                       w[s] = rotl32( w[(s+13)&MASK] ^ w[(s+8)&MASK] ^ 
-                                w[(s+ 2)&MASK] ^ w[s] ,1);                     
+                       w[s] = rotl32( w[(s+13)&MASK] ^ w[(s+8)&MASK] ^
+                                w[(s+ 2)&MASK] ^ w[s] ,1);
                        #ifdef DEBUG
                         DEBUG_S(" --> ws = "); cli_hexdump(&(w[s]), 4);
                        #endif
                }
-               
+
                uint32_t dtemp;
                temp = rotl32(a[0],5) + (dtemp=f[t/20](a[1],a[2],a[3])) + a[4] + k[t/20] + w[s];
                memmove(&(a[1]), &(a[0]), 4*sizeof(uint32_t)); /* e=d; d=c; c=b; b=a; */
                a[0] = temp;
                a[2] = rotl32(a[2],30); /* we might also do rotr32(c,2) */
-               
+
                /* debug dump */
                DEBUG_S("\r\nt = "); DEBUG_B(t);
                DEBUG_S("; a[]: ");
@@ -154,7 +155,7 @@ void sha1_nextBlock (sha1_ctx_t *state, const void* block){
                 cli_hexdump(&dtemp, 4);
                #endif
        }
-       
+
        /* update the state */
        for(t=0; t<5; ++t){
                state->h[t] += a[t];
@@ -166,31 +167,33 @@ void sha1_nextBlock (sha1_ctx_t *state, const void* block){
 
 void sha1_lastBlock(sha1_ctx_t *state, const void* block, uint16_t length){
        uint8_t lb[SHA1_BLOCK_BITS/8]; /* local block */
+       while(length>=512){
+               sha1_nextBlock(state, block);
+               length -=512;
+               block = (uint8_t*)block + 512/8;
+       }
        state->length += length;
-       memcpy (&(lb[0]), block, length/8);
-       
+       memcpy (lb, block, (length+7)/8);
+
        /* set the final one bit */
-       if (length & 0x7){ /* if we have single bits at the end */
-               lb[length/8] = ((uint8_t*)(block))[length/8];
-       } else {
-               lb[length/8] = 0;
-       }
-       lb[length/8] |= 0x80>>(length & 0x3);
-       length =(length >> 7) + 1; /* from now on length contains the number of BYTES in lb*/
-       /* pad with zeros */
+       lb[length/8] |= 0x80>>(length & 0x07);
+       length=(length)/8 +1; /* from now on length contains the number of BYTES in lb */
+
        if (length>64-8){ /* not enouth space for 64bit length value */
-               memset((void*)(&(lb[length])), 0, 64-length);
+               memset(lb+length, 0, 64-length);
                sha1_nextBlock(state, lb);
                state->length -= 512;
-               length = 0;     
+               length = 0;
        }
-       memset((void*)(&(lb[length])), 0, 56-length);
+
+       /* pad with zeros */
+       memset(lb+length, 0, 56-length);
        /* store the 64bit length value */
 #if defined LITTLE_ENDIAN
                /* this is now rolled up */
-       uint8_t i;      
-       for (i=1; i<=8; ++i){
-               lb[55+i] = (uint8_t)(state->length>>(64- 8*i));
+       uint8_t i;
+       for (i=0; i<8; ++i){
+               lb[56+i] = ((uint8_t*)&(state->length))[7-i];
        }
 #elif defined BIG_ENDIAN
        *((uint64_t)&(lb[56])) = state->length;
@@ -216,8 +219,8 @@ void sha1_ctx2hash (sha1_hash_t *dest, sha1_ctx_t *state){
 
 /********************************************************************************************************/
 /**
- * 
- * 
+ *
+ *
  */
 void sha1 (sha1_hash_t *dest, const void* msg, uint32_t length){
        sha1_ctx_t s;
index 311bb055b39f5c9a8f55d4c275ddd5c2fd19f23f..ce10cd55152cfa9a9aa580d62f1e9fb30bf1d824 100644 (file)
@@ -18,7 +18,7 @@
 */
 /*
  * SHA-1 test-suit
- * 
+ *
 */
 
 #include "config.h"
@@ -58,7 +58,7 @@ void testrun_nessie_sha1(void){
        nessie_hash_ctx.hash_next = (nessie_hash_next_fpt)sha1_nextBlock;
        nessie_hash_ctx.hash_last = (nessie_hash_last_fpt)sha1_lastBlock;
        nessie_hash_ctx.hash_conv = (nessie_hash_conv_fpt)sha1_ctx2hash;
-       
+
        nessie_hash_run();
 }
 
@@ -74,18 +74,39 @@ void sha1_ctx_dump(sha1_ctx_t *s){
                cli_hexdump(&(s->h[i]), 4);
        }
        cli_putstr("\r\nlength"); cli_hexdump(&i, 8);
-} 
+}
 
 void testrun_sha1(void){
        sha1_hash_t hash;
        sha1(&hash,"abc",3*8);
-       cli_putstr("\r\nsha1(\"abc\") = \r\n\t");
+       cli_putstr_P(PSTR("\r\nsha1(\"abc\") = \r\n\t"));
+       cli_hexdump(hash,SHA1_HASH_BITS/8);
+
+       sha1(&hash,"\0\0\0\0\0\0\0\0", 8*8);
+       cli_putstr_P(PSTR("\r\nsha1(8 x 0x00) = \r\n\t"));
        cli_hexdump(hash,SHA1_HASH_BITS/8);
-       
-       sha1(&hash,"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",448);
-       cli_putstr("\r\nsha1(\"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq\") = \r\n\t");
+/*
+   Len = 496
+   Msg = 46fe5ed326c8fe376fcc92dc9e2714e2240d3253b105ad
+         fbb256ff7a19bc40975c604ad7c0071c4fd78a7cb64786
+         e1bece548fa4833c04065fe593f6fb10
+   MD  = f220a7457f4588d639dc21407c942e9843f8e26b
+*/
+       sha1(&hash,"\x46\xfe\x5e\xd3\x26\xc8\xfe\x37"
+                  "\x6f\xcc\x92\xdc\x9e\x27\x14\xe2"
+                  "\x24\x0d\x32\x53\xb1\x05\xad\xfb"
+                  "\xb2\x56\xff\x7a\x19\xbc\x40\x97"
+                  "\x5c\x60\x4a\xd7\xc0\x07\x1c\x4f"
+                  "\xd7\x8a\x7c\xb6\x47\x86\xe1\xbe"
+                  "\xce\x54\x8f\xa4\x83\x3c\x04\x06"
+                  "\x5f\xe5\x93\xf6\xfb\x10", 496);
+       cli_putstr_P(PSTR("\r\nsha1(tv_496) = \r\n\t"));
        cli_hexdump(hash,SHA1_HASH_BITS/8);
-       
+
+//     sha1(&hash,"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",448);
+       cli_putstr_P(PSTR("\r\nsha1(\"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq\") = \r\n\t"));
+       cli_hexdump(hash,SHA1_HASH_BITS/8);
+/*
        cli_putstr("\r\nsha1(1,000,000 * 'a') = \r\n\t");
        {
                uint8_t block[SHA1_BLOCK_BITS/8];
@@ -93,14 +114,14 @@ void testrun_sha1(void){
                sha1_ctx_t s;
                memset(block,'a',SHA1_BLOCK_BITS/8);
                sha1_init(&s);
-               for(i=0;i<15625; ++i){ /* (1000000/(SHA1_BLOCK_BITS/8)) */
+               for(i=0;i<15625; ++i){ / * (1000000/(SHA1_BLOCK_BITS/8)) * /
                        sha1_nextBlock(&s, block);
                }
                sha1_lastBlock(&s,block,0);
                sha1_ctx2hash(&hash, &s);
        }
        cli_hexdump(hash,SHA1_HASH_BITS/8);
-       
+*/
 
        cli_putstr("\r\nx");
 }
@@ -110,15 +131,15 @@ void testrun_sha1_2(void){
        sha1_ctx_t ctx;
        sha1_hash_t hash;
        sha1(&hash,"",0);
-       cli_putstr("\r\nsha1(NULL) = \r\n\t");
+       cli_putstr_P(PSTR("\r\nsha1(NULL) = \r\n\t"));
        cli_hexdump(hash,SHA1_HASH_BYTES);
 
        memset(hash, 0, SHA1_HASH_BYTES);
 
        sha1_init(&ctx);
        sha1_lastBlock(&ctx, "", 0);
-       sha1_ctx2hash(&hash, &ctx); 
-       cli_putstr("\r\nsha1(NULL) = \r\n\t");
+       sha1_ctx2hash(&hash, &ctx);
+       cli_putstr_P(PSTR("\r\nsha1(NULL) = \r\n\t"));
        cli_hexdump(hash,SHA1_HASH_BYTES);
 }
 
@@ -158,11 +179,11 @@ cmdlist_entry_t cmdlist[] PROGMEM = {
 
 int main (void){
        DEBUG_INIT();
-       
+
        cli_rx = (cli_rx_fpt)uart0_getc;
-       cli_tx = (cli_tx_fpt)uart0_putc;         
+       cli_tx = (cli_tx_fpt)uart0_putc;
        shavs_algolist=(hfdesc_t**)algolist;
-       shavs_algo=(hfdesc_t*)&sha1_desc;       
+       shavs_algo=(hfdesc_t*)&sha1_desc;
        for(;;){
                cli_putstr_P(PSTR("\r\n\r\nCrypto-VS ("));
                cli_putstr(algo_name);