]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
Allow verification of public and private parameters.
authorNikos Mavrogiannopoulos <nmav@redhat.com>
Tue, 28 Jan 2014 10:31:34 +0000 (11:31 +0100)
committerNikos Mavrogiannopoulos <nmav@redhat.com>
Tue, 28 Jan 2014 10:55:08 +0000 (11:55 +0100)
lib/crypto-backend.h
lib/gnutls_pk.h
lib/nettle/pk.c
lib/x509/privkey.c

index f7267c827ccd21f1396edf137d069b556ea05a1d..7f4e1b61c6dc642dd2a1655c921eed69953fa815 100644 (file)
@@ -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 *);
index 0658359f48706705c39d6d8ab411f7f0475df7d9..4434f6d5bf477e8d9865a40d31ce8ddb5d1bebb8 100644 (file)
@@ -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)
index ed0960f4c1f87cbebef8480c341b7794a3b1ac39..413b61a7eca23c02bbe74a1924dc4ad68bf4e43a 100644 (file)
@@ -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,
index c51fdc79314e7419768bc81684cbce0c11ac366e..7b228eb082700bfca65eeaa4da007320dcee471f 100644 (file)
@@ -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;