]> git.cryptolib.org Git - avr-crypto-lib.git/blobdiff - md5-stub.c
md5_lastBlock() now in ASM
[avr-crypto-lib.git] / md5-stub.c
index fedbe8befb51aef8af67260ac4b6625ac767a56b..2631c370e0fccf22acad9b0361585f0faf1cabfd 100644 (file)
  
  #undef DEBUG
 
-void md5_core(uint32_t* a, void* block, uint8_t as, uint8_t s, uint8_t i, uint8_t fi);
 
-/*
-#define ROTL32(x,n) (((x)<<(n)) | ((x)>>(32-(n))))  
-
-static
-void md5_core(uint32_t* a, void* block, uint8_t as, uint8_t s, uint8_t i, uint8_t fi){
-       uint32_t t;
-       md5_func_t* funcs[]={md5_F, md5_G, md5_H, md5_I};
-       as &= 0x3;
-       // * a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). * /
-#ifdef DEBUG
-       char funcc[]={'*', '-', '+', '~'};
-       uart_putstr("\r\n DBG: md5_core [");
-       uart_putc(funcc[fi]);
-       uart_hexdump(&as, 1); uart_putc(' ');
-       uart_hexdump(&k, 1); uart_putc(' ');
-       uart_hexdump(&s, 1); uart_putc(' ');
-       uart_hexdump(&i, 1); uart_putc(']');
-#endif 
-       t = a[as] + funcs[fi](a[(as+1)&3], a[(as+2)&3], a[(as+3)&3]) + *((uint32_t*)block) + md5_T[i] ;
-       a[as]=a[(as+1)&3] + ROTL32(t, s);
+void md5_ctx2hash(md5_hash_t* dest, const md5_ctx_t* state){
+       memcpy(dest, state->a, MD5_HASH_BYTES);
 }
-*/
-
-#if 0
-void md5_nextBlock(md5_ctx_t *state, void* block){
-       uint32_t        a[4];
-       uint8_t         m,n,i=0;
-       /* this requires other mixed sboxes */
-#ifdef DEBUG
-       uart_putstr("\r\n DBG: md5_nextBlock: block:\r\n");
-       uart_hexdump(block, 16);        uart_putstr("\r\n");
-       uart_hexdump(block+16, 16);     uart_putstr("\r\n");
-       uart_hexdump(block+32, 16);     uart_putstr("\r\n");
-       uart_hexdump(block+48, 16);     uart_putstr("\r\n");
-#endif 
-       
-       a[0]=state->a[0];
-       a[1]=state->a[1];
-       a[2]=state->a[2];
-       a[3]=state->a[3];
 
-       /* round 1 */
-       uint8_t s1t[]={7,12,17,22}; // 1,-1   1,4   2,-1   3,-2
-       for(m=0;m<4;++m){
-               for(n=0;n<4;++n){
-                       md5_core(a, &(((uint32_t*)block)[m*4+n]), 4-n, s1t[n],i++,0);
-               }
-       }
-       /* round 2 */
-       uint8_t s2t[]={5,9,14,20}; // 1,-3   1,1   2,-2   2,4
-       for(m=0;m<4;++m){
-               for(n=0;n<4;++n){
-                       md5_core(a, &(((uint32_t*)block)[(1+m*4+n*5)&0xf]), 4-n, s2t[n],i++,1);
-               }
-       }
-       /* round 3 */
-       uint8_t s3t[]={4,11,16,23}; // 0,4   1,3   2,0   3,-1
-       for(m=0;m<4;++m){
-               for(n=0;n<4;++n){
-                       md5_core(a, &(((uint32_t*)block)[(5-m*4+n*3)&0xf]), 4-n, s3t[n],i++,2);
-               }
-       }
-       /* round 4 */
-       uint8_t s4t[]={6,10,15,21}; // 1,-2   1,2   2,-1   3,-3
-       for(m=0;m<4;++m){
-               for(n=0;n<4;++n){
-                       md5_core(a, &(((uint32_t*)block)[(0-m*4+n*7)&0xf]), 4-n, s4t[n],i++,3);
-               }
+void md5(md5_hash_t* dest, const void* msg, uint32_t length_b){
+       md5_ctx_t ctx;
+       md5_init(&ctx);
+       while(length_b>=MD5_BLOCK_BITS){
+               md5_nextBlock(&ctx, msg);
+               msg = (uint8_t*)msg + MD5_BLOCK_BYTES;
+               length_b -= MD5_BLOCK_BITS;
        }
-       state->a[0] += a[0];
-       state->a[1] += a[1];
-       state->a[2] += a[2];
-       state->a[3] += a[3];
-       state->counter++;
+       md5_lastBlock(&ctx, msg, length_b);
+       md5_ctx2hash(dest, &ctx);
 }
-#endif
-
-void md5_lastBlock(md5_ctx_t *state, void* block, uint16_t length_b){
-       uint16_t l;
-       uint8_t b[64];
-       while (length_b >= 512){
-               md5_nextBlock(state, block);
-               length_b -= 512;
-               block = ((uint8_t*)block) + 512/8;
-       }
-       memset(b, 0, 64);
-       memcpy(b, block, length_b/8);
-       /* insert padding one */
-       l=length_b/8;
-       if(length_b%8){
-               uint8_t t;
-               t = ((uint8_t*)block)[l];
-               t |= (0x80>>(length_b%8));
-               b[l]=t;
-       }else{
-               b[l]=0x80;
-       }
-       /* insert length value */
-       if(l+sizeof(uint64_t) >= 512/8){
-               md5_nextBlock(state, b);
-               state->counter--;
-               memset(b, 0, 64);
-       }
-       *((uint64_t*)&b[64-sizeof(uint64_t)]) = (state->counter * 512) + length_b;
-       md5_nextBlock(state, b);
-}
-