SHA1Digest.java
上传用户:lior1029
上传日期:2013-05-07
资源大小:209k
文件大小:5k
源码类别:

CA认证

开发平台:

Java

  1. package org.bouncycastle.crypto.digests;
  2. import org.bouncycastle.crypto.Digest;
  3. /**
  4.  * implementation of SHA-1 as outlined in "Handbook of Applied Cryptography", pages 346 - 349.
  5.  *
  6.  * It is interesting to ponder why the, apart from the extra IV, the other difference here from MD5
  7.  * is the "endienness" of the word processing!
  8.  */
  9. public class SHA1Digest
  10.     extends GeneralDigest
  11. {
  12.     private static final int    DIGEST_LENGTH = 20;
  13.     private int     H1, H2, H3, H4, H5;
  14.     private int[]   X = new int[80];
  15.     private int     xOff;
  16. /**
  17.  * Standard constructor
  18.  */
  19.     public SHA1Digest()
  20.     {
  21.         reset();
  22.     }
  23. /**
  24.  * Copy constructor.  This will copy the state of the provided
  25.  * message digest.
  26.  */
  27. public SHA1Digest(SHA1Digest t)
  28. {
  29. super(t);
  30. H1 = t.H1;
  31. H2 = t.H2;
  32. H3 = t.H3;
  33. H4 = t.H4;
  34. H5 = t.H5;
  35. System.arraycopy(t.X, 0, X, 0, t.X.length);
  36. xOff = t.xOff;
  37. }
  38.     public String getAlgorithmName()
  39.     {
  40.         return "SHA-1";
  41.     }
  42.     public int getDigestSize()
  43.     {
  44.         return DIGEST_LENGTH;
  45.     }
  46.     protected void processWord(
  47.         byte[]  in,
  48.         int     inOff)
  49.     {
  50.         X[xOff++] = ((in[inOff] & 0xff) << 24) | ((in[inOff + 1] & 0xff) << 16)
  51.                     | ((in[inOff + 2] & 0xff) << 8) | ((in[inOff + 3] & 0xff)); 
  52.         if (xOff == 16)
  53.         {
  54.             processBlock();
  55.         }
  56.     }
  57.     private void unpackWord(
  58.         int     word,
  59.         byte[]  out,
  60.         int     outOff)
  61.     {
  62.         out[outOff]     = (byte)(word >>> 24);
  63.         out[outOff + 1] = (byte)(word >>> 16);
  64.         out[outOff + 2] = (byte)(word >>> 8);
  65.         out[outOff + 3] = (byte)word;
  66.     }
  67.     protected void processLength(
  68.         long    bitLength)
  69.     {
  70.         if (xOff > 14)
  71.         {
  72.             processBlock();
  73.         }
  74.         X[14] = (int)(bitLength >>> 32);
  75.         X[15] = (int)(bitLength & 0xffffffff);
  76.     }
  77.     public int doFinal(
  78.         byte[]  out,
  79.         int     outOff)
  80.     {
  81.         finish();
  82.         unpackWord(H1, out, outOff);
  83.         unpackWord(H2, out, outOff + 4);
  84.         unpackWord(H3, out, outOff + 8);
  85.         unpackWord(H4, out, outOff + 12);
  86.         unpackWord(H5, out, outOff + 16);
  87.         reset();
  88.         return DIGEST_LENGTH;
  89.     }
  90.     /**
  91.      * reset the chaining variables
  92.      */
  93.     public void reset()
  94.     {
  95.         super.reset();
  96.         H1 = 0x67452301;
  97.         H2 = 0xefcdab89;
  98.         H3 = 0x98badcfe;
  99.         H4 = 0x10325476;
  100.         H5 = 0xc3d2e1f0;
  101.         xOff = 0;
  102.         for (int i = 0; i != X.length; i++)
  103.         {
  104.             X[i] = 0;
  105.         }
  106.     }
  107.     //
  108.     // Additive constants
  109.     //
  110.     private static final int    Y1 = 0x5a827999;
  111.     private static final int    Y2 = 0x6ed9eba1;
  112.     private static final int    Y3 = 0x8f1bbcdc;
  113.     private static final int    Y4 = 0xca62c1d6;
  114.     private int f(
  115.         int    u,
  116.         int    v,
  117.         int    w)
  118.     {
  119.         return ((u & v) | ((~u) & w));
  120.     }
  121.     private int h(
  122.         int    u,
  123.         int    v,
  124.         int    w)
  125.     {
  126.         return (u ^ v ^ w);
  127.     }
  128.     private int g(
  129.         int    u,
  130.         int    v,
  131.         int    w)
  132.     {
  133.         return ((u & v) | (u & w) | (v & w));
  134.     }
  135.     private int rotateLeft(
  136.         int    x,
  137.         int    n)
  138.     {
  139.         return (x << n) | (x >>> (32 - n));
  140.     }
  141.     protected void processBlock()
  142.     {
  143.         //
  144.         // expand 16 word block into 80 word block.
  145.         //
  146.         for (int i = 16; i <= 79; i++)
  147.         {
  148.             X[i] = rotateLeft((X[i - 3] ^ X[i - 8] ^ X[i - 14] ^ X[i - 16]), 1);
  149.         }
  150.         //
  151.         // set up working variables.
  152.         //
  153.         int     A = H1;
  154.         int     B = H2;
  155.         int     C = H3;
  156.         int     D = H4;
  157.         int     E = H5;
  158.         //
  159.         // round 1
  160.         //
  161.         for (int j = 0; j <= 19; j++)
  162.         {
  163.             int     t = rotateLeft(A, 5) + f(B, C, D) + E + X[j] + Y1;
  164.             E = D;
  165.             D = C;
  166.             C = rotateLeft(B, 30);
  167.             B = A;
  168.             A = t;
  169.         }
  170.         //
  171.         // round 2
  172.         //
  173.         for (int j = 20; j <= 39; j++)
  174.         {
  175.             int     t = rotateLeft(A, 5) + h(B, C, D) + E + X[j] + Y2;
  176.             E = D;
  177.             D = C;
  178.             C = rotateLeft(B, 30);
  179.             B = A;
  180.             A = t;
  181.         }
  182.         //
  183.         // round 3
  184.         //
  185.         for (int j = 40; j <= 59; j++)
  186.         {
  187.             int     t = rotateLeft(A, 5) + g(B, C, D) + E + X[j] + Y3;
  188.             E = D;
  189.             D = C;
  190.             C = rotateLeft(B, 30);
  191.             B = A;
  192.             A = t;
  193.         }
  194.         //
  195.         // round 4
  196.         //
  197.         for (int j = 60; j <= 79; j++)
  198.         {
  199.             int     t = rotateLeft(A, 5) + h(B, C, D) + E + X[j] + Y4;
  200.             E = D;
  201.             D = C;
  202.             C = rotateLeft(B, 30);
  203.             B = A;
  204.             A = t;
  205.         }
  206.         H1 += A;
  207.         H2 += B;
  208.         H3 += C;
  209.         H4 += D;
  210.         H5 += E;
  211.         //
  212.         // reset the offset and clean out the word buffer.
  213.         //
  214.         xOff = 0;
  215.         for (int i = 0; i != X.length; i++)
  216.         {
  217.             X[i] = 0;
  218.         }
  219.     }
  220. }