twisted check

This commit is contained in:
Dmitry Vagner 2023-04-19 23:06:02 -07:00
parent bbe64674d0
commit b661a70904
5 changed files with 204 additions and 5 deletions

View File

@ -60,6 +60,7 @@ pub(crate) fn combined_kernel() -> Kernel {
include_str!("asm/curve/bn254/curve_arithmetic/msm.asm"),
include_str!("asm/curve/bn254/curve_arithmetic/pairing.asm"),
include_str!("asm/curve/bn254/curve_arithmetic/precomputation.asm"),
include_str!("asm/curve/bn254/curve_arithmetic/twisted_curve.asm"),
include_str!("asm/curve/bn254/field_arithmetic/degree_6_mul.asm"),
include_str!("asm/curve/bn254/field_arithmetic/degree_12_mul.asm"),
include_str!("asm/curve/bn254/field_arithmetic/frobenius.asm"),

View File

@ -1,10 +1,56 @@
/// def tate(pairs: List((Curve, TwistedCurve))) -> Fp12:
/// def bn254_pairing(pairs: List((Curve, TwistedCurve))) -> Fp12:
///
/// for P, Q in pairs:
/// assert(is_valid(P))
/// assert(is_valid(Q))
///
/// out = 1
/// for P, Q in pairs:
/// out *= miller_loop(P, Q)
///
/// return bn254_final_exponent(out)
global bn254_pairing:
// stack: k, inp, out, retdest
DUP1
// stack: k, k, inp, out, retdest
bn254_input_check:
// stack: j , k, inp
DUP1
ISZERO
// stack: end?, j , k, inp
%jump(bn254_pairing_start)
// stack: j , k, inp
%sub_const(1)
// stack: j=j-1, k, inp
stack (j, k, inp) -> (j, inp, j, k, inp)
// stack: j, inp, j, k, inp
%mul_const(6)
ADD
// stack: inp_j=inp+6j, j, k, inp
DUP1
%load_fp254_2
// stack: P_j, inp_j, j, k, inp
%bn_check
// stack: valid?, inp_j, j, k, inp
%assert_nonzero
// stack: inp_j, j, k, inp
%add_const(2)
%load_fp254_4
// stack: Q_j, j, k, inp
%bn_check_twisted
// stack: valid?, j, k, inp
%assert_nonzero
// stack: j, k, inp
%jump(bn254_input_check)
bn254_pairing_start:
// stack: k, k, inp, out, retdest
POP
bn254_pairing_loop:
// stack: k , inp, out, retdest
DUP1
ISZERO
@ -14,9 +60,9 @@ global bn254_pairing:
%sub_const(1)
// stack: k=k-1, inp, out, retdest
%stack (k, inp, out) -> (k, inp, 200, mul_fp254_12, 200, out, out, bn254_pairing, k, inp, out)
// stack: k, inp, 200, mul_fp254_12, 200, out, out, bn254_pairing, k, inp, out retdest
%stack (k, inp, out) -> (k, inp, 200, mul_fp254_12, 200, out, out, bn254_pairing_loop, k, inp, out)
// stack: k, inp, 200, mul_fp254_12, 200, out, out, bn254_pairing_loop, k, inp, out retdest
%mul_const(6)
ADD
// stack: inp_k, 200, mul_fp254_12, 200, out, out, bn254_pairing, k, inp, out retdest
// stack: inp_k, 200, mul_fp254_12, 200, out, out, bn254_pairing_loop, k, inp, out retdest
%jump(bn254_miller)

View File

@ -0,0 +1,94 @@
// Check if (X,Y) is a valid curve point.
// Returns (range & curve) || is_identity
// where
// range = (x < N) & (x_ < N) & (y < N) & (y_ < N)
// curve = Y^2 == X^3 + A
// ident = (x,y) == (0,0)
%macro bn_check_twisted
// stack: x, x_, y, y_
%bn_check_twisted_range
// stack: range, x, x_, y, y_
%bn_check_twisted_curve
// stack: curve , range, x, x_, y, y_
AND
// stack: curve & range, x, x_, y, y_
SWAP4
// stack: y_, x, x_, y, curve & range
%bn_check_twisted_ident
// stack: ident , curve & range
OR
// stack: ident || (curve & range)
%macro bn_check_twisted_range
// stack: x, x_, y, y_
PUSH @BN_BASE
// stack: N, x, x_, y, y_
%stack (N) -> (N, N, N, N)
// stack: N, N, N, N, x, x_, y, y_
DUP8
// stack: y_ , N, N, N, N, x, x_, y, y_
LT
// stack: y_ < N, N, N, N, x, x_, y, y_
SWAP3
// stack: N, N, N, y_ < N, x, x_, y, y_
DUP7
// stack: y , N, N, N, y_ < N, x, x_, y, y_
LT
// stack: y < N, N, N, y_ < N, x, x_, y, y_
SWAP2
// stack: N, N, y < N, y_ < N, x, x_, y, y_
DUP6
// stack: x_ , N, N, y < N, y_ < N, x, x_, y, y_
LT
// stack: x_ < N, N, y < N, y_ < N, x, x_, y, y_
SWAP1
// stack: N, x_ < N, y < N, y_ < N, x, x_, y, y_
DUP5
// stack: x , N, x_ < N, y < N, y_ < N, x, x_, y, y_
LT
// stack: x < N, x_ < N, y < N, y_ < N, x, x_, y, y_
AND
AND
AND
// stack: range, x, x_, y, y_
%endmacro
%macro bn_check_twisted_curve
// stack: range, X, Y
%stack (range, X: 2, Y: 2) -> (Y, Y, range, X)
// stack: Y, Y, range, X, Y
%mul_fp254_2
// stack: Y^2, range, X, Y
PUSH @BN_TWISTED_IM
PUSH @BN_TWISTED_RE
// stack: A, Y^2, range, X, Y
%stack (A: 2, Y2: 2, range, X: 2) -> (X, X, X, A, Y2, range, X)
// stack: X, X, X, A, Y^2, range, X, Y
%mul_fp254_2
%mul_fp254_2
// stack: X^3 , A, Y^2, range, X, Y
%add_fp254_2
// stack: X^3 + A, Y^2, range, X, Y
%eq_fp254_2
// stack: curve, range, X, Y
%endmacro
%macro bn_check_twisted_ident
SWAP2
// stack: a , b , c , d
ISZERO
SWAP3
// stack: d , b , c , a==0
ISZERO
SWAP2
// stack: c , b , d==0, a==0
ISZERO
SWAP1
// stack: b , c==0, d==0, a==0
ISZERO
// stack: b==0, c==0, d==0, a==0
AND
AND
AND
%endmacro

View File

@ -67,6 +67,31 @@
// stack: cx, cy
%endmacro
%macro eq_fp254_2
// stack: x, x_, y, y_
SWAP3
// stack: y_, x_, y, x
EQ
// stack: y_==x_, y, x
SWAP2
// stack: x, y, y_==x_
EQ
// stack: x==y, y_==x_
AND
%endmacro
%macro add_fp254_2
// stack: x, x_, y, y_
SWAP3
// stack: y_, x_, y, x
ADDFP254
// stack: z_, y, x
SWAP2
// stack: x, y, z_
ADDFP254
// stack: z, z_
%endmacro
/// Given z = x + iy: Fp254_2, return complex conjugate z': Fp254_2
/// where input is represented z.re, z.im and output as z'.im, z'.re
/// cost: 9; note this returns y, x for the output x + yi
@ -116,6 +141,31 @@
// stack: ac - bd, bc + ad
%endmacro
// load twisted curve
%macro load_fp254_4
// stack: ptr
DUP1
%add_const(2)
// stack: ind2, ptr
%mload_kernel_bn254_pairing
// stack: x2, ptr
DUP2
%add_const(1)
// stack: ind1, x2, ptr
%mload_kernel_bn254_pairing
// stack: x1, x2, ptr
DUP3
%add_const(3)
// stack: ind3, x1, x2, ptr
%mload_kernel_bn254_pairing
// stack: x3, x1, x2, ptr
SWAP3
// stack: ind0, x1, x2, x3
%mload_kernel_bn254_pairing
// stack: x0, x1, x2, x3
%endmacro
// fp254_6 macros
%macro load_fp254_6

View File

@ -83,7 +83,7 @@ const HASH_CONSTANTS: [(&str, [u8; 32]); 2] = [
),
];
const EC_CONSTANTS: [(&str, [u8; 32]); 18] = [
const EC_CONSTANTS: [(&str, [u8; 32]); 20] = [
(
"U256_MAX",
hex!("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"),
@ -92,6 +92,14 @@ const EC_CONSTANTS: [(&str, [u8; 32]); 18] = [
"BN_BASE",
hex!("30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47"),
),
(
"BN_TWISTED_RE",
hex!("2b149d40ceb8aaae81be18991be06ac3b5b4c5e559dbefa33267e6dc24a138e5"),
),
(
"BN_TWISTED_IM",
hex!("009713b03af0fed4cd2cafadeed8fdf4a74fa084e52d1852e4a2bd0685c315d2"),
),
(
"BN_SCALAR",
hex!("30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001"),