summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/rsa/rsa_gen.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/rsa/rsa_gen.c')
-rw-r--r--src/lib/libcrypto/rsa/rsa_gen.c35
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
237RSA *
238RSA_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 }
263err:
264 BN_free(e);
265 RSA_free(rsa);
266
267 return 0;
268}