RipeMD128Digest.cs 13 KB

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