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 *);
#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)
}
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;
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;
.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,
}
#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
{
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;