From e189872486477c2bb9b041cb00f4390ef4aa911b Mon Sep 17 00:00:00 2001 From: Geoff Thorpe Date: Sun, 8 Dec 2002 16:45:26 +0000 Subject: [PATCH] Nils Larsch submitted; - a patch to fix a memory leak in rsa_gen.c - a note about compiler warnings with unions - a note about improving structure element names This applies his patch and implements a solution to the notes. --- apps/dsaparam.c | 5 +---- crypto/bn/bn.h | 14 +++++++++++++- crypto/bn/bn_depr.c | 12 +++--------- crypto/bn/bn_prime.c | 4 ++-- crypto/dh/dh_depr.c | 4 +--- crypto/dsa/dsa_depr.c | 4 +--- crypto/rsa/rsa_depr.c | 4 +--- crypto/rsa/rsa_gen.c | 10 ++-------- 8 files changed, 24 insertions(+), 33 deletions(-) diff --git a/apps/dsaparam.c b/apps/dsaparam.c index 63e2cab45f..7a3110136c 100644 --- a/apps/dsaparam.c +++ b/apps/dsaparam.c @@ -281,10 +281,7 @@ bad: if (numbits > 0) { BN_GENCB cb; - cb.ver = 2; - cb.cb_2 = dsa_cb; - cb.arg = bio_err; - + BN_GENCB_set(&cb, dsa_cb, bio_err); assert(need_rand); dsa = DSA_new(); if(!dsa) diff --git a/crypto/bn/bn.h b/crypto/bn/bn.h index c1b5b41935..58263baf9a 100644 --- a/crypto/bn/bn.h +++ b/crypto/bn/bn.h @@ -299,10 +299,22 @@ struct bn_gencb_st void (*cb_1)(int, int, void *); /* if(ver==2) - new callback style */ int (*cb_2)(int, int, BN_GENCB *); - }; + } cb; }; /* Wrapper function to make using BN_GENCB easier, */ int BN_GENCB_call(BN_GENCB *cb, int a, int b); +/* Macro to populate a BN_GENCB structure with an "old"-style callback */ +#define BN_GENCB_set_old(gencb, callback, cb_arg) { \ + BN_GENCB *tmp_gencb = (gencb); \ + tmp_gencb->ver = 1; \ + tmp_gencb->arg = (cb_arg); \ + tmp_gencb->cb.cb_1 = (callback); } +/* Macro to populate a BN_GENCB structure with a "new"-style callback */ +#define BN_GENCB_set(gencb, callback, cb_arg) { \ + BN_GENCB *tmp_gencb = (gencb); \ + tmp_gencb->ver = 2; \ + tmp_gencb->arg = (cb_arg); \ + tmp_gencb->cb.cb_2 = (callback); } #define BN_prime_checks 0 /* default: select number of iterations based on the size of the number */ diff --git a/crypto/bn/bn_depr.c b/crypto/bn/bn_depr.c index 76c349833c..35e9127288 100644 --- a/crypto/bn/bn_depr.c +++ b/crypto/bn/bn_depr.c @@ -70,9 +70,7 @@ BIGNUM *BN_generate_prime(BIGNUM *ret, int bits, int safe, BIGNUM *rnd=NULL; int found = 0; - cb.ver = 1; - cb.arg = cb_arg; - cb.cb_1 = callback; + BN_GENCB_set_old(&cb, callback, cb_arg); if (ret == NULL) { @@ -94,9 +92,7 @@ int BN_is_prime(const BIGNUM *a, int checks, void (*callback)(int,int,void *), BN_CTX *ctx_passed, void *cb_arg) { BN_GENCB cb; - cb.ver = 1; - cb.arg = cb_arg; - cb.cb_1 = callback; + BN_GENCB_set_old(&cb, callback, cb_arg); return BN_is_prime_ex(a, checks, ctx_passed, &cb); } @@ -106,9 +102,7 @@ int BN_is_prime_fasttest(const BIGNUM *a, int checks, int do_trial_division) { BN_GENCB cb; - cb.ver = 1; - cb.arg = cb_arg; - cb.cb_1 = callback; + BN_GENCB_set_old(&cb, callback, cb_arg); return BN_is_prime_fasttest_ex(a, checks, ctx_passed, do_trial_division, &cb); } diff --git a/crypto/bn/bn_prime.c b/crypto/bn/bn_prime.c index a9ec01d916..43eb9e6dfd 100644 --- a/crypto/bn/bn_prime.c +++ b/crypto/bn/bn_prime.c @@ -142,11 +142,11 @@ int BN_GENCB_call(BN_GENCB *cb, int a, int b) { case 1: /* Deprecated-style callbacks */ - cb->cb_1(a, b, cb->arg); + cb->cb.cb_1(a, b, cb->arg); return 1; case 2: /* New-style callbacks */ - return cb->cb_2(a, b, cb); + return cb->cb.cb_2(a, b, cb); default: break; } diff --git a/crypto/dh/dh_depr.c b/crypto/dh/dh_depr.c index 8a909b1959..3eb319e2a8 100644 --- a/crypto/dh/dh_depr.c +++ b/crypto/dh/dh_depr.c @@ -70,9 +70,7 @@ DH *DH_generate_parameters(int prime_len, int generator, if((ret=DH_new()) == NULL) return NULL; - cb.ver = 1; - cb.arg = cb_arg; - cb.cb_1 = callback; + BN_GENCB_set_old(&cb, callback, cb_arg); if(DH_generate_parameters_ex(ret, prime_len, generator, &cb)) return ret; diff --git a/crypto/dsa/dsa_depr.c b/crypto/dsa/dsa_depr.c index c16315389b..cb80457211 100644 --- a/crypto/dsa/dsa_depr.c +++ b/crypto/dsa/dsa_depr.c @@ -91,9 +91,7 @@ DSA *DSA_generate_parameters(int bits, if ((ret=DSA_new()) == NULL) return NULL; - cb.ver = 1; - cb.arg = cb_arg; - cb.cb_1 = callback; + BN_GENCB_set_old(&cb, callback, cb_arg); if(DSA_generate_parameters_ex(ret, bits, seed_in, seed_len, counter_ret, h_ret, &cb)) diff --git a/crypto/rsa/rsa_depr.c b/crypto/rsa/rsa_depr.c index 25fa954393..3773d037c6 100644 --- a/crypto/rsa/rsa_depr.c +++ b/crypto/rsa/rsa_depr.c @@ -71,9 +71,7 @@ RSA *RSA_generate_key(int bits, unsigned long e_value, if((rsa=RSA_new()) == NULL) return 0; - cb.ver = 1; - cb.arg = cb_arg; - cb.cb_1 = callback; + BN_GENCB_set_old(&cb, callback, cb_arg); if(RSA_generate_key_ex(rsa, bits, e_value, &cb)) return rsa; diff --git a/crypto/rsa/rsa_gen.c b/crypto/rsa/rsa_gen.c index a45b9aab5c..e3ae03e691 100644 --- a/crypto/rsa/rsa_gen.c +++ b/crypto/rsa/rsa_gen.c @@ -166,22 +166,16 @@ int RSA_generate_key_ex(RSA *rsa, int bits, unsigned long e_value, BN_GENCB *cb) goto err; } */ - rsa->d=BN_mod_inverse(NULL,rsa->e,r0,ctx2); /* d */ - if (rsa->d == NULL) goto err; + if (!BN_mod_inverse(rsa->d,rsa->e,r0,ctx2)) goto err; /* d */ /* calculate d mod (p-1) */ - rsa->dmp1=BN_new(); - if (rsa->dmp1 == NULL) goto err; if (!BN_mod(rsa->dmp1,rsa->d,r1,ctx)) goto err; /* calculate d mod (q-1) */ - rsa->dmq1=BN_new(); - if (rsa->dmq1 == NULL) goto err; if (!BN_mod(rsa->dmq1,rsa->d,r2,ctx)) goto err; /* calculate inverse of q mod p */ - rsa->iqmp=BN_mod_inverse(NULL,rsa->q,rsa->p,ctx2); - if (rsa->iqmp == NULL) goto err; + if (!BN_mod_inverse(rsa->iqmp,rsa->q,rsa->p,ctx2)) goto err; ok=1; err: -- 2.34.1