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

CA认证

开发平台:

Java

  1. package org.bouncycastle.crypto.digests;
  2. import org.bouncycastle.crypto.Digest;
  3. /**
  4.  * Base class for SHA-384 and SHA-512.
  5.  */
  6. public abstract class LongDigest
  7.     implements Digest
  8. {
  9.     private byte[]  xBuf;
  10.     private int     xBufOff;
  11.     private long    byteCount1;
  12.     private long    byteCount2;
  13.     protected long    H1, H2, H3, H4, H5, H6, H7, H8;
  14.     private long[]  W = new long[80];
  15.     private int     wOff;
  16. /**
  17.  * Constructor for variable length word
  18.  */
  19. protected LongDigest()
  20. {
  21. xBuf = new byte[8];
  22. xBufOff = 0;
  23.         reset();
  24. }
  25. /**
  26.  * Copy constructor.  We are using copy constructors in place
  27.  * of the Object.clone() interface as this interface is not
  28.  * supported by J2ME.
  29.  */
  30. protected LongDigest(LongDigest t)
  31. {
  32.         xBuf = new byte[t.xBuf.length];
  33. System.arraycopy(t.xBuf, 0, xBuf, 0, t.xBuf.length);
  34. xBufOff = t.xBufOff;
  35. byteCount1 = t.byteCount1;
  36. byteCount2 = t.byteCount2;
  37. H1 = t.H1;
  38. H2 = t.H2;
  39. H3 = t.H3;
  40. H4 = t.H4;
  41. H5 = t.H5;
  42. H6 = t.H6;
  43. H7 = t.H7;
  44. H8 = t.H8;
  45. System.arraycopy(t.W, 0, W, 0, t.W.length);
  46. wOff = t.wOff;
  47. }
  48.     public void update(
  49.         byte in)
  50.     {
  51.         xBuf[xBufOff++] = in;
  52.         if (xBufOff == xBuf.length)
  53.         {
  54.             processWord(xBuf, 0);
  55.             xBufOff = 0;
  56.         }
  57.         byteCount1++;
  58.     }
  59.     public void update(
  60.         byte[]  in,
  61.         int     inOff,
  62.         int     len)
  63.     {
  64.         //
  65.         // fill the current word
  66.         //
  67.         while ((xBufOff != 0) && (len > 0))
  68.         {
  69.             update(in[inOff]);
  70.             inOff++;
  71.             len--;
  72.         }
  73.         //
  74.         // process whole words.
  75.         //
  76.         while (len > xBuf.length)
  77.         {
  78.             processWord(in, inOff);
  79.             inOff += xBuf.length;
  80.             len -= xBuf.length;
  81.             byteCount1 += xBuf.length;
  82.         }
  83.         //
  84.         // load in the remainder.
  85.         //
  86.         while (len > 0)
  87.         {
  88.             update(in[inOff]);
  89.             inOff++;
  90.             len--;
  91.         }
  92.     }
  93.     public void finish()
  94.     {
  95.         adjustByteCounts();
  96.         long    lowBitLength = byteCount1 << 3;
  97.         long    hiBitLength = byteCount2;
  98.         //
  99.         // add the pad bytes.
  100.         //
  101.         update((byte)128);
  102.         while (xBufOff != 0)
  103.         {
  104.             update((byte)0);
  105.         }
  106.         processLength(lowBitLength, hiBitLength);
  107.         processBlock();
  108.     }
  109.     public void reset()
  110.     {
  111.         byteCount1 = 0;
  112.         byteCount2 = 0;
  113.         xBufOff = 0;
  114. for ( int i = 0; i < xBuf.length; i++ ) {
  115. xBuf[i] = 0;
  116. }
  117.         wOff = 0;
  118.         for (int i = 0; i != W.length; i++)
  119.         {
  120.             W[i] = 0;
  121.         }
  122.     }
  123.     protected void processWord(
  124.         byte[]  in,
  125.         int     inOff)
  126.     {
  127.         W[wOff++] = ((long)(in[inOff] & 0xff) << 56)
  128. | ((long)(in[inOff + 1] & 0xff) << 48)
  129.                     | ((long)(in[inOff + 2] & 0xff) << 40)
  130. | ((long)(in[inOff + 3] & 0xff) << 32)
  131.          | ((long)(in[inOff + 4] & 0xff) << 24)
  132. | ((long)(in[inOff + 5] & 0xff) << 16)
  133.                     | ((long)(in[inOff + 6] & 0xff) << 8)
  134. | ((long)(in[inOff + 7] & 0xff)); 
  135.         if (wOff == 16)
  136.         {
  137.             processBlock();
  138.         }
  139.     }
  140.     protected void unpackWord(
  141.         long    word,
  142.         byte[]  out,
  143.         int     outOff)
  144.     {
  145.         out[outOff]     = (byte)(word >>> 56);
  146.         out[outOff + 1] = (byte)(word >>> 48);
  147.         out[outOff + 2] = (byte)(word >>> 40);
  148.         out[outOff + 3] = (byte)(word >>> 32);
  149.         out[outOff + 4] = (byte)(word >>> 24);
  150.         out[outOff + 5] = (byte)(word >>> 16);
  151.         out[outOff + 6] = (byte)(word >>> 8);
  152.         out[outOff + 7] = (byte)word;
  153.     }
  154.     /**
  155.      * adjust the byte counts so that byteCount2 represents the
  156.      * upper long (less 3 bits) word of the byte count.
  157.      */
  158.     private void adjustByteCounts()
  159.     {
  160.         if (byteCount1 > 0x1fffffffffffffffL)
  161.         {
  162.             byteCount2 += (byteCount1 >>> 61);
  163.             byteCount1 &= 0x1fffffffffffffffL;
  164.         }
  165.     }
  166.     protected void processLength(
  167.         long    lowW,
  168.         long    hiW)
  169.     {
  170.         if (wOff > 14)
  171.         {
  172.             processBlock();
  173.         }
  174.         W[14] = hiW;
  175.         W[15] = lowW;
  176.     }
  177.     protected void processBlock()
  178.     {
  179.         adjustByteCounts();
  180.         //
  181.         // expand 16 word block into 80 word blocks.
  182.         //
  183.         for (int t = 16; t <= 79; t++)
  184.         {
  185.             W[t] = Sigma1(W[t - 2]) + W[t - 7] + Sigma0(W[t - 15]) + W[t - 16];
  186.         }
  187.         //
  188.         // set up working variables.
  189.         //
  190.         long     a = H1;
  191.         long     b = H2;
  192.         long     c = H3;
  193.         long     d = H4;
  194.         long     e = H5;
  195.         long     f = H6;
  196.         long     g = H7;
  197.         long     h = H8;
  198. for (int t = 0; t <= 79; t++)
  199. {
  200. long T1, T2;
  201. T1 = h + Sum1(e) + Ch(e, f, g) + K[t] + W[t];
  202. T2 = Sum0(a) + Maj(a, b, c);
  203. h = g;
  204. g = f;
  205. f = e;
  206. e = d + T1;
  207. d = c;
  208. c = b;
  209. b = a;
  210. a = T1 + T2;
  211. }
  212.         H1 += a;
  213.         H2 += b;
  214.         H3 += c;
  215.         H4 += d;
  216.         H5 += e;
  217.         H6 += f;
  218.         H7 += g;
  219.         H8 += h;
  220.         //
  221.         // reset the offset and clean out the word buffer.
  222.         //
  223.         wOff = 0;
  224.         for (int i = 0; i != W.length; i++)
  225.         {
  226.             W[i] = 0;
  227.         }
  228.     }
  229.     private long rotateRight(
  230.         long   x,
  231.         int    n)
  232.     {
  233.         return (x >>> n) | (x << (64 - n));
  234.     }
  235. /* SHA-384 and SHA-512 functions (as for SHA-256 but for longs) */
  236.     private long Ch(
  237.         long    x,
  238.         long    y,
  239.         long    z)
  240.     {
  241.         return ((x & y) ^ ((~x) & z));
  242.     }
  243.     private long Maj(
  244.         long    x,
  245.         long    y,
  246.         long    z)
  247.     {
  248.         return ((x & y) ^ (x & z) ^ (y & z));
  249.     }
  250.     private long Sum0(
  251.         long    x)
  252.     {
  253.         return rotateRight(x, 28) ^ rotateRight(x, 34) ^ rotateRight(x, 39);
  254.     }
  255.     private long Sum1(
  256.         long    x)
  257.     {
  258.         return rotateRight(x, 14) ^ rotateRight(x, 18) ^ rotateRight(x, 41);
  259.     }
  260.     private long Sigma0(
  261.         long    x)
  262.     {
  263.         return rotateRight(x, 1) ^ rotateRight(x, 8) ^ (x >>> 7);
  264.     }
  265.     private long Sigma1(
  266.         long    x)
  267.     {
  268.         return rotateRight(x, 19) ^ rotateRight(x, 61) ^ (x >>> 6);
  269.     }
  270. /* SHA-384 and SHA-512 Constants
  271.  * (represent the first 64 bits of the fractional parts of the
  272.      * cube roots of the first sixty-four prime numbers)
  273.  */
  274. static final long K[] = {
  275. 0x428a2f98d728ae22L, 0x7137449123ef65cdL, 0xb5c0fbcfec4d3b2fL, 0xe9b5dba58189dbbcL,
  276. 0x3956c25bf348b538L, 0x59f111f1b605d019L, 0x923f82a4af194f9bL, 0xab1c5ed5da6d8118L,
  277. 0xd807aa98a3030242L, 0x12835b0145706fbeL, 0x243185be4ee4b28cL, 0x550c7dc3d5ffb4e2L,
  278. 0x72be5d74f27b896fL, 0x80deb1fe3b1696b1L, 0x9bdc06a725c71235L, 0xc19bf174cf692694L,
  279. 0xe49b69c19ef14ad2L, 0xefbe4786384f25e3L, 0x0fc19dc68b8cd5b5L, 0x240ca1cc77ac9c65L,
  280. 0x2de92c6f592b0275L, 0x4a7484aa6ea6e483L, 0x5cb0a9dcbd41fbd4L, 0x76f988da831153b5L,
  281. 0x983e5152ee66dfabL, 0xa831c66d2db43210L, 0xb00327c898fb213fL, 0xbf597fc7beef0ee4L,
  282. 0xc6e00bf33da88fc2L, 0xd5a79147930aa725L, 0x06ca6351e003826fL, 0x142929670a0e6e70L,
  283. 0x27b70a8546d22ffcL, 0x2e1b21385c26c926L, 0x4d2c6dfc5ac42aedL, 0x53380d139d95b3dfL,
  284. 0x650a73548baf63deL, 0x766a0abb3c77b2a8L, 0x81c2c92e47edaee6L, 0x92722c851482353bL,
  285. 0xa2bfe8a14cf10364L, 0xa81a664bbc423001L, 0xc24b8b70d0f89791L, 0xc76c51a30654be30L,
  286. 0xd192e819d6ef5218L, 0xd69906245565a910L, 0xf40e35855771202aL, 0x106aa07032bbd1b8L,
  287. 0x19a4c116b8d2d0c8L, 0x1e376c085141ab53L, 0x2748774cdf8eeb99L, 0x34b0bcb5e19b48a8L,
  288. 0x391c0cb3c5c95a63L, 0x4ed8aa4ae3418acbL, 0x5b9cca4f7763e373L, 0x682e6ff3d6b2b8a3L,
  289. 0x748f82ee5defb2fcL, 0x78a5636f43172f60L, 0x84c87814a1f0ab72L, 0x8cc702081a6439ecL,
  290. 0x90befffa23631e28L, 0xa4506cebde82bde9L, 0xbef9a3f7b2c67915L, 0xc67178f2e372532bL,
  291. 0xca273eceea26619cL, 0xd186b8c721c0c207L, 0xeada7dd6cde0eb1eL, 0xf57d4f7fee6ed178L,
  292. 0x06f067aa72176fbaL, 0x0a637dc5a2c898a6L, 0x113f9804bef90daeL, 0x1b710b35131c471bL,
  293. 0x28db77f523047d84L, 0x32caab7b40c72493L, 0x3c9ebe0a15c9bebcL, 0x431d67c49c100d4cL,
  294. 0x4cc5d4becb3e42b6L, 0x597f299cfc657e2aL, 0x5fcb6fab3ad6faecL, 0x6c44198c4a475817L
  295. };
  296. }