diff options
-rw-r--r-- | toys/sha1.c | 78 |
1 files changed, 35 insertions, 43 deletions
diff --git a/toys/sha1.c b/toys/sha1.c index b57805f9..77228afb 100644 --- a/toys/sha1.c +++ b/toys/sha1.c @@ -13,6 +13,7 @@ struct sha1 { uint32_t state[5]; + uint32_t oldstate[5]; uint64_t count; union { unsigned char c[64]; @@ -38,12 +39,7 @@ void sha1_final(struct sha1 *this, unsigned char digest[20]); #define blk(i) (block[i&15] = rol(block[(i+13)&15]^block[(i+8)&15] \ ^block[(i+2)&15]^block[i&15],1)) -/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ -#define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30); -#define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30); -#define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30); -#define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30); -#define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30); +static const uint32_t rconsts[]={0x5A827999,0x6ED9EBA1,0x8F1BBCDC,0xCA62C1D6}; void printy(unsigned char *this) { @@ -57,45 +53,41 @@ void printy(unsigned char *this) void sha1_transform(struct sha1 *this) { - unsigned int a, b, c, d, e; + int i, j, k, count; uint32_t *block = this->buffer.i; + uint32_t *rot[5], *temp; /* Copy context->state[] to working vars */ - a = this->state[0]; - b = this->state[1]; - c = this->state[2]; - d = this->state[3]; - e = this->state[4]; - /* 4 rounds of 20 operations each. Loop unrolled. */ - R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3); - R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7); - R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11); - R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15); - R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19); - R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23); - R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27); - R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31); - R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35); - R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39); - R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43); - R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47); - R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51); - R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55); - R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59); - R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63); - R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67); - R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71); - R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75); - R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79); - /* Add the working vars back into context.state[] */ - this->state[0] += a; - this->state[1] += b; - this->state[2] += c; - this->state[3] += d; - this->state[4] += e; -printy(this->state); - /* Wipe variables */ - a = b = c = d = e = 0; + for (i=0; i<5; i++) { + this->oldstate[i] = this->state[i]; + rot[i] = this->state + i; + } + /* 4 rounds of 20 operations each. */ + for (i=count=0; i<4; i++) { + for (j=0; j<20; j++) { + uint32_t work; + + work = *rot[2] ^ *rot[3]; + if (!i) work = (work & *rot[1]) ^ *rot[3]; + else { + if (i==2) + work = ((*rot[1]|*rot[2])&*rot[3])|(*rot[1]&*rot[2]); + else work ^= *rot[1]; + } + if (!i && j<16) work += blk0(count); + else work += blk(count); + *rot[4] += work + rol(*rot[0],5) + rconsts[i]; + *rot[1] = rol(*rot[1],30); + + // Rotate by one for next time. + temp = rot[4]; + for (k=4; k; k--) rot[k] = rot[k-1]; + *rot = temp; + count++; + } + } + /* Add the previous values of state[] */ + for (i=0; i<5; i++) this->state[i] += this->oldstate[i]; } @@ -163,7 +155,7 @@ void sha1_final(struct sha1 *this, unsigned char digest[20]) ((this->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255); } /* Wipe variables */ - i = 0; + memset(this, 0, sizeof(struct sha1)); } |