* Hash a single 512-bit block. This is the core of the algorithm. */
| 63 | * Hash a single 512-bit block. This is the core of the algorithm. |
| 64 | */ |
| 65 | void |
| 66 | SHA1Transform(u_int32_t state[5], const u_int8_t buffer[SHA1_BLOCK_LENGTH]) |
| 67 | { |
| 68 | u_int32_t a, b, c, d, e; |
| 69 | u_int8_t workspace[SHA1_BLOCK_LENGTH]; |
| 70 | typedef union { |
| 71 | u_int8_t c[64]; |
| 72 | u_int32_t l[16]; |
| 73 | } CHAR64LONG16; |
| 74 | CHAR64LONG16 *block = (CHAR64LONG16 *)workspace; |
| 75 | |
| 76 | (void)memcpy(block, buffer, SHA1_BLOCK_LENGTH); |
| 77 | |
| 78 | /* Copy context->state[] to working vars */ |
| 79 | a = state[0]; |
| 80 | b = state[1]; |
| 81 | c = state[2]; |
| 82 | d = state[3]; |
| 83 | e = state[4]; |
| 84 | |
| 85 | /* 4 rounds of 20 operations each. Loop unrolled. */ |
| 86 | 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); |
| 87 | 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); |
| 88 | 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); |
| 89 | 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); |
| 90 | 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); |
| 91 | 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); |
| 92 | 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); |
| 93 | 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); |
| 94 | 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); |
| 95 | 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); |
| 96 | 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); |
| 97 | 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); |
| 98 | 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); |
| 99 | 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); |
| 100 | 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); |
| 101 | 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); |
| 102 | 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); |
| 103 | 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); |
| 104 | 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); |
| 105 | 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); |
| 106 | |
| 107 | /* Add the working vars back into context.state[] */ |
| 108 | state[0] += a; |
| 109 | state[1] += b; |
| 110 | state[2] += c; |
| 111 | state[3] += d; |
| 112 | state[4] += e; |
| 113 | |
| 114 | /* Wipe variables */ |
| 115 | a = b = c = d = e = 0; |
| 116 | } |
| 117 | |
| 118 | /* |
| 119 | * SHA1Init - Initialize new context |