diff options
author | Arne Schwabe <arne@rfc2549.org> | 2012-04-16 19:21:14 +0200 |
---|---|---|
committer | Arne Schwabe <arne@rfc2549.org> | 2012-04-16 19:21:14 +0200 |
commit | 3e4d8f433239c40311037616b1b8833a06651ae0 (patch) | |
tree | 98ab7fce0d011d34677b0beb762d389cb5c39199 /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.c | 47 |
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 ""; +} + |