Source file
src/crypto/mldsa/mldsa_fips140v1.26.go
1
2
3
4
5
6
7 package mldsa
8
9 import (
10 "crypto"
11 "crypto/internal/fips140/mldsa"
12 "errors"
13 "io"
14 )
15
16
17
18
19
20 type PrivateKey struct {
21 k mldsa.PrivateKey
22 }
23
24 var errInvalidParameters = errors.New("mldsa: invalid parameters")
25
26
27 func GenerateKey(params Parameters) (*PrivateKey, error) {
28 switch params {
29 case MLDSA44():
30 return &PrivateKey{k: *mldsa.GenerateKey44()}, nil
31 case MLDSA65():
32 return &PrivateKey{k: *mldsa.GenerateKey65()}, nil
33 case MLDSA87():
34 return &PrivateKey{k: *mldsa.GenerateKey87()}, nil
35 default:
36 return nil, errInvalidParameters
37 }
38 }
39
40
41
42
43 func NewPrivateKey(params Parameters, seed []byte) (*PrivateKey, error) {
44 var err error
45 var k *mldsa.PrivateKey
46 switch params {
47 case MLDSA44():
48 k, err = mldsa.NewPrivateKey44(seed)
49 case MLDSA65():
50 k, err = mldsa.NewPrivateKey65(seed)
51 case MLDSA87():
52 k, err = mldsa.NewPrivateKey87(seed)
53 default:
54 return nil, errInvalidParameters
55 }
56 if err != nil {
57 return nil, err
58 }
59 return &PrivateKey{k: *k}, nil
60 }
61
62
63
64
65 func (sk *PrivateKey) Public() crypto.PublicKey {
66 return sk.PublicKey()
67 }
68
69
70
71
72
73 func (sk *PrivateKey) Equal(x crypto.PrivateKey) bool {
74 other, ok := x.(*PrivateKey)
75 if !ok || other == nil {
76 return false
77 }
78 return sk.k.Equal(&other.k)
79 }
80
81
82 func (sk *PrivateKey) PublicKey() *PublicKey {
83
84
85
86 return &PublicKey{p: *sk.k.PublicKey()}
87 }
88
89
90 func (sk *PrivateKey) Bytes() []byte {
91 return sk.k.Bytes()
92 }
93
94 var errInvalidSignerOpts = errors.New("mldsa: invalid SignerOpts")
95
96
97
98
99
100
101
102
103
104
105 func (sk *PrivateKey) Sign(_ io.Reader, message []byte, opts crypto.SignerOpts) (signature []byte, err error) {
106 if opts == nil {
107 opts = &Options{}
108 }
109 switch opts.HashFunc() {
110 case 0:
111 var context string
112 if opts, ok := opts.(*Options); ok {
113 context = opts.Context
114 }
115 return mldsa.Sign(&sk.k, message, context)
116 case crypto.MLDSAMu:
117 return mldsa.SignExternalMu(&sk.k, message)
118 default:
119 return nil, errInvalidSignerOpts
120 }
121 }
122
123
124
125 func (sk *PrivateKey) SignDeterministic(message []byte, opts crypto.SignerOpts) (signature []byte, err error) {
126 if opts == nil {
127 opts = &Options{}
128 }
129 switch opts.HashFunc() {
130 case 0:
131 var context string
132 if opts, ok := opts.(*Options); ok {
133 context = opts.Context
134 }
135 return mldsa.SignDeterministic(&sk.k, message, context)
136 case crypto.MLDSAMu:
137 return mldsa.SignExternalMuDeterministic(&sk.k, message)
138 default:
139 return nil, errInvalidSignerOpts
140 }
141 }
142
143
144
145
146
147 type PublicKey struct {
148 p mldsa.PublicKey
149 }
150
151
152 func NewPublicKey(params Parameters, encoding []byte) (*PublicKey, error) {
153 return newPublicKey(&PublicKey{}, params, encoding)
154 }
155
156 func newPublicKey(pub *PublicKey, params Parameters, encoding []byte) (*PublicKey, error) {
157 var err error
158 var pk *mldsa.PublicKey
159 switch params {
160 case MLDSA44():
161 pk, err = mldsa.NewPublicKey44(encoding)
162 case MLDSA65():
163 pk, err = mldsa.NewPublicKey65(encoding)
164 case MLDSA87():
165 pk, err = mldsa.NewPublicKey87(encoding)
166 default:
167 return nil, errInvalidParameters
168 }
169 if err != nil {
170 return nil, err
171 }
172 pub.p = *pk
173 return pub, nil
174 }
175
176
177 func (pk *PublicKey) Bytes() []byte {
178 return pk.p.Bytes()
179 }
180
181
182
183
184
185 func (pk *PublicKey) Equal(x crypto.PublicKey) bool {
186 other, ok := x.(*PublicKey)
187 if !ok || other == nil {
188 return false
189 }
190 return pk.p.Equal(&other.p)
191 }
192
193
194 func (pk *PublicKey) Parameters() Parameters {
195 switch pk.p.Parameters() {
196 case "ML-DSA-44":
197 return MLDSA44()
198 case "ML-DSA-65":
199 return MLDSA65()
200 case "ML-DSA-87":
201 return MLDSA87()
202 default:
203 panic("mldsa: invalid parameters in public key")
204 }
205 }
206
207
208
209 func Verify(pk *PublicKey, message []byte, signature []byte, opts *Options) error {
210 if pk == nil {
211 return errors.New("mldsa: nil public key")
212 }
213 if opts == nil {
214 opts = &Options{}
215 }
216 return mldsa.Verify(&pk.p, message, signature, opts.Context)
217 }
218
View as plain text