@ -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"; |
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; |
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(); |