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

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 (Compact version)
  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 "sha.h"
  36. static void shaHashBlock(SHA_CTX *ctx);
  37. void shaInit(SHA_CTX *ctx) {
  38.   int i;
  39.   ctx->lenW = 0;
  40.   ctx->sizeHi = ctx->sizeLo = 0;
  41.   /* Initialize H with the magic constants (see FIPS180 for constants)
  42.    */
  43.   ctx->H[0] = 0x67452301L;
  44.   ctx->H[1] = 0xefcdab89L;
  45.   ctx->H[2] = 0x98badcfeL;
  46.   ctx->H[3] = 0x10325476L;
  47.   ctx->H[4] = 0xc3d2e1f0L;
  48.   for (i = 0; i < 80; i++)
  49.     ctx->W[i] = 0;
  50. }
  51. void shaUpdate(SHA_CTX *ctx, unsigned char *dataIn, int len) {
  52.   int i;
  53.   /* Read the data into W and process blocks as they get full
  54.    */
  55.   for (i = 0; i < len; i++) {
  56.     ctx->W[ctx->lenW / 4] <<= 8;
  57.     ctx->W[ctx->lenW / 4] |= (unsigned long)dataIn[i];
  58.     if ((++ctx->lenW) % 64 == 0) {
  59.       shaHashBlock(ctx);
  60.       ctx->lenW = 0;
  61.     }
  62.     ctx->sizeLo += 8;
  63.     ctx->sizeHi += (ctx->sizeLo < 8);
  64.   }
  65. }
  66. void shaFinal(SHA_CTX *ctx, unsigned char hashout[20]) {
  67.   unsigned char pad0x80 = 0x80;
  68.   unsigned char pad0x00 = 0x00;
  69.   unsigned char padlen[8];
  70.   int i;
  71.   /* Pad with a binary 1 (e.g. 0x80), then zeroes, then length
  72.    */
  73.   padlen[0] = (unsigned char)((ctx->sizeHi >> 24) & 255);
  74.   padlen[1] = (unsigned char)((ctx->sizeHi >> 16) & 255);
  75.   padlen[2] = (unsigned char)((ctx->sizeHi >> 8) & 255);
  76.   padlen[3] = (unsigned char)((ctx->sizeHi >> 0) & 255);
  77.   padlen[4] = (unsigned char)((ctx->sizeLo >> 24) & 255);
  78.   padlen[5] = (unsigned char)((ctx->sizeLo >> 16) & 255);
  79.   padlen[6] = (unsigned char)((ctx->sizeLo >> 8) & 255);
  80.   padlen[7] = (unsigned char)((ctx->sizeLo >> 0) & 255);
  81.   shaUpdate(ctx, &pad0x80, 1);
  82.   while (ctx->lenW != 56)
  83.     shaUpdate(ctx, &pad0x00, 1);
  84.   shaUpdate(ctx, padlen, 8);
  85.   /* Output hash
  86.    */
  87.   for (i = 0; i < 20; i++) {
  88.     hashout[i] = (unsigned char)(ctx->H[i / 4] >> 24);
  89.     ctx->H[i / 4] <<= 8;
  90.   }
  91.   /*
  92.    *  Re-initialize the context (also zeroizes contents)
  93.    */
  94.   shaInit(ctx);
  95. }
  96. void shaBlock(unsigned char *dataIn, int len, unsigned char hashout[20]) {
  97.   SHA_CTX ctx;
  98.   shaInit(&ctx);
  99.   shaUpdate(&ctx, dataIn, len);
  100.   shaFinal(&ctx, hashout);
  101. }
  102. #define SHA_ROTL(X,n) (((X) << (n)) | ((X) >> (32-(n))))
  103. static void shaHashBlock(SHA_CTX *ctx) {
  104.   int t;
  105.   unsigned long A,B,C,D,E,TEMP;
  106.   for (t = 16; t <= 79; t++)
  107.     ctx->W[t] =
  108.       SHA_ROTL(ctx->W[t-3] ^ ctx->W[t-8] ^ ctx->W[t-14] ^ ctx->W[t-16], 1);
  109.   A = ctx->H[0];
  110.   B = ctx->H[1];
  111.   C = ctx->H[2];
  112.   D = ctx->H[3];
  113.   E = ctx->H[4];
  114.   for (t = 0; t <= 19; t++) {
  115.     TEMP = SHA_ROTL(A,5) + (((C^D)&B)^D)     + E + ctx->W[t] + 0x5a827999L;
  116.     E = D; D = C; C = SHA_ROTL(B, 30); B = A; A = TEMP;
  117.   }
  118.   for (t = 20; t <= 39; t++) {
  119.     TEMP = SHA_ROTL(A,5) + (B^C^D)           + E + ctx->W[t] + 0x6ed9eba1L;
  120.     E = D; D = C; C = SHA_ROTL(B, 30); B = A; A = TEMP;
  121.   }
  122.   for (t = 40; t <= 59; t++) {
  123.     TEMP = SHA_ROTL(A,5) + ((B&C)|(D&(B|C))) + E + ctx->W[t] + 0x8f1bbcdcL;
  124.     E = D; D = C; C = SHA_ROTL(B, 30); B = A; A = TEMP;
  125.   }
  126.   for (t = 60; t <= 79; t++) {
  127.     TEMP = SHA_ROTL(A,5) + (B^C^D)           + E + ctx->W[t] + 0xca62c1d6L;
  128.     E = D; D = C; C = SHA_ROTL(B, 30); B = A; A = TEMP;
  129.   }
  130.   ctx->H[0] += A;
  131.   ctx->H[1] += B;
  132.   ctx->H[2] += C;
  133.   ctx->H[3] += D;
  134.   ctx->H[4] += E;
  135. }