| @@ -41,7 +41,7 @@ typedef struct AVMD5{ | |||
| uint32_t ABCD[4]; | |||
| } AVMD5; | |||
| const int av_md5_size= sizeof(AVMD5); | |||
| const int av_md5_size = sizeof(AVMD5); | |||
| static const uint8_t S[4][4] = { | |||
| { 7, 12, 17, 22 }, /* round 1 */ | |||
| @@ -72,42 +72,49 @@ static const uint32_t T[64] = { // T[i]= fabs(sin(i+1)<<32) | |||
| 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391, | |||
| }; | |||
| #define CORE(i, a, b, c, d) \ | |||
| t = S[i>>4][i&3];\ | |||
| a += T[i];\ | |||
| \ | |||
| if(i<32){\ | |||
| if(i<16) a += (d ^ (b&(c^d))) + X[ i &15 ];\ | |||
| else a += (c ^ (d&(c^b))) + X[ (1+5*i)&15 ];\ | |||
| }else{\ | |||
| if(i<48) a += (b^c^d) + X[ (5+3*i)&15 ];\ | |||
| else a += (c^(b|~d)) + X[ ( 7*i)&15 ];\ | |||
| }\ | |||
| a = b + (( a << t ) | ( a >> (32 - t) )); | |||
| static void body(uint32_t ABCD[4], uint32_t X[16]){ | |||
| #define CORE(i, a, b, c, d) do { \ | |||
| t = S[i >> 4][i & 3]; \ | |||
| a += T[i]; \ | |||
| \ | |||
| if (i < 32) { \ | |||
| if (i < 16) a += (d ^ (b & (c ^ d))) + X[ i & 15]; \ | |||
| else a += (c ^ (d & (c ^ b))) + X[(1 + 5*i) & 15]; \ | |||
| } else { \ | |||
| if (i < 48) a += (b ^ c ^ d) + X[(5 + 3*i) & 15]; \ | |||
| else a += (c ^ (b | ~d)) + X[( 7*i) & 15]; \ | |||
| } \ | |||
| a = b + (a << t | a >> (32 - t)); \ | |||
| } while (0) | |||
| static void body(uint32_t ABCD[4], uint32_t X[16]) | |||
| { | |||
| int t; | |||
| int i av_unused; | |||
| unsigned int a= ABCD[3]; | |||
| unsigned int b= ABCD[2]; | |||
| unsigned int c= ABCD[1]; | |||
| unsigned int d= ABCD[0]; | |||
| unsigned int a = ABCD[3]; | |||
| unsigned int b = ABCD[2]; | |||
| unsigned int c = ABCD[1]; | |||
| unsigned int d = ABCD[0]; | |||
| #if HAVE_BIGENDIAN | |||
| for(i=0; i<16; i++) | |||
| X[i]= av_bswap32(X[i]); | |||
| for (i = 0; i < 16; i++) | |||
| X[i] = av_bswap32(X[i]); | |||
| #endif | |||
| #if CONFIG_SMALL | |||
| for( i = 0; i < 64; i++ ){ | |||
| CORE(i,a,b,c,d) | |||
| t=d; d=c; c=b; b=a; a=t; | |||
| for (i = 0; i < 64; i++) { | |||
| CORE(i, a, b, c, d); | |||
| t = d; | |||
| d = c; | |||
| c = b; | |||
| b = a; | |||
| a = t; | |||
| } | |||
| #else | |||
| #define CORE2(i) CORE(i,a,b,c,d) CORE((i+1),d,a,b,c) CORE((i+2),c,d,a,b) CORE((i+3),b,c,d,a) | |||
| #define CORE4(i) CORE2(i) CORE2((i+4)) CORE2((i+8)) CORE2((i+12)) | |||
| CORE4(0) CORE4(16) CORE4(32) CORE4(48) | |||
| #define CORE2(i) \ | |||
| CORE( i, a,b,c,d); CORE((i+1),d,a,b,c); \ | |||
| CORE((i+2),c,d,a,b); CORE((i+3),b,c,d,a) | |||
| #define CORE4(i) CORE2(i); CORE2((i+4)); CORE2((i+8)); CORE2((i+12)) | |||
| CORE4(0); CORE4(16); CORE4(32); CORE4(48); | |||
| #endif | |||
| ABCD[0] += d; | |||
| @@ -116,8 +123,9 @@ CORE4(0) CORE4(16) CORE4(32) CORE4(48) | |||
| ABCD[3] += a; | |||
| } | |||
| void av_md5_init(AVMD5 *ctx){ | |||
| ctx->len = 0; | |||
| void av_md5_init(AVMD5 *ctx) | |||
| { | |||
| ctx->len = 0; | |||
| ctx->ABCD[0] = 0x10325476; | |||
| ctx->ABCD[1] = 0x98badcfe; | |||
| @@ -125,41 +133,44 @@ void av_md5_init(AVMD5 *ctx){ | |||
| ctx->ABCD[3] = 0x67452301; | |||
| } | |||
| void av_md5_update(AVMD5 *ctx, const uint8_t *src, const int len){ | |||
| void av_md5_update(AVMD5 *ctx, const uint8_t *src, const int len) | |||
| { | |||
| int i, j; | |||
| j= ctx->len & 63; | |||
| j = ctx->len & 63; | |||
| ctx->len += len; | |||
| for( i = 0; i < len; i++ ){ | |||
| for (i = 0; i < len; i++) { | |||
| ctx->block[j++] = src[i]; | |||
| if( 64 == j ){ | |||
| body(ctx->ABCD, (uint32_t*) ctx->block); | |||
| if (j == 64) { | |||
| body(ctx->ABCD, (uint32_t *) ctx->block); | |||
| j = 0; | |||
| } | |||
| } | |||
| } | |||
| void av_md5_final(AVMD5 *ctx, uint8_t *dst){ | |||
| void av_md5_final(AVMD5 *ctx, uint8_t *dst) | |||
| { | |||
| int i; | |||
| uint64_t finalcount= av_le2ne64(ctx->len<<3); | |||
| uint64_t finalcount = av_le2ne64(ctx->len << 3); | |||
| av_md5_update(ctx, "\200", 1); | |||
| while((ctx->len & 63)!=56) | |||
| while ((ctx->len & 63) != 56) | |||
| av_md5_update(ctx, "", 1); | |||
| av_md5_update(ctx, (uint8_t*)&finalcount, 8); | |||
| av_md5_update(ctx, (uint8_t *)&finalcount, 8); | |||
| for(i=0; i<4; i++) | |||
| AV_WL32(dst + 4*i, ctx->ABCD[3-i]); | |||
| for (i = 0; i < 4; i++) | |||
| AV_WL32(dst + 4*i, ctx->ABCD[3 - i]); | |||
| } | |||
| void av_md5_sum(uint8_t *dst, const uint8_t *src, const int len){ | |||
| AVMD5 ctx[1]; | |||
| void av_md5_sum(uint8_t *dst, const uint8_t *src, const int len) | |||
| { | |||
| AVMD5 ctx; | |||
| av_md5_init(ctx); | |||
| av_md5_update(ctx, src, len); | |||
| av_md5_final(ctx, dst); | |||
| av_md5_init(&ctx); | |||
| av_md5_update(&ctx, src, len); | |||
| av_md5_final(&ctx, dst); | |||
| } | |||
| #ifdef TEST | |||
| @@ -179,12 +190,14 @@ int main(void){ | |||
| int i; | |||
| uint8_t in[1000]; | |||
| for(i=0; i<1000; i++) in[i]= i*i; | |||
| for (i = 0; i < 1000; i++) | |||
| in[i] = i * i; | |||
| av_md5_sum(md5val, in, 1000); print_md5(md5val); | |||
| av_md5_sum(md5val, in, 63); print_md5(md5val); | |||
| av_md5_sum(md5val, in, 64); print_md5(md5val); | |||
| av_md5_sum(md5val, in, 65); print_md5(md5val); | |||
| for(i=0; i<1000; i++) in[i]= i % 127; | |||
| for (i = 0; i < 1000; i++) | |||
| in[i] = i % 127; | |||
| av_md5_sum(md5val, in, 999); print_md5(md5val); | |||
| return 0; | |||