From bb0983705f4a01aa66418f5387c0bd8089790992 Mon Sep 17 00:00:00 2001 From: Jason-LI2020 Date: Fri, 1 Sep 2023 13:44:00 +0800 Subject: [PATCH 1/7] add bit forge zkps --- crypto/paillier/paillier.go | 4 +- crypto/pedersen/pedersen.go | 67 ++++++++ crypto/pedersen/pedersen_test.go | 23 +++ crypto/zkp/aff_g_proof.go | 169 +++++++++++++++++++ crypto/zkp/aff_g_proof_test.go | 81 +++++++++ crypto/zkp/no_small_factor_proof.go | 97 +++++++++++ crypto/zkp/no_small_factor_proof_test.go | 33 ++++ crypto/zkp/paillier_blum_proof.go | 201 +++++++++++++++++++++++ crypto/zkp/paillier_blum_proof_test.go | 43 +++++ go.mod | 4 +- tss/ecdsa/keygen/keygen_test.go | 20 ++- tss/ecdsa/keygen/party1.go | 41 +++-- tss/ecdsa/keygen/party2.go | 16 +- tss/ecdsa/sign/party1.go | 22 ++- tss/ecdsa/sign/party2.go | 58 ++++--- tss/ecdsa/sign/sign_test.go | 34 ++-- tss/key/reshare/update_round3.go | 7 - tss/key/reshare/update_round_test.go | 5 +- 18 files changed, 860 insertions(+), 65 deletions(-) create mode 100644 crypto/pedersen/pedersen.go create mode 100644 crypto/pedersen/pedersen_test.go create mode 100644 crypto/zkp/aff_g_proof.go create mode 100644 crypto/zkp/aff_g_proof_test.go create mode 100644 crypto/zkp/no_small_factor_proof.go create mode 100644 crypto/zkp/no_small_factor_proof_test.go create mode 100644 crypto/zkp/paillier_blum_proof.go create mode 100644 crypto/zkp/paillier_blum_proof_test.go diff --git a/crypto/paillier/paillier.go b/crypto/paillier/paillier.go index ce1416a..c0a4e04 100644 --- a/crypto/paillier/paillier.go +++ b/crypto/paillier/paillier.go @@ -21,6 +21,8 @@ type ( PublicKey Lambda *big.Int // lcm(p-1, q-1) Phi *big.Int // (p-1) * (q-1) + P *big.Int + Q *big.Int } ) @@ -62,7 +64,7 @@ func NewKeyPair(concurrency ...int) (*PrivateKey, *PublicKey, error) { lambda := new(big.Int).Div(phi, gcd) publicKey := &PublicKey{N: n} - privateKey := &PrivateKey{PublicKey: *publicKey, Lambda: lambda, Phi: phi} + privateKey := &PrivateKey{PublicKey: *publicKey, Lambda: lambda, Phi: phi, P: p, Q: q} return privateKey, publicKey, nil } diff --git a/crypto/pedersen/pedersen.go b/crypto/pedersen/pedersen.go new file mode 100644 index 0000000..bbe7e3e --- /dev/null +++ b/crypto/pedersen/pedersen.go @@ -0,0 +1,67 @@ +package pedersen + +import ( + "math/big" + "runtime" + + "github.com/okx/threshold-lib/crypto" +) + +const ( + PrimeBits = 1024 +) + +type ( + // N = p * q, where p and q are safe primes + // s = rnd1^2 mod N + // t = rnd2^2 mod N + PedersenParameters struct { + S, T, Ntilde *big.Int + } +) + +func NewPedersenParameters(concurrency ...int) (*PedersenParameters, error) { + var currency int + if 0 < len(concurrency) { + currency = concurrency[0] + } else { + currency = runtime.NumCPU() + } + + var values = make(chan *big.Int, currency) + var p, q *big.Int + for p == q { + var quit = make(chan int) + for i := 0; i < currency; i++ { + go crypto.GenerateSafePrime(PrimeBits, values, quit) + } + p, q = <-values, <-values + close(quit) + } + + // N = p * q, as described in the paper: https://eprint.iacr.org/2020/492.pdf Definition 1.2 + N := new(big.Int).Mul(p, q) + rnd1 := crypto.RandomNum(N) + rnd2 := crypto.RandomNum(N) + + s := new(big.Int).Mod(new(big.Int).Mul(rnd1, rnd1), N) + t := new(big.Int).Mod(new(big.Int).Mul(rnd2, rnd2), N) + + return &PedersenParameters{Ntilde: N, S: s, T: t}, nil +} + +// commit c = s^m * t^r mod N +func (pedersen *PedersenParameters) Commit(m, r *big.Int) (*big.Int, error) { + a := new(big.Int).Exp(pedersen.S, m, pedersen.Ntilde) + b := new(big.Int).Exp(pedersen.T, r, pedersen.Ntilde) + c := new(big.Int).Mod(new(big.Int).Mul(a, b), pedersen.Ntilde) + return c, nil +} + +// open c = s^m * t^r mod N +func (pedersen *PedersenParameters) Open(c, m, r *big.Int) (bool, error) { + a := new(big.Int).Exp(pedersen.S, m, pedersen.Ntilde) + b := new(big.Int).Exp(pedersen.T, r, pedersen.Ntilde) + c1 := new(big.Int).Mod(new(big.Int).Mul(a, b), pedersen.Ntilde) + return c1.Cmp(c) == 0, nil +} diff --git a/crypto/pedersen/pedersen_test.go b/crypto/pedersen/pedersen_test.go new file mode 100644 index 0000000..71c9089 --- /dev/null +++ b/crypto/pedersen/pedersen_test.go @@ -0,0 +1,23 @@ +package pedersen + +import ( + "encoding/json" + "fmt" + "math/big" + "testing" +) + +func TestPedersen(t *testing.T) { + parameters, _ := NewPedersenParameters(8) + + m := big.NewInt(10) + r := big.NewInt(32) + + c1, _ := parameters.Commit(m, r) + ok, _ := parameters.Open(c1, m, r) + fmt.Println("ok", ok) + + ped, _ := json.Marshal(parameters) + fmt.Println("ped", string(ped)) + +} diff --git a/crypto/zkp/aff_g_proof.go b/crypto/zkp/aff_g_proof.go new file mode 100644 index 0000000..e145575 --- /dev/null +++ b/crypto/zkp/aff_g_proof.go @@ -0,0 +1,169 @@ +package zkp + +import ( + "math/big" + + "github.com/decred/dcrd/dcrec/secp256k1/v2" + "github.com/okx/threshold-lib/crypto" + "github.com/okx/threshold-lib/crypto/curves" + "github.com/okx/threshold-lib/crypto/pedersen" +) + +type ( + AffGStatement struct { + N, C, D *big.Int + X, Y *curves.ECPoint + } + + AffGWitness struct { + X, Y, Rho *big.Int + } + + AffGProof struct { + A, E, S, F, T, Z1, Z2, Z3, Z4, W *big.Int + Bx, By, X, Y *curves.ECPoint + } +) + +var ( + two = big.NewInt(2) + curve = secp256k1.S256() + L0_Aff_G = 2 * 256 + L1_Aff_G = 3 * 256 + Epsilon_Aff_G = 3 * 256 +) + +// https://eprint.iacr.org/2020/492.pdf 4.2 Paillier Operation with Group Commitment in Range ZK +// y is committed in elliptic curve group instead of Paillier group +func PaillierAffineProve(pedersen *pedersen.PedersenParameters, st *AffGStatement, wit *AffGWitness) *AffGProof { + N2 := new(big.Int).Mul(st.N, st.N) + + // sample viaribles + rangeL0Epsilon := new(big.Int).Lsh(one, uint(L0_Aff_G+Epsilon_Aff_G)) + rangeL1Epsilon := new(big.Int).Lsh(one, uint(L1_Aff_G+Epsilon_Aff_G)) + rangeL0 := new(big.Int).Lsh(one, uint(L0_Aff_G)) + // rangeL1 := new(big.Int).Lsh(one, uint(L1_Aff_G)) + + alpha := crypto.RandomNum(rangeL0Epsilon) + beta := crypto.RandomNum(rangeL1Epsilon) + + r := crypto.RandomNum(st.N) + gamma := crypto.RandomNum(new(big.Int).Mul(rangeL0Epsilon, pedersen.Ntilde)) + m := crypto.RandomNum(new(big.Int).Mul(rangeL0, pedersen.Ntilde)) + // rangeL1 ? + delta := crypto.RandomNum(new(big.Int).Mul(rangeL0Epsilon, pedersen.Ntilde)) + mu := crypto.RandomNum(new(big.Int).Mul(rangeL0, pedersen.Ntilde)) + + // compute A, Bx, By, E, S, F, T + // A = C^alpha * ((1+N)^beta * r^N) mod N2 + A := new(big.Int).Exp(st.C, alpha, N2) + A = new(big.Int).Mod(new(big.Int).Mul(A, new(big.Int).Exp(new(big.Int).Add(one, st.N), beta, N2)), N2) + A = new(big.Int).Mod(new(big.Int).Mul(A, new(big.Int).Exp(r, st.N, N2)), N2) + + // Bx = aplha * G + Bx := curves.ScalarToPoint(curve, alpha) + + // By = beta * G + By := curves.ScalarToPoint(curve, beta) + + // E = pedersen.Commit(alpha, gamma) + E, _ := pedersen.Commit(alpha, gamma) + + // S = pedersen.Commit(x, m) + S, _ := pedersen.Commit(wit.X, m) + + // F = pedersen.Commit(beta, delta) + F, _ := pedersen.Commit(beta, delta) + + // T = pedersen.Commit(y, mu) + T, _ := pedersen.Commit(wit.Y, mu) + + // compute challenge e + e := crypto.SHA256Int(st.N, st.C, st.D, st.X.X, st.Y.X, A, Bx.X, By.X, E, S, F, T) + e = new(big.Int).Mod(e, curve.N) + + // compute Z1, Z2, Z3, Z4, W + // Z1 = alpha + e * x + Z1 := new(big.Int).Add(alpha, new(big.Int).Mul(e, wit.X)) + + // Z2 = beta + e * y + Z2 := new(big.Int).Add(beta, new(big.Int).Mul(e, wit.Y)) + + // Z3 = gamma + e * m + Z3 := new(big.Int).Add(gamma, new(big.Int).Mul(e, m)) + + // Z4 = delta + e * mu + Z4 := new(big.Int).Add(delta, new(big.Int).Mul(e, mu)) + + // W = r * rho^e mod N + W := new(big.Int).Mod(new(big.Int).Mul(r, new(big.Int).Exp(wit.Rho, e, st.N)), st.N) + + return &AffGProof{A: A, Bx: Bx, By: By, E: E, S: S, F: F, T: T, Z1: Z1, Z2: Z2, Z3: Z3, Z4: Z4, W: W, X: st.X, Y: st.Y} +} + +func PaillierAffineVerify(pedersen *pedersen.PedersenParameters, proof *AffGProof, st *AffGStatement) bool { + N2 := new(big.Int).Mul(st.N, st.N) + e := crypto.SHA256Int(st.N, st.C, st.D, st.X.X, st.Y.X, proof.A, proof.Bx.X, proof.By.X, proof.E, proof.S, proof.F, proof.T) + e = new(big.Int).Mod(e, curve.N) + + // check A + // C^Z1 * ((1+N)^Z2 * w^N) = A * D^e mod N2 + left0 := new(big.Int).Exp(st.C, proof.Z1, N2) + left0 = new(big.Int).Mod(new(big.Int).Mul(left0, new(big.Int).Exp(new(big.Int).Add(one, st.N), proof.Z2, N2)), N2) + left0 = new(big.Int).Mod(new(big.Int).Mul(left0, new(big.Int).Exp(proof.W, st.N, N2)), N2) + right0 := new(big.Int).Mod(new(big.Int).Mul(proof.A, new(big.Int).Exp(st.D, e, N2)), N2) + if left0.Cmp(right0) != 0 { + return false + } + + // check Bx + // Z1 * G = Bx + e * X + left1 := curves.ScalarToPoint(curve, proof.Z1) + right1, err := proof.Bx.Add(st.X.ScalarMult(e)) + if err != nil { + return false + } + if !left1.Equals(right1) { + return false + } + + // check By + // Z2 * G = By + e * Y + left2 := curves.ScalarToPoint(curve, proof.Z2) + right2, err := proof.By.Add(st.Y.ScalarMult(e)) + if err != nil { + return false + } + if !left2.Equals(right2) { + return false + } + + // check E, S + // pedersen.Commit(Z1, Z3) = E * S^e mod N2 + left3, _ := pedersen.Commit(proof.Z1, proof.Z3) + right3 := new(big.Int).Mod(new(big.Int).Mul(proof.E, new(big.Int).Exp(proof.S, e, pedersen.Ntilde)), pedersen.Ntilde) + if left3.Cmp(right3) != 0 { + return false + } + + // check F, T + // pedersen.Commit(Z2, Z4) = F * T^e mod N2 + left4, _ := pedersen.Commit(proof.Z2, proof.Z4) + right4 := new(big.Int).Mod(new(big.Int).Mul(proof.F, new(big.Int).Exp(proof.T, e, pedersen.Ntilde)), pedersen.Ntilde) + if left4.Cmp(right4) != 0 { + return false + } + + // range check + // Z1 < 2^(L0 + Epsilon) + if proof.Z1.Cmp(new(big.Int).Lsh(one, uint(L0_Aff_G+Epsilon_Aff_G))) != -1 { + return false + } + + // Z2 < 2^(L1 + Epsilon) + if proof.Z2.Cmp(new(big.Int).Lsh(one, uint(L1_Aff_G+Epsilon_Aff_G))) != -1 { + return false + } + + return true +} diff --git a/crypto/zkp/aff_g_proof_test.go b/crypto/zkp/aff_g_proof_test.go new file mode 100644 index 0000000..eae5165 --- /dev/null +++ b/crypto/zkp/aff_g_proof_test.go @@ -0,0 +1,81 @@ +package zkp + +import ( + "fmt" + "math/big" + "testing" + + "github.com/okx/threshold-lib/crypto" + "github.com/okx/threshold-lib/crypto/curves" + "github.com/okx/threshold-lib/crypto/pedersen" +) + +func TestAffGProof(t *testing.T) { + // -----------------------GeneratePreParams------------------------------- + fmt.Println("----------------------- TestAffGProof ---------------------------------") + pesersen, _ := pedersen.NewPedersenParameters(8) + const bits = 512 + // const bits = 1024 + + concurrency := 4 + var values = make(chan *big.Int, concurrency) + var p, q *big.Int + for p == q { + var quit = make(chan int) + for i := 0; i < concurrency; i++ { + go crypto.GenerateSafePrime(bits, values, quit) + } + p, q = <-values, <-values + close(quit) + } + N := new(big.Int).Mul(p, q) + N2 := new(big.Int).Mul(N, N) + + rangeL0 := new(big.Int).Lsh(one, uint(L0_Aff_G)) + rangeL1 := new(big.Int).Lsh(one, uint(L1_Aff_G)) + + x := crypto.RandomNum(rangeL0) + y := crypto.RandomNum(rangeL1) + rho := crypto.RandomNum(N) + + witness := &AffGWitness{ + X: x, + Y: y, + Rho: rho, + } + + // C is an ciphertext of an Paillier encryption of a secret + C := crypto.RandomNum(N2) + + // D = C^x * (1+N)^y * rho^N mod N^2 + D := new(big.Int).Exp(C, x, N2) + D = new(big.Int).Mod(new(big.Int).Mul(D, new(big.Int).Exp(new(big.Int).Add(one, N), y, N2)), N2) + D = new(big.Int).Mod(new(big.Int).Mul(D, new(big.Int).Exp(rho, N, N2)), N2) + + X := curves.ScalarToPoint(curve, x) + Y := curves.ScalarToPoint(curve, y) + + st := &AffGStatement{ + N: N, + C: C, + D: D, + X: X, + Y: Y, + } + + proof := PaillierAffineProve(pesersen, st, witness) + verify := PaillierAffineVerify(pesersen, proof, st) + + fmt.Println("PaillierAffineProof of honest prover:", verify) + + x = crypto.RandomNum(N) + witness = &AffGWitness{ + X: x, + Y: y, + Rho: rho, + } + proof = PaillierAffineProve(pesersen, st, witness) + verify = PaillierAffineVerify(pesersen, proof, st) + fmt.Println("PaillierAffineProof of malicious prover:", verify) + +} diff --git a/crypto/zkp/no_small_factor_proof.go b/crypto/zkp/no_small_factor_proof.go new file mode 100644 index 0000000..98feaa3 --- /dev/null +++ b/crypto/zkp/no_small_factor_proof.go @@ -0,0 +1,97 @@ +package zkp + +import ( + "math/big" + + "github.com/okx/threshold-lib/crypto" + "github.com/okx/threshold-lib/crypto/pedersen" +) + +type ( + NoSmallFactorProof struct { + P, Q, A, B, T, Rho, Z1, Z2, W1, W2, V *big.Int + } +) + +var ( + L_NSF = 256 + Epsilon_NSF = 2 * 256 +) + +func NoSmallFactorProve(N, p, q *big.Int, ped *pedersen.PedersenParameters) *NoSmallFactorProof { + Ntilde := ped.Ntilde + Nsqrt := new(big.Int).Sqrt(N) + + range0 := new(big.Int).Lsh(one, uint(L_NSF+Epsilon_NSF)) + range1 := new(big.Int).Lsh(one, uint(L_NSF)) + + alpha := crypto.RandomNum(new(big.Int).Mul(range0, Nsqrt)) + beta := crypto.RandomNum(new(big.Int).Mul(range0, Nsqrt)) + mu := crypto.RandomNum(new(big.Int).Mul(range0, Ntilde)) + nu := crypto.RandomNum(new(big.Int).Mul(range0, Ntilde)) + Rho := crypto.RandomNum(new(big.Int).Mul(range1, new(big.Int).Mul(N, Ntilde))) + r := crypto.RandomNum(new(big.Int).Mul(range0, new(big.Int).Mul(N, Ntilde))) + x := crypto.RandomNum(new(big.Int).Mul(range0, Ntilde)) + y := crypto.RandomNum(new(big.Int).Mul(range0, Ntilde)) + + // calculate P, Q, A, B, T + P, _ := ped.Commit(p, mu) + Q, _ := ped.Commit(q, nu) + A, _ := ped.Commit(alpha, x) + B, _ := ped.Commit(beta, y) + T := new(big.Int).Mul(new(big.Int).Exp(Q, alpha, Ntilde), new(big.Int).Exp(ped.T, r, Ntilde)) + + // calculate challenge e + e := crypto.SHA256Int(N, P, Q, A, B, T, Rho) + e = new(big.Int).Mod(e, curve.N) + + RhoTilde := new(big.Int).Sub(Rho, new(big.Int).Mul(nu, p)) + + // calculate Z1, Z2, W1, W2, V + Z1 := new(big.Int).Add(alpha, new(big.Int).Mul(e, p)) + Z2 := new(big.Int).Add(beta, new(big.Int).Mul(e, q)) + W1 := new(big.Int).Add(x, new(big.Int).Mul(e, mu)) + W2 := new(big.Int).Add(y, new(big.Int).Mul(e, nu)) + V := new(big.Int).Add(r, new(big.Int).Mul(e, RhoTilde)) + + return &NoSmallFactorProof{P, Q, A, B, T, Rho, Z1, Z2, W1, W2, V} +} + +func NoSmallFactorVerify(N *big.Int, proof *NoSmallFactorProof, ped *pedersen.PedersenParameters) bool { + Ntilde := ped.Ntilde + Nsqrt := new(big.Int).Sqrt(N) + + e := crypto.SHA256Int(N, proof.P, proof.Q, proof.A, proof.B, proof.T, proof.Rho) + e = new(big.Int).Mod(e, curve.N) + + R, _ := ped.Commit(N, proof.Rho) + + // check commit(Z1, W1) = A * P^e mod Ntilde + left0, _ := ped.Commit(proof.Z1, proof.W1) + right0 := new(big.Int).Mod(new(big.Int).Mul(proof.A, new(big.Int).Exp(proof.P, e, Ntilde)), Ntilde) + if left0.Cmp(right0) != 0 { + return false + } + + // check commit(Z2, W2) = B * Q^e mod Ntilde + left1, _ := ped.Commit(proof.Z2, proof.W2) + right1 := new(big.Int).Mod(new(big.Int).Mul(proof.B, new(big.Int).Exp(proof.Q, e, Ntilde)), Ntilde) + if left1.Cmp(right1) != 0 { + return false + } + + // check Q^Z1 * ped.T^V = T * R^e mod Ntilde + left2 := new(big.Int).Mod(new(big.Int).Mul(new(big.Int).Exp(proof.Q, proof.Z1, Ntilde), new(big.Int).Exp(ped.T, proof.V, Ntilde)), Ntilde) + right2 := new(big.Int).Mod(new(big.Int).Mul(proof.T, new(big.Int).Exp(R, e, Ntilde)), Ntilde) + if left2.Cmp(right2) != 0 { + return false + } + + // range check + rangeLimit := new(big.Int).Mul(new(big.Int).Lsh(one, uint(L_NSF+Epsilon_NSF)), Nsqrt) + if proof.Z1.Cmp(rangeLimit) == 1 || proof.Z2.Cmp(rangeLimit) == 1 { + return false + } + + return true +} diff --git a/crypto/zkp/no_small_factor_proof_test.go b/crypto/zkp/no_small_factor_proof_test.go new file mode 100644 index 0000000..709c7f4 --- /dev/null +++ b/crypto/zkp/no_small_factor_proof_test.go @@ -0,0 +1,33 @@ +package zkp + +import ( + "crypto/rand" + "fmt" + "math/big" + "testing" + + "github.com/okx/threshold-lib/crypto/pedersen" +) + +func TestNoSmallFactorProof(t *testing.T) { + // -----------------------GeneratePreParams------------------------------- + fmt.Println("----------------------- TestNoSmallFactorProof -------------------------") + ped, _ := pedersen.NewPedersenParameters(8) + const bits = 1024 + + p, _ := rand.Prime(rand.Reader, bits) + q, _ := rand.Prime(rand.Reader, bits) + N := new(big.Int).Mul(p, q) + + proof := NoSmallFactorProve(N, p, q, ped) + verify := NoSmallFactorVerify(N, proof, ped) + fmt.Println("NoSmallFactorProof of honest prover:", verify) + + p, _ = rand.Prime(rand.Reader, 16) + q, _ = rand.Prime(rand.Reader, 2*bits-16) + N = new(big.Int).Mul(p, q) + proof = NoSmallFactorProve(N, p, q, ped) + verify = NoSmallFactorVerify(N, proof, ped) + fmt.Println("NoSmallFactorProof of malicious prover:", verify) + +} diff --git a/crypto/zkp/paillier_blum_proof.go b/crypto/zkp/paillier_blum_proof.go new file mode 100644 index 0000000..66ee6a6 --- /dev/null +++ b/crypto/zkp/paillier_blum_proof.go @@ -0,0 +1,201 @@ +package zkp + +import ( + "fmt" + "math/big" + + "github.com/okx/threshold-lib/crypto" +) + +const Security = 100 + +type ( + PaillierBlumProof struct { + W *big.Int + X_arr, A_arr, B_arr, Z_arr []*big.Int + } +) + +var ( + zero = big.NewInt(0) +) + +// https://eprint.iacr.org/2020/492.pdf 4.3 Paillier Blum Modulus ZK +func PaillierBlumProve(N, p, q *big.Int) *PaillierBlumProof { + if N.Cmp(new(big.Int).Mul(p, q)) != 0 { + return nil + } + + w := crypto.RandomNum(N) + for big.Jacobi(w, N) != -1 { + w = crypto.RandomNum(N) + } + + // e := crypto.SHA256Int(N, p, q, w) + y_arr := make([]*big.Int, Security) + phi := new(big.Int).Mul(new(big.Int).Sub(p, one), new(big.Int).Sub(q, one)) + pow := new(big.Int).ModInverse(N, phi) + + X_arr := make([]*big.Int, Security) + A_arr := make([]*big.Int, Security) + B_arr := make([]*big.Int, Security) + Z_arr := make([]*big.Int, Security) + + var err error + for i := 0; i < Security; i++ { + y_arr[i] = new(big.Int).Mod(oracle(N, w, i), N) + X_arr[i], A_arr[i], B_arr[i], err = getQuaticSqrt(N, p, q, w, y_arr[i]) + if err != nil { + fmt.Println("N should be an odd composite number") + return nil + } + Z_arr[i] = new(big.Int).Exp(y_arr[i], pow, N) + } + + return &PaillierBlumProof{W: w, X_arr: X_arr, A_arr: A_arr, B_arr: B_arr, Z_arr: Z_arr} +} + +func PaillierBlumVerify(N *big.Int, proof *PaillierBlumProof) bool { + if (new(big.Int).Mod(N, two)).Cmp(zero) == 0 || N.ProbablyPrime(100) { + fmt.Println("N should be an odd composite number") + return false + } + + if proof == nil { + fmt.Println("Invalid proof") + return false + } + + if len(proof.X_arr) != Security || len(proof.A_arr) != Security || len(proof.B_arr) != Security || len(proof.Z_arr) != Security { + fmt.Println("Invalid proof length") + return false + } + + y_arr := make([]*big.Int, Security) + for i := 0; i < Security; i++ { + if proof.X_arr[i] == nil || proof.A_arr[i] == nil || proof.B_arr[i] == nil || proof.Z_arr[i] == nil { + fmt.Println("Invalid value in proof") + return false + } + y_arr[i] = new(big.Int).Mod(oracle(N, proof.W, i), N) + + // assert (z^N = r mod N) + if new(big.Int).Exp(proof.Z_arr[i], N, N).Cmp(y_arr[i]) != 0 { + fmt.Println("z^N != r mod N") + return false + } + // c = (-1)^a * w^b * r mod N + // assert (x^4 = c mod N) + c := new(big.Int).Exp(new(big.Int).Neg(one), proof.A_arr[i], N) + c = new(big.Int).Mod(new(big.Int).Mul(c, new(big.Int).Exp(proof.W, proof.B_arr[i], N)), N) + c = new(big.Int).Mod(new(big.Int).Mul(c, y_arr[i]), N) + + if new(big.Int).Exp(proof.X_arr[i], big.NewInt(4), N).Cmp(c) != 0 { + fmt.Println("x^4 != c mod N") + return false + } + } + + return true +} + +func getQuaticSqrt(N, p, q, w, r *big.Int) (root, a, b *big.Int, err error) { + flag1 := false + flag2 := false + quadratic_root_1 := zero + quadratic_root_2 := zero + + r_arr := make([]*big.Int, 4) + r_arr[0] = r + r_arr[1] = new(big.Int).Mul(r, new(big.Int).Neg(one)) + r_arr[2] = new(big.Int).Mul(r, w) + r_arr[3] = new(big.Int).Mul(r_arr[2], new(big.Int).Neg(one)) + + a1_arr := make([]*big.Int, 4) + a2_arr := make([]*big.Int, 4) + + for i := 0; i < 4; i++ { + a1_arr[i] = new(big.Int).Mod(r_arr[i], p) + a2_arr[i] = new(big.Int).Mod(r_arr[i], q) + } + + for i := 0; i < 4; i++ { + flag1 = quadraticResidue(a1_arr[i], p) == 1 + if !flag1 { + continue + } + + flag2 = quadraticResidue(a2_arr[i], q) == 1 + if !flag2 { + continue + } + + quadratic_root_1 = new(big.Int).ModSqrt(a1_arr[i], p) + quadratic_root_2 = new(big.Int).ModSqrt(a2_arr[i], q) + + if (i & 0x01) > 0 { + a = one + } else { + a = zero + } + + if (i & 0x02) > 0 { + b = one + } else { + b = zero + } + break + } + + if !flag2 { + return nil, nil, nil, fmt.Errorf("No quatic sqrt solution") + } + + a1_arr[0] = quadratic_root_1 + a1_arr[1] = new(big.Int).Mul(quadratic_root_1, new(big.Int).Neg(one)) + a1_arr[2] = quadratic_root_1 + a1_arr[3] = new(big.Int).Mul(quadratic_root_1, new(big.Int).Neg(one)) + + a2_arr[0] = quadratic_root_2 + a2_arr[1] = quadratic_root_2 + a2_arr[2] = new(big.Int).Mul(quadratic_root_2, new(big.Int).Neg(one)) + a2_arr[3] = new(big.Int).Mul(quadratic_root_2, new(big.Int).Neg(one)) + + for i := 0; i < 4; i++ { + flag1 = quadraticResidue(a1_arr[i], p) == 1 + if !flag1 { + continue + } + flag2 = quadraticResidue(a2_arr[i], q) == 1 + if !flag2 { + continue + } + + quadratic_root_1 = new(big.Int).ModSqrt(a1_arr[i], p) + quadratic_root_2 = new(big.Int).ModSqrt(a2_arr[i], q) + + p_inv := new(big.Int).ModInverse(p, q) + q_inv := new(big.Int).ModInverse(q, p) + root = new(big.Int).Mod(new(big.Int).Mul(new(big.Int).Mul(quadratic_root_1, q), q_inv), N) + root = new(big.Int).Mod(new(big.Int).Add(root, new(big.Int).Mul(new(big.Int).Mul(quadratic_root_2, p), p_inv)), N) + return root, a, b, nil + } + return nil, nil, nil, fmt.Errorf("No quatic sqrt solution") +} + +func quadraticResidue(a, p *big.Int) int { + temp := new(big.Int).Exp(a, new(big.Int).Div(new(big.Int).Sub(p, one), two), p) + if temp.Cmp(one) == 0 { + return 1 + } else if temp.Cmp(new(big.Int).Sub(p, one)) == 0 { + return -1 + } + return 0 +} + +func oracle(N, w *big.Int, i int) *big.Int { + rnd := new(big.Int).Mul(crypto.SHA512Int(N, w, big.NewInt(int64(4*i))), crypto.SHA512Int(N, w, big.NewInt(int64(4*i+1)))) + rnd = new(big.Int).Mul(rnd, crypto.SHA512Int(N, w, big.NewInt(int64(4*i+2)))) + rnd = new(big.Int).Mul(rnd, crypto.SHA512Int(N, w, big.NewInt(int64(4*i+3)))) + return rnd +} diff --git a/crypto/zkp/paillier_blum_proof_test.go b/crypto/zkp/paillier_blum_proof_test.go new file mode 100644 index 0000000..edc27d1 --- /dev/null +++ b/crypto/zkp/paillier_blum_proof_test.go @@ -0,0 +1,43 @@ +package zkp + +import ( + "crypto/rand" + "fmt" + "math/big" + "testing" + + "github.com/okx/threshold-lib/crypto" +) + +func TestPaillierBlumProof(t *testing.T) { + fmt.Println("----------------------- TestPaillierBlumProof --------------------------") + const bits = 1024 + + concurrency := 4 + var values = make(chan *big.Int, concurrency) + var p, q *big.Int + for p == q { + var quit = make(chan int) + for i := 0; i < concurrency; i++ { + go crypto.GenerateSafePrime(bits, values, quit) + } + p, q = <-values, <-values + close(quit) + } + N := new(big.Int).Mul(p, q) + + proof := PaillierBlumProve(N, p, q) + verify := PaillierBlumVerify(N, proof) + fmt.Println("PaillierBlumProof of honest prover:", verify) + + p, _ = rand.Prime(rand.Reader, bits) + q, _ = rand.Prime(rand.Reader, bits) + fmt.Println("Pi % 4:", new(big.Int).Mod(p, big.NewInt(4))) + fmt.Println("Qi % 4:", new(big.Int).Mod(q, big.NewInt(4))) + + N = new(big.Int).Mul(p, q) + proof = PaillierBlumProve(N, p, q) + verify = PaillierBlumVerify(N, proof) + fmt.Println("PaillierBlumProof of malicious prover:", verify) + +} diff --git a/go.mod b/go.mod index f39e4ea..4e1f84b 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,6 @@ go 1.17 require ( github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412 - github.com/decred/dcrd/dcrec/edwards/v2 v2.0.2 - github.com/decred/dcrd/dcrec/secp256k1/v2 v2.0.0 + github.com/decred/dcrd/dcrec/edwards/v2 v2.0.3 + github.com/decred/dcrd/dcrec/secp256k1/v2 v2.0.1 ) diff --git a/tss/ecdsa/keygen/keygen_test.go b/tss/ecdsa/keygen/keygen_test.go index 6d53f64..1b84554 100644 --- a/tss/ecdsa/keygen/keygen_test.go +++ b/tss/ecdsa/keygen/keygen_test.go @@ -3,15 +3,18 @@ package keygen import ( "encoding/json" "fmt" + "testing" + "github.com/okx/threshold-lib/crypto/curves" "github.com/okx/threshold-lib/crypto/paillier" + "github.com/okx/threshold-lib/crypto/pedersen" "github.com/okx/threshold-lib/tss" "github.com/okx/threshold-lib/tss/key/bip32" "github.com/okx/threshold-lib/tss/key/dkg" - "testing" ) const ( + pedParamsStr = "{\"S\":13817395213773423665748976106069887563215400031989903034408049429189159623246888881612592317674727022888953512054385819429092977115403239906258157202244097241485415363298451415160695747089414269924804324563172126254731208935288395176853289248153163224344837947195551794352714372170241862006229745350720206100529568569903326706522465071953160407559249327843406829943397877417499624472421566341035438108378118335635756026876702727809585543003644182652106484868612447592410485489825417344886519578261106535281338786314136945870688227272056742451068061150072357667594255200825455371193294242284424803170897668949426555425,\"T\":12646452867496863933920518693245448076945324934065007179150675937842809462143388041137327217366863480604024164454053181476261134056508042173677396619091621046697295845899271429173694327241538528083559862042799634332752900457929032597135516603322969801330022552710943053979389903574351073197184678971851077867038477328389498837083801534992728001111781813986801825092859612842444546665472308805440478879962403831545378204083199782379489048179968109465785715883325834618148037339660146296886384179431949544922529706581349706257973164686615951349082129935811005980537931685280584875211268792796177935510214118753649879253,\"Ntilde\":31203981932332851330684971902204167683279436670222650769704368232932597705714815213178259489761831567249732027535018308556325009159384987976366013997949424098969119874421206142006896077007148702247620090092698015141805616903301830015820714685345412225561073461417430194324516227295135698439299870481751523667676431358649281499087889608995507141224753283985619068058187485838992611877407102364133884863015657088284949501806199503611081229593950592540379747602331347045247394118938229140216860250432071881042897379699134249065339561622661666095475238856269226548968314840715169536541404692806522202600968606674667098881}" preParamsStr = "{\"NTildei\":24471520908795186059871345359891817090375082425235011162673163562293216820664510789828605476260176115517411842055396836257208343639030995277175322263758084624457414755788632175712521955658505919013279743494979368113272203677789463548602565981118301653800716121189384752156994925287997166225339564621441206438778955740393180221057367383300037154792187952963218391388563468946645409334612971210896085905056280930519856946112538908255424632924121317632150416586598586793214306932742138260070923446615537142905564533718729288946652140359207920360574975200706166078989291834969251532287540567858173716968846357015270138349,\"H1i\":20525427855544097812900242461323906064694844566721127908596308189362139634932796351990338037155331859755165166468225804820912268858944197770981804143947455994501442981149428098822310447470928457374682794682110850354710456200518000366554808847135225010507970105885978332438055746828580641608638198174105260354736906195605319753574667723013578689012516753815219539851516961366236404521980593518182365012603240654581994925529765101249024754689309931635963810794661571475581905272286571260842205785767159676205901368018463391470835581427837444426656612683690455228541028875229228051625995552836658561731443995968771287788,\"H2i\":14561886462801513025229647032463855918071292086106088637653093122443632316900764053418831163999153989988643257167279826735804838683222492162945450354760976026539895948631486301719383942423900097939116970423123551167467739873293443276733568908835651175478613657226786889798591766941448274568403953774018961350069278513251708000024532723935518612136374339804631761356041438752219980855367614912814730211618900394962484968025879140621313034875912024520604802101951780131868299628079385785798916363779339123951610598183476830672767548597981792629985786029649395570390192737424564998427393536184577476205531938017713907537,\"Alpha\":15562395633401930119640319530685053105534487592669191131770549017020512836227813395433398013401899672808149896260415156005395650961577495248684112199870239290842042560405884222603358515341370868923091465869971181089036403932954215982530133253275808649915955629978395955053483946662714544209903814385313430160541625128661561277888916430771363680920637690494652922130604979659273437231654682379800477479474793339467647687163077730878952413184314085561763375724610716711310748898159971608300807004602791622905928075714005483877645756072135214117404734704436395780584072358660771347598146098721453405712285848600410929912,\"Beta\":2395165474635562375328345168197470419270712853015774984255058066914332835031654638443038211809208885507287294824752534870350008496826826350516586118916243850537128710018544377070657961787021005710261809699685606781195081429046500235631252686233860824641938201591401143177392380699803128257310699979970380819582013645704325217394895352558949906568690971372208643798583918394057857288004538171668501365327120899644543818081629047710813539155106955681360755489819630513934947888711688521552671506732141320287584388268958167835966566882566177748042701818683114194170779163415799948893004383756208873564628601506303306733,\"P\":78946358809465488657785646401276462719477605320468420301685497279392498318081224458347091460869018078980790500414678741720386595780837578599171293477368521302224467006469988809257162522761685335900641074366451195515153523873921985410903393962006195879192213513994867756111011843999943944429711391222186861091,\"Q\":77494140571626675280459642381974308521056398681316094978062801680359479201622037388948094745850542427491783310684134503735540058334580018731497272439023435198860202702815565075741003080812047756218005315134111060182393701088010552028153733171070602610292439056776957470549025846108495103549355647541809857301}" ) @@ -50,17 +53,24 @@ func TestKeyGen(t *testing.T) { if err != nil { fmt.Println("preParams Unmarshal error, ", err) } + + ped := &pedersen.PedersenParameters{} + err = json.Unmarshal([]byte(pedParamsStr), ped) + if err != nil { + fmt.Println("pedersen parameters Unmarshal error, ", err) + } + // 1-->2 1--->3 paiPriKey, _, _ := paillier.NewKeyPair(8) - p1Data, _ := P1(p1SaveData.ShareI, paiPriKey, setUp1.DeviceNumber, setUp2.DeviceNumber, preParams) + p1Data, _ := P1(p1SaveData.ShareI, paiPriKey, setUp1.DeviceNumber, setUp2.DeviceNumber, preParams, ped) fmt.Println("p1Data", p1Data) publicKey, _ := curves.NewECPoint(curve, p2SaveData.PublicKey.X, p2SaveData.PublicKey.Y) - p2Data, _ := P2(p2SaveData.ShareI, publicKey, p1Data, setUp1.DeviceNumber, setUp2.DeviceNumber) + p2Data, _ := P2(p2SaveData.ShareI, publicKey, p1Data, setUp1.DeviceNumber, setUp2.DeviceNumber, ped) fmt.Println("p2Data", p2Data) - p1Data, _ = P1(p1SaveData.ShareI, paiPriKey, setUp1.DeviceNumber, setUp3.DeviceNumber, preParams) + p1Data, _ = P1(p1SaveData.ShareI, paiPriKey, setUp1.DeviceNumber, setUp3.DeviceNumber, preParams, ped) fmt.Println("p1Data", p1Data) - p2Data, _ = P2(p3SaveData.ShareI, publicKey, p1Data, setUp1.DeviceNumber, setUp3.DeviceNumber) + p2Data, _ = P2(p3SaveData.ShareI, publicKey, p1Data, setUp1.DeviceNumber, setUp3.DeviceNumber, ped) fmt.Println("p2Data", p2Data) fmt.Println("=========bip32==========") diff --git a/tss/ecdsa/keygen/party1.go b/tss/ecdsa/keygen/party1.go index cbda939..743d757 100644 --- a/tss/ecdsa/keygen/party1.go +++ b/tss/ecdsa/keygen/party1.go @@ -9,6 +9,7 @@ import ( "github.com/okx/threshold-lib/crypto" "github.com/okx/threshold-lib/crypto/curves" "github.com/okx/threshold-lib/crypto/paillier" + "github.com/okx/threshold-lib/crypto/pedersen" "github.com/okx/threshold-lib/crypto/schnorr" "github.com/okx/threshold-lib/crypto/vss" "github.com/okx/threshold-lib/crypto/zkp" @@ -73,16 +74,18 @@ type P1Data struct { PaiPubKey *paillier.PublicKey // paillier public key X1 *curves.ECPoint - NIZKProof []string - DlnProof1 *zkp.DlnProof - DlnProof2 *zkp.DlnProof - PDLwSlackProof *zkp.PDLwSlackProof - StatementParams *zkp.StatementParams + NIZKProof []string + DlnProof1 *zkp.DlnProof + DlnProof2 *zkp.DlnProof + PDLwSlackProof *zkp.PDLwSlackProof + StatementParams *zkp.StatementParams + PaillierBlumProof *zkp.PaillierBlumProof + NSFProof *zkp.NoSmallFactorProof } // P1 after dkg, prepare for 2-party signature, P1 send encrypt x1 to P2 // paillier key pair generation is time-consuming, generated in advance, encrypted storage? -func P1(share1 *big.Int, paiPriKey *paillier.PrivateKey, from, to int, preParams *PreParams) (*tss.Message, error) { +func P1(share1 *big.Int, paiPriKey *paillier.PrivateKey, from, to int, preParams *PreParams, ped *pedersen.PedersenParameters) (*tss.Message, error) { // lagrangian interpolation x1 x1 := vss.CalLagrangian(curve, big.NewInt(int64(from)), share1, []*big.Int{big.NewInt(int64(from)), big.NewInt(int64(to))}) paiPubKey := &paiPriKey.PublicKey @@ -136,16 +139,24 @@ func P1(share1 *big.Int, paiPriKey *paillier.PrivateKey, from, to int, preParams return nil, fmt.Errorf("PDLwSlack proof fail") } + // PaillierBlumProof + paillierBlumPf := zkp.PaillierBlumProve(paiPubKey.N, paiPriKey.P, paiPriKey.Q) + + // No Small Factor Proof + nsfProof := zkp.NoSmallFactorProve(paiPubKey.N, paiPriKey.P, paiPriKey.Q, ped) + p1Data := P1Data{ - E_x1: E_x1, - Proof: proof, - PaiPubKey: paiPubKey, - X1: X1, - NIZKProof: nizkProof, - DlnProof1: dlnProof1, - DlnProof2: dlnProof2, - PDLwSlackProof: pdlWSlackPf, - StatementParams: statementParams, + E_x1: E_x1, + Proof: proof, + PaiPubKey: paiPubKey, + X1: X1, + NIZKProof: nizkProof, + DlnProof1: dlnProof1, + DlnProof2: dlnProof2, + PDLwSlackProof: pdlWSlackPf, + StatementParams: statementParams, + PaillierBlumProof: paillierBlumPf, + NSFProof: nsfProof, } bytes, err := json.Marshal(p1Data) if err != nil { diff --git a/tss/ecdsa/keygen/party2.go b/tss/ecdsa/keygen/party2.go index f6677ee..fa863a0 100644 --- a/tss/ecdsa/keygen/party2.go +++ b/tss/ecdsa/keygen/party2.go @@ -7,6 +7,7 @@ import ( "github.com/okx/threshold-lib/crypto/curves" "github.com/okx/threshold-lib/crypto/paillier" + "github.com/okx/threshold-lib/crypto/pedersen" "github.com/okx/threshold-lib/crypto/schnorr" "github.com/okx/threshold-lib/crypto/vss" "github.com/okx/threshold-lib/crypto/zkp" @@ -22,7 +23,7 @@ type P2SaveData struct { } // P2 after dkg, prepare for 2-party signature, P2 receives encrypt x1 and paillier public key from P1 -func P2(share2 *big.Int, publicKey *curves.ECPoint, msg *tss.Message, from, to int) (*P2SaveData, error) { +func P2(share2 *big.Int, publicKey *curves.ECPoint, msg *tss.Message, from, to int, ped *pedersen.PedersenParameters) (*P2SaveData, error) { if msg.From != from || msg.To != to { return nil, fmt.Errorf("message mismatch") } @@ -80,6 +81,19 @@ func P2(share2 *big.Int, publicKey *curves.ECPoint, msg *tss.Message, from, to i if !slackVerify { return nil, fmt.Errorf("PDLwSlackVerify fail") } + + // paillier blum verify + paillierBlumVerify := zkp.PaillierBlumVerify(p1Data.PaiPubKey.N, p1Data.PaillierBlumProof) + if !paillierBlumVerify { + return nil, fmt.Errorf("PaillierBlumVerify fail") + } + + // no small factor verify + nsfVerify := zkp.NoSmallFactorVerify(p1Data.PaiPubKey.N, p1Data.NSFProof, ped) + if !nsfVerify { + return nil, fmt.Errorf("NoSmallFactorVerify fail") + } + // P2 additional save key information p2SaveData := &P2SaveData{ From: from, diff --git a/tss/ecdsa/sign/party1.go b/tss/ecdsa/sign/party1.go index 32480f3..6775779 100644 --- a/tss/ecdsa/sign/party1.go +++ b/tss/ecdsa/sign/party1.go @@ -11,7 +11,9 @@ import ( "github.com/okx/threshold-lib/crypto/commitment" "github.com/okx/threshold-lib/crypto/curves" "github.com/okx/threshold-lib/crypto/paillier" + "github.com/okx/threshold-lib/crypto/pedersen" "github.com/okx/threshold-lib/crypto/schnorr" + "github.com/okx/threshold-lib/crypto/zkp" ) var ( @@ -23,15 +25,17 @@ type P1Context struct { publicKey *ecdsa.PublicKey paiPriKey *paillier.PrivateKey + E_x1 *big.Int k1 *big.Int message string R2 *curves.ECPoint // k2*G cmtD *commitment.Witness + ped *pedersen.PedersenParameters } // NewP1 2-party signature, P1 init -func NewP1(publicKey *ecdsa.PublicKey, message string, paiPriKey *paillier.PrivateKey) *P1Context { +func NewP1(E_x1 *big.Int, publicKey *ecdsa.PublicKey, message string, paiPriKey *paillier.PrivateKey, ped *pedersen.PedersenParameters) *P1Context { msg, err := hex.DecodeString(message) if err != nil { return nil @@ -44,6 +48,8 @@ func NewP1(publicKey *ecdsa.PublicKey, message string, paiPriKey *paillier.Priva message: message, paiPriKey: paiPriKey, sessionID: sessionId, + ped: ped, + E_x1: E_x1, } return p1Context } @@ -76,7 +82,19 @@ func (p1 *P1Context) Step2(p2Proof *schnorr.Proof, R2 *curves.ECPoint) (*schnorr return proof, p1.cmtD, nil } -func (p1 *P1Context) Step3(E_k2_h_xr *big.Int) (*big.Int, *big.Int, error) { +func (p1 *P1Context) Step3(aff_g_proof *zkp.AffGProof, E_k2_h_xr *big.Int) (*big.Int, *big.Int, error) { + statement := &zkp.AffGStatement{ + N: p1.paiPriKey.N, + C: p1.E_x1, + D: E_k2_h_xr, + X: aff_g_proof.X, + Y: aff_g_proof.Y, + } + verify := zkp.PaillierAffineVerify(p1.ped, aff_g_proof, statement) + if !verify { + return nil, nil, fmt.Errorf("paillier affine verify fail") + } + q := curve.N // R = k1*k2*G, k = k1*k2 Rx, _ := curve.ScalarMult(p1.R2.X, p1.R2.Y, p1.k1.Bytes()) diff --git a/tss/ecdsa/sign/party2.go b/tss/ecdsa/sign/party2.go index c8eb39b..6e9b5e4 100644 --- a/tss/ecdsa/sign/party2.go +++ b/tss/ecdsa/sign/party2.go @@ -10,7 +10,9 @@ import ( "github.com/okx/threshold-lib/crypto/commitment" "github.com/okx/threshold-lib/crypto/curves" "github.com/okx/threshold-lib/crypto/paillier" + "github.com/okx/threshold-lib/crypto/pedersen" "github.com/okx/threshold-lib/crypto/schnorr" + "github.com/okx/threshold-lib/crypto/zkp" ) type P2Context struct { @@ -23,10 +25,11 @@ type P2Context struct { message string k2 *big.Int cmtC *commitment.Commitment + ped *pedersen.PedersenParameters } // NewP1 2-party signature, P2 init -func NewP2(bobPri, E_x1 *big.Int, publicKey *ecdsa.PublicKey, paiPub *paillier.PublicKey, message string) *P2Context { +func NewP2(bobPri, E_x1 *big.Int, publicKey *ecdsa.PublicKey, paiPub *paillier.PublicKey, message string, ped *pedersen.PedersenParameters) *P2Context { msg, err := hex.DecodeString(message) if err != nil { return nil @@ -41,6 +44,7 @@ func NewP2(bobPri, E_x1 *big.Int, publicKey *ecdsa.PublicKey, paiPub *paillier.P PublicKey: publicKey, message: message, sessionID: sessionId, + ped: ped, } return p2Context } @@ -59,33 +63,34 @@ func (p2 *P2Context) Step1(cmtC *commitment.Commitment) (*schnorr.Proof, *curves } // Step2 paillier encrypt compute, return E[(h+xr)/k2] -func (p2 *P2Context) Step2(cmtD *commitment.Witness, p1Proof *schnorr.Proof) (*big.Int, error) { +func (p2 *P2Context) Step2(cmtD *commitment.Witness, p1Proof *schnorr.Proof) (*zkp.AffGProof, *big.Int, error) { q := curve.N + N2 := new(big.Int).Mul(p2.paiPub.N, p2.paiPub.N) // check R1=k1*G commitment commit := commitment.HashCommitment{} commit.C = *p2.cmtC commit.Msg = *cmtD ok, commitD := commit.Open() if !ok { - return nil, fmt.Errorf("commitment DeCommit fail") + return nil, nil, fmt.Errorf("commitment DeCommit fail") } if commitD[0].Cmp(p2.sessionID) != 0 { - return nil, fmt.Errorf("p2 Step2 commitment sessionId error") + return nil, nil, fmt.Errorf("p2 Step2 commitment sessionId error") } R1, err := curves.NewECPoint(curve, commitD[1], commitD[2]) if err != nil { - return nil, err + return nil, nil, err } verify := schnorr.VerifyWithId(p2.sessionID, p1Proof, R1) if !verify { - return nil, fmt.Errorf("schnorr verify fail") + return nil, nil, fmt.Errorf("schnorr verify fail") } // R = k1*k2*G, k = k1*k2 Rx, _ := curve.ScalarMult(R1.X, R1.Y, p2.k2.Bytes()) r := new(big.Int).Mod(Rx, q) bytes, err := hex.DecodeString(p2.message) if err != nil { - return nil, err + return nil, nil, err } k2_1 := new(big.Int).ModInverse(p2.k2, q) @@ -96,20 +101,35 @@ func (p2 *P2Context) Step2(cmtD *commitment.Witness, p1Proof *schnorr.Proof) (*b rhoq := new(big.Int).Mul(rho, q) h_rhoq := new(big.Int).Add(h, rhoq) // h/k2 + rho*q - E_x, err := p2.paiPub.HomoAddPlain(p2.E_x1, p2.x2) - if err != nil { - return nil, err - } - r = new(big.Int).Mul(r, k2_1) // r/k2 - E_xr, err := p2.paiPub.HomoMulPlain(E_x, r) - if err != nil { - return nil, err + // s' = (h+r*(x1+x2))/k2 = a * x1 + b + // a = r/k2, b = h/k2 + rho * q + r/k2 * x2 + a := new(big.Int).Mul(r, k2_1) // r/k2 + b := new(big.Int).Add(h_rhoq, new(big.Int).Mul(a, p2.x2)) // h/k2 + rho*q + r/k2 * x2 + rnd := crypto.RandomNum(p2.paiPub.N) + + a_x1, _ := p2.paiPub.HomoMulPlain(p2.E_x1, a) + a_x1_b, _ := p2.paiPub.HomoAddPlain(a_x1, b) + E_k2_h_xr := new(big.Int).Mod(new(big.Int).Mul(a_x1_b, new(big.Int).Exp(rnd, p2.paiPub.N, N2)), N2) + A := curves.ScalarToPoint(curve, a) + B := curves.ScalarToPoint(curve, b) + + st := &zkp.AffGStatement{ + N: p2.paiPub.N, + C: p2.E_x1, + D: E_k2_h_xr, + X: A, + Y: B, } - E_k2_h_xr, err := p2.paiPub.HomoAddPlain(E_xr, h_rhoq) - if err != nil { - return nil, err + + wit := &zkp.AffGWitness{ + X: a, + Y: b, + Rho: rnd, } - return E_k2_h_xr, nil + + aff_g_proof := zkp.PaillierAffineProve(p2.ped, st, wit) + + return aff_g_proof, E_k2_h_xr, nil } func CalculateM(hash []byte) *big.Int { diff --git a/tss/ecdsa/sign/sign_test.go b/tss/ecdsa/sign/sign_test.go index 5011ec9..1f44895 100644 --- a/tss/ecdsa/sign/sign_test.go +++ b/tss/ecdsa/sign/sign_test.go @@ -12,6 +12,7 @@ import ( "github.com/okx/threshold-lib/crypto" "github.com/okx/threshold-lib/crypto/curves" "github.com/okx/threshold-lib/crypto/paillier" + "github.com/okx/threshold-lib/crypto/pedersen" "testing" @@ -22,6 +23,7 @@ import ( ) const ( + pedParamsStr = "{\"S\":13817395213773423665748976106069887563215400031989903034408049429189159623246888881612592317674727022888953512054385819429092977115403239906258157202244097241485415363298451415160695747089414269924804324563172126254731208935288395176853289248153163224344837947195551794352714372170241862006229745350720206100529568569903326706522465071953160407559249327843406829943397877417499624472421566341035438108378118335635756026876702727809585543003644182652106484868612447592410485489825417344886519578261106535281338786314136945870688227272056742451068061150072357667594255200825455371193294242284424803170897668949426555425,\"T\":12646452867496863933920518693245448076945324934065007179150675937842809462143388041137327217366863480604024164454053181476261134056508042173677396619091621046697295845899271429173694327241538528083559862042799634332752900457929032597135516603322969801330022552710943053979389903574351073197184678971851077867038477328389498837083801534992728001111781813986801825092859612842444546665472308805440478879962403831545378204083199782379489048179968109465785715883325834618148037339660146296886384179431949544922529706581349706257973164686615951349082129935811005980537931685280584875211268792796177935510214118753649879253,\"Ntilde\":31203981932332851330684971902204167683279436670222650769704368232932597705714815213178259489761831567249732027535018308556325009159384987976366013997949424098969119874421206142006896077007148702247620090092698015141805616903301830015820714685345412225561073461417430194324516227295135698439299870481751523667676431358649281499087889608995507141224753283985619068058187485838992611877407102364133884863015657088284949501806199503611081229593950592540379747602331347045247394118938229140216860250432071881042897379699134249065339561622661666095475238856269226548968314840715169536541404692806522202600968606674667098881}" preParamsStr = "{\"NTildei\":24471520908795186059871345359891817090375082425235011162673163562293216820664510789828605476260176115517411842055396836257208343639030995277175322263758084624457414755788632175712521955658505919013279743494979368113272203677789463548602565981118301653800716121189384752156994925287997166225339564621441206438778955740393180221057367383300037154792187952963218391388563468946645409334612971210896085905056280930519856946112538908255424632924121317632150416586598586793214306932742138260070923446615537142905564533718729288946652140359207920360574975200706166078989291834969251532287540567858173716968846357015270138349,\"H1i\":20525427855544097812900242461323906064694844566721127908596308189362139634932796351990338037155331859755165166468225804820912268858944197770981804143947455994501442981149428098822310447470928457374682794682110850354710456200518000366554808847135225010507970105885978332438055746828580641608638198174105260354736906195605319753574667723013578689012516753815219539851516961366236404521980593518182365012603240654581994925529765101249024754689309931635963810794661571475581905272286571260842205785767159676205901368018463391470835581427837444426656612683690455228541028875229228051625995552836658561731443995968771287788,\"H2i\":14561886462801513025229647032463855918071292086106088637653093122443632316900764053418831163999153989988643257167279826735804838683222492162945450354760976026539895948631486301719383942423900097939116970423123551167467739873293443276733568908835651175478613657226786889798591766941448274568403953774018961350069278513251708000024532723935518612136374339804631761356041438752219980855367614912814730211618900394962484968025879140621313034875912024520604802101951780131868299628079385785798916363779339123951610598183476830672767548597981792629985786029649395570390192737424564998427393536184577476205531938017713907537,\"Alpha\":15562395633401930119640319530685053105534487592669191131770549017020512836227813395433398013401899672808149896260415156005395650961577495248684112199870239290842042560405884222603358515341370868923091465869971181089036403932954215982530133253275808649915955629978395955053483946662714544209903814385313430160541625128661561277888916430771363680920637690494652922130604979659273437231654682379800477479474793339467647687163077730878952413184314085561763375724610716711310748898159971608300807004602791622905928075714005483877645756072135214117404734704436395780584072358660771347598146098721453405712285848600410929912,\"Beta\":2395165474635562375328345168197470419270712853015774984255058066914332835031654638443038211809208885507287294824752534870350008496826826350516586118916243850537128710018544377070657961787021005710261809699685606781195081429046500235631252686233860824641938201591401143177392380699803128257310699979970380819582013645704325217394895352558949906568690971372208643798583918394057857288004538171668501365327120899644543818081629047710813539155106955681360755489819630513934947888711688521552671506732141320287584388268958167835966566882566177748042701818683114194170779163415799948893004383756208873564628601506303306733,\"P\":78946358809465488657785646401276462719477605320468420301685497279392498318081224458347091460869018078980790500414678741720386595780837578599171293477368521302224467006469988809257162522761685335900641074366451195515153523873921985410903393962006195879192213513994867756111011843999943944429711391222186861091,\"Q\":77494140571626675280459642381974308521056398681316094978062801680359479201622037388948094745850542427491783310684134503735540058334580018731497272439023435198860202702815565075741003080812047756218005315134111060182393701088010552028153733171070602610292439056776957470549025846108495103549355647541809857301}" ) @@ -37,17 +39,23 @@ func TestTwoSign(t *testing.T) { paiPri, paiPub, _ := paillier.NewKeyPair(8) - p1 := NewP1(publicKey.ToECDSA(), hex.EncodeToString(message), paiPri) E_x1, _, _ := paiPub.Encrypt(x1) - p2 := NewP2(x2, E_x1, publicKey.ToECDSA(), paiPub, hex.EncodeToString(message)) + ped := &pedersen.PedersenParameters{} + err := json.Unmarshal([]byte(pedParamsStr), ped) + if err != nil { + fmt.Println("pedParams Unmarshal error, ", err) + return + } + p1 := NewP1(E_x1, publicKey.ToECDSA(), hex.EncodeToString(message), paiPri, ped) + p2 := NewP2(x2, E_x1, publicKey.ToECDSA(), paiPub, hex.EncodeToString(message), ped) commit, _ := p1.Step1() bobProof, R2, _ := p2.Step1(commit) proof, cmtD, _ := p1.Step2(bobProof, R2) - E_k2_h_xr, _ := p2.Step2(cmtD, proof) + aff_g_proof, E_k2_h_xr, _ := p2.Step2(cmtD, proof) - r, s, _ := p1.Step3(E_k2_h_xr) + r, s, _ := p1.Step3(aff_g_proof, E_k2_h_xr) fmt.Println(r, s) } @@ -61,11 +69,17 @@ func TestEcdsaSign(t *testing.T) { fmt.Println("preParams Unmarshal error, ", err) return } + ped := &pedersen.PedersenParameters{} + err = json.Unmarshal([]byte(pedParamsStr), ped) + if err != nil { + fmt.Println("pedParams Unmarshal error, ", err) + return + } paiPrivate, _, _ := paillier.NewKeyPair(8) - p1Dto, _ := keygen.P1(p1Data.ShareI, paiPrivate, p1Data.Id, p2Data.Id, preParams) + p1Dto, _ := keygen.P1(p1Data.ShareI, paiPrivate, p1Data.Id, p2Data.Id, preParams, ped) publicKey, _ := curves.NewECPoint(curve, p2Data.PublicKey.X, p2Data.PublicKey.Y) - p2SaveData, err := keygen.P2(p2Data.ShareI, publicKey, p1Dto, p1Data.Id, p2Data.Id) + p2SaveData, err := keygen.P2(p2Data.ShareI, publicKey, p1Dto, p1Data.Id, p2Data.Id, ped) fmt.Println(p2SaveData, err) fmt.Println("=========bip32==========") @@ -79,16 +93,16 @@ func TestEcdsaSign(t *testing.T) { hash.Write([]byte("hello")) message := hash.Sum(nil) - p1 := NewP1(pubKey, hex.EncodeToString(message), paiPrivate) - p2 := NewP2(x2, p2SaveData.E_x1, pubKey, p2SaveData.PaiPubKey, hex.EncodeToString(message)) + p1 := NewP1(p2SaveData.E_x1, pubKey, hex.EncodeToString(message), paiPrivate, ped) + p2 := NewP2(x2, p2SaveData.E_x1, pubKey, p2SaveData.PaiPubKey, hex.EncodeToString(message), ped) commit, _ := p1.Step1() bobProof, R2, _ := p2.Step1(commit) proof, cmtD, _ := p1.Step2(bobProof, R2) - E_k2_h_xr, _ := p2.Step2(cmtD, proof) + aff_g_proof, E_k2_h_xr, _ := p2.Step2(cmtD, proof) - r, s, _ := p1.Step3(E_k2_h_xr) + r, s, _ := p1.Step3(aff_g_proof, E_k2_h_xr) fmt.Println(r, s) } diff --git a/tss/key/reshare/update_round3.go b/tss/key/reshare/update_round3.go index b71c0b4..00727af 100644 --- a/tss/key/reshare/update_round3.go +++ b/tss/key/reshare/update_round3.go @@ -59,10 +59,6 @@ func (info *RefreshInfo) DKGStep3(msgs []*tss.Message) (*tss.KeyStep3Data, error xi.Y = new(big.Int).Add(xi.Y, content.Share.Y) ujPoint := verifiers[msg.From][0] - // filter 0*G - if ujPoint.X.Cmp(big.NewInt(0)) == 0 || ujPoint.Y.Cmp(big.NewInt(0)) == 0 { - continue - } point, err := curves.NewECPoint(curve, ujPoint.X, ujPoint.Y) if err != nil { return nil, err @@ -78,9 +74,6 @@ func (info *RefreshInfo) DKGStep3(msgs []*tss.Message) (*tss.KeyStep3Data, error v[j] = curves.ScalarToPoint(curve, big.NewInt(0)) for _, verifier := range verifiers { - if !verifier[j].IsOnCurve() { - continue - } v[j], err = v[j].Add(verifier[j]) if err != nil { return nil, err diff --git a/tss/key/reshare/update_round_test.go b/tss/key/reshare/update_round_test.go index 9dada0e..fcfbcc3 100644 --- a/tss/key/reshare/update_round_test.go +++ b/tss/key/reshare/update_round_test.go @@ -3,15 +3,14 @@ package reshare import ( "crypto/elliptic" "fmt" - "github.com/decred/dcrd/dcrec/secp256k1/v2" + "github.com/decred/dcrd/dcrec/edwards/v2" "github.com/okx/threshold-lib/tss" "github.com/okx/threshold-lib/tss/key/dkg" "testing" ) func TestRefresh(t *testing.T) { - // curve := edwards.Edwards() - curve := secp256k1.S256() + curve := edwards.Edwards() p1Data, p2Data, p3Data := KeyGen(curve) // Reset private key share by 1, 3 devoteList := [2]int{1, 3} From c191c162d2f7cd52f9ce6eb5b945d3cd5f21be68 Mon Sep 17 00:00:00 2001 From: Jason-LI2020 Date: Fri, 1 Sep 2023 14:18:10 +0800 Subject: [PATCH 2/7] correct reshare --- tss/key/reshare/update_round3.go | 7 +++++++ tss/key/reshare/update_round_test.go | 8 +++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/tss/key/reshare/update_round3.go b/tss/key/reshare/update_round3.go index 00727af..b71c0b4 100644 --- a/tss/key/reshare/update_round3.go +++ b/tss/key/reshare/update_round3.go @@ -59,6 +59,10 @@ func (info *RefreshInfo) DKGStep3(msgs []*tss.Message) (*tss.KeyStep3Data, error xi.Y = new(big.Int).Add(xi.Y, content.Share.Y) ujPoint := verifiers[msg.From][0] + // filter 0*G + if ujPoint.X.Cmp(big.NewInt(0)) == 0 || ujPoint.Y.Cmp(big.NewInt(0)) == 0 { + continue + } point, err := curves.NewECPoint(curve, ujPoint.X, ujPoint.Y) if err != nil { return nil, err @@ -74,6 +78,9 @@ func (info *RefreshInfo) DKGStep3(msgs []*tss.Message) (*tss.KeyStep3Data, error v[j] = curves.ScalarToPoint(curve, big.NewInt(0)) for _, verifier := range verifiers { + if !verifier[j].IsOnCurve() { + continue + } v[j], err = v[j].Add(verifier[j]) if err != nil { return nil, err diff --git a/tss/key/reshare/update_round_test.go b/tss/key/reshare/update_round_test.go index fcfbcc3..f950044 100644 --- a/tss/key/reshare/update_round_test.go +++ b/tss/key/reshare/update_round_test.go @@ -3,14 +3,16 @@ package reshare import ( "crypto/elliptic" "fmt" - "github.com/decred/dcrd/dcrec/edwards/v2" + "testing" + + "github.com/decred/dcrd/dcrec/secp256k1/v2" "github.com/okx/threshold-lib/tss" "github.com/okx/threshold-lib/tss/key/dkg" - "testing" ) func TestRefresh(t *testing.T) { - curve := edwards.Edwards() + // curve := edwards.Edwards() + curve := secp256k1.S256() p1Data, p2Data, p3Data := KeyGen(curve) // Reset private key share by 1, 3 devoteList := [2]int{1, 3} From ae85b47f031dc56c2a43a0510b16a1876de64b69 Mon Sep 17 00:00:00 2001 From: debuggor Date: Thu, 9 Nov 2023 14:19:58 +0800 Subject: [PATCH 3/7] add audit --- ...ertik-audit-okx-threshold-lib-20231011.pdf | Bin 0 -> 2647077 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 audits/certik-audit-okx-threshold-lib-20231011.pdf diff --git a/audits/certik-audit-okx-threshold-lib-20231011.pdf b/audits/certik-audit-okx-threshold-lib-20231011.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fbfbe67f3ac3ca1a2b738d530c2561e6347e3343 GIT binary patch literal 2647077 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