...
1 package schemes_test
2
3 import (
4 "bytes"
5 "fmt"
6 "testing"
7
8 "github.com/cloudflare/circl/kem/schemes"
9 )
10
11 func TestCaseSensitivity(t *testing.T) {
12 if schemes.ByName("kyber512") != schemes.ByName("Kyber512") {
13 t.Fatal()
14 }
15 }
16
17 func BenchmarkGenerateKeyPair(b *testing.B) {
18 allSchemes := schemes.All()
19 for _, scheme := range allSchemes {
20 scheme := scheme
21 b.Run(scheme.Name(), func(b *testing.B) {
22 for i := 0; i < b.N; i++ {
23 _, _, _ = scheme.GenerateKeyPair()
24 }
25 })
26 }
27 }
28
29 func BenchmarkEncapsulate(b *testing.B) {
30 allSchemes := schemes.All()
31 for _, scheme := range allSchemes {
32 scheme := scheme
33 pk, _, _ := scheme.GenerateKeyPair()
34 b.Run(scheme.Name(), func(b *testing.B) {
35 for i := 0; i < b.N; i++ {
36 _, _, _ = scheme.Encapsulate(pk)
37 }
38 })
39 }
40 }
41
42 func BenchmarkDecapsulate(b *testing.B) {
43 allSchemes := schemes.All()
44 for _, scheme := range allSchemes {
45 scheme := scheme
46 pk, sk, _ := scheme.GenerateKeyPair()
47 ct, _, _ := scheme.Encapsulate(pk)
48 b.Run(scheme.Name(), func(b *testing.B) {
49 for i := 0; i < b.N; i++ {
50 _, _ = scheme.Decapsulate(sk, ct)
51 }
52 })
53 }
54 }
55
56 func TestApi(t *testing.T) {
57 allSchemes := schemes.All()
58 for _, scheme := range allSchemes {
59 scheme := scheme
60 t.Run(scheme.Name(), func(t *testing.T) {
61 if scheme == nil {
62 t.Fatal()
63 }
64
65 _ = scheme.SeedSize()
66 _ = scheme.EncapsulationSeedSize()
67
68 pk, sk, err := scheme.GenerateKeyPair()
69 if err != nil {
70 t.Fatal()
71 }
72
73 packedPk, err := pk.MarshalBinary()
74 if err != nil {
75 t.Fatal()
76 }
77
78 if len(packedPk) != scheme.PublicKeySize() {
79 t.Fatal()
80 }
81
82 packedSk, err := sk.MarshalBinary()
83 if err != nil {
84 t.Fatal()
85 }
86
87 if len(packedSk) != scheme.PrivateKeySize() {
88 t.Fatal()
89 }
90
91 pk2, err := scheme.UnmarshalBinaryPublicKey(packedPk)
92 if err != nil {
93 t.Fatal()
94 }
95
96 sk2, err := scheme.UnmarshalBinaryPrivateKey(packedSk)
97 if err != nil {
98 t.Fatal()
99 }
100
101 if !sk.Equal(sk2) {
102 t.Fatal()
103 }
104
105 if !pk.Equal(pk2) {
106 t.Fatal()
107 }
108
109 ct, ss, err := scheme.Encapsulate(pk2)
110 if err != nil {
111 t.Fatal(err)
112 }
113 if len(ct) != scheme.CiphertextSize() {
114 t.Fatal()
115 }
116 if len(ss) != scheme.SharedKeySize() {
117 t.Fatal()
118 }
119
120 ct3, ss3, err := scheme.Encapsulate(pk2)
121 if err != nil {
122 t.Fatal(err)
123 }
124 if bytes.Equal(ss3, ss) {
125 t.Fatal()
126 }
127 if bytes.Equal(ct3, ct) {
128 t.Fatal()
129 }
130
131 ss2, err := scheme.Decapsulate(sk2, ct)
132 if err != nil {
133 t.Fatal(err)
134 }
135 if !bytes.Equal(ss, ss2) {
136 t.Fatal()
137 }
138 })
139 }
140 }
141
142 func Example_schemes() {
143
144
145 for _, sch := range schemes.All() {
146 fmt.Println(sch.Name())
147 }
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163 }
164
View as plain text