mirror of
https://github.com/sonr-io/crypto.git
synced 2026-01-12 04:09:13 +00:00
113 lines
2.2 KiB
Go
113 lines
2.2 KiB
Go
|
|
package vrf
|
||
|
|
|
||
|
|
import (
|
||
|
|
"bytes"
|
||
|
|
"testing"
|
||
|
|
// "fmt"
|
||
|
|
)
|
||
|
|
|
||
|
|
func TestHonestComplete(t *testing.T) {
|
||
|
|
sk, err := GenerateKey(nil)
|
||
|
|
if err != nil {
|
||
|
|
t.Fatal(err)
|
||
|
|
}
|
||
|
|
pk, _ := sk.Public()
|
||
|
|
alice := []byte("alice")
|
||
|
|
aliceVRF := sk.Compute(alice)
|
||
|
|
aliceVRFFromProof, aliceProof := sk.Prove(alice)
|
||
|
|
|
||
|
|
// fmt.Printf("pk: %X\n", pk)
|
||
|
|
// fmt.Printf("sk: %X\n", *sk)
|
||
|
|
// fmt.Printf("alice(bytes): %X\n", alice)
|
||
|
|
// fmt.Printf("aliceVRF: %X\n", aliceVRF)
|
||
|
|
// fmt.Printf("aliceProof: %X\n", aliceProof)
|
||
|
|
|
||
|
|
if !pk.Verify(alice, aliceVRF, aliceProof) {
|
||
|
|
t.Error("Gen -> Compute -> Prove -> Verify -> FALSE")
|
||
|
|
}
|
||
|
|
if !bytes.Equal(aliceVRF, aliceVRFFromProof) {
|
||
|
|
t.Error("Compute != Prove")
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestConvertPrivateKeyToPublicKey(t *testing.T) {
|
||
|
|
sk, err := GenerateKey(nil)
|
||
|
|
if err != nil {
|
||
|
|
t.Fatal(err)
|
||
|
|
}
|
||
|
|
|
||
|
|
pk, ok := sk.Public()
|
||
|
|
if !ok {
|
||
|
|
t.Fatal("Couldn't obtain public key.")
|
||
|
|
}
|
||
|
|
if !bytes.Equal(sk[32:], pk) {
|
||
|
|
t.Fatal("Raw byte respresentation doesn't match public key.")
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestFlipBitForgery(t *testing.T) {
|
||
|
|
sk, err := GenerateKey(nil)
|
||
|
|
if err != nil {
|
||
|
|
t.Fatal(err)
|
||
|
|
}
|
||
|
|
pk, _ := sk.Public()
|
||
|
|
alice := []byte("alice")
|
||
|
|
for i := 0; i < 32; i++ {
|
||
|
|
for j := uint(0); j < 8; j++ {
|
||
|
|
aliceVRF := sk.Compute(alice)
|
||
|
|
aliceVRF[i] ^= 1 << j
|
||
|
|
_, aliceProof := sk.Prove(alice)
|
||
|
|
if pk.Verify(alice, aliceVRF, aliceProof) {
|
||
|
|
t.Fatalf("forged by using aliceVRF[%d]^=%d:\n (sk=%x)", i, j, sk)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func BenchmarkHashToGE(b *testing.B) {
|
||
|
|
alice := []byte("alice")
|
||
|
|
b.ResetTimer()
|
||
|
|
for n := 0; n < b.N; n++ {
|
||
|
|
hashToCurve(alice)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func BenchmarkCompute(b *testing.B) {
|
||
|
|
sk, err := GenerateKey(nil)
|
||
|
|
if err != nil {
|
||
|
|
b.Fatal(err)
|
||
|
|
}
|
||
|
|
alice := []byte("alice")
|
||
|
|
b.ResetTimer()
|
||
|
|
for n := 0; n < b.N; n++ {
|
||
|
|
sk.Compute(alice)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func BenchmarkProve(b *testing.B) {
|
||
|
|
sk, err := GenerateKey(nil)
|
||
|
|
if err != nil {
|
||
|
|
b.Fatal(err)
|
||
|
|
}
|
||
|
|
alice := []byte("alice")
|
||
|
|
b.ResetTimer()
|
||
|
|
for n := 0; n < b.N; n++ {
|
||
|
|
sk.Prove(alice)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func BenchmarkVerify(b *testing.B) {
|
||
|
|
sk, err := GenerateKey(nil)
|
||
|
|
if err != nil {
|
||
|
|
b.Fatal(err)
|
||
|
|
}
|
||
|
|
alice := []byte("alice")
|
||
|
|
aliceVRF := sk.Compute(alice)
|
||
|
|
_, aliceProof := sk.Prove(alice)
|
||
|
|
pk, _ := sk.Public()
|
||
|
|
b.ResetTimer()
|
||
|
|
for n := 0; n < b.N; n++ {
|
||
|
|
pk.Verify(alice, aliceVRF, aliceProof)
|
||
|
|
}
|
||
|
|
}
|