RipeMD256Digest.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. #if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
  2. #pragma warning disable
  3. using System;
  4. using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities;
  5. namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Digests
  6. {
  7. /// <remarks>
  8. /// <p>Implementation of RipeMD256.</p>
  9. /// <p><b>Note:</b> this algorithm offers the same level of security as RipeMD128.</p>
  10. /// </remarks>
  11. public class RipeMD256Digest
  12. : GeneralDigest
  13. {
  14. public override string AlgorithmName
  15. {
  16. get { return "RIPEMD256"; }
  17. }
  18. public override int GetDigestSize()
  19. {
  20. return DigestLength;
  21. }
  22. private const int DigestLength = 32;
  23. private int H0, H1, H2, H3, H4, H5, H6, H7; // IV's
  24. private int[] X = new int[16];
  25. private int xOff;
  26. /// <summary> Standard constructor</summary>
  27. public RipeMD256Digest()
  28. {
  29. Reset();
  30. }
  31. /// <summary> Copy constructor. This will copy the state of the provided
  32. /// message digest.
  33. /// </summary>
  34. public RipeMD256Digest(RipeMD256Digest t):base(t)
  35. {
  36. CopyIn(t);
  37. }
  38. private void CopyIn(RipeMD256Digest t)
  39. {
  40. base.CopyIn(t);
  41. H0 = t.H0;
  42. H1 = t.H1;
  43. H2 = t.H2;
  44. H3 = t.H3;
  45. H4 = t.H4;
  46. H5 = t.H5;
  47. H6 = t.H6;
  48. H7 = t.H7;
  49. Array.Copy(t.X, 0, X, 0, t.X.Length);
  50. xOff = t.xOff;
  51. }
  52. internal override void ProcessWord(
  53. byte[] input,
  54. int inOff)
  55. {
  56. X[xOff++] = (input[inOff] & 0xff) | ((input[inOff + 1] & 0xff) << 8)
  57. | ((input[inOff + 2] & 0xff) << 16) | ((input[inOff + 3] & 0xff) << 24);
  58. if (xOff == 16)
  59. {
  60. ProcessBlock();
  61. }
  62. }
  63. internal override void ProcessLength(
  64. long bitLength)
  65. {
  66. if (xOff > 14)
  67. {
  68. ProcessBlock();
  69. }
  70. X[14] = (int)(bitLength & 0xffffffff);
  71. X[15] = (int)((ulong)bitLength >> 32);
  72. }
  73. private void UnpackWord(
  74. int word,
  75. byte[] outBytes,
  76. int outOff)
  77. {
  78. outBytes[outOff] = (byte)(uint)word;
  79. outBytes[outOff + 1] = (byte)((uint)word >> 8);
  80. outBytes[outOff + 2] = (byte)((uint)word >> 16);
  81. outBytes[outOff + 3] = (byte)((uint)word >> 24);
  82. }
  83. public override int DoFinal(byte[] output, int outOff)
  84. {
  85. Finish();
  86. UnpackWord(H0, output, outOff);
  87. UnpackWord(H1, output, outOff + 4);
  88. UnpackWord(H2, output, outOff + 8);
  89. UnpackWord(H3, output, outOff + 12);
  90. UnpackWord(H4, output, outOff + 16);
  91. UnpackWord(H5, output, outOff + 20);
  92. UnpackWord(H6, output, outOff + 24);
  93. UnpackWord(H7, output, outOff + 28);
  94. Reset();
  95. return DigestLength;
  96. }
  97. /// <summary> reset the chaining variables to the IV values.</summary>
  98. public override void Reset()
  99. {
  100. base.Reset();
  101. H0 = unchecked((int)0x67452301);
  102. H1 = unchecked((int)0xefcdab89);
  103. H2 = unchecked((int)0x98badcfe);
  104. H3 = unchecked((int)0x10325476);
  105. H4 = unchecked((int)0x76543210);
  106. H5 = unchecked((int)0xFEDCBA98);
  107. H6 = unchecked((int)0x89ABCDEF);
  108. H7 = unchecked((int)0x01234567);
  109. xOff = 0;
  110. for (int i = 0; i != X.Length; i++)
  111. {
  112. X[i] = 0;
  113. }
  114. }
  115. /*
  116. * rotate int x left n bits.
  117. */
  118. private int RL(
  119. int x,
  120. int n)
  121. {
  122. return (x << n) | (int)((uint)x >> (32 - n));
  123. }
  124. /*
  125. * f1,f2,f3,f4 are the basic RipeMD128 functions.
  126. */
  127. /*
  128. * F
  129. */
  130. private int F1(int x, int y, int z)
  131. {
  132. return x ^ y ^ z;
  133. }
  134. /*
  135. * G
  136. */
  137. private int F2(int x, int y, int z)
  138. {
  139. return (x & y) | (~ x & z);
  140. }
  141. /*
  142. * H
  143. */
  144. private int F3(int x, int y, int z)
  145. {
  146. return (x | ~ y) ^ z;
  147. }
  148. /*
  149. * I
  150. */
  151. private int F4(int x, int y, int z)
  152. {
  153. return (x & z) | (y & ~ z);
  154. }
  155. private int F1(int a, int b, int c, int d, int x, int s)
  156. {
  157. return RL(a + F1(b, c, d) + x, s);
  158. }
  159. private int F2(int a, int b, int c, int d, int x, int s)
  160. {
  161. return RL(a + F2(b, c, d) + x + unchecked((int)0x5a827999), s);
  162. }
  163. private int F3(int a, int b, int c, int d, int x, int s)
  164. {
  165. return RL(a + F3(b, c, d) + x + unchecked((int)0x6ed9eba1), s);
  166. }
  167. private int F4(int a, int b, int c, int d, int x, int s)
  168. {
  169. return RL(a + F4(b, c, d) + x + unchecked((int)0x8f1bbcdc), s);
  170. }
  171. private int FF1(int a, int b, int c, int d, int x, int s)
  172. {
  173. return RL(a + F1(b, c, d) + x, s);
  174. }
  175. private int FF2(int a, int b, int c, int d, int x, int s)
  176. {
  177. return RL(a + F2(b, c, d) + x + unchecked((int)0x6d703ef3), s);
  178. }
  179. private int FF3(int a, int b, int c, int d, int x, int s)
  180. {
  181. return RL(a + F3(b, c, d) + x + unchecked((int)0x5c4dd124), s);
  182. }
  183. private int FF4(int a, int b, int c, int d, int x, int s)
  184. {
  185. return RL(a + F4(b, c, d) + x + unchecked((int)0x50a28be6), s);
  186. }
  187. internal override void ProcessBlock()
  188. {
  189. int a, aa;
  190. int b, bb;
  191. int c, cc;
  192. int d, dd;
  193. int t;
  194. a = H0;
  195. b = H1;
  196. c = H2;
  197. d = H3;
  198. aa = H4;
  199. bb = H5;
  200. cc = H6;
  201. dd = H7;
  202. //
  203. // Round 1
  204. //
  205. a = F1(a, b, c, d, X[0], 11);
  206. d = F1(d, a, b, c, X[1], 14);
  207. c = F1(c, d, a, b, X[2], 15);
  208. b = F1(b, c, d, a, X[3], 12);
  209. a = F1(a, b, c, d, X[4], 5);
  210. d = F1(d, a, b, c, X[5], 8);
  211. c = F1(c, d, a, b, X[6], 7);
  212. b = F1(b, c, d, a, X[7], 9);
  213. a = F1(a, b, c, d, X[8], 11);
  214. d = F1(d, a, b, c, X[9], 13);
  215. c = F1(c, d, a, b, X[10], 14);
  216. b = F1(b, c, d, a, X[11], 15);
  217. a = F1(a, b, c, d, X[12], 6);
  218. d = F1(d, a, b, c, X[13], 7);
  219. c = F1(c, d, a, b, X[14], 9);
  220. b = F1(b, c, d, a, X[15], 8);
  221. aa = FF4(aa, bb, cc, dd, X[5], 8);
  222. dd = FF4(dd, aa, bb, cc, X[14], 9);
  223. cc = FF4(cc, dd, aa, bb, X[7], 9);
  224. bb = FF4(bb, cc, dd, aa, X[0], 11);
  225. aa = FF4(aa, bb, cc, dd, X[9], 13);
  226. dd = FF4(dd, aa, bb, cc, X[2], 15);
  227. cc = FF4(cc, dd, aa, bb, X[11], 15);
  228. bb = FF4(bb, cc, dd, aa, X[4], 5);
  229. aa = FF4(aa, bb, cc, dd, X[13], 7);
  230. dd = FF4(dd, aa, bb, cc, X[6], 7);
  231. cc = FF4(cc, dd, aa, bb, X[15], 8);
  232. bb = FF4(bb, cc, dd, aa, X[8], 11);
  233. aa = FF4(aa, bb, cc, dd, X[1], 14);
  234. dd = FF4(dd, aa, bb, cc, X[10], 14);
  235. cc = FF4(cc, dd, aa, bb, X[3], 12);
  236. bb = FF4(bb, cc, dd, aa, X[12], 6);
  237. t = a; a = aa; aa = t;
  238. //
  239. // Round 2
  240. //
  241. a = F2(a, b, c, d, X[7], 7);
  242. d = F2(d, a, b, c, X[4], 6);
  243. c = F2(c, d, a, b, X[13], 8);
  244. b = F2(b, c, d, a, X[1], 13);
  245. a = F2(a, b, c, d, X[10], 11);
  246. d = F2(d, a, b, c, X[6], 9);
  247. c = F2(c, d, a, b, X[15], 7);
  248. b = F2(b, c, d, a, X[3], 15);
  249. a = F2(a, b, c, d, X[12], 7);
  250. d = F2(d, a, b, c, X[0], 12);
  251. c = F2(c, d, a, b, X[9], 15);
  252. b = F2(b, c, d, a, X[5], 9);
  253. a = F2(a, b, c, d, X[2], 11);
  254. d = F2(d, a, b, c, X[14], 7);
  255. c = F2(c, d, a, b, X[11], 13);
  256. b = F2(b, c, d, a, X[8], 12);
  257. aa = FF3(aa, bb, cc, dd, X[6], 9);
  258. dd = FF3(dd, aa, bb, cc, X[11], 13);
  259. cc = FF3(cc, dd, aa, bb, X[3], 15);
  260. bb = FF3(bb, cc, dd, aa, X[7], 7);
  261. aa = FF3(aa, bb, cc, dd, X[0], 12);
  262. dd = FF3(dd, aa, bb, cc, X[13], 8);
  263. cc = FF3(cc, dd, aa, bb, X[5], 9);
  264. bb = FF3(bb, cc, dd, aa, X[10], 11);
  265. aa = FF3(aa, bb, cc, dd, X[14], 7);
  266. dd = FF3(dd, aa, bb, cc, X[15], 7);
  267. cc = FF3(cc, dd, aa, bb, X[8], 12);
  268. bb = FF3(bb, cc, dd, aa, X[12], 7);
  269. aa = FF3(aa, bb, cc, dd, X[4], 6);
  270. dd = FF3(dd, aa, bb, cc, X[9], 15);
  271. cc = FF3(cc, dd, aa, bb, X[1], 13);
  272. bb = FF3(bb, cc, dd, aa, X[2], 11);
  273. t = b; b = bb; bb = t;
  274. //
  275. // Round 3
  276. //
  277. a = F3(a, b, c, d, X[3], 11);
  278. d = F3(d, a, b, c, X[10], 13);
  279. c = F3(c, d, a, b, X[14], 6);
  280. b = F3(b, c, d, a, X[4], 7);
  281. a = F3(a, b, c, d, X[9], 14);
  282. d = F3(d, a, b, c, X[15], 9);
  283. c = F3(c, d, a, b, X[8], 13);
  284. b = F3(b, c, d, a, X[1], 15);
  285. a = F3(a, b, c, d, X[2], 14);
  286. d = F3(d, a, b, c, X[7], 8);
  287. c = F3(c, d, a, b, X[0], 13);
  288. b = F3(b, c, d, a, X[6], 6);
  289. a = F3(a, b, c, d, X[13], 5);
  290. d = F3(d, a, b, c, X[11], 12);
  291. c = F3(c, d, a, b, X[5], 7);
  292. b = F3(b, c, d, a, X[12], 5);
  293. aa = FF2(aa, bb, cc, dd, X[15], 9);
  294. dd = FF2(dd, aa, bb, cc, X[5], 7);
  295. cc = FF2(cc, dd, aa, bb, X[1], 15);
  296. bb = FF2(bb, cc, dd, aa, X[3], 11);
  297. aa = FF2(aa, bb, cc, dd, X[7], 8);
  298. dd = FF2(dd, aa, bb, cc, X[14], 6);
  299. cc = FF2(cc, dd, aa, bb, X[6], 6);
  300. bb = FF2(bb, cc, dd, aa, X[9], 14);
  301. aa = FF2(aa, bb, cc, dd, X[11], 12);
  302. dd = FF2(dd, aa, bb, cc, X[8], 13);
  303. cc = FF2(cc, dd, aa, bb, X[12], 5);
  304. bb = FF2(bb, cc, dd, aa, X[2], 14);
  305. aa = FF2(aa, bb, cc, dd, X[10], 13);
  306. dd = FF2(dd, aa, bb, cc, X[0], 13);
  307. cc = FF2(cc, dd, aa, bb, X[4], 7);
  308. bb = FF2(bb, cc, dd, aa, X[13], 5);
  309. t = c; c = cc; cc = t;
  310. //
  311. // Round 4
  312. //
  313. a = F4(a, b, c, d, X[1], 11);
  314. d = F4(d, a, b, c, X[9], 12);
  315. c = F4(c, d, a, b, X[11], 14);
  316. b = F4(b, c, d, a, X[10], 15);
  317. a = F4(a, b, c, d, X[0], 14);
  318. d = F4(d, a, b, c, X[8], 15);
  319. c = F4(c, d, a, b, X[12], 9);
  320. b = F4(b, c, d, a, X[4], 8);
  321. a = F4(a, b, c, d, X[13], 9);
  322. d = F4(d, a, b, c, X[3], 14);
  323. c = F4(c, d, a, b, X[7], 5);
  324. b = F4(b, c, d, a, X[15], 6);
  325. a = F4(a, b, c, d, X[14], 8);
  326. d = F4(d, a, b, c, X[5], 6);
  327. c = F4(c, d, a, b, X[6], 5);
  328. b = F4(b, c, d, a, X[2], 12);
  329. aa = FF1(aa, bb, cc, dd, X[8], 15);
  330. dd = FF1(dd, aa, bb, cc, X[6], 5);
  331. cc = FF1(cc, dd, aa, bb, X[4], 8);
  332. bb = FF1(bb, cc, dd, aa, X[1], 11);
  333. aa = FF1(aa, bb, cc, dd, X[3], 14);
  334. dd = FF1(dd, aa, bb, cc, X[11], 14);
  335. cc = FF1(cc, dd, aa, bb, X[15], 6);
  336. bb = FF1(bb, cc, dd, aa, X[0], 14);
  337. aa = FF1(aa, bb, cc, dd, X[5], 6);
  338. dd = FF1(dd, aa, bb, cc, X[12], 9);
  339. cc = FF1(cc, dd, aa, bb, X[2], 12);
  340. bb = FF1(bb, cc, dd, aa, X[13], 9);
  341. aa = FF1(aa, bb, cc, dd, X[9], 12);
  342. dd = FF1(dd, aa, bb, cc, X[7], 5);
  343. cc = FF1(cc, dd, aa, bb, X[10], 15);
  344. bb = FF1(bb, cc, dd, aa, X[14], 8);
  345. t = d; d = dd; dd = t;
  346. H0 += a;
  347. H1 += b;
  348. H2 += c;
  349. H3 += d;
  350. H4 += aa;
  351. H5 += bb;
  352. H6 += cc;
  353. H7 += dd;
  354. //
  355. // reset the offset and clean out the word buffer.
  356. //
  357. xOff = 0;
  358. for (int i = 0; i != X.Length; i++)
  359. {
  360. X[i] = 0;
  361. }
  362. }
  363. public override IMemoable Copy()
  364. {
  365. return new RipeMD256Digest(this);
  366. }
  367. public override void Reset(IMemoable other)
  368. {
  369. RipeMD256Digest d = (RipeMD256Digest)other;
  370. CopyIn(d);
  371. }
  372. }
  373. }
  374. #pragma warning restore
  375. #endif