20
20
21
21
#include < commands/interactive/InteractiveCommands.h>
22
22
#include < crypto/RandUtils.h>
23
+ #include < device_manager/PairingManager.h>
23
24
#include < lib/support/StringBuilder.h>
24
25
25
26
#include < cstdio>
@@ -30,13 +31,12 @@ using namespace chip::app::Clusters;
30
31
31
32
namespace {
32
33
33
- constexpr uint16_t kWindowTimeout = 300 ;
34
- constexpr uint16_t kIteration = 1000 ;
35
- constexpr uint16_t kSubscribeMinInterval = 0 ;
36
- constexpr uint16_t kSubscribeMaxInterval = 60 ;
37
- constexpr uint16_t kAggragatorEndpointId = 1 ;
38
- constexpr uint16_t kMaxDiscriminatorLength = 4095 ;
39
- constexpr uint8_t kEnhancedCommissioningMethod = 1 ;
34
+ constexpr uint16_t kWindowTimeout = 300 ;
35
+ constexpr uint16_t kIteration = 1000 ;
36
+ constexpr uint16_t kSubscribeMinInterval = 0 ;
37
+ constexpr uint16_t kSubscribeMaxInterval = 60 ;
38
+ constexpr uint16_t kAggragatorEndpointId = 1 ;
39
+ constexpr uint16_t kMaxDiscriminatorLength = 4095 ;
40
40
41
41
} // namespace
42
42
@@ -115,37 +115,39 @@ void DeviceManager::RemoveSyncedDevice(NodeId nodeId)
115
115
ChipLogValueX64 (device->GetNodeId ()), device->GetEndpointId ());
116
116
}
117
117
118
- void DeviceManager::OpenDeviceCommissioningWindow (NodeId nodeId, uint32_t commissioningTimeout , uint32_t iterations,
119
- uint32_t discriminator, const char * saltHex , const char * verifierHex )
118
+ void DeviceManager::OpenDeviceCommissioningWindow (NodeId nodeId, uint32_t commissioningTimeoutSec , uint32_t iterations,
119
+ uint16_t discriminator, const ByteSpan & salt , const ByteSpan & verifier )
120
120
{
121
- ChipLogProgress (NotSpecified, " Open the commissioning window of device with NodeId: " ChipLogFormatX64, ChipLogValueX64 (nodeId));
121
+ ChipLogProgress (NotSpecified, " Opening commissioning window for Node ID: " ChipLogFormatX64, ChipLogValueX64 (nodeId));
122
122
123
123
// Open the commissioning window of a device within its own fabric.
124
- StringBuilder<kMaxCommandSize > commandBuilder;
125
-
126
- commandBuilder.Add (" pairing open-commissioning-window " );
127
- commandBuilder.AddFormat (" %lu %d %d %d %d %d --salt hex:%s --verifier hex:%s" , nodeId, kRootEndpointId ,
128
- kEnhancedCommissioningMethod , commissioningTimeout, iterations, discriminator, saltHex, verifierHex);
129
-
130
- PushCommand (commandBuilder.c_str ());
124
+ CHIP_ERROR err = PairingManager::Instance ().OpenCommissioningWindow (nodeId, kRootEndpointId , commissioningTimeoutSec,
125
+ iterations, discriminator, salt, verifier);
126
+ if (err != CHIP_NO_ERROR)
127
+ {
128
+ ChipLogError (NotSpecified, " Failed to open commissioning window: %s" , ErrorStr (err));
129
+ }
131
130
}
132
131
133
132
void DeviceManager::OpenRemoteDeviceCommissioningWindow (EndpointId remoteEndpointId)
134
133
{
135
134
// Open the commissioning window of a device from another fabric via its fabric bridge.
136
135
// This method constructs and sends a command to open the commissioning window for a device
137
136
// that is part of a different fabric, accessed through a fabric bridge.
138
- StringBuilder<kMaxCommandSize > commandBuilder;
139
137
140
138
// Use random discriminator to have less chance of collision.
141
139
uint16_t discriminator =
142
140
Crypto::GetRandU16 () % (kMaxDiscriminatorLength + 1 ); // Include the upper limit kMaxDiscriminatorLength
143
141
144
- commandBuilder.Add (" pairing open-commissioning-window " );
145
- commandBuilder.AddFormat (" %lu %d %d %d %d %d" , mRemoteBridgeNodeId , remoteEndpointId, kEnhancedCommissioningMethod ,
146
- kWindowTimeout , kIteration , discriminator);
142
+ ByteSpan emptySalt;
143
+ ByteSpan emptyVerifier;
147
144
148
- PushCommand (commandBuilder.c_str ());
145
+ CHIP_ERROR err = PairingManager::Instance ().OpenCommissioningWindow (mRemoteBridgeNodeId , remoteEndpointId, kWindowTimeout ,
146
+ kIteration , discriminator, emptySalt, emptyVerifier);
147
+ if (err != CHIP_NO_ERROR)
148
+ {
149
+ ChipLogError (NotSpecified, " Failed to open commissioning window: %s" , ErrorStr (err));
150
+ }
149
151
}
150
152
151
153
void DeviceManager::PairRemoteFabricBridge (chip::NodeId nodeId, uint32_t setupPINCode, const char * deviceRemoteIp,
@@ -421,6 +423,7 @@ void DeviceManager::HandleReverseOpenCommissioningWindow(TLV::TLVReader & data)
421
423
{
422
424
CommissionerControl::Commands::ReverseOpenCommissioningWindow::DecodableType value;
423
425
CHIP_ERROR error = app::DataModel::Decode (data, value);
426
+
424
427
if (error != CHIP_NO_ERROR)
425
428
{
426
429
ChipLogError (NotSpecified, " Failed to decode command response value. Error: %" CHIP_ERROR_FORMAT, error.Format ());
@@ -432,18 +435,12 @@ void DeviceManager::HandleReverseOpenCommissioningWindow(TLV::TLVReader & data)
432
435
ChipLogProgress (NotSpecified, " commissioningTimeout: %u" , value.commissioningTimeout );
433
436
ChipLogProgress (NotSpecified, " discriminator: %u" , value.discriminator );
434
437
ChipLogProgress (NotSpecified, " iterations: %u" , value.iterations );
438
+ ChipLogProgress (NotSpecified, " PAKEPasscodeVerifier size: %lu" , value.PAKEPasscodeVerifier .size ());
439
+ ChipLogProgress (NotSpecified, " salt size: %lu" , value.salt .size ());
435
440
436
- char verifierHex[Crypto::kSpake2p_VerifierSerialized_Length * 2 + 1 ];
437
- Encoding::BytesToHex (value.PAKEPasscodeVerifier .data (), value.PAKEPasscodeVerifier .size (), verifierHex, sizeof (verifierHex),
438
- Encoding::HexFlags::kNullTerminate );
439
- ChipLogProgress (NotSpecified, " PAKEPasscodeVerifier: %s" , verifierHex);
440
-
441
- char saltHex[Crypto::kSpake2p_Max_PBKDF_Salt_Length * 2 + 1 ];
442
- Encoding::BytesToHex (value.salt .data (), value.salt .size (), saltHex, sizeof (saltHex), Encoding::HexFlags::kNullTerminate );
443
- ChipLogProgress (NotSpecified, " salt: %s" , saltHex);
444
-
445
- OpenDeviceCommissioningWindow (mLocalBridgeNodeId , value.commissioningTimeout , value.iterations , value.discriminator , saltHex,
446
- verifierHex);
441
+ OpenDeviceCommissioningWindow (mLocalBridgeNodeId , value.commissioningTimeout , value.iterations , value.discriminator ,
442
+ ByteSpan (value.salt .data (), value.salt .size ()),
443
+ ByteSpan (value.PAKEPasscodeVerifier .data (), value.PAKEPasscodeVerifier .size ()));
447
444
}
448
445
449
446
void DeviceManager::HandleAttributeData (const app::ConcreteDataAttributePath & path, TLV::TLVReader & data)
0 commit comments