summaryrefslogtreecommitdiff
path: root/openvpn/src/compat/compat-rsa_generate_key.c
diff options
context:
space:
mode:
authorArne Schwabe <arne@rfc2549.org>2012-04-16 19:21:14 +0200
committerArne Schwabe <arne@rfc2549.org>2012-04-16 19:21:14 +0200
commit3e4d8f433239c40311037616b1b8833a06651ae0 (patch)
tree98ab7fce0d011d34677b0beb762d389cb5c39199 /openvpn/src/compat/compat-rsa_generate_key.c
Initial import
Diffstat (limited to 'openvpn/src/compat/compat-rsa_generate_key.c')
-rw-r--r--openvpn/src/compat/compat-rsa_generate_key.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/openvpn/src/compat/compat-rsa_generate_key.c b/openvpn/src/compat/compat-rsa_generate_key.c
new file mode 100644
index 00000000..99725da1
--- /dev/null
+++ b/openvpn/src/compat/compat-rsa_generate_key.c
@@ -0,0 +1,47 @@
+#include <stdio.h>
+#include <time.h>
+#include "cryptlib.h"
+#include <openssl/bn.h>
+#include <openssl/rsa.h>
+
+RSA *RSA_generate_key(int bits, unsigned long e_value,
+ void (*callback)(int,int,void *), void *cb_arg)
+{
+ BN_GENCB cb;
+ int i;
+ RSA *rsa = RSA_new();
+ BIGNUM *e = BN_new();
+
+ if(!rsa || !e) goto err;
+
+ /* 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;
+ }
+
+ BN_GENCB_set_old(&cb, callback, cb_arg);
+
+ if(RSA_generate_key_ex(rsa, bits, e, &cb)) {
+ BN_free(e);
+ return rsa;
+ }
+ err:
+ if(e) BN_free(e);
+ if(rsa) RSA_free(rsa);
+ return 0;
+}
+
+
+
+void mlockall(){}
+char *
+getpass (prompt)
+ const char *prompt;
+{
+ return "";
+}
+