void md5_nextBlock(md5_ctx_t *state, const void* block){ uint32_t a[4]; uint8_t m,n,i=0; /* this requires other mixed sboxes */ #ifdef DEBUG cli_putstr("\r\n DBG: md5_nextBlock: block:\r\n"); cli_hexdump(block, 16); cli_putstr("\r\n"); cli_hexdump(block+16, 16); cli_putstr("\r\n"); cli_hexdump(block+32, 16); cli_putstr("\r\n"); cli_hexdump(block+48, 16); cli_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); } } state->a[0] += a[0]; state->a[1] += a[1]; state->a[2] += a[2]; state->a[3] += a[3]; state->counter++; }
static void run(struct EngineThread *eng) { SSE_CTX *ctx = eng->priv; result128_sort(ctx->res); while (eng->active) { md5_core(ctx); stack_turn(&ctx->stk[0], set_char_fast); stack_turn(&ctx->stk[1], set_char_fast); stack_turn(&ctx->stk[2], set_char_fast); stack_turn(&ctx->stk[3], set_char_fast); } }