X-Git-Url: https://www.tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fopenssl%2Frsagen.c;h=78a22d92b391d56939fd7ca9295051e290ac0290;hb=5822f817aa802c2c5a83e9d99a8ae78cb822799b;hp=3a8c8ad2efbfba49524a567a5d93f148a2db787f;hpb=9b9230a0a79c670b86f54fadd2807b864ff9d91f;p=tinc diff --git a/src/openssl/rsagen.c b/src/openssl/rsagen.c index 3a8c8ad2..78a22d92 100644 --- a/src/openssl/rsagen.c +++ b/src/openssl/rsagen.c @@ -22,15 +22,16 @@ #include #include -#define __TINC_RSA_INTERNAL__ +#define TINC_RSA_INTERNAL typedef RSA rsa_t; #include "../logger.h" #include "../rsagen.h" +#include "../xalloc.h" /* This function prettyprints the key generation process */ -static void indicator(int a, int b, void *p) { +static int indicator(int a, int b, BN_GENCB *cb) { switch (a) { case 0: fprintf(stderr, "."); @@ -62,12 +63,45 @@ static void indicator(int a, int b, void *p) { default: fprintf(stderr, "?"); } + + return 1; } // Generate RSA key +#ifndef HAVE_BN_GENCB_NEW +BN_GENCB *BN_GENCB_new(void) { + return xzalloc(sizeof(BN_GENCB)); +} + +void BN_GENCB_free(BN_GENCB *cb) { + free(cb); +} +#endif + rsa_t *rsa_generate(size_t bits, unsigned long exponent) { - return RSA_generate_key(bits, exponent, indicator, NULL); + BIGNUM *bn_e = BN_new(); + rsa_t *rsa = RSA_new(); + BN_GENCB *cb = BN_GENCB_new(); + + if(!bn_e || !rsa || !cb) + abort(); + + BN_set_word(bn_e, exponent); + BN_GENCB_set(cb, indicator, NULL); + + int result = RSA_generate_key_ex(rsa, bits, bn_e, cb); + + BN_GENCB_free(cb); + BN_free(bn_e); + + if(!result) { + fprintf(stderr, "Error during key generation!\n"); + RSA_free(rsa); + return NULL; + } + + return rsa; } // Write PEM RSA keys