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  }