@ -0,0 +1,27 @@ |
|||
/* Ch |
|||
|
|||
000 0 |
|||
001 1 |
|||
010 0 |
|||
011 1 |
|||
100 0 |
|||
101 0 |
|||
110 1 |
|||
111 1 |
|||
|
|||
out = a&b ^ (!a)&c => |
|||
|
|||
out = a*(b-c) + c |
|||
|
|||
*/ |
|||
|
|||
template Ch(n) { |
|||
signal input a[n]; |
|||
signal input b[n]; |
|||
signal input c[n]; |
|||
signal output out[n]; |
|||
|
|||
for (var k=0; k<n; k++) { |
|||
out[k] <== a[k] * (b[k]-c[k]) + c[k]; |
|||
} |
|||
} |
@ -0,0 +1,49 @@ |
|||
|
|||
template XOR() { |
|||
signal input a; |
|||
signal input b; |
|||
signal output out; |
|||
|
|||
out <== a + b - 2*a*b; |
|||
} |
|||
|
|||
template AND() { |
|||
signal input a; |
|||
signal input b; |
|||
signal output out; |
|||
|
|||
out <== a*b; |
|||
} |
|||
|
|||
template OR() { |
|||
signal input a; |
|||
signal input b; |
|||
signal output out; |
|||
|
|||
out <== a + b - a*b; |
|||
} |
|||
|
|||
template NOT() { |
|||
signal input in; |
|||
signal output out; |
|||
|
|||
out <== 1 + in - 2*in; |
|||
} |
|||
|
|||
template NAND() { |
|||
signal input a; |
|||
signal input b; |
|||
signal output out; |
|||
|
|||
out <== 1 - a*b; |
|||
} |
|||
|
|||
template NOR() { |
|||
signal input a; |
|||
signal input b; |
|||
signal output out; |
|||
|
|||
out <== a*b + 1 - a - b; |
|||
} |
|||
|
|||
|
@ -1,50 +1,15 @@ |
|||
|
|||
/* |
|||
include "sha256_2.jaz"; |
|||
|
|||
component main = SHA256_2(); |
|||
*/ |
|||
|
|||
/* |
|||
include "constants.jaz" |
|||
|
|||
template A() { |
|||
signal input in; |
|||
component h0; |
|||
h0 = K(8); |
|||
|
|||
var lc = 0; |
|||
var e = 1; |
|||
for (var i=0; i<32; i++) { |
|||
lc = lc + e*h0.out[i]; |
|||
e *= 2; |
|||
} |
|||
|
|||
lc === in; |
|||
} |
|||
|
|||
component main = A(); |
|||
*/ |
|||
|
|||
include "bitify.jaz" |
|||
|
|||
template A() { |
|||
signal input in; |
|||
template Main() { |
|||
signal private input a; |
|||
signal private input b; |
|||
signal output out; |
|||
|
|||
component n2b; |
|||
component b2n; |
|||
|
|||
n2b = Num2Bits(216); |
|||
b2n = Bits2Num(216); |
|||
|
|||
n2b.in <== in; |
|||
|
|||
for (var i=0; i<216; i++) { |
|||
b2n.in[i] <== n2b.out[i]; |
|||
} |
|||
component sha256_2 = SHA256_2(); |
|||
|
|||
out <== b2n.out; |
|||
sha256_2.a <== a; |
|||
sha256_2.b <== a; |
|||
out <== sha256_2.out; |
|||
} |
|||
|
|||
component main = A(); |
|||
component main = Main(); |
@ -0,0 +1,25 @@ |
|||
/* Maj function for sha256 |
|||
|
|||
out = a&b ^ a&c ^ b&c => |
|||
|
|||
out = a*b + a*c + b*c - 2*a*b*c => |
|||
|
|||
out = a*( b + c - 2*b*c ) + b*c => |
|||
|
|||
mid = b*c |
|||
out = a*( b + c - 2*mid ) + mid |
|||
|
|||
*/ |
|||
|
|||
template Maj(n) { |
|||
signal input a[n]; |
|||
signal input b[n]; |
|||
signal input c[n]; |
|||
signal output out[n]; |
|||
signal mid[n]; |
|||
|
|||
for (var k=0; k<n; k++) { |
|||
mid[k] <== b[k]*c[k]; |
|||
out[k] <== a[k] * (b[k]+c[k]-2*mid[k]) + mid[k]; |
|||
} |
|||
} |
@ -0,0 +1,33 @@ |
|||
include "binsum.circom"; |
|||
include "sigma.circom"; |
|||
include "ch.circom"; |
|||
|
|||
template T1() { |
|||
signal input h[32]; |
|||
signal input e[32]; |
|||
signal input f[32]; |
|||
signal input g[32]; |
|||
signal input k[32]; |
|||
signal input w[32]; |
|||
signal output out[32]; |
|||
|
|||
component sum = Sum(32, 5); |
|||
component ch = Ch(32); |
|||
|
|||
component bigsigma1 = Sigma(6, 11, 25); |
|||
|
|||
for (var k=0; k<32; k++) { |
|||
bigsigma1.in[k] <== e[k]; |
|||
ch.a[k] <== e[k]; |
|||
ch.b[k] <== f[k]; |
|||
ch.c[k] <== g[k] |
|||
|
|||
sum.in[0][k] <== h[k]; |
|||
sum.in[1][k] <== bigsigma1.out[k]; |
|||
sum.in[2][k] <== ch.out[k]; |
|||
sum.in[3][k] <== k[k]; |
|||
sum.in[4][k] <== w[k]; |
|||
|
|||
out[k] <== sum.out[k]; |
|||
} |
|||
} |
@ -0,0 +1,28 @@ |
|||
include "binsum.circom"; |
|||
include "sigma.circom"; |
|||
include "maj.circom" |
|||
|
|||
template T2() { |
|||
signal input a[32]; |
|||
signal input b[32]; |
|||
signal input c[32]; |
|||
signal output out[32]; |
|||
|
|||
component sum = Sum(32, 2); |
|||
|
|||
component bigsigma0 = Sigma(2, 13, 22); |
|||
component maj = Maj(32); |
|||
|
|||
for (var k=0; k<32; k++) { |
|||
|
|||
bigsigma0.in[k] <== a[k]; |
|||
maj.a[k] <== a[k]; |
|||
maj.b[k] <== b[k]; |
|||
maj.c[k] <== c[k]; |
|||
|
|||
sum.in[0][k] <== bigsigma0.out[k]; |
|||
sum.in[1][k] <== maj.out[k]; |
|||
|
|||
out[k] <== sum.out[k]; |
|||
} |
|||
} |
@ -0,0 +1,25 @@ |
|||
/* Xor3 function for sha256 |
|||
|
|||
out = a ^ b ^ c => |
|||
|
|||
out = a+b+c - 2*a*b - 2*a*c - 2*b*c + 4*a*b*c => |
|||
|
|||
out = a*( 1 - 2*b - 2*c + 4*b*c ) + b + c - 2*b*c => |
|||
|
|||
mid = b*c |
|||
out = a*( 1 - 2*b -2*c + 4*mid ) + b + c - 2 * mid |
|||
|
|||
*/ |
|||
|
|||
template Xor3(n) { |
|||
signal input a[n]; |
|||
signal input b[n]; |
|||
signal input c[n]; |
|||
signal output out[n]; |
|||
signal mid[n]; |
|||
|
|||
for (var k=0; k<n; k++) { |
|||
mid[k] <== b[k]*c[k]; |
|||
out[k] <== a[k] * (1 -2*b[k] -2*c[k] +4*mid[k]) + b[k] + c[k] -2*mid[k]; |
|||
} |
|||
} |
@ -0,0 +1,15 @@ |
|||
include "../../circuits/sha256/sha256_2.circom"; |
|||
|
|||
template Main() { |
|||
signal private input a; |
|||
signal private input b; |
|||
signal output out; |
|||
|
|||
component sha256_2 = Sha256_2(); |
|||
|
|||
sha256_2.a <== a; |
|||
sha256_2.b <== a; |
|||
out <== sha256_2.out; |
|||
} |
|||
|
|||
component main = Main(); |