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

CA认证

开发平台:

Java

  1. package org.bouncycastle.crypto.digests;
  2. import org.bouncycastle.crypto.Digest;
  3. /**
  4.  * Draft FIPS 180-2 implementation of SHA-256. <b>Note:</b> As this is
  5.  * based on a draft this implementation is subject to change.
  6.  *
  7.  * <pre>
  8.  *         block  word  digest
  9.  * SHA-1   512    32    160
  10.  * SHA-256 512    32    256
  11.  * SHA-384 1024   64    384
  12.  * SHA-512 1024   64    512
  13.  * </pre>
  14.  */
  15. public class SHA256Digest
  16.     extends GeneralDigest
  17. {
  18.     private static final int    DIGEST_LENGTH = 32;
  19.     private int     H1, H2, H3, H4, H5, H6, H7, H8;
  20.     private int[]   X = new int[64];
  21.     private int     xOff;
  22. /**
  23.  * Standard constructor
  24.  */
  25.     public SHA256Digest()
  26.     {
  27.         reset();
  28.     }
  29. /**
  30.  * Copy constructor.  This will copy the state of the provided
  31.  * message digest.
  32.  */
  33. public SHA256Digest(SHA256Digest t)
  34. {
  35. super(t);
  36. H1 = t.H1;
  37. H2 = t.H2;
  38. H3 = t.H3;
  39. H4 = t.H4;
  40. H5 = t.H5;
  41. H6 = t.H6;
  42. H7 = t.H7;
  43. H8 = t.H8;
  44. System.arraycopy(t.X, 0, X, 0, t.X.length);
  45. xOff = t.xOff;
  46. }
  47.     public String getAlgorithmName()
  48.     {
  49.         return "SHA-256";
  50.     }
  51.     public int getDigestSize()
  52.     {
  53.         return DIGEST_LENGTH;
  54.     }
  55.     protected void processWord(
  56.         byte[]  in,
  57.         int     inOff)
  58.     {
  59.         X[xOff++] = ((in[inOff] & 0xff) << 24) | ((in[inOff + 1] & 0xff) << 16)
  60.                     | ((in[inOff + 2] & 0xff) << 8) | ((in[inOff + 3] & 0xff)); 
  61.         if (xOff == 16)
  62.         {
  63.             processBlock();
  64.         }
  65.     }
  66.     private void unpackWord(
  67.         int     word,
  68.         byte[]  out,
  69.         int     outOff)
  70.     {
  71.         out[outOff]     = (byte)(word >>> 24);
  72.         out[outOff + 1] = (byte)(word >>> 16);
  73.         out[outOff + 2] = (byte)(word >>> 8);
  74.         out[outOff + 3] = (byte)word;
  75.     }
  76.     protected void processLength(
  77.         long    bitLength)
  78.     {
  79.         if (xOff > 14)
  80.         {
  81.             processBlock();
  82.         }
  83.         X[14] = (int)(bitLength >>> 32);
  84.         X[15] = (int)(bitLength & 0xffffffff);
  85.     }
  86.     public int doFinal(
  87.         byte[]  out,
  88.         int     outOff)
  89.     {
  90.         finish();
  91.         unpackWord(H1, out, outOff);
  92.         unpackWord(H2, out, outOff + 4);
  93.         unpackWord(H3, out, outOff + 8);
  94.         unpackWord(H4, out, outOff + 12);
  95.         unpackWord(H5, out, outOff + 16);
  96.         unpackWord(H6, out, outOff + 20);
  97.         unpackWord(H7, out, outOff + 24);
  98.         unpackWord(H8, out, outOff + 28);
  99.         reset();
  100.         return DIGEST_LENGTH;
  101.     }
  102.     /**
  103.      * reset the chaining variables
  104.      */
  105.     public void reset()
  106.     {
  107.         super.reset();
  108. /* SHA-256 initial hash value
  109.  * The first 32 bits of the fractional parts of the square roots
  110.  * of the first eight prime numbers
  111.  */
  112. H1 = 0x6a09e667;
  113. H2 = 0xbb67ae85;
  114. H3 = 0x3c6ef372;
  115. H4 = 0xa54ff53a;
  116. H5 = 0x510e527f;
  117. H6 = 0x9b05688c;
  118. H7 = 0x1f83d9ab;
  119. H8 = 0x5be0cd19;
  120.         xOff = 0;
  121.         for (int i = 0; i != X.length; i++)
  122.         {
  123.             X[i] = 0;
  124.         }
  125.     }
  126.     protected void processBlock()
  127.     {
  128.         //
  129.         // expand 16 word block into 64 word blocks.
  130.         //
  131.         for (int t = 16; t <= 63; t++)
  132.         {
  133.             X[t] = Theta1(X[t - 2]) + X[t - 7] + Theta0(X[t - 15]) + X[t - 16];
  134.         }
  135.         //
  136.         // set up working variables.
  137.         //
  138.         int     a = H1;
  139.         int     b = H2;
  140.         int     c = H3;
  141.         int     d = H4;
  142.         int     e = H5;
  143.         int     f = H6;
  144.         int     g = H7;
  145.         int     h = H8;
  146. for (int t = 0; t <= 63; t++)
  147. {
  148. int T1, T2;
  149. T1 = h + Sum1(e) + Ch(e, f, g) + K[t] + X[t];
  150. T2 = Sum0(a) + Maj(a, b, c);
  151. h = g;
  152. g = f;
  153. f = e;
  154. e = d + T1;
  155. d = c;
  156. c = b;
  157. b = a;
  158. a = T1 + T2;
  159. }
  160.         H1 += a;
  161.         H2 += b;
  162.         H3 += c;
  163.         H4 += d;
  164.         H5 += e;
  165.         H6 += f;
  166.         H7 += g;
  167.         H8 += h;
  168.         //
  169.         // reset the offset and clean out the word buffer.
  170.         //
  171.         xOff = 0;
  172.         for (int i = 0; i != X.length; i++)
  173.         {
  174.             X[i] = 0;
  175.         }
  176.     }
  177.     private int rotateRight(
  178.         int    x,
  179.         int    n)
  180.     {
  181.         return (x >>> n) | (x << (32 - n));
  182.     }
  183. /* SHA-256 functions */
  184.     private int Ch(
  185.         int    x,
  186.         int    y,
  187.         int    z)
  188.     {
  189.         return ((x & y) ^ ((~x) & z));
  190.     }
  191.     private int Maj(
  192.         int    x,
  193.         int    y,
  194.         int    z)
  195.     {
  196.         return ((x & y) ^ (x & z) ^ (y & z));
  197.     }
  198.     private int Sum0(
  199.         int    x)
  200.     {
  201.         return rotateRight(x, 2) ^ rotateRight(x, 13) ^ rotateRight(x, 22);
  202.     }
  203.     private int Sum1(
  204.         int    x)
  205.     {
  206.         return rotateRight(x, 6) ^ rotateRight(x, 11) ^ rotateRight(x, 25);
  207.     }
  208.     private int Theta0(
  209.         int    x)
  210.     {
  211.         return rotateRight(x, 7) ^ rotateRight(x, 18) ^ (x >>> 3);
  212.     }
  213.     private int Theta1(
  214.         int    x)
  215.     {
  216.         return rotateRight(x, 17) ^ rotateRight(x, 19) ^ (x >>> 10);
  217.     }
  218. /* SHA-256 Constants
  219.  * (represent the first 32 bits of the fractional parts of the
  220.      * cube roots of the first sixty-four prime numbers)
  221.  */
  222. static final int K[] = {
  223. 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
  224. 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
  225. 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
  226. 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
  227. 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
  228. 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
  229. 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
  230. };
  231. }