github.com/dusk-network/dusk-crypto@v0.1.3/rangeproof/innerproduct/innerproduct_test.go (about) 1 package innerproduct 2 3 import ( 4 "bytes" 5 "testing" 6 7 ristretto "github.com/bwesterb/go-ristretto" 8 "github.com/dusk-network/dusk-crypto/rangeproof/pedersen" 9 "github.com/dusk-network/dusk-crypto/rangeproof/vector" 10 "github.com/stretchr/testify/assert" 11 ) 12 13 func TestProofCreation(t *testing.T) { 14 15 var n uint32 = 1 16 17 for i := 1; i < 12; i++ { 18 19 P, G, H, Hpf, a, b, Q := testHelpCreate(n, t) 20 21 proof, err := Generate(G, H, a, b, Hpf, Q) 22 assert.Equal(t, nil, err) 23 24 ok := proof.Verify(G, H, proof.L, proof.R, Hpf, Q, P, int(n)) 25 assert.True(t, ok) 26 27 buf := &bytes.Buffer{} 28 29 err = proof.Encode(buf) 30 assert.Equal(t, nil, err) 31 32 var decodedProof Proof 33 decodedProof.Decode(buf) 34 assert.Equal(t, nil, err) 35 ok = proof.Equals(decodedProof) 36 assert.True(t, ok) 37 38 n = n * 2 39 } 40 41 } 42 43 // given an n returns P, G,H,HprimeFactors a, b, Q 44 func testHelpCreate(n uint32, t *testing.T) (ristretto.Point, []ristretto.Point, []ristretto.Point, []ristretto.Scalar, []ristretto.Scalar, []ristretto.Scalar, ristretto.Point) { 45 a := randomScalarArr(n) 46 b := randomScalarArr(n) 47 c, err := vector.InnerProduct(a, b) 48 49 assert.Equal(t, nil, err) 50 51 var y ristretto.Scalar 52 y.Rand() 53 var yInv ristretto.Scalar 54 yInv.Inverse(&y) 55 56 var Q ristretto.Point 57 Q.Rand() 58 59 HprimeFactors := vector.ScalarPowers(yInv, n) 60 bPrime := make([]ristretto.Scalar, n) 61 copy(bPrime, b) 62 63 for i := range bPrime { 64 bPrime[i].Mul(&b[i], &HprimeFactors[i]) 65 } 66 67 aPrime := make([]ristretto.Scalar, n) 68 copy(aPrime, a) 69 70 // P = aPrime * G + bPrime * H + c * Q = k1 + k2 + k3 71 var k1 ristretto.Point 72 var k2 ristretto.Point 73 var k3 ristretto.Point 74 75 genData := []byte("dusk.BulletProof.vec1") 76 ped := pedersen.New(genData) 77 ped.BaseVector.Compute(n) 78 79 genData = append(genData, uint8(1)) 80 81 ped2 := pedersen.New(genData) 82 ped2.BaseVector.Compute(n) 83 84 H := ped2.BaseVector.Bases 85 G := ped.BaseVector.Bases 86 87 k1, err = vector.Exp(aPrime, G, int(n), 1) 88 k2, err = vector.Exp(bPrime, H, int(n), 1) 89 k3.ScalarMult(&Q, &c) 90 91 var P ristretto.Point 92 P.SetZero() 93 P.Add(&k1, &k2) 94 P.Add(&P, &k3) 95 96 return P, G, H, HprimeFactors, a, b, Q 97 } 98 99 func randomScalarArr(n uint32) []ristretto.Scalar { 100 res := make([]ristretto.Scalar, n) 101 102 for i := range res { 103 var rand ristretto.Scalar 104 rand.Rand() 105 res[i] = rand 106 } 107 return res 108 }