[Group][Transport] Add Random first value group counter (#26610)
* Add Random first value group counter
* fix CI
diff --git a/src/transport/GroupPeerMessageCounter.cpp b/src/transport/GroupPeerMessageCounter.cpp
index 29212ee..b93dd9b 100644
--- a/src/transport/GroupPeerMessageCounter.cpp
+++ b/src/transport/GroupPeerMessageCounter.cpp
@@ -23,6 +23,8 @@
#include <lib/support/DefaultStorageKeyAllocator.h>
#include <transport/GroupPeerMessageCounter.h>
+#include <crypto/RandUtils.h>
+
namespace chip {
namespace Transport {
@@ -268,7 +270,6 @@
return CHIP_ERROR_INVALID_ARGUMENT;
}
- // TODO Implement Logic for first time use / factory reset to be random
// Spec 4.5.1.3
mStorage = storage_delegate;
uint16_t size = static_cast<uint16_t>(sizeof(uint32_t));
@@ -277,9 +278,8 @@
err = mStorage->SyncGetKeyValue(DefaultStorageKeyAllocator::GroupControlCounter().KeyName(), &temp, size);
if (err == CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND)
{
- // might be the first time we retrieve the value
- // TODO handle this case
- mGroupControlCounter = 0; // TODO should be random
+ // First time retrieving the counter
+ mGroupControlCounter = (chip::Crypto::GetRandU32() & kMessageCounterRandomInitMask) + 1;
}
else if (err != CHIP_NO_ERROR)
{
@@ -293,9 +293,8 @@
err = mStorage->SyncGetKeyValue(DefaultStorageKeyAllocator::GroupDataCounter().KeyName(), &temp, size);
if (err == CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND)
{
- // might be the first time we retrieve the value
- // TODO handle this case
- mGroupDataCounter = 0; // TODO should be random
+ // First time retrieving the counter
+ mGroupDataCounter = (chip::Crypto::GetRandU32() & kMessageCounterRandomInitMask) + 1;
}
else if (err != CHIP_NO_ERROR)
{
diff --git a/src/transport/GroupPeerMessageCounter.h b/src/transport/GroupPeerMessageCounter.h
index 6c2b278..25924ec 100644
--- a/src/transport/GroupPeerMessageCounter.h
+++ b/src/transport/GroupPeerMessageCounter.h
@@ -77,6 +77,8 @@
class GroupOutgoingCounters
{
public:
+ static constexpr uint32_t kMessageCounterRandomInitMask = 0x0FFFFFFF; ///< 28-bit mask
+
GroupOutgoingCounters(){};
GroupOutgoingCounters(chip::PersistentStorageDelegate * storage_delegate);
CHIP_ERROR Init(chip::PersistentStorageDelegate * storage_delegate);
diff --git a/src/transport/tests/TestGroupMessageCounter.cpp b/src/transport/tests/TestGroupMessageCounter.cpp
index 4a33d38..8e3101e 100644
--- a/src/transport/tests/TestGroupMessageCounter.cpp
+++ b/src/transport/tests/TestGroupMessageCounter.cpp
@@ -404,15 +404,18 @@
chip::TestPersistentStorageDelegate delegate;
TestGroupOutgoingCounters groupCientCounter;
+ uint32_t controlCounter = 0, dataCounter = 0;
CHIP_ERROR err = groupCientCounter.Init(&delegate);
NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR);
// Start Test with Control counter
- NL_TEST_ASSERT(inSuite, groupCientCounter.GetCounter(true) == 0);
+ // Counter should be random
+ controlCounter = groupCientCounter.GetCounter(true);
+ dataCounter = groupCientCounter.GetCounter(false);
groupCientCounter.IncrementCounter(true);
- NL_TEST_ASSERT(inSuite, groupCientCounter.GetCounter(true) == 1);
+ NL_TEST_ASSERT(inSuite, (groupCientCounter.GetCounter(true) - controlCounter) == 1);
groupCientCounter.SetCounter(true, UINT32_MAX - GROUP_MSG_COUNTER_MIN_INCREMENT);
NL_TEST_ASSERT(inSuite, groupCientCounter.GetCounter(true) == UINT32_MAX - GROUP_MSG_COUNTER_MIN_INCREMENT);
@@ -421,7 +424,7 @@
TestGroupOutgoingCounters groupCientCounter2(&delegate);
NL_TEST_ASSERT(inSuite, groupCientCounter2.GetCounter(true) == UINT32_MAX);
- NL_TEST_ASSERT(inSuite, groupCientCounter2.GetCounter(false) == GROUP_MSG_COUNTER_MIN_INCREMENT);
+ NL_TEST_ASSERT(inSuite, (groupCientCounter2.GetCounter(false) - dataCounter) == GROUP_MSG_COUNTER_MIN_INCREMENT);
// Test Roll over
groupCientCounter2.IncrementCounter(true);
@@ -433,9 +436,9 @@
// Redo the test with the second counter
// Start Test with Control counter
- NL_TEST_ASSERT(inSuite, groupCientCounter.GetCounter(false) == 0);
+ dataCounter = groupCientCounter.GetCounter(false);
groupCientCounter.IncrementCounter(false);
- NL_TEST_ASSERT(inSuite, groupCientCounter.GetCounter(false) == 1);
+ NL_TEST_ASSERT(inSuite, (groupCientCounter.GetCounter(false) - dataCounter) == 1);
groupCientCounter.SetCounter(false, UINT32_MAX - GROUP_MSG_COUNTER_MIN_INCREMENT);
NL_TEST_ASSERT(inSuite, groupCientCounter.GetCounter(false) == UINT32_MAX - GROUP_MSG_COUNTER_MIN_INCREMENT);