24
24
25
25
using namespace ::chip;
26
26
27
- Platform::UniquePtr<chip::Controller::CommissioningWindowOpener> PairingManager::mWindowOpener ;
28
-
29
27
PairingManager::PairingManager () :
30
28
mOnOpenCommissioningWindowCallback(OnOpenCommissioningWindowResponse, this ),
31
29
mOnOpenCommissioningWindowVerifierCallback(OnOpenCommissioningWindowVerifierResponse, this )
32
30
{}
33
31
34
- CHIP_ERROR PairingManager::Init (chip:: Controller::DeviceCommissioner * commissioner)
32
+ void PairingManager::Init (Controller::DeviceCommissioner * commissioner)
35
33
{
34
+ VerifyOrDie (mCommissioner == nullptr );
36
35
mCommissioner = commissioner;
37
- return CHIP_NO_ERROR;
38
36
}
39
37
40
38
CHIP_ERROR PairingManager::OpenCommissioningWindow (NodeId nodeId, EndpointId endpointId, uint16_t commissioningTimeout,
41
39
uint32_t iterations, uint16_t discriminator, const ByteSpan & salt,
42
40
const ByteSpan & verifier)
43
41
{
44
- VerifyOrReturnError (mCommissioner != nullptr , CHIP_ERROR_INCORRECT_STATE);
42
+ if (mCommissioner == nullptr )
43
+ {
44
+ ChipLogError (NotSpecified, " Commissioner is null, cannot open commissioning window" );
45
+ return CHIP_ERROR_INCORRECT_STATE;
46
+ }
47
+
48
+ // Check if a window is already open
49
+ if (mWindowOpener != nullptr )
50
+ {
51
+ ChipLogError (NotSpecified, " A commissioning window is already open" );
52
+ return CHIP_ERROR_INCORRECT_STATE;
53
+ }
45
54
46
- auto * params = new CommissioningWindowParams ();
55
+ auto params = Platform::MakeUnique< CommissioningWindowParams> ();
47
56
params->nodeId = nodeId;
48
57
params->endpointId = endpointId;
49
58
params->commissioningWindowTimeout = commissioningTimeout;
@@ -52,96 +61,110 @@ CHIP_ERROR PairingManager::OpenCommissioningWindow(NodeId nodeId, EndpointId end
52
61
53
62
if (!salt.empty ())
54
63
{
64
+ if (salt.size () > Crypto::kSpake2p_Max_PBKDF_Salt_Length )
65
+ {
66
+ ChipLogError (NotSpecified, " Salt size exceeds buffer capacity" );
67
+ return CHIP_ERROR_BUFFER_TOO_SMALL;
68
+ }
69
+
55
70
memcpy (params->saltBuffer , salt.data (), salt.size ());
56
71
params->salt = ByteSpan (params->saltBuffer , salt.size ());
57
72
}
58
73
59
74
if (!verifier.empty ())
60
75
{
76
+ if (verifier.size () > Crypto::kSpake2p_VerifierSerialized_Length )
77
+ {
78
+ ChipLogError (NotSpecified, " Verifier size exceeds buffer capacity" );
79
+ return CHIP_ERROR_BUFFER_TOO_SMALL;
80
+ }
81
+
61
82
memcpy (params->verifierBuffer , verifier.data (), verifier.size ());
62
83
params->verifier = ByteSpan (params->verifierBuffer , verifier.size ());
63
84
}
64
85
65
86
// Schedule work on the Matter thread
66
- chip::DeviceLayer::PlatformMgr ().ScheduleWork (OnOpenCommissioningWindow, reinterpret_cast <intptr_t >(params));
67
-
68
- return CHIP_NO_ERROR;
87
+ return DeviceLayer::PlatformMgr ().ScheduleWork (OnOpenCommissioningWindow, reinterpret_cast <intptr_t >(params.release ()));
69
88
}
70
89
71
90
void PairingManager::OnOpenCommissioningWindow (intptr_t context)
72
91
{
73
- auto * params = reinterpret_cast <CommissioningWindowParams *>(context);
92
+ Platform::UniquePtr<CommissioningWindowParams> params ( reinterpret_cast <CommissioningWindowParams *>(context) );
74
93
PairingManager & self = PairingManager::Instance ();
75
94
76
95
if (self.mCommissioner == nullptr )
77
96
{
78
- ChipLogError (AppServer , " Commissioner is null, cannot open commissioning window" );
97
+ ChipLogError (NotSpecified , " Commissioner is null, cannot open commissioning window" );
79
98
return ;
80
99
}
81
100
82
- mWindowOpener = Platform::MakeUnique<Controller::CommissioningWindowOpener>(self.mCommissioner );
101
+ self. mWindowOpener = Platform::MakeUnique<Controller::CommissioningWindowOpener>(self.mCommissioner );
83
102
84
103
if (!params->verifier .empty ())
85
104
{
86
105
if (params->salt .empty ())
87
106
{
88
- ChipLogError (AppServer, " Salt is required when verifier is set" );
107
+ ChipLogError (NotSpecified, " Salt is required when verifier is set" );
108
+ self.mWindowOpener .reset ();
89
109
return ;
90
110
}
91
111
92
- CHIP_ERROR err = mWindowOpener ->OpenCommissioningWindow (Controller::CommissioningWindowVerifierParams ()
93
- .SetNodeId (params->nodeId )
94
- .SetEndpointId (params->endpointId )
95
- .SetTimeout (params->commissioningWindowTimeout )
96
- .SetIteration (params->iteration )
97
- .SetDiscriminator (params->discriminator )
98
- .SetVerifier (params->verifier )
99
- .SetSalt (params->salt )
100
- .SetCallback (&self.mOnOpenCommissioningWindowVerifierCallback ));
112
+ CHIP_ERROR err =
113
+ self.mWindowOpener ->OpenCommissioningWindow (Controller::CommissioningWindowVerifierParams ()
114
+ .SetNodeId (params->nodeId )
115
+ .SetEndpointId (params->endpointId )
116
+ .SetTimeout (params->commissioningWindowTimeout )
117
+ .SetIteration (params->iteration )
118
+ .SetDiscriminator (params->discriminator )
119
+ .SetVerifier (params->verifier )
120
+ .SetSalt (params->salt )
121
+ .SetCallback (&self.mOnOpenCommissioningWindowVerifierCallback ));
101
122
if (err != CHIP_NO_ERROR)
102
123
{
103
- ChipLogError (AppServer, " Failed to open commissioning window with verifier: %s" , ErrorStr (err));
124
+ ChipLogError (NotSpecified, " Failed to open commissioning window with verifier: %s" , ErrorStr (err));
125
+ self.mWindowOpener .reset ();
104
126
}
105
127
}
106
128
else
107
129
{
108
130
SetupPayload ignored;
109
- CHIP_ERROR err = mWindowOpener ->OpenCommissioningWindow (Controller::CommissioningWindowPasscodeParams ()
110
- .SetNodeId (params->nodeId )
111
- .SetEndpointId (params->endpointId )
112
- .SetTimeout (params->commissioningWindowTimeout )
113
- .SetIteration (params->iteration )
114
- .SetDiscriminator (params->discriminator )
115
- .SetSetupPIN (NullOptional)
116
- .SetSalt (NullOptional)
117
- .SetCallback (&self.mOnOpenCommissioningWindowCallback ),
118
- ignored);
131
+ CHIP_ERROR err = self. mWindowOpener ->OpenCommissioningWindow (Controller::CommissioningWindowPasscodeParams ()
132
+ .SetNodeId (params->nodeId )
133
+ .SetEndpointId (params->endpointId )
134
+ .SetTimeout (params->commissioningWindowTimeout )
135
+ .SetIteration (params->iteration )
136
+ .SetDiscriminator (params->discriminator )
137
+ .SetSetupPIN (NullOptional)
138
+ .SetSalt (NullOptional)
139
+ .SetCallback (&self.mOnOpenCommissioningWindowCallback ),
140
+ ignored);
119
141
if (err != CHIP_NO_ERROR)
120
142
{
121
- ChipLogError (AppServer, " Failed to open commissioning window with passcode: %s" , ErrorStr (err));
143
+ ChipLogError (NotSpecified, " Failed to open commissioning window with passcode: %s" , ErrorStr (err));
144
+ self.mWindowOpener .reset ();
122
145
}
123
146
}
124
-
125
- // Clean up params
126
- delete params;
127
147
}
128
148
129
- void PairingManager::OnOpenCommissioningWindowResponse (void * context, NodeId remoteId, CHIP_ERROR err, chip:: SetupPayload payload)
149
+ void PairingManager::OnOpenCommissioningWindowResponse (void * context, NodeId remoteId, CHIP_ERROR err, SetupPayload payload)
130
150
{
151
+ VerifyOrDie (context != nullptr );
131
152
PairingManager * self = static_cast <PairingManager *>(context);
132
153
if (self->mCommissioningWindowDelegate )
133
154
{
134
155
self->mCommissioningWindowDelegate ->OnCommissioningWindowOpened (remoteId, err, payload);
135
- self->UnregisterOpenCommissioningWindowDelegate ( );
156
+ self->SetOpenCommissioningWindowDelegate ( nullptr );
136
157
}
137
158
138
159
OnOpenCommissioningWindowVerifierResponse (context, remoteId, err);
139
160
}
140
161
141
162
void PairingManager::OnOpenCommissioningWindowVerifierResponse (void * context, NodeId remoteId, CHIP_ERROR err)
142
163
{
164
+ VerifyOrDie (context != nullptr );
165
+ PairingManager * self = static_cast <PairingManager *>(context);
143
166
LogErrorOnFailure (err);
144
167
145
- PairingManager * self = reinterpret_cast <PairingManager *>(context);
146
- VerifyOrReturn ( self != nullptr , ChipLogError (NotSpecified, " OnOpenCommissioningWindowCommand: context is null " ) );
168
+ // Reset the window opener once the window operation is complete
169
+ self-> mWindowOpener . reset ( );
147
170
}
0 commit comments