diff options
Diffstat (limited to 'src/lib/libcrypto')
-rw-r--r-- | src/lib/libcrypto/rsa/rsa_gen.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/src/lib/libcrypto/rsa/rsa_gen.c b/src/lib/libcrypto/rsa/rsa_gen.c index ebd0aeffd5..6a8bd08160 100644 --- a/src/lib/libcrypto/rsa/rsa_gen.c +++ b/src/lib/libcrypto/rsa/rsa_gen.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: rsa_gen.c,v 1.31 2025/05/10 05:54:38 tb Exp $ */ | 1 | /* $OpenBSD: rsa_gen.c,v 1.32 2025/09/29 08:46:15 jan Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -84,6 +84,7 @@ rsa_builtin_keygen(RSA *rsa, int bits, BIGNUM *e_value, BN_GENCB *cb) | |||
84 | BIGNUM pr0, d, p; | 84 | BIGNUM pr0, d, p; |
85 | int bitsp, bitsq, ok = -1, n = 0; | 85 | int bitsp, bitsq, ok = -1, n = 0; |
86 | BN_CTX *ctx = NULL; | 86 | BN_CTX *ctx = NULL; |
87 | BIGNUM *diff, *mindiff; | ||
87 | 88 | ||
88 | ctx = BN_CTX_new(); | 89 | ctx = BN_CTX_new(); |
89 | if (ctx == NULL) | 90 | if (ctx == NULL) |
@@ -97,10 +98,24 @@ rsa_builtin_keygen(RSA *rsa, int bits, BIGNUM *e_value, BN_GENCB *cb) | |||
97 | goto err; | 98 | goto err; |
98 | if ((r3 = BN_CTX_get(ctx)) == NULL) | 99 | if ((r3 = BN_CTX_get(ctx)) == NULL) |
99 | goto err; | 100 | goto err; |
101 | if ((diff = BN_CTX_get(ctx)) == NULL) | ||
102 | goto err; | ||
103 | if ((mindiff = BN_CTX_get(ctx)) == NULL) | ||
104 | goto err; | ||
100 | 105 | ||
101 | bitsp = (bits + 1) / 2; | 106 | bitsp = (bits + 1) / 2; |
102 | bitsq = bits - bitsp; | 107 | bitsq = bits - bitsp; |
103 | 108 | ||
109 | /* | ||
110 | * To guarantee a minimum distance of 2^(bits/2 - 100) between p and q. | ||
111 | * | ||
112 | * NIST SP 800-56B, section 6.2.1, 3.c | ||
113 | */ | ||
114 | if (bits < 200) | ||
115 | goto err; | ||
116 | if (!BN_set_bit(mindiff, bits/2 - 100)) | ||
117 | goto err; | ||
118 | |||
104 | /* We need the RSA components non-NULL */ | 119 | /* We need the RSA components non-NULL */ |
105 | if (!rsa->n && ((rsa->n = BN_new()) == NULL)) | 120 | if (!rsa->n && ((rsa->n = BN_new()) == NULL)) |
106 | goto err; | 121 | goto err; |
@@ -148,8 +163,9 @@ rsa_builtin_keygen(RSA *rsa, int bits, BIGNUM *e_value, BN_GENCB *cb) | |||
148 | if (!BN_generate_prime_ex(rsa->q, bitsq, 0, NULL, NULL, | 163 | if (!BN_generate_prime_ex(rsa->q, bitsq, 0, NULL, NULL, |
149 | cb)) | 164 | cb)) |
150 | goto err; | 165 | goto err; |
151 | } while (BN_cmp(rsa->p, rsa->q) == 0 && | 166 | if (!BN_sub(diff, rsa->p, rsa->q)) |
152 | ++degenerate < 3); | 167 | goto err; |
168 | } while (BN_ucmp(diff, mindiff) <= 0 && ++degenerate < 3); | ||
153 | if (degenerate == 3) { | 169 | if (degenerate == 3) { |
154 | ok = 0; /* we set our own err */ | 170 | ok = 0; /* we set our own err */ |
155 | RSAerror(RSA_R_KEY_SIZE_TOO_SMALL); | 171 | RSAerror(RSA_R_KEY_SIZE_TOO_SMALL); |