#include <openssl/bn.h>
#include <openssl/rsa.h>
+#ifdef OPENSSL_NO_DEPRECATED
+
static void *dummy=&dummy;
-#ifndef OPENSSL_NO_DEPRECATED
+#else
+
RSA *RSA_generate_key(int bits, unsigned long e_value,
void (*callback)(int,int,void *), void *cb_arg)
{
- BN_GENCB cb;
- RSA *rsa;
+ int i;
+ BN_GENCB *cb = BN_GENCB_new();
+ RSA *rsa = RSA_new();
+ BIGNUM *e = BN_new();
- if((rsa=RSA_new()) == NULL)
- return 0;
+ if(!cb || !rsa || !e) goto err;
- BN_GENCB_set_old(&cb, callback, cb_arg);
+ /* The problem is when building with 8, 16, or 32 BN_ULONG,
+ * unsigned long can be larger */
+ for (i=0; i<(int)sizeof(unsigned long)*8; i++)
+ {
+ if (e_value & (1UL<<i))
+ if (BN_set_bit(e,i) == 0)
+ goto err;
+ }
- if(RSA_generate_key_ex(rsa, bits, e_value, &cb))
+ BN_GENCB_set_old(cb, callback, cb_arg);
+
+ if(RSA_generate_key_ex(rsa, bits, e, cb)) {
+ BN_free(e);
+ BN_GENCB_free(cb);
return rsa;
- RSA_free(rsa);
+ }
+err:
+ if(e) BN_free(e);
+ if(rsa) RSA_free(rsa);
+ if(cb) BN_GENCB_free(cb);
return 0;
}
#endif