Skip to content

Commit da28dd6

Browse files
Enforce param values, Add mDiscriminator, Update docs
Co-authored-by: Boris Zbarsky <bzbarsky@apple.com>
1 parent b09cde6 commit da28dd6

6 files changed

+36
-39
lines changed

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

+3-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,9 @@ class OpenCommissioningWindowCommand : public CHIPCommand
4848
&mIteration, "Number of PBKDF iterations to use to derive the verifier. Ignored if 'option' is 0.");
4949
AddArgument("discriminator", 0, 4096, &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("salt", &mSalt, "Salt payload encoded in hexadecimal. Random salt will be generated if absent");
51+
AddArgument("salt", &mSalt,
52+
"Salt payload encoded in hexadecimal. Random salt will be generated if absent. "
53+
"This needs to be present if verifier is provided, corresponding to salt used for generating verifier");
5254
AddArgument("verifier", &mVerifier,
5355
"PAKE Passcode verifier encoded in hexadecimal format. Will be generated from random setup pin and other "
5456
"params if absent");

src/controller/CHIPDeviceController.h

+4-14
Original file line numberDiff line numberDiff line change
@@ -167,16 +167,6 @@ struct CommissionerInitParams : public ControllerInitParams
167167
Credentials::DeviceAttestationVerifier * deviceAttestationVerifier = nullptr;
168168
};
169169

170-
// Interface class for DeviceController methods that need to be mocked
171-
class IDeviceController
172-
{
173-
public:
174-
virtual ~IDeviceController() = default;
175-
virtual CHIP_ERROR GetConnectedDevice(NodeId peerNodeId, chip::Callback::Callback<OnDeviceConnected> * onConnection,
176-
chip::Callback::Callback<OnDeviceConnectionFailure> * onFailure,
177-
TransportPayloadCapability transportPayloadCapability) = 0;
178-
};
179-
180170
/**
181171
* @brief
182172
* Controller applications can use this class to communicate with already paired CHIP devices. The
@@ -185,7 +175,7 @@ class IDeviceController
185175
* and device pairing information for individual devices). Alternatively, this class can retrieve the
186176
* relevant information when the application tries to communicate with the device
187177
*/
188-
class DLL_EXPORT DeviceController : public AbstractDnssdDiscoveryController, IDeviceController
178+
class DLL_EXPORT DeviceController : public AbstractDnssdDiscoveryController
189179
{
190180
public:
191181
DeviceController();
@@ -253,10 +243,10 @@ class DLL_EXPORT DeviceController : public AbstractDnssdDiscoveryController, IDe
253243
* An error return from this function means that neither callback has been
254244
* called yet, and neither callback will be called in the future.
255245
*/
256-
CHIP_ERROR
246+
virtual CHIP_ERROR
257247
GetConnectedDevice(NodeId peerNodeId, Callback::Callback<OnDeviceConnected> * onConnection,
258-
chip::Callback::Callback<OnDeviceConnectionFailure> * onFailure,
259-
TransportPayloadCapability transportPayloadCapability = TransportPayloadCapability::kMRPPayload) override
248+
Callback::Callback<OnDeviceConnectionFailure> * onFailure,
249+
TransportPayloadCapability transportPayloadCapability = TransportPayloadCapability::kMRPPayload)
260250
{
261251
VerifyOrReturnError(mState == State::Initialized, CHIP_ERROR_INCORRECT_STATE);
262252
mSystemState->CASESessionMgr()->FindOrEstablishSession(ScopedNodeId(peerNodeId, GetFabricIndex()), onConnection, onFailure,

src/controller/CommissioningWindowOpener.cpp

+4-6
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,8 @@ CHIP_ERROR CommissioningWindowOpener::OpenCommissioningWindow(const Commissionin
9898
}
9999

100100
mSetupPayload.version = 0;
101-
mSetupPayload.discriminator.SetLongValue(params.GetDiscriminator());
101+
mDiscriminator.SetLongValue(params.GetDiscriminator());
102+
mSetupPayload.discriminator = mDiscriminator;
102103
mSetupPayload.rendezvousInformation.SetValue(RendezvousInformationFlag::kOnNetwork);
103104

104105
if (params.HasSalt())
@@ -156,10 +157,7 @@ CHIP_ERROR CommissioningWindowOpener::OpenCommissioningWindow(const Commissionin
156157
mCommissioningWindowTimeout = params.GetTimeout();
157158
mPBKDFIterations = params.GetIteration();
158159
mCommissioningWindowOption = CommissioningWindowOption::kTokenWithProvidedPIN;
159-
mSetupPayload = SetupPayload();
160-
mSetupPayload.version = 0;
161-
mSetupPayload.discriminator.SetLongValue(params.GetDiscriminator());
162-
mSetupPayload.rendezvousInformation.SetValue(RendezvousInformationFlag::kOnNetwork);
160+
mDiscriminator.SetLongValue(params.GetDiscriminator());
163161

164162
mNextStep = Step::kOpenCommissioningWindow;
165163

@@ -184,7 +182,7 @@ CHIP_ERROR CommissioningWindowOpener::OpenCommissioningWindowInternal(Messaging:
184182
AdministratorCommissioning::Commands::OpenCommissioningWindow::Type request;
185183
request.commissioningTimeout = mCommissioningWindowTimeout.count();
186184
request.PAKEPasscodeVerifier = serializedVerifierSpan;
187-
request.discriminator = mSetupPayload.discriminator.GetLongValue();
185+
request.discriminator = mDiscriminator.GetLongValue();
188186
request.iterations = mPBKDFIterations;
189187
request.salt = mPBKDFSalt;
190188

src/controller/CommissioningWindowOpener.h

+1
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ class CommissioningWindowOpener
164164
Callback::Callback<OnOpenCommissioningWindowWithVerifier> * mCommissioningWindowVerifierCallback = nullptr;
165165
Callback::Callback<OnOpenBasicCommissioningWindow> * mBasicCommissioningWindowCallback = nullptr;
166166
SetupPayload mSetupPayload;
167+
SetupDiscriminator mDiscriminator{};
167168
NodeId mNodeId = kUndefinedNodeId;
168169
System::Clock::Seconds16 mCommissioningWindowTimeout = System::Clock::kZero;
169170
CommissioningWindowOption mCommissioningWindowOption = CommissioningWindowOption::kOriginalSetupCode;

src/controller/CommissioningWindowParams.h

+20-16
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,11 @@ class CommissioningWindowCommonParams
4040
public:
4141
CommissioningWindowCommonParams() = default;
4242

43-
NodeId GetNodeId() const { return mNodeId; }
43+
NodeId GetNodeId() const
44+
{
45+
VerifyOrDie(mNodeId != kUndefinedNodeId);
46+
return mNodeId;
47+
}
4448
// The node identifier of device
4549
Derived & SetNodeId(NodeId nodeId)
4650
{
@@ -67,18 +71,19 @@ class CommissioningWindowCommonParams
6771
}
6872

6973
// The long discriminator for the DNS-SD advertisement.
70-
uint16_t GetDiscriminator() const { return mDiscriminator; }
74+
uint16_t GetDiscriminator() const { return mDiscriminator.Value(); }
75+
bool HasDiscriminator() const { return mDiscriminator.HasValue(); }
7176
Derived & SetDiscriminator(uint16_t discriminator)
7277
{
73-
mDiscriminator = discriminator;
78+
mDiscriminator = MakeOptional(discriminator);
7479
return static_cast<Derived &>(*this);
7580
}
7681

7782
private:
78-
NodeId mNodeId = 0;
79-
System::Clock::Seconds16 mTimeout = System::Clock::Seconds16(300);
80-
uint32_t mIteration = 1000;
81-
uint16_t mDiscriminator = 0;
83+
NodeId mNodeId = kUndefinedNodeId;
84+
System::Clock::Seconds16 mTimeout = System::Clock::Seconds16(300); // Defaulting
85+
uint32_t mIteration = 1000; // Defaulting
86+
Optional<uint16_t> mDiscriminator = NullOptional; // Using optional type to avoid picking a sentinnel in valid range
8287
};
8388

8489
class CommissioningWindowPasscodeParams : public CommissioningWindowCommonParams<CommissioningWindowPasscodeParams>
@@ -87,9 +92,8 @@ class CommissioningWindowPasscodeParams : public CommissioningWindowCommonParams
8792
CommissioningWindowPasscodeParams() = default;
8893

8994
bool HasSetupPIN() const { return mSetupPIN.HasValue(); }
90-
// Get the value of salt if present.
91-
// Returns 0 if absent, make sure to check HasSetupPIN() if a valid value is required.
92-
uint32_t GetSetupPIN() const { return mSetupPIN.ValueOr(0); }
95+
// Get the value of setup PIN (Passcode) if present, crashes otherwise.
96+
uint32_t GetSetupPIN() const { return mSetupPIN.Value(); }
9397
// The setup PIN (Passcode) to use. A random one will be generated if not provided.
9498
CommissioningWindowPasscodeParams & SetSetupPIN(uint32_t setupPIN) { return SetSetupPIN(MakeOptional(setupPIN)); }
9599
// The setup PIN (Passcode) to use. A random one will be generated if NullOptional is used.
@@ -148,21 +152,21 @@ class CommissioningWindowVerifierParams : public CommissioningWindowCommonParams
148152
public:
149153
CommissioningWindowVerifierParams() = default;
150154

151-
ByteSpan GetVerifier() const { return mVerifier; }
155+
ByteSpan GetVerifier() const { return mVerifier.Value(); }
152156
// The PAKE passcode verifier generated with enclosed iterations, salt and not-enclosed passcode.
153157
CommissioningWindowVerifierParams & SetVerifier(ByteSpan verifier)
154158
{
155-
mVerifier = verifier;
159+
mVerifier = MakeOptional(verifier);
156160
return *this;
157161
}
158162

159-
ByteSpan GetSalt() const { return mSalt; }
163+
ByteSpan GetSalt() const { return mSalt.Value(); }
160164
// The salt that was used to generate the verifier.
161165
// It must be at least kSpake2p_Min_PBKDF_Salt_Length bytes.
162166
// Note: This is REQUIRED when verifier is used
163167
CommissioningWindowVerifierParams & SetSalt(ByteSpan salt)
164168
{
165-
mSalt = salt;
169+
mSalt = MakeOptional(salt);
166170
return *this;
167171
}
168172

@@ -176,8 +180,8 @@ class CommissioningWindowVerifierParams : public CommissioningWindowCommonParams
176180
}
177181

178182
private:
179-
ByteSpan mVerifier;
180-
ByteSpan mSalt;
183+
Optional<ByteSpan> mSalt;
184+
Optional<ByteSpan> mVerifier;
181185
Callback::Callback<OnOpenCommissioningWindowWithVerifier> * mCallback = nullptr;
182186
};
183187

src/controller/tests/TestCommissioningWindowOpener.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ TEST_F(TestCommissioningWindowOpener, OpenCommissioningWindowVerifier_Success)
8282
EXPECT_EQ(err, CHIP_NO_ERROR);
8383
}
8484

85-
TEST_F(TestCommissioningWindowOpener, OpenCommissioningWindowVerifier_Failure_NoSalt)
85+
TEST_F(TestCommissioningWindowOpener, OpenCommissioningWindowVerifier_Failure_InvalidSalt)
8686
{
8787
Callback::Callback<Controller::OnOpenCommissioningWindowWithVerifier> callback(OCWVerifierCallback, this);
8888

@@ -91,12 +91,13 @@ TEST_F(TestCommissioningWindowOpener, OpenCommissioningWindowVerifier_Failure_No
9191
.SetTimeout(300)
9292
.SetIteration(sTestSpake2p01_IterationCount)
9393
.SetDiscriminator(3840)
94+
.SetSalt(ByteSpan())
9495
.SetVerifier(ByteSpan(sTestSpake2p01_SerializedVerifier))
9596
.SetCallback(&callback));
9697
EXPECT_EQ(err, CHIP_ERROR_INVALID_ARGUMENT);
9798
}
9899

99-
TEST_F(TestCommissioningWindowOpener, OpenCommissioningWindowVerifier_Failure_NoVerifier)
100+
TEST_F(TestCommissioningWindowOpener, OpenCommissioningWindowVerifier_Failure_InvalidVerifier)
100101
{
101102
Callback::Callback<Controller::OnOpenCommissioningWindowWithVerifier> callback(OCWVerifierCallback, this);
102103

@@ -106,6 +107,7 @@ TEST_F(TestCommissioningWindowOpener, OpenCommissioningWindowVerifier_Failure_No
106107
.SetIteration(sTestSpake2p01_IterationCount)
107108
.SetDiscriminator(3840)
108109
.SetSalt(ByteSpan(sTestSpake2p01_Salt))
110+
.SetVerifier(ByteSpan())
109111
.SetCallback(&callback));
110112
EXPECT_EQ(err, CHIP_ERROR_INVALID_ARGUMENT);
111113
}

0 commit comments

Comments
 (0)