Skip to content

Commit 010decd

Browse files
[Fabric-Admin] Refactor to use API methods instead of PushCommand (1/3) (#35614)
* [Fabric-Admin] Refactor to use API methods instead of PushCommand to talk to SDK * Address review comments * Update examples/fabric-admin/device_manager/PairingManager.h Co-authored-by: Andrei Litvin <andy314@gmail.com> * Update per review comments * Update commissioningTimeout to commissioningTimeoutSec --------- Co-authored-by: Andrei Litvin <andy314@gmail.com>
1 parent 0b8ffb7 commit 010decd

11 files changed

+348
-82
lines changed

examples/fabric-admin/BUILD.gn

+2
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ static_library("fabric-admin-utils") {
8888
"device_manager/DeviceSubscriptionManager.h",
8989
"device_manager/DeviceSynchronization.cpp",
9090
"device_manager/DeviceSynchronization.h",
91+
"device_manager/PairingManager.cpp",
92+
"device_manager/PairingManager.h",
9193
"device_manager/UniqueIdGetter.cpp",
9294
"device_manager/UniqueIdGetter.h",
9395
]

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

+3
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "IcdManager.h"
2222
#include <controller/CHIPDeviceControllerFactory.h>
2323
#include <credentials/attestation_verifier/FileAttestationTrustStore.h>
24+
#include <device_manager/PairingManager.h>
2425
#include <lib/core/CHIPConfig.h>
2526
#include <lib/core/CHIPVendorIdentifiers.hpp>
2627
#include <lib/support/CodeUtils.h>
@@ -181,6 +182,8 @@ CHIP_ERROR CHIPCommand::MaybeSetUpStack()
181182
mCredIssuerCmds->SetCredentialIssuerOption(CredentialIssuerCommands::CredentialIssuerOptions::kAllowTestCdSigningKey,
182183
allowTestCdSigningKey);
183184

185+
PairingManager::Instance().Init(&CurrentCommissioner());
186+
184187
return CHIP_NO_ERROR;
185188
}
186189

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

+1-9
Original file line numberDiff line numberDiff line change
@@ -344,15 +344,7 @@ CHIP_ERROR FabricSyncDeviceCommand::RunCommand(EndpointId remoteId)
344344
return CHIP_NO_ERROR;
345345
}
346346

347-
OpenCommissioningWindowCommand * openCommand =
348-
static_cast<OpenCommissioningWindowCommand *>(CommandMgr().GetCommandByName("pairing", "open-commissioning-window"));
349-
350-
if (openCommand == nullptr)
351-
{
352-
return CHIP_ERROR_NOT_IMPLEMENTED;
353-
}
354-
355-
openCommand->RegisterDelegate(this);
347+
PairingManager::Instance().SetOpenCommissioningWindowDelegate(this);
356348

357349
DeviceMgr().OpenRemoteDeviceCommissioningWindow(remoteId);
358350

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@
1919
#pragma once
2020

2121
#include <commands/common/CHIPCommand.h>
22-
#include <commands/pairing/OpenCommissioningWindowCommand.h>
2322
#include <commands/pairing/PairingCommand.h>
23+
#include <device_manager/PairingManager.h>
2424

2525
// Constants
2626
constexpr uint32_t kCommissionPrepareTimeMs = 500;

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

-8
Original file line numberDiff line numberDiff line change
@@ -70,14 +70,6 @@ CHIP_ERROR OpenCommissioningWindowCommand::RunCommand()
7070
void OpenCommissioningWindowCommand::OnOpenCommissioningWindowResponse(void * context, NodeId remoteId, CHIP_ERROR err,
7171
chip::SetupPayload payload)
7272
{
73-
OpenCommissioningWindowCommand * self = static_cast<OpenCommissioningWindowCommand *>(context);
74-
if (self->mDelegate)
75-
{
76-
self->mDelegate->OnCommissioningWindowOpened(remoteId, err, payload);
77-
self->UnregisterDelegate();
78-
}
79-
80-
LogErrorOnFailure(err);
8173
OnOpenBasicCommissioningWindowResponse(context, remoteId, err);
8274
}
8375

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

-11
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,6 @@
2222
#include <controller/CommissioningWindowOpener.h>
2323
#include <lib/support/CHIPMem.h>
2424

25-
class CommissioningWindowDelegate
26-
{
27-
public:
28-
virtual void OnCommissioningWindowOpened(chip::NodeId deviceId, CHIP_ERROR err, chip::SetupPayload payload) = 0;
29-
virtual ~CommissioningWindowDelegate() = default;
30-
};
31-
3225
class OpenCommissioningWindowCommand : public CHIPCommand
3326
{
3427
public:
@@ -57,9 +50,6 @@ class OpenCommissioningWindowCommand : public CHIPCommand
5750
"params if absent");
5851
}
5952

60-
void RegisterDelegate(CommissioningWindowDelegate * delegate) { mDelegate = delegate; }
61-
void UnregisterDelegate() { mDelegate = nullptr; }
62-
6353
/////////// CHIPCommand Interface /////////
6454
CHIP_ERROR RunCommand() override;
6555

@@ -71,7 +61,6 @@ class OpenCommissioningWindowCommand : public CHIPCommand
7161
NodeId mNodeId;
7262
chip::EndpointId mEndpointId;
7363
chip::Controller::CommissioningWindowOpener::CommissioningWindowOption mCommissioningWindowOption;
74-
CommissioningWindowDelegate * mDelegate = nullptr;
7564
uint16_t mCommissioningWindowTimeout;
7665
uint32_t mIteration;
7766
uint16_t mDiscriminator;

examples/fabric-admin/device_manager/DeviceManager.cpp

+30-33
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
#include <commands/interactive/InteractiveCommands.h>
2222
#include <crypto/RandUtils.h>
23+
#include <device_manager/PairingManager.h>
2324
#include <lib/support/StringBuilder.h>
2425

2526
#include <cstdio>
@@ -30,13 +31,12 @@ using namespace chip::app::Clusters;
3031

3132
namespace {
3233

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;
4040

4141
} // namespace
4242

@@ -115,37 +115,39 @@ void DeviceManager::RemoveSyncedDevice(NodeId nodeId)
115115
ChipLogValueX64(device->GetNodeId()), device->GetEndpointId());
116116
}
117117

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)
120120
{
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));
122122

123123
// 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+
}
131130
}
132131

133132
void DeviceManager::OpenRemoteDeviceCommissioningWindow(EndpointId remoteEndpointId)
134133
{
135134
// Open the commissioning window of a device from another fabric via its fabric bridge.
136135
// This method constructs and sends a command to open the commissioning window for a device
137136
// that is part of a different fabric, accessed through a fabric bridge.
138-
StringBuilder<kMaxCommandSize> commandBuilder;
139137

140138
// Use random discriminator to have less chance of collision.
141139
uint16_t discriminator =
142140
Crypto::GetRandU16() % (kMaxDiscriminatorLength + 1); // Include the upper limit kMaxDiscriminatorLength
143141

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;
147144

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+
}
149151
}
150152

151153
void DeviceManager::PairRemoteFabricBridge(chip::NodeId nodeId, uint32_t setupPINCode, const char * deviceRemoteIp,
@@ -421,6 +423,7 @@ void DeviceManager::HandleReverseOpenCommissioningWindow(TLV::TLVReader & data)
421423
{
422424
CommissionerControl::Commands::ReverseOpenCommissioningWindow::DecodableType value;
423425
CHIP_ERROR error = app::DataModel::Decode(data, value);
426+
424427
if (error != CHIP_NO_ERROR)
425428
{
426429
ChipLogError(NotSpecified, "Failed to decode command response value. Error: %" CHIP_ERROR_FORMAT, error.Format());
@@ -432,18 +435,12 @@ void DeviceManager::HandleReverseOpenCommissioningWindow(TLV::TLVReader & data)
432435
ChipLogProgress(NotSpecified, " commissioningTimeout: %u", value.commissioningTimeout);
433436
ChipLogProgress(NotSpecified, " discriminator: %u", value.discriminator);
434437
ChipLogProgress(NotSpecified, " iterations: %u", value.iterations);
438+
ChipLogProgress(NotSpecified, " PAKEPasscodeVerifier size: %lu", value.PAKEPasscodeVerifier.size());
439+
ChipLogProgress(NotSpecified, " salt size: %lu", value.salt.size());
435440

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()));
447444
}
448445

449446
void DeviceManager::HandleAttributeData(const app::ConcreteDataAttributePath & path, TLV::TLVReader & data)

examples/fabric-admin/device_manager/DeviceManager.h

+5-5
Original file line numberDiff line numberDiff line change
@@ -94,18 +94,18 @@ class DeviceManager : public PairingDelegate
9494
* This function initiates the process to open the commissioning window for a device identified by the given node ID.
9595
*
9696
* @param nodeId The ID of the node that should open the commissioning window.
97-
* @param commissioningTimeout The time in seconds before the commissioning window closes. This value determines
97+
* @param commissioningTimeoutSec The time in seconds before the commissioning window closes. This value determines
9898
* how long the commissioning window remains open for incoming connections.
9999
* @param iterations The number of PBKDF (Password-Based Key Derivation Function) iterations to use
100100
* for deriving the PAKE (Password Authenticated Key Exchange) verifier.
101101
* @param discriminator The device-specific discriminator, determined during commissioning, which helps
102102
* to uniquely identify the device among others.
103-
* @param saltHex The hexadecimal-encoded salt used in the cryptographic operations for commissioning.
104-
* @param verifierHex The hexadecimal-encoded PAKE verifier used to authenticate the commissioning process.
103+
* @param salt The salt used in the cryptographic operations for commissioning.
104+
* @param verifier The PAKE verifier used to authenticate the commissioning process.
105105
*
106106
*/
107-
void OpenDeviceCommissioningWindow(chip::NodeId nodeId, uint32_t commissioningTimeout, uint32_t iterations,
108-
uint32_t discriminator, const char * saltHex, const char * verifierHex);
107+
void OpenDeviceCommissioningWindow(chip::NodeId nodeId, uint32_t commissioningTimeoutSec, uint32_t iterations,
108+
uint16_t discriminator, const chip::ByteSpan & salt, const chip::ByteSpan & verifier);
109109

110110
/**
111111
* @brief Open the commissioning window of a device from another fabric via its fabric bridge.

0 commit comments

Comments
 (0)