]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
_gnutls_pk_generate_keys: separate between ephemeral and long-term keys
authorNikos Mavrogiannopoulos <nmav@redhat.com>
Wed, 15 Mar 2017 14:11:14 +0000 (15:11 +0100)
committerNikos Mavrogiannopoulos <nmav@gnutls.org>
Thu, 16 Mar 2017 10:46:45 +0000 (10:46 +0000)
That allows using the faster generator for ephemeral keys.

Signed-off-by: Nikos Mavrogiannopoulos <nmav@redhat.com>
lib/auth/dh_common.c
lib/auth/ecdhe.c
lib/crypto-backend.h
lib/nettle/pk.c
lib/pk.h
lib/x509/privkey.c

index 9b6731ac5f86b3c3c862d9001788d4c7cb733183..b80b3298620ceb0725401c4adfb3e1e88ce02de6 100644 (file)
@@ -133,7 +133,7 @@ _gnutls_gen_dh_common_client_kx_int(gnutls_session_t session,
 
        ret =
            _gnutls_pk_generate_keys(GNUTLS_PK_DH, 0,
-                                    &session->key.dh_params);
+                                    &session->key.dh_params, 1);
        if (ret < 0)
                return gnutls_assert_val(ret);
 
@@ -322,7 +322,7 @@ _gnutls_dh_common_print_server_kx(gnutls_session_t session,
        /* Y=g^x mod p */
        ret =
            _gnutls_pk_generate_keys(GNUTLS_PK_DH, q_bits,
-                                    &session->key.dh_params);
+                                    &session->key.dh_params, 1);
        if (ret < 0)
                return gnutls_assert_val(ret);
 
index f35c7e32dcf4befb170b5f087136a7254be36f26..24cdf114303b8147ac196a08932fc5afe8bff10d 100644 (file)
@@ -241,7 +241,7 @@ _gnutls_gen_ecdh_common_client_kx_int(gnutls_session_t session,
        /* generate temporal key */
        ret =
            _gnutls_pk_generate_keys(pk, curve,
-                                    &session->key.ecdh_params);
+                                    &session->key.ecdh_params, 1);
        if (ret < 0)
                return gnutls_assert_val(ret);
 
@@ -425,7 +425,7 @@ int _gnutls_ecdh_common_print_server_kx(gnutls_session_t session,
        /* generate temporal key */
        ret =
            _gnutls_pk_generate_keys(pk, curve,
-                                    &session->key.ecdh_params);
+                                    &session->key.ecdh_params, 1);
        if (ret < 0)
                return gnutls_assert_val(ret);
 
index 1619bf0fa5c3f14cf8f1f4770e0178cb589bb400..1f0b85fb11826577b5f9a78b373fa5f9b8553cf0 100644 (file)
@@ -324,7 +324,7 @@ typedef struct gnutls_crypto_pk {
        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 *);
+                        gnutls_pk_params_st *, unsigned ephemeral);
        int (*generate_params) (gnutls_pk_algorithm_t, unsigned int nbits,
                         gnutls_pk_params_st *);
        /* this function should convert params to ones suitable
index f07f97940ea64834618ffd9d81efcdcbd9527fad..b8a2f42eaf553021302772e7cbbbe17488dfd76e 100644 (file)
@@ -990,7 +990,7 @@ int _gnutls_dh_generate_key(gnutls_dh_params_t dh_params,
        priv_key->data = NULL;
        pub_key->data = NULL;
 
-       ret = _gnutls_pk_generate_keys(GNUTLS_PK_DH, dh_params->q_bits, &params);
+       ret = _gnutls_pk_generate_keys(GNUTLS_PK_DH, dh_params->q_bits, &params, 0);
        if (ret < 0) {
                return gnutls_assert_val(ret);
        }
@@ -1084,7 +1084,7 @@ int _gnutls_ecdh_generate_key(gnutls_ecc_curve_t curve,
        y->data = NULL;
        k->data = NULL;
 
-       ret = _gnutls_pk_generate_keys(GNUTLS_PK_EC, curve, &params);
+       ret = _gnutls_pk_generate_keys(GNUTLS_PK_EC, curve, &params, 0);
        if (ret < 0) {
                return gnutls_assert_val(ret);
        }
@@ -1295,10 +1295,21 @@ cleanup:
 static int
 wrap_nettle_pk_generate_keys(gnutls_pk_algorithm_t algo,
                               unsigned int level /*bits or curve */ ,
-                              gnutls_pk_params_st * params)
+                              gnutls_pk_params_st * params,
+                              unsigned ephemeral /*non-zero if they are ephemeral keys */)
 {
        int ret;
        unsigned int i;
+       unsigned rnd_level;
+       nettle_random_func *rnd_func;
+
+       if (ephemeral) {
+               rnd_level = GNUTLS_RND_RANDOM;
+               rnd_func = rnd_tmpkey_func;
+       } else {
+               rnd_func = rnd_key_func;
+               rnd_level = GNUTLS_RND_KEY;
+       }
 
        switch (algo) {
        case GNUTLS_PK_DSA:
@@ -1317,7 +1328,7 @@ wrap_nettle_pk_generate_keys(gnutls_pk_algorithm_t algo,
 
                        ret =
                            dsa_generate_dss_keypair(&pub, y, x,
-                                                NULL, rnd_key_func,
+                                                NULL, rnd_func,
                                                 NULL, NULL);
                        if (ret != 1 || HAVE_LIB_ERROR()) {
                                gnutls_assert();
@@ -1374,13 +1385,13 @@ wrap_nettle_pk_generate_keys(gnutls_pk_algorithm_t algo,
                                if (have_q) {
                                        mpz_set(r, pub.q);
                                        mpz_sub_ui(r, r, 2);
-                                       nettle_mpz_random(x, NULL, rnd_tmpkey_func, r);
+                                       nettle_mpz_random(x, NULL, rnd_func, r);
                                        mpz_add_ui(x, x, 1);
                                } else {
                                        unsigned size = mpz_sizeinbase(pub.p, 2);
                                        if (level == 0)
                                                level = MIN(size, DH_EXPONENT_SIZE(size));
-                                       nettle_mpz_random_size(x, NULL, rnd_tmpkey_func, level);
+                                       nettle_mpz_random_size(x, NULL, rnd_func, level);
 
                                        if (level >= size)
                                                mpz_mod(x, x, pub.p);
@@ -1451,14 +1462,14 @@ wrap_nettle_pk_generate_keys(gnutls_pk_algorithm_t algo,
                                        params->seed_size = sizeof(params->seed);
                                        ret =
                                            rsa_generate_fips186_4_keypair(&pub, &priv, NULL,
-                                                        rnd_key_func, NULL, NULL,
+                                                        rnd_func, NULL, NULL,
                                                         &params->seed_size, params->seed,
                                                         level);
                                }
                        } else {
                                ret =
                                    rsa_generate_keypair(&pub, &priv, NULL,
-                                                rnd_key_func, NULL, NULL,
+                                                rnd_func, NULL, NULL,
                                                 level, 0);
                        }
                        if (ret != 1 || HAVE_LIB_ERROR()) {
@@ -1515,7 +1526,7 @@ wrap_nettle_pk_generate_keys(gnutls_pk_algorithm_t algo,
                        ecc_scalar_init(&key, curve);
                        ecc_point_init(&pub, curve);
 
-                       ecdsa_generate_keypair(&pub, &key, NULL, rnd_key_func);
+                       ecdsa_generate_keypair(&pub, &key, NULL, rnd_func);
                        if (HAVE_LIB_ERROR()) {
                                ret = gnutls_assert_val(GNUTLS_E_LIB_IN_ERROR_STATE);
                                goto ecc_fail;
@@ -1565,7 +1576,7 @@ wrap_nettle_pk_generate_keys(gnutls_pk_algorithm_t algo,
                                goto fail;
                        }
 
-                       ret = gnutls_rnd(GNUTLS_RND_RANDOM, params->raw_priv.data, size);
+                       ret = gnutls_rnd(rnd_level, params->raw_priv.data, size);
                        if (ret < 0) {
                                ret = gnutls_assert_val(GNUTLS_E_MEMORY_ERROR);
                                goto fail;
index 9c075e40543d5c328988716cabef24398561a460..c4a25bcd7cdc30899719bfb321edac96f06835c9 100644 (file)
--- a/lib/pk.h
+++ b/lib/pk.h
@@ -33,7 +33,7 @@ extern gnutls_crypto_pk_st _gnutls_pk_ops;
 #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_keys( algo, bits, params, temporal) _gnutls_pk_ops.generate_keys( algo, bits, params, temporal)
 #define _gnutls_pk_generate_params( algo, bits, priv) _gnutls_pk_ops.generate_params( algo, bits, priv)
 #define _gnutls_pk_hash_algorithm( pk, sig, params, hash) _gnutls_pk_ops.hash_algorithm(pk, sig, params, hash)
 #define _gnutls_pk_curve_exists( curve) _gnutls_pk_ops.curve_exists(curve)
index a2744ff155f95b8af7a1ae3135de10f2a0a5baf3..1c40615a5ad165a9f2985157640b35c736f688f0 100644 (file)
@@ -1565,7 +1565,7 @@ gnutls_x509_privkey_generate2(gnutls_x509_privkey_t key,
                return ret;
        }
 
-       ret = _gnutls_pk_generate_keys(algo, bits, &key->params);
+       ret = _gnutls_pk_generate_keys(algo, bits, &key->params, 0);
        if (ret < 0) {
                gnutls_assert();
                goto cleanup;