diff --git a/src/wp_ecc_kmgmt.c b/src/wp_ecc_kmgmt.c index 3e19a77e..606b418f 100644 --- a/src/wp_ecc_kmgmt.c +++ b/src/wp_ecc_kmgmt.c @@ -528,7 +528,7 @@ static int wp_ecc_set_params_x_y(wp_Ecc *ecc, const OSSL_PARAM params[]) ecc->key.pubkey.y))) { ok = 0; } - if (ok && mp_iszero(ecc->key.pubkey.x)) { + if (ok && mp_iszero(ecc->key.pubkey.y)) { ok = 0; } if (ok) { @@ -591,10 +591,38 @@ static int wp_ecc_set_params(wp_Ecc *ecc, const OSSL_PARAM params[]) const OSSL_PARAM *p; if (params != NULL) { - if (!wp_ecc_set_params_x_y(ecc, params)) { - if (!wp_ecc_set_params_enc_pub_key(ecc, params, - OSSL_PKEY_PARAM_ENCODED_PUBLIC_KEY)) { - ok = 0; + if (!wp_ecc_set_params_enc_pub_key(ecc, params, + OSSL_PKEY_PARAM_ENCODED_PUBLIC_KEY)) { + ok = 0; + } + if (ok) { + p = OSSL_PARAM_locate_const(params, + OSSL_PKEY_PARAM_EC_PUB_X); + if (p != NULL) { + if (!wp_params_get_mp(params, OSSL_PKEY_PARAM_EC_PUB_X, + ecc->key.pubkey.x)) { + ok = 0; + } + if (ok && mp_iszero(ecc->key.pubkey.x)) { + ok = 0; + } + if (ok) { + ecc->key.type = ECC_PUBLICKEY; + ecc->hasPub = 1; + } + } + } + if (ok) { + p = OSSL_PARAM_locate_const(params, + OSSL_PKEY_PARAM_EC_PUB_Y); + if (p != NULL) { + if (!wp_params_get_mp(params, OSSL_PKEY_PARAM_EC_PUB_Y, + ecc->key.pubkey.y)) { + ok = 0; + } + if (ok && mp_iszero(ecc->key.pubkey.y)) { + ok = 0; + } } } if (ok) { diff --git a/src/wp_ecdsa_sig.c b/src/wp_ecdsa_sig.c index ddd10477..fa4fe297 100644 --- a/src/wp_ecdsa_sig.c +++ b/src/wp_ecdsa_sig.c @@ -187,7 +187,7 @@ static int wp_ecdsa_signverify_init(wp_EcdsaSigCtx *ctx, wp_Ecc* ecc, if (ctx->ecc != ecc) { wp_ecc_free(ctx->ecc); - if (!wp_ecc_up_ref(ecc)) { + if (ecc != NULL && !wp_ecc_up_ref(ecc)) { ok = 0; } }