diff options
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/libcrypto/bn/bn.h | 91 | ||||
-rw-r--r-- | src/lib/libcrypto/man/BN_generate_prime.3 | 28 |
2 files changed, 93 insertions, 26 deletions
diff --git a/src/lib/libcrypto/bn/bn.h b/src/lib/libcrypto/bn/bn.h index cd94e39345..cc1f467523 100644 --- a/src/lib/libcrypto/bn/bn.h +++ b/src/lib/libcrypto/bn/bn.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: bn.h,v 1.38 2018/02/20 17:13:14 jsing Exp $ */ | 1 | /* $OpenBSD: bn.h,v 1.39 2019/08/25 19:23:59 schwarze Exp $ */ |
2 | /* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -308,24 +308,79 @@ int BN_GENCB_call(BN_GENCB *cb, int a, int b); | |||
308 | #define BN_prime_checks 0 /* default: select number of iterations | 308 | #define BN_prime_checks 0 /* default: select number of iterations |
309 | based on the size of the number */ | 309 | based on the size of the number */ |
310 | 310 | ||
311 | /* number of Miller-Rabin iterations for an error rate of less than 2^-80 | 311 | /* |
312 | * for random 'b'-bit input, b >= 100 (taken from table 4.4 in the Handbook | 312 | * BN_prime_checks_for_size() returns the number of Miller-Rabin |
313 | * of Applied Cryptography [Menezes, van Oorschot, Vanstone; CRC Press 1996]; | 313 | * iterations that will be done for checking that a random number |
314 | * original paper: Damgaard, Landrock, Pomerance: Average case error estimates | 314 | * is probably prime. The error rate for accepting a composite |
315 | * for the strong probable prime test. -- Math. Comp. 61 (1993) 177-194) */ | 315 | * number as prime depends on the size of the prime |b|. The error |
316 | #define BN_prime_checks_for_size(b) ((b) >= 1300 ? 2 : \ | 316 | * rates used are for calculating an RSA key with 2 primes, and so |
317 | (b) >= 850 ? 3 : \ | 317 | * the level is what you would expect for a key of double the size |
318 | (b) >= 650 ? 4 : \ | 318 | * of the prime. |
319 | (b) >= 550 ? 5 : \ | 319 | * |
320 | (b) >= 450 ? 6 : \ | 320 | * This table is generated using the algorithm of FIPS PUB 186-4 |
321 | (b) >= 400 ? 7 : \ | 321 | * Digital Signature Standard (DSS), section F.1, page 117. |
322 | (b) >= 350 ? 8 : \ | 322 | * (https://dx.doi.org/10.6028/NIST.FIPS.186-4) |
323 | (b) >= 300 ? 9 : \ | 323 | * |
324 | (b) >= 250 ? 12 : \ | 324 | * The following magma script was used to generate the output: |
325 | (b) >= 200 ? 15 : \ | 325 | * securitybits:=125; |
326 | (b) >= 150 ? 18 : \ | 326 | * k:=1024; |
327 | /* b >= 100 */ 27) | 327 | * for t:=1 to 65 do |
328 | * for M:=3 to Floor(2*Sqrt(k-1)-1) do | ||
329 | * S:=0; | ||
330 | * // Sum over m | ||
331 | * for m:=3 to M do | ||
332 | * s:=0; | ||
333 | * // Sum over j | ||
334 | * for j:=2 to m do | ||
335 | * s+:=(RealField(32)!2)^-(j+(k-1)/j); | ||
336 | * end for; | ||
337 | * S+:=2^(m-(m-1)*t)*s; | ||
338 | * end for; | ||
339 | * A:=2^(k-2-M*t); | ||
340 | * B:=8*(Pi(RealField(32))^2-6)/3*2^(k-2)*S; | ||
341 | * pkt:=2.00743*Log(2)*k*2^-k*(A+B); | ||
342 | * seclevel:=Floor(-Log(2,pkt)); | ||
343 | * if seclevel ge securitybits then | ||
344 | * printf "k: %5o, security: %o bits (t: %o, M: %o)\n",k,seclevel,t,M; | ||
345 | * break; | ||
346 | * end if; | ||
347 | * end for; | ||
348 | * if seclevel ge securitybits then break; end if; | ||
349 | * end for; | ||
350 | * | ||
351 | * It can be run online at: | ||
352 | * http://magma.maths.usyd.edu.au/calc | ||
353 | * | ||
354 | * And will output: | ||
355 | * k: 1024, security: 129 bits (t: 6, M: 23) | ||
356 | * | ||
357 | * k is the number of bits of the prime, securitybits is the level | ||
358 | * we want to reach. | ||
359 | * | ||
360 | * prime length | RSA key size | # MR tests | security level | ||
361 | * -------------+--------------|------------+--------------- | ||
362 | * (b) >= 6394 | >= 12788 | 3 | 256 bit | ||
363 | * (b) >= 3747 | >= 7494 | 3 | 192 bit | ||
364 | * (b) >= 1345 | >= 2690 | 4 | 128 bit | ||
365 | * (b) >= 1080 | >= 2160 | 5 | 128 bit | ||
366 | * (b) >= 852 | >= 1704 | 5 | 112 bit | ||
367 | * (b) >= 476 | >= 952 | 5 | 80 bit | ||
368 | * (b) >= 400 | >= 800 | 6 | 80 bit | ||
369 | * (b) >= 347 | >= 694 | 7 | 80 bit | ||
370 | * (b) >= 308 | >= 616 | 8 | 80 bit | ||
371 | * (b) >= 55 | >= 110 | 27 | 64 bit | ||
372 | * (b) >= 6 | >= 12 | 34 | 64 bit | ||
373 | */ | ||
328 | 374 | ||
375 | #define BN_prime_checks_for_size(b) ((b) >= 3747 ? 3 : \ | ||
376 | (b) >= 1345 ? 4 : \ | ||
377 | (b) >= 476 ? 5 : \ | ||
378 | (b) >= 400 ? 6 : \ | ||
379 | (b) >= 347 ? 7 : \ | ||
380 | (b) >= 308 ? 8 : \ | ||
381 | (b) >= 55 ? 27 : \ | ||
382 | /* b >= 6 */ 34) | ||
383 | |||
329 | #define BN_num_bytes(a) ((BN_num_bits(a)+7)/8) | 384 | #define BN_num_bytes(a) ((BN_num_bits(a)+7)/8) |
330 | 385 | ||
331 | /* Note that BN_abs_is_word didn't work reliably for w == 0 until 0.9.8 */ | 386 | /* Note that BN_abs_is_word didn't work reliably for w == 0 until 0.9.8 */ |
diff --git a/src/lib/libcrypto/man/BN_generate_prime.3 b/src/lib/libcrypto/man/BN_generate_prime.3 index 2369b6f24f..7db27fd627 100644 --- a/src/lib/libcrypto/man/BN_generate_prime.3 +++ b/src/lib/libcrypto/man/BN_generate_prime.3 | |||
@@ -1,6 +1,5 @@ | |||
1 | .\" $OpenBSD: BN_generate_prime.3,v 1.17 2019/06/10 14:58:48 schwarze Exp $ | 1 | .\" $OpenBSD: BN_generate_prime.3,v 1.18 2019/08/25 19:24:00 schwarze Exp $ |
2 | .\" full merge up to: OpenSSL b3696a55 Sep 2 09:35:50 2017 -0400 | 2 | .\" full merge up to: OpenSSL f987a4dd Jun 27 10:12:08 2019 +0200 |
3 | .\" selective merge up to: OpenSSL df75c2bf Dec 9 01:02:36 2018 +0100 | ||
4 | .\" | 3 | .\" |
5 | .\" This file was written by Ulf Moeller <ulf@openssl.org> | 4 | .\" This file was written by Ulf Moeller <ulf@openssl.org> |
6 | .\" Bodo Moeller <bodo@openssl.org>, and Matt Caswell <matt@openssl.org>. | 5 | .\" Bodo Moeller <bodo@openssl.org>, and Matt Caswell <matt@openssl.org>. |
@@ -51,7 +50,7 @@ | |||
51 | .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | 50 | .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED |
52 | .\" OF THE POSSIBILITY OF SUCH DAMAGE. | 51 | .\" OF THE POSSIBILITY OF SUCH DAMAGE. |
53 | .\" | 52 | .\" |
54 | .Dd $Mdocdate: June 10 2019 $ | 53 | .Dd $Mdocdate: August 25 2019 $ |
55 | .Dt BN_GENERATE_PRIME 3 | 54 | .Dt BN_GENERATE_PRIME 3 |
56 | .Os | 55 | .Os |
57 | .Sh NAME | 56 | .Sh NAME |
@@ -156,6 +155,8 @@ Deprecated: | |||
156 | .Fn BN_generate_prime_ex | 155 | .Fn BN_generate_prime_ex |
157 | generates a pseudo-random prime number of at least bit length | 156 | generates a pseudo-random prime number of at least bit length |
158 | .Fa bits . | 157 | .Fa bits . |
158 | The returned number is probably prime, but there is a very small | ||
159 | probability of returning a non-prime number. | ||
159 | If | 160 | If |
160 | .Fa ret | 161 | .Fa ret |
161 | is not | 162 | is not |
@@ -212,8 +213,6 @@ If | |||
212 | is true, it will be a safe prime (i.e. a prime p so that (p-1)/2 | 213 | is true, it will be a safe prime (i.e. a prime p so that (p-1)/2 |
213 | is also prime). | 214 | is also prime). |
214 | .Pp | 215 | .Pp |
215 | The prime number generation has a negligible error probability. | ||
216 | .Pp | ||
217 | .Fn BN_is_prime_ex | 216 | .Fn BN_is_prime_ex |
218 | and | 217 | and |
219 | .Fn BN_is_prime_fasttest_ex | 218 | .Fn BN_is_prime_fasttest_ex |
@@ -251,8 +250,21 @@ If | |||
251 | .Fa nchecks | 250 | .Fa nchecks |
252 | == | 251 | == |
253 | .Dv BN_prime_checks , | 252 | .Dv BN_prime_checks , |
254 | a number of iterations is used that yields a false positive rate of at | 253 | a number of iterations is used that yields a false positive rate |
255 | most 2^-80 for random input. | 254 | of at most 2\(ha-64 for random input. |
255 | The error rate depends on the size of the prime | ||
256 | and goes down for bigger primes. | ||
257 | The rate is 2\(ha-80 starting at 308 bits, 2\(ha-112 at 852 bits, | ||
258 | 2\(ha-128 at 1080 bits, 2\(ha-192 at 3747 bits | ||
259 | and 2\(ha-256 at 6394 bits. | ||
260 | .Pp | ||
261 | When the source of the prime is not random or not trusted, the | ||
262 | number of checks needs to be much higher to reach the same level | ||
263 | of assurance: It should equal half of the targeted security level | ||
264 | in bits (rounded up to the next integer if necessary). | ||
265 | For instance, to reach the 128 bit security level, | ||
266 | .Fa nchecks | ||
267 | should be set to 64. | ||
256 | .Pp | 268 | .Pp |
257 | If | 269 | If |
258 | .Fa cb | 270 | .Fa cb |