1 package bls12381
2
3 import (
4 "bytes"
5 "io"
6 "os"
7 "testing"
8
9 "github.com/cloudflare/circl/internal/test"
10 )
11
12 func isEqual(p, q interface{}) bool {
13 switch P := p.(type) {
14 case *G1:
15 return P.IsEqual(q.(*G1))
16 case *G2:
17 return P.IsEqual(q.(*G2))
18 default:
19 panic("bad type")
20 }
21 }
22
23 func addGenerator(p interface{}) {
24 switch P := p.(type) {
25 case *G1:
26 P.Add(P, G1Generator())
27 case *G2:
28 P.Add(P, G2Generator())
29 default:
30 panic("bad type")
31 }
32 }
33
34 func testSerialVector(t *testing.T, file io.Reader, v *serialVector) {
35 var bP []byte
36 bQ := make([]byte, v.length)
37 v.P.SetIdentity()
38 for i := 0; i < 1000; i++ {
39 n, err := file.Read(bQ)
40 if n != v.length || err != nil {
41 t.Fatalf("error reading %v file: %v", v.fileName, err)
42 }
43 test.CheckNoErr(t, v.Q.SetBytes(bQ), "failed deserialization")
44
45 if !isEqual(v.P, v.Q) {
46 test.ReportError(t, v.P, v.Q, i)
47 }
48
49 if v.compressed {
50 bP = v.P.BytesCompressed()
51 } else {
52 bP = v.P.Bytes()
53 }
54 if !bytes.Equal(bP, bQ) {
55 test.ReportError(t, bP, bQ, i)
56 }
57 addGenerator(v.P)
58 }
59 }
60
61 type serialVector struct {
62 fileName string
63 length int
64 compressed bool
65 P, Q interface {
66 SetIdentity()
67 SetBytes([]byte) error
68 Bytes() []byte
69 BytesCompressed() []byte
70 }
71 }
72
73 func TestSerializationVector(t *testing.T) {
74 for _, vv := range []serialVector{
75 {"g1_uncompressed", G1Size, false, new(G1), new(G1)},
76 {"g1_compressed", G1SizeCompressed, true, new(G1), new(G1)},
77 {"g2_uncompressed", G2Size, false, new(G2), new(G2)},
78 {"g2_compressed", G2SizeCompressed, true, new(G2), new(G2)},
79 } {
80 v := vv
81 file, err := os.Open("testdata/" + v.fileName + "_valid_test_vectors.dat")
82 if err != nil {
83 t.Fatalf("file %v can not be opened: %v", v.fileName, err)
84 }
85 defer file.Close()
86
87 t.Run(v.fileName[:7], func(t *testing.T) { testSerialVector(t, file, &v) })
88 }
89 }
90
View as plain text