Skip to content

Commit d15be4c

Browse files
Make sure MTRDeviceControllerStartupParams initWithParams actually copies all the fields. (#24605)
Also fixes the error propagation in DeviceCommissioner::OnDeviceNOCChainGeneration to not override the provided error status.
1 parent 8f4dcee commit d15be4c

File tree

5 files changed

+180
-3
lines changed

5 files changed

+180
-3
lines changed

src/controller/CHIPDeviceController.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -1248,14 +1248,14 @@ void DeviceCommissioner::OnDeviceNOCChainGeneration(void * context, CHIP_ERROR s
12481248
// The placeholder IPK is not satisfactory, but is there to fill the NocChain struct on error. It will still fail.
12491249
const uint8_t placeHolderIpk[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12501250
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
1251-
if (!ipk.HasValue())
1251+
if (status == CHIP_NO_ERROR && !ipk.HasValue())
12521252
{
12531253
ChipLogError(Controller, "Did not have an IPK from the OperationalCredentialsIssuer! Cannot commission.");
12541254
status = CHIP_ERROR_INVALID_ARGUMENT;
12551255
}
12561256

12571257
ChipLogProgress(Controller, "Received callback from the CA for NOC Chain generation. Status %s", ErrorStr(status));
1258-
if (commissioner->mState != State::Initialized)
1258+
if (status == CHIP_NO_ERROR && commissioner->mState != State::Initialized)
12591259
{
12601260
status = CHIP_ERROR_INCORRECT_STATE;
12611261
}

src/darwin/Framework/CHIP/MTRDeviceControllerStartupParams.mm

+2
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,8 @@ - (instancetype)initWithParams:(MTRDeviceControllerStartupParams *)params
102102
_intermediateCertificate = params.intermediateCertificate;
103103
_operationalCertificate = params.operationalCertificate;
104104
_operationalKeypair = params.operationalKeypair;
105+
_operationalCertificateIssuer = params.operationalCertificateIssuer;
106+
_operationalCertificateIssuerQueue = params.operationalCertificateIssuerQueue;
105107

106108
return self;
107109
}

src/darwin/Framework/CHIPTests/MTRDeviceTests.m

+1-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ - (void)controller:(MTRDeviceController *)controller commissioningSessionEstabli
104104
error:&commissionError];
105105
XCTAssertNil(commissionError);
106106

107-
// Keep waiting for controller:MTRXPCListenerSampleTests.mcommissioningComplete
107+
// Keep waiting for controller:commissioningComplete:
108108
}
109109

110110
- (void)controller:(MTRDeviceController *)controller commissioningComplete:(NSError *)error
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
/*
2+
* Copyright (c) 2023 Project CHIP Authors
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
// module headers
18+
#import <Matter/Matter.h>
19+
20+
#import "MTRErrorTestUtils.h"
21+
#import "MTRTestKeys.h"
22+
#import "MTRTestStorage.h"
23+
24+
// system dependencies
25+
#import <XCTest/XCTest.h>
26+
27+
static const uint16_t kPairingTimeoutInSeconds = 10;
28+
static const uint64_t kDeviceId = 0x12344321;
29+
static NSString * kOnboardingPayload = @"MT:-24J0AFN00KA0648G00";
30+
static const uint16_t kLocalPort = 5541;
31+
static const uint16_t kTestVendorId = 0xFFF1u;
32+
33+
// Singleton controller we use.
34+
static MTRDeviceController * sController = nil;
35+
36+
// Keys we can use to restart the controller.
37+
static MTRTestKeys * sTestKeys = nil;
38+
39+
@interface MTROperationalCertificateIssureTestDeviceControllerDelegate : NSObject <MTRDeviceControllerDelegate>
40+
@property (nonatomic, strong) XCTestExpectation * expectation;
41+
@end
42+
43+
@implementation MTROperationalCertificateIssureTestDeviceControllerDelegate
44+
- (id)initWithExpectation:(XCTestExpectation *)expectation
45+
{
46+
self = [super init];
47+
if (self) {
48+
_expectation = expectation;
49+
}
50+
return self;
51+
}
52+
53+
- (void)controller:(MTRDeviceController *)controller commissioningSessionEstablishmentDone:(NSError *)error
54+
{
55+
XCTAssertEqual(error.code, 0);
56+
57+
NSError * commissionError = nil;
58+
[sController commissionNodeWithID:@(kDeviceId)
59+
commissioningParams:[[MTRCommissioningParameters alloc] init]
60+
error:&commissionError];
61+
XCTAssertNil(commissionError);
62+
63+
// Keep waiting for controller:commissioningComplete:
64+
}
65+
66+
- (void)controller:(MTRDeviceController *)controller commissioningComplete:(NSError *)error
67+
{
68+
XCTAssertNotNil(error);
69+
XCTAssertEqual(error.domain, MTRErrorDomain);
70+
XCTAssertEqual(error.code, MTRErrorCodeIntegrityCheckFailed);
71+
[_expectation fulfill];
72+
_expectation = nil;
73+
}
74+
75+
@end
76+
77+
@interface OperationalCertificateIssuer : NSObject <MTROperationalCertificateIssuer>
78+
@property (nonatomic, readonly) BOOL shouldSkipAttestationCertificateValidation;
79+
@end
80+
81+
@implementation OperationalCertificateIssuer
82+
83+
- (instancetype)init
84+
{
85+
if (self = [super init]) {
86+
_shouldSkipAttestationCertificateValidation = NO;
87+
}
88+
return self;
89+
}
90+
91+
- (void)issueOperationalCertificateForRequest:(MTROperationalCSRInfo *)csrInfo
92+
attestationInfo:(MTRAttestationInfo *)attestationInfo
93+
controller:(MTRDeviceController *)controller
94+
completion:(MTROperationalCertificateIssuedHandler)completion
95+
{
96+
XCTAssertNotNil(csrInfo);
97+
XCTAssertNotNil(attestationInfo);
98+
XCTAssertEqual(controller, sController);
99+
100+
completion(nil, [NSError errorWithDomain:MTRErrorDomain code:MTRErrorCodeIntegrityCheckFailed userInfo:nil]);
101+
}
102+
103+
@end
104+
105+
@interface MTROperationalCertificateIssuerTests : XCTestCase
106+
@end
107+
108+
@implementation MTROperationalCertificateIssuerTests
109+
110+
- (void)setUp
111+
{
112+
[super setUp];
113+
[self setContinueAfterFailure:NO];
114+
}
115+
116+
- (void)testFailedCertificateIssuance
117+
{
118+
XCTestExpectation * expectation = [self expectationWithDescription:@"Pairing Complete"];
119+
120+
__auto_type * factory = [MTRDeviceControllerFactory sharedInstance];
121+
XCTAssertNotNil(factory);
122+
123+
__auto_type * storage = [[MTRTestStorage alloc] init];
124+
__auto_type * factoryParams = [[MTRDeviceControllerFactoryParams alloc] initWithStorage:storage];
125+
factoryParams.port = @(kLocalPort);
126+
127+
BOOL ok = [factory startControllerFactory:factoryParams error:nil];
128+
XCTAssertTrue(ok);
129+
130+
__auto_type * testKeys = [[MTRTestKeys alloc] init];
131+
XCTAssertNotNil(testKeys);
132+
133+
sTestKeys = testKeys;
134+
135+
__auto_type * certificateIssuer = [[OperationalCertificateIssuer alloc] init];
136+
137+
// Needs to match what startControllerOnExistingFabric calls elsewhere in
138+
// this file do.
139+
__auto_type * params = [[MTRDeviceControllerStartupParams alloc] initWithIPK:testKeys.ipk fabricID:@(1) nocSigner:testKeys];
140+
params.vendorID = @(kTestVendorId);
141+
params.operationalCertificateIssuer = certificateIssuer;
142+
params.operationalCertificateIssuerQueue = dispatch_get_main_queue();
143+
144+
MTRDeviceController * controller = [factory createControllerOnNewFabric:params error:nil];
145+
XCTAssertNotNil(controller);
146+
147+
sController = controller;
148+
149+
__auto_type * deviceControllerDelegate =
150+
[[MTROperationalCertificateIssureTestDeviceControllerDelegate alloc] initWithExpectation:expectation];
151+
dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.device_controller_delegate", DISPATCH_QUEUE_SERIAL);
152+
153+
[controller setDeviceControllerDelegate:deviceControllerDelegate queue:callbackQueue];
154+
155+
NSError * error;
156+
__auto_type * payload = [MTRSetupPayload setupPayloadWithOnboardingPayload:kOnboardingPayload error:&error];
157+
XCTAssertNotNil(payload);
158+
XCTAssertNil(error);
159+
160+
[controller setupCommissioningSessionWithPayload:payload newNodeID:@(kDeviceId) error:&error];
161+
XCTAssertNil(error);
162+
163+
[self waitForExpectationsWithTimeout:kPairingTimeoutInSeconds handler:nil];
164+
165+
[controller shutdown];
166+
XCTAssertFalse([controller isRunning]);
167+
168+
[factory stopControllerFactory];
169+
}
170+
171+
@end

src/darwin/Framework/Matter.xcodeproj/project.pbxproj

+4
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
3DECCB742934C21B00585AEC /* MTRDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = 3DECCB732934C21B00585AEC /* MTRDefines.h */; settings = {ATTRIBUTES = (Public, ); }; };
5151
3DFCB32C29678C9500332B35 /* MTRConversion.h in Headers */ = {isa = PBXBuildFile; fileRef = 3DFCB32B29678C9500332B35 /* MTRConversion.h */; };
5252
51029DF6293AA6100087AFB0 /* MTROperationalCertificateIssuer.mm in Sources */ = {isa = PBXBuildFile; fileRef = 51029DF5293AA6100087AFB0 /* MTROperationalCertificateIssuer.mm */; };
53+
510CECA8297F72970064E0B3 /* MTROperationalCertificateIssuerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 510CECA6297F72470064E0B3 /* MTROperationalCertificateIssuerTests.m */; };
5354
511913FB28C100EF009235E9 /* MTRBaseSubscriptionCallback.mm in Sources */ = {isa = PBXBuildFile; fileRef = 511913F928C100EF009235E9 /* MTRBaseSubscriptionCallback.mm */; };
5455
511913FC28C100EF009235E9 /* MTRBaseSubscriptionCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = 511913FA28C100EF009235E9 /* MTRBaseSubscriptionCallback.h */; };
5556
5129BCFD26A9EE3300122DDF /* MTRError.h in Headers */ = {isa = PBXBuildFile; fileRef = 5129BCFC26A9EE3300122DDF /* MTRError.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -239,6 +240,7 @@
239240
3DECCB732934C21B00585AEC /* MTRDefines.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTRDefines.h; sourceTree = "<group>"; };
240241
3DFCB32B29678C9500332B35 /* MTRConversion.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTRConversion.h; sourceTree = "<group>"; };
241242
51029DF5293AA6100087AFB0 /* MTROperationalCertificateIssuer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MTROperationalCertificateIssuer.mm; sourceTree = "<group>"; };
243+
510CECA6297F72470064E0B3 /* MTROperationalCertificateIssuerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTROperationalCertificateIssuerTests.m; sourceTree = "<group>"; };
242244
511913F928C100EF009235E9 /* MTRBaseSubscriptionCallback.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MTRBaseSubscriptionCallback.mm; sourceTree = "<group>"; };
243245
511913FA28C100EF009235E9 /* MTRBaseSubscriptionCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTRBaseSubscriptionCallback.h; sourceTree = "<group>"; };
244246
5129BCFC26A9EE3300122DDF /* MTRError.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTRError.h; sourceTree = "<group>"; };
@@ -607,6 +609,7 @@
607609
517BF3F2282B62CB00A8B7DB /* MTRCertificateTests.m */,
608610
7596A8502878709F004DAE0E /* MTRAsyncCallbackQueueTests.m */,
609611
51669AEF2913204400F4AA36 /* MTRBackwardsCompatTests.m */,
612+
510CECA6297F72470064E0B3 /* MTROperationalCertificateIssuerTests.m */,
610613
B202529D2459E34F00F97062 /* Info.plist */,
611614
);
612615
path = CHIPTests;
@@ -891,6 +894,7 @@
891894
1E5801C328941C050033A199 /* MTRTestOTAProvider.m in Sources */,
892895
5A6FEC9D27B5E48900F25F42 /* MTRXPCProtocolTests.m in Sources */,
893896
5AE6D4E427A99041001F2493 /* MTRDeviceTests.m in Sources */,
897+
510CECA8297F72970064E0B3 /* MTROperationalCertificateIssuerTests.m in Sources */,
894898
5A7947DE27BEC3F500434CF2 /* MTRXPCListenerSampleTests.m in Sources */,
895899
B2F53AF2245B0DCF0010745E /* MTRSetupPayloadParserTests.m in Sources */,
896900
517BF3F3282B62CB00A8B7DB /* MTRCertificateTests.m in Sources */,

0 commit comments

Comments
 (0)