1 package ed25519_test
2
3 import (
4 "testing"
5
6 "github.com/cloudflare/circl/sign/ed25519"
7 )
8
9 type zeroReader struct{}
10
11 func (zeroReader) Read(buf []byte) (int, error) {
12 for i := range buf {
13 buf[i] = 0
14 }
15 return len(buf), nil
16 }
17
18 func TestMalleability(t *testing.T) {
19
20
21
22 msg := []byte{0x54, 0x65, 0x73, 0x74}
23 sig := []byte{
24 0x7c, 0x38, 0xe0, 0x26, 0xf2, 0x9e, 0x14, 0xaa, 0xbd, 0x05, 0x9a,
25 0x0f, 0x2d, 0xb8, 0xb0, 0xcd, 0x78, 0x30, 0x40, 0x60, 0x9a, 0x8b,
26 0xe6, 0x84, 0xdb, 0x12, 0xf8, 0x2a, 0x27, 0x77, 0x4a, 0xb0, 0x67,
27 0x65, 0x4b, 0xce, 0x38, 0x32, 0xc2, 0xd7, 0x6f, 0x8f, 0x6f, 0x5d,
28 0xaf, 0xc0, 0x8d, 0x93, 0x39, 0xd4, 0xee, 0xf6, 0x76, 0x57, 0x33,
29 0x36, 0xa5, 0xc5, 0x1e, 0xb6, 0xf9, 0x46, 0xb3, 0x1d,
30 }
31 publicKey := []byte{
32 0x7d, 0x4d, 0x0e, 0x7f, 0x61, 0x53, 0xa6, 0x9b, 0x62, 0x42, 0xb5,
33 0x22, 0xab, 0xbe, 0xe6, 0x85, 0xfd, 0xa4, 0x42, 0x0f, 0x88, 0x34,
34 0xb1, 0x08, 0xc3, 0xbd, 0xae, 0x36, 0x9e, 0xf5, 0x49, 0xfa,
35 }
36
37 if ed25519.Verify(publicKey, msg, sig) {
38 t.Fatal("non-canonical signature accepted")
39 }
40 }
41
42 func TestPublic(t *testing.T) {
43 var zero zeroReader
44 pub, priv, err := ed25519.GenerateKey(zero)
45 if err != nil {
46 t.Fatal(err)
47 }
48 if !priv.Equal(priv) {
49 t.FailNow()
50 }
51 if !pub.Equal(pub) {
52 t.FailNow()
53 }
54 pub2 := priv.Public()
55 if !pub.Equal(pub2) {
56 t.FailNow()
57 }
58 }
59
60 func BenchmarkKeyGeneration(b *testing.B) {
61 var zero zeroReader
62 for i := 0; i < b.N; i++ {
63 if _, _, err := ed25519.GenerateKey(zero); err != nil {
64 b.Fatal(err)
65 }
66 }
67 }
68
69 func BenchmarkNewKeyFromSeed(b *testing.B) {
70 seed := make([]byte, ed25519.SeedSize)
71 b.ReportAllocs()
72 for i := 0; i < b.N; i++ {
73 _ = ed25519.NewKeyFromSeed(seed)
74 }
75 }
76
77 func BenchmarkSigning(b *testing.B) {
78 var zero zeroReader
79 _, priv, err := ed25519.GenerateKey(zero)
80 if err != nil {
81 b.Fatal(err)
82 }
83 message := []byte("Hello, world!")
84 b.ReportAllocs()
85 b.ResetTimer()
86 for i := 0; i < b.N; i++ {
87 ed25519.Sign(priv, message)
88 }
89 }
90
91 func BenchmarkVerification(b *testing.B) {
92 var zero zeroReader
93 pub, priv, err := ed25519.GenerateKey(zero)
94 if err != nil {
95 b.Fatal(err)
96 }
97 message := []byte("Hello, world!")
98 signature := ed25519.Sign(priv, message)
99 b.ResetTimer()
100 for i := 0; i < b.N; i++ {
101 ed25519.Verify(pub, message, signature)
102 }
103 }
104
View as plain text