mirror of
https://source.quilibrium.com/quilibrium/ceremonyclient.git
synced 2024-12-26 08:35:17 +00:00
80 lines
2.5 KiB
Go
80 lines
2.5 KiB
Go
|
package bulletproof
|
||
|
|
||
|
import (
|
||
|
crand "crypto/rand"
|
||
|
"testing"
|
||
|
|
||
|
"github.com/gtank/merlin"
|
||
|
"github.com/stretchr/testify/require"
|
||
|
|
||
|
"source.quilibrium.com/quilibrium/monorepo/nekryptology/pkg/core/curves"
|
||
|
)
|
||
|
|
||
|
func TestIPPVerifyHappyPath(t *testing.T) {
|
||
|
curve := curves.ED25519()
|
||
|
vecLength := 256
|
||
|
prover, err := NewInnerProductProver(vecLength, []byte("test"), *curve)
|
||
|
require.NoError(t, err)
|
||
|
a := randScalarVec(vecLength, *curve)
|
||
|
b := randScalarVec(vecLength, *curve)
|
||
|
u := curve.Point.Random(crand.Reader)
|
||
|
transcriptProver := merlin.NewTranscript("test")
|
||
|
proof, err := prover.Prove(a, b, u, transcriptProver)
|
||
|
require.NoError(t, err)
|
||
|
|
||
|
verifier, err := NewInnerProductVerifier(vecLength, []byte("test"), *curve)
|
||
|
require.NoError(t, err)
|
||
|
capP, err := prover.getP(a, b, u)
|
||
|
require.NoError(t, err)
|
||
|
transcriptVerifier := merlin.NewTranscript("test")
|
||
|
verified, err := verifier.Verify(capP, u, proof, transcriptVerifier)
|
||
|
require.NoError(t, err)
|
||
|
require.True(t, verified)
|
||
|
}
|
||
|
|
||
|
func BenchmarkIPPVerification(bench *testing.B) {
|
||
|
curve := curves.ED25519()
|
||
|
vecLength := 1024
|
||
|
prover, _ := NewInnerProductProver(vecLength, []byte("test"), *curve)
|
||
|
a := randScalarVec(vecLength, *curve)
|
||
|
b := randScalarVec(vecLength, *curve)
|
||
|
u := curve.Point.Random(crand.Reader)
|
||
|
transcriptProver := merlin.NewTranscript("test")
|
||
|
proof, _ := prover.Prove(a, b, u, transcriptProver)
|
||
|
|
||
|
verifier, _ := NewInnerProductVerifier(vecLength, []byte("test"), *curve)
|
||
|
capP, _ := prover.getP(a, b, u)
|
||
|
transcriptVerifier := merlin.NewTranscript("test")
|
||
|
verified, _ := verifier.Verify(capP, u, proof, transcriptVerifier)
|
||
|
require.True(bench, verified)
|
||
|
}
|
||
|
|
||
|
func TestIPPVerifyInvalidProof(t *testing.T) {
|
||
|
curve := curves.ED25519()
|
||
|
vecLength := 64
|
||
|
prover, err := NewInnerProductProver(vecLength, []byte("test"), *curve)
|
||
|
require.NoError(t, err)
|
||
|
|
||
|
a := randScalarVec(vecLength, *curve)
|
||
|
b := randScalarVec(vecLength, *curve)
|
||
|
u := curve.Point.Random(crand.Reader)
|
||
|
|
||
|
aPrime := randScalarVec(64, *curve)
|
||
|
bPrime := randScalarVec(64, *curve)
|
||
|
uPrime := curve.Point.Random(crand.Reader)
|
||
|
transcriptProver := merlin.NewTranscript("test")
|
||
|
|
||
|
proofPrime, err := prover.Prove(aPrime, bPrime, uPrime, transcriptProver)
|
||
|
require.NoError(t, err)
|
||
|
|
||
|
verifier, err := NewInnerProductVerifier(vecLength, []byte("test"), *curve)
|
||
|
require.NoError(t, err)
|
||
|
capP, err := prover.getP(a, b, u)
|
||
|
require.NoError(t, err)
|
||
|
transcriptVerifier := merlin.NewTranscript("test")
|
||
|
// Check for different capP, u from proof
|
||
|
verified, err := verifier.Verify(capP, u, proofPrime, transcriptVerifier)
|
||
|
require.NoError(t, err)
|
||
|
require.False(t, verified)
|
||
|
}
|