Skip to content

Commit 1057432

Browse files
rcasallas-silabspull[bot]
authored andcommitted
Silicon Labs: Attestation credentials now remain upon factory reset. (#27966)
1 parent 7a984be commit 1057432

7 files changed

+118
-62
lines changed

examples/platform/silabs/SilabsDeviceAttestationCreds.cpp

+87-45
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626

2727
using namespace chip::DeviceLayer::Internal;
2828

29+
using chip::DeviceLayer::Internal::SilabsConfig;
30+
2931
extern uint8_t linker_nvm_end[];
3032
static uint8_t * _credentials_address = (uint8_t *) linker_nvm_end;
3133

@@ -44,21 +46,8 @@ class DeviceAttestationCredsSilabs : public DeviceAttestationCredentialsProvider
4446
public:
4547
CHIP_ERROR GetCertificationDeclaration(MutableByteSpan & out_span) override
4648
{
47-
uint32_t offset = SILABS_CREDENTIALS_CD_OFFSET;
48-
uint32_t size = SILABS_CREDENTIALS_CD_SIZE;
49-
50-
if (SilabsConfig::ConfigValueExists(SilabsConfig::kConfigKey_Creds_CD_Offset) &&
51-
SilabsConfig::ConfigValueExists(SilabsConfig::kConfigKey_Creds_CD_Size))
52-
{
53-
ReturnErrorOnFailure(SilabsConfig::ReadConfigValue(SilabsConfig::kConfigKey_Creds_CD_Offset, offset));
54-
ReturnErrorOnFailure(SilabsConfig::ReadConfigValue(SilabsConfig::kConfigKey_Creds_CD_Size, size));
55-
}
56-
57-
uint8_t * address = _credentials_address + offset;
58-
ByteSpan cd_span(address, size);
59-
ChipLogProgress(DeviceLayer, "GetCertificationDeclaration, addr:%p, size:%lu", address, size);
60-
ChipLogByteSpan(DeviceLayer, ByteSpan(cd_span.data(), kDebugLength > cd_span.size() ? cd_span.size() : kDebugLength));
61-
return CopySpanToMutableSpan(cd_span, out_span);
49+
return GetFile("GetCertificationDeclaration", SilabsConfig::kConfigKey_Creds_CD_Offset, SILABS_CREDENTIALS_CD_OFFSET,
50+
SilabsConfig::kConfigKey_Creds_CD_Size, SILABS_CREDENTIALS_CD_SIZE, out_span);
6251
}
6352

6453
CHIP_ERROR GetFirmwareInformation(MutableByteSpan & out_firmware_info_buffer) override
@@ -70,40 +59,15 @@ class DeviceAttestationCredsSilabs : public DeviceAttestationCredentialsProvider
7059

7160
CHIP_ERROR GetDeviceAttestationCert(MutableByteSpan & out_span) override
7261
{
73-
uint32_t offset = SILABS_CREDENTIALS_DAC_OFFSET;
74-
uint32_t size = SILABS_CREDENTIALS_DAC_SIZE;
75-
76-
if (SilabsConfig::ConfigValueExists(SilabsConfig::kConfigKey_Creds_DAC_Offset) &&
77-
SilabsConfig::ConfigValueExists(SilabsConfig::kConfigKey_Creds_DAC_Size))
78-
{
79-
ReturnErrorOnFailure(SilabsConfig::ReadConfigValue(SilabsConfig::kConfigKey_Creds_DAC_Offset, offset));
80-
ReturnErrorOnFailure(SilabsConfig::ReadConfigValue(SilabsConfig::kConfigKey_Creds_DAC_Size, size));
81-
}
82-
83-
uint8_t * address = _credentials_address + offset;
84-
ByteSpan cert_span(address, size);
85-
ChipLogProgress(DeviceLayer, "GetDeviceAttestationCert, addr:%p, size:%lu", address, size);
86-
ChipLogByteSpan(DeviceLayer, ByteSpan(cert_span.data(), kDebugLength > cert_span.size() ? cert_span.size() : kDebugLength));
87-
return CopySpanToMutableSpan(cert_span, out_span);
62+
return GetFile("GetDeviceAttestationCert", SilabsConfig::kConfigKey_Creds_DAC_Offset, SILABS_CREDENTIALS_DAC_OFFSET,
63+
SilabsConfig::kConfigKey_Creds_DAC_Size, SILABS_CREDENTIALS_DAC_SIZE, out_span);
8864
}
8965

9066
CHIP_ERROR GetProductAttestationIntermediateCert(MutableByteSpan & out_span) override
9167
{
92-
uint32_t offset = SILABS_CREDENTIALS_PAI_OFFSET;
93-
uint32_t size = SILABS_CREDENTIALS_PAI_SIZE;
94-
95-
if (SilabsConfig::ConfigValueExists(SilabsConfig::kConfigKey_Creds_PAI_Offset) &&
96-
SilabsConfig::ConfigValueExists(SilabsConfig::kConfigKey_Creds_PAI_Size))
97-
{
98-
ReturnErrorOnFailure(SilabsConfig::ReadConfigValue(SilabsConfig::kConfigKey_Creds_PAI_Offset, offset));
99-
ReturnErrorOnFailure(SilabsConfig::ReadConfigValue(SilabsConfig::kConfigKey_Creds_PAI_Size, size));
100-
}
101-
102-
uint8_t * address = _credentials_address + offset;
103-
ByteSpan cert_span(address, size);
104-
ChipLogProgress(DeviceLayer, "GetProductAttestationIntermediateCert, addr:%p, size:%lu", address, size);
105-
ChipLogByteSpan(DeviceLayer, ByteSpan(cert_span.data(), kDebugLength > cert_span.size() ? cert_span.size() : kDebugLength));
106-
return CopySpanToMutableSpan(cert_span, out_span);
68+
return GetFile("GetProductAttestationIntermediateCert", SilabsConfig::kConfigKey_Creds_PAI_Offset,
69+
SILABS_CREDENTIALS_PAI_OFFSET, SilabsConfig::kConfigKey_Creds_PAI_Size, SILABS_CREDENTIALS_PAI_SIZE,
70+
out_span);
10771
}
10872

10973
CHIP_ERROR SignWithDeviceAttestationKey(const ByteSpan & message_to_sign, MutableByteSpan & out_span) override
@@ -126,6 +90,45 @@ class DeviceAttestationCredsSilabs : public DeviceAttestationCredentialsProvider
12690

12791
return CopySpanToMutableSpan(ByteSpan(signature, signature_size), out_span);
12892
}
93+
94+
private:
95+
CHIP_ERROR GetFile(const char * description, uint32_t offset_key, uint32_t offset_default, uint32_t size_key,
96+
uint32_t size_default, MutableByteSpan & out_span)
97+
{
98+
uint8_t * address = nullptr;
99+
uint32_t offset = offset_default;
100+
if (SilabsConfig::ConfigValueExists(offset_key))
101+
{
102+
// NVM-provided offset
103+
ReturnErrorOnFailure(SilabsConfig::ReadConfigValue(offset_key, offset));
104+
}
105+
106+
if (SilabsConfig::ConfigValueExists(SilabsConfig::kConfigKey_Creds_Base_Addr))
107+
{
108+
// NVM-provided location
109+
uint32_t base_addr = 0;
110+
ReturnErrorOnFailure(SilabsConfig::ReadConfigValue(SilabsConfig::kConfigKey_Creds_Base_Addr, base_addr));
111+
address = (uint8_t *) (base_addr + offset);
112+
}
113+
else
114+
{
115+
// Default location
116+
address = _credentials_address + offset;
117+
}
118+
119+
// Size
120+
uint32_t size = size_default;
121+
if (SilabsConfig::ConfigValueExists(size_key))
122+
{
123+
// NVM-provided size
124+
ReturnErrorOnFailure(SilabsConfig::ReadConfigValue(size_key, size));
125+
}
126+
127+
ByteSpan span(address, size);
128+
ChipLogProgress(DeviceLayer, "%s, addr:%p, size:%lu", description, address, size);
129+
ChipLogByteSpan(DeviceLayer, ByteSpan(span.data(), kDebugLength > span.size() ? span.size() : kDebugLength));
130+
return CopySpanToMutableSpan(span, out_span);
131+
}
129132
};
130133

131134
} // namespace
@@ -138,4 +141,43 @@ DeviceAttestationCredentialsProvider * GetSilabsDacProvider()
138141

139142
} // namespace Silabs
140143
} // namespace Credentials
144+
145+
namespace DeviceLayer {
146+
namespace Silabs {
147+
namespace {
148+
149+
void MigrateUint32(uint32_t old_key, uint32_t new_key)
150+
{
151+
uint32_t value = 0;
152+
if (SilabsConfig::ConfigValueExists(old_key) && (CHIP_NO_ERROR == SilabsConfig::ReadConfigValue(old_key, value)))
153+
{
154+
SilabsConfig::WriteConfigValue(new_key, value);
155+
}
156+
}
157+
158+
} // namespace
159+
160+
void MigrateDacProvider(void)
161+
{
162+
constexpr uint32_t kOldKey_Creds_KeyId = SilabsConfigKey(SilabsConfig::kMatterConfig_KeyBase, 0x21);
163+
constexpr uint32_t kOldKey_Creds_Base_Addr = SilabsConfigKey(SilabsConfig::kMatterConfig_KeyBase, 0x22);
164+
constexpr uint32_t kOldKey_Creds_DAC_Offset = SilabsConfigKey(SilabsConfig::kMatterConfig_KeyBase, 0x23);
165+
constexpr uint32_t kOldKey_Creds_DAC_Size = SilabsConfigKey(SilabsConfig::kMatterConfig_KeyBase, 0x24);
166+
constexpr uint32_t kOldKey_Creds_PAI_Offset = SilabsConfigKey(SilabsConfig::kMatterConfig_KeyBase, 0x25);
167+
constexpr uint32_t kOldKey_Creds_PAI_Size = SilabsConfigKey(SilabsConfig::kMatterConfig_KeyBase, 0x26);
168+
constexpr uint32_t kOldKey_Creds_CD_Offset = SilabsConfigKey(SilabsConfig::kMatterConfig_KeyBase, 0x27);
169+
constexpr uint32_t kOldKey_Creds_CD_Size = SilabsConfigKey(SilabsConfig::kMatterConfig_KeyBase, 0x28);
170+
171+
MigrateUint32(kOldKey_Creds_KeyId, SilabsConfig::kConfigKey_Creds_KeyId);
172+
MigrateUint32(kOldKey_Creds_Base_Addr, SilabsConfig::kConfigKey_Creds_Base_Addr);
173+
MigrateUint32(kOldKey_Creds_DAC_Offset, SilabsConfig::kConfigKey_Creds_DAC_Offset);
174+
MigrateUint32(kOldKey_Creds_DAC_Size, SilabsConfig::kConfigKey_Creds_DAC_Size);
175+
MigrateUint32(kOldKey_Creds_PAI_Offset, SilabsConfig::kConfigKey_Creds_PAI_Offset);
176+
MigrateUint32(kOldKey_Creds_PAI_Size, SilabsConfig::kConfigKey_Creds_PAI_Size);
177+
MigrateUint32(kOldKey_Creds_CD_Offset, SilabsConfig::kConfigKey_Creds_CD_Offset);
178+
MigrateUint32(kOldKey_Creds_CD_Size, SilabsConfig::kConfigKey_Creds_CD_Size);
179+
}
180+
181+
} // namespace Silabs
182+
} // namespace DeviceLayer
141183
} // namespace chip

examples/platform/silabs/SilabsDeviceAttestationCreds.h

+2
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ namespace Silabs {
3434
*/
3535
DeviceAttestationCredentialsProvider * GetSilabsDacProvider();
3636

37+
void SilabsDacProviderMigration(void);
38+
3739
} // namespace Silabs
3840
} // namespace Credentials
3941
} // namespace chip

src/platform/silabs/KeyValueStoreManagerImpl.cpp

+9
Original file line numberDiff line numberDiff line change
@@ -300,5 +300,14 @@ void KeyValueStoreManagerImpl::KvsMapMigration(void)
300300
}
301301

302302
} // namespace PersistedStorage
303+
304+
namespace Silabs {
305+
306+
void MigrateKvsMap(void)
307+
{
308+
PersistedStorage::KeyValueStoreMgrImpl().KvsMapMigration();
309+
}
310+
311+
} // namespace Silabs
303312
} // namespace DeviceLayer
304313
} // namespace chip

src/platform/silabs/KeyValueStoreManagerImpl.h

-4
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,6 @@ namespace PersistedStorage {
3333

3434
class KeyValueStoreManagerImpl final : public KeyValueStoreManager
3535
{
36-
// Allow the KeyValueStoreManager interface class to delegate method calls to
37-
// the implementation methods provided by this class.
38-
friend class KeyValueStoreManager;
39-
4036
public:
4137
CHIP_ERROR Init(void);
4238
CHIP_ERROR _Put(const char * key, const void * value, size_t value_size);

src/platform/silabs/MigrationManager.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
#include "MigrationManager.h"
1919
#include <platform/CHIPDeviceLayer.h>
20-
#include <platform/KeyValueStoreManager.h>
2120
#include <platform/silabs/SilabsConfig.h>
2221
#include <stdio.h>
2322

@@ -38,7 +37,10 @@ typedef struct
3837

3938
#define COUNT_OF(A) (sizeof(A) / sizeof((A)[0]))
4039
static migrationData_t migrationTable[] = {
41-
{ .migrationGroup = 1, .migrationFunc = &KeyValueStoreMgrImpl().KvsMapMigration },
40+
{ .migrationGroup = 1, .migrationFunc = MigrateKvsMap },
41+
#ifdef SILABS_ATTESTATION_CREDENTIALS
42+
{ .migrationGroup = 2, .migrationFunc = MigrateDacProvider },
43+
#endif
4244
// add any additional migration neccesary. migrationGroup should stay equal if done in the same commit or increment by 1 for
4345
// each new entry.
4446
};

src/platform/silabs/MigrationManager.h

+7-2
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@ namespace Silabs {
2424

2525
class MigrationManager
2626
{
27-
friend class KeyValueStoreManagerImpl;
28-
2927
public:
3028
/**
3129
* The Silabs migration manager is implemented as a singleton
@@ -39,6 +37,13 @@ class MigrationManager
3937
~MigrationManager(){};
4038
};
4139

40+
/**
41+
* Migration functions. These definitions allow the MigrationManager
42+
* to be agnostic of the specifics of each individual migration.
43+
*/
44+
void MigrateKvsMap(void);
45+
void MigrateDacProvider(void);
46+
4247
} // namespace Silabs
4348
} // namespace DeviceLayer
4449
} // namespace chip

src/platform/silabs/SilabsConfig.h

+9-9
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,14 @@ class SilabsConfig
112112
static constexpr Key kConfigKey_ProductURL = SilabsConfigKey(kMatterFactory_KeyBase, 0x11);
113113
static constexpr Key kConfigKey_PartNumber = SilabsConfigKey(kMatterFactory_KeyBase, 0x12);
114114
static constexpr Key kConfigKey_UniqueId = SilabsConfigKey(kMatterFactory_KeyBase, 0x1F);
115+
static constexpr Key kConfigKey_Creds_KeyId = SilabsConfigKey(kMatterFactory_KeyBase, 0x20);
116+
static constexpr Key kConfigKey_Creds_Base_Addr = SilabsConfigKey(kMatterFactory_KeyBase, 0x21);
117+
static constexpr Key kConfigKey_Creds_DAC_Offset = SilabsConfigKey(kMatterFactory_KeyBase, 0x22);
118+
static constexpr Key kConfigKey_Creds_DAC_Size = SilabsConfigKey(kMatterFactory_KeyBase, 0x23);
119+
static constexpr Key kConfigKey_Creds_PAI_Offset = SilabsConfigKey(kMatterFactory_KeyBase, 0x24);
120+
static constexpr Key kConfigKey_Creds_PAI_Size = SilabsConfigKey(kMatterFactory_KeyBase, 0x25);
121+
static constexpr Key kConfigKey_Creds_CD_Offset = SilabsConfigKey(kMatterFactory_KeyBase, 0x26);
122+
static constexpr Key kConfigKey_Creds_CD_Size = SilabsConfigKey(kMatterFactory_KeyBase, 0x27);
115123
// Matter Config Keys
116124
static constexpr Key kConfigKey_ServiceConfig = SilabsConfigKey(kMatterConfig_KeyBase, 0x01);
117125
static constexpr Key kConfigKey_PairedAccountId = SilabsConfigKey(kMatterConfig_KeyBase, 0x02);
@@ -135,14 +143,6 @@ class SilabsConfig
135143
static constexpr Key kConfigKey_YearDaySchedules = SilabsConfigKey(kMatterConfig_KeyBase, 0x16);
136144
static constexpr Key kConfigKey_HolidaySchedules = SilabsConfigKey(kMatterConfig_KeyBase, 0x17);
137145
static constexpr Key kConfigKey_OpKeyMap = SilabsConfigKey(kMatterConfig_KeyBase, 0x20);
138-
static constexpr Key kConfigKey_Creds_KeyId = SilabsConfigKey(kMatterConfig_KeyBase, 0x21);
139-
static constexpr Key kConfigKey_Creds_Base_Addr = SilabsConfigKey(kMatterConfig_KeyBase, 0x22);
140-
static constexpr Key kConfigKey_Creds_DAC_Offset = SilabsConfigKey(kMatterConfig_KeyBase, 0x23);
141-
static constexpr Key kConfigKey_Creds_DAC_Size = SilabsConfigKey(kMatterConfig_KeyBase, 0x24);
142-
static constexpr Key kConfigKey_Creds_PAI_Offset = SilabsConfigKey(kMatterConfig_KeyBase, 0x25);
143-
static constexpr Key kConfigKey_Creds_PAI_Size = SilabsConfigKey(kMatterConfig_KeyBase, 0x26);
144-
static constexpr Key kConfigKey_Creds_CD_Offset = SilabsConfigKey(kMatterConfig_KeyBase, 0x27);
145-
static constexpr Key kConfigKey_Creds_CD_Size = SilabsConfigKey(kMatterConfig_KeyBase, 0x28);
146146

147147
static constexpr Key kConfigKey_GroupKeyMax =
148148
SilabsConfigKey(kMatterConfig_KeyBase, 0x1E); // Allows 16 Group Keys to be created.
@@ -160,7 +160,7 @@ class SilabsConfig
160160

161161
// Set key id limits for each group.
162162
static constexpr Key kMinConfigKey_MatterFactory = SilabsConfigKey(kMatterFactory_KeyBase, 0x00);
163-
static constexpr Key kMaxConfigKey_MatterFactory = SilabsConfigKey(kMatterFactory_KeyBase, 0x1F);
163+
static constexpr Key kMaxConfigKey_MatterFactory = SilabsConfigKey(kMatterFactory_KeyBase, 0x2F);
164164
static constexpr Key kMinConfigKey_MatterConfig = SilabsConfigKey(kMatterConfig_KeyBase, 0x00);
165165
static constexpr Key kMaxConfigKey_MatterConfig = SilabsConfigKey(kMatterConfig_KeyBase, 0x20);
166166

0 commit comments

Comments
 (0)