From 3f371828c6094fee6c88c7bc41e586b8c7cd8e04 Mon Sep 17 00:00:00 2001 From: Jeremiah Mackey Date: Mon, 4 May 2026 16:45:53 +0000 Subject: [PATCH] tests: cover private-key flag rejection on export --- tests/api/test_curve25519.c | 14 ++++++++++---- tests/api/test_curve448.c | 14 ++++++++++---- tests/api/test_ed25519.c | 21 +++++++++++++++++++++ tests/api/test_ed448.c | 21 +++++++++++++++++++++ 4 files changed, 62 insertions(+), 8 deletions(-) diff --git a/tests/api/test_curve25519.c b/tests/api/test_curve25519.c index 36cf643f2c..c46ea40194 100644 --- a/tests/api/test_curve25519.c +++ b/tests/api/test_curve25519.c @@ -444,14 +444,17 @@ int test_wc_curve25519_export_private_raw_ex(void) EXPECT_DECLS; #if defined(HAVE_CURVE25519) curve25519_key key; + WC_RNG rng; byte out[CURVE25519_KEYSIZE]; word32 outLen = sizeof(out); int endian = EC25519_BIG_ENDIAN; + XMEMSET(&rng, 0, sizeof(WC_RNG)); ExpectIntEQ(wc_curve25519_init(&key), 0); + /* Reject export when private key not set (privSet == 0). */ ExpectIntEQ(wc_curve25519_export_private_raw_ex(&key, out, &outLen, endian), - 0); + WC_NO_ERR_TRACE(ECC_BAD_ARG_E)); /* test bad cases */ ExpectIntEQ(wc_curve25519_export_private_raw_ex(NULL, NULL, NULL, endian), WC_NO_ERR_TRACE(BAD_FUNC_ARG)); @@ -461,12 +464,15 @@ int test_wc_curve25519_export_private_raw_ex(void) endian), WC_NO_ERR_TRACE(BAD_FUNC_ARG)); ExpectIntEQ(wc_curve25519_export_private_raw_ex(&key, out, NULL, endian), WC_NO_ERR_TRACE(BAD_FUNC_ARG)); - ExpectIntEQ(wc_curve25519_export_private_raw_ex(&key, out, &outLen, - EC25519_LITTLE_ENDIAN), 0); - outLen = outLen - 2; + + /* Populate the key, then exercise the buffer-too-small path. */ + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_curve25519_make_key(&rng, CURVE25519_KEYSIZE, &key), 0); + outLen = CURVE25519_KEYSIZE - 1; ExpectIntEQ(wc_curve25519_export_private_raw_ex(&key, out, &outLen, endian), WC_NO_ERR_TRACE(ECC_BAD_ARG_E)); + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_curve25519_free(&key); #endif return EXPECT_RESULT(); diff --git a/tests/api/test_curve448.c b/tests/api/test_curve448.c index 653af5eabc..384ede374f 100644 --- a/tests/api/test_curve448.c +++ b/tests/api/test_curve448.c @@ -164,13 +164,16 @@ int test_wc_curve448_export_private_raw_ex(void) EXPECT_DECLS; #if defined(HAVE_CURVE448) curve448_key key; + WC_RNG rng; byte out[CURVE448_KEY_SIZE]; word32 outLen = sizeof(out); int endian = EC448_BIG_ENDIAN; + XMEMSET(&rng, 0, sizeof(WC_RNG)); ExpectIntEQ(wc_curve448_init(&key), 0); + /* Reject export when private key not set (privSet == 0). */ ExpectIntEQ(wc_curve448_export_private_raw_ex(&key, out, &outLen, endian), - 0); + WC_NO_ERR_TRACE(ECC_BAD_ARG_E)); /* test bad cases */ ExpectIntEQ(wc_curve448_export_private_raw_ex(NULL, NULL, NULL, endian), WC_NO_ERR_TRACE(BAD_FUNC_ARG)); @@ -180,12 +183,15 @@ int test_wc_curve448_export_private_raw_ex(void) WC_NO_ERR_TRACE(BAD_FUNC_ARG)); ExpectIntEQ(wc_curve448_export_private_raw_ex(&key, out, NULL, endian), WC_NO_ERR_TRACE(BAD_FUNC_ARG)); - ExpectIntEQ(wc_curve448_export_private_raw_ex(&key, out, &outLen, - EC448_LITTLE_ENDIAN), 0); - outLen = outLen - 2; + + /* Populate the key, then exercise the buffer-too-small path. */ + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_curve448_make_key(&rng, CURVE448_KEY_SIZE, &key), 0); + outLen = CURVE448_KEY_SIZE - 1; ExpectIntEQ(wc_curve448_export_private_raw_ex(&key, out, &outLen, endian), WC_NO_ERR_TRACE(ECC_BAD_ARG_E)); + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_curve448_free(&key); #endif return EXPECT_RESULT(); diff --git a/tests/api/test_ed25519.c b/tests/api/test_ed25519.c index 34d39099d3..5eb9c13c4a 100644 --- a/tests/api/test_ed25519.c +++ b/tests/api/test_ed25519.c @@ -347,6 +347,13 @@ int test_wc_ed25519_export(void) XMEMSET(&rng, 0, sizeof(WC_RNG)); ExpectIntEQ(wc_ed25519_init(&key), 0); + /* Reject export when private key not set. */ + PRIVATE_KEY_UNLOCK(); + ExpectIntEQ(wc_ed25519_export_private_only(&key, priv, &privSz), + WC_NO_ERR_TRACE(BAD_FUNC_ARG)); + ExpectIntEQ(wc_ed25519_export_private(&key, priv, &privSz), + WC_NO_ERR_TRACE(BAD_FUNC_ARG)); + PRIVATE_KEY_LOCK(); ExpectIntEQ(wc_InitRng(&rng), 0); #ifdef HAVE_ED25519_MAKE_KEY ExpectIntEQ(wc_ed25519_make_key(&rng, ED25519_KEY_SIZE, &key), 0); @@ -379,6 +386,20 @@ int test_wc_ed25519_export(void) WC_NO_ERR_TRACE(BAD_FUNC_ARG)); PRIVATE_KEY_LOCK(); +#ifdef HAVE_ED25519_KEY_IMPORT + /* Public-only key: re-init and import just the public part; private + * exports must still fail with privKeySet == 0. */ + wc_ed25519_free(&key); + ExpectIntEQ(wc_ed25519_init(&key), 0); + ExpectIntEQ(wc_ed25519_import_public(pub, pubSz, &key), 0); + PRIVATE_KEY_UNLOCK(); + ExpectIntEQ(wc_ed25519_export_private_only(&key, priv, &privSz), + WC_NO_ERR_TRACE(BAD_FUNC_ARG)); + ExpectIntEQ(wc_ed25519_export_private(&key, priv, &privSz), + WC_NO_ERR_TRACE(BAD_FUNC_ARG)); + PRIVATE_KEY_LOCK(); +#endif + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_ed25519_free(&key); #endif diff --git a/tests/api/test_ed448.c b/tests/api/test_ed448.c index fd2b2393bc..0303e167cf 100644 --- a/tests/api/test_ed448.c +++ b/tests/api/test_ed448.c @@ -324,6 +324,13 @@ int test_wc_ed448_export(void) XMEMSET(&rng, 0, sizeof(WC_RNG)); ExpectIntEQ(wc_ed448_init(&key), 0); + /* Reject export when private key not set. */ + PRIVATE_KEY_UNLOCK(); + ExpectIntEQ(wc_ed448_export_private_only(&key, priv, &privSz), + WC_NO_ERR_TRACE(BAD_FUNC_ARG)); + ExpectIntEQ(wc_ed448_export_private(&key, priv, &privSz), + WC_NO_ERR_TRACE(BAD_FUNC_ARG)); + PRIVATE_KEY_LOCK(); ExpectIntEQ(wc_InitRng(&rng), 0); ExpectIntEQ(wc_ed448_make_key(&rng, ED448_KEY_SIZE, &key), 0); @@ -351,6 +358,20 @@ int test_wc_ed448_export(void) WC_NO_ERR_TRACE(BAD_FUNC_ARG)); PRIVATE_KEY_LOCK(); +#ifdef HAVE_ED448_KEY_IMPORT + /* Public-only key: re-init and import just the public part; private + * exports must still fail with privKeySet == 0. */ + wc_ed448_free(&key); + ExpectIntEQ(wc_ed448_init(&key), 0); + ExpectIntEQ(wc_ed448_import_public(pub, pubSz, &key), 0); + PRIVATE_KEY_UNLOCK(); + ExpectIntEQ(wc_ed448_export_private_only(&key, priv, &privSz), + WC_NO_ERR_TRACE(BAD_FUNC_ARG)); + ExpectIntEQ(wc_ed448_export_private(&key, priv, &privSz), + WC_NO_ERR_TRACE(BAD_FUNC_ARG)); + PRIVATE_KEY_LOCK(); +#endif + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_ed448_free(&key); #endif