Fix DSA public decode to allow extra buffer (in case private key is passed in). Fixes for clang-tidy "value stored never read". Allow showing line number and conditional with DEBUG_WOLFSSL_VERBOSE on TEST_RES_CHECK.

This commit is contained in:
David Garske
2022-11-29 10:22:01 -08:00
parent 7310eb102f
commit b2f9838af4
3 changed files with 171 additions and 136 deletions

View File

@ -410,9 +410,20 @@ typedef struct testVector {
* @return When condition is true: TEST_SUCCESS.
* @return When condition is false: TEST_FAIL.
*/
#ifdef DEBUG_WOLFSSL_VERBOSE
#define XSTRINGIFY(s) STRINGIFY(s)
#define STRINGIFY(s) #s
#define TEST_RES_CHECK(check) ({ \
int _ret = (check) ? TEST_SUCCESS : TEST_FAIL; \
if (_ret == TEST_FAIL) { \
fprintf(stderr, " check \"%s\" at %d ", \
XSTRINGIFY(check), __LINE__); \
} \
_ret; })
#else
#define TEST_RES_CHECK(check) \
((check) ? TEST_SUCCESS : TEST_FAIL)
#endif /* DEBUG_WOLFSSL_VERBOSE */
#define TEST_STRING "Everyone gets Friday off."
#define TEST_STRING_SZ 25
@ -17095,6 +17106,7 @@ static int test_wc_ChaCha20Poly1305_aead(void)
plaintext, sizeof(plaintext), generatedCiphertext, NULL);
if (ret == BAD_FUNC_ARG) {
ret = 0;
(void)ret; /* suppress never read */
}
ret = wc_ChaCha20Poly1305_Decrypt(key, iv, aad, sizeof(aad), cipher,
@ -20998,8 +21010,8 @@ static int test_wc_DsaPublicPrivateKeyDecode(void)
DsaKey key;
word32 bytes;
word32 idx = 0;
int priv = WOLFSSL_FATAL_ERROR;
int pub = WOLFSSL_FATAL_ERROR;
int priv = 0;
int pub = 0;
int ret = 0;
#ifdef USE_CERT_BUFFERS_1024
@ -21039,7 +21051,7 @@ static int test_wc_DsaPublicPrivateKeyDecode(void)
if (priv == BAD_FUNC_ARG) {
priv = wc_DsaPrivateKeyDecode(tmp, &idx, &key, bytes);
}
if (priv == ASN_PARSE_E) {
if (priv == ASN_PARSE_E || priv == BUFFER_E) {
priv = 0;
}
else {
@ -21054,6 +21066,7 @@ static int test_wc_DsaPublicPrivateKeyDecode(void)
if (ret == 0) {
idx = 0; /* Reset */
pub = wc_DsaPublicKeyDecode(tmp, &idx, &key, bytes);
/* Test bad args. */
if (pub == 0) {
pub = wc_DsaPublicKeyDecode(NULL, &idx, &key, bytes);
@ -21066,7 +21079,7 @@ static int test_wc_DsaPublicPrivateKeyDecode(void)
if (pub == BAD_FUNC_ARG) {
pub = wc_DsaPublicKeyDecode(tmp, &idx, &key, bytes);
}
if (pub == ASN_PARSE_E) {
if (pub == ASN_PARSE_E || pub == BUFFER_E) {
pub = 0;
}
else {
@ -21078,8 +21091,8 @@ static int test_wc_DsaPublicPrivateKeyDecode(void)
wc_FreeDsaKey(&key);
res = TEST_RES_CHECK(ret == 0);
#endif
res = TEST_RES_CHECK(ret == 0 && pub == 0 && priv == 0);
#endif /* !NO_DSA */
return res;
} /* END test_wc_DsaPublicPrivateKeyDecode */
@ -21325,12 +21338,12 @@ static int test_wc_DsaKeyToPublicDer(void)
ret = WOLFSSL_FATAL_ERROR;
}
XFREE(der,NULL,DYNAMIC_TYPE_TMP_BUFFER);
XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
wc_FreeDsaKey(&genKey);
res = TEST_RES_CHECK(ret == 0);
#endif /* !defined(NO_DSA) && defined(WOLFSSL_KEY_GEN) */
#endif /* HAVE_SELFTEST */
#endif /* !NO_DSA && WOLFSSL_KEY_GEN */
#endif /* !HAVE_SELFTEST */
return res;
} /* END test_wc_DsaKeyToPublicDer */
@ -24821,7 +24834,7 @@ static int test_wc_ecc_signVerify_hash(void)
wc_ecc_fp_free();
#endif
res = TEST_RES_CHECK(ret == 0);
res = TEST_RES_CHECK(ret == 0 && signH == 0 && verifyH == 0);
#endif
return res;
} /* END test_wc_ecc_sign_hash */
@ -44571,41 +44584,47 @@ static int test_wolfSSL_EVP_PKEY_assign(void)
(void)pkey;
#ifndef NO_RSA
type = EVP_PKEY_RSA;
AssertNotNull(pkey = wolfSSL_EVP_PKEY_new());
AssertNotNull(rsa = wolfSSL_RSA_new());
AssertIntEQ(wolfSSL_EVP_PKEY_assign(NULL,type,rsa), WOLFSSL_FAILURE);
AssertIntEQ(wolfSSL_EVP_PKEY_assign(pkey,type,NULL), WOLFSSL_FAILURE);
AssertIntEQ(wolfSSL_EVP_PKEY_assign(pkey,-1,rsa), WOLFSSL_FAILURE);
AssertIntEQ(wolfSSL_EVP_PKEY_assign(pkey,type,rsa), WOLFSSL_SUCCESS);
wolfSSL_EVP_PKEY_free(pkey);
res = TEST_RES_CHECK(1);
if (res == TEST_SKIPPED || res == TEST_SUCCESS) {
type = EVP_PKEY_RSA;
AssertNotNull(pkey = wolfSSL_EVP_PKEY_new());
AssertNotNull(rsa = wolfSSL_RSA_new());
AssertIntEQ(wolfSSL_EVP_PKEY_assign(NULL,type,rsa), WOLFSSL_FAILURE);
AssertIntEQ(wolfSSL_EVP_PKEY_assign(pkey,type,NULL), WOLFSSL_FAILURE);
AssertIntEQ(wolfSSL_EVP_PKEY_assign(pkey,-1,rsa), WOLFSSL_FAILURE);
AssertIntEQ(wolfSSL_EVP_PKEY_assign(pkey,type,rsa), WOLFSSL_SUCCESS);
wolfSSL_EVP_PKEY_free(pkey);
res = TEST_RES_CHECK(1);
}
#endif /* NO_RSA */
#ifndef NO_DSA
type = EVP_PKEY_DSA;
AssertNotNull(pkey = wolfSSL_EVP_PKEY_new());
AssertNotNull(dsa = wolfSSL_DSA_new());
AssertIntEQ(wolfSSL_EVP_PKEY_assign(NULL,type,dsa), WOLFSSL_FAILURE);
AssertIntEQ(wolfSSL_EVP_PKEY_assign(pkey,type,NULL), WOLFSSL_FAILURE);
AssertIntEQ(wolfSSL_EVP_PKEY_assign(pkey,-1,dsa), WOLFSSL_FAILURE);
AssertIntEQ(wolfSSL_EVP_PKEY_assign(pkey,type,dsa), WOLFSSL_SUCCESS);
wolfSSL_EVP_PKEY_free(pkey);
res = TEST_RES_CHECK(1);
if (res == TEST_SKIPPED || res == TEST_SUCCESS) {
type = EVP_PKEY_DSA;
AssertNotNull(pkey = wolfSSL_EVP_PKEY_new());
AssertNotNull(dsa = wolfSSL_DSA_new());
AssertIntEQ(wolfSSL_EVP_PKEY_assign(NULL,type,dsa), WOLFSSL_FAILURE);
AssertIntEQ(wolfSSL_EVP_PKEY_assign(pkey,type,NULL), WOLFSSL_FAILURE);
AssertIntEQ(wolfSSL_EVP_PKEY_assign(pkey,-1,dsa), WOLFSSL_FAILURE);
AssertIntEQ(wolfSSL_EVP_PKEY_assign(pkey,type,dsa), WOLFSSL_SUCCESS);
wolfSSL_EVP_PKEY_free(pkey);
res = TEST_RES_CHECK(1);
}
#endif /* NO_DSA */
#ifdef HAVE_ECC
type = EVP_PKEY_EC;
AssertNotNull(pkey = wolfSSL_EVP_PKEY_new());
AssertNotNull(ecKey = wolfSSL_EC_KEY_new());
AssertIntEQ(wolfSSL_EVP_PKEY_assign(NULL,type,ecKey), WOLFSSL_FAILURE);
AssertIntEQ(wolfSSL_EVP_PKEY_assign(pkey,type,NULL), WOLFSSL_FAILURE);
AssertIntEQ(wolfSSL_EVP_PKEY_assign(pkey,-1,ecKey), WOLFSSL_FAILURE);
AssertIntEQ(wolfSSL_EVP_PKEY_assign(pkey,type,ecKey), WOLFSSL_FAILURE);
AssertIntEQ(wolfSSL_EC_KEY_generate_key(ecKey), 1);
AssertIntEQ(wolfSSL_EVP_PKEY_assign(pkey,type,ecKey), WOLFSSL_SUCCESS);
wolfSSL_EVP_PKEY_free(pkey);
res = TEST_RES_CHECK(1);
if (res == TEST_SKIPPED || res == TEST_SUCCESS) {
type = EVP_PKEY_EC;
AssertNotNull(pkey = wolfSSL_EVP_PKEY_new());
AssertNotNull(ecKey = wolfSSL_EC_KEY_new());
AssertIntEQ(wolfSSL_EVP_PKEY_assign(NULL,type,ecKey), WOLFSSL_FAILURE);
AssertIntEQ(wolfSSL_EVP_PKEY_assign(pkey,type,NULL), WOLFSSL_FAILURE);
AssertIntEQ(wolfSSL_EVP_PKEY_assign(pkey,-1,ecKey), WOLFSSL_FAILURE);
AssertIntEQ(wolfSSL_EVP_PKEY_assign(pkey,type,ecKey), WOLFSSL_FAILURE);
AssertIntEQ(wolfSSL_EC_KEY_generate_key(ecKey), 1);
AssertIntEQ(wolfSSL_EVP_PKEY_assign(pkey,type,ecKey), WOLFSSL_SUCCESS);
wolfSSL_EVP_PKEY_free(pkey);
res = TEST_RES_CHECK(1);
}
#endif /* HAVE_ECC */
(void)type;
@ -45187,78 +45206,92 @@ static int test_wolfSSL_EVP_CIPHER_block_size(void)
int res = TEST_SKIPPED;
#ifdef HAVE_AES_CBC
#ifdef WOLFSSL_AES_128
AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_128_cbc()), AES_BLOCK_SIZE);
#endif
#ifdef WOLFSSL_AES_192
AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_192_cbc()), AES_BLOCK_SIZE);
#endif
#ifdef WOLFSSL_AES_256
AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_256_cbc()), AES_BLOCK_SIZE);
#endif
res = TEST_RES_CHECK(1);
if (res == TEST_SKIPPED || res == TEST_SUCCESS) {
#ifdef WOLFSSL_AES_128
AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_128_cbc()), AES_BLOCK_SIZE);
#endif
#ifdef WOLFSSL_AES_192
AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_192_cbc()), AES_BLOCK_SIZE);
#endif
#ifdef WOLFSSL_AES_256
AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_256_cbc()), AES_BLOCK_SIZE);
#endif
res = TEST_RES_CHECK(1);
}
#endif
#ifdef HAVE_AESGCM
#ifdef WOLFSSL_AES_128
AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_128_gcm()), 1);
#endif
#ifdef WOLFSSL_AES_192
AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_192_gcm()), 1);
#endif
#ifdef WOLFSSL_AES_256
AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_256_gcm()), 1);
#endif
res = TEST_RES_CHECK(1);
if (res == TEST_SKIPPED || res == TEST_SUCCESS) {
#ifdef WOLFSSL_AES_128
AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_128_gcm()), 1);
#endif
#ifdef WOLFSSL_AES_192
AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_192_gcm()), 1);
#endif
#ifdef WOLFSSL_AES_256
AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_256_gcm()), 1);
#endif
res = TEST_RES_CHECK(1);
}
#endif
#ifdef WOLFSSL_AES_COUNTER
#ifdef WOLFSSL_AES_128
AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_128_ctr()), 1);
#endif
#ifdef WOLFSSL_AES_192
AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_192_ctr()), 1);
#endif
#ifdef WOLFSSL_AES_256
AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_256_ctr()), 1);
#endif
res = TEST_RES_CHECK(1);
if (res == TEST_SKIPPED || res == TEST_SUCCESS) {
#ifdef WOLFSSL_AES_128
AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_128_ctr()), 1);
#endif
#ifdef WOLFSSL_AES_192
AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_192_ctr()), 1);
#endif
#ifdef WOLFSSL_AES_256
AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_256_ctr()), 1);
#endif
res = TEST_RES_CHECK(1);
}
#endif
#ifdef HAVE_AES_ECB
#ifdef WOLFSSL_AES_128
AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_128_ecb()), AES_BLOCK_SIZE);
#endif
#ifdef WOLFSSL_AES_192
AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_192_ecb()), AES_BLOCK_SIZE);
#endif
#ifdef WOLFSSL_AES_256
AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_256_ecb()), AES_BLOCK_SIZE);
#endif
res = TEST_RES_CHECK(1);
if (res == TEST_SKIPPED || res == TEST_SUCCESS) {
#ifdef WOLFSSL_AES_128
AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_128_ecb()), AES_BLOCK_SIZE);
#endif
#ifdef WOLFSSL_AES_192
AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_192_ecb()), AES_BLOCK_SIZE);
#endif
#ifdef WOLFSSL_AES_256
AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_256_ecb()), AES_BLOCK_SIZE);
#endif
res = TEST_RES_CHECK(1);
}
#endif
#ifdef WOLFSSL_AES_OFB
#ifdef WOLFSSL_AES_128
AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_128_ofb()), 1);
#endif
#ifdef WOLFSSL_AES_192
AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_192_ofb()), 1);
#endif
#ifdef WOLFSSL_AES_256
AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_256_ofb()), 1);
#endif
res = TEST_RES_CHECK(1);
if (res == TEST_SKIPPED || res == TEST_SUCCESS) {
#ifdef WOLFSSL_AES_128
AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_128_ofb()), 1);
#endif
#ifdef WOLFSSL_AES_192
AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_192_ofb()), 1);
#endif
#ifdef WOLFSSL_AES_256
AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_256_ofb()), 1);
#endif
res = TEST_RES_CHECK(1);
}
#endif
#ifndef NO_RC4
AssertIntEQ(EVP_CIPHER_block_size(wolfSSL_EVP_rc4()), 1);
res = TEST_RES_CHECK(1);
if (res == TEST_SKIPPED || res == TEST_SUCCESS) {
AssertIntEQ(EVP_CIPHER_block_size(wolfSSL_EVP_rc4()), 1);
res = TEST_RES_CHECK(1);
}
#endif
#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
AssertIntEQ(EVP_CIPHER_block_size(wolfSSL_EVP_chacha20_poly1305()), 1);
res = TEST_RES_CHECK(1);
if (res == TEST_SKIPPED || res == TEST_SUCCESS) {
AssertIntEQ(EVP_CIPHER_block_size(wolfSSL_EVP_chacha20_poly1305()), 1);
res = TEST_RES_CHECK(1);
}
#endif
return res;
@ -54951,52 +54984,56 @@ static int test_wolfSSL_d2i_DHparams(void)
/* Test 2048 bit parameters */
#ifdef HAVE_FFDHE_2048
f = XFOPEN(params1, "rb");
AssertTrue(f != XBADFILE);
len = (long)XFREAD(buf, 1, sizeof(buf), f);
XFCLOSE(f);
if (res == TEST_SKIPPED || res == TEST_SUCCESS) {
f = XFOPEN(params1, "rb");
AssertTrue(f != XBADFILE);
len = (long)XFREAD(buf, 1, sizeof(buf), f);
XFCLOSE(f);
/* Valid case */
AssertNotNull(dh = wolfSSL_d2i_DHparams(NULL, &pt, len));
AssertNotNull(dh->p);
AssertNotNull(dh->g);
AssertTrue(pt == buf);
AssertIntEQ(DH_set_length(NULL, BN_num_bits(dh->p)), 0);
AssertIntEQ(DH_set_length(dh, BN_num_bits(dh->p)), 1);
AssertIntEQ(DH_generate_key(dh), WOLFSSL_SUCCESS);
/* Valid case */
AssertNotNull(dh = wolfSSL_d2i_DHparams(NULL, &pt, len));
AssertNotNull(dh->p);
AssertNotNull(dh->g);
AssertTrue(pt == buf);
AssertIntEQ(DH_set_length(NULL, BN_num_bits(dh->p)), 0);
AssertIntEQ(DH_set_length(dh, BN_num_bits(dh->p)), 1);
AssertIntEQ(DH_generate_key(dh), WOLFSSL_SUCCESS);
/* Invalid cases */
AssertNull(wolfSSL_d2i_DHparams(NULL, NULL, len));
AssertNull(wolfSSL_d2i_DHparams(NULL, &pt, -1));
AssertNull(wolfSSL_d2i_DHparams(NULL, &pt, 10));
/* Invalid cases */
AssertNull(wolfSSL_d2i_DHparams(NULL, NULL, len));
AssertNull(wolfSSL_d2i_DHparams(NULL, &pt, -1));
AssertNull(wolfSSL_d2i_DHparams(NULL, &pt, 10));
DH_free(dh);
DH_free(dh);
*buf = 0;
pt = buf;
res = TEST_RES_CHECK(1);
*buf = 0;
pt = buf;
res = TEST_RES_CHECK(1);
}
#endif /* HAVE_FFDHE_2048 */
/* Test 3072 bit parameters */
#ifdef HAVE_FFDHE_3072
f = XFOPEN(params2, "rb");
AssertTrue(f != XBADFILE);
len = (long)XFREAD(buf, 1, sizeof(buf), f);
XFCLOSE(f);
if (res == TEST_SKIPPED || res == TEST_SUCCESS) {
f = XFOPEN(params2, "rb");
AssertTrue(f != XBADFILE);
len = (long)XFREAD(buf, 1, sizeof(buf), f);
XFCLOSE(f);
/* Valid case */
AssertNotNull(dh = wolfSSL_d2i_DHparams(&dh, &pt, len));
AssertNotNull(dh->p);
AssertNotNull(dh->g);
AssertTrue(pt != buf);
AssertIntEQ(DH_generate_key(dh), 1);
/* Valid case */
AssertNotNull(dh = wolfSSL_d2i_DHparams(&dh, &pt, len));
AssertNotNull(dh->p);
AssertNotNull(dh->g);
AssertTrue(pt != buf);
AssertIntEQ(DH_generate_key(dh), 1);
/* Invalid cases */
AssertNull(wolfSSL_d2i_DHparams(NULL, NULL, len));
AssertNull(wolfSSL_d2i_DHparams(NULL, &pt, -1));
/* Invalid cases */
AssertNull(wolfSSL_d2i_DHparams(NULL, NULL, len));
AssertNull(wolfSSL_d2i_DHparams(NULL, &pt, -1));
DH_free(dh);
res = TEST_RES_CHECK(1);
DH_free(dh);
res = TEST_RES_CHECK(1);
}
#endif /* HAVE_FFDHE_3072 */
#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
@ -55200,7 +55237,7 @@ static int test_openssl_generate_key_and_cert(void)
int res = TEST_SKIPPED;
#if defined(OPENSSL_EXTRA)
#if !defined(NO_RSA)
{
if (res == TEST_SKIPPED || res == TEST_SUCCESS) {
EVP_PKEY* pkey = EVP_PKEY_new();
int key_length = 2048;
BIGNUM* exponent = BN_new();
@ -55244,12 +55281,12 @@ static int test_openssl_generate_key_and_cert(void)
}
EVP_PKEY_free(pkey);
res = TEST_RES_CHECK(1);
}
res = TEST_RES_CHECK(1);
#endif /* !NO_RSA */
#ifdef HAVE_ECC
{
if (res == TEST_SKIPPED || res == TEST_SUCCESS) {
EVP_PKEY* pkey = EVP_PKEY_new();
EC_KEY* ec_key = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
@ -55269,8 +55306,8 @@ static int test_openssl_generate_key_and_cert(void)
#endif
EVP_PKEY_free(pkey);
res = TEST_RES_CHECK(1);
}
res = TEST_RES_CHECK(1);
#endif /* HAVE_ECC */
#endif /* OPENSSL_EXTRA */
return res;

View File

@ -10395,7 +10395,7 @@ int wc_DsaPublicKeyDecode(const byte* input, word32* inOutIdx, DsaKey* key,
for (i = 0; i < DSA_INTS - 1; i++)
GetASN_MP(&dataASN[(int)DSAKEYASN_IDX_VER + i], GetDsaInt(key, i));
/* Parse as simple form. */
ret = GetASN_Items(dsaKeyASN, dataASN, dsaPublicKeyASN_Length, 1, input,
ret = GetASN_Items(dsaKeyASN, dataASN, dsaPublicKeyASN_Length, 0, input,
inOutIdx, inSz);
if (ret != 0) {
/* Clear dynamic data items. */

View File

@ -558,8 +558,6 @@ int StackSizeHWMReset(void)
fprintf(stderr, "%ld\t%s\n", (long int)HWM, msg); \
StackSizeHWMReset(); \
})
\
#define STACK_SIZE_CHECKPOINT_WITH_MAX_CHECK(max, ...) ({ \
ssize_t HWM = StackSizeHWM_OffsetCorrected(); \