Skip to content

Commit 128c37a

Browse files
[Fabric-Admin] Fix 'fabricsync sync-device' command always fails (#34938)
* [Fabric-Admin] Fix 'fabricsync sync-device' command always fails * Use default random salt * Update examples/fabric-admin/commands/pairing/OpenCommissioningWindowCommand.h Co-authored-by: Abdul Samad <abdul.samad@smartthings.com> * Address review comments --------- Co-authored-by: Abdul Samad <abdul.samad@smartthings.com>
1 parent 74b8ce1 commit 128c37a

File tree

5 files changed

+16
-6
lines changed

5 files changed

+16
-6
lines changed

examples/fabric-admin/commands/common/CHIPCommand.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ inline constexpr char kIdentityGamma[] = "gamma";
5151
// (CASE) communcation.
5252
inline constexpr char kIdentityNull[] = "null-fabric-commissioner";
5353

54-
constexpr uint16_t kMaxCommandSize = 128;
54+
constexpr uint16_t kMaxCommandSize = 384;
5555

5656
class CHIPCommand : public Command
5757
{

examples/fabric-admin/commands/fabric-sync/FabricSyncCommand.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,8 @@ CHIP_ERROR FabricSyncRemoveBridgeCommand::RunCommand()
163163

164164
void FabricSyncDeviceCommand::OnCommissioningWindowOpened(NodeId deviceId, CHIP_ERROR err, chip::SetupPayload payload)
165165
{
166+
ChipLogProgress(NotSpecified, "FabricSyncDeviceCommand::OnCommissioningWindowOpened");
167+
166168
if (err == CHIP_NO_ERROR)
167169
{
168170
char payloadBuffer[kMaxManaulCodeLength + 1];

examples/fabric-admin/commands/pairing/OpenCommissioningWindowCommand.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ CHIP_ERROR OpenCommissioningWindowCommand::RunCommand()
5555
.SetTimeout(mCommissioningWindowTimeout)
5656
.SetIteration(mIteration)
5757
.SetDiscriminator(mDiscriminator)
58+
.SetSetupPIN(mSetupPIN)
5859
.SetSalt(mSalt)
5960
.SetReadVIDPIDAttributes(true)
6061
.SetCallback(&mOnOpenCommissioningWindowCallback),

examples/fabric-admin/commands/pairing/OpenCommissioningWindowCommand.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,9 @@ class OpenCommissioningWindowCommand : public CHIPCommand
4646
"Time, in seconds, before the commissioning window closes.");
4747
AddArgument("iteration", chip::Crypto::kSpake2p_Min_PBKDF_Iterations, chip::Crypto::kSpake2p_Max_PBKDF_Iterations,
4848
&mIteration, "Number of PBKDF iterations to use to derive the verifier. Ignored if 'option' is 0.");
49-
AddArgument("discriminator", 0, 4096, &mDiscriminator, "Discriminator to use for advertising. Ignored if 'option' is 0.");
49+
AddArgument("discriminator", 0, 4095, &mDiscriminator, "Discriminator to use for advertising. Ignored if 'option' is 0.");
5050
AddArgument("timeout", 0, UINT16_MAX, &mTimeout, "Time, in seconds, before this command is considered to have timed out.");
51+
AddArgument("setup-pin", 1, chip::kSetupPINCodeMaximumValue, &mSetupPIN, "The setup PIN (Passcode) to use.");
5152
AddArgument("salt", &mSalt,
5253
"Salt payload encoded in hexadecimal. Random salt will be generated if absent. "
5354
"This needs to be present if verifier is provided, corresponding to salt used for generating verifier");
@@ -76,6 +77,7 @@ class OpenCommissioningWindowCommand : public CHIPCommand
7677
uint16_t mDiscriminator;
7778

7879
chip::Optional<uint16_t> mTimeout;
80+
chip::Optional<uint32_t> mSetupPIN;
7981
chip::Optional<chip::ByteSpan> mSalt;
8082
chip::Optional<chip::ByteSpan> mVerifier;
8183

examples/fabric-admin/device_manager/DeviceManager.cpp

+9-4
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,12 @@ namespace {
3333
// Constants
3434
constexpr uint32_t kSetupPinCode = 20202021;
3535
constexpr uint16_t kRemoteBridgePort = 5540;
36-
constexpr uint16_t kDiscriminator = 3840;
3736
constexpr uint16_t kWindowTimeout = 300;
3837
constexpr uint16_t kIteration = 1000;
3938
constexpr uint16_t kSubscribeMinInterval = 0;
4039
constexpr uint16_t kSubscribeMaxInterval = 60;
4140
constexpr uint16_t kAggragatorEndpointId = 1;
41+
constexpr uint16_t kMaxDiscriminatorLength = 4095;
4242
constexpr uint8_t kEnhancedCommissioningMethod = 1;
4343

4444
} // namespace
@@ -118,7 +118,7 @@ void DeviceManager::OpenDeviceCommissioningWindow(NodeId nodeId, uint32_t commis
118118
uint32_t discriminator, const char * saltHex, const char * verifierHex)
119119
{
120120
// Open the commissioning window of a device within its own fabric.
121-
StringBuilder<512> commandBuilder;
121+
StringBuilder<kMaxCommandSize> commandBuilder;
122122

123123
commandBuilder.Add("pairing open-commissioning-window ");
124124
commandBuilder.AddFormat("%lu %d %d %d %d %d --salt hex:%s --verifier hex:%s", nodeId, kRootEndpointId,
@@ -132,11 +132,16 @@ void DeviceManager::OpenRemoteDeviceCommissioningWindow(EndpointId remoteEndpoin
132132
// Open the commissioning window of a device from another fabric via its fabric bridge.
133133
// This method constructs and sends a command to open the commissioning window for a device
134134
// that is part of a different fabric, accessed through a fabric bridge.
135-
StringBuilder<kMaxCommandSize> commandBuilder;
135+
StringBuilder<512> commandBuilder;
136+
137+
// Use random discriminator to have less chance of collission.
138+
uint16_t discriminator =
139+
Crypto::GetRandU16() % (kMaxDiscriminatorLength + 1); // Include the upper limit kMaxDiscriminatorLength
136140

137141
commandBuilder.Add("pairing open-commissioning-window ");
138142
commandBuilder.AddFormat("%lu %d %d %d %d %d", mRemoteBridgeNodeId, remoteEndpointId, kEnhancedCommissioningMethod,
139-
kWindowTimeout, kIteration, kDiscriminator);
143+
kWindowTimeout, kIteration, discriminator);
144+
commandBuilder.Add(" --setup-pin 20202021");
140145

141146
PushCommand(commandBuilder.c_str());
142147
}

0 commit comments

Comments
 (0)