1
2
3
4
5 package rsa
6
7 import (
8 "bytes"
9 "crypto/internal/fips140"
10 "crypto/internal/fips140/bigmod"
11 "errors"
12 )
13
14 type PublicKey struct {
15 N *bigmod.Modulus
16 E int
17 }
18
19
20
21 func (pub *PublicKey) Size() int {
22 return (pub.N.BitLen() + 7) / 8
23 }
24
25 type PrivateKey struct {
26
27 pub PublicKey
28 d *bigmod.Nat
29
30
31
32
33 p, q *bigmod.Modulus
34
35
36 dP []byte
37 dQ []byte
38 qInv *bigmod.Nat
39
40
41 fipsApproved bool
42 }
43
44 func (priv *PrivateKey) PublicKey() *PublicKey {
45 return &priv.pub
46 }
47
48
49
50
51
52 func NewPrivateKey(N []byte, e int, d, P, Q []byte) (*PrivateKey, error) {
53 n, err := bigmod.NewModulus(N)
54 if err != nil {
55 return nil, err
56 }
57 p, err := bigmod.NewModulus(P)
58 if err != nil {
59 return nil, err
60 }
61 q, err := bigmod.NewModulus(Q)
62 if err != nil {
63 return nil, err
64 }
65 dN, err := bigmod.NewNat().SetBytes(d, n)
66 if err != nil {
67 return nil, err
68 }
69 return newPrivateKey(n, e, dN, p, q)
70 }
71
72 func newPrivateKey(n *bigmod.Modulus, e int, d *bigmod.Nat, p, q *bigmod.Modulus) (*PrivateKey, error) {
73 pMinusOne := p.Nat().SubOne(p)
74 pMinusOneMod, err := bigmod.NewModulus(pMinusOne.Bytes(p))
75 if err != nil {
76 return nil, err
77 }
78 dP := bigmod.NewNat().Mod(d, pMinusOneMod).Bytes(pMinusOneMod)
79
80 qMinusOne := q.Nat().SubOne(q)
81 qMinusOneMod, err := bigmod.NewModulus(qMinusOne.Bytes(q))
82 if err != nil {
83 return nil, err
84 }
85 dQ := bigmod.NewNat().Mod(d, qMinusOneMod).Bytes(qMinusOneMod)
86
87
88
89 if p.Nat().IsOdd() == 0 {
90
91 return nil, errors.New("crypto/rsa: p is even")
92 }
93 pMinusTwo := p.Nat().SubOne(p).SubOne(p).Bytes(p)
94 qInv := bigmod.NewNat().Mod(q.Nat(), p)
95 qInv.Exp(qInv, pMinusTwo, p)
96
97 pk := &PrivateKey{
98 pub: PublicKey{
99 N: n, E: e,
100 },
101 d: d, p: p, q: q,
102 dP: dP, dQ: dQ, qInv: qInv,
103 }
104 if err := checkPrivateKey(pk); err != nil {
105 return nil, err
106 }
107 return pk, nil
108 }
109
110
111
112 func NewPrivateKeyWithPrecomputation(N []byte, e int, d, P, Q, dP, dQ, qInv []byte) (*PrivateKey, error) {
113 n, err := bigmod.NewModulus(N)
114 if err != nil {
115 return nil, err
116 }
117 p, err := bigmod.NewModulus(P)
118 if err != nil {
119 return nil, err
120 }
121 q, err := bigmod.NewModulus(Q)
122 if err != nil {
123 return nil, err
124 }
125 dN, err := bigmod.NewNat().SetBytes(d, n)
126 if err != nil {
127 return nil, err
128 }
129 qInvNat, err := bigmod.NewNat().SetBytes(qInv, p)
130 if err != nil {
131 return nil, err
132 }
133
134 pk := &PrivateKey{
135 pub: PublicKey{
136 N: n, E: e,
137 },
138 d: dN, p: p, q: q,
139 dP: dP, dQ: dQ, qInv: qInvNat,
140 }
141 if err := checkPrivateKey(pk); err != nil {
142 return nil, err
143 }
144 return pk, nil
145 }
146
147
148
149
150 func NewPrivateKeyWithoutCRT(N []byte, e int, d []byte) (*PrivateKey, error) {
151 n, err := bigmod.NewModulus(N)
152 if err != nil {
153 return nil, err
154 }
155 dN, err := bigmod.NewNat().SetBytes(d, n)
156 if err != nil {
157 return nil, err
158 }
159 pk := &PrivateKey{
160 pub: PublicKey{
161 N: n, E: e,
162 },
163 d: dN,
164 }
165 if err := checkPrivateKey(pk); err != nil {
166 return nil, err
167 }
168 return pk, nil
169 }
170
171
172
173
174
175 func (priv *PrivateKey) Export() (N []byte, e int, d, P, Q, dP, dQ, qInv []byte) {
176 N = priv.pub.N.Nat().Bytes(priv.pub.N)
177 e = priv.pub.E
178 d = priv.d.Bytes(priv.pub.N)
179 if priv.dP == nil {
180 return
181 }
182 P = priv.p.Nat().Bytes(priv.p)
183 Q = priv.q.Nat().Bytes(priv.q)
184 dP = bytes.Clone(priv.dP)
185 dQ = bytes.Clone(priv.dQ)
186 qInv = priv.qInv.Bytes(priv.p)
187 return
188 }
189
190
191
192 func checkPrivateKey(priv *PrivateKey) error {
193 priv.fipsApproved = true
194
195 if fipsApproved, err := checkPublicKey(&priv.pub); err != nil {
196 return err
197 } else if !fipsApproved {
198 priv.fipsApproved = false
199 }
200
201 if priv.dP == nil {
202
203 priv.fipsApproved = false
204 return nil
205 }
206
207 N := priv.pub.N
208 p := priv.p
209 q := priv.q
210
211
212 if p.BitLen() != q.BitLen() {
213 priv.fipsApproved = false
214 }
215
216
217 pN := bigmod.NewNat().ExpandFor(N)
218 if _, err := pN.SetBytes(p.Nat().Bytes(p), N); err != nil {
219 return errors.New("crypto/rsa: invalid prime")
220 }
221 qN := bigmod.NewNat().ExpandFor(N)
222 if _, err := qN.SetBytes(q.Nat().Bytes(q), N); err != nil {
223 return errors.New("crypto/rsa: invalid prime")
224 }
225 if pN.Mul(qN, N).IsZero() != 1 {
226 return errors.New("crypto/rsa: p * q != n")
227 }
228
229
230
231
232
233
234
235
236
237
238 pMinus1, err := bigmod.NewModulus(p.Nat().SubOne(p).Bytes(p))
239 if err != nil {
240 return errors.New("crypto/rsa: invalid prime")
241 }
242 dP, err := bigmod.NewNat().SetBytes(priv.dP, pMinus1)
243 if err != nil {
244 return errors.New("crypto/rsa: invalid CRT exponent")
245 }
246 de := bigmod.NewNat()
247 de.SetUint(uint(priv.pub.E)).ExpandFor(pMinus1)
248 de.Mul(dP, pMinus1)
249 if de.IsOne() != 1 {
250 return errors.New("crypto/rsa: invalid CRT exponent")
251 }
252
253 qMinus1, err := bigmod.NewModulus(q.Nat().SubOne(q).Bytes(q))
254 if err != nil {
255 return errors.New("crypto/rsa: invalid prime")
256 }
257 dQ, err := bigmod.NewNat().SetBytes(priv.dQ, qMinus1)
258 if err != nil {
259 return errors.New("crypto/rsa: invalid CRT exponent")
260 }
261 de.SetUint(uint(priv.pub.E)).ExpandFor(qMinus1)
262 de.Mul(dQ, qMinus1)
263 if de.IsOne() != 1 {
264 return errors.New("crypto/rsa: invalid CRT exponent")
265 }
266
267
268 qP, err := bigmod.NewNat().SetOverflowingBytes(q.Nat().Bytes(q), p)
269 if err != nil {
270
271 qP = bigmod.NewNat().Mod(q.Nat(), p)
272 }
273 if qP.Mul(priv.qInv, p).IsOne() != 1 {
274 return errors.New("crypto/rsa: invalid CRT coefficient")
275 }
276
277
278
279
280
281
282
283 diff := bigmod.NewNat()
284 if qP, err := bigmod.NewNat().SetBytes(q.Nat().Bytes(q), p); err != nil {
285
286 pQ, err := bigmod.NewNat().SetBytes(p.Nat().Bytes(p), q)
287 if err != nil {
288 return errors.New("crypto/rsa: p == q")
289 }
290
291 diff.ExpandFor(q).Sub(pQ, q)
292 } else {
293
294
295 diff.ExpandFor(p).Sub(qP, p)
296 }
297
298
299 if diff.BitLenVarTime() <= N.BitLen()/2-100 {
300 return errors.New("crypto/rsa: |p - q| too small")
301 }
302
303
304
305
306
307
308
309 if priv.d.BitLenVarTime() <= N.BitLen()/2 {
310 return errors.New("crypto/rsa: d too small")
311 }
312
313 return nil
314 }
315
316 func checkPublicKey(pub *PublicKey) (fipsApproved bool, err error) {
317 fipsApproved = true
318 if pub.N == nil {
319 return false, errors.New("crypto/rsa: missing public modulus")
320 }
321 if pub.N.Nat().IsOdd() == 0 {
322 return false, errors.New("crypto/rsa: public modulus is even")
323 }
324
325
326
327 if pub.N.BitLen() < 2048 {
328 fipsApproved = false
329 }
330 if pub.N.BitLen()%2 == 1 {
331 fipsApproved = false
332 }
333 if pub.E < 2 {
334 return false, errors.New("crypto/rsa: public exponent too small or negative")
335 }
336
337
338 if pub.E&1 == 0 {
339 return false, errors.New("crypto/rsa: public exponent is even")
340 }
341
342
343 if pub.E <= 1<<16 {
344 fipsApproved = false
345 }
346
347
348
349
350 if pub.E > 1<<31-1 {
351 return false, errors.New("crypto/rsa: public exponent too large")
352 }
353 return fipsApproved, nil
354 }
355
356
357 func Encrypt(pub *PublicKey, plaintext []byte) ([]byte, error) {
358 fips140.RecordNonApproved()
359 if _, err := checkPublicKey(pub); err != nil {
360 return nil, err
361 }
362 return encrypt(pub, plaintext)
363 }
364
365 func encrypt(pub *PublicKey, plaintext []byte) ([]byte, error) {
366 m, err := bigmod.NewNat().SetBytes(plaintext, pub.N)
367 if err != nil {
368 return nil, err
369 }
370 return bigmod.NewNat().ExpShortVarTime(m, uint(pub.E), pub.N).Bytes(pub.N), nil
371 }
372
373 var ErrMessageTooLong = errors.New("crypto/rsa: message too long for RSA key size")
374 var ErrDecryption = errors.New("crypto/rsa: decryption error")
375 var ErrVerification = errors.New("crypto/rsa: verification error")
376
377 const withCheck = true
378 const noCheck = false
379
380
381 func DecryptWithoutCheck(priv *PrivateKey, ciphertext []byte) ([]byte, error) {
382 fips140.RecordNonApproved()
383 return decrypt(priv, ciphertext, noCheck)
384 }
385
386
387
388 func DecryptWithCheck(priv *PrivateKey, ciphertext []byte) ([]byte, error) {
389 fips140.RecordNonApproved()
390 return decrypt(priv, ciphertext, withCheck)
391 }
392
393
394
395
396 func decrypt(priv *PrivateKey, ciphertext []byte, check bool) ([]byte, error) {
397 if !priv.fipsApproved {
398 fips140.RecordNonApproved()
399 }
400
401 var m *bigmod.Nat
402 N, E := priv.pub.N, priv.pub.E
403
404 c, err := bigmod.NewNat().SetBytes(ciphertext, N)
405 if err != nil {
406 return nil, ErrDecryption
407 }
408
409 if priv.dP == nil {
410
411 fips140.RecordNonApproved()
412 m = bigmod.NewNat().Exp(c, priv.d.Bytes(N), N)
413
414 } else {
415 P, Q := priv.p, priv.q
416 t0 := bigmod.NewNat()
417
418 m = bigmod.NewNat().Exp(t0.Mod(c, P), priv.dP, P)
419
420 m2 := bigmod.NewNat().Exp(t0.Mod(c, Q), priv.dQ, Q)
421
422 m.Sub(t0.Mod(m2, P), P)
423
424 m.Mul(priv.qInv, P)
425
426 m.ExpandFor(N).Mul(t0.Mod(Q.Nat(), N), N)
427
428 m.Add(m2.ExpandFor(N), N)
429 }
430
431 if check {
432 c1 := bigmod.NewNat().ExpShortVarTime(m, uint(E), N)
433 if c1.Equal(c) != 1 {
434 return nil, ErrDecryption
435 }
436 }
437
438 return m.Bytes(N), nil
439 }
440
View as plain text