1 /* crypto/sha/sha512.c */ 2 /* ==================================================================== 3 * Copyright (c) 2004 The OpenSSL Project. All rights reserved 4 * according to the OpenSSL license [found in ../../LICENSE]. 5 * ==================================================================== 6 */ 7 #include <openssl/opensslconf.h> 8 #if !defined(OPENSSL_NO_SHA) && !defined(OPENSSL_NO_SHA512) 9 /* 10 * IMPLEMENTATION NOTES. 11 * 12 * As you might have noticed 32-bit hash algorithms: 13 * 14 * - permit SHA_LONG to be wider than 32-bit (case on CRAY); 15 * - optimized versions implement two transform functions: one operating 16 * on [aligned] data in host byte order and one - on data in input 17 * stream byte order; 18 * - share common byte-order neutral collector and padding function 19 * implementations, ../md32_common.h; 20 * 21 * Neither of the above applies to this SHA-512 implementations. Reasons 22 * [in reverse order] are: 23 * 24 * - it's the only 64-bit hash algorithm for the moment of this writing, 25 * there is no need for common collector/padding implementation [yet]; 26 * - by supporting only one transform function [which operates on 27 * *aligned* data in input stream byte order, big-endian in this case] 28 * we minimize burden of maintenance in two ways: a) collector/padding 29 * function is simpler; b) only one transform function to stare at; 30 * - SHA_LONG64 is required to be exactly 64-bit in order to be able to 31 * apply a number of optimizations to mitigate potential performance 32 * penalties caused by previous design decision; 33 * 34 * Caveat lector. 35 * 36 * Implementation relies on the fact that "long long" is 64-bit on 37 * both 32- and 64-bit platforms. If some compiler vendor comes up 38 * with 128-bit long long, adjustment to sha.h would be required. 39 * As this implementation relies on 64-bit integer type, it's totally 40 * inappropriate for platforms which don't support it, most notably 41 * 16-bit platforms. 42 * <appro (at) fy.chalmers.se> 43 */ 44 #include <stdlib.h> 45 #include <string.h> 46 47 #include <openssl/crypto.h> 48 #include <openssl/sha.h> 49 #include <openssl/opensslv.h> 50 51 #include "cryptlib.h" 52 53 const char SHA512_version[]="SHA-512" OPENSSL_VERSION_PTEXT; 54 55 #if defined(__i386) || defined(__i386__) || defined(_M_IX86) || \ 56 defined(__x86_64) || defined(_M_AMD64) || defined(_M_X64) || \ 57 defined(__s390__) || defined(__s390x__) || \ 58 defined(SHA512_ASM) 59 #define SHA512_BLOCK_CAN_MANAGE_UNALIGNED_DATA 60 #endif 61 62 int SHA384_Init (SHA512_CTX *c) 63 { 64 #if defined(SHA512_ASM) && (defined(__arm__) || defined(__arm)) 65 /* maintain dword order required by assembler module */ 66 unsigned int *h = (unsigned int *)c->h; 67 68 h[0] = 0xcbbb9d5d; h[1] = 0xc1059ed8; 69 h[2] = 0x629a292a; h[3] = 0x367cd507; 70 h[4] = 0x9159015a; h[5] = 0x3070dd17; 71 h[6] = 0x152fecd8; h[7] = 0xf70e5939; 72 h[8] = 0x67332667; h[9] = 0xffc00b31; 73 h[10] = 0x8eb44a87; h[11] = 0x68581511; 74 h[12] = 0xdb0c2e0d; h[13] = 0x64f98fa7; 75 h[14] = 0x47b5481d; h[15] = 0xbefa4fa4; 76 #else 77 c->h[0]=U64(0xcbbb9d5dc1059ed8); 78 c->h[1]=U64(0x629a292a367cd507); 79 c->h[2]=U64(0x9159015a3070dd17); 80 c->h[3]=U64(0x152fecd8f70e5939); 81 c->h[4]=U64(0x67332667ffc00b31); 82 c->h[5]=U64(0x8eb44a8768581511); 83 c->h[6]=U64(0xdb0c2e0d64f98fa7); 84 c->h[7]=U64(0x47b5481dbefa4fa4); 85 #endif 86 c->Nl=0; c->Nh=0; 87 c->num=0; c->md_len=SHA384_DIGEST_LENGTH; 88 return 1; 89 } 90 91 int SHA512_Init (SHA512_CTX *c) 92 { 93 #if defined(SHA512_ASM) && (defined(__arm__) || defined(__arm)) 94 /* maintain dword order required by assembler module */ 95 unsigned int *h = (unsigned int *)c->h; 96 97 h[0] = 0x6a09e667; h[1] = 0xf3bcc908; 98 h[2] = 0xbb67ae85; h[3] = 0x84caa73b; 99 h[4] = 0x3c6ef372; h[5] = 0xfe94f82b; 100 h[6] = 0xa54ff53a; h[7] = 0x5f1d36f1; 101 h[8] = 0x510e527f; h[9] = 0xade682d1; 102 h[10] = 0x9b05688c; h[11] = 0x2b3e6c1f; 103 h[12] = 0x1f83d9ab; h[13] = 0xfb41bd6b; 104 h[14] = 0x5be0cd19; h[15] = 0x137e2179; 105 #else 106 c->h[0]=U64(0x6a09e667f3bcc908); 107 c->h[1]=U64(0xbb67ae8584caa73b); 108 c->h[2]=U64(0x3c6ef372fe94f82b); 109 c->h[3]=U64(0xa54ff53a5f1d36f1); 110 c->h[4]=U64(0x510e527fade682d1); 111 c->h[5]=U64(0x9b05688c2b3e6c1f); 112 c->h[6]=U64(0x1f83d9abfb41bd6b); 113 c->h[7]=U64(0x5be0cd19137e2179); 114 #endif 115 c->Nl=0; c->Nh=0; 116 c->num=0; c->md_len=SHA512_DIGEST_LENGTH; 117 return 1; 118 } 119 120 #ifndef SHA512_ASM 121 static 122 #endif 123 void sha512_block_data_order (SHA512_CTX *ctx, const void *in, size_t num); 124 125 int SHA512_Final (unsigned char *md, SHA512_CTX *c) 126 { 127 unsigned char *p=(unsigned char *)c->u.p; 128 size_t n=c->num; 129 130 p[n]=0x80; /* There always is a room for one */ 131 n++; 132 if (n > (sizeof(c->u)-16)) 133 memset (p+n,0,sizeof(c->u)-n), n=0, 134 sha512_block_data_order (c,p,1); 135 136 memset (p+n,0,sizeof(c->u)-16-n); 137 #ifdef B_ENDIAN 138 c->u.d[SHA_LBLOCK-2] = c->Nh; 139 c->u.d[SHA_LBLOCK-1] = c->Nl; 140 #else 141 p[sizeof(c->u)-1] = (unsigned char)(c->Nl); 142 p[sizeof(c->u)-2] = (unsigned char)(c->Nl>>8); 143 p[sizeof(c->u)-3] = (unsigned char)(c->Nl>>16); 144 p[sizeof(c->u)-4] = (unsigned char)(c->Nl>>24); 145 p[sizeof(c->u)-5] = (unsigned char)(c->Nl>>32); 146 p[sizeof(c->u)-6] = (unsigned char)(c->Nl>>40); 147 p[sizeof(c->u)-7] = (unsigned char)(c->Nl>>48); 148 p[sizeof(c->u)-8] = (unsigned char)(c->Nl>>56); 149 p[sizeof(c->u)-9] = (unsigned char)(c->Nh); 150 p[sizeof(c->u)-10] = (unsigned char)(c->Nh>>8); 151 p[sizeof(c->u)-11] = (unsigned char)(c->Nh>>16); 152 p[sizeof(c->u)-12] = (unsigned char)(c->Nh>>24); 153 p[sizeof(c->u)-13] = (unsigned char)(c->Nh>>32); 154 p[sizeof(c->u)-14] = (unsigned char)(c->Nh>>40); 155 p[sizeof(c->u)-15] = (unsigned char)(c->Nh>>48); 156 p[sizeof(c->u)-16] = (unsigned char)(c->Nh>>56); 157 #endif 158 159 sha512_block_data_order (c,p,1); 160 161 if (md==0) return 0; 162 163 #if defined(SHA512_ASM) && (defined(__arm__) || defined(__arm)) 164 /* recall assembler dword order... */ 165 n = c->md_len; 166 if (n == SHA384_DIGEST_LENGTH || n == SHA512_DIGEST_LENGTH) 167 { 168 unsigned int *h = (unsigned int *)c->h, t; 169 170 for (n/=4;n;n--) 171 { 172 t = *(h++); 173 *(md++) = (unsigned char)(t>>24); 174 *(md++) = (unsigned char)(t>>16); 175 *(md++) = (unsigned char)(t>>8); 176 *(md++) = (unsigned char)(t); 177 } 178 } 179 else return 0; 180 #else 181 switch (c->md_len) 182 { 183 /* Let compiler decide if it's appropriate to unroll... */ 184 case SHA384_DIGEST_LENGTH: 185 for (n=0;n<SHA384_DIGEST_LENGTH/8;n++) 186 { 187 SHA_LONG64 t = c->h[n]; 188 189 *(md++) = (unsigned char)(t>>56); 190 *(md++) = (unsigned char)(t>>48); 191 *(md++) = (unsigned char)(t>>40); 192 *(md++) = (unsigned char)(t>>32); 193 *(md++) = (unsigned char)(t>>24); 194 *(md++) = (unsigned char)(t>>16); 195 *(md++) = (unsigned char)(t>>8); 196 *(md++) = (unsigned char)(t); 197 } 198 break; 199 case SHA512_DIGEST_LENGTH: 200 for (n=0;n<SHA512_DIGEST_LENGTH/8;n++) 201 { 202 SHA_LONG64 t = c->h[n]; 203 204 *(md++) = (unsigned char)(t>>56); 205 *(md++) = (unsigned char)(t>>48); 206 *(md++) = (unsigned char)(t>>40); 207 *(md++) = (unsigned char)(t>>32); 208 *(md++) = (unsigned char)(t>>24); 209 *(md++) = (unsigned char)(t>>16); 210 *(md++) = (unsigned char)(t>>8); 211 *(md++) = (unsigned char)(t); 212 } 213 break; 214 /* ... as well as make sure md_len is not abused. */ 215 default: return 0; 216 } 217 #endif 218 return 1; 219 } 220 221 int SHA384_Final (unsigned char *md,SHA512_CTX *c) 222 { return SHA512_Final (md,c); } 223 224 int SHA512_Update (SHA512_CTX *c, const void *_data, size_t len) 225 { 226 SHA_LONG64 l; 227 unsigned char *p=c->u.p; 228 const unsigned char *data=(const unsigned char *)_data; 229 230 if (len==0) return 1; 231 232 l = (c->Nl+(((SHA_LONG64)len)<<3))&U64(0xffffffffffffffff); 233 if (l < c->Nl) c->Nh++; 234 if (sizeof(len)>=8) c->Nh+=(((SHA_LONG64)len)>>61); 235 c->Nl=l; 236 237 if (c->num != 0) 238 { 239 size_t n = sizeof(c->u) - c->num; 240 241 if (len < n) 242 { 243 memcpy (p+c->num,data,len), c->num += (unsigned int)len; 244 return 1; 245 } 246 else { 247 memcpy (p+c->num,data,n), c->num = 0; 248 len-=n, data+=n; 249 sha512_block_data_order (c,p,1); 250 } 251 } 252 253 if (len >= sizeof(c->u)) 254 { 255 #ifndef SHA512_BLOCK_CAN_MANAGE_UNALIGNED_DATA 256 if ((size_t)data%sizeof(c->u.d[0]) != 0) 257 while (len >= sizeof(c->u)) 258 memcpy (p,data,sizeof(c->u)), 259 sha512_block_data_order (c,p,1), 260 len -= sizeof(c->u), 261 data += sizeof(c->u); 262 else 263 #endif 264 sha512_block_data_order (c,data,len/sizeof(c->u)), 265 data += len, 266 len %= sizeof(c->u), 267 data -= len; 268 } 269 270 if (len != 0) memcpy (p,data,len), c->num = (int)len; 271 272 return 1; 273 } 274 275 int SHA384_Update (SHA512_CTX *c, const void *data, size_t len) 276 { return SHA512_Update (c,data,len); } 277 278 void SHA512_Transform (SHA512_CTX *c, const unsigned char *data) 279 { sha512_block_data_order (c,data,1); } 280 281 unsigned char *SHA384(const unsigned char *d, size_t n, unsigned char *md) 282 { 283 SHA512_CTX c; 284 static unsigned char m[SHA384_DIGEST_LENGTH]; 285 286 if (md == NULL) md=m; 287 SHA384_Init(&c); 288 SHA512_Update(&c,d,n); 289 SHA512_Final(md,&c); 290 OPENSSL_cleanse(&c,sizeof(c)); 291 return(md); 292 } 293 294 unsigned char *SHA512(const unsigned char *d, size_t n, unsigned char *md) 295 { 296 SHA512_CTX c; 297 static unsigned char m[SHA512_DIGEST_LENGTH]; 298 299 if (md == NULL) md=m; 300 SHA512_Init(&c); 301 SHA512_Update(&c,d,n); 302 SHA512_Final(md,&c); 303 OPENSSL_cleanse(&c,sizeof(c)); 304 return(md); 305 } 306 307 #ifndef SHA512_ASM 308 static const SHA_LONG64 K512[80] = { 309 U64(0x428a2f98d728ae22),U64(0x7137449123ef65cd), 310 U64(0xb5c0fbcfec4d3b2f),U64(0xe9b5dba58189dbbc), 311 U64(0x3956c25bf348b538),U64(0x59f111f1b605d019), 312 U64(0x923f82a4af194f9b),U64(0xab1c5ed5da6d8118), 313 U64(0xd807aa98a3030242),U64(0x12835b0145706fbe), 314 U64(0x243185be4ee4b28c),U64(0x550c7dc3d5ffb4e2), 315 U64(0x72be5d74f27b896f),U64(0x80deb1fe3b1696b1), 316 U64(0x9bdc06a725c71235),U64(0xc19bf174cf692694), 317 U64(0xe49b69c19ef14ad2),U64(0xefbe4786384f25e3), 318 U64(0x0fc19dc68b8cd5b5),U64(0x240ca1cc77ac9c65), 319 U64(0x2de92c6f592b0275),U64(0x4a7484aa6ea6e483), 320 U64(0x5cb0a9dcbd41fbd4),U64(0x76f988da831153b5), 321 U64(0x983e5152ee66dfab),U64(0xa831c66d2db43210), 322 U64(0xb00327c898fb213f),U64(0xbf597fc7beef0ee4), 323 U64(0xc6e00bf33da88fc2),U64(0xd5a79147930aa725), 324 U64(0x06ca6351e003826f),U64(0x142929670a0e6e70), 325 U64(0x27b70a8546d22ffc),U64(0x2e1b21385c26c926), 326 U64(0x4d2c6dfc5ac42aed),U64(0x53380d139d95b3df), 327 U64(0x650a73548baf63de),U64(0x766a0abb3c77b2a8), 328 U64(0x81c2c92e47edaee6),U64(0x92722c851482353b), 329 U64(0xa2bfe8a14cf10364),U64(0xa81a664bbc423001), 330 U64(0xc24b8b70d0f89791),U64(0xc76c51a30654be30), 331 U64(0xd192e819d6ef5218),U64(0xd69906245565a910), 332 U64(0xf40e35855771202a),U64(0x106aa07032bbd1b8), 333 U64(0x19a4c116b8d2d0c8),U64(0x1e376c085141ab53), 334 U64(0x2748774cdf8eeb99),U64(0x34b0bcb5e19b48a8), 335 U64(0x391c0cb3c5c95a63),U64(0x4ed8aa4ae3418acb), 336 U64(0x5b9cca4f7763e373),U64(0x682e6ff3d6b2b8a3), 337 U64(0x748f82ee5defb2fc),U64(0x78a5636f43172f60), 338 U64(0x84c87814a1f0ab72),U64(0x8cc702081a6439ec), 339 U64(0x90befffa23631e28),U64(0xa4506cebde82bde9), 340 U64(0xbef9a3f7b2c67915),U64(0xc67178f2e372532b), 341 U64(0xca273eceea26619c),U64(0xd186b8c721c0c207), 342 U64(0xeada7dd6cde0eb1e),U64(0xf57d4f7fee6ed178), 343 U64(0x06f067aa72176fba),U64(0x0a637dc5a2c898a6), 344 U64(0x113f9804bef90dae),U64(0x1b710b35131c471b), 345 U64(0x28db77f523047d84),U64(0x32caab7b40c72493), 346 U64(0x3c9ebe0a15c9bebc),U64(0x431d67c49c100d4c), 347 U64(0x4cc5d4becb3e42b6),U64(0x597f299cfc657e2a), 348 U64(0x5fcb6fab3ad6faec),U64(0x6c44198c4a475817) }; 349 350 #ifndef PEDANTIC 351 # if defined(__GNUC__) && __GNUC__>=2 && !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_NO_INLINE_ASM) 352 # if defined(__x86_64) || defined(__x86_64__) 353 # define ROTR(a,n) ({ SHA_LONG64 ret; \ 354 asm ("rorq %1,%0" \ 355 : "=r"(ret) \ 356 : "J"(n),"0"(a) \ 357 : "cc"); ret; }) 358 # if !defined(B_ENDIAN) 359 # define PULL64(x) ({ SHA_LONG64 ret=*((const SHA_LONG64 *)(&(x))); \ 360 asm ("bswapq %0" \ 361 : "=r"(ret) \ 362 : "0"(ret)); ret; }) 363 # endif 364 # elif (defined(__i386) || defined(__i386__)) && !defined(B_ENDIAN) 365 # if defined(I386_ONLY) 366 # define PULL64(x) ({ const unsigned int *p=(const unsigned int *)(&(x));\ 367 unsigned int hi=p[0],lo=p[1]; \ 368 asm("xchgb %%ah,%%al;xchgb %%dh,%%dl;"\ 369 "roll $16,%%eax; roll $16,%%edx; "\ 370 "xchgb %%ah,%%al;xchgb %%dh,%%dl;" \ 371 : "=a"(lo),"=d"(hi) \ 372 : "0"(lo),"1"(hi) : "cc"); \ 373 ((SHA_LONG64)hi)<<32|lo; }) 374 # else 375 # define PULL64(x) ({ const unsigned int *p=(const unsigned int *)(&(x));\ 376 unsigned int hi=p[0],lo=p[1]; \ 377 asm ("bswapl %0; bswapl %1;" \ 378 : "=r"(lo),"=r"(hi) \ 379 : "0"(lo),"1"(hi)); \ 380 ((SHA_LONG64)hi)<<32|lo; }) 381 # endif 382 # elif (defined(_ARCH_PPC) && defined(__64BIT__)) || defined(_ARCH_PPC64) 383 # define ROTR(a,n) ({ SHA_LONG64 ret; \ 384 asm ("rotrdi %0,%1,%2" \ 385 : "=r"(ret) \ 386 : "r"(a),"K"(n)); ret; }) 387 # endif 388 # elif defined(_MSC_VER) 389 # if defined(_WIN64) /* applies to both IA-64 and AMD64 */ 390 # pragma intrinsic(_rotr64) 391 # define ROTR(a,n) _rotr64((a),n) 392 # endif 393 # if defined(_M_IX86) && !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_NO_INLINE_ASM) 394 # if defined(I386_ONLY) 395 static SHA_LONG64 __fastcall __pull64be(const void *x) 396 { _asm mov edx, [ecx + 0] 397 _asm mov eax, [ecx + 4] 398 _asm xchg dh,dl 399 _asm xchg ah,al 400 _asm rol edx,16 401 _asm rol eax,16 402 _asm xchg dh,dl 403 _asm xchg ah,al 404 } 405 # else 406 static SHA_LONG64 __fastcall __pull64be(const void *x) 407 { _asm mov edx, [ecx + 0] 408 _asm mov eax, [ecx + 4] 409 _asm bswap edx 410 _asm bswap eax 411 } 412 # endif 413 # define PULL64(x) __pull64be(&(x)) 414 # if _MSC_VER<=1200 415 # pragma inline_depth(0) 416 # endif 417 # endif 418 # endif 419 #endif 420 421 #ifndef PULL64 422 #define B(x,j) (((SHA_LONG64)(*(((const unsigned char *)(&x))+j)))<<((7-j)*8)) 423 #define PULL64(x) (B(x,0)|B(x,1)|B(x,2)|B(x,3)|B(x,4)|B(x,5)|B(x,6)|B(x,7)) 424 #endif 425 426 #ifndef ROTR 427 #define ROTR(x,s) (((x)>>s) | (x)<<(64-s)) 428 #endif 429 430 #define Sigma0(x) (ROTR((x),28) ^ ROTR((x),34) ^ ROTR((x),39)) 431 #define Sigma1(x) (ROTR((x),14) ^ ROTR((x),18) ^ ROTR((x),41)) 432 #define sigma0(x) (ROTR((x),1) ^ ROTR((x),8) ^ ((x)>>7)) 433 #define sigma1(x) (ROTR((x),19) ^ ROTR((x),61) ^ ((x)>>6)) 434 435 #define Ch(x,y,z) (((x) & (y)) ^ ((~(x)) & (z))) 436 #define Maj(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z))) 437 438 439 #if defined(__i386) || defined(__i386__) || defined(_M_IX86) 440 /* 441 * This code should give better results on 32-bit CPU with less than 442 * ~24 registers, both size and performance wise... 443 */ 444 static void sha512_block_data_order (SHA512_CTX *ctx, const void *in, size_t num) 445 { 446 const SHA_LONG64 *W=in; 447 SHA_LONG64 A,E,T; 448 SHA_LONG64 X[9+80],*F; 449 int i; 450 451 while (num--) { 452 453 F = X+80; 454 A = ctx->h[0]; F[1] = ctx->h[1]; 455 F[2] = ctx->h[2]; F[3] = ctx->h[3]; 456 E = ctx->h[4]; F[5] = ctx->h[5]; 457 F[6] = ctx->h[6]; F[7] = ctx->h[7]; 458 459 for (i=0;i<16;i++,F--) 460 { 461 #ifdef B_ENDIAN 462 T = W[i]; 463 #else 464 T = PULL64(W[i]); 465 #endif 466 F[0] = A; 467 F[4] = E; 468 F[8] = T; 469 T += F[7] + Sigma1(E) + Ch(E,F[5],F[6]) + K512[i]; 470 E = F[3] + T; 471 A = T + Sigma0(A) + Maj(A,F[1],F[2]); 472 } 473 474 for (;i<80;i++,F--) 475 { 476 T = sigma0(F[8+16-1]); 477 T += sigma1(F[8+16-14]); 478 T += F[8+16] + F[8+16-9]; 479 480 F[0] = A; 481 F[4] = E; 482 F[8] = T; 483 T += F[7] + Sigma1(E) + Ch(E,F[5],F[6]) + K512[i]; 484 E = F[3] + T; 485 A = T + Sigma0(A) + Maj(A,F[1],F[2]); 486 } 487 488 ctx->h[0] += A; ctx->h[1] += F[1]; 489 ctx->h[2] += F[2]; ctx->h[3] += F[3]; 490 ctx->h[4] += E; ctx->h[5] += F[5]; 491 ctx->h[6] += F[6]; ctx->h[7] += F[7]; 492 493 W+=SHA_LBLOCK; 494 } 495 } 496 497 #elif defined(OPENSSL_SMALL_FOOTPRINT) 498 499 static void sha512_block_data_order (SHA512_CTX *ctx, const void *in, size_t num) 500 { 501 const SHA_LONG64 *W=in; 502 SHA_LONG64 a,b,c,d,e,f,g,h,s0,s1,T1,T2; 503 SHA_LONG64 X[16]; 504 int i; 505 506 while (num--) { 507 508 a = ctx->h[0]; b = ctx->h[1]; c = ctx->h[2]; d = ctx->h[3]; 509 e = ctx->h[4]; f = ctx->h[5]; g = ctx->h[6]; h = ctx->h[7]; 510 511 for (i=0;i<16;i++) 512 { 513 #ifdef B_ENDIAN 514 T1 = X[i] = W[i]; 515 #else 516 T1 = X[i] = PULL64(W[i]); 517 #endif 518 T1 += h + Sigma1(e) + Ch(e,f,g) + K512[i]; 519 T2 = Sigma0(a) + Maj(a,b,c); 520 h = g; g = f; f = e; e = d + T1; 521 d = c; c = b; b = a; a = T1 + T2; 522 } 523 524 for (;i<80;i++) 525 { 526 s0 = X[(i+1)&0x0f]; s0 = sigma0(s0); 527 s1 = X[(i+14)&0x0f]; s1 = sigma1(s1); 528 529 T1 = X[i&0xf] += s0 + s1 + X[(i+9)&0xf]; 530 T1 += h + Sigma1(e) + Ch(e,f,g) + K512[i]; 531 T2 = Sigma0(a) + Maj(a,b,c); 532 h = g; g = f; f = e; e = d + T1; 533 d = c; c = b; b = a; a = T1 + T2; 534 } 535 536 ctx->h[0] += a; ctx->h[1] += b; ctx->h[2] += c; ctx->h[3] += d; 537 ctx->h[4] += e; ctx->h[5] += f; ctx->h[6] += g; ctx->h[7] += h; 538 539 W+=SHA_LBLOCK; 540 } 541 } 542 543 #else 544 545 #define ROUND_00_15(i,a,b,c,d,e,f,g,h) do { \ 546 T1 += h + Sigma1(e) + Ch(e,f,g) + K512[i]; \ 547 h = Sigma0(a) + Maj(a,b,c); \ 548 d += T1; h += T1; } while (0) 549 550 #define ROUND_16_80(i,j,a,b,c,d,e,f,g,h,X) do { \ 551 s0 = X[(j+1)&0x0f]; s0 = sigma0(s0); \ 552 s1 = X[(j+14)&0x0f]; s1 = sigma1(s1); \ 553 T1 = X[(j)&0x0f] += s0 + s1 + X[(j+9)&0x0f]; \ 554 ROUND_00_15(i+j,a,b,c,d,e,f,g,h); } while (0) 555 556 static void sha512_block_data_order (SHA512_CTX *ctx, const void *in, size_t num) 557 { 558 const SHA_LONG64 *W=in; 559 SHA_LONG64 a,b,c,d,e,f,g,h,s0,s1,T1; 560 SHA_LONG64 X[16]; 561 int i; 562 563 while (num--) { 564 565 a = ctx->h[0]; b = ctx->h[1]; c = ctx->h[2]; d = ctx->h[3]; 566 e = ctx->h[4]; f = ctx->h[5]; g = ctx->h[6]; h = ctx->h[7]; 567 568 #ifdef B_ENDIAN 569 T1 = X[0] = W[0]; ROUND_00_15(0,a,b,c,d,e,f,g,h); 570 T1 = X[1] = W[1]; ROUND_00_15(1,h,a,b,c,d,e,f,g); 571 T1 = X[2] = W[2]; ROUND_00_15(2,g,h,a,b,c,d,e,f); 572 T1 = X[3] = W[3]; ROUND_00_15(3,f,g,h,a,b,c,d,e); 573 T1 = X[4] = W[4]; ROUND_00_15(4,e,f,g,h,a,b,c,d); 574 T1 = X[5] = W[5]; ROUND_00_15(5,d,e,f,g,h,a,b,c); 575 T1 = X[6] = W[6]; ROUND_00_15(6,c,d,e,f,g,h,a,b); 576 T1 = X[7] = W[7]; ROUND_00_15(7,b,c,d,e,f,g,h,a); 577 T1 = X[8] = W[8]; ROUND_00_15(8,a,b,c,d,e,f,g,h); 578 T1 = X[9] = W[9]; ROUND_00_15(9,h,a,b,c,d,e,f,g); 579 T1 = X[10] = W[10]; ROUND_00_15(10,g,h,a,b,c,d,e,f); 580 T1 = X[11] = W[11]; ROUND_00_15(11,f,g,h,a,b,c,d,e); 581 T1 = X[12] = W[12]; ROUND_00_15(12,e,f,g,h,a,b,c,d); 582 T1 = X[13] = W[13]; ROUND_00_15(13,d,e,f,g,h,a,b,c); 583 T1 = X[14] = W[14]; ROUND_00_15(14,c,d,e,f,g,h,a,b); 584 T1 = X[15] = W[15]; ROUND_00_15(15,b,c,d,e,f,g,h,a); 585 #else 586 T1 = X[0] = PULL64(W[0]); ROUND_00_15(0,a,b,c,d,e,f,g,h); 587 T1 = X[1] = PULL64(W[1]); ROUND_00_15(1,h,a,b,c,d,e,f,g); 588 T1 = X[2] = PULL64(W[2]); ROUND_00_15(2,g,h,a,b,c,d,e,f); 589 T1 = X[3] = PULL64(W[3]); ROUND_00_15(3,f,g,h,a,b,c,d,e); 590 T1 = X[4] = PULL64(W[4]); ROUND_00_15(4,e,f,g,h,a,b,c,d); 591 T1 = X[5] = PULL64(W[5]); ROUND_00_15(5,d,e,f,g,h,a,b,c); 592 T1 = X[6] = PULL64(W[6]); ROUND_00_15(6,c,d,e,f,g,h,a,b); 593 T1 = X[7] = PULL64(W[7]); ROUND_00_15(7,b,c,d,e,f,g,h,a); 594 T1 = X[8] = PULL64(W[8]); ROUND_00_15(8,a,b,c,d,e,f,g,h); 595 T1 = X[9] = PULL64(W[9]); ROUND_00_15(9,h,a,b,c,d,e,f,g); 596 T1 = X[10] = PULL64(W[10]); ROUND_00_15(10,g,h,a,b,c,d,e,f); 597 T1 = X[11] = PULL64(W[11]); ROUND_00_15(11,f,g,h,a,b,c,d,e); 598 T1 = X[12] = PULL64(W[12]); ROUND_00_15(12,e,f,g,h,a,b,c,d); 599 T1 = X[13] = PULL64(W[13]); ROUND_00_15(13,d,e,f,g,h,a,b,c); 600 T1 = X[14] = PULL64(W[14]); ROUND_00_15(14,c,d,e,f,g,h,a,b); 601 T1 = X[15] = PULL64(W[15]); ROUND_00_15(15,b,c,d,e,f,g,h,a); 602 #endif 603 604 for (i=16;i<80;i+=16) 605 { 606 ROUND_16_80(i, 0,a,b,c,d,e,f,g,h,X); 607 ROUND_16_80(i, 1,h,a,b,c,d,e,f,g,X); 608 ROUND_16_80(i, 2,g,h,a,b,c,d,e,f,X); 609 ROUND_16_80(i, 3,f,g,h,a,b,c,d,e,X); 610 ROUND_16_80(i, 4,e,f,g,h,a,b,c,d,X); 611 ROUND_16_80(i, 5,d,e,f,g,h,a,b,c,X); 612 ROUND_16_80(i, 6,c,d,e,f,g,h,a,b,X); 613 ROUND_16_80(i, 7,b,c,d,e,f,g,h,a,X); 614 ROUND_16_80(i, 8,a,b,c,d,e,f,g,h,X); 615 ROUND_16_80(i, 9,h,a,b,c,d,e,f,g,X); 616 ROUND_16_80(i,10,g,h,a,b,c,d,e,f,X); 617 ROUND_16_80(i,11,f,g,h,a,b,c,d,e,X); 618 ROUND_16_80(i,12,e,f,g,h,a,b,c,d,X); 619 ROUND_16_80(i,13,d,e,f,g,h,a,b,c,X); 620 ROUND_16_80(i,14,c,d,e,f,g,h,a,b,X); 621 ROUND_16_80(i,15,b,c,d,e,f,g,h,a,X); 622 } 623 624 ctx->h[0] += a; ctx->h[1] += b; ctx->h[2] += c; ctx->h[3] += d; 625 ctx->h[4] += e; ctx->h[5] += f; ctx->h[6] += g; ctx->h[7] += h; 626 627 W+=SHA_LBLOCK; 628 } 629 } 630 631 #endif 632 633 #endif /* SHA512_ASM */ 634 635 #else /* !OPENSSL_NO_SHA512 */ 636 637 #if defined(PEDANTIC) || defined(__DECC) || defined(OPENSSL_SYS_MACOSX) 638 static void *dummy=&dummy; 639 #endif 640 641 #endif /* !OPENSSL_NO_SHA512 */ 642