18
18
19
19
#include < controller/AutoCommissioner.h>
20
20
21
+ #include < cstring>
22
+
21
23
#include < app/InteractionModelTimeout.h>
22
24
#include < controller/CHIPDeviceController.h>
23
25
#include < credentials/CHIPCert.h>
@@ -65,6 +67,32 @@ static bool IsUnsafeSpan(const Optional<SpanType> & maybeUnsafeSpan, const Optio
65
67
return maybeUnsafeSpan.Value ().data () != knownSafeSpan.Value ().data ();
66
68
}
67
69
70
+ CHIP_ERROR AutoCommissioner::VerifyICDRegistrationInfo (const CommissioningParameters & params)
71
+ {
72
+ ChipLogProgress (Controller, " Checking ICD registration parameters" );
73
+ if (!params.GetICDSymmetricKey ().HasValue ())
74
+ {
75
+ ChipLogError (Controller, " Missing ICD symmetric key!" );
76
+ return CHIP_ERROR_INVALID_ARGUMENT;
77
+ }
78
+ if (params.GetICDSymmetricKey ().Value ().size () != sizeof (mICDSymmetricKey ))
79
+ {
80
+ ChipLogError (Controller, " Invalid ICD symmetric key length!" );
81
+ return CHIP_ERROR_INVALID_ARGUMENT;
82
+ }
83
+ if (!params.GetICDCheckInNodeId ().HasValue ())
84
+ {
85
+ ChipLogError (Controller, " Missing ICD check-in node id!" );
86
+ return CHIP_ERROR_INVALID_ARGUMENT;
87
+ }
88
+ if (!params.GetICDMonitoredSubject ().HasValue ())
89
+ {
90
+ ChipLogError (Controller, " Missing ICD monitored subject!" );
91
+ return CHIP_ERROR_INVALID_ARGUMENT;
92
+ }
93
+ return CHIP_NO_ERROR;
94
+ }
95
+
68
96
CHIP_ERROR AutoCommissioner::SetCommissioningParameters (const CommissioningParameters & params)
69
97
{
70
98
// Make sure any members that point to buffers that we are not pointing to
@@ -90,6 +118,7 @@ CHIP_ERROR AutoCommissioner::SetCommissioningParameters(const CommissioningParam
90
118
IsUnsafeSpan (params.GetPAI (), mParams .GetPAI ()) || IsUnsafeSpan (params.GetDAC (), mParams .GetDAC ()) ||
91
119
IsUnsafeSpan (params.GetTimeZone (), mParams .GetTimeZone ()) ||
92
120
IsUnsafeSpan (params.GetDSTOffsets (), mParams .GetDSTOffsets ()) ||
121
+ IsUnsafeSpan (params.GetICDSymmetricKey (), mParams .GetICDSymmetricKey ()) ||
93
122
(params.GetDefaultNTP ().HasValue () && !params.GetDefaultNTP ().Value ().IsNull () &&
94
123
params.GetDefaultNTP ().Value ().Value ().data () != mDefaultNtp ));
95
124
@@ -229,6 +258,17 @@ CHIP_ERROR AutoCommissioner::SetCommissioningParameters(const CommissioningParam
229
258
}
230
259
}
231
260
261
+ if (params.GetICDRegistrationStrategy () != ICDRegistrationStrategy::kIgnore && params.GetICDSymmetricKey ().HasValue ())
262
+ {
263
+ ReturnErrorOnFailure (VerifyICDRegistrationInfo (params));
264
+
265
+ // The values must be valid now.
266
+ memcpy (mICDSymmetricKey , params.GetICDSymmetricKey ().Value ().data (), params.GetICDSymmetricKey ().Value ().size ());
267
+ mParams .SetICDSymmetricKey (ByteSpan (mICDSymmetricKey ));
268
+ mParams .SetICDCheckInNodeId (params.GetICDCheckInNodeId ().Value ());
269
+ mParams .SetICDMonitoredSubject (params.GetICDMonitoredSubject ().Value ());
270
+ }
271
+
232
272
return CHIP_NO_ERROR;
233
273
}
234
274
@@ -367,6 +407,17 @@ CommissioningStage AutoCommissioner::GetNextCommissioningStageInternal(Commissio
367
407
return GetNextCommissioningStageInternal (CommissioningStage::kConfigureTrustedTimeSource , lastErr);
368
408
}
369
409
case CommissioningStage::kConfigureTrustedTimeSource :
410
+ if (mNeedIcdRegistration )
411
+ {
412
+ return CommissioningStage::kICDGetRegistrationInfo ;
413
+ }
414
+ return GetNextCommissioningStageInternal (CommissioningStage::kICDSendStayActive , lastErr);
415
+ case CommissioningStage::kICDGetRegistrationInfo :
416
+ return CommissioningStage::kICDRegistration ;
417
+ case CommissioningStage::kICDRegistration :
418
+ // TODO(#24259): StayActiveRequest is not supported by server. We may want to SendStayActive after OpDiscovery.
419
+ return CommissioningStage::kICDSendStayActive ;
420
+ case CommissioningStage::kICDSendStayActive :
370
421
// TODO(cecille): device attestation casues operational cert provisioning to happen, This should be a separate stage.
371
422
// For thread and wifi, this should go to network setup then enable. For on-network we can skip right to finding the
372
423
// operational network because the provisioning of certificates will trigger the device to start operational advertising.
@@ -709,10 +760,10 @@ CHIP_ERROR AutoCommissioner::CommissioningStepFinished(CHIP_ERROR err, Commissio
709
760
710
761
if (mParams .GetICDRegistrationStrategy () != ICDRegistrationStrategy::kIgnore )
711
762
{
712
- if (commissioningInfo.isIcd )
763
+ if (commissioningInfo.isIcd && commissioningInfo. checkInProtocolSupport )
713
764
{
714
- mNeedIcdRegistraion = true ;
715
- ChipLogDetail (Controller, " AutoCommissioner: Device is ICD " );
765
+ mNeedIcdRegistration = true ;
766
+ ChipLogDetail (Controller, " AutoCommissioner: ICD supports the check-in protocol. " );
716
767
}
717
768
}
718
769
break ;
@@ -776,6 +827,15 @@ CHIP_ERROR AutoCommissioner::CommissioningStepFinished(CHIP_ERROR err, Commissio
776
827
// storing the returned certs, so just return here without triggering the next stage.
777
828
return NOCChainGenerated (report.Get <NocChain>().noc , report.Get <NocChain>().icac , report.Get <NocChain>().rcac ,
778
829
report.Get <NocChain>().ipk , report.Get <NocChain>().adminSubject );
830
+ case CommissioningStage::kICDGetRegistrationInfo :
831
+ // Noting to od. The ICD registation info is handled elsewhere.
832
+ break ;
833
+ case CommissioningStage::kICDRegistration :
834
+ // Noting to od. DevicePairingDelegate will handle this.
835
+ break ;
836
+ case CommissioningStage::kICDSendStayActive :
837
+ // Nothing to do.
838
+ break ;
779
839
case CommissioningStage::kFindOperational :
780
840
mOperationalDeviceProxy = report.Get <OperationalNodeFoundData>().operationalProxy ;
781
841
break ;
0 commit comments