1
2
3
4
5 package rsa
6
7 import (
8 "crypto/internal/fips140"
9 "crypto/internal/fips140/bigmod"
10 "crypto/internal/fips140/drbg"
11 "errors"
12 "io"
13 )
14
15
16
17 func GenerateKey(rand io.Reader, bits int) (*PrivateKey, error) {
18 if bits < 32 {
19 return nil, errors.New("rsa: key too small")
20 }
21 fips140.RecordApproved()
22 if bits < 2048 || bits%2 == 1 {
23 fips140.RecordNonApproved()
24 }
25
26 for {
27 p, err := randomPrime(rand, (bits+1)/2)
28 if err != nil {
29 return nil, err
30 }
31 q, err := randomPrime(rand, bits/2)
32 if err != nil {
33 return nil, err
34 }
35
36 P, err := bigmod.NewModulus(p)
37 if err != nil {
38 return nil, err
39 }
40 Q, err := bigmod.NewModulus(q)
41 if err != nil {
42 return nil, err
43 }
44
45 if Q.Nat().ExpandFor(P).Equal(P.Nat()) == 1 {
46 return nil, errors.New("rsa: generated p == q, random source is broken")
47 }
48
49 N, err := bigmod.NewModulusProduct(p, q)
50 if err != nil {
51 return nil, err
52 }
53 if N.BitLen() != bits {
54 return nil, errors.New("rsa: internal error: modulus size incorrect")
55 }
56
57
58
59
60
61
62
63
64
65
66
67
68
69 λ, err := totient(P, Q)
70 if err == errDivisorTooLarge {
71
72 continue
73 }
74 if err != nil {
75 return nil, err
76 }
77
78 e := bigmod.NewNat().SetUint(65537)
79 d, ok := bigmod.NewNat().InverseVarTime(e, λ)
80 if !ok {
81
82
83
84
85
86
87
88 continue
89 }
90
91 if e.ExpandFor(λ).Mul(d, λ).IsOne() == 0 {
92 return nil, errors.New("rsa: internal error: e*d != 1 mod λ(N)")
93 }
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108 k, err := newPrivateKey(N, 65537, d, P, Q)
109 if err != nil {
110 return nil, err
111 }
112
113 if k.fipsApproved {
114 fips140.PCT("RSA sign and verify PCT", func() error {
115 hash := []byte{
116 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
117 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
118 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
119 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
120 }
121 sig, err := signPKCS1v15(k, "SHA-256", hash)
122 if err != nil {
123 return err
124 }
125 return verifyPKCS1v15(k.PublicKey(), "SHA-256", hash, sig)
126 })
127 }
128
129 return k, nil
130 }
131 }
132
133
134 var errDivisorTooLarge = errors.New("divisor too large")
135
136
137 func totient(p, q *bigmod.Modulus) (*bigmod.Modulus, error) {
138 a, b := p.Nat().SubOne(p), q.Nat().SubOne(q)
139
140
141
142
143
144
145
146 az, bz := a.TrailingZeroBitsVarTime(), b.TrailingZeroBitsVarTime()
147 if az < bz {
148 a = a.ShiftRightVarTime(az)
149 } else {
150 b = b.ShiftRightVarTime(bz)
151 }
152
153 gcd, err := bigmod.NewNat().GCDVarTime(a, b)
154 if err != nil {
155 return nil, err
156 }
157 if gcd.IsOdd() == 0 {
158 return nil, errors.New("rsa: internal error: gcd(a, b) is even")
159 }
160
161
162
163
164
165
166 if gcd.BitLenVarTime() > 32 {
167 return nil, errDivisorTooLarge
168 }
169 if gcd.IsZero() == 1 || gcd.Bits()[0] == 0 {
170 return nil, errors.New("rsa: internal error: gcd(a, b) is zero")
171 }
172 if rem := b.DivShortVarTime(gcd.Bits()[0]); rem != 0 {
173 return nil, errors.New("rsa: internal error: b is not divisible by gcd(a, b)")
174 }
175
176 return bigmod.NewModulusProduct(a.Bytes(p), b.Bytes(q))
177 }
178
179
180
181 func randomPrime(rand io.Reader, bits int) ([]byte, error) {
182 if bits < 16 {
183 return nil, errors.New("rsa: prime size must be at least 16 bits")
184 }
185
186 b := make([]byte, (bits+7)/8)
187 for {
188 if err := drbg.ReadWithReader(rand, b); err != nil {
189 return nil, err
190 }
191
192
193
194 excess := len(b)*8 - bits
195 b[0] &= 0b1111_1111 >> excess
196
197
198
199
200
201 if excess < 7 {
202 b[0] |= 0b1100_0000 >> excess
203 } else {
204 b[0] |= 0b0000_0001
205 b[1] |= 0b1000_0000
206 }
207
208
209 b[len(b)-1] |= 1
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227 if isPrime(b) {
228 return b, nil
229 }
230 }
231 }
232
233
234
235
236
237
238
239
240 func isPrime(w []byte) bool {
241 mr, err := millerRabinSetup(w)
242 if err != nil {
243
244 return false
245 }
246
247
248 for i := 0; i < len(primes); i += 3 {
249 p1, p2, p3 := primes[i], primes[i+1], primes[i+2]
250 r := mr.w.Nat().DivShortVarTime(p1 * p2 * p3)
251 if r%p1 == 0 || r%p2 == 0 || r%p3 == 0 {
252 return false
253 }
254 }
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269 bits := mr.w.BitLen()
270 var iterations int
271 switch {
272 case bits >= 3747:
273 iterations = 3
274 case bits >= 1345:
275 iterations = 4
276 case bits >= 476:
277 iterations = 5
278 case bits >= 400:
279 iterations = 6
280 case bits >= 347:
281 iterations = 7
282 case bits >= 308:
283 iterations = 8
284 case bits >= 55:
285 iterations = 27
286 default:
287 iterations = 34
288 }
289
290 b := make([]byte, (bits+7)/8)
291 for {
292 drbg.Read(b)
293 excess := len(b)*8 - bits
294 b[0] &= 0b1111_1111 >> excess
295 result, err := millerRabinIteration(mr, b)
296 if err != nil {
297
298 continue
299 }
300 if result == millerRabinCOMPOSITE {
301 return false
302 }
303 iterations--
304 if iterations == 0 {
305 return true
306 }
307 }
308 }
309
310
311
312
313
314
315
316
317
318
319 var primes = []uint{
320 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53,
321 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127,
322 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199,
323 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283,
324 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383,
325 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467,
326 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577,
327 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661,
328 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769,
329 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877,
330 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983,
331 991, 997, 1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069,
332 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181,
333 1187, 1193, 1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283,
334 1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399,
335 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, 1453, 1459, 1471, 1481, 1483, 1487,
336 1489, 1493, 1499, 1511, 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583,
337 1597, 1601, 1607, 1609, 1613, 1619,
338 }
339
340 type millerRabin struct {
341 w *bigmod.Modulus
342 a uint
343 m []byte
344 }
345
346
347
348 func millerRabinSetup(w []byte) (*millerRabin, error) {
349 mr := &millerRabin{}
350
351
352 wm, err := bigmod.NewModulus(w)
353 if err != nil {
354 return nil, err
355 }
356 if wm.Nat().IsOdd() == 0 {
357 return nil, errors.New("candidate is even")
358 }
359 mr.w = wm
360
361
362 wMinus1 := mr.w.Nat().SubOne(mr.w)
363 if wMinus1.IsZero() == 1 {
364 return nil, errors.New("candidate is one")
365 }
366 mr.a = wMinus1.TrailingZeroBitsVarTime()
367
368
369
370 m := wMinus1.ShiftRightVarTime(mr.a)
371 mr.m = m.Bytes(mr.w)
372 for mr.m[0] == 0 {
373 mr.m = mr.m[1:]
374 }
375
376 return mr, nil
377 }
378
379 const millerRabinCOMPOSITE = false
380 const millerRabinPOSSIBLYPRIME = true
381
382 func millerRabinIteration(mr *millerRabin, bb []byte) (bool, error) {
383
384 if len(bb) != (mr.w.BitLen()+7)/8 {
385 return false, errors.New("incorrect length")
386 }
387 b := bigmod.NewNat()
388 if _, err := b.SetBytes(bb, mr.w); err != nil {
389 return false, err
390 }
391 if b.IsZero() == 1 || b.IsOne() == 1 || b.IsMinusOne(mr.w) == 1 {
392 return false, errors.New("out-of-range candidate")
393 }
394
395
396
397
398
399
400
401 z := bigmod.NewNat().Exp(b, mr.m, mr.w)
402 if z.IsOne() == 1 || z.IsMinusOne(mr.w) == 1 {
403 return millerRabinPOSSIBLYPRIME, nil
404 }
405
406
407 for range mr.a - 1 {
408 z.Mul(z, mr.w)
409 if z.IsMinusOne(mr.w) == 1 {
410 return millerRabinPOSSIBLYPRIME, nil
411 }
412 if z.IsOne() == 1 {
413
414 break
415 }
416 }
417
418 return millerRabinCOMPOSITE, nil
419 }
420
View as plain text