Skip to content

Commit

Permalink
[nrf fromtree] Fix and re-enable Zephyr native tests (#37333)
Browse files Browse the repository at this point in the history
* [nrfconnect] Workaround for Zephyr native link issue

Add temporary workaround for Zephyr native link issue.
This will be fixed with the next NCS release.

Signed-off-by: Adrian Gielniewski <[email protected]>

* [nrfconnect] Fix PSA configuration in tests

Signed-off-by: Adrian Gielniewski <[email protected]>

* Add missing PSA initialization in some tests

Signed-off-by: Adrian Gielniewski <[email protected]>

* Fix hmac key handle validation when PSA is used

Signed-off-by: Adrian Gielniewski <[email protected]>

* Fix heap memory check in TestChipCryptoPAL

Wipe all key slots during each test case SetUp to avoid reusing slot
previously used by other tests. This affects heap memory usage
calculation as when the slot is reused it frees the memory.

Signed-off-by: Adrian Gielniewski <[email protected]>

* Fix TestEventLoopHandler for Zephyr native

Expect correct sequence for different LayerImplSelect::Signal
implementations. When CHIP_SYSTEM_CONFIG_POSIX_LOCKING is not defined,
WakeEvent::Notify is called and loop has to spin one more time to
process the event.

Signed-off-by: Adrian Gielniewski <[email protected]>

---------

Signed-off-by: Adrian Gielniewski <[email protected]>
Signed-off-by: Adrian Gielniewski <[email protected]>
(cherry picked from commit 7786bb639fe8e8778e82668dfbac26698477015e)
  • Loading branch information
adigie committed Feb 11, 2025
1 parent ad6dcad commit 0625976
Show file tree
Hide file tree
Showing 7 changed files with 80 additions and 59 deletions.
89 changes: 46 additions & 43 deletions src/app/icd/server/tests/TestICDMonitoringTable.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@
#include <lib/support/DefaultStorageKeyAllocator.h>
#include <lib/support/TestPersistentStorageDelegate.h>

#if CHIP_CRYPTO_PSA
#include <crypto/CHIPCryptoPALPSA.h>
#endif

using namespace chip;
using namespace chip::app::Clusters::IcdManagement;

Expand Down Expand Up @@ -65,7 +69,30 @@ constexpr uint8_t kKeyBuffer3a[] = {
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f
};

TEST(TestICDMonitoringTable, TestEntryAssignationOverload)
struct TestICDMonitoringTable : public ::testing::Test
{
void SetUp() override
{
#if CHIP_CRYPTO_PSA
ASSERT_EQ(psa_crypto_init(), PSA_SUCCESS);
#endif
}

void ValidateHmac128(const Crypto::Hmac128KeyHandle & saved, const Crypto::Hmac128KeyHandle & loaded)
{
#if CHIP_CRYPTO_PSA
EXPECT_NE(saved.As<psa_key_id_t>(), loaded.As<psa_key_id_t>());
EXPECT_GE(loaded.As<psa_key_id_t>(), to_underlying(Crypto::KeyIdBase::ICDKeyRangeStart));
EXPECT_LE(loaded.As<psa_key_id_t>(), to_underlying(Crypto::KeyIdBase::Maximum));
#else
EXPECT_EQ(memcmp(saved.As<Crypto::Symmetric128BitsKeyByteArray>(), loaded.As<Crypto::Symmetric128BitsKeyByteArray>(),
sizeof(Crypto::Symmetric128BitsKeyByteArray)),
0);
#endif
}
};

TEST_F(TestICDMonitoringTable, TestEntryAssignationOverload)
{
TestSessionKeystoreImpl keystore;
ICDMonitoringEntry entry(&keystore);
Expand Down Expand Up @@ -100,7 +127,7 @@ TEST(TestICDMonitoringTable, TestEntryAssignationOverload)
EXPECT_TRUE(entry2.IsKeyEquivalent(ByteSpan(kKeyBuffer1a)));
}

TEST(TestICDMonitoringTable, TestEntryMaximumSize)
TEST_F(TestICDMonitoringTable, TestEntryMaximumSize)
{
TestPersistentStorageDelegate storage;
TestSessionKeystoreImpl keystore;
Expand All @@ -114,7 +141,7 @@ TEST(TestICDMonitoringTable, TestEntryMaximumSize)
EXPECT_EQ(CHIP_NO_ERROR, table.Set(0, entry));
}

TEST(TestICDMonitoringTable, TestEntryKeyFunctions)
TEST_F(TestICDMonitoringTable, TestEntryKeyFunctions)
{
TestSessionKeystoreImpl keystore;
ICDMonitoringEntry entry(&keystore);
Expand All @@ -140,7 +167,7 @@ TEST(TestICDMonitoringTable, TestEntryKeyFunctions)
EXPECT_EQ(entry.DeleteKey(), CHIP_NO_ERROR);
}

TEST(TestICDMonitoringTable, TestSaveAndLoadRegistrationValue)
TEST_F(TestICDMonitoringTable, TestSaveAndLoadRegistrationValue)
{
TestPersistentStorageDelegate storage;
TestSessionKeystoreImpl keystore;
Expand Down Expand Up @@ -178,9 +205,7 @@ TEST(TestICDMonitoringTable, TestSaveAndLoadRegistrationValue)
EXPECT_EQ(kClientNodeId12, entry.monitoredSubject);
EXPECT_EQ(ClientTypeEnum::kPermanent, entry.clientType);
EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer1a)));
EXPECT_EQ(memcmp(entry1.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(),
entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), sizeof(Crypto::Symmetric128BitsKeyByteArray)),
0);
ValidateHmac128(entry1.hmacKeyHandle, entry.hmacKeyHandle);

// Retrieve second entry
EXPECT_EQ(CHIP_NO_ERROR, loading.Get(1, entry));
Expand All @@ -189,9 +214,7 @@ TEST(TestICDMonitoringTable, TestSaveAndLoadRegistrationValue)
EXPECT_EQ(kClientNodeId11, entry.monitoredSubject);
EXPECT_EQ(ClientTypeEnum::kEphemeral, entry.clientType);
EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer2a)));
EXPECT_EQ(memcmp(entry2.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(),
entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), sizeof(Crypto::Symmetric128BitsKeyByteArray)),
0);
ValidateHmac128(entry2.hmacKeyHandle, entry.hmacKeyHandle);

// No more entries
EXPECT_EQ(CHIP_ERROR_NOT_FOUND, loading.Get(2, entry));
Expand All @@ -213,9 +236,7 @@ TEST(TestICDMonitoringTable, TestSaveAndLoadRegistrationValue)
EXPECT_EQ(kClientNodeId11, entry.monitoredSubject);
EXPECT_EQ(ClientTypeEnum::kEphemeral, entry.clientType);
EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer2a)));
EXPECT_EQ(memcmp(entry2.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(),
entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), sizeof(Crypto::Symmetric128BitsKeyByteArray)),
0);
ValidateHmac128(entry2.hmacKeyHandle, entry.hmacKeyHandle);

// Retrieve second entry
EXPECT_EQ(CHIP_NO_ERROR, loading.Get(1, entry));
Expand All @@ -224,12 +245,10 @@ TEST(TestICDMonitoringTable, TestSaveAndLoadRegistrationValue)
EXPECT_EQ(kClientNodeId11, entry.monitoredSubject);
EXPECT_EQ(ClientTypeEnum::kPermanent, entry.clientType);
EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer1b)));
EXPECT_EQ(memcmp(entry4.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(),
entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), sizeof(Crypto::Symmetric128BitsKeyByteArray)),
0);
ValidateHmac128(entry4.hmacKeyHandle, entry.hmacKeyHandle);
}

TEST(TestICDMonitoringTable, TestSaveAllInvalidRegistrationValues)
TEST_F(TestICDMonitoringTable, TestSaveAllInvalidRegistrationValues)
{
TestPersistentStorageDelegate storage;
TestSessionKeystoreImpl keystore;
Expand Down Expand Up @@ -271,7 +290,7 @@ TEST(TestICDMonitoringTable, TestSaveAllInvalidRegistrationValues)
EXPECT_EQ(CHIP_ERROR_INVALID_ARGUMENT, table.Set(0, entry5));
}

TEST(TestICDMonitoringTable, TestSaveLoadRegistrationValueForMultipleFabrics)
TEST_F(TestICDMonitoringTable, TestSaveLoadRegistrationValueForMultipleFabrics)
{
TestPersistentStorageDelegate storage;
TestSessionKeystoreImpl keystore;
Expand Down Expand Up @@ -314,32 +333,26 @@ TEST(TestICDMonitoringTable, TestSaveLoadRegistrationValueForMultipleFabrics)
EXPECT_EQ(kClientNodeId11, entry.checkInNodeID);
EXPECT_EQ(kClientNodeId12, entry.monitoredSubject);
EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer1a)));
EXPECT_EQ(memcmp(entry1.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(),
entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), sizeof(Crypto::Symmetric128BitsKeyByteArray)),
0);
ValidateHmac128(entry1.hmacKeyHandle, entry.hmacKeyHandle);

// Retrieve fabric1, second entry
EXPECT_EQ(CHIP_NO_ERROR, table1.Get(1, entry));
EXPECT_EQ(kTestFabricIndex1, entry.fabricIndex);
EXPECT_EQ(kClientNodeId12, entry.checkInNodeID);
EXPECT_EQ(kClientNodeId11, entry.monitoredSubject);
EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer1b)));
EXPECT_EQ(memcmp(entry2.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(),
entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), sizeof(Crypto::Symmetric128BitsKeyByteArray)),
0);
ValidateHmac128(entry2.hmacKeyHandle, entry.hmacKeyHandle);

// Retrieve fabric2, first entry
EXPECT_EQ(CHIP_NO_ERROR, table2.Get(0, entry));
EXPECT_EQ(kTestFabricIndex2, entry.fabricIndex);
EXPECT_EQ(kClientNodeId21, entry.checkInNodeID);
EXPECT_EQ(kClientNodeId22, entry.monitoredSubject);
EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer2a)));
EXPECT_EQ(memcmp(entry3.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(),
entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), sizeof(Crypto::Symmetric128BitsKeyByteArray)),
0);
ValidateHmac128(entry3.hmacKeyHandle, entry.hmacKeyHandle);
}

TEST(TestICDMonitoringTable, TestDeleteValidEntryFromStorage)
TEST_F(TestICDMonitoringTable, TestDeleteValidEntryFromStorage)
{
TestPersistentStorageDelegate storage;
TestSessionKeystoreImpl keystore;
Expand Down Expand Up @@ -379,19 +392,15 @@ TEST(TestICDMonitoringTable, TestDeleteValidEntryFromStorage)
EXPECT_EQ(kClientNodeId11, entry.checkInNodeID);
EXPECT_EQ(kClientNodeId12, entry.monitoredSubject);
EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer1a)));
EXPECT_EQ(memcmp(entry1.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(),
entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), sizeof(Crypto::Symmetric128BitsKeyByteArray)),
0);
ValidateHmac128(entry1.hmacKeyHandle, entry.hmacKeyHandle);

// Retrieve second entry (not modified)
EXPECT_EQ(CHIP_NO_ERROR, table1.Get(1, entry));
EXPECT_EQ(kTestFabricIndex1, entry.fabricIndex);
EXPECT_EQ(kClientNodeId12, entry.checkInNodeID);
EXPECT_EQ(kClientNodeId11, entry.monitoredSubject);
EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer2a)));
EXPECT_EQ(memcmp(entry2.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(),
entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), sizeof(Crypto::Symmetric128BitsKeyByteArray)),
0);
ValidateHmac128(entry2.hmacKeyHandle, entry.hmacKeyHandle);

// Remove (existing)
EXPECT_EQ(CHIP_NO_ERROR, table1.Remove(0));
Expand All @@ -405,19 +414,15 @@ TEST(TestICDMonitoringTable, TestDeleteValidEntryFromStorage)
EXPECT_EQ(kClientNodeId12, entry.checkInNodeID);
EXPECT_EQ(kClientNodeId11, entry.monitoredSubject);
EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer2a)));
EXPECT_EQ(memcmp(entry2.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(),
entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), sizeof(Crypto::Symmetric128BitsKeyByteArray)),
0);
ValidateHmac128(entry2.hmacKeyHandle, entry.hmacKeyHandle);

// Retrieve fabric2, first entry
EXPECT_EQ(CHIP_NO_ERROR, table2.Get(0, entry));
EXPECT_EQ(kTestFabricIndex2, entry.fabricIndex);
EXPECT_EQ(kClientNodeId21, entry.checkInNodeID);
EXPECT_EQ(kClientNodeId22, entry.monitoredSubject);
EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer1b)));
EXPECT_EQ(memcmp(entry3.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(),
entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), sizeof(Crypto::Symmetric128BitsKeyByteArray)),
0);
ValidateHmac128(entry3.hmacKeyHandle, entry.hmacKeyHandle);

// Remove all (fabric 1)
EXPECT_EQ(CHIP_NO_ERROR, table1.RemoveAll());
Expand All @@ -429,9 +434,7 @@ TEST(TestICDMonitoringTable, TestDeleteValidEntryFromStorage)
EXPECT_EQ(kClientNodeId21, entry.checkInNodeID);
EXPECT_EQ(kClientNodeId22, entry.monitoredSubject);
EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer1b)));
EXPECT_EQ(memcmp(entry3.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(),
entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), sizeof(Crypto::Symmetric128BitsKeyByteArray)),
0);
ValidateHmac128(entry3.hmacKeyHandle, entry.hmacKeyHandle);

// Remove all (fabric 2)
EXPECT_EQ(CHIP_NO_ERROR, table2.RemoveAll());
Expand Down
3 changes: 3 additions & 0 deletions src/credentials/tests/TestFabricTable.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,9 @@ struct TestFabricTable : public ::testing::Test
{
DeviceLayer::SetConfigurationMgr(&DeviceLayer::ConfigurationManagerImpl::GetDefaultInstance());
ASSERT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR);
#if CHIP_CRYPTO_PSA
ASSERT_EQ(psa_crypto_init(), PSA_SUCCESS);
#endif
}
static void TearDownTestSuite() { chip::Platform::MemoryShutdown(); }
};
Expand Down
13 changes: 10 additions & 3 deletions src/crypto/tests/TestChipCryptoPAL.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,10 @@

#if CHIP_CRYPTO_PSA
#include <psa/crypto.h>
extern "C" {
psa_status_t psa_initialize_key_slots(void);
void psa_wipe_all_key_slots(void);
}
#endif

using namespace chip;
Expand Down Expand Up @@ -287,14 +291,17 @@ static void TestAES_CTR_128_Decrypt(const AesCtrTestEntry * vector)

struct TestChipCryptoPAL : public ::testing::Test
{
static void SetUpTestSuite()
static void SetUpTestSuite() { ASSERT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR); }
static void TearDownTestSuite() { chip::Platform::MemoryShutdown(); }

void SetUp() override
{
ASSERT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR);
#if CHIP_CRYPTO_PSA
psa_crypto_init();
psa_wipe_all_key_slots();
psa_initialize_key_slots();
#endif
}
static void TearDownTestSuite() { chip::Platform::MemoryShutdown(); }
};

TEST_F(TestChipCryptoPAL, TestAES_CTR_128CryptTestVectors)
Expand Down
5 changes: 5 additions & 0 deletions src/system/tests/TestEventLoopHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,12 @@ TEST_F(TestEventLoopHandler, EventLoopHandlerSequence)
});

chip::DeviceLayer::PlatformMgr().RunEventLoop();

#if CHIP_SYSTEM_CONFIG_POSIX_LOCKING
EXPECT_EQ(loopHandler.trace, std::string("1AP2HP3R4"));
#else
EXPECT_EQ(loopHandler.trace, std::string("1APHP2HPHP3R4"));
#endif
}

TEST_F(TestEventLoopHandler, EventLoopHandlerWake)
Expand Down
3 changes: 3 additions & 0 deletions src/test_driver/nrfconnect/main/include/CHIPProjectConfig.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,4 +33,7 @@
// Enable unit-test only features
#define CONFIG_BUILD_FOR_HOST_UNIT_TEST 1

// Increase max. lambda event size
#define CHIP_CONFIG_LAMBDA_EVENT_SIZE 32

#endif // CHIP_PROJECT_CONFIG_H
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
*/

// Enable cryptographic functions needed by CHIP which can't be enabled via Kconfig
#define MBEDTLS_HKDF_C
#define MBEDTLS_X509_CREATE_C
#define MBEDTLS_X509_CSR_PARSE_C
#define MBEDTLS_X509_CSR_WRITE_C
25 changes: 13 additions & 12 deletions src/test_driver/nrfconnect/prj.conf
Original file line number Diff line number Diff line change
Expand Up @@ -43,23 +43,24 @@ CONFIG_MBEDTLS_HEAP_SIZE=65536
CONFIG_MBEDTLS_SSL_MAX_CONTENT_LEN=768
CONFIG_MBEDTLS_USER_CONFIG_ENABLE=y
CONFIG_MBEDTLS_USER_CONFIG_FILE="app_mbedtls_config.h"
CONFIG_MBEDTLS_ZEPHYR_ENTROPY=y
CONFIG_MBEDTLS_ENTROPY_ENABLED=y
CONFIG_MBEDTLS_CTR_DRBG_ENABLED=y
CONFIG_MBEDTLS_CIPHER_CCM_ENABLED=y
CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y
CONFIG_MBEDTLS_ENTROPY_POLL_ZEPHYR=y
CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED=y
CONFIG_MBEDTLS_ECDH_C=y
CONFIG_MBEDTLS_ECDSA_C=y
CONFIG_MBEDTLS_ECP_C=y
CONFIG_MBEDTLS_PK_WRITE_C=y
CONFIG_MBEDTLS_PKCS5_C=y
CONFIG_MBEDTLS_PSA_CRYPTO_C=y
CONFIG_MBEDTLS_MEMORY_DEBUG=y
CONFIG_MBEDTLS_DEBUG=y

# Enable entropy
CONFIG_ENTROPY_GENERATOR=y
# PSA Crypto configuration
CONFIG_PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY=y
CONFIG_PSA_WANT_ALG_HMAC=y
CONFIG_PSA_WANT_ALG_HKDF=y
CONFIG_PSA_WANT_ALG_ECDSA=y
CONFIG_PSA_WANT_ALG_ECDH=y
CONFIG_PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_GENERATE=y
CONFIG_PSA_WANT_KEY_TYPE_AES=y
CONFIG_PSA_WANT_ALG_CCM=y
CONFIG_PSA_WANT_ALG_ECB_NO_PADDING=y
CONFIG_PSA_WANT_ALG_SHA_1=y
CONFIG_PSA_WANT_ECC_SECP_R1_256=y

# Disable OpenThread
CONFIG_NET_L2_OPENTHREAD=n
Expand Down

0 comments on commit 0625976

Please sign in to comment.