1 /* 2 * sha1.c 3 * 4 * an implementation of the Secure Hash Algorithm v.1 (SHA-1), 5 * specified in FIPS 180-1 6 * 7 * David A. McGrew 8 * Cisco Systems, Inc. 9 */ 10 11 /* 12 * 13 * Copyright (c) 2001-2006, Cisco Systems, Inc. 14 * All rights reserved. 15 * 16 * Redistribution and use in source and binary forms, with or without 17 * modification, are permitted provided that the following conditions 18 * are met: 19 * 20 * Redistributions of source code must retain the above copyright 21 * notice, this list of conditions and the following disclaimer. 22 * 23 * Redistributions in binary form must reproduce the above 24 * copyright notice, this list of conditions and the following 25 * disclaimer in the documentation and/or other materials provided 26 * with the distribution. 27 * 28 * Neither the name of the Cisco Systems, Inc. nor the names of its 29 * contributors may be used to endorse or promote products derived 30 * from this software without specific prior written permission. 31 * 32 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 33 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 34 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 35 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 36 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 37 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 38 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 39 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 40 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 41 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 42 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 43 * OF THE POSSIBILITY OF SUCH DAMAGE. 44 * 45 */ 46 47 48 #include "sha1.h" 49 50 debug_module_t mod_sha1 = { 51 0, /* debugging is off by default */ 52 "sha-1" /* printable module name */ 53 }; 54 55 /* SN == Rotate left N bits */ 56 #define S1(X) ((X << 1) | (X >> 31)) 57 #define S5(X) ((X << 5) | (X >> 27)) 58 #define S30(X) ((X << 30) | (X >> 2)) 59 60 #define f0(B,C,D) ((B & C) | (~B & D)) 61 #define f1(B,C,D) (B ^ C ^ D) 62 #define f2(B,C,D) ((B & C) | (B & D) | (C & D)) 63 #define f3(B,C,D) (B ^ C ^ D) 64 65 /* 66 * nota bene: the variable K0 appears in the curses library, so we 67 * give longer names to these variables to avoid spurious warnings 68 * on systems that uses curses 69 */ 70 71 uint32_t SHA_K0 = 0x5A827999; /* Kt for 0 <= t <= 19 */ 72 uint32_t SHA_K1 = 0x6ED9EBA1; /* Kt for 20 <= t <= 39 */ 73 uint32_t SHA_K2 = 0x8F1BBCDC; /* Kt for 40 <= t <= 59 */ 74 uint32_t SHA_K3 = 0xCA62C1D6; /* Kt for 60 <= t <= 79 */ 75 76 void 77 sha1(const uint8_t *msg, int octets_in_msg, uint32_t hash_value[5]) { 78 sha1_ctx_t ctx; 79 80 sha1_init(&ctx); 81 sha1_update(&ctx, msg, octets_in_msg); 82 sha1_final(&ctx, hash_value); 83 84 } 85 86 /* 87 * sha1_core(M, H) computes the core compression function, where M is 88 * the next part of the message (in network byte order) and H is the 89 * intermediate state { H0, H1, ...} (in host byte order) 90 * 91 * this function does not do any of the padding required in the 92 * complete SHA1 function 93 * 94 * this function is used in the SEAL 3.0 key setup routines 95 * (crypto/cipher/seal.c) 96 */ 97 98 void 99 sha1_core(const uint32_t M[16], uint32_t hash_value[5]) { 100 uint32_t H0; 101 uint32_t H1; 102 uint32_t H2; 103 uint32_t H3; 104 uint32_t H4; 105 uint32_t W[80]; 106 uint32_t A, B, C, D, E, TEMP; 107 int t; 108 109 /* copy hash_value into H0, H1, H2, H3, H4 */ 110 H0 = hash_value[0]; 111 H1 = hash_value[1]; 112 H2 = hash_value[2]; 113 H3 = hash_value[3]; 114 H4 = hash_value[4]; 115 116 /* copy/xor message into array */ 117 118 W[0] = be32_to_cpu(M[0]); 119 W[1] = be32_to_cpu(M[1]); 120 W[2] = be32_to_cpu(M[2]); 121 W[3] = be32_to_cpu(M[3]); 122 W[4] = be32_to_cpu(M[4]); 123 W[5] = be32_to_cpu(M[5]); 124 W[6] = be32_to_cpu(M[6]); 125 W[7] = be32_to_cpu(M[7]); 126 W[8] = be32_to_cpu(M[8]); 127 W[9] = be32_to_cpu(M[9]); 128 W[10] = be32_to_cpu(M[10]); 129 W[11] = be32_to_cpu(M[11]); 130 W[12] = be32_to_cpu(M[12]); 131 W[13] = be32_to_cpu(M[13]); 132 W[14] = be32_to_cpu(M[14]); 133 W[15] = be32_to_cpu(M[15]); 134 TEMP = W[13] ^ W[8] ^ W[2] ^ W[0]; W[16] = S1(TEMP); 135 TEMP = W[14] ^ W[9] ^ W[3] ^ W[1]; W[17] = S1(TEMP); 136 TEMP = W[15] ^ W[10] ^ W[4] ^ W[2]; W[18] = S1(TEMP); 137 TEMP = W[16] ^ W[11] ^ W[5] ^ W[3]; W[19] = S1(TEMP); 138 TEMP = W[17] ^ W[12] ^ W[6] ^ W[4]; W[20] = S1(TEMP); 139 TEMP = W[18] ^ W[13] ^ W[7] ^ W[5]; W[21] = S1(TEMP); 140 TEMP = W[19] ^ W[14] ^ W[8] ^ W[6]; W[22] = S1(TEMP); 141 TEMP = W[20] ^ W[15] ^ W[9] ^ W[7]; W[23] = S1(TEMP); 142 TEMP = W[21] ^ W[16] ^ W[10] ^ W[8]; W[24] = S1(TEMP); 143 TEMP = W[22] ^ W[17] ^ W[11] ^ W[9]; W[25] = S1(TEMP); 144 TEMP = W[23] ^ W[18] ^ W[12] ^ W[10]; W[26] = S1(TEMP); 145 TEMP = W[24] ^ W[19] ^ W[13] ^ W[11]; W[27] = S1(TEMP); 146 TEMP = W[25] ^ W[20] ^ W[14] ^ W[12]; W[28] = S1(TEMP); 147 TEMP = W[26] ^ W[21] ^ W[15] ^ W[13]; W[29] = S1(TEMP); 148 TEMP = W[27] ^ W[22] ^ W[16] ^ W[14]; W[30] = S1(TEMP); 149 TEMP = W[28] ^ W[23] ^ W[17] ^ W[15]; W[31] = S1(TEMP); 150 151 /* process the remainder of the array */ 152 for (t=32; t < 80; t++) { 153 TEMP = W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16]; 154 W[t] = S1(TEMP); 155 } 156 157 A = H0; B = H1; C = H2; D = H3; E = H4; 158 159 for (t=0; t < 20; t++) { 160 TEMP = S5(A) + f0(B,C,D) + E + W[t] + SHA_K0; 161 E = D; D = C; C = S30(B); B = A; A = TEMP; 162 } 163 for ( ; t < 40; t++) { 164 TEMP = S5(A) + f1(B,C,D) + E + W[t] + SHA_K1; 165 E = D; D = C; C = S30(B); B = A; A = TEMP; 166 } 167 for ( ; t < 60; t++) { 168 TEMP = S5(A) + f2(B,C,D) + E + W[t] + SHA_K2; 169 E = D; D = C; C = S30(B); B = A; A = TEMP; 170 } 171 for ( ; t < 80; t++) { 172 TEMP = S5(A) + f3(B,C,D) + E + W[t] + SHA_K3; 173 E = D; D = C; C = S30(B); B = A; A = TEMP; 174 } 175 176 hash_value[0] = H0 + A; 177 hash_value[1] = H1 + B; 178 hash_value[2] = H2 + C; 179 hash_value[3] = H3 + D; 180 hash_value[4] = H4 + E; 181 182 return; 183 } 184 185 void 186 sha1_init(sha1_ctx_t *ctx) { 187 188 /* initialize state vector */ 189 ctx->H[0] = 0x67452301; 190 ctx->H[1] = 0xefcdab89; 191 ctx->H[2] = 0x98badcfe; 192 ctx->H[3] = 0x10325476; 193 ctx->H[4] = 0xc3d2e1f0; 194 195 /* indicate that message buffer is empty */ 196 ctx->octets_in_buffer = 0; 197 198 /* reset message bit-count to zero */ 199 ctx->num_bits_in_msg = 0; 200 201 } 202 203 void 204 sha1_update(sha1_ctx_t *ctx, const uint8_t *msg, int octets_in_msg) { 205 int i; 206 uint8_t *buf = (uint8_t *)ctx->M; 207 208 /* update message bit-count */ 209 ctx->num_bits_in_msg += octets_in_msg * 8; 210 211 /* loop over 16-word blocks of M */ 212 while (octets_in_msg > 0) { 213 214 if (octets_in_msg + ctx->octets_in_buffer >= 64) { 215 216 /* 217 * copy words of M into msg buffer until that buffer is full, 218 * converting them into host byte order as needed 219 */ 220 octets_in_msg -= (64 - ctx->octets_in_buffer); 221 for (i=ctx->octets_in_buffer; i < 64; i++) 222 buf[i] = *msg++; 223 ctx->octets_in_buffer = 0; 224 225 /* process a whole block */ 226 227 debug_print(mod_sha1, "(update) running sha1_core()", NULL); 228 229 sha1_core(ctx->M, ctx->H); 230 231 } else { 232 233 debug_print(mod_sha1, "(update) not running sha1_core()", NULL); 234 235 for (i=ctx->octets_in_buffer; 236 i < (ctx->octets_in_buffer + octets_in_msg); i++) 237 buf[i] = *msg++; 238 ctx->octets_in_buffer += octets_in_msg; 239 octets_in_msg = 0; 240 } 241 242 } 243 244 } 245 246 /* 247 * sha1_final(ctx, output) computes the result for ctx and copies it 248 * into the twenty octets located at *output 249 */ 250 251 void 252 sha1_final(sha1_ctx_t *ctx, uint32_t *output) { 253 uint32_t A, B, C, D, E, TEMP; 254 uint32_t W[80]; 255 int i, t; 256 257 /* 258 * process the remaining octets_in_buffer, padding and terminating as 259 * necessary 260 */ 261 { 262 int tail = ctx->octets_in_buffer % 4; 263 264 /* copy/xor message into array */ 265 for (i=0; i < (ctx->octets_in_buffer+3)/4; i++) 266 W[i] = be32_to_cpu(ctx->M[i]); 267 268 /* set the high bit of the octet immediately following the message */ 269 switch (tail) { 270 case (3): 271 W[i-1] = (be32_to_cpu(ctx->M[i-1]) & 0xffffff00) | 0x80; 272 W[i] = 0x0; 273 break; 274 case (2): 275 W[i-1] = (be32_to_cpu(ctx->M[i-1]) & 0xffff0000) | 0x8000; 276 W[i] = 0x0; 277 break; 278 case (1): 279 W[i-1] = (be32_to_cpu(ctx->M[i-1]) & 0xff000000) | 0x800000; 280 W[i] = 0x0; 281 break; 282 case (0): 283 W[i] = 0x80000000; 284 break; 285 } 286 287 /* zeroize remaining words */ 288 for (i++ ; i < 15; i++) 289 W[i] = 0x0; 290 291 /* 292 * if there is room at the end of the word array, then set the 293 * last word to the bit-length of the message; otherwise, set that 294 * word to zero and then we need to do one more run of the 295 * compression algo. 296 */ 297 if (ctx->octets_in_buffer < 56) 298 W[15] = ctx->num_bits_in_msg; 299 else if (ctx->octets_in_buffer < 60) 300 W[15] = 0x0; 301 302 /* process the word array */ 303 for (t=16; t < 80; t++) { 304 TEMP = W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16]; 305 W[t] = S1(TEMP); 306 } 307 308 A = ctx->H[0]; 309 B = ctx->H[1]; 310 C = ctx->H[2]; 311 D = ctx->H[3]; 312 E = ctx->H[4]; 313 314 for (t=0; t < 20; t++) { 315 TEMP = S5(A) + f0(B,C,D) + E + W[t] + SHA_K0; 316 E = D; D = C; C = S30(B); B = A; A = TEMP; 317 } 318 for ( ; t < 40; t++) { 319 TEMP = S5(A) + f1(B,C,D) + E + W[t] + SHA_K1; 320 E = D; D = C; C = S30(B); B = A; A = TEMP; 321 } 322 for ( ; t < 60; t++) { 323 TEMP = S5(A) + f2(B,C,D) + E + W[t] + SHA_K2; 324 E = D; D = C; C = S30(B); B = A; A = TEMP; 325 } 326 for ( ; t < 80; t++) { 327 TEMP = S5(A) + f3(B,C,D) + E + W[t] + SHA_K3; 328 E = D; D = C; C = S30(B); B = A; A = TEMP; 329 } 330 331 ctx->H[0] += A; 332 ctx->H[1] += B; 333 ctx->H[2] += C; 334 ctx->H[3] += D; 335 ctx->H[4] += E; 336 337 } 338 339 debug_print(mod_sha1, "(final) running sha1_core()", NULL); 340 341 if (ctx->octets_in_buffer >= 56) { 342 343 debug_print(mod_sha1, "(final) running sha1_core() again", NULL); 344 345 /* we need to do one final run of the compression algo */ 346 347 /* 348 * set initial part of word array to zeros, and set the 349 * final part to the number of bits in the message 350 */ 351 for (i=0; i < 15; i++) 352 W[i] = 0x0; 353 W[15] = ctx->num_bits_in_msg; 354 355 /* process the word array */ 356 for (t=16; t < 80; t++) { 357 TEMP = W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16]; 358 W[t] = S1(TEMP); 359 } 360 361 A = ctx->H[0]; 362 B = ctx->H[1]; 363 C = ctx->H[2]; 364 D = ctx->H[3]; 365 E = ctx->H[4]; 366 367 for (t=0; t < 20; t++) { 368 TEMP = S5(A) + f0(B,C,D) + E + W[t] + SHA_K0; 369 E = D; D = C; C = S30(B); B = A; A = TEMP; 370 } 371 for ( ; t < 40; t++) { 372 TEMP = S5(A) + f1(B,C,D) + E + W[t] + SHA_K1; 373 E = D; D = C; C = S30(B); B = A; A = TEMP; 374 } 375 for ( ; t < 60; t++) { 376 TEMP = S5(A) + f2(B,C,D) + E + W[t] + SHA_K2; 377 E = D; D = C; C = S30(B); B = A; A = TEMP; 378 } 379 for ( ; t < 80; t++) { 380 TEMP = S5(A) + f3(B,C,D) + E + W[t] + SHA_K3; 381 E = D; D = C; C = S30(B); B = A; A = TEMP; 382 } 383 384 ctx->H[0] += A; 385 ctx->H[1] += B; 386 ctx->H[2] += C; 387 ctx->H[3] += D; 388 ctx->H[4] += E; 389 } 390 391 /* copy result into output buffer */ 392 output[0] = be32_to_cpu(ctx->H[0]); 393 output[1] = be32_to_cpu(ctx->H[1]); 394 output[2] = be32_to_cpu(ctx->H[2]); 395 output[3] = be32_to_cpu(ctx->H[3]); 396 output[4] = be32_to_cpu(ctx->H[4]); 397 398 /* indicate that message buffer in context is empty */ 399 ctx->octets_in_buffer = 0; 400 401 return; 402 } 403 404 405 406