2222#include < clusters/TlsCertificateManagement/Commands.h>
2323#include < crypto/CHIPCryptoPAL.h>
2424#include < tls-certificate-management-instance.h>
25+ #include < tls-client-management-instance.h>
2526
2627using namespace chip ;
2728using namespace chip ::app;
@@ -135,31 +136,31 @@ struct InlineEncodableClientCert : RefEncodableClientCert
135136 InlineEncodableClientCert () : RefEncodableClientCert(inlineCertificate) {}
136137};
137138
138- static constexpr uint8_t kMaxRootCerts = 254 ;
139- static constexpr uint8_t kMaxClientCerts = 254 ;
139+ static constexpr uint8_t kMaxRootCerts = kMaxRootCertificatesPerFabric ;
140+ static constexpr uint8_t kMaxClientCerts = kMaxClientCertificatesPerFabric ;
140141
141142CHIP_ERROR FingerprintMatch (const ByteSpan & fingerprint, const ByteSpan & cert, bool & outMatch)
142143{
143- std::array<uint8_t , chip::Crypto::kSHA1_Hash_Length > fingerprintPayload = { 0 };
144+ std::array<uint8_t , chip::Crypto::kSHA256_Hash_Length > fingerprintPayload = { 0 };
144145 MutableByteSpan calculatedFingerprint (fingerprintPayload);
145- ReturnErrorOnFailure (Hash_SHA1 (cert.data (), cert.size (), fingerprintPayload.data ()));
146+ ReturnErrorOnFailure (Hash_SHA256 (cert.data (), cert.size (), fingerprintPayload.data ()));
146147 outMatch = fingerprint.data_equal (calculatedFingerprint);
147148 return CHIP_NO_ERROR;
148149}
149150
150- ClusterStatusCode TlsCertificateManagementCommandDelegate::ProvisionRootCert (EndpointId matterEndpoint, FabricIndex fabric,
151- const ProvisionRootCertificateType & provisionReq,
152- Tls::TLSCAID & outCaid)
151+ Status TlsCertificateManagementCommandDelegate::ProvisionRootCert (EndpointId matterEndpoint, FabricIndex fabric,
152+ const ProvisionRootCertificateType & provisionReq,
153+ Tls::TLSCAID & outCaid)
153154{
154155 auto localId = provisionReq.caid .IsNull () ? Optional<Tls::TLSCAID>() : Optional<Tls::TLSCAID>(provisionReq.caid .Value ());
155156 UniquePtr<InlineBufferedRootCert> certBuffer (New<InlineBufferedRootCert>());
156- VerifyOrReturnError (certBuffer, ClusterStatusCode (CHIP_ERROR_NO_MEMORY) );
157+ VerifyOrReturnError (certBuffer, Status::ResourceExhausted );
157158
158159 auto result = mCertificateTable .UpsertRootCertificateEntry (fabric, localId, certBuffer->buffer , provisionReq.certificate );
159160
160- VerifyOrReturnValue (result == CHIP_NO_ERROR, ClusterStatusCode ( Status::Failure) );
161+ VerifyOrReturnValue (result == CHIP_NO_ERROR, Status::Failure);
161162 outCaid = localId.Value ();
162- return ClusterStatusCode ( Status::Success) ;
163+ return Status::Success;
163164}
164165
165166CHIP_ERROR TlsCertificateManagementCommandDelegate::LoadedRootCerts (EndpointId matterEndpoint, FabricIndex fabric,
@@ -252,9 +253,9 @@ CHIP_ERROR TlsCertificateManagementCommandDelegate::LookupRootCert(EndpointId ma
252253 const ByteSpan & certificate,
253254 LoadedRootCertificateCallback loadedCallback) const
254255{
255- std::array<uint8_t , chip:: Crypto::kSHA1_Hash_Length > fingerprintPayload = { 0 };
256+ std::array<uint8_t , Crypto::kSHA256_Hash_Length > fingerprintPayload = { 0 };
256257 MutableByteSpan calculatedFingerprint (fingerprintPayload);
257- ReturnErrorOnFailure (Hash_SHA1 (certificate.data (), certificate.size (), fingerprintPayload.data ()));
258+ ReturnErrorOnFailure (Hash_SHA256 (certificate.data (), certificate.size (), fingerprintPayload.data ()));
258259 return LookupRootCertByFingerprint (matterEndpoint, fabric, calculatedFingerprint, loadedCallback);
259260}
260261
@@ -302,19 +303,25 @@ Status TlsCertificateManagementCommandDelegate::GenerateClientCsr(EndpointId mat
302303 return loadedCallback (csrResponse);
303304}
304305
305- ClusterStatusCode TlsCertificateManagementCommandDelegate::ProvisionClientCert (EndpointId matterEndpoint, FabricIndex fabric,
306- const ProvisionClientCertificateType & provisionReq)
306+ Status TlsCertificateManagementCommandDelegate::ProvisionClientCert (EndpointId matterEndpoint, FabricIndex fabric,
307+ const ProvisionClientCertificateType & provisionReq)
307308{
308309 UniquePtr<InlineBufferedClientCert> certBuffer (New<InlineBufferedClientCert>());
309- VerifyOrReturnError (certBuffer, ClusterStatusCode (CHIP_ERROR_NO_MEMORY));
310+ VerifyOrReturnError (certBuffer, Status::ResourceExhausted);
311+
310312 TLSClientCertificateDetailStruct::DecodableType details;
311313 details.ccdid = provisionReq.ccdid ;
312314 details.clientCertificate .SetValue (provisionReq.clientCertificate );
313315 details.intermediateCertificates .SetValue (provisionReq.intermediateCertificates );
314316 details.SetFabricIndex (fabric);
317+
315318 auto result = mCertificateTable .UpdateClientCertificateEntry (fabric, provisionReq.ccdid , certBuffer->buffer , details);
316- ReturnValueOnFailure (result, ClusterStatusCode (Status::Failure));
317- return ClusterStatusCode (Status::Success);
319+ if (result == CHIP_ERROR_INVALID_ARGUMENT)
320+ {
321+ return Status::DynamicConstraintError;
322+ }
323+ ReturnValueOnFailure (result, Status::Failure);
324+ return Status::Success;
318325}
319326
320327CHIP_ERROR TlsCertificateManagementCommandDelegate::LoadedClientCerts (EndpointId matterEndpoint, FabricIndex fabric,
@@ -413,13 +420,13 @@ CHIP_ERROR TlsCertificateManagementCommandDelegate::LookupClientCert(EndpointId
413420 const ByteSpan & certificate,
414421 LoadedClientCertificateCallback loadedCallback) const
415422{
416- std::array<uint8_t , chip:: Crypto::kSHA1_Hash_Length > fingerprintPayload = { 0 };
423+ std::array<uint8_t , Crypto::kSHA256_Hash_Length > fingerprintPayload = { 0 };
417424 MutableByteSpan calculatedFingerprint (fingerprintPayload);
418- ReturnErrorOnFailure (Hash_SHA1 (certificate.data (), certificate.size (), fingerprintPayload.data ()));
425+ ReturnErrorOnFailure (Hash_SHA256 (certificate.data (), certificate.size (), fingerprintPayload.data ()));
419426 return LookupClientCertByFingerprint (matterEndpoint, fabric, calculatedFingerprint, loadedCallback);
420427}
421428
422- Status TlsCertificateManagementCommandDelegate::RemoveClientCert (EndpointId matterEndpoint, FabricIndex fabric, Tls::TLSCAID id)
429+ Status TlsCertificateManagementCommandDelegate::RemoveClientCert (EndpointId matterEndpoint, FabricIndex fabric, Tls::TLSCCDID id)
423430{
424431 VerifyOrReturnValue (matterEndpoint == EndpointId (1 ), Status::ConstraintError);
425432
@@ -436,9 +443,9 @@ Status TlsCertificateManagementCommandDelegate::RemoveClientCert(EndpointId matt
436443
437444static CertificateTableImpl gCertificateTableInstance ;
438445TlsCertificateManagementCommandDelegate TlsCertificateManagementCommandDelegate::instance (gCertificateTableInstance );
439- static TlsCertificateManagementServer gTlsCertificateManagementClusterServerInstance =
440- TlsCertificateManagementServer ( EndpointId(1 ), TlsCertificateManagementCommandDelegate::getInstance (), gCertificateTableInstance ,
441- kMaxRootCerts, kMaxClientCerts);
446+ static TlsCertificateManagementServer gTlsCertificateManagementClusterServerInstance = TlsCertificateManagementServer(
447+ EndpointId (1 ), TlsCertificateManagementCommandDelegate::GetInstance (), TlsClientManagementCommandDelegate::GetInstance() ,
448+ gCertificateTableInstance, kMaxRootCerts, kMaxClientCerts);
442449
443450void emberAfTlsCertificateManagementClusterInitCallback (EndpointId matterEndpoint)
444451{
0 commit comments