1 /* 2 * sha512.c - implementation of SHA256, SHA384 and SHA512 3 * 4 * ***** BEGIN LICENSE BLOCK ***** 5 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 6 * 7 * The contents of this file are subject to the Mozilla Public License Version 8 * 1.1 (the "License"); you may not use this file except in compliance with 9 * the License. You may obtain a copy of the License at 10 * http://www.mozilla.org/MPL/ 11 * 12 * Software distributed under the License is distributed on an "AS IS" basis, 13 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 14 * for the specific language governing rights and limitations under the 15 * License. 16 * 17 * The Original Code is the Netscape security libraries. 18 * 19 * The Initial Developer of the Original Code is 20 * Netscape Communications Corporation. 21 * Portions created by the Initial Developer are Copyright (C) 2002 22 * the Initial Developer. All Rights Reserved. 23 * 24 * Contributor(s): 25 * 26 * Alternatively, the contents of this file may be used under the terms of 27 * either the GNU General Public License Version 2 or later (the "GPL"), or 28 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), 29 * in which case the provisions of the GPL or the LGPL are applicable instead 30 * of those above. If you wish to allow use of your version of this file only 31 * under the terms of either the GPL or the LGPL, and not to allow others to 32 * use your version of this file under the terms of the MPL, indicate your 33 * decision by deleting the provisions above and replace them with the notice 34 * and other provisions required by the GPL or the LGPL. If you do not delete 35 * the provisions above, a recipient may use your version of this file under 36 * the terms of any one of the MPL, the GPL or the LGPL. 37 * 38 * ***** END LICENSE BLOCK ***** */ 39 /* $Id: sha512.c,v 1.9 2006/10/13 16:54:04 wtchang%redhat.com Exp $ */ 40 41 // Prevent manual unrolling in the sha256 code, which reduces the binary code 42 // size from ~10k to ~1k. The performance should be reasonable for our use. 43 #define NOUNROLL256 1 44 45 #include "crypto/third_party/nss/chromium-prtypes.h" /* for PRUintXX */ 46 #if defined(_X86_) || defined(SHA_NO_LONG_LONG) 47 #define NOUNROLL512 1 48 #undef HAVE_LONG_LONG 49 #endif 50 #include "crypto/third_party/nss/chromium-blapi.h" 51 #include "crypto/third_party/nss/chromium-sha256.h" /* for struct SHA256ContextStr */ 52 53 #include <stdlib.h> 54 #include <string.h> 55 #define PORT_New(type) static_cast<type*>(malloc(sizeof(type))) 56 #define PORT_ZFree(ptr, len) do { memset(ptr, 0, len); free(ptr); } while (0) 57 #define PORT_Strlen(s) static_cast<unsigned int>(strlen(s)) 58 #define PORT_Memcpy memcpy 59 60 /* ============= Common constants and defines ======================= */ 61 62 #define W ctx->u.w 63 #define B ctx->u.b 64 #define H ctx->h 65 66 #define SHR(x,n) (x >> n) 67 #define SHL(x,n) (x << n) 68 #define Ch(x,y,z) ((x & y) ^ (~x & z)) 69 #define Maj(x,y,z) ((x & y) ^ (x & z) ^ (y & z)) 70 71 /* Padding used with all flavors of SHA */ 72 static const PRUint8 pad[240] = { 73 0x80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 74 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 75 /* compiler will fill the rest in with zeros */ 76 }; 77 78 /* ============= SHA256 implemenmtation ================================== */ 79 80 /* SHA-256 constants, K256. */ 81 static const PRUint32 K256[64] = { 82 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 83 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 84 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 85 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 86 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 87 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 88 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 89 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 90 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 91 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 92 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 93 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 94 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 95 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 96 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 97 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 98 }; 99 100 /* SHA-256 initial hash values */ 101 static const PRUint32 H256[8] = { 102 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 103 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 104 }; 105 106 #if defined(_MSC_VER) && defined(_X86_) 107 #ifndef FORCEINLINE 108 #if (_MSC_VER >= 1200) 109 #define FORCEINLINE __forceinline 110 #else 111 #define FORCEINLINE __inline 112 #endif 113 #endif 114 #define FASTCALL __fastcall 115 116 static FORCEINLINE PRUint32 FASTCALL 117 swap4b(PRUint32 dwd) 118 { 119 __asm { 120 mov eax,dwd 121 bswap eax 122 } 123 } 124 125 #define SHA_HTONL(x) swap4b(x) 126 #define BYTESWAP4(x) x = SHA_HTONL(x) 127 128 #elif defined(LINUX) && defined(_X86_) 129 #undef __OPTIMIZE__ 130 #define __OPTIMIZE__ 1 131 #undef __pentium__ 132 #define __pentium__ 1 133 #include <byteswap.h> 134 #define SHA_HTONL(x) bswap_32(x) 135 #define BYTESWAP4(x) x = SHA_HTONL(x) 136 137 #else /* neither windows nor Linux PC */ 138 #define SWAP4MASK 0x00FF00FF 139 #define SHA_HTONL(x) (t1 = (x), t1 = (t1 << 16) | (t1 >> 16), \ 140 ((t1 & SWAP4MASK) << 8) | ((t1 >> 8) & SWAP4MASK)) 141 #define BYTESWAP4(x) x = SHA_HTONL(x) 142 #endif 143 144 #if defined(_MSC_VER) && defined(_X86_) 145 #pragma intrinsic (_lrotr, _lrotl) 146 #define ROTR32(x,n) _lrotr(x,n) 147 #define ROTL32(x,n) _lrotl(x,n) 148 #else 149 #define ROTR32(x,n) ((x >> n) | (x << ((8 * sizeof x) - n))) 150 #define ROTL32(x,n) ((x << n) | (x >> ((8 * sizeof x) - n))) 151 #endif 152 153 /* Capitol Sigma and lower case sigma functions */ 154 #define S0(x) (ROTR32(x, 2) ^ ROTR32(x,13) ^ ROTR32(x,22)) 155 #define S1(x) (ROTR32(x, 6) ^ ROTR32(x,11) ^ ROTR32(x,25)) 156 #define s0(x) (t1 = x, ROTR32(t1, 7) ^ ROTR32(t1,18) ^ SHR(t1, 3)) 157 #define s1(x) (t2 = x, ROTR32(t2,17) ^ ROTR32(t2,19) ^ SHR(t2,10)) 158 159 SHA256Context * 160 SHA256_NewContext(void) 161 { 162 SHA256Context *ctx = PORT_New(SHA256Context); 163 return ctx; 164 } 165 166 void 167 SHA256_DestroyContext(SHA256Context *ctx, PRBool freeit) 168 { 169 if (freeit) { 170 PORT_ZFree(ctx, sizeof *ctx); 171 } 172 } 173 174 void 175 SHA256_Begin(SHA256Context *ctx) 176 { 177 memset(ctx, 0, sizeof *ctx); 178 memcpy(H, H256, sizeof H256); 179 } 180 181 static void 182 SHA256_Compress(SHA256Context *ctx) 183 { 184 { 185 register PRUint32 t1, t2; 186 187 #if defined(IS_LITTLE_ENDIAN) 188 BYTESWAP4(W[0]); 189 BYTESWAP4(W[1]); 190 BYTESWAP4(W[2]); 191 BYTESWAP4(W[3]); 192 BYTESWAP4(W[4]); 193 BYTESWAP4(W[5]); 194 BYTESWAP4(W[6]); 195 BYTESWAP4(W[7]); 196 BYTESWAP4(W[8]); 197 BYTESWAP4(W[9]); 198 BYTESWAP4(W[10]); 199 BYTESWAP4(W[11]); 200 BYTESWAP4(W[12]); 201 BYTESWAP4(W[13]); 202 BYTESWAP4(W[14]); 203 BYTESWAP4(W[15]); 204 #endif 205 206 #define INITW(t) W[t] = (s1(W[t-2]) + W[t-7] + s0(W[t-15]) + W[t-16]) 207 208 /* prepare the "message schedule" */ 209 #ifdef NOUNROLL256 210 { 211 int t; 212 for (t = 16; t < 64; ++t) { 213 INITW(t); 214 } 215 } 216 #else 217 INITW(16); 218 INITW(17); 219 INITW(18); 220 INITW(19); 221 222 INITW(20); 223 INITW(21); 224 INITW(22); 225 INITW(23); 226 INITW(24); 227 INITW(25); 228 INITW(26); 229 INITW(27); 230 INITW(28); 231 INITW(29); 232 233 INITW(30); 234 INITW(31); 235 INITW(32); 236 INITW(33); 237 INITW(34); 238 INITW(35); 239 INITW(36); 240 INITW(37); 241 INITW(38); 242 INITW(39); 243 244 INITW(40); 245 INITW(41); 246 INITW(42); 247 INITW(43); 248 INITW(44); 249 INITW(45); 250 INITW(46); 251 INITW(47); 252 INITW(48); 253 INITW(49); 254 255 INITW(50); 256 INITW(51); 257 INITW(52); 258 INITW(53); 259 INITW(54); 260 INITW(55); 261 INITW(56); 262 INITW(57); 263 INITW(58); 264 INITW(59); 265 266 INITW(60); 267 INITW(61); 268 INITW(62); 269 INITW(63); 270 271 #endif 272 #undef INITW 273 } 274 { 275 PRUint32 a, b, c, d, e, f, g, h; 276 277 a = H[0]; 278 b = H[1]; 279 c = H[2]; 280 d = H[3]; 281 e = H[4]; 282 f = H[5]; 283 g = H[6]; 284 h = H[7]; 285 286 #define ROUND(n,a,b,c,d,e,f,g,h) \ 287 h += S1(e) + Ch(e,f,g) + K256[n] + W[n]; \ 288 d += h; \ 289 h += S0(a) + Maj(a,b,c); 290 291 #ifdef NOUNROLL256 292 { 293 int t; 294 for (t = 0; t < 64; t+= 8) { 295 ROUND(t+0,a,b,c,d,e,f,g,h) 296 ROUND(t+1,h,a,b,c,d,e,f,g) 297 ROUND(t+2,g,h,a,b,c,d,e,f) 298 ROUND(t+3,f,g,h,a,b,c,d,e) 299 ROUND(t+4,e,f,g,h,a,b,c,d) 300 ROUND(t+5,d,e,f,g,h,a,b,c) 301 ROUND(t+6,c,d,e,f,g,h,a,b) 302 ROUND(t+7,b,c,d,e,f,g,h,a) 303 } 304 } 305 #else 306 ROUND( 0,a,b,c,d,e,f,g,h) 307 ROUND( 1,h,a,b,c,d,e,f,g) 308 ROUND( 2,g,h,a,b,c,d,e,f) 309 ROUND( 3,f,g,h,a,b,c,d,e) 310 ROUND( 4,e,f,g,h,a,b,c,d) 311 ROUND( 5,d,e,f,g,h,a,b,c) 312 ROUND( 6,c,d,e,f,g,h,a,b) 313 ROUND( 7,b,c,d,e,f,g,h,a) 314 315 ROUND( 8,a,b,c,d,e,f,g,h) 316 ROUND( 9,h,a,b,c,d,e,f,g) 317 ROUND(10,g,h,a,b,c,d,e,f) 318 ROUND(11,f,g,h,a,b,c,d,e) 319 ROUND(12,e,f,g,h,a,b,c,d) 320 ROUND(13,d,e,f,g,h,a,b,c) 321 ROUND(14,c,d,e,f,g,h,a,b) 322 ROUND(15,b,c,d,e,f,g,h,a) 323 324 ROUND(16,a,b,c,d,e,f,g,h) 325 ROUND(17,h,a,b,c,d,e,f,g) 326 ROUND(18,g,h,a,b,c,d,e,f) 327 ROUND(19,f,g,h,a,b,c,d,e) 328 ROUND(20,e,f,g,h,a,b,c,d) 329 ROUND(21,d,e,f,g,h,a,b,c) 330 ROUND(22,c,d,e,f,g,h,a,b) 331 ROUND(23,b,c,d,e,f,g,h,a) 332 333 ROUND(24,a,b,c,d,e,f,g,h) 334 ROUND(25,h,a,b,c,d,e,f,g) 335 ROUND(26,g,h,a,b,c,d,e,f) 336 ROUND(27,f,g,h,a,b,c,d,e) 337 ROUND(28,e,f,g,h,a,b,c,d) 338 ROUND(29,d,e,f,g,h,a,b,c) 339 ROUND(30,c,d,e,f,g,h,a,b) 340 ROUND(31,b,c,d,e,f,g,h,a) 341 342 ROUND(32,a,b,c,d,e,f,g,h) 343 ROUND(33,h,a,b,c,d,e,f,g) 344 ROUND(34,g,h,a,b,c,d,e,f) 345 ROUND(35,f,g,h,a,b,c,d,e) 346 ROUND(36,e,f,g,h,a,b,c,d) 347 ROUND(37,d,e,f,g,h,a,b,c) 348 ROUND(38,c,d,e,f,g,h,a,b) 349 ROUND(39,b,c,d,e,f,g,h,a) 350 351 ROUND(40,a,b,c,d,e,f,g,h) 352 ROUND(41,h,a,b,c,d,e,f,g) 353 ROUND(42,g,h,a,b,c,d,e,f) 354 ROUND(43,f,g,h,a,b,c,d,e) 355 ROUND(44,e,f,g,h,a,b,c,d) 356 ROUND(45,d,e,f,g,h,a,b,c) 357 ROUND(46,c,d,e,f,g,h,a,b) 358 ROUND(47,b,c,d,e,f,g,h,a) 359 360 ROUND(48,a,b,c,d,e,f,g,h) 361 ROUND(49,h,a,b,c,d,e,f,g) 362 ROUND(50,g,h,a,b,c,d,e,f) 363 ROUND(51,f,g,h,a,b,c,d,e) 364 ROUND(52,e,f,g,h,a,b,c,d) 365 ROUND(53,d,e,f,g,h,a,b,c) 366 ROUND(54,c,d,e,f,g,h,a,b) 367 ROUND(55,b,c,d,e,f,g,h,a) 368 369 ROUND(56,a,b,c,d,e,f,g,h) 370 ROUND(57,h,a,b,c,d,e,f,g) 371 ROUND(58,g,h,a,b,c,d,e,f) 372 ROUND(59,f,g,h,a,b,c,d,e) 373 ROUND(60,e,f,g,h,a,b,c,d) 374 ROUND(61,d,e,f,g,h,a,b,c) 375 ROUND(62,c,d,e,f,g,h,a,b) 376 ROUND(63,b,c,d,e,f,g,h,a) 377 #endif 378 379 H[0] += a; 380 H[1] += b; 381 H[2] += c; 382 H[3] += d; 383 H[4] += e; 384 H[5] += f; 385 H[6] += g; 386 H[7] += h; 387 } 388 #undef ROUND 389 } 390 391 #undef s0 392 #undef s1 393 #undef S0 394 #undef S1 395 396 void 397 SHA256_Update(SHA256Context *ctx, const unsigned char *input, 398 unsigned int inputLen) 399 { 400 unsigned int inBuf = ctx->sizeLo & 0x3f; 401 if (!inputLen) 402 return; 403 404 /* Add inputLen into the count of bytes processed, before processing */ 405 if ((ctx->sizeLo += inputLen) < inputLen) 406 ctx->sizeHi++; 407 408 /* if data already in buffer, attemp to fill rest of buffer */ 409 if (inBuf) { 410 unsigned int todo = SHA256_BLOCK_LENGTH - inBuf; 411 if (inputLen < todo) 412 todo = inputLen; 413 memcpy(B + inBuf, input, todo); 414 input += todo; 415 inputLen -= todo; 416 if (inBuf + todo == SHA256_BLOCK_LENGTH) 417 SHA256_Compress(ctx); 418 } 419 420 /* if enough data to fill one or more whole buffers, process them. */ 421 while (inputLen >= SHA256_BLOCK_LENGTH) { 422 memcpy(B, input, SHA256_BLOCK_LENGTH); 423 input += SHA256_BLOCK_LENGTH; 424 inputLen -= SHA256_BLOCK_LENGTH; 425 SHA256_Compress(ctx); 426 } 427 /* if data left over, fill it into buffer */ 428 if (inputLen) 429 memcpy(B, input, inputLen); 430 } 431 432 void 433 SHA256_End(SHA256Context *ctx, unsigned char *digest, 434 unsigned int *digestLen, unsigned int maxDigestLen) 435 { 436 unsigned int inBuf = ctx->sizeLo & 0x3f; 437 unsigned int padLen = (inBuf < 56) ? (56 - inBuf) : (56 + 64 - inBuf); 438 PRUint32 hi, lo; 439 #ifdef SWAP4MASK 440 PRUint32 t1; 441 #endif 442 443 hi = (ctx->sizeHi << 3) | (ctx->sizeLo >> 29); 444 lo = (ctx->sizeLo << 3); 445 446 SHA256_Update(ctx, pad, padLen); 447 448 #if defined(IS_LITTLE_ENDIAN) 449 W[14] = SHA_HTONL(hi); 450 W[15] = SHA_HTONL(lo); 451 #else 452 W[14] = hi; 453 W[15] = lo; 454 #endif 455 SHA256_Compress(ctx); 456 457 /* now output the answer */ 458 #if defined(IS_LITTLE_ENDIAN) 459 BYTESWAP4(H[0]); 460 BYTESWAP4(H[1]); 461 BYTESWAP4(H[2]); 462 BYTESWAP4(H[3]); 463 BYTESWAP4(H[4]); 464 BYTESWAP4(H[5]); 465 BYTESWAP4(H[6]); 466 BYTESWAP4(H[7]); 467 #endif 468 padLen = PR_MIN(SHA256_LENGTH, maxDigestLen); 469 memcpy(digest, H, padLen); 470 if (digestLen) 471 *digestLen = padLen; 472 } 473 474 void SHA256_Clone(SHA256Context* dest, SHA256Context* src) 475 { 476 memcpy(dest, src, sizeof *dest); 477 } 478 479 /* Comment out unused code, mostly the SHA384 and SHA512 implementations. */ 480 #if 0 481 SECStatus 482 SHA256_HashBuf(unsigned char *dest, const unsigned char *src, 483 unsigned int src_length) 484 { 485 SHA256Context ctx; 486 unsigned int outLen; 487 488 SHA256_Begin(&ctx); 489 SHA256_Update(&ctx, src, src_length); 490 SHA256_End(&ctx, dest, &outLen, SHA256_LENGTH); 491 492 return SECSuccess; 493 } 494 495 496 SECStatus 497 SHA256_Hash(unsigned char *dest, const char *src) 498 { 499 return SHA256_HashBuf(dest, (const unsigned char *)src, PORT_Strlen(src)); 500 } 501 502 503 void SHA256_TraceState(SHA256Context *ctx) { } 504 505 unsigned int 506 SHA256_FlattenSize(SHA256Context *ctx) 507 { 508 return sizeof *ctx; 509 } 510 511 SECStatus 512 SHA256_Flatten(SHA256Context *ctx,unsigned char *space) 513 { 514 PORT_Memcpy(space, ctx, sizeof *ctx); 515 return SECSuccess; 516 } 517 518 SHA256Context * 519 SHA256_Resurrect(unsigned char *space, void *arg) 520 { 521 SHA256Context *ctx = SHA256_NewContext(); 522 if (ctx) 523 PORT_Memcpy(ctx, space, sizeof *ctx); 524 return ctx; 525 } 526 527 /* ======= SHA512 and SHA384 common constants and defines ================= */ 528 529 /* common #defines for SHA512 and SHA384 */ 530 #if defined(HAVE_LONG_LONG) 531 #define ROTR64(x,n) ((x >> n) | (x << (64 - n))) 532 #define ROTL64(x,n) ((x << n) | (x >> (64 - n))) 533 534 #define S0(x) (ROTR64(x,28) ^ ROTR64(x,34) ^ ROTR64(x,39)) 535 #define S1(x) (ROTR64(x,14) ^ ROTR64(x,18) ^ ROTR64(x,41)) 536 #define s0(x) (t1 = x, ROTR64(t1, 1) ^ ROTR64(t1, 8) ^ SHR(t1,7)) 537 #define s1(x) (t2 = x, ROTR64(t2,19) ^ ROTR64(t2,61) ^ SHR(t2,6)) 538 539 #if PR_BYTES_PER_LONG == 8 540 #define ULLC(hi,lo) 0x ## hi ## lo ## UL 541 #elif defined(_MSC_VER) 542 #define ULLC(hi,lo) 0x ## hi ## lo ## ui64 543 #else 544 #define ULLC(hi,lo) 0x ## hi ## lo ## ULL 545 #endif 546 547 #define SHA_MASK16 ULLC(0000FFFF,0000FFFF) 548 #define SHA_MASK8 ULLC(00FF00FF,00FF00FF) 549 #define SHA_HTONLL(x) (t1 = x, \ 550 t1 = ((t1 & SHA_MASK8 ) << 8) | ((t1 >> 8) & SHA_MASK8 ), \ 551 t1 = ((t1 & SHA_MASK16) << 16) | ((t1 >> 16) & SHA_MASK16), \ 552 (t1 >> 32) | (t1 << 32)) 553 #define BYTESWAP8(x) x = SHA_HTONLL(x) 554 555 #else /* no long long */ 556 557 #if defined(IS_LITTLE_ENDIAN) 558 #define ULLC(hi,lo) { 0x ## lo ## U, 0x ## hi ## U } 559 #else 560 #define ULLC(hi,lo) { 0x ## hi ## U, 0x ## lo ## U } 561 #endif 562 563 #define SHA_HTONLL(x) ( BYTESWAP4(x.lo), BYTESWAP4(x.hi), \ 564 x.hi ^= x.lo ^= x.hi ^= x.lo, x) 565 #define BYTESWAP8(x) do { PRUint32 tmp; BYTESWAP4(x.lo); BYTESWAP4(x.hi); \ 566 tmp = x.lo; x.lo = x.hi; x.hi = tmp; } while (0) 567 #endif 568 569 /* SHA-384 and SHA-512 constants, K512. */ 570 static const PRUint64 K512[80] = { 571 #if PR_BYTES_PER_LONG == 8 572 0x428a2f98d728ae22UL , 0x7137449123ef65cdUL , 573 0xb5c0fbcfec4d3b2fUL , 0xe9b5dba58189dbbcUL , 574 0x3956c25bf348b538UL , 0x59f111f1b605d019UL , 575 0x923f82a4af194f9bUL , 0xab1c5ed5da6d8118UL , 576 0xd807aa98a3030242UL , 0x12835b0145706fbeUL , 577 0x243185be4ee4b28cUL , 0x550c7dc3d5ffb4e2UL , 578 0x72be5d74f27b896fUL , 0x80deb1fe3b1696b1UL , 579 0x9bdc06a725c71235UL , 0xc19bf174cf692694UL , 580 0xe49b69c19ef14ad2UL , 0xefbe4786384f25e3UL , 581 0x0fc19dc68b8cd5b5UL , 0x240ca1cc77ac9c65UL , 582 0x2de92c6f592b0275UL , 0x4a7484aa6ea6e483UL , 583 0x5cb0a9dcbd41fbd4UL , 0x76f988da831153b5UL , 584 0x983e5152ee66dfabUL , 0xa831c66d2db43210UL , 585 0xb00327c898fb213fUL , 0xbf597fc7beef0ee4UL , 586 0xc6e00bf33da88fc2UL , 0xd5a79147930aa725UL , 587 0x06ca6351e003826fUL , 0x142929670a0e6e70UL , 588 0x27b70a8546d22ffcUL , 0x2e1b21385c26c926UL , 589 0x4d2c6dfc5ac42aedUL , 0x53380d139d95b3dfUL , 590 0x650a73548baf63deUL , 0x766a0abb3c77b2a8UL , 591 0x81c2c92e47edaee6UL , 0x92722c851482353bUL , 592 0xa2bfe8a14cf10364UL , 0xa81a664bbc423001UL , 593 0xc24b8b70d0f89791UL , 0xc76c51a30654be30UL , 594 0xd192e819d6ef5218UL , 0xd69906245565a910UL , 595 0xf40e35855771202aUL , 0x106aa07032bbd1b8UL , 596 0x19a4c116b8d2d0c8UL , 0x1e376c085141ab53UL , 597 0x2748774cdf8eeb99UL , 0x34b0bcb5e19b48a8UL , 598 0x391c0cb3c5c95a63UL , 0x4ed8aa4ae3418acbUL , 599 0x5b9cca4f7763e373UL , 0x682e6ff3d6b2b8a3UL , 600 0x748f82ee5defb2fcUL , 0x78a5636f43172f60UL , 601 0x84c87814a1f0ab72UL , 0x8cc702081a6439ecUL , 602 0x90befffa23631e28UL , 0xa4506cebde82bde9UL , 603 0xbef9a3f7b2c67915UL , 0xc67178f2e372532bUL , 604 0xca273eceea26619cUL , 0xd186b8c721c0c207UL , 605 0xeada7dd6cde0eb1eUL , 0xf57d4f7fee6ed178UL , 606 0x06f067aa72176fbaUL , 0x0a637dc5a2c898a6UL , 607 0x113f9804bef90daeUL , 0x1b710b35131c471bUL , 608 0x28db77f523047d84UL , 0x32caab7b40c72493UL , 609 0x3c9ebe0a15c9bebcUL , 0x431d67c49c100d4cUL , 610 0x4cc5d4becb3e42b6UL , 0x597f299cfc657e2aUL , 611 0x5fcb6fab3ad6faecUL , 0x6c44198c4a475817UL 612 #else 613 ULLC(428a2f98,d728ae22), ULLC(71374491,23ef65cd), 614 ULLC(b5c0fbcf,ec4d3b2f), ULLC(e9b5dba5,8189dbbc), 615 ULLC(3956c25b,f348b538), ULLC(59f111f1,b605d019), 616 ULLC(923f82a4,af194f9b), ULLC(ab1c5ed5,da6d8118), 617 ULLC(d807aa98,a3030242), ULLC(12835b01,45706fbe), 618 ULLC(243185be,4ee4b28c), ULLC(550c7dc3,d5ffb4e2), 619 ULLC(72be5d74,f27b896f), ULLC(80deb1fe,3b1696b1), 620 ULLC(9bdc06a7,25c71235), ULLC(c19bf174,cf692694), 621 ULLC(e49b69c1,9ef14ad2), ULLC(efbe4786,384f25e3), 622 ULLC(0fc19dc6,8b8cd5b5), ULLC(240ca1cc,77ac9c65), 623 ULLC(2de92c6f,592b0275), ULLC(4a7484aa,6ea6e483), 624 ULLC(5cb0a9dc,bd41fbd4), ULLC(76f988da,831153b5), 625 ULLC(983e5152,ee66dfab), ULLC(a831c66d,2db43210), 626 ULLC(b00327c8,98fb213f), ULLC(bf597fc7,beef0ee4), 627 ULLC(c6e00bf3,3da88fc2), ULLC(d5a79147,930aa725), 628 ULLC(06ca6351,e003826f), ULLC(14292967,0a0e6e70), 629 ULLC(27b70a85,46d22ffc), ULLC(2e1b2138,5c26c926), 630 ULLC(4d2c6dfc,5ac42aed), ULLC(53380d13,9d95b3df), 631 ULLC(650a7354,8baf63de), ULLC(766a0abb,3c77b2a8), 632 ULLC(81c2c92e,47edaee6), ULLC(92722c85,1482353b), 633 ULLC(a2bfe8a1,4cf10364), ULLC(a81a664b,bc423001), 634 ULLC(c24b8b70,d0f89791), ULLC(c76c51a3,0654be30), 635 ULLC(d192e819,d6ef5218), ULLC(d6990624,5565a910), 636 ULLC(f40e3585,5771202a), ULLC(106aa070,32bbd1b8), 637 ULLC(19a4c116,b8d2d0c8), ULLC(1e376c08,5141ab53), 638 ULLC(2748774c,df8eeb99), ULLC(34b0bcb5,e19b48a8), 639 ULLC(391c0cb3,c5c95a63), ULLC(4ed8aa4a,e3418acb), 640 ULLC(5b9cca4f,7763e373), ULLC(682e6ff3,d6b2b8a3), 641 ULLC(748f82ee,5defb2fc), ULLC(78a5636f,43172f60), 642 ULLC(84c87814,a1f0ab72), ULLC(8cc70208,1a6439ec), 643 ULLC(90befffa,23631e28), ULLC(a4506ceb,de82bde9), 644 ULLC(bef9a3f7,b2c67915), ULLC(c67178f2,e372532b), 645 ULLC(ca273ece,ea26619c), ULLC(d186b8c7,21c0c207), 646 ULLC(eada7dd6,cde0eb1e), ULLC(f57d4f7f,ee6ed178), 647 ULLC(06f067aa,72176fba), ULLC(0a637dc5,a2c898a6), 648 ULLC(113f9804,bef90dae), ULLC(1b710b35,131c471b), 649 ULLC(28db77f5,23047d84), ULLC(32caab7b,40c72493), 650 ULLC(3c9ebe0a,15c9bebc), ULLC(431d67c4,9c100d4c), 651 ULLC(4cc5d4be,cb3e42b6), ULLC(597f299c,fc657e2a), 652 ULLC(5fcb6fab,3ad6faec), ULLC(6c44198c,4a475817) 653 #endif 654 }; 655 656 struct SHA512ContextStr { 657 union { 658 PRUint64 w[80]; /* message schedule, input buffer, plus 64 words */ 659 PRUint32 l[160]; 660 PRUint8 b[640]; 661 } u; 662 PRUint64 h[8]; /* 8 state variables */ 663 PRUint64 sizeLo; /* 64-bit count of hashed bytes. */ 664 }; 665 666 /* =========== SHA512 implementation ===================================== */ 667 668 /* SHA-512 initial hash values */ 669 static const PRUint64 H512[8] = { 670 #if PR_BYTES_PER_LONG == 8 671 0x6a09e667f3bcc908UL , 0xbb67ae8584caa73bUL , 672 0x3c6ef372fe94f82bUL , 0xa54ff53a5f1d36f1UL , 673 0x510e527fade682d1UL , 0x9b05688c2b3e6c1fUL , 674 0x1f83d9abfb41bd6bUL , 0x5be0cd19137e2179UL 675 #else 676 ULLC(6a09e667,f3bcc908), ULLC(bb67ae85,84caa73b), 677 ULLC(3c6ef372,fe94f82b), ULLC(a54ff53a,5f1d36f1), 678 ULLC(510e527f,ade682d1), ULLC(9b05688c,2b3e6c1f), 679 ULLC(1f83d9ab,fb41bd6b), ULLC(5be0cd19,137e2179) 680 #endif 681 }; 682 683 684 SHA512Context * 685 SHA512_NewContext(void) 686 { 687 SHA512Context *ctx = PORT_New(SHA512Context); 688 return ctx; 689 } 690 691 void 692 SHA512_DestroyContext(SHA512Context *ctx, PRBool freeit) 693 { 694 if (freeit) { 695 PORT_ZFree(ctx, sizeof *ctx); 696 } 697 } 698 699 void 700 SHA512_Begin(SHA512Context *ctx) 701 { 702 memset(ctx, 0, sizeof *ctx); 703 memcpy(H, H512, sizeof H512); 704 } 705 706 #if defined(SHA512_TRACE) 707 #if defined(HAVE_LONG_LONG) 708 #define DUMP(n,a,d,e,h) printf(" t = %2d, %s = %016lx, %s = %016lx\n", \ 709 n, #e, d, #a, h); 710 #else 711 #define DUMP(n,a,d,e,h) printf(" t = %2d, %s = %08x%08x, %s = %08x%08x\n", \ 712 n, #e, d.hi, d.lo, #a, h.hi, h.lo); 713 #endif 714 #else 715 #define DUMP(n,a,d,e,h) 716 #endif 717 718 #if defined(HAVE_LONG_LONG) 719 720 #define ADDTO(x,y) y += x 721 722 #define INITW(t) W[t] = (s1(W[t-2]) + W[t-7] + s0(W[t-15]) + W[t-16]) 723 724 #define ROUND(n,a,b,c,d,e,f,g,h) \ 725 h += S1(e) + Ch(e,f,g) + K512[n] + W[n]; \ 726 d += h; \ 727 h += S0(a) + Maj(a,b,c); \ 728 DUMP(n,a,d,e,h) 729 730 #else /* use only 32-bit variables, and don't unroll loops */ 731 732 #undef NOUNROLL512 733 #define NOUNROLL512 1 734 735 #define ADDTO(x,y) y.lo += x.lo; y.hi += x.hi + (x.lo > y.lo) 736 737 #define ROTR64a(x,n,lo,hi) (x.lo >> n | x.hi << (32-n)) 738 #define ROTR64A(x,n,lo,hi) (x.lo << (64-n) | x.hi >> (n-32)) 739 #define SHR64a(x,n,lo,hi) (x.lo >> n | x.hi << (32-n)) 740 741 /* Capitol Sigma and lower case sigma functions */ 742 #define s0lo(x) (ROTR64a(x,1,lo,hi) ^ ROTR64a(x,8,lo,hi) ^ SHR64a(x,7,lo,hi)) 743 #define s0hi(x) (ROTR64a(x,1,hi,lo) ^ ROTR64a(x,8,hi,lo) ^ (x.hi >> 7)) 744 745 #define s1lo(x) (ROTR64a(x,19,lo,hi) ^ ROTR64A(x,61,lo,hi) ^ SHR64a(x,6,lo,hi)) 746 #define s1hi(x) (ROTR64a(x,19,hi,lo) ^ ROTR64A(x,61,hi,lo) ^ (x.hi >> 6)) 747 748 #define S0lo(x)(ROTR64a(x,28,lo,hi) ^ ROTR64A(x,34,lo,hi) ^ ROTR64A(x,39,lo,hi)) 749 #define S0hi(x)(ROTR64a(x,28,hi,lo) ^ ROTR64A(x,34,hi,lo) ^ ROTR64A(x,39,hi,lo)) 750 751 #define S1lo(x)(ROTR64a(x,14,lo,hi) ^ ROTR64a(x,18,lo,hi) ^ ROTR64A(x,41,lo,hi)) 752 #define S1hi(x)(ROTR64a(x,14,hi,lo) ^ ROTR64a(x,18,hi,lo) ^ ROTR64A(x,41,hi,lo)) 753 754 /* 32-bit versions of Ch and Maj */ 755 #define Chxx(x,y,z,lo) ((x.lo & y.lo) ^ (~x.lo & z.lo)) 756 #define Majx(x,y,z,lo) ((x.lo & y.lo) ^ (x.lo & z.lo) ^ (y.lo & z.lo)) 757 758 #define INITW(t) \ 759 do { \ 760 PRUint32 lo, tm; \ 761 PRUint32 cy = 0; \ 762 lo = s1lo(W[t-2]); \ 763 lo += (tm = W[t-7].lo); if (lo < tm) cy++; \ 764 lo += (tm = s0lo(W[t-15])); if (lo < tm) cy++; \ 765 lo += (tm = W[t-16].lo); if (lo < tm) cy++; \ 766 W[t].lo = lo; \ 767 W[t].hi = cy + s1hi(W[t-2]) + W[t-7].hi + s0hi(W[t-15]) + W[t-16].hi; \ 768 } while (0) 769 770 #define ROUND(n,a,b,c,d,e,f,g,h) \ 771 { \ 772 PRUint32 lo, tm, cy; \ 773 lo = S1lo(e); \ 774 lo += (tm = Chxx(e,f,g,lo)); cy = (lo < tm); \ 775 lo += (tm = K512[n].lo); if (lo < tm) cy++; \ 776 lo += (tm = W[n].lo); if (lo < tm) cy++; \ 777 h.lo += lo; if (h.lo < lo) cy++; \ 778 h.hi += cy + S1hi(e) + Chxx(e,f,g,hi) + K512[n].hi + W[n].hi; \ 779 d.lo += h.lo; \ 780 d.hi += h.hi + (d.lo < h.lo); \ 781 lo = S0lo(a); \ 782 lo += (tm = Majx(a,b,c,lo)); cy = (lo < tm); \ 783 h.lo += lo; if (h.lo < lo) cy++; \ 784 h.hi += cy + S0hi(a) + Majx(a,b,c,hi); \ 785 DUMP(n,a,d,e,h) \ 786 } 787 #endif 788 789 static void 790 SHA512_Compress(SHA512Context *ctx) 791 { 792 #if defined(IS_LITTLE_ENDIAN) 793 { 794 #if defined(HAVE_LONG_LONG) 795 PRUint64 t1; 796 #else 797 PRUint32 t1; 798 #endif 799 BYTESWAP8(W[0]); 800 BYTESWAP8(W[1]); 801 BYTESWAP8(W[2]); 802 BYTESWAP8(W[3]); 803 BYTESWAP8(W[4]); 804 BYTESWAP8(W[5]); 805 BYTESWAP8(W[6]); 806 BYTESWAP8(W[7]); 807 BYTESWAP8(W[8]); 808 BYTESWAP8(W[9]); 809 BYTESWAP8(W[10]); 810 BYTESWAP8(W[11]); 811 BYTESWAP8(W[12]); 812 BYTESWAP8(W[13]); 813 BYTESWAP8(W[14]); 814 BYTESWAP8(W[15]); 815 } 816 #endif 817 818 { 819 PRUint64 t1, t2; 820 #ifdef NOUNROLL512 821 { 822 /* prepare the "message schedule" */ 823 int t; 824 for (t = 16; t < 80; ++t) { 825 INITW(t); 826 } 827 } 828 #else 829 INITW(16); 830 INITW(17); 831 INITW(18); 832 INITW(19); 833 834 INITW(20); 835 INITW(21); 836 INITW(22); 837 INITW(23); 838 INITW(24); 839 INITW(25); 840 INITW(26); 841 INITW(27); 842 INITW(28); 843 INITW(29); 844 845 INITW(30); 846 INITW(31); 847 INITW(32); 848 INITW(33); 849 INITW(34); 850 INITW(35); 851 INITW(36); 852 INITW(37); 853 INITW(38); 854 INITW(39); 855 856 INITW(40); 857 INITW(41); 858 INITW(42); 859 INITW(43); 860 INITW(44); 861 INITW(45); 862 INITW(46); 863 INITW(47); 864 INITW(48); 865 INITW(49); 866 867 INITW(50); 868 INITW(51); 869 INITW(52); 870 INITW(53); 871 INITW(54); 872 INITW(55); 873 INITW(56); 874 INITW(57); 875 INITW(58); 876 INITW(59); 877 878 INITW(60); 879 INITW(61); 880 INITW(62); 881 INITW(63); 882 INITW(64); 883 INITW(65); 884 INITW(66); 885 INITW(67); 886 INITW(68); 887 INITW(69); 888 889 INITW(70); 890 INITW(71); 891 INITW(72); 892 INITW(73); 893 INITW(74); 894 INITW(75); 895 INITW(76); 896 INITW(77); 897 INITW(78); 898 INITW(79); 899 #endif 900 } 901 #ifdef SHA512_TRACE 902 { 903 int i; 904 for (i = 0; i < 80; ++i) { 905 #ifdef HAVE_LONG_LONG 906 printf("W[%2d] = %016lx\n", i, W[i]); 907 #else 908 printf("W[%2d] = %08x%08x\n", i, W[i].hi, W[i].lo); 909 #endif 910 } 911 } 912 #endif 913 { 914 PRUint64 a, b, c, d, e, f, g, h; 915 916 a = H[0]; 917 b = H[1]; 918 c = H[2]; 919 d = H[3]; 920 e = H[4]; 921 f = H[5]; 922 g = H[6]; 923 h = H[7]; 924 925 #ifdef NOUNROLL512 926 { 927 int t; 928 for (t = 0; t < 80; t+= 8) { 929 ROUND(t+0,a,b,c,d,e,f,g,h) 930 ROUND(t+1,h,a,b,c,d,e,f,g) 931 ROUND(t+2,g,h,a,b,c,d,e,f) 932 ROUND(t+3,f,g,h,a,b,c,d,e) 933 ROUND(t+4,e,f,g,h,a,b,c,d) 934 ROUND(t+5,d,e,f,g,h,a,b,c) 935 ROUND(t+6,c,d,e,f,g,h,a,b) 936 ROUND(t+7,b,c,d,e,f,g,h,a) 937 } 938 } 939 #else 940 ROUND( 0,a,b,c,d,e,f,g,h) 941 ROUND( 1,h,a,b,c,d,e,f,g) 942 ROUND( 2,g,h,a,b,c,d,e,f) 943 ROUND( 3,f,g,h,a,b,c,d,e) 944 ROUND( 4,e,f,g,h,a,b,c,d) 945 ROUND( 5,d,e,f,g,h,a,b,c) 946 ROUND( 6,c,d,e,f,g,h,a,b) 947 ROUND( 7,b,c,d,e,f,g,h,a) 948 949 ROUND( 8,a,b,c,d,e,f,g,h) 950 ROUND( 9,h,a,b,c,d,e,f,g) 951 ROUND(10,g,h,a,b,c,d,e,f) 952 ROUND(11,f,g,h,a,b,c,d,e) 953 ROUND(12,e,f,g,h,a,b,c,d) 954 ROUND(13,d,e,f,g,h,a,b,c) 955 ROUND(14,c,d,e,f,g,h,a,b) 956 ROUND(15,b,c,d,e,f,g,h,a) 957 958 ROUND(16,a,b,c,d,e,f,g,h) 959 ROUND(17,h,a,b,c,d,e,f,g) 960 ROUND(18,g,h,a,b,c,d,e,f) 961 ROUND(19,f,g,h,a,b,c,d,e) 962 ROUND(20,e,f,g,h,a,b,c,d) 963 ROUND(21,d,e,f,g,h,a,b,c) 964 ROUND(22,c,d,e,f,g,h,a,b) 965 ROUND(23,b,c,d,e,f,g,h,a) 966 967 ROUND(24,a,b,c,d,e,f,g,h) 968 ROUND(25,h,a,b,c,d,e,f,g) 969 ROUND(26,g,h,a,b,c,d,e,f) 970 ROUND(27,f,g,h,a,b,c,d,e) 971 ROUND(28,e,f,g,h,a,b,c,d) 972 ROUND(29,d,e,f,g,h,a,b,c) 973 ROUND(30,c,d,e,f,g,h,a,b) 974 ROUND(31,b,c,d,e,f,g,h,a) 975 976 ROUND(32,a,b,c,d,e,f,g,h) 977 ROUND(33,h,a,b,c,d,e,f,g) 978 ROUND(34,g,h,a,b,c,d,e,f) 979 ROUND(35,f,g,h,a,b,c,d,e) 980 ROUND(36,e,f,g,h,a,b,c,d) 981 ROUND(37,d,e,f,g,h,a,b,c) 982 ROUND(38,c,d,e,f,g,h,a,b) 983 ROUND(39,b,c,d,e,f,g,h,a) 984 985 ROUND(40,a,b,c,d,e,f,g,h) 986 ROUND(41,h,a,b,c,d,e,f,g) 987 ROUND(42,g,h,a,b,c,d,e,f) 988 ROUND(43,f,g,h,a,b,c,d,e) 989 ROUND(44,e,f,g,h,a,b,c,d) 990 ROUND(45,d,e,f,g,h,a,b,c) 991 ROUND(46,c,d,e,f,g,h,a,b) 992 ROUND(47,b,c,d,e,f,g,h,a) 993 994 ROUND(48,a,b,c,d,e,f,g,h) 995 ROUND(49,h,a,b,c,d,e,f,g) 996 ROUND(50,g,h,a,b,c,d,e,f) 997 ROUND(51,f,g,h,a,b,c,d,e) 998 ROUND(52,e,f,g,h,a,b,c,d) 999 ROUND(53,d,e,f,g,h,a,b,c) 1000 ROUND(54,c,d,e,f,g,h,a,b) 1001 ROUND(55,b,c,d,e,f,g,h,a) 1002 1003 ROUND(56,a,b,c,d,e,f,g,h) 1004 ROUND(57,h,a,b,c,d,e,f,g) 1005 ROUND(58,g,h,a,b,c,d,e,f) 1006 ROUND(59,f,g,h,a,b,c,d,e) 1007 ROUND(60,e,f,g,h,a,b,c,d) 1008 ROUND(61,d,e,f,g,h,a,b,c) 1009 ROUND(62,c,d,e,f,g,h,a,b) 1010 ROUND(63,b,c,d,e,f,g,h,a) 1011 1012 ROUND(64,a,b,c,d,e,f,g,h) 1013 ROUND(65,h,a,b,c,d,e,f,g) 1014 ROUND(66,g,h,a,b,c,d,e,f) 1015 ROUND(67,f,g,h,a,b,c,d,e) 1016 ROUND(68,e,f,g,h,a,b,c,d) 1017 ROUND(69,d,e,f,g,h,a,b,c) 1018 ROUND(70,c,d,e,f,g,h,a,b) 1019 ROUND(71,b,c,d,e,f,g,h,a) 1020 1021 ROUND(72,a,b,c,d,e,f,g,h) 1022 ROUND(73,h,a,b,c,d,e,f,g) 1023 ROUND(74,g,h,a,b,c,d,e,f) 1024 ROUND(75,f,g,h,a,b,c,d,e) 1025 ROUND(76,e,f,g,h,a,b,c,d) 1026 ROUND(77,d,e,f,g,h,a,b,c) 1027 ROUND(78,c,d,e,f,g,h,a,b) 1028 ROUND(79,b,c,d,e,f,g,h,a) 1029 #endif 1030 1031 ADDTO(a,H[0]); 1032 ADDTO(b,H[1]); 1033 ADDTO(c,H[2]); 1034 ADDTO(d,H[3]); 1035 ADDTO(e,H[4]); 1036 ADDTO(f,H[5]); 1037 ADDTO(g,H[6]); 1038 ADDTO(h,H[7]); 1039 } 1040 } 1041 1042 void 1043 SHA512_Update(SHA512Context *ctx, const unsigned char *input, 1044 unsigned int inputLen) 1045 { 1046 unsigned int inBuf; 1047 if (!inputLen) 1048 return; 1049 1050 #if defined(HAVE_LONG_LONG) 1051 inBuf = (unsigned int)ctx->sizeLo & 0x7f; 1052 /* Add inputLen into the count of bytes processed, before processing */ 1053 ctx->sizeLo += inputLen; 1054 #else 1055 inBuf = (unsigned int)ctx->sizeLo.lo & 0x7f; 1056 ctx->sizeLo.lo += inputLen; 1057 if (ctx->sizeLo.lo < inputLen) ctx->sizeLo.hi++; 1058 #endif 1059 1060 /* if data already in buffer, attemp to fill rest of buffer */ 1061 if (inBuf) { 1062 unsigned int todo = SHA512_BLOCK_LENGTH - inBuf; 1063 if (inputLen < todo) 1064 todo = inputLen; 1065 memcpy(B + inBuf, input, todo); 1066 input += todo; 1067 inputLen -= todo; 1068 if (inBuf + todo == SHA512_BLOCK_LENGTH) 1069 SHA512_Compress(ctx); 1070 } 1071 1072 /* if enough data to fill one or more whole buffers, process them. */ 1073 while (inputLen >= SHA512_BLOCK_LENGTH) { 1074 memcpy(B, input, SHA512_BLOCK_LENGTH); 1075 input += SHA512_BLOCK_LENGTH; 1076 inputLen -= SHA512_BLOCK_LENGTH; 1077 SHA512_Compress(ctx); 1078 } 1079 /* if data left over, fill it into buffer */ 1080 if (inputLen) 1081 memcpy(B, input, inputLen); 1082 } 1083 1084 void 1085 SHA512_End(SHA512Context *ctx, unsigned char *digest, 1086 unsigned int *digestLen, unsigned int maxDigestLen) 1087 { 1088 #if defined(HAVE_LONG_LONG) 1089 unsigned int inBuf = (unsigned int)ctx->sizeLo & 0x7f; 1090 unsigned int padLen = (inBuf < 112) ? (112 - inBuf) : (112 + 128 - inBuf); 1091 PRUint64 lo, t1; 1092 lo = (ctx->sizeLo << 3); 1093 #else 1094 unsigned int inBuf = (unsigned int)ctx->sizeLo.lo & 0x7f; 1095 unsigned int padLen = (inBuf < 112) ? (112 - inBuf) : (112 + 128 - inBuf); 1096 PRUint64 lo = ctx->sizeLo; 1097 PRUint32 t1; 1098 lo.lo <<= 3; 1099 #endif 1100 1101 SHA512_Update(ctx, pad, padLen); 1102 1103 #if defined(HAVE_LONG_LONG) 1104 W[14] = 0; 1105 #else 1106 W[14].lo = 0; 1107 W[14].hi = 0; 1108 #endif 1109 1110 W[15] = lo; 1111 #if defined(IS_LITTLE_ENDIAN) 1112 BYTESWAP8(W[15]); 1113 #endif 1114 SHA512_Compress(ctx); 1115 1116 /* now output the answer */ 1117 #if defined(IS_LITTLE_ENDIAN) 1118 BYTESWAP8(H[0]); 1119 BYTESWAP8(H[1]); 1120 BYTESWAP8(H[2]); 1121 BYTESWAP8(H[3]); 1122 BYTESWAP8(H[4]); 1123 BYTESWAP8(H[5]); 1124 BYTESWAP8(H[6]); 1125 BYTESWAP8(H[7]); 1126 #endif 1127 padLen = PR_MIN(SHA512_LENGTH, maxDigestLen); 1128 memcpy(digest, H, padLen); 1129 if (digestLen) 1130 *digestLen = padLen; 1131 } 1132 1133 SECStatus 1134 SHA512_HashBuf(unsigned char *dest, const unsigned char *src, 1135 unsigned int src_length) 1136 { 1137 SHA512Context ctx; 1138 unsigned int outLen; 1139 1140 SHA512_Begin(&ctx); 1141 SHA512_Update(&ctx, src, src_length); 1142 SHA512_End(&ctx, dest, &outLen, SHA512_LENGTH); 1143 1144 return SECSuccess; 1145 } 1146 1147 1148 SECStatus 1149 SHA512_Hash(unsigned char *dest, const char *src) 1150 { 1151 return SHA512_HashBuf(dest, (const unsigned char *)src, PORT_Strlen(src)); 1152 } 1153 1154 1155 void SHA512_TraceState(SHA512Context *ctx) { } 1156 1157 unsigned int 1158 SHA512_FlattenSize(SHA512Context *ctx) 1159 { 1160 return sizeof *ctx; 1161 } 1162 1163 SECStatus 1164 SHA512_Flatten(SHA512Context *ctx,unsigned char *space) 1165 { 1166 PORT_Memcpy(space, ctx, sizeof *ctx); 1167 return SECSuccess; 1168 } 1169 1170 SHA512Context * 1171 SHA512_Resurrect(unsigned char *space, void *arg) 1172 { 1173 SHA512Context *ctx = SHA512_NewContext(); 1174 if (ctx) 1175 PORT_Memcpy(ctx, space, sizeof *ctx); 1176 return ctx; 1177 } 1178 1179 void SHA512_Clone(SHA512Context *dest, SHA512Context *src) 1180 { 1181 memcpy(dest, src, sizeof *dest); 1182 } 1183 1184 /* ======================================================================= */ 1185 /* SHA384 uses a SHA512Context as the real context. 1186 ** The only differences between SHA384 an SHA512 are: 1187 ** a) the intialization values for the context, and 1188 ** b) the number of bytes of data produced as output. 1189 */ 1190 1191 /* SHA-384 initial hash values */ 1192 static const PRUint64 H384[8] = { 1193 #if PR_BYTES_PER_LONG == 8 1194 0xcbbb9d5dc1059ed8UL , 0x629a292a367cd507UL , 1195 0x9159015a3070dd17UL , 0x152fecd8f70e5939UL , 1196 0x67332667ffc00b31UL , 0x8eb44a8768581511UL , 1197 0xdb0c2e0d64f98fa7UL , 0x47b5481dbefa4fa4UL 1198 #else 1199 ULLC(cbbb9d5d,c1059ed8), ULLC(629a292a,367cd507), 1200 ULLC(9159015a,3070dd17), ULLC(152fecd8,f70e5939), 1201 ULLC(67332667,ffc00b31), ULLC(8eb44a87,68581511), 1202 ULLC(db0c2e0d,64f98fa7), ULLC(47b5481d,befa4fa4) 1203 #endif 1204 }; 1205 1206 SHA384Context * 1207 SHA384_NewContext(void) 1208 { 1209 return SHA512_NewContext(); 1210 } 1211 1212 void 1213 SHA384_DestroyContext(SHA384Context *ctx, PRBool freeit) 1214 { 1215 SHA512_DestroyContext(ctx, freeit); 1216 } 1217 1218 void 1219 SHA384_Begin(SHA384Context *ctx) 1220 { 1221 memset(ctx, 0, sizeof *ctx); 1222 memcpy(H, H384, sizeof H384); 1223 } 1224 1225 void 1226 SHA384_Update(SHA384Context *ctx, const unsigned char *input, 1227 unsigned int inputLen) 1228 { 1229 SHA512_Update(ctx, input, inputLen); 1230 } 1231 1232 void 1233 SHA384_End(SHA384Context *ctx, unsigned char *digest, 1234 unsigned int *digestLen, unsigned int maxDigestLen) 1235 { 1236 #define SHA_MIN(a,b) (a < b ? a : b) 1237 unsigned int maxLen = SHA_MIN(maxDigestLen, SHA384_LENGTH); 1238 SHA512_End(ctx, digest, digestLen, maxLen); 1239 } 1240 1241 SECStatus 1242 SHA384_HashBuf(unsigned char *dest, const unsigned char *src, 1243 unsigned int src_length) 1244 { 1245 SHA512Context ctx; 1246 unsigned int outLen; 1247 1248 SHA384_Begin(&ctx); 1249 SHA512_Update(&ctx, src, src_length); 1250 SHA512_End(&ctx, dest, &outLen, SHA384_LENGTH); 1251 1252 return SECSuccess; 1253 } 1254 1255 SECStatus 1256 SHA384_Hash(unsigned char *dest, const char *src) 1257 { 1258 return SHA384_HashBuf(dest, (const unsigned char *)src, PORT_Strlen(src)); 1259 } 1260 1261 void SHA384_TraceState(SHA384Context *ctx) { } 1262 1263 unsigned int 1264 SHA384_FlattenSize(SHA384Context *ctx) 1265 { 1266 return sizeof(SHA384Context); 1267 } 1268 1269 SECStatus 1270 SHA384_Flatten(SHA384Context *ctx,unsigned char *space) 1271 { 1272 return SHA512_Flatten(ctx, space); 1273 } 1274 1275 SHA384Context * 1276 SHA384_Resurrect(unsigned char *space, void *arg) 1277 { 1278 return SHA512_Resurrect(space, arg); 1279 } 1280 1281 void SHA384_Clone(SHA384Context *dest, SHA384Context *src) 1282 { 1283 memcpy(dest, src, sizeof *dest); 1284 } 1285 #endif /* Comment out unused code. */ 1286 1287 /* ======================================================================= */ 1288 #ifdef SELFTEST 1289 #include <stdio.h> 1290 1291 static const char abc[] = { "abc" }; 1292 static const char abcdbc[] = { 1293 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" 1294 }; 1295 static const char abcdef[] = { 1296 "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn" 1297 "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" 1298 }; 1299 1300 void 1301 dumpHash32(const unsigned char *buf, unsigned int bufLen) 1302 { 1303 unsigned int i; 1304 for (i = 0; i < bufLen; i += 4) { 1305 printf(" %02x%02x%02x%02x", buf[i], buf[i+1], buf[i+2], buf[i+3]); 1306 } 1307 printf("\n"); 1308 } 1309 1310 void test256(void) 1311 { 1312 unsigned char outBuf[SHA256_LENGTH]; 1313 1314 printf("SHA256, input = %s\n", abc); 1315 SHA256_Hash(outBuf, abc); 1316 dumpHash32(outBuf, sizeof outBuf); 1317 1318 printf("SHA256, input = %s\n", abcdbc); 1319 SHA256_Hash(outBuf, abcdbc); 1320 dumpHash32(outBuf, sizeof outBuf); 1321 } 1322 1323 void 1324 dumpHash64(const unsigned char *buf, unsigned int bufLen) 1325 { 1326 unsigned int i; 1327 for (i = 0; i < bufLen; i += 8) { 1328 if (i % 32 == 0) 1329 printf("\n"); 1330 printf(" %02x%02x%02x%02x%02x%02x%02x%02x", 1331 buf[i ], buf[i+1], buf[i+2], buf[i+3], 1332 buf[i+4], buf[i+5], buf[i+6], buf[i+7]); 1333 } 1334 printf("\n"); 1335 } 1336 1337 void test512(void) 1338 { 1339 unsigned char outBuf[SHA512_LENGTH]; 1340 1341 printf("SHA512, input = %s\n", abc); 1342 SHA512_Hash(outBuf, abc); 1343 dumpHash64(outBuf, sizeof outBuf); 1344 1345 printf("SHA512, input = %s\n", abcdef); 1346 SHA512_Hash(outBuf, abcdef); 1347 dumpHash64(outBuf, sizeof outBuf); 1348 } 1349 1350 void time512(void) 1351 { 1352 unsigned char outBuf[SHA512_LENGTH]; 1353 1354 SHA512_Hash(outBuf, abc); 1355 SHA512_Hash(outBuf, abcdef); 1356 } 1357 1358 void test384(void) 1359 { 1360 unsigned char outBuf[SHA384_LENGTH]; 1361 1362 printf("SHA384, input = %s\n", abc); 1363 SHA384_Hash(outBuf, abc); 1364 dumpHash64(outBuf, sizeof outBuf); 1365 1366 printf("SHA384, input = %s\n", abcdef); 1367 SHA384_Hash(outBuf, abcdef); 1368 dumpHash64(outBuf, sizeof outBuf); 1369 } 1370 1371 int main (int argc, char *argv[], char *envp[]) 1372 { 1373 int i = 1; 1374 if (argc > 1) { 1375 i = atoi(argv[1]); 1376 } 1377 if (i < 2) { 1378 test256(); 1379 test512(); 1380 test384(); 1381 } else { 1382 while (i-- > 0) { 1383 time512(); 1384 } 1385 printf("done\n"); 1386 } 1387 return 0; 1388 } 1389 1390 #endif 1391