diff options
Diffstat (limited to 'src/lib/libcrypto/rsa/rsa_gen.c')
-rw-r--r-- | src/lib/libcrypto/rsa/rsa_gen.c | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/src/lib/libcrypto/rsa/rsa_gen.c b/src/lib/libcrypto/rsa/rsa_gen.c index d4a4d60a86..64b70aa7b7 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.27 2023/03/27 10:22:47 tb Exp $ */ | 1 | /* $OpenBSD: rsa_gen.c,v 1.28 2023/04/13 14:59:13 tb 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 | * |
@@ -233,3 +233,36 @@ err: | |||
233 | 233 | ||
234 | return ok; | 234 | return ok; |
235 | } | 235 | } |
236 | |||
237 | RSA * | ||
238 | RSA_generate_key(int bits, unsigned long e_value, | ||
239 | void (*callback)(int, int, void *), void *cb_arg) | ||
240 | { | ||
241 | BN_GENCB cb; | ||
242 | int i; | ||
243 | RSA *rsa = RSA_new(); | ||
244 | BIGNUM *e = BN_new(); | ||
245 | |||
246 | if (!rsa || !e) | ||
247 | goto err; | ||
248 | |||
249 | /* The problem is when building with 8, 16, or 32 BN_ULONG, | ||
250 | * unsigned long can be larger */ | ||
251 | for (i = 0; i < (int)sizeof(unsigned long) * 8; i++) { | ||
252 | if (e_value & (1UL << i)) | ||
253 | if (BN_set_bit(e, i) == 0) | ||
254 | goto err; | ||
255 | } | ||
256 | |||
257 | BN_GENCB_set_old(&cb, callback, cb_arg); | ||
258 | |||
259 | if (RSA_generate_key_ex(rsa, bits, e, &cb)) { | ||
260 | BN_free(e); | ||
261 | return rsa; | ||
262 | } | ||
263 | err: | ||
264 | BN_free(e); | ||
265 | RSA_free(rsa); | ||
266 | |||
267 | return 0; | ||
268 | } | ||