Skip to content

Commit b1e29d4

Browse files
authored
Add paa-trust-store-path CLI arg in darwin framework tool (#22373)
1 parent 4fe8194 commit b1e29d4

File tree

2 files changed

+64
-7
lines changed

2 files changed

+64
-7
lines changed

examples/darwin-framework-tool/commands/common/CHIPCommandBridge.h

+16-7
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,19 @@
2828
#pragma once
2929

3030
constexpr const char kIdentityAlpha[] = "alpha";
31-
constexpr const char kIdentityBeta[] = "beta";
31+
constexpr const char kIdentityBeta[] = "beta";
3232
constexpr const char kIdentityGamma[] = "gamma";
3333

34-
class CHIPCommandBridge : public Command
35-
{
34+
class CHIPCommandBridge : public Command {
3635
public:
37-
CHIPCommandBridge(const char * commandName) : Command(commandName) { AddArgument("commissioner-name", &mCommissionerName); }
36+
CHIPCommandBridge(const char * commandName)
37+
: Command(commandName)
38+
{
39+
AddArgument("commissioner-name", &mCommissionerName);
40+
AddArgument("paa-trust-store-path", &mPaaTrustStorePath,
41+
"Path to directory holding PAA certificate information. Can be absolute or relative to the current working "
42+
"directory.");
43+
}
3844

3945
/////////// Command Interface /////////
4046
CHIP_ERROR Run() override;
@@ -100,8 +106,8 @@ class CHIPCommandBridge : public Command
100106
void RestartCommissioners();
101107

102108
private:
103-
CHIP_ERROR InitializeCommissioner(std::string key, chip::FabricId fabricId,
104-
const chip::Credentials::AttestationTrustStore * trustStore);
109+
CHIP_ERROR InitializeCommissioner(
110+
std::string key, chip::FabricId fabricId, const chip::Credentials::AttestationTrustStore * trustStore);
105111
void ShutdownCommissioner();
106112
uint16_t CurrentCommissionerIndex();
107113

@@ -113,6 +119,8 @@ class CHIPCommandBridge : public Command
113119
CHIP_ERROR MaybeSetUpStack();
114120
void MaybeTearDownStack();
115121

122+
CHIP_ERROR GetPAACertsFromFolder(NSArray<NSData *> * __autoreleasing * paaCertsResult);
123+
116124
// Our three controllers: alpha, beta, gamma.
117125
static std::map<std::string, MTRDeviceController *> mControllers;
118126

@@ -122,6 +130,7 @@ class CHIPCommandBridge : public Command
122130
std::condition_variable cvWaitingForResponse;
123131
std::mutex cvWaitingForResponseMutex;
124132
chip::Optional<char *> mCommissionerName;
125-
bool mWaitingForResponse{ true };
133+
bool mWaitingForResponse { true };
126134
static dispatch_queue_t mOTAProviderCallbackQueue;
135+
chip::Optional<char *> mPaaTrustStorePath;
127136
};

examples/darwin-framework-tool/commands/common/CHIPCommandBridge.mm

+48
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
std::map<std::string, MTRDeviceController *> CHIPCommandBridge::mControllers;
3333
dispatch_queue_t CHIPCommandBridge::mOTAProviderCallbackQueue;
3434
OTAProviderDelegate * CHIPCommandBridge::mOTADelegate;
35+
constexpr const char * kTrustStorePathVariable = "PAA_TRUST_STORE_PATH";
3536

3637
CHIPToolKeypair * gNocSigner = [[CHIPToolKeypair alloc] init];
3738

@@ -57,6 +58,48 @@
5758
return CHIP_NO_ERROR;
5859
}
5960

61+
CHIP_ERROR CHIPCommandBridge::GetPAACertsFromFolder(NSArray<NSData *> * __autoreleasing * paaCertsResult)
62+
{
63+
NSMutableArray * paaCerts = [[NSMutableArray alloc] init];
64+
65+
if (!mPaaTrustStorePath.HasValue()) {
66+
char * const trust_store_path = getenv(kTrustStorePathVariable);
67+
if (trust_store_path != nullptr) {
68+
mPaaTrustStorePath.SetValue(trust_store_path);
69+
}
70+
}
71+
if (mPaaTrustStorePath.HasValue()) {
72+
NSError * error;
73+
NSString * paaStorePath = [NSString stringWithCString:mPaaTrustStorePath.Value() encoding:NSUTF8StringEncoding];
74+
NSArray * derFolder = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:paaStorePath error:&error];
75+
if (error) {
76+
NSLog(@"Error: %@", error);
77+
return CHIP_ERROR_INTERNAL;
78+
}
79+
80+
NSArray * derFiles = [derFolder filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self ENDSWITH '.der'"]];
81+
if ([derFiles count] == 0) {
82+
NSLog(@"Unable to find DER cert files");
83+
return CHIP_ERROR_INTERNAL;
84+
}
85+
for (id derFile in derFiles) {
86+
NSString * certPath = [NSString stringWithFormat:@"%@/%@", paaStorePath, derFile];
87+
NSData * fileData = [NSData dataWithContentsOfFile:certPath];
88+
if (fileData) {
89+
[paaCerts addObject:fileData];
90+
}
91+
}
92+
} else {
93+
return CHIP_NO_ERROR;
94+
}
95+
if ([paaCerts count] == 0) {
96+
NSLog(@"Unable to find PAA certs");
97+
return CHIP_ERROR_INTERNAL;
98+
}
99+
*paaCertsResult = paaCerts;
100+
return CHIP_NO_ERROR;
101+
}
102+
60103
CHIP_ERROR CHIPCommandBridge::MaybeSetUpStack()
61104
{
62105
if (IsInteractive()) {
@@ -78,6 +121,11 @@
78121
params.port = @(kListenPort);
79122
params.startServer = YES;
80123
params.otaProviderDelegate = mOTADelegate;
124+
NSArray<NSData *> * paaCertResults;
125+
ReturnLogErrorOnFailure(GetPAACertsFromFolder(&paaCertResults));
126+
if ([paaCertResults count] > 0) {
127+
params.paaCerts = paaCertResults;
128+
}
81129

82130
if ([factory startup:params] == NO) {
83131
ChipLogError(chipTool, "Controller factory startup failed");

0 commit comments

Comments
 (0)