@@ -102,7 +102,8 @@ def gen_test_certs(chip_cert_exe: str,
102
102
generate_cd : bool = False ,
103
103
cd_type : int = 1 ,
104
104
paa_cert_path : str = None ,
105
- paa_key_path : str = None ):
105
+ paa_key_path : str = None ,
106
+ generate_all_certs : bool = False ):
106
107
"""
107
108
Generate Matter certificates according to given Vendor ID and Product ID using the chip-cert executable.
108
109
To use own Product Attestation Authority certificate provide paa_cert_path and paa_key_path arguments.
@@ -120,6 +121,7 @@ def gen_test_certs(chip_cert_exe: str,
120
121
/credentials/test/attestation directory.
121
122
paa_key_path (str, optional): provide PAA key path. Defaults to None - a path will be set to
122
123
/credentials/test/attestation directory.
124
+ generate_all_certs: Generate the new DAC and PAI certificates
123
125
124
126
Returns:
125
127
dictionary: ["PAI_CERT": (str)<path to PAI cert .der file>,
@@ -136,9 +138,10 @@ def gen_test_certs(chip_cert_exe: str,
136
138
137
139
attestation_certs = namedtuple ("attestation_certs" , ["dac_cert" , "dac_key" , "pai_cert" ])
138
140
139
- log .info ("Generating new certificates using chip-cert..." )
140
-
141
141
if generate_cd :
142
+
143
+ log .info ("Generating new Certification Declaration using chip-cert..." )
144
+
142
145
# generate Certification Declaration
143
146
cmd = [chip_cert_exe , "gen-cd" ,
144
147
"--key" , CD_KEY_PATH ,
@@ -162,47 +165,52 @@ def gen_test_certs(chip_cert_exe: str,
162
165
"DAC_KEY" : output + "/DAC_key"
163
166
}
164
167
165
- # generate PAI
166
- cmd = [chip_cert_exe , "gen-att-cert" ,
167
- "-t" , "i" ,
168
- "-c" , device_name ,
169
- "-V" , hex (vendor_id ),
170
- "-C" , PAA_PATH ,
171
- "-K" , PAA_KEY_PATH ,
172
- "-o" , new_certificates ["PAI_CERT" ] + ".pem" ,
173
- "-O" , new_certificates ["PAI_KEY" ] + ".pem" ,
174
- "-l" , str (10000 ),
175
- ]
176
- subprocess .run (cmd )
177
-
178
- # generate DAC
179
- cmd = [chip_cert_exe , "gen-att-cert" ,
180
- "-t" , "d" ,
181
- "-c" , device_name ,
182
- "-V" , hex (vendor_id ),
183
- "-P" , hex (product_id ),
184
- "-C" , new_certificates ["PAI_CERT" ] + ".pem" ,
185
- "-K" , new_certificates ["PAI_KEY" ] + ".pem" ,
186
- "-o" , new_certificates ["DAC_CERT" ] + ".pem" ,
187
- "-O" , new_certificates ["DAC_KEY" ] + ".pem" ,
188
- "-l" , str (10000 ),
189
- ]
190
- subprocess .run (cmd )
191
-
192
- # convert to .der files
193
- for cert_k , cert_v in new_certificates .items ():
194
- action_type = "convert-cert" if cert_k .find ("CERT" ) != - 1 else "convert-key"
195
- log .info (cert_v + ".der" )
196
- cmd = [chip_cert_exe , action_type ,
197
- cert_v + ".pem" ,
198
- cert_v + ".der" ,
199
- "--x509-der" ,
168
+ if generate_all_certs :
169
+ log .info ("Generating new PAI and DAC certificates using chip-cert..." )
170
+
171
+ # generate PAI
172
+ cmd = [chip_cert_exe , "gen-att-cert" ,
173
+ "-t" , "i" ,
174
+ "-c" , device_name ,
175
+ "-V" , hex (vendor_id ),
176
+ "-C" , PAA_PATH ,
177
+ "-K" , PAA_KEY_PATH ,
178
+ "-o" , new_certificates ["PAI_CERT" ] + ".pem" ,
179
+ "-O" , new_certificates ["PAI_KEY" ] + ".pem" ,
180
+ "-l" , str (10000 ),
181
+ ]
182
+ subprocess .run (cmd )
183
+
184
+ # generate DAC
185
+ cmd = [chip_cert_exe , "gen-att-cert" ,
186
+ "-t" , "d" ,
187
+ "-c" , device_name ,
188
+ "-V" , hex (vendor_id ),
189
+ "-P" , hex (product_id ),
190
+ "-C" , new_certificates ["PAI_CERT" ] + ".pem" ,
191
+ "-K" , new_certificates ["PAI_KEY" ] + ".pem" ,
192
+ "-o" , new_certificates ["DAC_CERT" ] + ".pem" ,
193
+ "-O" , new_certificates ["DAC_KEY" ] + ".pem" ,
194
+ "-l" , str (10000 ),
200
195
]
201
196
subprocess .run (cmd )
202
197
203
- return attestation_certs (new_certificates ["DAC_CERT" ] + ".der" ,
204
- new_certificates ["DAC_KEY" ] + ".der" ,
205
- new_certificates ["PAI_CERT" ] + ".der" )
198
+ # convert to .der files
199
+ for cert_k , cert_v in new_certificates .items ():
200
+ action_type = "convert-cert" if cert_k .find ("CERT" ) != - 1 else "convert-key"
201
+ log .info (cert_v + ".der" )
202
+ cmd = [chip_cert_exe , action_type ,
203
+ cert_v + ".pem" ,
204
+ cert_v + ".der" ,
205
+ "--x509-der" ,
206
+ ]
207
+ subprocess .run (cmd )
208
+
209
+ return attestation_certs (new_certificates ["DAC_CERT" ] + ".der" ,
210
+ new_certificates ["DAC_KEY" ] + ".der" ,
211
+ new_certificates ["PAI_CERT" ] + ".der" )
212
+
213
+ return attestation_certs (None , None , None )
206
214
207
215
208
216
class FactoryDataGenerator :
@@ -234,8 +242,8 @@ def _validate_args(self):
234
242
raise AssertionError ("Provided wrong user data, this is not a JSON format! {}" .format (e ))
235
243
assert self ._args .spake2_verifier or self ._args .passcode , \
236
244
"Cannot find Spake2+ verifier, to generate a new one please provide passcode (--passcode)"
237
- assert (self ._args .chip_cert_path or (self ._args .dac_cert and self ._args .pai_cert and self ._args .dac_key )), \
238
- "Cannot find paths to DAC or PAI certificates .der files. To generate a new ones please provide a path to chip-cert executable (--chip_cert_path)"
245
+ assert (( self ._args .gen_certs and self . _args . chip_cert_path ) or (self ._args .dac_cert and self ._args .pai_cert and self ._args .dac_key )), \
246
+ "Cannot find paths to DAC or PAI certificates .der files. To generate a new ones please provide a path to chip-cert executable (--chip_cert_path) and add --gen_certs argument "
239
247
assert self ._args .output .endswith (".json" ), \
240
248
"Output path doesn't contain .json file path. ({})" .format (self ._args .output )
241
249
assert not (self ._args .passcode in INVALID_PASSCODES ), \
@@ -273,23 +281,27 @@ def generate_json(self):
273
281
# convert salt to bytestring to be coherent with Spake2+ verifier type
274
282
spake_2_salt = self ._args .spake2_salt
275
283
276
- if self ._args .chip_cert_path :
277
- certs = gen_test_certs (self ._args .chip_cert_path ,
278
- self ._args .output [:self ._args .output .rfind ("/" )],
279
- self ._args .vendor_id ,
280
- self ._args .product_id ,
281
- self ._args .vendor_name + "_" + self ._args .product_name ,
282
- self ._args .gen_cd ,
283
- self ._args .cd_type ,
284
- self ._args .paa_cert ,
285
- self ._args .paa_key )
286
- dac_cert = certs .dac_cert
287
- pai_cert = certs .pai_cert
288
- dac_key = certs .dac_key
289
- else :
284
+ certs = gen_test_certs (self ._args .chip_cert_path ,
285
+ self ._args .output [:self ._args .output .rfind ("/" )],
286
+ self ._args .vendor_id ,
287
+ self ._args .product_id ,
288
+ self ._args .vendor_name + "_" + self ._args .product_name ,
289
+ self ._args .gen_cd ,
290
+ self ._args .cd_type ,
291
+ self ._args .paa_cert ,
292
+ self ._args .paa_key ,
293
+ self ._args .gen_certs )
294
+
295
+ dac_cert = certs .dac_cert
296
+ pai_cert = certs .pai_cert
297
+ dac_key = certs .dac_key
298
+
299
+ if not dac_cert :
290
300
dac_cert = self ._args .dac_cert
291
- dac_key = self . _args . dac_key
301
+ if not pai_cert :
292
302
pai_cert = self ._args .pai_cert
303
+ if not dac_key :
304
+ dac_key = self ._args .dac_key
293
305
294
306
# try to read DAC public and private keys
295
307
dac_priv_key = get_raw_private_key_der (dac_key , self ._args .dac_key_password )
@@ -364,6 +376,7 @@ def _add_entry(self, name: str, value: any):
364
376
365
377
def _generate_spake2_verifier (self ):
366
378
""" If verifier has not been provided in arguments list it should be generated via external script """
379
+ log .info ("Generating SPAKE2+ Verifier..." )
367
380
return generate_verifier (self ._args .passcode , self ._args .spake2_salt , self ._args .spake2_it )
368
381
369
382
def _generate_rotating_device_uid (self ):
@@ -479,6 +492,8 @@ def base64_str(s): return base64.b64decode(s)
479
492
"This option requires a path to chip-cert executable."
480
493
"By default you can find chip-cert in connectedhomeip/src/tools/chip-cert directory "
481
494
"and build it there." ))
495
+ optional_arguments .add_argument ("--gen_certs" , action = "store_true" ,
496
+ help = "Generate a new DAC nad PAI certificates" )
482
497
optional_arguments .add_argument ("--dac_cert" , type = str ,
483
498
help = "[.der] Provide the path to .der file containing DAC certificate." )
484
499
optional_arguments .add_argument ("--dac_key" , type = str ,
0 commit comments