From e32020baf60339d88b2064a1dd0604e85c2e26e5 Mon Sep 17 00:00:00 2001
From: chinglee-iot <61685396+chinglee-iot@users.noreply.github.com>
Date: Fri, 17 May 2024 16:47:13 +0800
Subject: [PATCH] Add more unit test for core_pkcs11_mbedtls.c (#196)
* Increase line coverage for core_pkcs11_mbedtls.c to 100%
* Update CI line coverage threshold to 100% and branch coverage threshold to 92%
* Fix compiler warning in unit test
---
.github/workflows/ci.yml | 7 +-
docs/doxygen/include/size_table.md | 4 +-
source/portable/mbedtls/core_pkcs11_mbedtls.c | 12 +-
.../core_pkcs11_mbedtls_utest.c | 290 +++++++++++++++---
test/wrapper_utest/core_pkcs11_utest.c | 6 +-
5 files changed, 265 insertions(+), 54 deletions(-)
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 4491b3c3..9c237078 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -85,7 +85,8 @@ jobs:
echo -e "::group::${{ env.bashInfo }} ${{ env.stepName }} ${{ env.bashEnd }}"
sudo apt-get install -y lcov
- CFLAGS="--coverage -Wall -Wextra -DNDEBUG"
+ # target_enable_gcov is added in each unit test already, --coverage option is not required
+ CFLAGS="-Wall -Wextra -DNDEBUG"
cmake -S test -B build/ \
-G "Unix Makefiles" \
-DCMAKE_BUILD_TYPE=Debug \
@@ -128,8 +129,8 @@ jobs:
if: steps.build-unit-tests.outcome == 'success'
with:
coverage-file: ./build/coverage.info
- line-coverage-min: 99
- branch-coverage-min: 90
+ line-coverage-min: 100
+ branch-coverage-min: 92
- name: Archive Test Results
if: steps.build-unit-tests.outcome == 'success'
diff --git a/docs/doxygen/include/size_table.md b/docs/doxygen/include/size_table.md
index af9eaf07..d999d2b6 100644
--- a/docs/doxygen/include/size_table.md
+++ b/docs/doxygen/include/size_table.md
@@ -20,11 +20,11 @@
core_pkcs11_mbedtls.c |
9.0K |
- 7.5K |
+ 7.4K |
Total estimates |
10.3K |
- 8.5K |
+ 8.4K |
diff --git a/source/portable/mbedtls/core_pkcs11_mbedtls.c b/source/portable/mbedtls/core_pkcs11_mbedtls.c
index 188ae88c..a006c7b2 100644
--- a/source/portable/mbedtls/core_pkcs11_mbedtls.c
+++ b/source/portable/mbedtls/core_pkcs11_mbedtls.c
@@ -762,15 +762,9 @@ static CK_RV prvRsaContextParse( const CK_ATTRIBUTE * pxAttribute,
lMbedTLSResult = mbedtls_mpi_read_binary( &pxRsaContext->DQ, pxAttribute->pValue, pxAttribute->ulValueLen );
break;
- case ( CKA_COEFFICIENT ):
- lMbedTLSResult = mbedtls_mpi_read_binary( &pxRsaContext->QP, pxAttribute->pValue, pxAttribute->ulValueLen );
- break;
-
default:
-
- /* This should never be reached, as the above types are what gets this function called.
- * Nevertheless this is an error case, and MISRA requires a default statement. */
- xResult = CKR_ATTRIBUTE_TYPE_INVALID;
+ /* This is the CKA_COEFFICIENT case. The type is checked in prvRsaKeyAttParse. */
+ lMbedTLSResult = mbedtls_mpi_read_binary( &pxRsaContext->QP, pxAttribute->pValue, pxAttribute->ulValueLen );
break;
}
@@ -3449,7 +3443,7 @@ CK_DECLARE_FUNCTION( CK_RV, C_FindObjectsInit )( CK_SESSION_HANDLE hSession,
xResult = CKR_ARGUMENTS_BAD;
}
- if( ( ulCount != 1UL ) && ( ulCount != 2UL ) )
+ if( ( ulCount < 1UL ) || ( ulCount > 2UL ) )
{
xResult = CKR_ARGUMENTS_BAD;
LogError( ( "Failed to initialize find object operation. Find objects "
diff --git a/test/pkcs11_mbedtls_utest/core_pkcs11_mbedtls_utest.c b/test/pkcs11_mbedtls_utest/core_pkcs11_mbedtls_utest.c
index 856c0595..17429191 100644
--- a/test/pkcs11_mbedtls_utest/core_pkcs11_mbedtls_utest.c
+++ b/test/pkcs11_mbedtls_utest/core_pkcs11_mbedtls_utest.c
@@ -197,6 +197,7 @@ static void * pvPkcs11CallocCb( size_t nitems,
size_t size,
int numCalls )
{
+ ( void ) numCalls;
usMallocFreeCalls++;
return ( void * ) calloc( nitems, size );
}
@@ -204,6 +205,8 @@ static void * pvPkcs11CallocCb( size_t nitems,
static void vPkcs11FreeCb( void * pvPtr,
int numCalls )
{
+ ( void ) numCalls;
+
if( pvPtr != NULL )
{
usMallocFreeCalls--;
@@ -1265,6 +1268,72 @@ void test_pkcs11_C_CreateObjectECPrivKey( void )
}
}
+/*!
+ * @brief C_CreateObject Creating an EC private key with label length greater than pkcs11configMAX_LABEL_LENGTH.
+ *
+ */
+void test_pkcs11_C_CreateObjectECPrivKeyLabelTooLong( void )
+{
+ CK_RV xResult = CKR_OK;
+ CK_SESSION_HANDLE xSession = 0;
+ CK_KEY_TYPE xPrivateKeyType = CKK_EC;
+ CK_OBJECT_CLASS xPrivateKeyClass = CKO_PRIVATE_KEY;
+ CK_BBOOL xTrue = CK_TRUE;
+ mbedtls_ecp_keypair xKeyContext = { 0 };
+ char * pucPrivLabel = pkcs11configLABEL_DEVICE_PRIVATE_KEY_FOR_TLS;
+ /* DER-encoding of an ANSI X9.62 Parameters value */
+ CK_BYTE * pxEcPrivParams = ( CK_BYTE * ) ( "\x06\x08" MBEDTLS_OID_EC_GRP_SECP256R1 );
+ CK_OBJECT_HANDLE xObject = 0;
+ const uint8_t pusEmptyPubKey[ 6 ] = { 0xa1, 0x04, 0x03, 0x02, 0x00, 0x00 };
+ uint8_t pusFakePrivateKey[ pkcs11_PRIVATE_EC_PRIME_256_DER_SIZE ] = { 0 };
+
+ ( void ) memcpy( &pusFakePrivateKey[ pkcs11_PRIVATE_EC_PRIME_256_DER_SIZE - sizeof( pusEmptyPubKey ) ], pusEmptyPubKey, sizeof( pusEmptyPubKey ) );
+
+
+ /* Private value D. */
+ CK_BYTE pxD[ EC_D_LENGTH ] = { 0 };
+
+ CK_ATTRIBUTE xPrivateKeyTemplate[] = EC_PRIV_KEY_INITIALIZER;
+
+ prvCommonInitStubs( &xSession );
+
+ if( TEST_PROTECT() )
+ {
+ mbedtls_pk_init_CMockIgnore();
+ mbedtls_calloc_Stub( pvPkcs11CallocCb );
+ PKCS11_PAL_FindObject_IgnoreAndReturn( 1 );
+ PKCS11_PAL_GetObjectValue_IgnoreAndReturn( CKR_OK );
+ mbedtls_pk_parse_key_IgnoreAndReturn( 0 );
+ PKCS11_PAL_GetObjectValueCleanup_CMockIgnore();
+ mbedtls_calloc_IgnoreAndReturn( &xKeyContext );
+ mbedtls_ecp_keypair_init_CMockIgnore();
+ mbedtls_ecp_group_init_CMockIgnore();
+ mbedtls_ecp_group_load_IgnoreAndReturn( 0 );
+ mbedtls_calloc_Stub( pvPkcs11CallocCb );
+ mbedtls_mpi_read_binary_IgnoreAndReturn( 0 );
+ mbedtls_pk_write_key_der_ExpectAnyArgsAndReturn( 6 );
+ mbedtls_pk_write_key_der_ReturnArrayThruPtr_buf( pusFakePrivateKey, sizeof( pusFakePrivateKey ) );
+ mbedtls_pk_free_CMockIgnore();
+ PKCS11_PAL_SaveObject_IgnoreAndReturn( 1 );
+ mock_osal_mutex_lock_IgnoreAndReturn( 0 );
+ mock_osal_mutex_unlock_IgnoreAndReturn( 0 );
+ mbedtls_free_Stub( vPkcs11FreeCb );
+
+ xPrivateKeyTemplate[ 2 ].ulValueLen = pkcs11configMAX_LABEL_LENGTH + 1;
+ xResult = C_CreateObject( xSession,
+ ( CK_ATTRIBUTE_PTR ) &xPrivateKeyTemplate,
+ sizeof( xPrivateKeyTemplate ) / sizeof( CK_ATTRIBUTE ),
+ &xObject );
+
+ TEST_ASSERT_EQUAL( CKR_ARGUMENTS_BAD, xResult );
+ }
+
+ if( TEST_PROTECT() )
+ {
+ prvCommonDeinitStubs( &xSession );
+ }
+}
+
/*!
* @brief C_CreateObject fail to malloc memory when loading EC curve.
*
@@ -1276,7 +1345,6 @@ void test_pkcs11_C_CreateObjectECCurveLoadFail( void )
CK_KEY_TYPE xPrivateKeyType = CKK_EC;
CK_OBJECT_CLASS xPrivateKeyClass = CKO_PRIVATE_KEY;
CK_BBOOL xTrue = CK_TRUE;
- mbedtls_ecp_keypair xKeyContext = { 0 };
char * pucPrivLabel = pkcs11configLABEL_DEVICE_PRIVATE_KEY_FOR_TLS;
/* DER-encoding of an ANSI X9.62 Parameters value */
CK_BYTE * pxEcPrivParams = ( CK_BYTE * ) ( "\x06\x08" MBEDTLS_OID_EC_GRP_SECP256R1 );
@@ -2150,11 +2218,6 @@ void test_pkcs11_C_CreateObjectCertificateIncomplete( void )
CK_SESSION_HANDLE xSession = 0;
CK_OBJECT_HANDLE xObject = 0;
CK_OBJECT_CLASS xCertificateClass = CKO_CERTIFICATE;
- CK_CERTIFICATE_TYPE xCertificateType = CKC_X_509;
- CK_BBOOL xTokenStorage = CK_TRUE;
- CK_BYTE xSubject[] = "TestSubject";
- CK_BYTE xCert[] = "Empty Cert";
- char * pucLabel = pkcs11configLABEL_DEVICE_CERTIFICATE_FOR_TLS;
CK_ATTRIBUTE xCertificateTemplate[] =
{
@@ -2483,7 +2546,6 @@ void test_pkcs11_C_CreateObjectSHA256HMACKeyMissingLabel( void )
CK_OBJECT_CLASS xKeyClass = CKO_SECRET_KEY;
CK_BBOOL xTrue = CK_TRUE;
CK_OBJECT_HANDLE xObject = CK_INVALID_HANDLE;
- CK_BYTE pcLabel[] = pkcs11configLABEL_HMAC_KEY;
CK_BYTE pxKeyValue[] = "abcdabcdabcdabcdabcdabcdabcdabcd";
@@ -2849,7 +2911,6 @@ void test_pkcs11_C_CreateObjectAESCMACKeyMissingLabel( void )
CK_OBJECT_CLASS xKeyClass = CKO_SECRET_KEY;
CK_BBOOL xTrue = CK_TRUE;
CK_OBJECT_HANDLE xObject = CK_INVALID_HANDLE;
- CK_BYTE pcLabel[] = pkcs11configLABEL_CMAC_KEY;
CK_BYTE pxKeyValue[] = "abcdabcdabcdabcdabcdabcdabcdabcd";
@@ -3065,6 +3126,35 @@ void test_pkcs11_C_CreateObjectAESCMACKeyInvalidKeyType( void )
}
}
+
+/*!
+ * @brief C_CreateObject NULL phObject
+ *
+ */
+void test_pkcs11_C_CreateObjectNullObject( void )
+{
+ CK_RV xResult = CKR_OK;
+ CK_SESSION_HANDLE xSession = 0;
+ CK_ATTRIBUTE xPrivateKeyTemplate[] = { 0 };
+
+ prvCommonInitStubs( &xSession );
+
+ if( TEST_PROTECT() )
+ {
+ xResult = C_CreateObject( xSession,
+ ( CK_ATTRIBUTE_PTR ) &xPrivateKeyTemplate,
+ sizeof( xPrivateKeyTemplate ) / sizeof( CK_ATTRIBUTE ),
+ NULL );
+
+ TEST_ASSERT_EQUAL( CKR_ARGUMENTS_BAD, xResult );
+ }
+
+ if( TEST_PROTECT() )
+ {
+ prvCommonDeinitStubs( &xSession );
+ }
+}
+
/* ====================== TESTING C_GetAttributeValue ============================ */
/*!
@@ -3281,14 +3371,7 @@ void test_pkcs11_C_GetAttributeValueMultipleAttParsing( void )
CK_SESSION_HANDLE xSession = 0;
CK_OBJECT_HANDLE xObject = 0;
CK_ULONG ulCount = 2;
- CK_ULONG ulLength = 1;
- CK_BYTE pulKnownBuf[] = pkcs11DER_ENCODED_OID_P256;
- CK_BYTE pulBuf[ sizeof( pulKnownBuf ) ] = { 0 };
CK_BYTE ulPoint[ pkcs11EC_POINT_LENGTH ] = { 0 };
- CK_BYTE ulKnownPoint = 0x04;
- CK_BBOOL xIsPrivate = CK_FALSE;
- CK_OBJECT_CLASS xPrivateKeyClass = { 0 };
- CK_OBJECT_CLASS xKnownPrivateKeyClass = CKO_PRIVATE_KEY;
CK_ATTRIBUTE xTemplates[ 2 ] = { 0 };
prvCommonInitStubs( &xSession );
@@ -3795,6 +3878,8 @@ void test_pkcs11_C_FindObjectsInitBadArgs( void )
xResult = C_FindObjectsInit( xSession, ( CK_ATTRIBUTE_PTR ) &xFindTemplate, -1 );
TEST_ASSERT_EQUAL( CKR_ARGUMENTS_BAD, xResult );
+ xResult = C_FindObjectsInit( xSession, ( CK_ATTRIBUTE_PTR ) &xFindTemplate, 0 );
+ TEST_ASSERT_EQUAL( CKR_ARGUMENTS_BAD, xResult );
mbedtls_calloc_Stub( NULL );
mbedtls_calloc_ExpectAnyArgsAndReturn( NULL );
@@ -3827,9 +3912,6 @@ void test_pkcs11_C_FindObjects( void )
CK_ULONG ulCount = 1;
CK_ULONG ulFoundCount = 0;
CK_OBJECT_HANDLE xObject = 0;
- CK_BYTE pucBuf[] = { 1, 1, 1, 1 };
- CK_BYTE_PTR * ppucBufPtr = ( CK_BYTE_PTR * ) &pucBuf;
- CK_ULONG ulObjectLength = sizeof( pucBuf );
char * pucLabel = pkcs11configLABEL_DEVICE_CERTIFICATE_FOR_TLS;
CK_ATTRIBUTE xFindTemplate = { CKA_LABEL, pucLabel, strlen( ( const char * ) pucLabel ) };
@@ -3915,9 +3997,6 @@ void test_pkcs11_C_FindObjectsBadArgs( void )
CK_ULONG ulFoundCount = 0;
CK_OBJECT_HANDLE xObject = 0;
char * pucLabel = pkcs11configLABEL_DEVICE_CERTIFICATE_FOR_TLS;
- CK_BYTE pucBuf[] = { 0, 0, 0, 0 };
- CK_BYTE ** ppucBufPtr = ( CK_BYTE ** ) &pucBuf;
- CK_ULONG ulObjectLength = sizeof( pucBuf );
CK_ATTRIBUTE xFindTemplate = { CKA_LABEL, pucLabel, strlen( ( const char * ) pucLabel ) };
@@ -3966,9 +4045,12 @@ void test_pkcs11_C_FindObjectsFinal( void )
CK_OBJECT_HANDLE xObject = 0;
char * pucLabel = pkcs11configLABEL_DEVICE_CERTIFICATE_FOR_TLS;
- PKCS11_CertificateTemplate_t xCertificateTemplate = { { CKA_LABEL,
- pucLabel,
- strlen( ( const char * ) pucLabel ) } };
+ CK_ATTRIBUTE xCertificateTemplate =
+ {
+ CKA_LABEL,
+ pucLabel,
+ strlen( ( const char * ) pucLabel )
+ };
prvCommonInitStubs( &xSession );
@@ -4636,14 +4718,12 @@ void test_pkcs11_C_SignSHA256HMAC( void )
CK_SESSION_HANDLE xSession = CK_INVALID_HANDLE;
CK_OBJECT_HANDLE xKey = CK_INVALID_HANDLE;
CK_MECHANISM xMechanism = { 0 };
- mbedtls_pk_context xSignAndVerifyKey;
CK_BYTE pxDummyData[ pkcs11SHA256_DIGEST_LENGTH ] = { 0xAA };
CK_ULONG ulDummyDataLen = sizeof( pxDummyData );
CK_BYTE pxDummySignature[ pkcs11SHA256_DIGEST_LENGTH ] = { 0xAA };
CK_ULONG ulDummySignatureLen = sizeof( pxDummySignature );
mbedtls_md_info_t xMdInfo = { 0 };
- xSignAndVerifyKey.pk_ctx = &xResult;
xMechanism.mechanism = CKM_SHA256_HMAC;
prvCommonInitStubs( &xSession );
@@ -4685,14 +4765,12 @@ void test_pkcs11_C_SignSHA256HMACUpdateFail( void )
CK_SESSION_HANDLE xSession = CK_INVALID_HANDLE;
CK_OBJECT_HANDLE xKey = CK_INVALID_HANDLE;
CK_MECHANISM xMechanism = { 0 };
- mbedtls_pk_context xSignAndVerifyKey;
CK_BYTE pxDummyData[ pkcs11SHA256_DIGEST_LENGTH ] = { 0xAA };
CK_ULONG ulDummyDataLen = sizeof( pxDummyData );
CK_BYTE pxDummySignature[ pkcs11SHA256_DIGEST_LENGTH ] = { 0xAA };
CK_ULONG ulDummySignatureLen = sizeof( pxDummySignature );
mbedtls_md_info_t xMdInfo = { 0 };
- xSignAndVerifyKey.pk_ctx = &xResult;
xMechanism.mechanism = CKM_SHA256_HMAC;
prvCommonInitStubs( &xSession );
@@ -4733,15 +4811,12 @@ void test_pkcs11_C_SignAESCMAC( void )
CK_SESSION_HANDLE xSession = CK_INVALID_HANDLE;
CK_OBJECT_HANDLE xKey = CK_INVALID_HANDLE;
CK_MECHANISM xMechanism = { 0 };
- mbedtls_pk_context xSignAndVerifyKey;
-
CK_BYTE pxDummyData[ pkcs11AES_CMAC_SIGNATURE_LENGTH ] = { 0xAA };
CK_ULONG ulDummyDataLen = sizeof( pxDummyData );
CK_BYTE pxDummySignature[ pkcs11AES_CMAC_SIGNATURE_LENGTH ] = { 0xAA };
CK_ULONG ulDummySignatureLen = sizeof( pxDummySignature );
mbedtls_cipher_info_t xCipherInfo = { 0 };
- xSignAndVerifyKey.pk_ctx = &xResult;
xMechanism.mechanism = CKM_AES_CMAC;
prvCommonInitStubs( &xSession );
@@ -4783,15 +4858,12 @@ void test_pkcs11_C_SignAESCMACUpdateFail( void )
CK_SESSION_HANDLE xSession = CK_INVALID_HANDLE;
CK_OBJECT_HANDLE xKey = CK_INVALID_HANDLE;
CK_MECHANISM xMechanism = { 0 };
- mbedtls_pk_context xSignAndVerifyKey;
-
CK_BYTE pxDummyData[ pkcs11AES_CMAC_SIGNATURE_LENGTH ] = { 0xAA };
CK_ULONG ulDummyDataLen = sizeof( pxDummyData );
CK_BYTE pxDummySignature[ pkcs11AES_CMAC_SIGNATURE_LENGTH ] = { 0xAA };
CK_ULONG ulDummySignatureLen = sizeof( pxDummySignature );
mbedtls_cipher_info_t xCipherInfo = { 0 };
- xSignAndVerifyKey.pk_ctx = &xResult;
xMechanism.mechanism = CKM_AES_CMAC;
prvCommonInitStubs( &xSession );
@@ -5138,7 +5210,6 @@ void test_pkcs11_C_VerifyInitSHA256HMACMDLockFail( void )
CK_SESSION_HANDLE xSession = 0;
CK_OBJECT_HANDLE xObject = 0;
CK_MECHANISM xMechanism = { 0 };
- CK_BBOOL xIsPrivate = CK_FALSE;
mbedtls_md_info_t xMdInfo = { 0 };
xMechanism.mechanism = CKM_SHA256_HMAC;
@@ -5331,7 +5402,6 @@ void test_pkcs11_C_VerifyInitAESCMACCipherLockFail( void )
CK_SESSION_HANDLE xSession = 0;
CK_OBJECT_HANDLE xObject = 0;
CK_MECHANISM xMechanism = { 0 };
- CK_BBOOL xIsPrivate = CK_FALSE;
mbedtls_cipher_info_t xCipherInfo = { 0 };
xMechanism.mechanism = CKM_AES_CMAC;
@@ -5658,6 +5728,60 @@ void test_pkcs11_C_VerifyRSA( void )
}
}
+/*!
+ * @brief C_Verify public key not exist in session context.
+ *
+ */
+void test_pkcs11_C_VerifyRSANoPublicKey( void )
+{
+ CK_RV xResult = CKR_OK;
+ CK_SESSION_HANDLE xSession = CK_INVALID_HANDLE;
+ CK_OBJECT_HANDLE xObject = CK_INVALID_HANDLE;
+ CK_MECHANISM xMechanism = { 0 };
+ CK_BYTE pxDummyData[ pkcs11SHA256_DIGEST_LENGTH ] = { 0xAA };
+ CK_ULONG ulDummyDataLen = sizeof( pxDummyData );
+ CK_BYTE pxDummySignature[ pkcs11RSA_2048_SIGNATURE_LENGTH ] = { 0xAA };
+ CK_ULONG ulDummySignatureLen = sizeof( pxDummySignature );
+ mbedtls_pk_context xMbedContext = { 0 };
+ mbedtls_pk_info_t xPkInfo = { 0 };
+
+ /* These just have to be not NULL so we can hit the proper path. */
+ xMbedContext.pk_ctx = NULL;
+ xMbedContext.pk_info = &xPkInfo;
+
+ xMechanism.mechanism = CKM_RSA_X_509;
+ CK_BBOOL xIsPrivate = CK_FALSE;
+
+ prvCommonInitStubs( &xSession );
+
+ if( TEST_PROTECT() )
+ {
+ xResult = prvCreateRSAPub( &xSession, &xObject );
+ TEST_ASSERT_EQUAL( CKR_OK, xResult );
+
+ PKCS11_PAL_GetObjectValue_ExpectAnyArgsAndReturn( CKR_OK );
+ PKCS11_PAL_GetObjectValue_ReturnThruPtr_pIsPrivate( &xIsPrivate );
+ mbedtls_pk_init_StopIgnore();
+ mbedtls_pk_init_ExpectAnyArgs();
+ mbedtls_pk_init_ReturnThruPtr_ctx( &xMbedContext );
+ mbedtls_pk_parse_public_key_IgnoreAndReturn( 0 );
+ PKCS11_PAL_GetObjectValueCleanup_CMockIgnore();
+ xPkType = MBEDTLS_PK_RSA;
+ xResult = C_VerifyInit( xSession, &xMechanism, xObject );
+ TEST_ASSERT_EQUAL( CKR_OK, xResult );
+
+ mbedtls_pk_verify_IgnoreAndReturn( 0 );
+ mbedtls_pk_free_CMockIgnore();
+ xResult = C_Verify( xSession, pxDummyData, ulDummyDataLen, pxDummySignature, ulDummySignatureLen );
+ TEST_ASSERT_EQUAL( CKR_SIGNATURE_INVALID, xResult );
+ }
+
+ if( TEST_PROTECT() )
+ {
+ prvCommonDeinitStubs( &xSession );
+ }
+}
+
/*!
* @brief C_Verify RSA happy path with CKM_RSA_PKCS.
*
@@ -5909,6 +6033,53 @@ void test_pkcs11_C_VerifySHA256HMAC( void )
}
}
+/*!
+ * @brief C_Verify SHA256-HMAC invalid signature length.
+ *
+ */
+void test_pkcs11_C_VerifySHA256HMACInvalidSigLen( void )
+{
+ CK_RV xResult = CKR_OK;
+ CK_SESSION_HANDLE xSession = CK_INVALID_HANDLE;
+ CK_OBJECT_HANDLE xObject = CK_INVALID_HANDLE;
+ CK_MECHANISM xMechanism = { 0 };
+ CK_BYTE pxDummyData[ pkcs11SHA256_DIGEST_LENGTH ] = { 0xAA };
+ CK_ULONG ulDummyDataLen = sizeof( pxDummyData );
+ CK_BYTE pxDummySignature[ pkcs11SHA256_DIGEST_LENGTH ] = { 0xAA };
+ CK_ULONG ulDummySignatureLen = sizeof( pxDummySignature );
+ CK_BBOOL xIsPrivate = CK_FALSE;
+ mbedtls_md_info_t xMdInfo = { 0 };
+
+ xMechanism.mechanism = CKM_SHA256_HMAC;
+
+ prvCommonInitStubs( &xSession );
+
+ if( TEST_PROTECT() )
+ {
+ xResult = prvCreateSHA256HMAC( &xSession, &xObject );
+ TEST_ASSERT_EQUAL( CKR_OK, xResult );
+
+ PKCS11_PAL_GetObjectValue_ExpectAnyArgsAndReturn( CKR_OK );
+ PKCS11_PAL_GetObjectValue_ReturnThruPtr_pIsPrivate( &xIsPrivate );
+ mbedtls_md_init_CMockIgnore();
+ mbedtls_md_info_from_type_ExpectAnyArgsAndReturn( &xMdInfo );
+ mbedtls_md_setup_ExpectAnyArgsAndReturn( 0 );
+ mbedtls_md_hmac_starts_ExpectAnyArgsAndReturn( 0 );
+ PKCS11_PAL_GetObjectValueCleanup_CMockIgnore();
+ xResult = C_VerifyInit( xSession, &xMechanism, xObject );
+ TEST_ASSERT_EQUAL( CKR_OK, xResult );
+
+ /* Add 1 to signature length. */
+ xResult = C_Verify( xSession, pxDummyData, ulDummyDataLen, pxDummySignature, ulDummySignatureLen + 1 );
+ TEST_ASSERT_EQUAL( CKR_SIGNATURE_LEN_RANGE, xResult );
+ }
+
+ if( TEST_PROTECT() )
+ {
+ prvCommonDeinitStubs( &xSession );
+ }
+}
+
/*!
* @brief C_Verify SHA256-HMAC mbedtls_md_update fail.
*
@@ -6107,6 +6278,52 @@ void test_pkcs11_C_VerifyAESCMAC( void )
}
}
+/*!
+ * @brief C_Verify AES-CMAC invalid signature length.
+ *
+ */
+void test_pkcs11_C_VerifyAESCMACInvalidSigLength( void )
+{
+ CK_RV xResult = CKR_OK;
+ CK_SESSION_HANDLE xSession = CK_INVALID_HANDLE;
+ CK_OBJECT_HANDLE xObject = CK_INVALID_HANDLE;
+ CK_MECHANISM xMechanism = { 0 };
+ CK_BYTE pxDummyData[ pkcs11AES_CMAC_SIGNATURE_LENGTH ] = { 0xAA };
+ CK_ULONG ulDummyDataLen = sizeof( pxDummyData );
+ CK_BYTE pxDummySignature[ pkcs11AES_CMAC_SIGNATURE_LENGTH ] = { 0xAA };
+ CK_ULONG ulDummySignatureLen = sizeof( pxDummySignature );
+ CK_BBOOL xIsPrivate = CK_FALSE;
+ mbedtls_cipher_info_t xCipherInfo = { 0 };
+
+ xMechanism.mechanism = CKM_AES_CMAC;
+
+ prvCommonInitStubs( &xSession );
+
+ if( TEST_PROTECT() )
+ {
+ xResult = prvCreateAESCMAC( &xSession, &xObject );
+ TEST_ASSERT_EQUAL( CKR_OK, xResult );
+
+ PKCS11_PAL_GetObjectValue_ExpectAnyArgsAndReturn( CKR_OK );
+ PKCS11_PAL_GetObjectValue_ReturnThruPtr_pIsPrivate( &xIsPrivate );
+ mbedtls_cipher_init_CMockIgnore();
+ mbedtls_cipher_info_from_type_ExpectAnyArgsAndReturn( &xCipherInfo );
+ mbedtls_cipher_setup_ExpectAnyArgsAndReturn( 0 );
+ mbedtls_cipher_cmac_starts_ExpectAnyArgsAndReturn( 0 );
+ PKCS11_PAL_GetObjectValueCleanup_CMockIgnore();
+ xResult = C_VerifyInit( xSession, &xMechanism, xObject );
+ TEST_ASSERT_EQUAL( CKR_OK, xResult );
+
+ xResult = C_Verify( xSession, pxDummyData, ulDummyDataLen, pxDummySignature, ulDummySignatureLen + 1 );
+ TEST_ASSERT_EQUAL( CKR_SIGNATURE_LEN_RANGE, xResult );
+ }
+
+ if( TEST_PROTECT() )
+ {
+ prvCommonDeinitStubs( &xSession );
+ }
+}
+
/*!
* @brief C_Verify AES-CMAC mbedtls_cipher_update fail.
*
@@ -6639,7 +6856,6 @@ void test_pkcs11_C_GenerateKeyPairRSAGen( void )
{
CKM_RSA_PKCS_KEY_PAIR_GEN, NULL_PTR, 0
};
- CK_BYTE xEcParams[] = pkcs11DER_ENCODED_OID_P256; /* prime256v1 */
CK_KEY_TYPE xKeyType = CKK_RSA;
CK_BBOOL xTrue = CK_TRUE;
diff --git a/test/wrapper_utest/core_pkcs11_utest.c b/test/wrapper_utest/core_pkcs11_utest.c
index a2cd04fc..6d3e4289 100644
--- a/test/wrapper_utest/core_pkcs11_utest.c
+++ b/test/wrapper_utest/core_pkcs11_utest.c
@@ -179,7 +179,7 @@ static CK_RV prvSetFunctionList( CK_FUNCTION_LIST_PTR_PTR ppxPtr )
/*!
* @brief Create a stub for the PKCS #11 function list.
*
- * Fails on the fourth call in order to create coverage for a nested branch.
+ * Fails on the third call in order to create coverage for a nested branch.
*
*/
static CK_RV prvSetFunctionList2( CK_FUNCTION_LIST_PTR_PTR ppxPtr )
@@ -205,7 +205,7 @@ static CK_RV prvSetFunctionList2( CK_FUNCTION_LIST_PTR_PTR ppxPtr )
/*!
* @brief Create a stub for the PKCS #11 function list.
*
- * Fails on the fourth call in order to create coverage for a nested branch.
+ * Fails on the third call in order to create coverage for a nested branch.
*
*/
static CK_RV prvSetFunctionList3( CK_FUNCTION_LIST_PTR_PTR ppxPtr )
@@ -217,7 +217,7 @@ static CK_RV prvSetFunctionList3( CK_FUNCTION_LIST_PTR_PTR ppxPtr )
if( ulCalls == 3 )
{
- xResult = CKR_OK;
+ /* Return CKR_OK but with NULL function list pointer here. */
*ppxPtr = NULL;
}
else