wolfcrypt/src/ecc.c: fix logic around WOLF_CRYPTO_CB_ONLY_ECC in wc_ecc_shared_secret(), _ecc_make_key_ex(), wc_ecc_sign_hash(), and wc_ecc_verify_hash() (defects reported by -Wreturn-type, -Wmaybe-uninitialized around err, and a failure of ecc_onlycb_test()).

This commit is contained in:
Daniel Pouzzner
2024-01-29 22:30:33 -06:00
parent 67bbe1e1bb
commit 3d3c07944e

View File

@@ -4570,20 +4570,15 @@ int wc_ecc_shared_secret(ecc_key* private_key, ecc_key* public_key, byte* out,
#endif #endif
{ {
err = wc_CryptoCb_Ecdh(private_key, public_key, out, outlen); err = wc_CryptoCb_Ecdh(private_key, public_key, out, outlen);
#ifndef WOLF_CRYPTO_CB_ONLY_ECC
if (err != CRYPTOCB_UNAVAILABLE) if (err != CRYPTOCB_UNAVAILABLE)
return err; return err;
/* fall-through when unavailable */ /* fall-through when unavailable */
#endif
#ifdef WOLF_CRYPTO_CB_ONLY_ECC
if (err == CRYPTOCB_UNAVAILABLE) {
err = NO_VALID_DEVID;
}
#endif
} }
#endif #endif
#ifndef WOLF_CRYPTO_CB_ONLY_ECC #ifdef WOLF_CRYPTO_CB_ONLY_ECC
return NO_VALID_DEVID;
#else /* !WOLF_CRYPTO_CB_ONLY_ECC */
/* type valid? */ /* type valid? */
if (private_key->type != ECC_PRIVATEKEY && if (private_key->type != ECC_PRIVATEKEY &&
private_key->type != ECC_PRIVATEKEY_ONLY) { private_key->type != ECC_PRIVATEKEY_ONLY) {
@@ -4632,7 +4627,7 @@ int wc_ecc_shared_secret(ecc_key* private_key, ecc_key* public_key, byte* out,
#else #else
err = wc_ecc_shared_secret_ex(private_key, &public_key->pubkey, out, outlen); err = wc_ecc_shared_secret_ex(private_key, &public_key->pubkey, out, outlen);
#endif /* WOLFSSL_ATECC508A */ #endif /* WOLFSSL_ATECC508A */
#endif /* WOLF_CRYPTO_CB_ONLY_ECC */ #endif /* !WOLF_CRYPTO_CB_ONLY_ECC */
return err; return err;
} }
@@ -5529,21 +5524,15 @@ static int _ecc_make_key_ex(WC_RNG* rng, int keysize, ecc_key* key,
#endif #endif
{ {
err = wc_CryptoCb_MakeEccKey(rng, keysize, key, curve_id); err = wc_CryptoCb_MakeEccKey(rng, keysize, key, curve_id);
#ifndef WOLF_CRYPTO_CB_ONLY_ECC
if (err != CRYPTOCB_UNAVAILABLE) if (err != CRYPTOCB_UNAVAILABLE)
return err; return err;
/* fall-through when unavailable */ /* fall-through when unavailable */
#endif
#ifdef WOLF_CRYPTO_CB_ONLY_ECC
if (err == CRYPTOCB_UNAVAILABLE) {
return NO_VALID_DEVID;
}
return err;
#endif
} }
#endif #endif
#ifndef WOLF_CRYPTO_CB_ONLY_ECC #ifdef WOLF_CRYPTO_CB_ONLY_ECC
return NO_VALID_DEVID;
#else /* !WOLF_CRYPTO_CB_ONLY_ECC */
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC) #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
if (key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC) { if (key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC) {
#ifdef HAVE_CAVIUM #ifdef HAVE_CAVIUM
@@ -5859,7 +5848,7 @@ static int _ecc_make_key_ex(WC_RNG* rng, int keysize, ecc_key* key,
#endif /* HAVE_ECC_MAKE_PUB */ #endif /* HAVE_ECC_MAKE_PUB */
return err; return err;
#endif /* WOLF_CRYPTO_CB_ONLY_ECC */ #endif /* !WOLF_CRYPTO_CB_ONLY_ECC */
} }
@@ -6563,20 +6552,20 @@ int wc_ecc_sign_hash(const byte* in, word32 inlen, byte* out, word32 *outlen,
#endif #endif
{ {
err = wc_CryptoCb_EccSign(in, inlen, out, outlen, rng, key); err = wc_CryptoCb_EccSign(in, inlen, out, outlen, rng, key);
#ifndef WOLF_CRYPTO_CB_ONLY_ECC
if (err != CRYPTOCB_UNAVAILABLE) if (err != CRYPTOCB_UNAVAILABLE)
return err; return err;
/* fall-through when unavailable */ /* fall-through when unavailable */
#endif
#ifdef WOLF_CRYPTO_CB_ONLY_ECC
if (err == CRYPTOCB_UNAVAILABLE) {
err = NO_VALID_DEVID;
}
#endif
} }
#endif #endif
#ifndef WOLF_CRYPTO_CB_ONLY_ECC #ifdef WOLF_CRYPTO_CB_ONLY_ECC
(void)rng;
(void)inlen;
(void)s;
(void)r;
(void)err;
return NO_VALID_DEVID;
#else /* !WOLF_CRYPTO_CB_ONLY_ECC */
if (rng == NULL) { if (rng == NULL) {
WOLFSSL_MSG("ECC sign RNG missing"); WOLFSSL_MSG("ECC sign RNG missing");
return ECC_BAD_ARG_E; return ECC_BAD_ARG_E;
@@ -6640,15 +6629,8 @@ int wc_ecc_sign_hash(const byte* in, word32 inlen, byte* out, word32 *outlen,
FREE_MP_INT_SIZE(s, key->heap, DYNAMIC_TYPE_ECC); FREE_MP_INT_SIZE(s, key->heap, DYNAMIC_TYPE_ECC);
FREE_MP_INT_SIZE(r, key->heap, DYNAMIC_TYPE_ECC); FREE_MP_INT_SIZE(r, key->heap, DYNAMIC_TYPE_ECC);
#endif /* WOLFSSL_ASYNC_CRYPT */ #endif /* WOLFSSL_ASYNC_CRYPT */
#else
(void)rng;
(void)inlen;
(void)s;
(void)r;
(void)err;
#endif /* WOLF_CRYPTO_CB_ONLY_ECC */
return err; return err;
#endif /* !WOLF_CRYPTO_CB_ONLY_ECC */
} }
#endif /* !NO_ASN */ #endif /* !NO_ASN */
@@ -8289,21 +8271,20 @@ int wc_ecc_verify_hash(const byte* sig, word32 siglen, const byte* hash,
#endif #endif
{ {
err = wc_CryptoCb_EccVerify(sig, siglen, hash, hashlen, res, key); err = wc_CryptoCb_EccVerify(sig, siglen, hash, hashlen, res, key);
#ifndef WOLF_CRYPTO_CB_ONLY_ECC
if (err != CRYPTOCB_UNAVAILABLE) if (err != CRYPTOCB_UNAVAILABLE)
return err; return err;
/* fall-through when unavailable */ /* fall-through when unavailable */
#endif
#ifdef WOLF_CRYPTO_CB_ONLY_ECC
if (err == CRYPTOCB_UNAVAILABLE) {
err = NO_VALID_DEVID;
}
#endif
} }
#endif #endif
#ifndef WOLF_CRYPTO_CB_ONLY_ECC #ifdef WOLF_CRYPTO_CB_ONLY_ECC
(void)siglen;
(void)hashlen;
(void)s;
(void)r;
(void)err;
return NO_VALID_DEVID;
#else /* !WOLF_CRYPTO_CB_ONLY_ECC */
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC) #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
err = wc_ecc_alloc_async(key); err = wc_ecc_alloc_async(key);
if (err != 0) if (err != 0)
@@ -8415,15 +8396,8 @@ int wc_ecc_verify_hash(const byte* sig, word32 siglen, const byte* hash,
/* make sure required variables are reset */ /* make sure required variables are reset */
wc_ecc_reset(key); wc_ecc_reset(key);
#else
(void)siglen;
(void)hashlen;
(void)s;
(void)r;
(void)err;
#endif /* WOLF_CRYPTO_CB_ONLY_ECC */
return err; return err;
#endif /* !WOLF_CRYPTO_CB_ONLY_ECC */
} }
#endif /* !NO_ASN */ #endif /* !NO_ASN */