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

CA认证

开发平台:

Java

  1. package org.bouncycastle.crypto.digests;
  2. import org.bouncycastle.crypto.Digest;
  3. /**
  4.  * implementation of RIPEMD128
  5.  */
  6. public class RIPEMD128Digest
  7.     extends GeneralDigest
  8. {
  9. private static final int DIGEST_LENGTH = 16;
  10. private int H0, H1, H2, H3; // IV's
  11. private int[] X = new int[16];
  12. private int xOff;
  13. /**
  14.  * Standard constructor
  15.  */
  16. public RIPEMD128Digest()
  17. {
  18. reset();
  19. }
  20. /**
  21.  * Copy constructor.  This will copy the state of the provided
  22.  * message digest.
  23.  */
  24. public RIPEMD128Digest(RIPEMD128Digest t)
  25. {
  26. super(t);
  27. H0 = t.H0;
  28. H1 = t.H1;
  29. H2 = t.H2;
  30. H3 = t.H3;
  31. System.arraycopy(t.X, 0, X, 0, t.X.length);
  32. xOff = t.xOff;
  33. }
  34. public String getAlgorithmName()
  35. {
  36. return "RIPEMD128";
  37. }
  38. public int getDigestSize()
  39. {
  40. return DIGEST_LENGTH;
  41. }
  42. protected void processWord(
  43. byte[] in,
  44. int inOff)
  45. {
  46. X[xOff++] = (in[inOff] & 0xff) | ((in[inOff + 1] & 0xff) << 8)
  47. | ((in[inOff + 2] & 0xff) << 16) | ((in[inOff + 3] & 0xff) << 24); 
  48. if (xOff == 16)
  49. {
  50. processBlock();
  51. }
  52. }
  53. protected void processLength(
  54. long bitLength)
  55. {
  56. if (xOff > 14)
  57. {
  58. processBlock();
  59. }
  60. X[14] = (int)(bitLength & 0xffffffff);
  61. X[15] = (int)(bitLength >>> 32);
  62. }
  63. private void unpackWord(
  64. int word,
  65. byte[] out,
  66. int outOff)
  67. {
  68. out[outOff]     = (byte)word;
  69. out[outOff + 1] = (byte)(word >>> 8);
  70. out[outOff + 2] = (byte)(word >>> 16);
  71. out[outOff + 3] = (byte)(word >>> 24);
  72. }
  73. public int doFinal(
  74. byte[] out,
  75. int outOff)
  76. {
  77. finish();
  78. unpackWord(H0, out, outOff);
  79. unpackWord(H1, out, outOff + 4);
  80. unpackWord(H2, out, outOff + 8);
  81. unpackWord(H3, out, outOff + 12);
  82. reset();
  83. return DIGEST_LENGTH;
  84. }
  85. /**
  86. * reset the chaining variables to the IV values.
  87. */
  88. public void reset()
  89. {
  90. super.reset();
  91. H0 = 0x67452301;
  92. H1 = 0xefcdab89;
  93. H2 = 0x98badcfe;
  94. H3 = 0x10325476;
  95. xOff = 0;
  96. for (int i = 0; i != X.length; i++)
  97. {
  98. X[i] = 0;
  99. }
  100. }
  101. /*
  102.  * rotate int x left n bits.
  103.  */
  104. private final int RL(
  105. int x,
  106. int n)
  107. {
  108. return (x << n) | (x >>> (32 - n));
  109. }
  110. /*
  111.  * f1,f2,f3,f4 are the basic RIPEMD128 functions.
  112.  */
  113. /*
  114.  * F
  115.  */
  116. private final int f1(
  117. int x,
  118. int y,
  119. int z)
  120. {
  121. return x ^ y ^ z;
  122. }
  123. /*
  124.  * G
  125.  */
  126. private final int f2(
  127. int x,
  128. int y,
  129. int z)
  130. {
  131. return (x & y) | (~x & z);
  132. }
  133. /*
  134.  * H
  135.  */
  136. private final int f3(
  137. int x,
  138. int y,
  139. int z)
  140. {
  141. return (x | ~y) ^ z;
  142. }
  143. /*
  144.  * I
  145.  */
  146. private final int f4(
  147. int x,
  148. int y,
  149. int z)
  150. {
  151. return (x & z) | (y & ~z);
  152. }
  153.     private final int F1(
  154.         int a,
  155.         int b,
  156.         int c,
  157.         int d,
  158.         int x,
  159.         int s)
  160.     {
  161.         return RL(a + f1(b, c, d) + x, s);
  162.     }
  163.     private final int F2(
  164.         int a,
  165.         int b,
  166.         int c,
  167.         int d,
  168.         int x,
  169.         int s)
  170.     {
  171.         return RL(a + f2(b, c, d) + x + 0x5a827999, s);
  172.     }
  173.     private final int F3(
  174.         int a,
  175.         int b,
  176.         int c,
  177.         int d,
  178.         int x,
  179.         int s)
  180.     {
  181.         return RL(a + f3(b, c, d) + x + 0x6ed9eba1, s);
  182.     }
  183.     private final int F4(
  184.         int a,
  185.         int b,
  186.         int c,
  187.         int d,
  188.         int x,
  189.         int s)
  190.     {
  191.         return RL(a + f4(b, c, d) + x + 0x8f1bbcdc, s);
  192.     }
  193.     private final int FF1(
  194.         int a,
  195.         int b,
  196.         int c,
  197.         int d,
  198.         int x,
  199.         int s)
  200.     {
  201.         return RL(a + f1(b, c, d) + x, s);
  202.     }
  203.     private final int FF2(
  204.         int a,
  205.         int b,
  206.         int c,
  207.         int d,
  208.         int x,
  209.         int s)
  210.     {
  211.       return RL(a + f2(b, c, d) + x + 0x6d703ef3, s);
  212.     }
  213.     private final int FF3(
  214.         int a,
  215.         int b,
  216.         int c,
  217.         int d,
  218.         int x,
  219.         int s)
  220.     {
  221.       return RL(a + f3(b, c, d) + x + 0x5c4dd124, s);
  222.     }
  223.     private final int FF4(
  224.         int a,
  225.         int b,
  226.         int c,
  227.         int d,
  228.         int x,
  229.         int s)
  230.     {
  231.       return RL(a + f4(b, c, d) + x + 0x50a28be6, s);
  232.     }
  233. protected void processBlock()
  234. {
  235. int a, aa;
  236. int b, bb;
  237. int c, cc;
  238. int d, dd;
  239. a = aa = H0;
  240. b = bb = H1;
  241. c = cc = H2;
  242. d = dd = H3;
  243. //
  244. // Round 1
  245. //
  246.         a = F1(a, b, c, d, X[ 0], 11);
  247.         d = F1(d, a, b, c, X[ 1], 14);
  248.         c = F1(c, d, a, b, X[ 2], 15);
  249.         b = F1(b, c, d, a, X[ 3], 12);
  250.         a = F1(a, b, c, d, X[ 4],  5);
  251.         d = F1(d, a, b, c, X[ 5],  8);
  252.         c = F1(c, d, a, b, X[ 6],  7);
  253.         b = F1(b, c, d, a, X[ 7],  9);
  254.         a = F1(a, b, c, d, X[ 8], 11);
  255.         d = F1(d, a, b, c, X[ 9], 13);
  256.         c = F1(c, d, a, b, X[10], 14);
  257.         b = F1(b, c, d, a, X[11], 15);
  258.         a = F1(a, b, c, d, X[12],  6);
  259.         d = F1(d, a, b, c, X[13],  7);
  260.         c = F1(c, d, a, b, X[14],  9);
  261.         b = F1(b, c, d, a, X[15],  8);
  262. //
  263. // Round 2
  264. //
  265.         a = F2(a, b, c, d, X[ 7],  7);
  266.         d = F2(d, a, b, c, X[ 4],  6);
  267.         c = F2(c, d, a, b, X[13],  8);
  268.         b = F2(b, c, d, a, X[ 1], 13);
  269.         a = F2(a, b, c, d, X[10], 11);
  270.         d = F2(d, a, b, c, X[ 6],  9);
  271.         c = F2(c, d, a, b, X[15],  7);
  272.         b = F2(b, c, d, a, X[ 3], 15);
  273.         a = F2(a, b, c, d, X[12],  7);
  274.         d = F2(d, a, b, c, X[ 0], 12);
  275.         c = F2(c, d, a, b, X[ 9], 15);
  276.         b = F2(b, c, d, a, X[ 5],  9);
  277.         a = F2(a, b, c, d, X[ 2], 11);
  278.         d = F2(d, a, b, c, X[14],  7);
  279.         c = F2(c, d, a, b, X[11], 13);
  280.         b = F2(b, c, d, a, X[ 8], 12);
  281.         //
  282.         // Round 3
  283.         //
  284.         a = F3(a, b, c, d, X[ 3], 11);
  285.         d = F3(d, a, b, c, X[10], 13);
  286.         c = F3(c, d, a, b, X[14],  6);
  287.         b = F3(b, c, d, a, X[ 4],  7);
  288.         a = F3(a, b, c, d, X[ 9], 14);
  289.         d = F3(d, a, b, c, X[15],  9);
  290.         c = F3(c, d, a, b, X[ 8], 13);
  291.         b = F3(b, c, d, a, X[ 1], 15);
  292.         a = F3(a, b, c, d, X[ 2], 14);
  293.         d = F3(d, a, b, c, X[ 7],  8);
  294.         c = F3(c, d, a, b, X[ 0], 13);
  295.         b = F3(b, c, d, a, X[ 6],  6);
  296.         a = F3(a, b, c, d, X[13],  5);
  297.         d = F3(d, a, b, c, X[11], 12);
  298.         c = F3(c, d, a, b, X[ 5],  7);
  299.         b = F3(b, c, d, a, X[12],  5);
  300.         //
  301.         // Round 4
  302.         //
  303.         a = F4(a, b, c, d, X[ 1], 11);
  304.         d = F4(d, a, b, c, X[ 9], 12);
  305.         c = F4(c, d, a, b, X[11], 14);
  306.         b = F4(b, c, d, a, X[10], 15);
  307.         a = F4(a, b, c, d, X[ 0], 14);
  308.         d = F4(d, a, b, c, X[ 8], 15);
  309.         c = F4(c, d, a, b, X[12],  9);
  310.         b = F4(b, c, d, a, X[ 4],  8);
  311.         a = F4(a, b, c, d, X[13],  9);
  312.         d = F4(d, a, b, c, X[ 3], 14);
  313.         c = F4(c, d, a, b, X[ 7],  5);
  314.         b = F4(b, c, d, a, X[15],  6);
  315.         a = F4(a, b, c, d, X[14],  8);
  316.         d = F4(d, a, b, c, X[ 5],  6);
  317.         c = F4(c, d, a, b, X[ 6],  5);
  318.         b = F4(b, c, d, a, X[ 2], 12);
  319.         //
  320.         // Parallel round 1
  321.         //
  322.         aa = FF4(aa, bb, cc, dd, X[ 5],  8);
  323.         dd = FF4(dd, aa, bb, cc, X[14],  9);
  324.         cc = FF4(cc, dd, aa, bb, X[ 7],  9);
  325.         bb = FF4(bb, cc, dd, aa, X[ 0], 11);
  326.         aa = FF4(aa, bb, cc, dd, X[ 9], 13);
  327.         dd = FF4(dd, aa, bb, cc, X[ 2], 15);
  328.         cc = FF4(cc, dd, aa, bb, X[11], 15);
  329.         bb = FF4(bb, cc, dd, aa, X[ 4],  5);
  330.         aa = FF4(aa, bb, cc, dd, X[13],  7);
  331.         dd = FF4(dd, aa, bb, cc, X[ 6],  7);
  332.         cc = FF4(cc, dd, aa, bb, X[15],  8);
  333.         bb = FF4(bb, cc, dd, aa, X[ 8], 11);
  334.         aa = FF4(aa, bb, cc, dd, X[ 1], 14);
  335.         dd = FF4(dd, aa, bb, cc, X[10], 14);
  336.         cc = FF4(cc, dd, aa, bb, X[ 3], 12);
  337.         bb = FF4(bb, cc, dd, aa, X[12],  6);
  338.         //
  339.         // Parallel round 2
  340.         //
  341.         aa = FF3(aa, bb, cc, dd, X[ 6],  9);
  342.         dd = FF3(dd, aa, bb, cc, X[11], 13);
  343.         cc = FF3(cc, dd, aa, bb, X[ 3], 15);
  344.         bb = FF3(bb, cc, dd, aa, X[ 7],  7);
  345.         aa = FF3(aa, bb, cc, dd, X[ 0], 12);
  346.         dd = FF3(dd, aa, bb, cc, X[13],  8);
  347.         cc = FF3(cc, dd, aa, bb, X[ 5],  9);
  348.         bb = FF3(bb, cc, dd, aa, X[10], 11);
  349.         aa = FF3(aa, bb, cc, dd, X[14],  7);
  350.         dd = FF3(dd, aa, bb, cc, X[15],  7);
  351.         cc = FF3(cc, dd, aa, bb, X[ 8], 12);
  352.         bb = FF3(bb, cc, dd, aa, X[12],  7);
  353.         aa = FF3(aa, bb, cc, dd, X[ 4],  6);
  354.         dd = FF3(dd, aa, bb, cc, X[ 9], 15);
  355.         cc = FF3(cc, dd, aa, bb, X[ 1], 13);
  356.         bb = FF3(bb, cc, dd, aa, X[ 2], 11);
  357.         //
  358.         // Parallel round 3
  359.         //
  360.         aa = FF2(aa, bb, cc, dd, X[15],  9);
  361.         dd = FF2(dd, aa, bb, cc, X[ 5],  7);
  362.         cc = FF2(cc, dd, aa, bb, X[ 1], 15);
  363.         bb = FF2(bb, cc, dd, aa, X[ 3], 11);
  364.         aa = FF2(aa, bb, cc, dd, X[ 7],  8);
  365.         dd = FF2(dd, aa, bb, cc, X[14],  6);
  366.         cc = FF2(cc, dd, aa, bb, X[ 6],  6);
  367.         bb = FF2(bb, cc, dd, aa, X[ 9], 14);
  368.         aa = FF2(aa, bb, cc, dd, X[11], 12);
  369.         dd = FF2(dd, aa, bb, cc, X[ 8], 13);
  370.         cc = FF2(cc, dd, aa, bb, X[12],  5);
  371.         bb = FF2(bb, cc, dd, aa, X[ 2], 14);
  372.         aa = FF2(aa, bb, cc, dd, X[10], 13);
  373.         dd = FF2(dd, aa, bb, cc, X[ 0], 13);
  374.         cc = FF2(cc, dd, aa, bb, X[ 4],  7);
  375.         bb = FF2(bb, cc, dd, aa, X[13],  5);
  376.         //
  377.         // Parallel round 4
  378.         //
  379.         aa = FF1(aa, bb, cc, dd, X[ 8], 15);
  380.         dd = FF1(dd, aa, bb, cc, X[ 6],  5);
  381.         cc = FF1(cc, dd, aa, bb, X[ 4],  8);
  382.         bb = FF1(bb, cc, dd, aa, X[ 1], 11);
  383.         aa = FF1(aa, bb, cc, dd, X[ 3], 14);
  384.         dd = FF1(dd, aa, bb, cc, X[11], 14);
  385.         cc = FF1(cc, dd, aa, bb, X[15],  6);
  386.         bb = FF1(bb, cc, dd, aa, X[ 0], 14);
  387.         aa = FF1(aa, bb, cc, dd, X[ 5],  6);
  388.         dd = FF1(dd, aa, bb, cc, X[12],  9);
  389.         cc = FF1(cc, dd, aa, bb, X[ 2], 12);
  390.         bb = FF1(bb, cc, dd, aa, X[13],  9);
  391.         aa = FF1(aa, bb, cc, dd, X[ 9], 12);
  392.         dd = FF1(dd, aa, bb, cc, X[ 7],  5);
  393.         cc = FF1(cc, dd, aa, bb, X[10], 15);
  394.         bb = FF1(bb, cc, dd, aa, X[14],  8);
  395.         dd += c + H1;               // final result for H0
  396.         //
  397.         // combine the results
  398.         //
  399.         H1 = H2 + d + aa;
  400.         H2 = H3 + a + bb;
  401.         H3 = H0 + b + cc;
  402.         H0 = dd;
  403. //
  404. // reset the offset and clean out the word buffer.
  405. //
  406. xOff = 0;
  407. for (int i = 0; i != X.length; i++)
  408. {
  409. X[i] = 0;
  410. }
  411. }
  412. }