diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2007-03-13 00:17:55 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2007-03-13 00:17:55 +0000 |
commit | 6573578d7b69718137fa19d608f59cd6f3efb92c (patch) | |
tree | cf6a2ed8653061ad9dee16a6ec3cc12852efe31b | |
parent | 086b0ad8ca5d7e1420b8ffa3e757e31b23692e55 (diff) | |
download | ffmpeg-6573578d7b69718137fa19d608f59cd6f3efb92c.tar.gz |
2 other variants of how to implement the core part
benchmarks welcome ...
Originally committed as revision 8367 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavutil/sha1.c | 83 |
1 files changed, 79 insertions, 4 deletions
diff --git a/libavutil/sha1.c b/libavutil/sha1.c index d955953d3f..f6bfd863a9 100644 --- a/libavutil/sha1.c +++ b/libavutil/sha1.c @@ -14,6 +14,11 @@ typedef struct AVSHA1 { #define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) /* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ +#define R0b(v,w,x,y,z,i) z+((w&(x^y))^y) +block[i]+0x5A827999+rol(v,5); +#define R2b(v,w,x,y,z,i) z+( w^x ^y) +block[i]+0x6ED9EBA1+rol(v,5); +#define R3b(v,w,x,y,z,i) z+(((w|x)&y)|(w&x))+block[i]+0x8F1BBCDC+rol(v,5); +#define R4b(v,w,x,y,z,i) z+( w^x ^y) +block[i]+0xCA62C1D6+rol(v,5); + #define R0(v,w,x,y,z,i) z+=((w&(x^y))^y) +block[i]+0x5A827999+rol(v,5);w=rol(w,30); #define R2(v,w,x,y,z,i) z+=( w^x ^y) +block[i]+0x6ED9EBA1+rol(v,5);w=rol(w,30); #define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+block[i]+0x8F1BBCDC+rol(v,5);w=rol(w,30); @@ -21,22 +26,91 @@ typedef struct AVSHA1 { /* Hash a single 512-bit block. This is the core of the algorithm. */ +//#define VARIANT1 +//#define VARIANT2 + static void transform(uint32_t state[5], uint8_t buffer[64]){ - unsigned int a, b, c, d, e, i; uint32_t block[80]; + unsigned int i; +#ifdef VARIANT1 + uint32_t s[85]; +#else + unsigned int a, b, c, d, e; +#endif for(i=0; i<16; i++) block[i]= be2me_32(((uint32_t*)buffer)[i]); for(;i<80; i++) block[i]= rol(block[i-3]^block[i-8]^block[i-14]^block[i-16],1); - /* Copy context->state[] to working vars */ + +#ifdef VARIANT1 + s[0]= state[4]; + s[1]= state[3]; + s[2]= state[2]; + s[3]= state[1]; + s[4]= state[0]; + for(i=0; i<20; i++){ + s[5+i]= R0b(s[4+i], s[3+i], s[2+i], s[1+i], s[i], i); + s[3+i]= rol(s[3+i],30); + } + for(; i<40; i++){ + s[5+i]= R2b(s[4+i], s[3+i], s[2+i], s[1+i], s[i], i); + s[3+i]= rol(s[3+i],30); + } + for(; i<60; i++){ + s[5+i]= R3b(s[4+i], s[3+i], s[2+i], s[1+i], s[i], i); + s[3+i]= rol(s[3+i],30); + } + for(; i<80; i++){ + s[5+i]= R4b(s[4+i], s[3+i], s[2+i], s[1+i], s[i], i); + s[3+i]= rol(s[3+i],30); + } + state[0] += s[84]; + state[1] += s[83]; + state[2] += s[82]; + state[3] += s[81]; + state[4] += s[80]; +#else a = state[0]; b = state[1]; c = state[2]; d = state[3]; e = state[4]; - +#ifdef VARIANT2 + for(i=0; i<20; i++){ + int t= R0b(a,b,c,d,e,i); + e= d; + d= c; + c= rol(b,30); + b= a; + a= t; + } + for(; i<40; i++){ + int t= R2b(a,b,c,d,e,i); + e= d; + d= c; + c= rol(b,30); + b= a; + a= t; + } + for(; i<60; i++){ + int t= R3b(a,b,c,d,e,i); + e= d; + d= c; + c= rol(b,30); + b= a; + a= t; + } + for(; i<80; i++){ + int t= R4b(a,b,c,d,e,i); + e= d; + d= c; + c= rol(b,30); + b= a; + a= t; + } +#else for(i=0; i<20; i+=5){ R0(a,b,c,d,e,0+i); R0(e,a,b,c,d,1+i); R0(d,e,a,b,c,2+i); R0(c,d,e,a,b,3+i); R0(b,c,d,e,a,4+i); } @@ -49,12 +123,13 @@ static void transform(uint32_t state[5], uint8_t buffer[64]){ for(; i<80; i+=5){ R4(a,b,c,d,e,0+i); R4(e,a,b,c,d,1+i); R4(d,e,a,b,c,2+i); R4(c,d,e,a,b,3+i); R4(b,c,d,e,a,4+i); } - +#endif state[0] += a; state[1] += b; state[2] += c; state[3] += d; state[4] += e; +#endif } void av_sha1_init(AVSHA1* context){ |