X-Git-Url: https://tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fopenssl%2Frsagen.c;h=ce0bd0bf42b4b7578c7cc3ce1db3bdd7e14bcb03;hb=a4b5665643d48596b2659dbd69fe8e9b2a944e35;hp=3a8c8ad2efbfba49524a567a5d93f148a2db787f;hpb=9b9230a0a79c670b86f54fadd2807b864ff9d91f;p=tinc diff --git a/src/openssl/rsagen.c b/src/openssl/rsagen.c index 3a8c8ad2..ce0bd0bf 100644 --- a/src/openssl/rsagen.c +++ b/src/openssl/rsagen.c @@ -1,6 +1,6 @@ /* rsagen.c -- RSA key generation and export - Copyright (C) 2008-2013 Guus Sliepen + Copyright (C) 2008-2022 Guus Sliepen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,12 +17,12 @@ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include "../system.h" +#include "system.h" #include #include -#define __TINC_RSA_INTERNAL__ +#define TINC_RSA_INTERNAL typedef RSA rsa_t; #include "../logger.h" @@ -30,44 +30,71 @@ typedef RSA rsa_t; /* This function prettyprints the key generation process */ -static void indicator(int a, int b, void *p) { - switch (a) { - case 0: - fprintf(stderr, "."); - break; +static int indicator(int a, int b, BN_GENCB *cb) { + (void)cb; - case 1: - fprintf(stderr, "+"); - break; + switch(a) { + case 0: + fprintf(stderr, "."); + break; - case 2: - fprintf(stderr, "-"); - break; + case 1: + fprintf(stderr, "+"); + break; - case 3: - switch (b) { - case 0: - fprintf(stderr, " p\n"); - break; + case 2: + fprintf(stderr, "-"); + break; - case 1: - fprintf(stderr, " q\n"); - break; + case 3: + switch(b) { + case 0: + fprintf(stderr, " p\n"); + break; - default: - fprintf(stderr, "?"); - } + case 1: + fprintf(stderr, " q\n"); break; default: fprintf(stderr, "?"); + } + + break; + + default: + fprintf(stderr, "?"); } + + return 1; } // Generate RSA key 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, (int) 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