Skip to content

Commit 1672d94

Browse files
committed
Update RPC, pass OCW params between fabric bridge and admin
1 parent 38ac73b commit 1672d94

File tree

10 files changed

+91
-20
lines changed

10 files changed

+91
-20
lines changed

examples/common/pigweed/BUILD.gn

+1
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ pw_proto_library("button_service") {
8282

8383
pw_proto_library("fabric_admin_service") {
8484
sources = [ "protos/fabric_admin_service.proto" ]
85+
inputs = [ "protos/fabric_admin_service.options" ]
8586
deps = [ "$dir_pw_protobuf:common_protos" ]
8687
strip_prefix = "protos"
8788
prefix = "fabric_admin_service"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
chip.rpc.DeviceCommissioningWindowInfo.verifier max_size:97 // kSpake2p_VerifierSerialized_Length
2+
chip.rpc.DeviceCommissioningWindowInfo.salt max_size:32 // kSpake2p_Max_PBKDF_Salt_Length

examples/common/pigweed/protos/fabric_admin_service.proto

+7-3
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,13 @@ import 'pw_protobuf_protos/common.proto';
55
package chip.rpc;
66

77
// Define the message for a synchronized end device with necessary fields
8-
message DeviceInfo {
8+
message DeviceCommissioningWindowInfo {
99
uint64 node_id = 1;
10+
uint32 commissioning_timeout = 2;
11+
uint32 discriminator = 3;
12+
uint32 iterations = 4;
13+
bytes salt = 5;
14+
bytes verifier = 6;
1015
}
1116

1217
// Define the response message to convey the status of the operation
@@ -15,6 +20,5 @@ message OperationStatus {
1520
}
1621

1722
service FabricAdmin {
18-
rpc OpenCommissioningWindow(DeviceInfo) returns (OperationStatus){}
23+
rpc OpenCommissioningWindow(DeviceCommissioningWindowInfo) returns (OperationStatus){}
1924
}
20-

examples/common/pigweed/rpc_services/FabricAdmin.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ class FabricAdmin : public pw_rpc::nanopb::FabricAdmin::Service<FabricAdmin>
3434
public:
3535
virtual ~FabricAdmin() = default;
3636

37-
virtual pw::Status OpenCommissioningWindow(const chip_rpc_DeviceInfo & request, chip_rpc_OperationStatus & response)
37+
virtual pw::Status OpenCommissioningWindow(const chip_rpc_DeviceCommissioningWindowInfo & request,
38+
chip_rpc_OperationStatus & response)
3839
{
3940
return pw::Status::Unimplemented();
4041
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ CHIP_ERROR OpenCommissioningWindowCommand::RunCommand()
3535
{
3636
SetupPayload ignored;
3737
return mWindowOpener->OpenCommissioningWindow(mNodeId, System::Clock::Seconds16(mCommissioningWindowTimeout), mIteration,
38-
mDiscriminator, NullOptional, NullOptional, NullOptional,
38+
mDiscriminator, NullOptional, mSalt, mVerifier,
3939
&mOnOpenCommissioningWindowCallback, ignored,
4040
/* readVIDPIDAttributes */ true);
4141
}

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

+6
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ class OpenCommissioningWindowCommand : public CHIPCommand
4747
&mIteration, "Number of PBKDF iterations to use to derive the verifier. Ignored if 'option' is 0.");
4848
AddArgument("discriminator", 0, 4096, &mDiscriminator, "Discriminator to use for advertising. Ignored if 'option' is 0.");
4949
AddArgument("timeout", 0, UINT16_MAX, &mTimeout, "Time, in seconds, before this command is considered to have timed out.");
50+
AddArgument("salt", &mSalt, "Salt payload encoded in hexadecimal. Random salt will be generated if absent");
51+
AddArgument("verifier", &mVerifier,
52+
"PAKE Passcode verifier encoded in hexadecimal format. Will be generated from random setup pin and other "
53+
"params if absent");
5054
}
5155

5256
void RegisterDelegate(CommissioningWindowDelegate * delegate) { mDelegate = delegate; }
@@ -69,6 +73,8 @@ class OpenCommissioningWindowCommand : public CHIPCommand
6973
uint16_t mDiscriminator;
7074

7175
chip::Optional<uint16_t> mTimeout;
76+
chip::Optional<chip::ByteSpan> mSalt;
77+
chip::Optional<chip::ByteSpan> mVerifier;
7278

7379
chip::Platform::UniquePtr<chip::Controller::CommissioningWindowOpener> mWindowOpener;
7480

examples/fabric-admin/rpc/RpcServer.cpp

+18-5
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,27 @@ namespace {
3737
class FabricAdmin final : public rpc::FabricAdmin
3838
{
3939
public:
40-
pw::Status OpenCommissioningWindow(const chip_rpc_DeviceInfo & request, chip_rpc_OperationStatus & response) override
40+
pw::Status OpenCommissioningWindow(const chip_rpc_DeviceCommissioningWindowInfo & request,
41+
chip_rpc_OperationStatus & response) override
4142
{
42-
NodeId nodeId = request.node_id;
43+
NodeId nodeId = request.node_id;
44+
uint32_t commissioningTimeout = request.commissioning_timeout;
45+
uint32_t iterations = request.iterations;
46+
uint32_t discriminator = request.discriminator;
47+
48+
char saltHex[Crypto::kSpake2p_Max_PBKDF_Salt_Length * 2 + 1];
49+
Encoding::BytesToHex(request.salt.bytes, request.salt.size, saltHex, sizeof(saltHex), Encoding::HexFlags::kNullTerminate);
50+
51+
char verifierHex[Crypto::kSpake2p_VerifierSerialized_Length * 2 + 1];
52+
Encoding::BytesToHex(request.verifier.bytes, request.verifier.size, verifierHex, sizeof(verifierHex),
53+
Encoding::HexFlags::kNullTerminate);
54+
4355
ChipLogProgress(NotSpecified, "Received OpenCommissioningWindow request: 0x%lx", nodeId);
4456

45-
char command[64];
46-
snprintf(command, sizeof(command), "pairing open-commissioning-window %ld %d %d %d %d %d", nodeId, kRootEndpointId,
47-
kEnhancedCommissioningMethod, kWindowTimeout, kIteration, kDiscriminator);
57+
char command[512];
58+
snprintf(command, sizeof(command), "pairing open-commissioning-window %ld %d %d %d %d %d --salt hex:%s --verifier hex:%s",
59+
nodeId, kRootEndpointId, kEnhancedCommissioningMethod, commissioningTimeout, iterations, discriminator, saltHex,
60+
verifierHex);
4861

4962
PushCommand(command);
5063

examples/fabric-bridge-app/linux/RpcClient.cpp

+27-3
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ CHIP_ERROR InitRpcClient(uint16_t rpcServerPort)
6363
return rpc::client::StartPacketProcessing();
6464
}
6565

66-
CHIP_ERROR OpenCommissioningWindow(NodeId nodeId)
66+
CHIP_ERROR OpenCommissioningWindow(NodeId nodeId, uint16_t commissioningTimeout, uint16_t discriminator, uint32_t iterations,
67+
chip::Optional<chip::ByteSpan> salt, chip::Optional<chip::ByteSpan> verifier)
6768
{
6869
ChipLogProgress(NotSpecified, "OpenCommissioningWindow with Node Id 0x:" ChipLogFormatX64, ChipLogValueX64(nodeId));
6970

@@ -73,8 +74,31 @@ CHIP_ERROR OpenCommissioningWindow(NodeId nodeId)
7374
return CHIP_ERROR_BUSY;
7475
}
7576

76-
chip_rpc_DeviceInfo device;
77-
device.node_id = nodeId;
77+
chip_rpc_DeviceCommissioningWindowInfo device;
78+
device.node_id = nodeId;
79+
device.commissioning_timeout = commissioningTimeout;
80+
device.discriminator = discriminator;
81+
device.iterations = iterations;
82+
83+
if (salt.HasValue())
84+
{
85+
if (salt.Value().size() > sizeof(device.salt.bytes))
86+
{
87+
return CHIP_ERROR_INTERNAL;
88+
}
89+
memcpy(device.salt.bytes, salt.Value().data(), salt.Value().size());
90+
device.salt.size = static_cast<size_t>(salt.Value().size());
91+
}
92+
93+
if (verifier.HasValue())
94+
{
95+
if (verifier.Value().size() > sizeof(device.verifier.bytes))
96+
{
97+
return CHIP_ERROR_INTERNAL;
98+
}
99+
memcpy(device.verifier.bytes, verifier.Value().data(), verifier.Value().size());
100+
device.verifier.size = static_cast<size_t>(verifier.Value().size());
101+
}
78102

79103
// The RPC will remain active as long as `openCommissioningWindowCall` is alive.
80104
openCommissioningWindowCall = fabricAdminClient.OpenCommissioningWindow(device, OnOpenCommissioningWindowCompleted);

examples/fabric-bridge-app/linux/include/RpcClient.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,5 @@ CHIP_ERROR InitRpcClient(uint16_t rpcServerPort);
4141
* - CHIP_ERROR_BUSY: Another commissioning window is currently in progress.
4242
* - CHIP_ERROR_INTERNAL: An internal error occurred.
4343
*/
44-
CHIP_ERROR OpenCommissioningWindow(chip::NodeId nodeId);
44+
CHIP_ERROR OpenCommissioningWindow(chip::NodeId nodeId, uint16_t commissioningTimeout, uint16_t discriminator, uint32_t iterations,
45+
chip::Optional<chip::ByteSpan> salt, chip::Optional<chip::ByteSpan> verifier);

examples/fabric-bridge-app/linux/main.cpp

+25-6
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ void BridgePollingThread()
7474
#if defined(PW_RPC_FABRIC_BRIDGE_SERVICE) && PW_RPC_FABRIC_BRIDGE_SERVICE
7575
else if (ch == 'o')
7676
{
77-
CHIP_ERROR err = OpenCommissioningWindow(0x1234);
77+
CHIP_ERROR err = OpenCommissioningWindow(0x1234, 300, 3840, 1000, chip::NullOptional, chip::NullOptional);
7878
if (err != CHIP_NO_ERROR)
7979
{
8080
ChipLogError(NotSpecified, "Failed to call OpenCommissioningWindow RPC: %" CHIP_ERROR_FORMAT, err.Format());
@@ -129,26 +129,45 @@ void AdministratorCommissioningCommandHandler::InvokeCommand(HandlerContext & ha
129129
}
130130

131131
handlerContext.SetCommandHandled();
132-
Status status = Status::Success;
132+
133+
uint16_t commissioningTimeout;
134+
uint16_t discriminator;
135+
uint32_t iterations;
136+
chip::Optional<chip::ByteSpan> salt;
137+
chip::Optional<chip::ByteSpan> verifier;
138+
Device * device = nullptr;
139+
Status status = Status::Failure;
140+
141+
Commands::OpenCommissioningWindow::DecodableType commandData;
142+
CHIP_ERROR tlvError = DataModel::Decode(handlerContext.mPayload, commandData);
143+
SuccessOrExit(tlvError);
144+
145+
commissioningTimeout = commandData.commissioningTimeout;
146+
discriminator = commandData.discriminator;
147+
iterations = commandData.iterations;
148+
salt = chip::Optional<chip::ByteSpan>(commandData.salt);
149+
verifier = chip::Optional<chip::ByteSpan>(commandData.PAKEPasscodeVerifier);
133150

134151
#if defined(PW_RPC_FABRIC_BRIDGE_SERVICE) && PW_RPC_FABRIC_BRIDGE_SERVICE
135-
Device * device = DeviceMgr().GetDevice(endpointId);
152+
device = DeviceMgr().GetDevice(endpointId);
136153

137154
// TODO: issues:#33784, need to make OpenCommissioningWindow synchronous
138-
if (device != nullptr && OpenCommissioningWindow(device->GetNodeId()) == CHIP_NO_ERROR)
155+
if (device != nullptr &&
156+
OpenCommissioningWindow(device->GetNodeId(), commissioningTimeout, discriminator, iterations, salt, verifier) ==
157+
CHIP_NO_ERROR)
139158
{
140159
ChipLogProgress(NotSpecified, "Commissioning window is now open");
160+
status = Status::Success;
141161
}
142162
else
143163
{
144-
status = Status::Failure;
145164
ChipLogProgress(NotSpecified, "Commissioning window is failed to open");
146165
}
147166
#else
148-
status = Status::Failure;
149167
ChipLogProgress(NotSpecified, "Commissioning window failed to open: PW_RPC_FABRIC_BRIDGE_SERVICE not defined");
150168
#endif // defined(PW_RPC_FABRIC_BRIDGE_SERVICE) && PW_RPC_FABRIC_BRIDGE_SERVICE
151169

170+
exit:
152171
handlerContext.mCommandHandler.AddStatus(handlerContext.mRequestPath, status);
153172
}
154173

0 commit comments

Comments
 (0)