Skip to content

Commit 8d44e77

Browse files
OpenDeviceCommissioningWindow verifies fabric index is what we expect (project-chip#36179)
* OpenDeviceCommissioningWindow verifies fabric index is what we expect * Restyled by clang-format --------- Co-authored-by: Restyled.io <commits@restyled.io>
1 parent 1eaa4b9 commit 8d44e77

File tree

3 files changed

+18
-13
lines changed

3 files changed

+18
-13
lines changed

examples/fabric-admin/device_manager/DeviceManager.cpp

+11-5
Original file line numberDiff line numberDiff line change
@@ -117,14 +117,19 @@ void DeviceManager::RemoveSyncedDevice(NodeId nodeId)
117117
ChipLogValueX64(device->GetNodeId()), device->GetEndpointId());
118118
}
119119

120-
void DeviceManager::OpenDeviceCommissioningWindow(NodeId nodeId, uint32_t iterations, uint16_t commissioningTimeoutSec,
120+
void DeviceManager::OpenDeviceCommissioningWindow(ScopedNodeId scopedNodeId, uint32_t iterations, uint16_t commissioningTimeoutSec,
121121
uint16_t discriminator, const ByteSpan & salt, const ByteSpan & verifier)
122122
{
123-
ChipLogProgress(NotSpecified, "Opening commissioning window for Node ID: " ChipLogFormatX64, ChipLogValueX64(nodeId));
123+
// PairingManager isn't currently capable of OpenCommissioningWindow on a device of a fabric that it doesn't have
124+
// the controller for. Currently no implementation need this functionality, but should they need it they will hit
125+
// the verify or die below and it will be the responsiblity of whoever requires that functionality to implement.
126+
VerifyOrDie(PairingManager::Instance().CurrentCommissioner().GetFabricIndex() == scopedNodeId.GetFabricIndex());
127+
ChipLogProgress(NotSpecified, "Opening commissioning window for Node ID: " ChipLogFormatX64,
128+
ChipLogValueX64(scopedNodeId.GetNodeId()));
124129

125130
// Open the commissioning window of a device within its own fabric.
126-
CHIP_ERROR err = PairingManager::Instance().OpenCommissioningWindow(nodeId, kRootEndpointId, commissioningTimeoutSec,
127-
iterations, discriminator, salt, verifier);
131+
CHIP_ERROR err = PairingManager::Instance().OpenCommissioningWindow(
132+
scopedNodeId.GetNodeId(), kRootEndpointId, commissioningTimeoutSec, iterations, discriminator, salt, verifier);
128133
if (err != CHIP_NO_ERROR)
129134
{
130135
ChipLogError(NotSpecified, "Failed to open commissioning window: %s", ErrorStr(err));
@@ -412,7 +417,8 @@ void DeviceManager::HandleReverseOpenCommissioningWindow(TLV::TLVReader & data)
412417
ChipLogProgress(NotSpecified, " PAKEPasscodeVerifier size: %lu", value.PAKEPasscodeVerifier.size());
413418
ChipLogProgress(NotSpecified, " salt size: %lu", value.salt.size());
414419

415-
OpenDeviceCommissioningWindow(mLocalBridgeNodeId, value.iterations, value.commissioningTimeout, value.discriminator,
420+
ScopedNodeId scopedNodeId(mLocalBridgeNodeId, PairingManager::Instance().CurrentCommissioner().GetFabricIndex());
421+
OpenDeviceCommissioningWindow(scopedNodeId, value.iterations, value.commissioningTimeout, value.discriminator,
416422
ByteSpan(value.salt.data(), value.salt.size()),
417423
ByteSpan(value.PAKEPasscodeVerifier.data(), value.PAKEPasscodeVerifier.size()));
418424
}

examples/fabric-admin/device_manager/DeviceManager.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ class DeviceManager : public PairingDelegate
9191
*
9292
* This function initiates the process to open the commissioning window for a device identified by the given node ID.
9393
*
94-
* @param nodeId The ID of the node that should open the commissioning window.
94+
* @param scopedNodeId The scoped node ID of the device that should open the commissioning window.
9595
* @param iterations The number of PBKDF (Password-Based Key Derivation Function) iterations to use
9696
* for deriving the PAKE (Password Authenticated Key Exchange) verifier.
9797
* @param commissioningTimeoutSec The time in seconds before the commissioning window closes. This value determines
@@ -102,7 +102,7 @@ class DeviceManager : public PairingDelegate
102102
* @param verifier The PAKE verifier used to authenticate the commissioning process.
103103
*
104104
*/
105-
void OpenDeviceCommissioningWindow(chip::NodeId nodeId, uint32_t iterations, uint16_t commissioningTimeoutSec,
105+
void OpenDeviceCommissioningWindow(chip::ScopedNodeId scopedNodeId, uint32_t iterations, uint16_t commissioningTimeoutSec,
106106
uint16_t discriminator, const chip::ByteSpan & salt, const chip::ByteSpan & verifier);
107107

108108
/**

examples/fabric-admin/rpc/RpcServer.cpp

+5-6
Original file line numberDiff line numberDiff line change
@@ -98,20 +98,19 @@ class FabricAdmin final : public rpc::FabricAdmin, public IcdManager::Delegate
9898
chip_rpc_OperationStatus & response) override
9999
{
100100
VerifyOrReturnValue(request.has_id, pw::Status::InvalidArgument());
101-
// TODO(#35875): OpenDeviceCommissioningWindow uses the same controller every time and doesn't currently accept
102-
// FabricIndex. For now we are dropping fabric index from the scoped node id.
103-
NodeId nodeId = request.id.node_id;
101+
ScopedNodeId scopedNodeId(request.id.node_id, request.id.fabric_index);
104102
uint32_t iterations = request.iterations;
105103
uint16_t discriminator = request.discriminator;
106104
uint16_t commissioningTimeoutSec = static_cast<uint16_t>(request.commissioning_timeout);
107105

108106
// Log the request details for debugging
109107
ChipLogProgress(NotSpecified,
110-
"Received OpenCommissioningWindow request: NodeId 0x%lx, Timeout: %u, Iterations: %u, Discriminator: %u",
111-
static_cast<unsigned long>(nodeId), commissioningTimeoutSec, iterations, discriminator);
108+
"Received OpenCommissioningWindow request: NodeId " ChipLogFormatX64
109+
", Timeout: %u, Iterations: %u, Discriminator: %u",
110+
ChipLogValueX64(scopedNodeId.GetNodeId()), commissioningTimeoutSec, iterations, discriminator);
112111

113112
// Open the device commissioning window using raw binary data for salt and verifier
114-
DeviceMgr().OpenDeviceCommissioningWindow(nodeId, iterations, commissioningTimeoutSec, discriminator,
113+
DeviceMgr().OpenDeviceCommissioningWindow(scopedNodeId, iterations, commissioningTimeoutSec, discriminator,
115114
ByteSpan(request.salt.bytes, request.salt.size),
116115
ByteSpan(request.verifier.bytes, request.verifier.size));
117116

0 commit comments

Comments
 (0)