...
1
2
3 package dilithium
4
5 import (
6 "fmt"
7 "io"
8
9 "github.com/cloudflare/circl/sign/dilithium/internal/common"
10 "github.com/cloudflare/circl/sign/dilithium/mode5"
11 )
12
13
14 type implMode5 struct{}
15
16
17 var Mode5 Mode = &implMode5{}
18
19 func (m *implMode5) GenerateKey(rand io.Reader) (
20 PublicKey, PrivateKey, error) {
21 return mode5.GenerateKey(rand)
22 }
23
24 func (m *implMode5) NewKeyFromSeed(seed []byte) (PublicKey,
25 PrivateKey) {
26 if len(seed) != common.SeedSize {
27 panic(fmt.Sprintf("seed must be of length %d", common.SeedSize))
28 }
29 seedBuf := [common.SeedSize]byte{}
30 copy(seedBuf[:], seed)
31 return mode5.NewKeyFromSeed(&seedBuf)
32 }
33
34 func (m *implMode5) Sign(sk PrivateKey, msg []byte) []byte {
35 isk := sk.(*mode5.PrivateKey)
36 ret := [mode5.SignatureSize]byte{}
37 mode5.SignTo(isk, msg, ret[:])
38 return ret[:]
39 }
40
41 func (m *implMode5) Verify(pk PublicKey, msg []byte, signature []byte) bool {
42 ipk := pk.(*mode5.PublicKey)
43 return mode5.Verify(ipk, msg, signature)
44 }
45
46 func (m *implMode5) PublicKeyFromBytes(data []byte) PublicKey {
47 var ret mode5.PublicKey
48 if len(data) != mode5.PublicKeySize {
49 panic("packed public key must be of mode5.PublicKeySize bytes")
50 }
51 var buf [mode5.PublicKeySize]byte
52 copy(buf[:], data)
53 ret.Unpack(&buf)
54 return &ret
55 }
56
57 func (m *implMode5) PrivateKeyFromBytes(data []byte) PrivateKey {
58 var ret mode5.PrivateKey
59 if len(data) != mode5.PrivateKeySize {
60 panic("packed public key must be of mode5.PrivateKeySize bytes")
61 }
62 var buf [mode5.PrivateKeySize]byte
63 copy(buf[:], data)
64 ret.Unpack(&buf)
65 return &ret
66 }
67
68 func (m *implMode5) SeedSize() int {
69 return common.SeedSize
70 }
71
72 func (m *implMode5) PublicKeySize() int {
73 return mode5.PublicKeySize
74 }
75
76 func (m *implMode5) PrivateKeySize() int {
77 return mode5.PrivateKeySize
78 }
79
80 func (m *implMode5) SignatureSize() int {
81 return mode5.SignatureSize
82 }
83
84 func (m *implMode5) Name() string {
85 return "Dilithium5"
86 }
87
88 func init() {
89 modes["Dilithium5"] = Mode5
90 }
91
View as plain text