26
26
27
27
using namespace chip ::DeviceLayer::Internal;
28
28
29
+ using chip::DeviceLayer::Internal::SilabsConfig;
30
+
29
31
extern uint8_t linker_nvm_end[];
30
32
static uint8_t * _credentials_address = (uint8_t *) linker_nvm_end;
31
33
@@ -44,21 +46,8 @@ class DeviceAttestationCredsSilabs : public DeviceAttestationCredentialsProvider
44
46
public:
45
47
CHIP_ERROR GetCertificationDeclaration (MutableByteSpan & out_span) override
46
48
{
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);
62
51
}
63
52
64
53
CHIP_ERROR GetFirmwareInformation (MutableByteSpan & out_firmware_info_buffer) override
@@ -70,40 +59,15 @@ class DeviceAttestationCredsSilabs : public DeviceAttestationCredentialsProvider
70
59
71
60
CHIP_ERROR GetDeviceAttestationCert (MutableByteSpan & out_span) override
72
61
{
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);
88
64
}
89
65
90
66
CHIP_ERROR GetProductAttestationIntermediateCert (MutableByteSpan & out_span) override
91
67
{
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);
107
71
}
108
72
109
73
CHIP_ERROR SignWithDeviceAttestationKey (const ByteSpan & message_to_sign, MutableByteSpan & out_span) override
@@ -126,6 +90,45 @@ class DeviceAttestationCredsSilabs : public DeviceAttestationCredentialsProvider
126
90
127
91
return CopySpanToMutableSpan (ByteSpan (signature, signature_size), out_span);
128
92
}
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
+ }
129
132
};
130
133
131
134
} // namespace
@@ -138,4 +141,43 @@ DeviceAttestationCredentialsProvider * GetSilabsDacProvider()
138
141
139
142
} // namespace Silabs
140
143
} // 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
141
183
} // namespace chip
0 commit comments