grapevine-sonobe/circom/node_modules/circomlib/circuits/sha256/sha256compression_function.circom
circom/node_modules/circomlib/circuits/sha256/sha256compression_function.circomRaw
1// signal input hin[256];
2// signal input inp[512];
3// signal output out[256];
4pragma circom 2.0.0;
5
6function rrot(x, n) {
7 return ((x >> n) | (x << (32-n))) & 0xFFFFFFFF;
8}
9
10function bsigma0(x) {
11 return rrot(x,2) ^ rrot(x,13) ^ rrot(x,22);
12}
13
14function bsigma1(x) {
15 return rrot(x,6) ^ rrot(x,11) ^ rrot(x,25);
16}
17
18function ssigma0(x) {
19 return rrot(x,7) ^ rrot(x,18) ^ (x >> 3);
20}
21
22function ssigma1(x) {
23 return rrot(x,17) ^ rrot(x,19) ^ (x >> 10);
24}
25
26function Maj(x, y, z) {
27 return (x&y) ^ (x&z) ^ (y&z);
28}
29
30function Ch(x, y, z) {
31 return (x & y) ^ ((0xFFFFFFFF ^x) & z);
32}
33
34function sha256K(i) {
35 var k[64] = [
36 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
37 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
38 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
39 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
40 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
41 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
42 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
43 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
44 ];
45 return k[i];
46}
47
48function sha256compression(hin, inp) {
49 var H[8];
50 var a;
51 var b;
52 var c;
53 var d;
54 var e;
55 var f;
56 var g;
57 var h;
58 var out[256];
59 for (var i=0; i<8; i++) {
60 H[i] = 0;
61 for (var j=0; j<32; j++) {
62 H[i] += hin[i*32+j] << j;
63 }
64 }
65 a=H[0];
66 b=H[1];
67 c=H[2];
68 d=H[3];
69 e=H[4];
70 f=H[5];
71 g=H[6];
72 h=H[7];
73 var w[64];
74 var T1;
75 var T2;
76 for (var i=0; i<64; i++) {
77 if (i<16) {
78 w[i]=0;
79 for (var j=0; j<32; j++) {
80 w[i] += inp[i*32+31-j]<<j;
81 }
82 } else {
83 w[i] = (ssigma1(w[i-2]) + w[i-7] + ssigma0(w[i-15]) + w[i-16]) & 0xFFFFFFFF;
84 }
85 T1 = (h + bsigma1(e) + Ch(e,f,g) + sha256K(i) + w[i]) & 0xFFFFFFFF;
86 T2 = (bsigma0(a) + Maj(a,b,c)) & 0xFFFFFFFF;
87
88 h=g;
89 g=f;
90 f=e;
91 e=(d+T1) & 0xFFFFFFFF;
92 d=c;
93 c=b;
94 b=a;
95 a=(T1+T2) & 0xFFFFFFFF;
96
97 }
98 H[0] = H[0] + a;
99 H[1] = H[1] + b;
100 H[2] = H[2] + c;
101 H[3] = H[3] + d;
102 H[4] = H[4] + e;
103 H[5] = H[5] + f;
104 H[6] = H[6] + g;
105 H[7] = H[7] + h;
106 for (var i=0; i<8; i++) {
107 for (var j=0; j<32; j++) {
108 out[i*32+31-j] = (H[i] >> j) & 1;
109 }
110 }
111 return out;
112}