From: Nikos Mavrogiannopoulos Date: Tue, 28 Jan 2014 10:31:34 +0000 (+0100) Subject: Allow verification of public and private parameters. X-Git-Tag: gnutls_3_3_0pre0~241 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7fa5ff32419bbddf8e981686596c30b3821ccad3;p=thirdparty%2Fgnutls.git Allow verification of public and private parameters. --- diff --git a/lib/crypto-backend.h b/lib/crypto-backend.h index f7267c827c..7f4e1b61c6 100644 --- a/lib/crypto-backend.h +++ b/lib/crypto-backend.h @@ -320,7 +320,9 @@ typedef struct gnutls_crypto_pk { gnutls_pk_params_st * issuer_params, gnutls_digest_algorithm_t *); /* sanity checks the public key parameters */ - int (*verify_params) (gnutls_pk_algorithm_t, + int (*verify_priv_params) (gnutls_pk_algorithm_t, + const gnutls_pk_params_st * priv); + int (*verify_pub_params) (gnutls_pk_algorithm_t, const gnutls_pk_params_st * pub); int (*generate_keys) (gnutls_pk_algorithm_t, unsigned int nbits, gnutls_pk_params_st *); diff --git a/lib/gnutls_pk.h b/lib/gnutls_pk.h index 0658359f48..4434f6d5bf 100644 --- a/lib/gnutls_pk.h +++ b/lib/gnutls_pk.h @@ -30,7 +30,8 @@ extern gnutls_crypto_pk_st _gnutls_pk_ops; #define _gnutls_pk_decrypt( algo, ciphertext, plaintext, params) _gnutls_pk_ops.decrypt( algo, ciphertext, plaintext, params) #define _gnutls_pk_sign( algo, sig, data, params) _gnutls_pk_ops.sign( algo, sig, data, params) #define _gnutls_pk_verify( algo, data, sig, params) _gnutls_pk_ops.verify( algo, data, sig, params) -#define _gnutls_pk_verify_params( algo, params) _gnutls_pk_ops.verify_params( algo, params) +#define _gnutls_pk_verify_priv_params( algo, params) _gnutls_pk_ops.verify_priv_params( algo, params) +#define _gnutls_pk_verify_pub_params( algo, params) _gnutls_pk_ops.verify_pub_params( algo, params) #define _gnutls_pk_derive( algo, out, pub, priv) _gnutls_pk_ops.derive( algo, out, pub, priv) #define _gnutls_pk_generate_keys( algo, bits, priv) _gnutls_pk_ops.generate_keys( algo, bits, priv) #define _gnutls_pk_generate_params( algo, bits, priv) _gnutls_pk_ops.generate_params( algo, bits, priv) diff --git a/lib/nettle/pk.c b/lib/nettle/pk.c index ed0960f4c1..413b61a7ec 100644 --- a/lib/nettle/pk.c +++ b/lib/nettle/pk.c @@ -1125,7 +1125,7 @@ wrap_nettle_pk_generate_keys(gnutls_pk_algorithm_t algo, } static int -wrap_nettle_pk_verify_params(gnutls_pk_algorithm_t algo, +wrap_nettle_pk_verify_priv_params(gnutls_pk_algorithm_t algo, const gnutls_pk_params_st * params) { int ret; @@ -1324,6 +1324,64 @@ wrap_nettle_pk_verify_params(gnutls_pk_algorithm_t algo, return ret; } +static int +wrap_nettle_pk_verify_pub_params(gnutls_pk_algorithm_t algo, + const gnutls_pk_params_st * params) +{ + int ret; + + switch (algo) { + case GNUTLS_PK_RSA: + case GNUTLS_PK_DSA: + return 0; + case GNUTLS_PK_EC: + { + /* just verify that x and y lie on the curve */ + struct ecc_point r, pub; + mpz_t x1, y1, x2, y2; + const struct ecc_curve *curve; + + if (params->params_nr != ECC_PUBLIC_PARAMS) + return + gnutls_assert_val + (GNUTLS_E_INVALID_REQUEST); + + curve = get_supported_curve(params->flags); + if (curve == NULL) + return + gnutls_assert_val + (GNUTLS_E_ECC_UNSUPPORTED_CURVE); + + ret = _ecc_params_to_pubkey(params, &pub, curve); + if (ret < 0) + return gnutls_assert_val(ret); + + ecc_point_init(&r, curve); + /* verify that x,y lie on the curve */ + ret = + ecc_point_set(&r, TOMPZ(params->params[ECC_X]), + TOMPZ(params->params[ECC_Y])); + if (ret == 0) { + ret = + gnutls_assert_val + (GNUTLS_E_ILLEGAL_PARAMETER); + goto ecc_cleanup; + } + ecc_point_clear(&r); + + ret = 0; + + ecc_cleanup: + ecc_point_clear(&pub); + } + break; + default: + ret = gnutls_assert_val(GNUTLS_E_INVALID_REQUEST); + } + + return ret; +} + static int calc_rsa_exp(gnutls_pk_params_st * params) { bigint_t tmp; @@ -1544,7 +1602,8 @@ gnutls_crypto_pk_st _gnutls_pk_ops = { .decrypt = _wrap_nettle_pk_decrypt, .sign = _wrap_nettle_pk_sign, .verify = _wrap_nettle_pk_verify, - .verify_params = wrap_nettle_pk_verify_params, + .verify_priv_params = wrap_nettle_pk_verify_priv_params, + .verify_pub_params = wrap_nettle_pk_verify_pub_params, .generate_params = wrap_nettle_pk_generate_params, .generate_keys = wrap_nettle_pk_generate_keys, .pk_fixup_private_params = wrap_nettle_pk_fixup, diff --git a/lib/x509/privkey.c b/lib/x509/privkey.c index c51fdc7931..7b228eb082 100644 --- a/lib/x509/privkey.c +++ b/lib/x509/privkey.c @@ -1385,7 +1385,7 @@ gnutls_x509_privkey_generate(gnutls_x509_privkey_t key, } #ifndef ENABLE_FIPS140 - ret = _gnutls_pk_verify_params(algo, &key->params); + ret = _gnutls_pk_verify_priv_params(algo, &key->params); #else ret = pct_test(algo, &key->params); #endif @@ -1424,7 +1424,7 @@ int gnutls_x509_privkey_verify_params(gnutls_x509_privkey_t key) { int ret; - ret = _gnutls_pk_verify_params(key->pk_algorithm, &key->params); + ret = _gnutls_pk_verify_priv_params(key->pk_algorithm, &key->params); if (ret < 0) { gnutls_assert(); return ret;