Home | History | Annotate | Download | only in nss
      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 "base/third_party/nspr/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/blapi.h"
     51 #include "crypto/third_party/nss/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 /* Comment out unused code, mostly the SHA384 and SHA512 implementations. */
    475 #if 0
    476 SECStatus
    477 SHA256_HashBuf(unsigned char *dest, const unsigned char *src,
    478                unsigned int src_length)
    479 {
    480     SHA256Context ctx;
    481     unsigned int outLen;
    482 
    483     SHA256_Begin(&ctx);
    484     SHA256_Update(&ctx, src, src_length);
    485     SHA256_End(&ctx, dest, &outLen, SHA256_LENGTH);
    486 
    487     return SECSuccess;
    488 }
    489 
    490 
    491 SECStatus
    492 SHA256_Hash(unsigned char *dest, const char *src)
    493 {
    494     return SHA256_HashBuf(dest, (const unsigned char *)src, PORT_Strlen(src));
    495 }
    496 
    497 
    498 void SHA256_TraceState(SHA256Context *ctx) { }
    499 
    500 unsigned int
    501 SHA256_FlattenSize(SHA256Context *ctx)
    502 {
    503     return sizeof *ctx;
    504 }
    505 
    506 SECStatus
    507 SHA256_Flatten(SHA256Context *ctx,unsigned char *space)
    508 {
    509     PORT_Memcpy(space, ctx, sizeof *ctx);
    510     return SECSuccess;
    511 }
    512 
    513 SHA256Context *
    514 SHA256_Resurrect(unsigned char *space, void *arg)
    515 {
    516     SHA256Context *ctx = SHA256_NewContext();
    517     if (ctx)
    518 	PORT_Memcpy(ctx, space, sizeof *ctx);
    519     return ctx;
    520 }
    521 
    522 void SHA256_Clone(SHA256Context *dest, SHA256Context *src)
    523 {
    524     memcpy(dest, src, sizeof *dest);
    525 }
    526 
    527 
    528 /* ======= SHA512 and SHA384 common constants and defines ================= */
    529 
    530 /* common #defines for SHA512 and SHA384 */
    531 #if defined(HAVE_LONG_LONG)
    532 #define ROTR64(x,n) ((x >> n) | (x << (64 - n)))
    533 #define ROTL64(x,n) ((x << n) | (x >> (64 - n)))
    534 
    535 #define S0(x) (ROTR64(x,28) ^ ROTR64(x,34) ^ ROTR64(x,39))
    536 #define S1(x) (ROTR64(x,14) ^ ROTR64(x,18) ^ ROTR64(x,41))
    537 #define s0(x) (t1 = x, ROTR64(t1, 1) ^ ROTR64(t1, 8) ^ SHR(t1,7))
    538 #define s1(x) (t2 = x, ROTR64(t2,19) ^ ROTR64(t2,61) ^ SHR(t2,6))
    539 
    540 #if PR_BYTES_PER_LONG == 8
    541 #define ULLC(hi,lo) 0x ## hi ## lo ## UL
    542 #elif defined(_MSC_VER)
    543 #define ULLC(hi,lo) 0x ## hi ## lo ## ui64
    544 #else
    545 #define ULLC(hi,lo) 0x ## hi ## lo ## ULL
    546 #endif
    547 
    548 #define SHA_MASK16 ULLC(0000FFFF,0000FFFF)
    549 #define SHA_MASK8  ULLC(00FF00FF,00FF00FF)
    550 #define SHA_HTONLL(x) (t1 = x, \
    551   t1 = ((t1 & SHA_MASK8 ) <<  8) | ((t1 >>  8) & SHA_MASK8 ), \
    552   t1 = ((t1 & SHA_MASK16) << 16) | ((t1 >> 16) & SHA_MASK16), \
    553   (t1 >> 32) | (t1 << 32))
    554 #define BYTESWAP8(x)  x = SHA_HTONLL(x)
    555 
    556 #else /* no long long */
    557 
    558 #if defined(IS_LITTLE_ENDIAN)
    559 #define ULLC(hi,lo) { 0x ## lo ## U, 0x ## hi ## U }
    560 #else
    561 #define ULLC(hi,lo) { 0x ## hi ## U, 0x ## lo ## U }
    562 #endif
    563 
    564 #define SHA_HTONLL(x) ( BYTESWAP4(x.lo), BYTESWAP4(x.hi), \
    565    x.hi ^= x.lo ^= x.hi ^= x.lo, x)
    566 #define BYTESWAP8(x)  do { PRUint32 tmp; BYTESWAP4(x.lo); BYTESWAP4(x.hi); \
    567    tmp = x.lo; x.lo = x.hi; x.hi = tmp; } while (0)
    568 #endif
    569 
    570 /* SHA-384 and SHA-512 constants, K512. */
    571 static const PRUint64 K512[80] = {
    572 #if PR_BYTES_PER_LONG == 8
    573      0x428a2f98d728ae22UL ,  0x7137449123ef65cdUL ,
    574      0xb5c0fbcfec4d3b2fUL ,  0xe9b5dba58189dbbcUL ,
    575      0x3956c25bf348b538UL ,  0x59f111f1b605d019UL ,
    576      0x923f82a4af194f9bUL ,  0xab1c5ed5da6d8118UL ,
    577      0xd807aa98a3030242UL ,  0x12835b0145706fbeUL ,
    578      0x243185be4ee4b28cUL ,  0x550c7dc3d5ffb4e2UL ,
    579      0x72be5d74f27b896fUL ,  0x80deb1fe3b1696b1UL ,
    580      0x9bdc06a725c71235UL ,  0xc19bf174cf692694UL ,
    581      0xe49b69c19ef14ad2UL ,  0xefbe4786384f25e3UL ,
    582      0x0fc19dc68b8cd5b5UL ,  0x240ca1cc77ac9c65UL ,
    583      0x2de92c6f592b0275UL ,  0x4a7484aa6ea6e483UL ,
    584      0x5cb0a9dcbd41fbd4UL ,  0x76f988da831153b5UL ,
    585      0x983e5152ee66dfabUL ,  0xa831c66d2db43210UL ,
    586      0xb00327c898fb213fUL ,  0xbf597fc7beef0ee4UL ,
    587      0xc6e00bf33da88fc2UL ,  0xd5a79147930aa725UL ,
    588      0x06ca6351e003826fUL ,  0x142929670a0e6e70UL ,
    589      0x27b70a8546d22ffcUL ,  0x2e1b21385c26c926UL ,
    590      0x4d2c6dfc5ac42aedUL ,  0x53380d139d95b3dfUL ,
    591      0x650a73548baf63deUL ,  0x766a0abb3c77b2a8UL ,
    592      0x81c2c92e47edaee6UL ,  0x92722c851482353bUL ,
    593      0xa2bfe8a14cf10364UL ,  0xa81a664bbc423001UL ,
    594      0xc24b8b70d0f89791UL ,  0xc76c51a30654be30UL ,
    595      0xd192e819d6ef5218UL ,  0xd69906245565a910UL ,
    596      0xf40e35855771202aUL ,  0x106aa07032bbd1b8UL ,
    597      0x19a4c116b8d2d0c8UL ,  0x1e376c085141ab53UL ,
    598      0x2748774cdf8eeb99UL ,  0x34b0bcb5e19b48a8UL ,
    599      0x391c0cb3c5c95a63UL ,  0x4ed8aa4ae3418acbUL ,
    600      0x5b9cca4f7763e373UL ,  0x682e6ff3d6b2b8a3UL ,
    601      0x748f82ee5defb2fcUL ,  0x78a5636f43172f60UL ,
    602      0x84c87814a1f0ab72UL ,  0x8cc702081a6439ecUL ,
    603      0x90befffa23631e28UL ,  0xa4506cebde82bde9UL ,
    604      0xbef9a3f7b2c67915UL ,  0xc67178f2e372532bUL ,
    605      0xca273eceea26619cUL ,  0xd186b8c721c0c207UL ,
    606      0xeada7dd6cde0eb1eUL ,  0xf57d4f7fee6ed178UL ,
    607      0x06f067aa72176fbaUL ,  0x0a637dc5a2c898a6UL ,
    608      0x113f9804bef90daeUL ,  0x1b710b35131c471bUL ,
    609      0x28db77f523047d84UL ,  0x32caab7b40c72493UL ,
    610      0x3c9ebe0a15c9bebcUL ,  0x431d67c49c100d4cUL ,
    611      0x4cc5d4becb3e42b6UL ,  0x597f299cfc657e2aUL ,
    612      0x5fcb6fab3ad6faecUL ,  0x6c44198c4a475817UL
    613 #else
    614     ULLC(428a2f98,d728ae22), ULLC(71374491,23ef65cd),
    615     ULLC(b5c0fbcf,ec4d3b2f), ULLC(e9b5dba5,8189dbbc),
    616     ULLC(3956c25b,f348b538), ULLC(59f111f1,b605d019),
    617     ULLC(923f82a4,af194f9b), ULLC(ab1c5ed5,da6d8118),
    618     ULLC(d807aa98,a3030242), ULLC(12835b01,45706fbe),
    619     ULLC(243185be,4ee4b28c), ULLC(550c7dc3,d5ffb4e2),
    620     ULLC(72be5d74,f27b896f), ULLC(80deb1fe,3b1696b1),
    621     ULLC(9bdc06a7,25c71235), ULLC(c19bf174,cf692694),
    622     ULLC(e49b69c1,9ef14ad2), ULLC(efbe4786,384f25e3),
    623     ULLC(0fc19dc6,8b8cd5b5), ULLC(240ca1cc,77ac9c65),
    624     ULLC(2de92c6f,592b0275), ULLC(4a7484aa,6ea6e483),
    625     ULLC(5cb0a9dc,bd41fbd4), ULLC(76f988da,831153b5),
    626     ULLC(983e5152,ee66dfab), ULLC(a831c66d,2db43210),
    627     ULLC(b00327c8,98fb213f), ULLC(bf597fc7,beef0ee4),
    628     ULLC(c6e00bf3,3da88fc2), ULLC(d5a79147,930aa725),
    629     ULLC(06ca6351,e003826f), ULLC(14292967,0a0e6e70),
    630     ULLC(27b70a85,46d22ffc), ULLC(2e1b2138,5c26c926),
    631     ULLC(4d2c6dfc,5ac42aed), ULLC(53380d13,9d95b3df),
    632     ULLC(650a7354,8baf63de), ULLC(766a0abb,3c77b2a8),
    633     ULLC(81c2c92e,47edaee6), ULLC(92722c85,1482353b),
    634     ULLC(a2bfe8a1,4cf10364), ULLC(a81a664b,bc423001),
    635     ULLC(c24b8b70,d0f89791), ULLC(c76c51a3,0654be30),
    636     ULLC(d192e819,d6ef5218), ULLC(d6990624,5565a910),
    637     ULLC(f40e3585,5771202a), ULLC(106aa070,32bbd1b8),
    638     ULLC(19a4c116,b8d2d0c8), ULLC(1e376c08,5141ab53),
    639     ULLC(2748774c,df8eeb99), ULLC(34b0bcb5,e19b48a8),
    640     ULLC(391c0cb3,c5c95a63), ULLC(4ed8aa4a,e3418acb),
    641     ULLC(5b9cca4f,7763e373), ULLC(682e6ff3,d6b2b8a3),
    642     ULLC(748f82ee,5defb2fc), ULLC(78a5636f,43172f60),
    643     ULLC(84c87814,a1f0ab72), ULLC(8cc70208,1a6439ec),
    644     ULLC(90befffa,23631e28), ULLC(a4506ceb,de82bde9),
    645     ULLC(bef9a3f7,b2c67915), ULLC(c67178f2,e372532b),
    646     ULLC(ca273ece,ea26619c), ULLC(d186b8c7,21c0c207),
    647     ULLC(eada7dd6,cde0eb1e), ULLC(f57d4f7f,ee6ed178),
    648     ULLC(06f067aa,72176fba), ULLC(0a637dc5,a2c898a6),
    649     ULLC(113f9804,bef90dae), ULLC(1b710b35,131c471b),
    650     ULLC(28db77f5,23047d84), ULLC(32caab7b,40c72493),
    651     ULLC(3c9ebe0a,15c9bebc), ULLC(431d67c4,9c100d4c),
    652     ULLC(4cc5d4be,cb3e42b6), ULLC(597f299c,fc657e2a),
    653     ULLC(5fcb6fab,3ad6faec), ULLC(6c44198c,4a475817)
    654 #endif
    655 };
    656 
    657 struct SHA512ContextStr {
    658     union {
    659 	PRUint64 w[80];	    /* message schedule, input buffer, plus 64 words */
    660 	PRUint32 l[160];
    661 	PRUint8  b[640];
    662     } u;
    663     PRUint64 h[8];	    /* 8 state variables */
    664     PRUint64 sizeLo;	    /* 64-bit count of hashed bytes. */
    665 };
    666 
    667 /* =========== SHA512 implementation ===================================== */
    668 
    669 /* SHA-512 initial hash values */
    670 static const PRUint64 H512[8] = {
    671 #if PR_BYTES_PER_LONG == 8
    672      0x6a09e667f3bcc908UL ,  0xbb67ae8584caa73bUL ,
    673      0x3c6ef372fe94f82bUL ,  0xa54ff53a5f1d36f1UL ,
    674      0x510e527fade682d1UL ,  0x9b05688c2b3e6c1fUL ,
    675      0x1f83d9abfb41bd6bUL ,  0x5be0cd19137e2179UL
    676 #else
    677     ULLC(6a09e667,f3bcc908), ULLC(bb67ae85,84caa73b),
    678     ULLC(3c6ef372,fe94f82b), ULLC(a54ff53a,5f1d36f1),
    679     ULLC(510e527f,ade682d1), ULLC(9b05688c,2b3e6c1f),
    680     ULLC(1f83d9ab,fb41bd6b), ULLC(5be0cd19,137e2179)
    681 #endif
    682 };
    683 
    684 
    685 SHA512Context *
    686 SHA512_NewContext(void)
    687 {
    688     SHA512Context *ctx = PORT_New(SHA512Context);
    689     return ctx;
    690 }
    691 
    692 void
    693 SHA512_DestroyContext(SHA512Context *ctx, PRBool freeit)
    694 {
    695     if (freeit) {
    696         PORT_ZFree(ctx, sizeof *ctx);
    697     }
    698 }
    699 
    700 void
    701 SHA512_Begin(SHA512Context *ctx)
    702 {
    703     memset(ctx, 0, sizeof *ctx);
    704     memcpy(H, H512, sizeof H512);
    705 }
    706 
    707 #if defined(SHA512_TRACE)
    708 #if defined(HAVE_LONG_LONG)
    709 #define DUMP(n,a,d,e,h) printf(" t = %2d, %s = %016lx, %s = %016lx\n", \
    710 			       n, #e, d, #a, h);
    711 #else
    712 #define DUMP(n,a,d,e,h) printf(" t = %2d, %s = %08x%08x, %s = %08x%08x\n", \
    713 			       n, #e, d.hi, d.lo, #a, h.hi, h.lo);
    714 #endif
    715 #else
    716 #define DUMP(n,a,d,e,h)
    717 #endif
    718 
    719 #if defined(HAVE_LONG_LONG)
    720 
    721 #define ADDTO(x,y) y += x
    722 
    723 #define INITW(t) W[t] = (s1(W[t-2]) + W[t-7] + s0(W[t-15]) + W[t-16])
    724 
    725 #define ROUND(n,a,b,c,d,e,f,g,h) \
    726     h += S1(e) + Ch(e,f,g) + K512[n] + W[n]; \
    727     d += h; \
    728     h += S0(a) + Maj(a,b,c); \
    729     DUMP(n,a,d,e,h)
    730 
    731 #else /* use only 32-bit variables, and don't unroll loops */
    732 
    733 #undef  NOUNROLL512
    734 #define NOUNROLL512 1
    735 
    736 #define ADDTO(x,y) y.lo += x.lo; y.hi += x.hi + (x.lo > y.lo)
    737 
    738 #define ROTR64a(x,n,lo,hi) (x.lo >> n | x.hi << (32-n))
    739 #define ROTR64A(x,n,lo,hi) (x.lo << (64-n) | x.hi >> (n-32))
    740 #define  SHR64a(x,n,lo,hi) (x.lo >> n | x.hi << (32-n))
    741 
    742 /* Capitol Sigma and lower case sigma functions */
    743 #define s0lo(x) (ROTR64a(x,1,lo,hi) ^ ROTR64a(x,8,lo,hi) ^ SHR64a(x,7,lo,hi))
    744 #define s0hi(x) (ROTR64a(x,1,hi,lo) ^ ROTR64a(x,8,hi,lo) ^ (x.hi >> 7))
    745 
    746 #define s1lo(x) (ROTR64a(x,19,lo,hi) ^ ROTR64A(x,61,lo,hi) ^ SHR64a(x,6,lo,hi))
    747 #define s1hi(x) (ROTR64a(x,19,hi,lo) ^ ROTR64A(x,61,hi,lo) ^ (x.hi >> 6))
    748 
    749 #define S0lo(x)(ROTR64a(x,28,lo,hi) ^ ROTR64A(x,34,lo,hi) ^ ROTR64A(x,39,lo,hi))
    750 #define S0hi(x)(ROTR64a(x,28,hi,lo) ^ ROTR64A(x,34,hi,lo) ^ ROTR64A(x,39,hi,lo))
    751 
    752 #define S1lo(x)(ROTR64a(x,14,lo,hi) ^ ROTR64a(x,18,lo,hi) ^ ROTR64A(x,41,lo,hi))
    753 #define S1hi(x)(ROTR64a(x,14,hi,lo) ^ ROTR64a(x,18,hi,lo) ^ ROTR64A(x,41,hi,lo))
    754 
    755 /* 32-bit versions of Ch and Maj */
    756 #define Chxx(x,y,z,lo) ((x.lo & y.lo) ^ (~x.lo & z.lo))
    757 #define Majx(x,y,z,lo) ((x.lo & y.lo) ^ (x.lo & z.lo) ^ (y.lo & z.lo))
    758 
    759 #define INITW(t) \
    760     do { \
    761 	PRUint32 lo, tm; \
    762 	PRUint32 cy = 0; \
    763 	lo = s1lo(W[t-2]); \
    764 	lo += (tm = W[t-7].lo);     if (lo < tm) cy++; \
    765 	lo += (tm = s0lo(W[t-15])); if (lo < tm) cy++; \
    766 	lo += (tm = W[t-16].lo);    if (lo < tm) cy++; \
    767 	W[t].lo = lo; \
    768 	W[t].hi = cy + s1hi(W[t-2]) + W[t-7].hi + s0hi(W[t-15]) + W[t-16].hi; \
    769     } while (0)
    770 
    771 #define ROUND(n,a,b,c,d,e,f,g,h) \
    772     { \
    773 	PRUint32 lo, tm, cy; \
    774 	lo  = S1lo(e); \
    775 	lo += (tm = Chxx(e,f,g,lo));    cy = (lo < tm); \
    776 	lo += (tm = K512[n].lo);	if (lo < tm) cy++; \
    777 	lo += (tm =    W[n].lo);	if (lo < tm) cy++; \
    778 	h.lo += lo;			if (h.lo < lo) cy++; \
    779 	h.hi += cy + S1hi(e) + Chxx(e,f,g,hi) + K512[n].hi + W[n].hi; \
    780 	d.lo += h.lo; \
    781 	d.hi += h.hi + (d.lo < h.lo); \
    782 	lo  = S0lo(a);  \
    783 	lo += (tm = Majx(a,b,c,lo));	cy = (lo < tm); \
    784 	h.lo += lo;			if (h.lo < lo) cy++; \
    785 	h.hi += cy + S0hi(a) + Majx(a,b,c,hi); \
    786 	DUMP(n,a,d,e,h) \
    787     }
    788 #endif
    789 
    790 static void
    791 SHA512_Compress(SHA512Context *ctx)
    792 {
    793 #if defined(IS_LITTLE_ENDIAN)
    794   {
    795 #if defined(HAVE_LONG_LONG)
    796     PRUint64 t1;
    797 #else
    798     PRUint32 t1;
    799 #endif
    800     BYTESWAP8(W[0]);
    801     BYTESWAP8(W[1]);
    802     BYTESWAP8(W[2]);
    803     BYTESWAP8(W[3]);
    804     BYTESWAP8(W[4]);
    805     BYTESWAP8(W[5]);
    806     BYTESWAP8(W[6]);
    807     BYTESWAP8(W[7]);
    808     BYTESWAP8(W[8]);
    809     BYTESWAP8(W[9]);
    810     BYTESWAP8(W[10]);
    811     BYTESWAP8(W[11]);
    812     BYTESWAP8(W[12]);
    813     BYTESWAP8(W[13]);
    814     BYTESWAP8(W[14]);
    815     BYTESWAP8(W[15]);
    816   }
    817 #endif
    818 
    819   {
    820     PRUint64 t1, t2;
    821 #ifdef NOUNROLL512
    822     {
    823 	/* prepare the "message schedule"   */
    824 	int t;
    825 	for (t = 16; t < 80; ++t) {
    826 	    INITW(t);
    827 	}
    828     }
    829 #else
    830     INITW(16);
    831     INITW(17);
    832     INITW(18);
    833     INITW(19);
    834 
    835     INITW(20);
    836     INITW(21);
    837     INITW(22);
    838     INITW(23);
    839     INITW(24);
    840     INITW(25);
    841     INITW(26);
    842     INITW(27);
    843     INITW(28);
    844     INITW(29);
    845 
    846     INITW(30);
    847     INITW(31);
    848     INITW(32);
    849     INITW(33);
    850     INITW(34);
    851     INITW(35);
    852     INITW(36);
    853     INITW(37);
    854     INITW(38);
    855     INITW(39);
    856 
    857     INITW(40);
    858     INITW(41);
    859     INITW(42);
    860     INITW(43);
    861     INITW(44);
    862     INITW(45);
    863     INITW(46);
    864     INITW(47);
    865     INITW(48);
    866     INITW(49);
    867 
    868     INITW(50);
    869     INITW(51);
    870     INITW(52);
    871     INITW(53);
    872     INITW(54);
    873     INITW(55);
    874     INITW(56);
    875     INITW(57);
    876     INITW(58);
    877     INITW(59);
    878 
    879     INITW(60);
    880     INITW(61);
    881     INITW(62);
    882     INITW(63);
    883     INITW(64);
    884     INITW(65);
    885     INITW(66);
    886     INITW(67);
    887     INITW(68);
    888     INITW(69);
    889 
    890     INITW(70);
    891     INITW(71);
    892     INITW(72);
    893     INITW(73);
    894     INITW(74);
    895     INITW(75);
    896     INITW(76);
    897     INITW(77);
    898     INITW(78);
    899     INITW(79);
    900 #endif
    901   }
    902 #ifdef SHA512_TRACE
    903   {
    904     int i;
    905     for (i = 0; i < 80; ++i) {
    906 #ifdef HAVE_LONG_LONG
    907 	printf("W[%2d] = %016lx\n", i, W[i]);
    908 #else
    909 	printf("W[%2d] = %08x%08x\n", i, W[i].hi, W[i].lo);
    910 #endif
    911     }
    912   }
    913 #endif
    914   {
    915     PRUint64 a, b, c, d, e, f, g, h;
    916 
    917     a = H[0];
    918     b = H[1];
    919     c = H[2];
    920     d = H[3];
    921     e = H[4];
    922     f = H[5];
    923     g = H[6];
    924     h = H[7];
    925 
    926 #ifdef NOUNROLL512
    927     {
    928 	int t;
    929 	for (t = 0; t < 80; t+= 8) {
    930 	    ROUND(t+0,a,b,c,d,e,f,g,h)
    931 	    ROUND(t+1,h,a,b,c,d,e,f,g)
    932 	    ROUND(t+2,g,h,a,b,c,d,e,f)
    933 	    ROUND(t+3,f,g,h,a,b,c,d,e)
    934 	    ROUND(t+4,e,f,g,h,a,b,c,d)
    935 	    ROUND(t+5,d,e,f,g,h,a,b,c)
    936 	    ROUND(t+6,c,d,e,f,g,h,a,b)
    937 	    ROUND(t+7,b,c,d,e,f,g,h,a)
    938 	}
    939     }
    940 #else
    941     ROUND( 0,a,b,c,d,e,f,g,h)
    942     ROUND( 1,h,a,b,c,d,e,f,g)
    943     ROUND( 2,g,h,a,b,c,d,e,f)
    944     ROUND( 3,f,g,h,a,b,c,d,e)
    945     ROUND( 4,e,f,g,h,a,b,c,d)
    946     ROUND( 5,d,e,f,g,h,a,b,c)
    947     ROUND( 6,c,d,e,f,g,h,a,b)
    948     ROUND( 7,b,c,d,e,f,g,h,a)
    949 
    950     ROUND( 8,a,b,c,d,e,f,g,h)
    951     ROUND( 9,h,a,b,c,d,e,f,g)
    952     ROUND(10,g,h,a,b,c,d,e,f)
    953     ROUND(11,f,g,h,a,b,c,d,e)
    954     ROUND(12,e,f,g,h,a,b,c,d)
    955     ROUND(13,d,e,f,g,h,a,b,c)
    956     ROUND(14,c,d,e,f,g,h,a,b)
    957     ROUND(15,b,c,d,e,f,g,h,a)
    958 
    959     ROUND(16,a,b,c,d,e,f,g,h)
    960     ROUND(17,h,a,b,c,d,e,f,g)
    961     ROUND(18,g,h,a,b,c,d,e,f)
    962     ROUND(19,f,g,h,a,b,c,d,e)
    963     ROUND(20,e,f,g,h,a,b,c,d)
    964     ROUND(21,d,e,f,g,h,a,b,c)
    965     ROUND(22,c,d,e,f,g,h,a,b)
    966     ROUND(23,b,c,d,e,f,g,h,a)
    967 
    968     ROUND(24,a,b,c,d,e,f,g,h)
    969     ROUND(25,h,a,b,c,d,e,f,g)
    970     ROUND(26,g,h,a,b,c,d,e,f)
    971     ROUND(27,f,g,h,a,b,c,d,e)
    972     ROUND(28,e,f,g,h,a,b,c,d)
    973     ROUND(29,d,e,f,g,h,a,b,c)
    974     ROUND(30,c,d,e,f,g,h,a,b)
    975     ROUND(31,b,c,d,e,f,g,h,a)
    976 
    977     ROUND(32,a,b,c,d,e,f,g,h)
    978     ROUND(33,h,a,b,c,d,e,f,g)
    979     ROUND(34,g,h,a,b,c,d,e,f)
    980     ROUND(35,f,g,h,a,b,c,d,e)
    981     ROUND(36,e,f,g,h,a,b,c,d)
    982     ROUND(37,d,e,f,g,h,a,b,c)
    983     ROUND(38,c,d,e,f,g,h,a,b)
    984     ROUND(39,b,c,d,e,f,g,h,a)
    985 
    986     ROUND(40,a,b,c,d,e,f,g,h)
    987     ROUND(41,h,a,b,c,d,e,f,g)
    988     ROUND(42,g,h,a,b,c,d,e,f)
    989     ROUND(43,f,g,h,a,b,c,d,e)
    990     ROUND(44,e,f,g,h,a,b,c,d)
    991     ROUND(45,d,e,f,g,h,a,b,c)
    992     ROUND(46,c,d,e,f,g,h,a,b)
    993     ROUND(47,b,c,d,e,f,g,h,a)
    994 
    995     ROUND(48,a,b,c,d,e,f,g,h)
    996     ROUND(49,h,a,b,c,d,e,f,g)
    997     ROUND(50,g,h,a,b,c,d,e,f)
    998     ROUND(51,f,g,h,a,b,c,d,e)
    999     ROUND(52,e,f,g,h,a,b,c,d)
   1000     ROUND(53,d,e,f,g,h,a,b,c)
   1001     ROUND(54,c,d,e,f,g,h,a,b)
   1002     ROUND(55,b,c,d,e,f,g,h,a)
   1003 
   1004     ROUND(56,a,b,c,d,e,f,g,h)
   1005     ROUND(57,h,a,b,c,d,e,f,g)
   1006     ROUND(58,g,h,a,b,c,d,e,f)
   1007     ROUND(59,f,g,h,a,b,c,d,e)
   1008     ROUND(60,e,f,g,h,a,b,c,d)
   1009     ROUND(61,d,e,f,g,h,a,b,c)
   1010     ROUND(62,c,d,e,f,g,h,a,b)
   1011     ROUND(63,b,c,d,e,f,g,h,a)
   1012 
   1013     ROUND(64,a,b,c,d,e,f,g,h)
   1014     ROUND(65,h,a,b,c,d,e,f,g)
   1015     ROUND(66,g,h,a,b,c,d,e,f)
   1016     ROUND(67,f,g,h,a,b,c,d,e)
   1017     ROUND(68,e,f,g,h,a,b,c,d)
   1018     ROUND(69,d,e,f,g,h,a,b,c)
   1019     ROUND(70,c,d,e,f,g,h,a,b)
   1020     ROUND(71,b,c,d,e,f,g,h,a)
   1021 
   1022     ROUND(72,a,b,c,d,e,f,g,h)
   1023     ROUND(73,h,a,b,c,d,e,f,g)
   1024     ROUND(74,g,h,a,b,c,d,e,f)
   1025     ROUND(75,f,g,h,a,b,c,d,e)
   1026     ROUND(76,e,f,g,h,a,b,c,d)
   1027     ROUND(77,d,e,f,g,h,a,b,c)
   1028     ROUND(78,c,d,e,f,g,h,a,b)
   1029     ROUND(79,b,c,d,e,f,g,h,a)
   1030 #endif
   1031 
   1032     ADDTO(a,H[0]);
   1033     ADDTO(b,H[1]);
   1034     ADDTO(c,H[2]);
   1035     ADDTO(d,H[3]);
   1036     ADDTO(e,H[4]);
   1037     ADDTO(f,H[5]);
   1038     ADDTO(g,H[6]);
   1039     ADDTO(h,H[7]);
   1040   }
   1041 }
   1042 
   1043 void
   1044 SHA512_Update(SHA512Context *ctx, const unsigned char *input,
   1045               unsigned int inputLen)
   1046 {
   1047     unsigned int inBuf;
   1048     if (!inputLen)
   1049     	return;
   1050 
   1051 #if defined(HAVE_LONG_LONG)
   1052     inBuf = (unsigned int)ctx->sizeLo & 0x7f;
   1053     /* Add inputLen into the count of bytes processed, before processing */
   1054     ctx->sizeLo += inputLen;
   1055 #else
   1056     inBuf = (unsigned int)ctx->sizeLo.lo & 0x7f;
   1057     ctx->sizeLo.lo += inputLen;
   1058     if (ctx->sizeLo.lo < inputLen) ctx->sizeLo.hi++;
   1059 #endif
   1060 
   1061     /* if data already in buffer, attemp to fill rest of buffer */
   1062     if (inBuf) {
   1063     	unsigned int todo = SHA512_BLOCK_LENGTH - inBuf;
   1064 	if (inputLen < todo)
   1065 	    todo = inputLen;
   1066 	memcpy(B + inBuf, input, todo);
   1067 	input    += todo;
   1068 	inputLen -= todo;
   1069 	if (inBuf + todo == SHA512_BLOCK_LENGTH)
   1070 	    SHA512_Compress(ctx);
   1071     }
   1072 
   1073     /* if enough data to fill one or more whole buffers, process them. */
   1074     while (inputLen >= SHA512_BLOCK_LENGTH) {
   1075     	memcpy(B, input, SHA512_BLOCK_LENGTH);
   1076 	input    += SHA512_BLOCK_LENGTH;
   1077 	inputLen -= SHA512_BLOCK_LENGTH;
   1078 	SHA512_Compress(ctx);
   1079     }
   1080     /* if data left over, fill it into buffer */
   1081     if (inputLen)
   1082     	memcpy(B, input, inputLen);
   1083 }
   1084 
   1085 void
   1086 SHA512_End(SHA512Context *ctx, unsigned char *digest,
   1087            unsigned int *digestLen, unsigned int maxDigestLen)
   1088 {
   1089 #if defined(HAVE_LONG_LONG)
   1090     unsigned int inBuf  = (unsigned int)ctx->sizeLo & 0x7f;
   1091     unsigned int padLen = (inBuf < 112) ? (112 - inBuf) : (112 + 128 - inBuf);
   1092     PRUint64 lo, t1;
   1093     lo = (ctx->sizeLo << 3);
   1094 #else
   1095     unsigned int inBuf  = (unsigned int)ctx->sizeLo.lo & 0x7f;
   1096     unsigned int padLen = (inBuf < 112) ? (112 - inBuf) : (112 + 128 - inBuf);
   1097     PRUint64 lo = ctx->sizeLo;
   1098     PRUint32 t1;
   1099     lo.lo <<= 3;
   1100 #endif
   1101 
   1102     SHA512_Update(ctx, pad, padLen);
   1103 
   1104 #if defined(HAVE_LONG_LONG)
   1105     W[14] = 0;
   1106 #else
   1107     W[14].lo = 0;
   1108     W[14].hi = 0;
   1109 #endif
   1110 
   1111     W[15] = lo;
   1112 #if defined(IS_LITTLE_ENDIAN)
   1113     BYTESWAP8(W[15]);
   1114 #endif
   1115     SHA512_Compress(ctx);
   1116 
   1117     /* now output the answer */
   1118 #if defined(IS_LITTLE_ENDIAN)
   1119     BYTESWAP8(H[0]);
   1120     BYTESWAP8(H[1]);
   1121     BYTESWAP8(H[2]);
   1122     BYTESWAP8(H[3]);
   1123     BYTESWAP8(H[4]);
   1124     BYTESWAP8(H[5]);
   1125     BYTESWAP8(H[6]);
   1126     BYTESWAP8(H[7]);
   1127 #endif
   1128     padLen = PR_MIN(SHA512_LENGTH, maxDigestLen);
   1129     memcpy(digest, H, padLen);
   1130     if (digestLen)
   1131 	*digestLen = padLen;
   1132 }
   1133 
   1134 SECStatus
   1135 SHA512_HashBuf(unsigned char *dest, const unsigned char *src,
   1136                unsigned int src_length)
   1137 {
   1138     SHA512Context ctx;
   1139     unsigned int outLen;
   1140 
   1141     SHA512_Begin(&ctx);
   1142     SHA512_Update(&ctx, src, src_length);
   1143     SHA512_End(&ctx, dest, &outLen, SHA512_LENGTH);
   1144 
   1145     return SECSuccess;
   1146 }
   1147 
   1148 
   1149 SECStatus
   1150 SHA512_Hash(unsigned char *dest, const char *src)
   1151 {
   1152     return SHA512_HashBuf(dest, (const unsigned char *)src, PORT_Strlen(src));
   1153 }
   1154 
   1155 
   1156 void SHA512_TraceState(SHA512Context *ctx) { }
   1157 
   1158 unsigned int
   1159 SHA512_FlattenSize(SHA512Context *ctx)
   1160 {
   1161     return sizeof *ctx;
   1162 }
   1163 
   1164 SECStatus
   1165 SHA512_Flatten(SHA512Context *ctx,unsigned char *space)
   1166 {
   1167     PORT_Memcpy(space, ctx, sizeof *ctx);
   1168     return SECSuccess;
   1169 }
   1170 
   1171 SHA512Context *
   1172 SHA512_Resurrect(unsigned char *space, void *arg)
   1173 {
   1174     SHA512Context *ctx = SHA512_NewContext();
   1175     if (ctx)
   1176 	PORT_Memcpy(ctx, space, sizeof *ctx);
   1177     return ctx;
   1178 }
   1179 
   1180 void SHA512_Clone(SHA512Context *dest, SHA512Context *src)
   1181 {
   1182     memcpy(dest, src, sizeof *dest);
   1183 }
   1184 
   1185 /* ======================================================================= */
   1186 /* SHA384 uses a SHA512Context as the real context.
   1187 ** The only differences between SHA384 an SHA512 are:
   1188 ** a) the intialization values for the context, and
   1189 ** b) the number of bytes of data produced as output.
   1190 */
   1191 
   1192 /* SHA-384 initial hash values */
   1193 static const PRUint64 H384[8] = {
   1194 #if PR_BYTES_PER_LONG == 8
   1195      0xcbbb9d5dc1059ed8UL ,  0x629a292a367cd507UL ,
   1196      0x9159015a3070dd17UL ,  0x152fecd8f70e5939UL ,
   1197      0x67332667ffc00b31UL ,  0x8eb44a8768581511UL ,
   1198      0xdb0c2e0d64f98fa7UL ,  0x47b5481dbefa4fa4UL
   1199 #else
   1200     ULLC(cbbb9d5d,c1059ed8), ULLC(629a292a,367cd507),
   1201     ULLC(9159015a,3070dd17), ULLC(152fecd8,f70e5939),
   1202     ULLC(67332667,ffc00b31), ULLC(8eb44a87,68581511),
   1203     ULLC(db0c2e0d,64f98fa7), ULLC(47b5481d,befa4fa4)
   1204 #endif
   1205 };
   1206 
   1207 SHA384Context *
   1208 SHA384_NewContext(void)
   1209 {
   1210     return SHA512_NewContext();
   1211 }
   1212 
   1213 void
   1214 SHA384_DestroyContext(SHA384Context *ctx, PRBool freeit)
   1215 {
   1216     SHA512_DestroyContext(ctx, freeit);
   1217 }
   1218 
   1219 void
   1220 SHA384_Begin(SHA384Context *ctx)
   1221 {
   1222     memset(ctx, 0, sizeof *ctx);
   1223     memcpy(H, H384, sizeof H384);
   1224 }
   1225 
   1226 void
   1227 SHA384_Update(SHA384Context *ctx, const unsigned char *input,
   1228 		    unsigned int inputLen)
   1229 {
   1230     SHA512_Update(ctx, input, inputLen);
   1231 }
   1232 
   1233 void
   1234 SHA384_End(SHA384Context *ctx, unsigned char *digest,
   1235 		 unsigned int *digestLen, unsigned int maxDigestLen)
   1236 {
   1237 #define SHA_MIN(a,b) (a < b ? a : b)
   1238     unsigned int maxLen = SHA_MIN(maxDigestLen, SHA384_LENGTH);
   1239     SHA512_End(ctx, digest, digestLen, maxLen);
   1240 }
   1241 
   1242 SECStatus
   1243 SHA384_HashBuf(unsigned char *dest, const unsigned char *src,
   1244 			  unsigned int src_length)
   1245 {
   1246     SHA512Context ctx;
   1247     unsigned int outLen;
   1248 
   1249     SHA384_Begin(&ctx);
   1250     SHA512_Update(&ctx, src, src_length);
   1251     SHA512_End(&ctx, dest, &outLen, SHA384_LENGTH);
   1252 
   1253     return SECSuccess;
   1254 }
   1255 
   1256 SECStatus
   1257 SHA384_Hash(unsigned char *dest, const char *src)
   1258 {
   1259     return SHA384_HashBuf(dest, (const unsigned char *)src, PORT_Strlen(src));
   1260 }
   1261 
   1262 void SHA384_TraceState(SHA384Context *ctx) { }
   1263 
   1264 unsigned int
   1265 SHA384_FlattenSize(SHA384Context *ctx)
   1266 {
   1267     return sizeof(SHA384Context);
   1268 }
   1269 
   1270 SECStatus
   1271 SHA384_Flatten(SHA384Context *ctx,unsigned char *space)
   1272 {
   1273     return SHA512_Flatten(ctx, space);
   1274 }
   1275 
   1276 SHA384Context *
   1277 SHA384_Resurrect(unsigned char *space, void *arg)
   1278 {
   1279     return SHA512_Resurrect(space, arg);
   1280 }
   1281 
   1282 void SHA384_Clone(SHA384Context *dest, SHA384Context *src)
   1283 {
   1284     memcpy(dest, src, sizeof *dest);
   1285 }
   1286 #endif  /* Comment out unused code. */
   1287 
   1288 /* ======================================================================= */
   1289 #ifdef SELFTEST
   1290 #include <stdio.h>
   1291 
   1292 static const char abc[] = { "abc" };
   1293 static const char abcdbc[] = {
   1294     "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
   1295 };
   1296 static const char abcdef[] = {
   1297     "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
   1298     "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"
   1299 };
   1300 
   1301 void
   1302 dumpHash32(const unsigned char *buf, unsigned int bufLen)
   1303 {
   1304     unsigned int i;
   1305     for (i = 0; i < bufLen; i += 4) {
   1306 	printf(" %02x%02x%02x%02x", buf[i], buf[i+1], buf[i+2], buf[i+3]);
   1307     }
   1308     printf("\n");
   1309 }
   1310 
   1311 void test256(void)
   1312 {
   1313     unsigned char outBuf[SHA256_LENGTH];
   1314 
   1315     printf("SHA256, input = %s\n", abc);
   1316     SHA256_Hash(outBuf, abc);
   1317     dumpHash32(outBuf, sizeof outBuf);
   1318 
   1319     printf("SHA256, input = %s\n", abcdbc);
   1320     SHA256_Hash(outBuf, abcdbc);
   1321     dumpHash32(outBuf, sizeof outBuf);
   1322 }
   1323 
   1324 void
   1325 dumpHash64(const unsigned char *buf, unsigned int bufLen)
   1326 {
   1327     unsigned int i;
   1328     for (i = 0; i < bufLen; i += 8) {
   1329     	if (i % 32 == 0)
   1330 	    printf("\n");
   1331 	printf(" %02x%02x%02x%02x%02x%02x%02x%02x",
   1332 	       buf[i  ], buf[i+1], buf[i+2], buf[i+3],
   1333 	       buf[i+4], buf[i+5], buf[i+6], buf[i+7]);
   1334     }
   1335     printf("\n");
   1336 }
   1337 
   1338 void test512(void)
   1339 {
   1340     unsigned char outBuf[SHA512_LENGTH];
   1341 
   1342     printf("SHA512, input = %s\n", abc);
   1343     SHA512_Hash(outBuf, abc);
   1344     dumpHash64(outBuf, sizeof outBuf);
   1345 
   1346     printf("SHA512, input = %s\n", abcdef);
   1347     SHA512_Hash(outBuf, abcdef);
   1348     dumpHash64(outBuf, sizeof outBuf);
   1349 }
   1350 
   1351 void time512(void)
   1352 {
   1353     unsigned char outBuf[SHA512_LENGTH];
   1354 
   1355     SHA512_Hash(outBuf, abc);
   1356     SHA512_Hash(outBuf, abcdef);
   1357 }
   1358 
   1359 void test384(void)
   1360 {
   1361     unsigned char outBuf[SHA384_LENGTH];
   1362 
   1363     printf("SHA384, input = %s\n", abc);
   1364     SHA384_Hash(outBuf, abc);
   1365     dumpHash64(outBuf, sizeof outBuf);
   1366 
   1367     printf("SHA384, input = %s\n", abcdef);
   1368     SHA384_Hash(outBuf, abcdef);
   1369     dumpHash64(outBuf, sizeof outBuf);
   1370 }
   1371 
   1372 int main (int argc, char *argv[], char *envp[])
   1373 {
   1374     int i = 1;
   1375     if (argc > 1) {
   1376     	i = atoi(argv[1]);
   1377     }
   1378     if (i < 2) {
   1379 	test256();
   1380 	test512();
   1381 	test384();
   1382     } else {
   1383     	while (i-- > 0) {
   1384 	    time512();
   1385 	}
   1386 	printf("done\n");
   1387     }
   1388     return 0;
   1389 }
   1390 
   1391 #endif
   1392