sha_fast.c
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:14k
源码类别:

CA认证

开发平台:

WINDOWS

  1. /* 
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is SHA 180-1 Reference Implementation (Optimized)
  13.  * 
  14.  * The Initial Developer of the Original Code is Paul Kocher of
  15.  * Cryptography Research.  Portions created by Paul Kocher are 
  16.  * Copyright (C) 1995-9 by Cryptography Research, Inc.  All
  17.  * Rights Reserved.
  18.  * 
  19.  * Contributor(s):
  20.  *
  21.  *     Paul Kocher
  22.  * 
  23.  * Alternatively, the contents of this file may be used under the
  24.  * terms of the GNU General Public License Version 2 or later (the
  25.  * "GPL"), in which case the provisions of the GPL are applicable 
  26.  * instead of those above.  If you wish to allow use of your 
  27.  * version of this file only under the terms of the GPL and not to
  28.  * allow others to use your version of this file under the MPL,
  29.  * indicate your decision by deleting the provisions above and
  30.  * replace them with the notice and other provisions required by
  31.  * the GPL.  If you do not delete the provisions above, a recipient
  32.  * may use your version of this file under either the MPL or the
  33.  * GPL.
  34.  */
  35. #include <memory.h>
  36. #include "blapi.h"
  37. #include "sha_fast.h"
  38. #ifdef TRACING_SSL
  39. #include "ssl.h"
  40. #include "ssltrace.h"
  41. #endif
  42. static void shaCompress(SHA1Context *ctx);
  43. #define W u.w
  44. #define B u.b
  45. #define SHA_ROTL(X,n) (((X) << (n)) | ((X) >> (32-(n))))
  46. #define SHA_F1(X,Y,Z) ((((Y)^(Z))&(X))^(Z))
  47. #define SHA_F2(X,Y,Z) ((X)^(Y)^(Z))
  48. #define SHA_F3(X,Y,Z) (((X)&(Y))|((Z)&((X)|(Y))))
  49. #define SHA_F4(X,Y,Z) ((X)^(Y)^(Z))
  50. #define SHA_MIX(t)    ctx->W[t] = 
  51.   (A = ctx->W[t-3] ^ ctx->W[t-8] ^ ctx->W[t-14] ^ ctx->W[t-16], SHA_ROTL(A, 1))
  52. /*
  53.  *  SHA: Zeroize and initialize context
  54.  */
  55. void 
  56. SHA1_Begin(SHA1Context *ctx)
  57. {
  58.   memset(ctx, 0, sizeof(SHA1Context));
  59.   /*
  60.    *  Initialize H with constants from FIPS180-1.
  61.    */
  62.   ctx->H[0] = 0x67452301L;
  63.   ctx->H[1] = 0xefcdab89L;
  64.   ctx->H[2] = 0x98badcfeL;
  65.   ctx->H[3] = 0x10325476L;
  66.   ctx->H[4] = 0xc3d2e1f0L;
  67. }
  68. /*
  69.  *  SHA: Add data to context.
  70.  */
  71. void 
  72. SHA1_Update(SHA1Context *ctx, const unsigned char *dataIn, unsigned int len) 
  73. {
  74.   register unsigned int lenB = ctx->sizeLo & 63;
  75.   register unsigned int togo;
  76.   if (!len)
  77.     return;
  78.   /* accumulate the byte count. */
  79.   ctx->sizeLo += len;
  80.   ctx->sizeHi += (ctx->sizeLo < len);
  81.   /*
  82.    *  Read the data into W and process blocks as they get full
  83.    */
  84.   if (lenB > 0) {
  85.     togo = 64 - lenB;
  86.     if (len < togo)
  87.       togo = len;
  88.     memcpy(ctx->B + lenB, dataIn, togo);
  89.     len    -= togo;
  90.     dataIn += togo;
  91.     lenB    = (lenB + togo) & 63;
  92.     if (!lenB) {
  93.       shaCompress(ctx);
  94.     }
  95.   }
  96.   while (len >= 64) {
  97.     memcpy(ctx->B, dataIn, 64);
  98.     dataIn += 64;
  99.     len    -= 64;
  100.     shaCompress(ctx);
  101.   }
  102.   if (len) {
  103.     memcpy(ctx->B, dataIn, len);
  104.   }
  105. }
  106. /*
  107.  *  SHA: Generate hash value from context
  108.  */
  109. void 
  110. SHA1_End(SHA1Context *ctx, unsigned char *hashout,
  111.          unsigned int *pDigestLen, unsigned int maxDigestLen)
  112. {
  113.   register PRUint32 sizeHi, sizeLo, lenB;
  114.   static const unsigned char bulk_pad[64] = { 0x80,0,0,0,0,0,0,0,0,0,
  115.           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,
  116.           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  };
  117. #define A lenB
  118.   PORT_Assert (maxDigestLen >= SHA1_LENGTH);
  119.   /*
  120.    *  Pad with a binary 1 (e.g. 0x80), then zeroes, then length in bits
  121.    */
  122.   sizeHi = ctx->sizeHi;
  123.   sizeLo = ctx->sizeLo;
  124.   lenB = sizeLo & 63;
  125.   SHA1_Update(ctx, bulk_pad, (((55+64) - lenB) & 63) + 1);
  126.   PORT_Assert((ctx->sizeLo & 63) == 56);
  127.   /* Convert size{Hi,Lo} from bytes to bits. */
  128.   sizeHi = (sizeHi << 3) | (sizeLo >> 29);
  129.   sizeLo <<= 3;
  130.   ctx->W[14] = SHA_HTONL(sizeHi);
  131.   ctx->W[15] = SHA_HTONL(sizeLo);
  132.   shaCompress(ctx);
  133.   /*
  134.    *  Output hash
  135.    */
  136. #if defined(IS_LITTLE_ENDIAN)
  137.   SHA_BYTESWAP(ctx->H[0]);
  138.   SHA_BYTESWAP(ctx->H[1]);
  139.   SHA_BYTESWAP(ctx->H[2]);
  140.   SHA_BYTESWAP(ctx->H[3]);
  141.   SHA_BYTESWAP(ctx->H[4]);
  142. #endif
  143.   memcpy(hashout, ctx->H, SHA1_LENGTH);
  144.   *pDigestLen = SHA1_LENGTH;
  145.   /*
  146.    *  Re-initialize the context (also zeroizes contents)
  147.    */
  148.   SHA1_Begin(ctx);
  149. }
  150. #undef A
  151. #undef B
  152. /*
  153.  *  SHA: Compression function, unrolled.
  154.  */
  155. static void 
  156. shaCompress(SHA1Context *ctx) 
  157. {
  158.   register PRUint32 A, B, C, D, E;
  159. #if defined(IS_LITTLE_ENDIAN)
  160.   SHA_BYTESWAP(ctx->W[0]);
  161.   SHA_BYTESWAP(ctx->W[1]);
  162.   SHA_BYTESWAP(ctx->W[2]);
  163.   SHA_BYTESWAP(ctx->W[3]);
  164.   SHA_BYTESWAP(ctx->W[4]);
  165.   SHA_BYTESWAP(ctx->W[5]);
  166.   SHA_BYTESWAP(ctx->W[6]);
  167.   SHA_BYTESWAP(ctx->W[7]);
  168.   SHA_BYTESWAP(ctx->W[8]);
  169.   SHA_BYTESWAP(ctx->W[9]);
  170.   SHA_BYTESWAP(ctx->W[10]);
  171.   SHA_BYTESWAP(ctx->W[11]);
  172.   SHA_BYTESWAP(ctx->W[12]);
  173.   SHA_BYTESWAP(ctx->W[13]);
  174.   SHA_BYTESWAP(ctx->W[14]);
  175.   SHA_BYTESWAP(ctx->W[15]);
  176. #endif
  177.   /*
  178.    *  This can be moved into the main code block below, but doing
  179.    *  so can cause some compilers to run out of registers and resort
  180.    *  to storing intermediates in RAM.
  181.    */
  182.                SHA_MIX(16); SHA_MIX(17); SHA_MIX(18); SHA_MIX(19);
  183.   SHA_MIX(20); SHA_MIX(21); SHA_MIX(22); SHA_MIX(23); SHA_MIX(24);
  184.   SHA_MIX(25); SHA_MIX(26); SHA_MIX(27); SHA_MIX(28); SHA_MIX(29);
  185.   SHA_MIX(30); SHA_MIX(31); SHA_MIX(32); SHA_MIX(33); SHA_MIX(34);
  186.   SHA_MIX(35); SHA_MIX(36); SHA_MIX(37); SHA_MIX(38); SHA_MIX(39);
  187.   SHA_MIX(40); SHA_MIX(41); SHA_MIX(42); SHA_MIX(43); SHA_MIX(44);
  188.   SHA_MIX(45); SHA_MIX(46); SHA_MIX(47); SHA_MIX(48); SHA_MIX(49);
  189.   SHA_MIX(50); SHA_MIX(51); SHA_MIX(52); SHA_MIX(53); SHA_MIX(54);
  190.   SHA_MIX(55); SHA_MIX(56); SHA_MIX(57); SHA_MIX(58); SHA_MIX(59);
  191.   SHA_MIX(60); SHA_MIX(61); SHA_MIX(62); SHA_MIX(63); SHA_MIX(64);
  192.   SHA_MIX(65); SHA_MIX(66); SHA_MIX(67); SHA_MIX(68); SHA_MIX(69);
  193.   SHA_MIX(70); SHA_MIX(71); SHA_MIX(72); SHA_MIX(73); SHA_MIX(74);
  194.   SHA_MIX(75); SHA_MIX(76); SHA_MIX(77); SHA_MIX(78); SHA_MIX(79);
  195.   A = ctx->H[0];
  196.   B = ctx->H[1];
  197.   C = ctx->H[2];
  198.   D = ctx->H[3];
  199.   E = ctx->H[4];
  200.   E = SHA_ROTL(A,5)+SHA_F1(B,C,D)+E+ctx->W[ 0]+0x5a827999L; B=SHA_ROTL(B,30); 
  201.   D = SHA_ROTL(E,5)+SHA_F1(A,B,C)+D+ctx->W[ 1]+0x5a827999L; A=SHA_ROTL(A,30); 
  202.   C = SHA_ROTL(D,5)+SHA_F1(E,A,B)+C+ctx->W[ 2]+0x5a827999L; E=SHA_ROTL(E,30); 
  203.   B = SHA_ROTL(C,5)+SHA_F1(D,E,A)+B+ctx->W[ 3]+0x5a827999L; D=SHA_ROTL(D,30); 
  204.   A = SHA_ROTL(B,5)+SHA_F1(C,D,E)+A+ctx->W[ 4]+0x5a827999L; C=SHA_ROTL(C,30); 
  205.   E = SHA_ROTL(A,5)+SHA_F1(B,C,D)+E+ctx->W[ 5]+0x5a827999L; B=SHA_ROTL(B,30); 
  206.   D = SHA_ROTL(E,5)+SHA_F1(A,B,C)+D+ctx->W[ 6]+0x5a827999L; A=SHA_ROTL(A,30); 
  207.   C = SHA_ROTL(D,5)+SHA_F1(E,A,B)+C+ctx->W[ 7]+0x5a827999L; E=SHA_ROTL(E,30); 
  208.   B = SHA_ROTL(C,5)+SHA_F1(D,E,A)+B+ctx->W[ 8]+0x5a827999L; D=SHA_ROTL(D,30); 
  209.   A = SHA_ROTL(B,5)+SHA_F1(C,D,E)+A+ctx->W[ 9]+0x5a827999L; C=SHA_ROTL(C,30); 
  210.   E = SHA_ROTL(A,5)+SHA_F1(B,C,D)+E+ctx->W[10]+0x5a827999L; B=SHA_ROTL(B,30); 
  211.   D = SHA_ROTL(E,5)+SHA_F1(A,B,C)+D+ctx->W[11]+0x5a827999L; A=SHA_ROTL(A,30); 
  212.   C = SHA_ROTL(D,5)+SHA_F1(E,A,B)+C+ctx->W[12]+0x5a827999L; E=SHA_ROTL(E,30); 
  213.   B = SHA_ROTL(C,5)+SHA_F1(D,E,A)+B+ctx->W[13]+0x5a827999L; D=SHA_ROTL(D,30); 
  214.   A = SHA_ROTL(B,5)+SHA_F1(C,D,E)+A+ctx->W[14]+0x5a827999L; C=SHA_ROTL(C,30); 
  215.   E = SHA_ROTL(A,5)+SHA_F1(B,C,D)+E+ctx->W[15]+0x5a827999L; B=SHA_ROTL(B,30); 
  216.   D = SHA_ROTL(E,5)+SHA_F1(A,B,C)+D+ctx->W[16]+0x5a827999L; A=SHA_ROTL(A,30); 
  217.   C = SHA_ROTL(D,5)+SHA_F1(E,A,B)+C+ctx->W[17]+0x5a827999L; E=SHA_ROTL(E,30); 
  218.   B = SHA_ROTL(C,5)+SHA_F1(D,E,A)+B+ctx->W[18]+0x5a827999L; D=SHA_ROTL(D,30); 
  219.   A = SHA_ROTL(B,5)+SHA_F1(C,D,E)+A+ctx->W[19]+0x5a827999L; C=SHA_ROTL(C,30); 
  220.   E = SHA_ROTL(A,5)+SHA_F2(B,C,D)+E+ctx->W[20]+0x6ed9eba1L; B=SHA_ROTL(B,30); 
  221.   D = SHA_ROTL(E,5)+SHA_F2(A,B,C)+D+ctx->W[21]+0x6ed9eba1L; A=SHA_ROTL(A,30); 
  222.   C = SHA_ROTL(D,5)+SHA_F2(E,A,B)+C+ctx->W[22]+0x6ed9eba1L; E=SHA_ROTL(E,30); 
  223.   B = SHA_ROTL(C,5)+SHA_F2(D,E,A)+B+ctx->W[23]+0x6ed9eba1L; D=SHA_ROTL(D,30); 
  224.   A = SHA_ROTL(B,5)+SHA_F2(C,D,E)+A+ctx->W[24]+0x6ed9eba1L; C=SHA_ROTL(C,30); 
  225.   E = SHA_ROTL(A,5)+SHA_F2(B,C,D)+E+ctx->W[25]+0x6ed9eba1L; B=SHA_ROTL(B,30); 
  226.   D = SHA_ROTL(E,5)+SHA_F2(A,B,C)+D+ctx->W[26]+0x6ed9eba1L; A=SHA_ROTL(A,30); 
  227.   C = SHA_ROTL(D,5)+SHA_F2(E,A,B)+C+ctx->W[27]+0x6ed9eba1L; E=SHA_ROTL(E,30); 
  228.   B = SHA_ROTL(C,5)+SHA_F2(D,E,A)+B+ctx->W[28]+0x6ed9eba1L; D=SHA_ROTL(D,30); 
  229.   A = SHA_ROTL(B,5)+SHA_F2(C,D,E)+A+ctx->W[29]+0x6ed9eba1L; C=SHA_ROTL(C,30); 
  230.   E = SHA_ROTL(A,5)+SHA_F2(B,C,D)+E+ctx->W[30]+0x6ed9eba1L; B=SHA_ROTL(B,30); 
  231.   D = SHA_ROTL(E,5)+SHA_F2(A,B,C)+D+ctx->W[31]+0x6ed9eba1L; A=SHA_ROTL(A,30); 
  232.   C = SHA_ROTL(D,5)+SHA_F2(E,A,B)+C+ctx->W[32]+0x6ed9eba1L; E=SHA_ROTL(E,30); 
  233.   B = SHA_ROTL(C,5)+SHA_F2(D,E,A)+B+ctx->W[33]+0x6ed9eba1L; D=SHA_ROTL(D,30); 
  234.   A = SHA_ROTL(B,5)+SHA_F2(C,D,E)+A+ctx->W[34]+0x6ed9eba1L; C=SHA_ROTL(C,30); 
  235.   E = SHA_ROTL(A,5)+SHA_F2(B,C,D)+E+ctx->W[35]+0x6ed9eba1L; B=SHA_ROTL(B,30); 
  236.   D = SHA_ROTL(E,5)+SHA_F2(A,B,C)+D+ctx->W[36]+0x6ed9eba1L; A=SHA_ROTL(A,30); 
  237.   C = SHA_ROTL(D,5)+SHA_F2(E,A,B)+C+ctx->W[37]+0x6ed9eba1L; E=SHA_ROTL(E,30); 
  238.   B = SHA_ROTL(C,5)+SHA_F2(D,E,A)+B+ctx->W[38]+0x6ed9eba1L; D=SHA_ROTL(D,30); 
  239.   A = SHA_ROTL(B,5)+SHA_F2(C,D,E)+A+ctx->W[39]+0x6ed9eba1L; C=SHA_ROTL(C,30); 
  240.   E = SHA_ROTL(A,5)+SHA_F3(B,C,D)+E+ctx->W[40]+0x8f1bbcdcL; B=SHA_ROTL(B,30); 
  241.   D = SHA_ROTL(E,5)+SHA_F3(A,B,C)+D+ctx->W[41]+0x8f1bbcdcL; A=SHA_ROTL(A,30); 
  242.   C = SHA_ROTL(D,5)+SHA_F3(E,A,B)+C+ctx->W[42]+0x8f1bbcdcL; E=SHA_ROTL(E,30); 
  243.   B = SHA_ROTL(C,5)+SHA_F3(D,E,A)+B+ctx->W[43]+0x8f1bbcdcL; D=SHA_ROTL(D,30); 
  244.   A = SHA_ROTL(B,5)+SHA_F3(C,D,E)+A+ctx->W[44]+0x8f1bbcdcL; C=SHA_ROTL(C,30); 
  245.   E = SHA_ROTL(A,5)+SHA_F3(B,C,D)+E+ctx->W[45]+0x8f1bbcdcL; B=SHA_ROTL(B,30); 
  246.   D = SHA_ROTL(E,5)+SHA_F3(A,B,C)+D+ctx->W[46]+0x8f1bbcdcL; A=SHA_ROTL(A,30); 
  247.   C = SHA_ROTL(D,5)+SHA_F3(E,A,B)+C+ctx->W[47]+0x8f1bbcdcL; E=SHA_ROTL(E,30); 
  248.   B = SHA_ROTL(C,5)+SHA_F3(D,E,A)+B+ctx->W[48]+0x8f1bbcdcL; D=SHA_ROTL(D,30); 
  249.   A = SHA_ROTL(B,5)+SHA_F3(C,D,E)+A+ctx->W[49]+0x8f1bbcdcL; C=SHA_ROTL(C,30); 
  250.   E = SHA_ROTL(A,5)+SHA_F3(B,C,D)+E+ctx->W[50]+0x8f1bbcdcL; B=SHA_ROTL(B,30); 
  251.   D = SHA_ROTL(E,5)+SHA_F3(A,B,C)+D+ctx->W[51]+0x8f1bbcdcL; A=SHA_ROTL(A,30); 
  252.   C = SHA_ROTL(D,5)+SHA_F3(E,A,B)+C+ctx->W[52]+0x8f1bbcdcL; E=SHA_ROTL(E,30); 
  253.   B = SHA_ROTL(C,5)+SHA_F3(D,E,A)+B+ctx->W[53]+0x8f1bbcdcL; D=SHA_ROTL(D,30); 
  254.   A = SHA_ROTL(B,5)+SHA_F3(C,D,E)+A+ctx->W[54]+0x8f1bbcdcL; C=SHA_ROTL(C,30); 
  255.   E = SHA_ROTL(A,5)+SHA_F3(B,C,D)+E+ctx->W[55]+0x8f1bbcdcL; B=SHA_ROTL(B,30); 
  256.   D = SHA_ROTL(E,5)+SHA_F3(A,B,C)+D+ctx->W[56]+0x8f1bbcdcL; A=SHA_ROTL(A,30); 
  257.   C = SHA_ROTL(D,5)+SHA_F3(E,A,B)+C+ctx->W[57]+0x8f1bbcdcL; E=SHA_ROTL(E,30); 
  258.   B = SHA_ROTL(C,5)+SHA_F3(D,E,A)+B+ctx->W[58]+0x8f1bbcdcL; D=SHA_ROTL(D,30); 
  259.   A = SHA_ROTL(B,5)+SHA_F3(C,D,E)+A+ctx->W[59]+0x8f1bbcdcL; C=SHA_ROTL(C,30); 
  260.   E = SHA_ROTL(A,5)+SHA_F4(B,C,D)+E+ctx->W[60]+0xca62c1d6L; B=SHA_ROTL(B,30); 
  261.   D = SHA_ROTL(E,5)+SHA_F4(A,B,C)+D+ctx->W[61]+0xca62c1d6L; A=SHA_ROTL(A,30); 
  262.   C = SHA_ROTL(D,5)+SHA_F4(E,A,B)+C+ctx->W[62]+0xca62c1d6L; E=SHA_ROTL(E,30); 
  263.   B = SHA_ROTL(C,5)+SHA_F4(D,E,A)+B+ctx->W[63]+0xca62c1d6L; D=SHA_ROTL(D,30); 
  264.   A = SHA_ROTL(B,5)+SHA_F4(C,D,E)+A+ctx->W[64]+0xca62c1d6L; C=SHA_ROTL(C,30); 
  265.   E = SHA_ROTL(A,5)+SHA_F4(B,C,D)+E+ctx->W[65]+0xca62c1d6L; B=SHA_ROTL(B,30); 
  266.   D = SHA_ROTL(E,5)+SHA_F4(A,B,C)+D+ctx->W[66]+0xca62c1d6L; A=SHA_ROTL(A,30); 
  267.   C = SHA_ROTL(D,5)+SHA_F4(E,A,B)+C+ctx->W[67]+0xca62c1d6L; E=SHA_ROTL(E,30); 
  268.   B = SHA_ROTL(C,5)+SHA_F4(D,E,A)+B+ctx->W[68]+0xca62c1d6L; D=SHA_ROTL(D,30); 
  269.   A = SHA_ROTL(B,5)+SHA_F4(C,D,E)+A+ctx->W[69]+0xca62c1d6L; C=SHA_ROTL(C,30); 
  270.   E = SHA_ROTL(A,5)+SHA_F4(B,C,D)+E+ctx->W[70]+0xca62c1d6L; B=SHA_ROTL(B,30); 
  271.   D = SHA_ROTL(E,5)+SHA_F4(A,B,C)+D+ctx->W[71]+0xca62c1d6L; A=SHA_ROTL(A,30); 
  272.   C = SHA_ROTL(D,5)+SHA_F4(E,A,B)+C+ctx->W[72]+0xca62c1d6L; E=SHA_ROTL(E,30); 
  273.   B = SHA_ROTL(C,5)+SHA_F4(D,E,A)+B+ctx->W[73]+0xca62c1d6L; D=SHA_ROTL(D,30); 
  274.   A = SHA_ROTL(B,5)+SHA_F4(C,D,E)+A+ctx->W[74]+0xca62c1d6L; C=SHA_ROTL(C,30); 
  275.   E = SHA_ROTL(A,5)+SHA_F4(B,C,D)+E+ctx->W[75]+0xca62c1d6L; B=SHA_ROTL(B,30); 
  276.   D = SHA_ROTL(E,5)+SHA_F4(A,B,C)+D+ctx->W[76]+0xca62c1d6L; A=SHA_ROTL(A,30); 
  277.   C = SHA_ROTL(D,5)+SHA_F4(E,A,B)+C+ctx->W[77]+0xca62c1d6L; E=SHA_ROTL(E,30); 
  278.   B = SHA_ROTL(C,5)+SHA_F4(D,E,A)+B+ctx->W[78]+0xca62c1d6L; D=SHA_ROTL(D,30); 
  279.   A = SHA_ROTL(B,5)+SHA_F4(C,D,E)+A+ctx->W[79]+0xca62c1d6L; C=SHA_ROTL(C,30); 
  280.   ctx->H[0] += A;
  281.   ctx->H[1] += B;
  282.   ctx->H[2] += C;
  283.   ctx->H[3] += D;
  284.   ctx->H[4] += E;
  285. }
  286. /*************************************************************************
  287. ** Code below this line added to make SHA code support BLAPI interface
  288. */
  289. SHA1Context *
  290. SHA1_NewContext(void)
  291. {
  292.     SHA1Context *cx;
  293.     cx = PORT_ZNew(SHA1Context);
  294.     return cx;
  295. }
  296. void
  297. SHA1_DestroyContext(SHA1Context *cx, PRBool freeit)
  298. {
  299.     if (freeit) {
  300.         PORT_ZFree(cx, sizeof(SHA1Context));
  301.     }
  302. }
  303. SECStatus
  304. SHA1_HashBuf(unsigned char *dest, const unsigned char *src, uint32 src_length)
  305. {
  306.     SHA1Context ctx;
  307.     unsigned int outLen;
  308.     SHA1_Begin(&ctx);
  309.     SHA1_Update(&ctx, src, src_length);
  310.     SHA1_End(&ctx, dest, &outLen, SHA1_LENGTH);
  311.     return SECSuccess;
  312. }
  313. /* Hash a null-terminated character string. */
  314. SECStatus
  315. SHA1_Hash(unsigned char *dest, const char *src)
  316. {
  317.     return SHA1_HashBuf(dest, (const unsigned char *)src, PORT_Strlen (src));
  318. }
  319. /*
  320.  * need to support save/restore state in pkcs11. Stores all the info necessary
  321.  * for a structure into just a stream of bytes.
  322.  */
  323. unsigned int
  324. SHA1_FlattenSize(SHA1Context *cx)
  325. {
  326.     return sizeof(SHA1Context);
  327. }
  328. SECStatus
  329. SHA1_Flatten(SHA1Context *cx,unsigned char *space)
  330. {
  331.     PORT_Memcpy(space,cx, sizeof(SHA1Context));
  332.     return SECSuccess;
  333. }
  334. SHA1Context *
  335. SHA1_Resurrect(unsigned char *space,void *arg)
  336. {
  337.     SHA1Context *cx = SHA1_NewContext();
  338.     if (cx == NULL) return NULL;
  339.     PORT_Memcpy(cx,space, sizeof(SHA1Context));
  340.     return cx;
  341. }
  342. #ifdef TRACING_SSL
  343. void
  344. SHA1_TraceState(SHA1Context *ctx)
  345. {
  346.     uint32        W;
  347.     int           i;
  348.     int           len;
  349.     int           fixWord = -1;
  350.     int           remainder; /* bytes in last word */
  351.     unsigned char buf[64 * 4];
  352.     SSL_TRC(99, ("%d: SSL: SHA1 state: %08x %08x %08x %08x %08x", SSL_GETPID(), 
  353.          ctx->H[0], ctx->H[1], ctx->H[2], ctx->H[3], ctx->H[4]));
  354.     len = (int)(ctx->sizeLo & 63);
  355.     remainder = len % 4;
  356.     if (remainder) 
  357.      fixWord = len - remainder;
  358.     for (i = 0; i < len; i++) {
  359. if (0 == (i % 4)) {
  360.     W = ctx->W[i / 4];
  361.     if (i == fixWord) {
  362.         W <<= 8 * (4 - remainder);
  363.     }
  364. }
  365. buf[i] = (unsigned char)(W >> 24);
  366. W <<= 8;
  367.     }
  368.     PRINT_BUF(99, (0, "SHA1_TraceState: buffered input", buf, len));
  369. }
  370. #endif