diff options
-rw-r--r-- | lib/auth/srp.c | 12 | ||||
-rw-r--r-- | lib/crypto-backend.h | 2 | ||||
-rw-r--r-- | lib/gnutls_mpi.c | 6 | ||||
-rw-r--r-- | lib/nettle/mpi.c | 15 | ||||
-rw-r--r-- | lib/nettle/pk.c | 57 |
5 files changed, 53 insertions, 39 deletions
diff --git a/lib/auth/srp.c b/lib/auth/srp.c index 3966b0b9b2..7e579e5cc0 100644 --- a/lib/auth/srp.c +++ b/lib/auth/srp.c @@ -71,10 +71,14 @@ inline static int check_param_mod_n(bigint_t a, bigint_t n, int is_a) int ret, err = 0; bigint_t r; - r = _gnutls_mpi_modm(NULL, a, n); - if (r == NULL) { - gnutls_assert(); - return GNUTLS_E_MEMORY_ERROR; + ret = _gnutls_mpi_init(&r); + if (ret < 0) + return gnutls_assert_val(ret); + + ret = _gnutls_mpi_modm(r, a, n); + if (ret < 0) { + _gnutls_mpi_release(&r); + return gnutls_assert_val(ret); } ret = _gnutls_mpi_cmp_ui(r, 0); diff --git a/lib/crypto-backend.h b/lib/crypto-backend.h index 25fdeb07e3..ff798b581c 100644 --- a/lib/crypto-backend.h +++ b/lib/crypto-backend.h @@ -114,7 +114,7 @@ typedef struct gnutls_crypto_bigint { /* as bigint_cmp */ int (*bigint_cmp_ui) (const bigint_t m1, unsigned long m2); /* r = a % b */ - bigint_t (*bigint_modm) (bigint_t r, const bigint_t a, const bigint_t b); + int (*bigint_modm) (bigint_t r, const bigint_t a, const bigint_t b); /* a = b -> ret == a */ bigint_t (*bigint_set) (bigint_t a, const bigint_t b); /* a = b -> ret == a */ diff --git a/lib/gnutls_mpi.c b/lib/gnutls_mpi.c index 39560c4b1c..44dbc9d5e0 100644 --- a/lib/gnutls_mpi.c +++ b/lib/gnutls_mpi.c @@ -72,7 +72,11 @@ _gnutls_mpi_random_modp(bigint_t r, bigint_t p, goto cleanup; } - _gnutls_mpi_modm(tmp, tmp, p); + ret = _gnutls_mpi_modm(tmp, tmp, p); + if (ret < 0) { + gnutls_assert(); + goto cleanup; + } if (_gnutls_mpi_cmp_ui(tmp, 0) == 0) _gnutls_mpi_add_ui(tmp, tmp, 1); diff --git a/lib/nettle/mpi.c b/lib/nettle/mpi.c index c4645ac1f5..8cac69b363 100644 --- a/lib/nettle/mpi.c +++ b/lib/nettle/mpi.c @@ -128,6 +128,8 @@ static int wrap_nettle_mpi_init_multi(bigint_t *w, ...) fail: mpz_clear(TOMPZ(*w)); gnutls_free(*w); + *w = NULL; + va_start(args, w); do { @@ -135,6 +137,7 @@ fail: if (next != last_failed) { mpz_clear(TOMPZ(*next)); gnutls_free(*next); + *next = NULL; } } while(next != last_failed); @@ -256,19 +259,11 @@ static void wrap_nettle_mpi_clear(bigint_t a) TOMPZ(a)[0]._mp_alloc * sizeof(mp_limb_t)); } -static bigint_t wrap_nettle_mpi_modm(bigint_t r, const bigint_t a, const bigint_t b) +static int wrap_nettle_mpi_modm(bigint_t r, const bigint_t a, const bigint_t b) { -int ret; - - if (r == NULL) { - ret = wrap_nettle_mpi_init(&r); - if (ret < 0) - return NULL; - } - mpz_mod(TOMPZ(r), TOMPZ(a), TOMPZ(b)); - return r; + return 0; } static bigint_t diff --git a/lib/nettle/pk.c b/lib/nettle/pk.c index 72407fa37b..515380b421 100644 --- a/lib/nettle/pk.c +++ b/lib/nettle/pk.c @@ -187,14 +187,23 @@ static int _wrap_nettle_pk_derive(gnutls_pk_algorithm_t algo, switch (algo) { case GNUTLS_PK_DH: { bigint_t f, x, prime; - bigint_t k = NULL, ff; + bigint_t k = NULL, ff = NULL; unsigned int bits; f = pub->params[DH_Y]; x = priv->params[DH_X]; prime = priv->params[DH_P]; - ff = _gnutls_mpi_modm(NULL, f, prime); + ret = _gnutls_mpi_init_multi(&k, &ff, NULL); + if (ret < 0) + return gnutls_assert_val(ret); + + ret = _gnutls_mpi_modm(ff, f, prime); + if (ret < 0) { + gnutls_assert(); + goto dh_cleanup; + } + _gnutls_mpi_add_ui(ff, ff, 1); /* check if f==0,1,p-1. @@ -215,11 +224,6 @@ static int _wrap_nettle_pk_derive(gnutls_pk_algorithm_t algo, goto dh_cleanup; } - ret = _gnutls_mpi_init(&k); - if (ret < 0) { - gnutls_assert(); - goto dh_cleanup; - } _gnutls_mpi_powm(k, f, x, prime); @@ -1125,7 +1129,7 @@ wrap_nettle_pk_verify_params(gnutls_pk_algorithm_t algo, gnutls_assert_val (GNUTLS_E_INVALID_REQUEST); - ret = _gnutls_mpi_init(&t1); + ret = _gnutls_mpi_init_multi(&t1, &t2, NULL); if (ret < 0) return gnutls_assert_val(ret); @@ -1154,8 +1158,8 @@ wrap_nettle_pk_verify_params(gnutls_pk_algorithm_t algo, /* [RSA_PRIME1] = d % p-1, [RSA_PRIME2] = d % q-1 */ _gnutls_mpi_sub_ui(t1, params->params[RSA_PRIME1], 1); - t2 = _gnutls_mpi_modm(NULL, params->params[RSA_PRIV], t1); - if (t2 == NULL) { + ret = _gnutls_mpi_modm(t2, params->params[RSA_PRIV], t1); + if (ret < 0) { ret = gnutls_assert_val (GNUTLS_E_MEMORY_ERROR); @@ -1172,10 +1176,9 @@ wrap_nettle_pk_verify_params(gnutls_pk_algorithm_t algo, _gnutls_mpi_sub_ui(t1, params->params[RSA_PRIME2], 1); - zrelease_mpi_key(&t2); - t2 = _gnutls_mpi_modm(NULL, params->params[RSA_PRIV], t1); - if (t2 == NULL) { + ret = _gnutls_mpi_modm(t2, params->params[RSA_PRIV], t1); + if (ret < 0) { ret = gnutls_assert_val (GNUTLS_E_MEMORY_ERROR); @@ -1315,28 +1318,36 @@ static int calc_rsa_exp(gnutls_pk_params_st * params) gnutls_assert(); return GNUTLS_E_INTERNAL_ERROR; } + + params->params[6] = params->params[7] = NULL; - ret = _gnutls_mpi_init(&tmp); + ret = _gnutls_mpi_init_multi(&tmp, ¶ms->params[6], ¶ms->params[7], NULL); if (ret < 0) return gnutls_assert_val(ret); /* [6] = d % p-1, [7] = d % q-1 */ _gnutls_mpi_sub_ui(tmp, params->params[3], 1); - params->params[6] = - _gnutls_mpi_modm(NULL, params->params[2] /*d */ , tmp); + ret = + _gnutls_mpi_modm(params->params[6], params->params[2] /*d */ , tmp); + if (ret < 0) + goto fail; _gnutls_mpi_sub_ui(tmp, params->params[4], 1); - params->params[7] = - _gnutls_mpi_modm(NULL, params->params[2] /*d */ , tmp); + ret = + _gnutls_mpi_modm(params->params[7], params->params[2] /*d */ , tmp); + if (ret < 0) + goto fail; zrelease_mpi_key(&tmp); - if (params->params[7] == NULL || params->params[6] == NULL) { - gnutls_assert(); - return GNUTLS_E_MEMORY_ERROR; - } - return 0; + +fail: + zrelease_mpi_key(&tmp); + zrelease_mpi_key(¶ms->params[6]); + zrelease_mpi_key(¶ms->params[7]); + + return ret; } |