2 using System.Collections.Generic;
6 using Medo.Security.Cryptography;
7 using System.Security.Cryptography;
11 public class ScryptHash256 : Hash
14 public override int hashSize
19 public ScryptHash256() : base() { }
20 public ScryptHash256(byte[] bytesArray) : base(bytesArray) { }
21 public ScryptHash256(IList<byte> bytesList) : base(bytesList) { }
23 public static ScryptHash256 Compute256(IEnumerable<byte> inputBytes)
25 byte[] dataBytes = inputBytes.ToArray();
27 uint[] V = new uint[(131072 + 63) / sizeof(uint)];
30 using (HMACSHA256 hmac = new HMACSHA256())
32 Pbkdf2 df = new Pbkdf2(hmac, dataBytes, dataBytes, 1);
33 byte[] keyBytes1 = df.GetBytes(128);
35 X = Interop.ToUInt32Array(keyBytes1);
39 for (i = 0; i < 1024; i++)
41 Array.Copy(X, 0, V, i * 32, 32);
43 xor_salsa8(ref X, 0, ref X, 16);
44 xor_salsa8(ref X, 16, ref X, 0);
46 for (i = 0; i < 1024; i++)
48 j = (ushort)(32 * (X[16] & 1023));
49 for (k = 0; k < 32; k++)
51 xor_salsa8(ref X, 0, ref X, 16);
52 xor_salsa8(ref X, 16, ref X, 0);
55 byte[] xBytes = Interop.LEBytes(X);
57 byte[] keyBytes2 = null;
58 using (HMACSHA256 hmac = new HMACSHA256())
60 Pbkdf2 df = new Pbkdf2(hmac, dataBytes, xBytes, 1);
61 keyBytes2 = df.GetBytes(32);
64 return new ScryptHash256(keyBytes2);
67 private static void xor_salsa8(ref uint[] B, int indexB, ref uint[] Bx, int indexBx)
69 uint x00, x01, x02, x03, x04, x05, x06, x07, x08, x09, x10, x11, x12, x13, x14, x15;
72 x00 = (B[indexB + 0] ^= Bx[indexBx + 0]);
73 x01 = (B[indexB + 1] ^= Bx[indexBx + 1]);
74 x02 = (B[indexB + 2] ^= Bx[indexBx + 2]);
75 x03 = (B[indexB + 3] ^= Bx[indexBx + 3]);
76 x04 = (B[indexB + 4] ^= Bx[indexBx + 4]);
77 x05 = (B[indexB + 5] ^= Bx[indexBx + 5]);
78 x06 = (B[indexB + 6] ^= Bx[indexBx + 6]);
79 x07 = (B[indexB + 7] ^= Bx[indexBx + 7]);
80 x08 = (B[indexB + 8] ^= Bx[indexBx + 8]);
81 x09 = (B[indexB + 9] ^= Bx[indexBx + 9]);
82 x10 = (B[indexB + 10] ^= Bx[indexBx + 10]);
83 x11 = (B[indexB + 11] ^= Bx[indexBx + 11]);
84 x12 = (B[indexB + 12] ^= Bx[indexBx + 12]);
85 x13 = (B[indexB + 13] ^= Bx[indexBx + 13]);
86 x14 = (B[indexB + 14] ^= Bx[indexBx + 14]);
87 x15 = (B[indexB + 15] ^= Bx[indexBx + 15]);
89 Func<uint, int, uint> R = (a, b) => (((a) << (b)) | ((a) >> (32 - (b))));
91 for (i = 0; i < 8; i += 2)
93 /* Operate on columns. */
94 x04 ^= R(x00 + x12, 7); x09 ^= R(x05 + x01, 7);
95 x14 ^= R(x10 + x06, 7); x03 ^= R(x15 + x11, 7);
97 x08 ^= R(x04 + x00, 9); x13 ^= R(x09 + x05, 9);
98 x02 ^= R(x14 + x10, 9); x07 ^= R(x03 + x15, 9);
100 x12 ^= R(x08 + x04, 13); x01 ^= R(x13 + x09, 13);
101 x06 ^= R(x02 + x14, 13); x11 ^= R(x07 + x03, 13);
103 x00 ^= R(x12 + x08, 18); x05 ^= R(x01 + x13, 18);
104 x10 ^= R(x06 + x02, 18); x15 ^= R(x11 + x07, 18);
106 /* Operate on rows. */
107 x01 ^= R(x00 + x03, 7); x06 ^= R(x05 + x04, 7);
108 x11 ^= R(x10 + x09, 7); x12 ^= R(x15 + x14, 7);
110 x02 ^= R(x01 + x00, 9); x07 ^= R(x06 + x05, 9);
111 x08 ^= R(x11 + x10, 9); x13 ^= R(x12 + x15, 9);
113 x03 ^= R(x02 + x01, 13); x04 ^= R(x07 + x06, 13);
114 x09 ^= R(x08 + x11, 13); x14 ^= R(x13 + x12, 13);
116 x00 ^= R(x03 + x02, 18); x05 ^= R(x04 + x07, 18);
117 x10 ^= R(x09 + x08, 18); x15 ^= R(x14 + x13, 18);
120 B[indexB + 0] += x00;
121 B[indexB + 1] += x01;
122 B[indexB + 2] += x02;
123 B[indexB + 3] += x03;
124 B[indexB + 4] += x04;
125 B[indexB + 5] += x05;
126 B[indexB + 6] += x06;
127 B[indexB + 7] += x07;
128 B[indexB + 8] += x08;
129 B[indexB + 9] += x09;
130 B[indexB + 10] += x10;
131 B[indexB + 11] += x11;
132 B[indexB + 12] += x12;
133 B[indexB + 13] += x13;
134 B[indexB + 14] += x14;
135 B[indexB + 15] += x15;