Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 

313 wiersze
7.0 KiB

  1. using System;
  2. using System.Collections.ObjectModel;
  3. namespace SUISS.Cloud.Crypto
  4. {
  5. public class Sha256
  6. {
  7. private static uint ROTL(uint x, byte n)
  8. {
  9. return x << (int)n | x >> (int)(32 - n);
  10. }
  11. private static uint ROTR(uint x, byte n)
  12. {
  13. return x >> (int)n | x << (int)(32 - n);
  14. }
  15. private static uint Ch(uint x, uint y, uint z)
  16. {
  17. return (x & y) ^ (~x & z);
  18. }
  19. private static uint Maj(uint x, uint y, uint z)
  20. {
  21. return (x & y) ^ (x & z) ^ (y & z);
  22. }
  23. private static uint Sigma0(uint x)
  24. {
  25. return Sha256.ROTR(x, 2) ^ Sha256.ROTR(x, 13) ^ Sha256.ROTR(x, 22);
  26. }
  27. private static uint Sigma1(uint x)
  28. {
  29. return Sha256.ROTR(x, 6) ^ Sha256.ROTR(x, 11) ^ Sha256.ROTR(x, 25);
  30. }
  31. private static uint sigma0(uint x)
  32. {
  33. return Sha256.ROTR(x, 7) ^ Sha256.ROTR(x, 18) ^ x >> 3;
  34. }
  35. private static uint sigma1(uint x)
  36. {
  37. return Sha256.ROTR(x, 17) ^ Sha256.ROTR(x, 19) ^ x >> 10;
  38. }
  39. private void processBlock(uint[] M)
  40. {
  41. uint[] array = new uint[64];
  42. for (int i = 0; i < 16; i++)
  43. {
  44. array[i] = M[i];
  45. }
  46. for (int j = 16; j < 64; j++)
  47. {
  48. array[j] = Sha256.sigma1(array[j - 2]) + array[j - 7] + Sha256.sigma0(array[j - 15]) + array[j - 16];
  49. }
  50. uint num = this.H[0];
  51. uint num2 = this.H[1];
  52. uint num3 = this.H[2];
  53. uint num4 = this.H[3];
  54. uint num5 = this.H[4];
  55. uint num6 = this.H[5];
  56. uint num7 = this.H[6];
  57. uint num8 = this.H[7];
  58. for (int k = 0; k < 64; k++)
  59. {
  60. uint num9 = num8 + Sha256.Sigma1(num5) + Sha256.Ch(num5, num6, num7) + Sha256.K[k] + array[k];
  61. uint num10 = Sha256.Sigma0(num) + Sha256.Maj(num, num2, num3);
  62. num8 = num7;
  63. num7 = num6;
  64. num6 = num5;
  65. num5 = num4 + num9;
  66. num4 = num3;
  67. num3 = num2;
  68. num2 = num;
  69. num = num9 + num10;
  70. }
  71. this.H[0] = num + this.H[0];
  72. this.H[1] = num2 + this.H[1];
  73. this.H[2] = num3 + this.H[2];
  74. this.H[3] = num4 + this.H[3];
  75. this.H[4] = num5 + this.H[4];
  76. this.H[5] = num6 + this.H[5];
  77. this.H[6] = num7 + this.H[6];
  78. this.H[7] = num8 + this.H[7];
  79. }
  80. public void AddData(byte[] data, uint offset, uint len)
  81. {
  82. if (this.closed)
  83. {
  84. throw new InvalidOperationException("Adding data to a closed hasher.");
  85. }
  86. if (len == 0u)
  87. {
  88. return;
  89. }
  90. this.bits_processed += (ulong)(len * 8u);
  91. while (len > 0u)
  92. {
  93. uint num;
  94. if (len < 64u)
  95. {
  96. if (this.pending_block_off + len > 64u)
  97. {
  98. num = 64u - this.pending_block_off;
  99. }
  100. else
  101. {
  102. num = len;
  103. }
  104. }
  105. else
  106. {
  107. num = 64u - this.pending_block_off;
  108. }
  109. Array.Copy(data, (long)((ulong)offset), this.pending_block, (long)((ulong)this.pending_block_off), (long)((ulong)num));
  110. len -= num;
  111. offset += num;
  112. this.pending_block_off += num;
  113. if (this.pending_block_off == 64u)
  114. {
  115. Sha256.toUintArray(this.pending_block, this.uint_buffer);
  116. this.processBlock(this.uint_buffer);
  117. this.pending_block_off = 0u;
  118. }
  119. }
  120. }
  121. public ReadOnlyCollection<byte> GetHash()
  122. {
  123. return Sha256.toByteArray(this.GetHashUInt32());
  124. }
  125. public ReadOnlyCollection<uint> GetHashUInt32()
  126. {
  127. if (!this.closed)
  128. {
  129. ulong num = this.bits_processed;
  130. this.AddData(new byte[]
  131. {
  132. 128
  133. }, 0u, 1u);
  134. uint num2 = 64u - this.pending_block_off;
  135. if (num2 < 8u)
  136. {
  137. num2 += 64u;
  138. }
  139. byte[] array = new byte[num2];
  140. for (uint num3 = 1u; num3 <= 8u; num3 += 1u)
  141. {
  142. array[(int)(checked((IntPtr)(unchecked((long)array.Length - (long)((ulong)num3)))))] = (byte)num;
  143. num >>= 8;
  144. }
  145. this.AddData(array, 0u, (uint)array.Length);
  146. this.closed = true;
  147. }
  148. return Array.AsReadOnly<uint>(this.H);
  149. }
  150. private static void toUintArray(byte[] src, uint[] dest)
  151. {
  152. uint num = 0u;
  153. uint num2 = 0u;
  154. while ((ulong)num < (ulong)((long)dest.Length))
  155. {
  156. dest[(int)((UIntPtr)num)] = (uint)((int)src[(int)((UIntPtr)num2)] << 24 | (int)src[(int)((UIntPtr)(num2 + 1u))] << 16 | (int)src[(int)((UIntPtr)(num2 + 2u))] << 8 | (int)src[(int)((UIntPtr)(num2 + 3u))]);
  157. num += 1u;
  158. num2 += 4u;
  159. }
  160. }
  161. private static ReadOnlyCollection<byte> toByteArray(ReadOnlyCollection<uint> src)
  162. {
  163. byte[] array = new byte[src.Count * 4];
  164. int num = 0;
  165. for (int i = 0; i < src.Count; i++)
  166. {
  167. array[num++] = (byte)(src[i] >> 24);
  168. array[num++] = (byte)(src[i] >> 16);
  169. array[num++] = (byte)(src[i] >> 8);
  170. array[num++] = (byte)src[i];
  171. }
  172. return Array.AsReadOnly<byte>(array);
  173. }
  174. public static ReadOnlyCollection<byte> HashBytes(params object[] args)
  175. {
  176. Sha256 sha = new Sha256();
  177. foreach (object obj in args)
  178. {
  179. if (obj is byte[])
  180. {
  181. byte[] array = obj as byte[];
  182. sha.AddData(array, 0u, (uint)array.Length);
  183. }
  184. else
  185. {
  186. if (!(obj is ReadOnlyCollection<byte>))
  187. {
  188. throw new ArgumentException();
  189. }
  190. ReadOnlyCollection<byte> readOnlyCollection = obj as ReadOnlyCollection<byte>;
  191. byte[] array2 = new byte[readOnlyCollection.Count];
  192. readOnlyCollection.CopyTo(array2, 0);
  193. sha.AddData(array2, 0u, (uint)array2.Length);
  194. }
  195. }
  196. return sha.GetHash();
  197. }
  198. public static byte[] HashToBytes(params object[] args)
  199. {
  200. ReadOnlyCollection<byte> readOnlyCollection = Sha256.HashBytes(args);
  201. byte[] array = new byte[readOnlyCollection.Count];
  202. readOnlyCollection.CopyTo(array, 0);
  203. return array;
  204. }
  205. private static readonly uint[] K = new uint[]
  206. {
  207. 1116352408u,
  208. 1899447441u,
  209. 3049323471u,
  210. 3921009573u,
  211. 961987163u,
  212. 1508970993u,
  213. 2453635748u,
  214. 2870763221u,
  215. 3624381080u,
  216. 310598401u,
  217. 607225278u,
  218. 1426881987u,
  219. 1925078388u,
  220. 2162078206u,
  221. 2614888103u,
  222. 3248222580u,
  223. 3835390401u,
  224. 4022224774u,
  225. 264347078u,
  226. 604807628u,
  227. 770255983u,
  228. 1249150122u,
  229. 1555081692u,
  230. 1996064986u,
  231. 2554220882u,
  232. 2821834349u,
  233. 2952996808u,
  234. 3210313671u,
  235. 3336571891u,
  236. 3584528711u,
  237. 113926993u,
  238. 338241895u,
  239. 666307205u,
  240. 773529912u,
  241. 1294757372u,
  242. 1396182291u,
  243. 1695183700u,
  244. 1986661051u,
  245. 2177026350u,
  246. 2456956037u,
  247. 2730485921u,
  248. 2820302411u,
  249. 3259730800u,
  250. 3345764771u,
  251. 3516065817u,
  252. 3600352804u,
  253. 4094571909u,
  254. 275423344u,
  255. 430227734u,
  256. 506948616u,
  257. 659060556u,
  258. 883997877u,
  259. 958139571u,
  260. 1322822218u,
  261. 1537002063u,
  262. 1747873779u,
  263. 1955562222u,
  264. 2024104815u,
  265. 2227730452u,
  266. 2361852424u,
  267. 2428436474u,
  268. 2756734187u,
  269. 3204031479u,
  270. 3329325298u
  271. };
  272. private uint[] H = new uint[]
  273. {
  274. 1779033703u,
  275. 3144134277u,
  276. 1013904242u,
  277. 2773480762u,
  278. 1359893119u,
  279. 2600822924u,
  280. 528734635u,
  281. 1541459225u
  282. };
  283. private byte[] pending_block = new byte[64];
  284. private uint pending_block_off;
  285. private uint[] uint_buffer = new uint[16];
  286. private ulong bits_processed;
  287. private bool closed;
  288. }
  289. }