Test: TC-DA-1-9: Device attestation revocation test cases (#38128)
* da-revocation: add test data for dac and pai both revoked case
Clubbed the different revocation set into single file and adjusted the
doc accordingly.
* Added certification test cases for TC-DA-1-9
Added the test cases for testing device attestation revocation feature
* fix the yaml indentation
* Restyled by whitespace
* Restyled by prettier-json
* Restyled by prettier-markdown
* Restyled by prettier-yaml
* Add CRL for revoked PAI CA and adjust the unit tests after clubbing data
into single file
* remove manual test case for TC-DA-1-9
* update comment in dac provider test vectors
* merge revocation sets
* add python test for tc-da-1-9
* Restyled by autopep8
* Restyled by isort
* remove unnecessary if
* skip running tc-da-1-9 in ci
* Restyled by prettier-yaml
* change test case as per python testing requirements
* enable tc-da in ci
* add a todo
* Restyled by autopep8
* fix the app path
* Restyled by autopep8
* fix paths for ci
* remove unused commnet
* address review comments
* add asserts when required arguments are not present and use the default
log path for storing app logs, also fix the ci by passing --PICS
argument
---------
Co-authored-by: Restyled.io <commits@restyled.io>
diff --git a/credentials/generate_revocation_set.py b/credentials/generate_revocation_set.py
index 6a13748..bb2f5b6 100755
--- a/credentials/generate_revocation_set.py
+++ b/credentials/generate_revocation_set.py
@@ -1006,14 +1006,11 @@
def get_test_file_path(self, filename):
return os.path.join(self.test_base_dir, 'test', filename)
- def compare_revocation_sets(self, generated_set, expected_file):
- with open(os.path.join(self.test_base_dir, expected_file), 'r') as f:
- expected_set = [RevocationSet(**r) for r in json.load(f)]
+ def get_expected_revocation_set(self, idx):
+ with open(os.path.join(self.test_base_dir, 'test/revoked-attestation-certificates/revocation-sets/revocation-set.json'), 'r') as f:
+ return RevocationSet(**json.load(f)[idx])
- # Compare the contents
- self.assertEqual(len([generated_set]), len(expected_set))
- expected = expected_set[0]
-
+ def compare_revocation_sets(self, generated_set, expected):
# Compare required fields
self.assertEqual(generated_set.type, expected.type)
self.assertEqual(generated_set.issuer_subject_key_id, expected.issuer_subject_key_id)
@@ -1038,10 +1035,7 @@
revocation_set = generate_revocation_set_from_crl(
crl, crl_signer, ca_name_b64, ca_akid_hex, None)
- self.compare_revocation_sets(
- revocation_set,
- 'test/revoked-attestation-certificates/revocation-sets/revocation-set-for-paa.json'
- )
+ self.compare_revocation_sets(revocation_set, self.get_expected_revocation_set(0))
def test_pai_revocation_set(self):
"""Test generation of PAI revocation set"""
@@ -1057,10 +1051,23 @@
revocation_set = generate_revocation_set_from_crl(
crl, crl_signer, ca_name_b64, ca_akid_hex, None)
- self.compare_revocation_sets(
- revocation_set,
- 'test/revoked-attestation-certificates/revocation-sets/revocation-set-for-pai.json'
- )
+ self.compare_revocation_sets(revocation_set, self.get_expected_revocation_set(1))
+
+ def test_revoked_pai_revocation_set(self):
+ """Test generation of revocation set of revoked PAI"""
+ with open(self.get_test_file_path('revoked-attestation-certificates/Chip-Test-PAI-FFF1-noPID-Revoked-CRL.pem'), 'rb') as f:
+ crl = x509.load_pem_x509_crl(f.read())
+ with open(self.get_test_file_path('revoked-attestation-certificates/Chip-Test-PAI-FFF1-noPID-Revoked-Cert.pem'), 'rb') as f:
+ crl_signer = x509.load_pem_x509_certificate(f.read())
+ with open(self.get_test_file_path('revoked-attestation-certificates/Chip-Test-PAA-FFF1-Cert.pem'), 'rb') as f:
+ paa = x509.load_pem_x509_certificate(f.read())
+
+ ca_name_b64, ca_akid_hex = get_certificate_authority_details(
+ crl_signer, None, paa, False)
+ revocation_set = generate_revocation_set_from_crl(
+ crl, crl_signer, ca_name_b64, ca_akid_hex, None)
+
+ self.compare_revocation_sets(revocation_set, self.get_expected_revocation_set(2))
if __name__ == "__main__":
diff --git a/credentials/test/revoked-attestation-certificates/Chip-Test-DAC-FFF1-8001-Revoked-Signed-By-Revoked-PAI-Cert.der b/credentials/test/revoked-attestation-certificates/Chip-Test-DAC-FFF1-8001-Revoked-Signed-By-Revoked-PAI-Cert.der
new file mode 100644
index 0000000..bb928ec
--- /dev/null
+++ b/credentials/test/revoked-attestation-certificates/Chip-Test-DAC-FFF1-8001-Revoked-Signed-By-Revoked-PAI-Cert.der
Binary files differ
diff --git a/credentials/test/revoked-attestation-certificates/Chip-Test-DAC-FFF1-8001-Revoked-Signed-By-Revoked-PAI-Cert.pem b/credentials/test/revoked-attestation-certificates/Chip-Test-DAC-FFF1-8001-Revoked-Signed-By-Revoked-PAI-Cert.pem
new file mode 100644
index 0000000..a4ab090
--- /dev/null
+++ b/credentials/test/revoked-attestation-certificates/Chip-Test-DAC-FFF1-8001-Revoked-Signed-By-Revoked-PAI-Cert.pem
@@ -0,0 +1,13 @@
+-----BEGIN CERTIFICATE-----
+MIICAjCCAaigAwIBAgIIc151wP6PWsUwCgYIKoZIzj0EAwIwRjEuMCwGA1UEAwwl
+TWF0dGVyIFRlc3QgUEFJIDB4RkZGMSBubyBQSUQgUmV2b2tlZDEUMBIGCisGAQQB
+gqJ8AgEMBEZGRjEwIBcNMjUwMzI1MDAwMDAwWhgPOTk5OTEyMzEyMzU5NTlaMGQx
+NjA0BgNVBAMMLU1hdHRlciBUZXN0IFJldm9rZWQgREFDIFNpZ25lZCBieSBSZXZv
+a2VkIFBBSTEUMBIGCisGAQQBgqJ8AgEMBEZGRjExFDASBgorBgEEAYKifAICDAQ4
+MDAxMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEaELP83azv5+vdJg+vmO/g6td
+Z9obWLWWZdgatid+/x5leASGpBEgL0pEv1UZ74ol4bK6S287eQKrIAZB2xdqWaNg
+MF4wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCB4AwHQYDVR0OBBYEFDO1Scke
+5qNNVdIn4aGgsbGhUWs6MB8GA1UdIwQYMBaAFJEzfFz+e7KTdv6IfTyU5/Wd2D0v
+MAoGCCqGSM49BAMCA0gAMEUCIGO/qO9oglMxDEPMplwri0o31iRLg/p+qAyhtUC1
+DiWxAiEAgv4UPAsPjvj1gPMWaLe9xnbrZOuXg+7bjOFPeODItFc=
+-----END CERTIFICATE-----
diff --git a/credentials/test/revoked-attestation-certificates/Chip-Test-DAC-FFF1-8001-Revoked-Signed-By-Revoked-PAI-Key.der b/credentials/test/revoked-attestation-certificates/Chip-Test-DAC-FFF1-8001-Revoked-Signed-By-Revoked-PAI-Key.der
new file mode 100644
index 0000000..f393b8a
--- /dev/null
+++ b/credentials/test/revoked-attestation-certificates/Chip-Test-DAC-FFF1-8001-Revoked-Signed-By-Revoked-PAI-Key.der
Binary files differ
diff --git a/credentials/test/revoked-attestation-certificates/Chip-Test-DAC-FFF1-8001-Revoked-Signed-By-Revoked-PAI-Key.pem b/credentials/test/revoked-attestation-certificates/Chip-Test-DAC-FFF1-8001-Revoked-Signed-By-Revoked-PAI-Key.pem
new file mode 100644
index 0000000..55a749b
--- /dev/null
+++ b/credentials/test/revoked-attestation-certificates/Chip-Test-DAC-FFF1-8001-Revoked-Signed-By-Revoked-PAI-Key.pem
@@ -0,0 +1,5 @@
+-----BEGIN EC PRIVATE KEY-----
+MHcCAQEEIJoLKewrsvBa4y0m97yUkHqvZHBNjl32M5xbK15Q+ShHoAoGCCqGSM49
+AwEHoUQDQgAEaELP83azv5+vdJg+vmO/g6tdZ9obWLWWZdgatid+/x5leASGpBEg
+L0pEv1UZ74ol4bK6S287eQKrIAZB2xdqWQ==
+-----END EC PRIVATE KEY-----
diff --git a/credentials/test/revoked-attestation-certificates/Chip-Test-PAI-FFF1-noPID-Revoked-CRL.der b/credentials/test/revoked-attestation-certificates/Chip-Test-PAI-FFF1-noPID-Revoked-CRL.der
new file mode 100644
index 0000000..a9d5970
--- /dev/null
+++ b/credentials/test/revoked-attestation-certificates/Chip-Test-PAI-FFF1-noPID-Revoked-CRL.der
Binary files differ
diff --git a/credentials/test/revoked-attestation-certificates/Chip-Test-PAI-FFF1-noPID-Revoked-CRL.pem b/credentials/test/revoked-attestation-certificates/Chip-Test-PAI-FFF1-noPID-Revoked-CRL.pem
new file mode 100644
index 0000000..78eb900
--- /dev/null
+++ b/credentials/test/revoked-attestation-certificates/Chip-Test-PAI-FFF1-noPID-Revoked-CRL.pem
@@ -0,0 +1,9 @@
+-----BEGIN X509 CRL-----
+MIIBHjCBxQIBATAKBggqhkjOPQQDAjBGMS4wLAYDVQQDDCVNYXR0ZXIgVGVzdCBQ
+QUkgMHhGRkYxIG5vIFBJRCBSZXZva2VkMRQwEgYKKwYBBAGConwCAQwERkZGMRcN
+MjUwMzI2MDYyODU2WhgPMjEyNTAzMjcwNjI4NTZaMBswGQIIc151wP6PWsUXDTI1
+MDMyNjA2Mjg1NlqgLzAtMB8GA1UdIwQYMBaAFJEzfFz+e7KTdv6IfTyU5/Wd2D0v
+MAoGA1UdFAQDAgEAMAoGCCqGSM49BAMCA0gAMEUCIQDM4thiU6vEOH5jwGaFypV2
+P9InyjTJKpMo5bR4QEMMRgIgYge7z2UStTlJzS2gVm/MVld7SNnD+020LOVP1SWb
+ufk=
+-----END X509 CRL-----
diff --git a/credentials/test/revoked-attestation-certificates/dac-provider-test-vectors/indirect-revoked-dac-01-pai-03.json b/credentials/test/revoked-attestation-certificates/dac-provider-test-vectors/indirect-revoked-dac-01-pai-03.json
index 0477c4b..e7f20cd 100644
--- a/credentials/test/revoked-attestation-certificates/dac-provider-test-vectors/indirect-revoked-dac-01-pai-03.json
+++ b/credentials/test/revoked-attestation-certificates/dac-provider-test-vectors/indirect-revoked-dac-01-pai-03.json
@@ -1,5 +1,5 @@
{
- "description": "Indirect revoked PAI 03: use this with revocation-sets/indirect-revocation-set.json",
+ "description": "Indirect revoked PAI 03: use this with revocation-sets/revocation-set.json",
"basic_info_pid": 32769,
"certification_declaration": "3081e706092a864886f70d010702a081d93081d6020103310d300b0609608648016503040201304306092a864886f70d010701a0360434152400012501f1ff3602050180182403162c0413435341303030303053574330303030302d303124050024060024070124080018317d307b020103801462fa823359acfaa9963e1cfa140addf504f37160300b0609608648016503040201300a06082a8648ce3d0403020447304502204dc6be89beeb5a49adec51ee7f0e6d1263ffc9e6238f2044385a5e0c86751b83022100ed902842f7a5784368d63eba6a2fb90086dd65a0ce3c283d86b915a3536afdac",
"pai_cert": "308201ce30820173a00302010202145433500af72d566dd0c0fd2710ab6f8562bd6f8f300a06082a8648ce3d04030230303118301606035504030c0f4d617474657220546573742050414131143012060a2b0601040182a27c02010c04464646313020170d3235303130393130303431375a180f32313234313231363130303431375a3033311b301906035504030c124d617474657220546573742050414920303331143012060a2b0601040182a27c02010c04464646313059301306072a8648ce3d020106082a8648ce3d03010703420004bb1a980f395d0a448f315df82f820564b127398e9c1396916195ef3bba5fbc247445ceaa589ca835ca99058b1b7c1b2aef55dbec4338a3d8382a100c7f199dada366306430120603551d130101ff040830060101ff020100300e0603551d0f0101ff040403020186301d0603551d0e04160414f97059a4f532b98b3b808592cd943a91004acd6d301f0603551d230418301680146afd22771f511fecbf1641976710dcdc31a1717e300a06082a8648ce3d0403020349003046022100ad4364c9b8c18ed56b11239ec95468981f598beece1e6904eddf7c67a7f533980221008a0428bbbcd9b725341deab309de87569b76fbae735bac659ce83c84b209d91f",
diff --git a/credentials/test/revoked-attestation-certificates/dac-provider-test-vectors/indirect-revoked-dac-01.json b/credentials/test/revoked-attestation-certificates/dac-provider-test-vectors/indirect-revoked-dac-01.json
index c26ef1b..475372a 100644
--- a/credentials/test/revoked-attestation-certificates/dac-provider-test-vectors/indirect-revoked-dac-01.json
+++ b/credentials/test/revoked-attestation-certificates/dac-provider-test-vectors/indirect-revoked-dac-01.json
@@ -1,5 +1,5 @@
{
- "description": "Indirect revoked DAC 01: use this with revocation-sets/indirect-revocation-set.json",
+ "description": "Indirect revoked DAC 01: use this with revocation-sets/revocation-set.json",
"basic_info_pid": 32769,
"certification_declaration": "3081e706092a864886f70d010702a081d93081d6020103310d300b0609608648016503040201304306092a864886f70d010701a0360434152400012501f1ff3602050180182403162c0413435341303030303053574330303030302d303124050024060024070124080018317d307b020103801462fa823359acfaa9963e1cfa140addf504f37160300b0609608648016503040201300a06082a8648ce3d0403020447304502204dc6be89beeb5a49adec51ee7f0e6d1263ffc9e6238f2044385a5e0c86751b83022100ed902842f7a5784368d63eba6a2fb90086dd65a0ce3c283d86b915a3536afdac",
"pai_cert": "308201cd30820173a003020102021455c52c44f44d371237c9d42f8371658e560627dc300a06082a8648ce3d04030230303118301606035504030c0f4d617474657220546573742050414131143012060a2b0601040182a27c02010c04464646313020170d3235303130393130303430395a180f32313234313231363130303430395a3033311b301906035504030c124d617474657220546573742050414920303131143012060a2b0601040182a27c02010c04464646313059301306072a8648ce3d020106082a8648ce3d03010703420004dab17c35080a4ddc84d72945d52c90aad2da072196bdf24a986103a902611eb4496408d8305566f9a00f3c43ff7651cc9a134ad629f60f117745004ad06ce20fa366306430120603551d130101ff040830060101ff020100300e0603551d0f0101ff040403020186301d0603551d0e041604149d7718f23bd91000c15308db3a63b9c1faea0d33301f0603551d230418301680146afd22771f511fecbf1641976710dcdc31a1717e300a06082a8648ce3d040302034800304502200c83bca257d7012b539908b8f2c2bb1a6e263d9f41e26e735287c206a1fe11e902210089adfcfd3b917d572723f09c2da262fc16454830aaa1273dc01e689cdc142592",
diff --git a/credentials/test/revoked-attestation-certificates/dac-provider-test-vectors/indirect-revoked-pai-03.json b/credentials/test/revoked-attestation-certificates/dac-provider-test-vectors/indirect-revoked-pai-03.json
index a9577fa..b7fc480 100644
--- a/credentials/test/revoked-attestation-certificates/dac-provider-test-vectors/indirect-revoked-pai-03.json
+++ b/credentials/test/revoked-attestation-certificates/dac-provider-test-vectors/indirect-revoked-pai-03.json
@@ -1,5 +1,5 @@
{
- "description": "Indirect revoked PAI 03: use this with revocation-sets/indirect-revocation-set.json",
+ "description": "Indirect revoked PAI 03: use this with revocation-sets/revocation-set.json",
"basic_info_pid": 32769,
"certification_declaration": "3081e706092a864886f70d010702a081d93081d6020103310d300b0609608648016503040201304306092a864886f70d010701a0360434152400012501f1ff3602050180182403162c0413435341303030303053574330303030302d303124050024060024070124080018317d307b020103801462fa823359acfaa9963e1cfa140addf504f37160300b0609608648016503040201300a06082a8648ce3d0403020447304502204dc6be89beeb5a49adec51ee7f0e6d1263ffc9e6238f2044385a5e0c86751b83022100ed902842f7a5784368d63eba6a2fb90086dd65a0ce3c283d86b915a3536afdac",
"pai_cert": "308201ce30820173a00302010202145433500af72d566dd0c0fd2710ab6f8562bd6f8f300a06082a8648ce3d04030230303118301606035504030c0f4d617474657220546573742050414131143012060a2b0601040182a27c02010c04464646313020170d3235303130393130303431375a180f32313234313231363130303431375a3033311b301906035504030c124d617474657220546573742050414920303331143012060a2b0601040182a27c02010c04464646313059301306072a8648ce3d020106082a8648ce3d03010703420004bb1a980f395d0a448f315df82f820564b127398e9c1396916195ef3bba5fbc247445ceaa589ca835ca99058b1b7c1b2aef55dbec4338a3d8382a100c7f199dada366306430120603551d130101ff040830060101ff020100300e0603551d0f0101ff040403020186301d0603551d0e04160414f97059a4f532b98b3b808592cd943a91004acd6d301f0603551d230418301680146afd22771f511fecbf1641976710dcdc31a1717e300a06082a8648ce3d0403020349003046022100ad4364c9b8c18ed56b11239ec95468981f598beece1e6904eddf7c67a7f533980221008a0428bbbcd9b725341deab309de87569b76fbae735bac659ce83c84b209d91f",
diff --git a/credentials/test/revoked-attestation-certificates/dac-provider-test-vectors/revoked-dac-01.json b/credentials/test/revoked-attestation-certificates/dac-provider-test-vectors/revoked-dac-01.json
index 05dc6b0..52eed62 100644
--- a/credentials/test/revoked-attestation-certificates/dac-provider-test-vectors/revoked-dac-01.json
+++ b/credentials/test/revoked-attestation-certificates/dac-provider-test-vectors/revoked-dac-01.json
@@ -1,5 +1,5 @@
{
- "description": "Revoked DAC 01: use this with revocation-sets/revocation-set-for-pai.json",
+ "description": "Revoked DAC 01: use this with revocation-sets/revocation-sets/revocation-set.json",
"basic_info_pid": 32769,
"certification_declaration": "3081e706092a864886f70d010702a081d93081d6020103310d300b0609608648016503040201304306092a864886f70d010701a0360434152400012501f1ff3602050180182403162c0413435341303030303053574330303030302d303124050024060024070124080018317d307b020103801462fa823359acfaa9963e1cfa140addf504f37160300b0609608648016503040201300a06082a8648ce3d0403020447304502204dc6be89beeb5a49adec51ee7f0e6d1263ffc9e6238f2044385a5e0c86751b83022100ed902842f7a5784368d63eba6a2fb90086dd65a0ce3c283d86b915a3536afdac",
"pai_cert": "308201cb30820171a003020102020856ad8222ad945b64300a06082a8648ce3d04030230303118301606035504030c0f4d617474657220546573742050414131143012060a2b0601040182a27c02010c04464646313020170d3232303230353030303030305a180f39393939313233313233353935395a303d3125302306035504030c1c4d6174746572204465762050414920307846464631206e6f2050494431143012060a2b0601040182a27c02010c04464646313059301306072a8648ce3d020106082a8648ce3d03010703420004419a9315c2173e0c8c876d03ccfc944852647f7fec5e5082f4059928eca894c594151309ac631e4cb03392af684b0bafb7e65b3b8162c2f52bf931b8e77aaa82a366306430120603551d130101ff040830060101ff020100300e0603551d0f0101ff040403020106301d0603551d0e0416041463540e47f64b1c38d13884a462d16c195d8ffb3c301f0603551d230418301680146afd22771f511fecbf1641976710dcdc31a1717e300a06082a8648ce3d0403020348003045022100b2ef27f49ae9b50fb91eeac94c4d0bdbb8d7929c6cb88face529368d12054c0c0220655dc92b86bd909882a6c62177b825d7d05edbe7c22f9fea71220e7ea703f891",
diff --git a/credentials/test/revoked-attestation-certificates/dac-provider-test-vectors/revoked-dac-02.json b/credentials/test/revoked-attestation-certificates/dac-provider-test-vectors/revoked-dac-02.json
index ab3f927..0a7c9ac 100644
--- a/credentials/test/revoked-attestation-certificates/dac-provider-test-vectors/revoked-dac-02.json
+++ b/credentials/test/revoked-attestation-certificates/dac-provider-test-vectors/revoked-dac-02.json
@@ -1,5 +1,5 @@
{
- "description": "Revoked DAC 02: use this with revocation-sets/revocation-set-for-pai.json",
+ "description": "Revoked DAC 02: use this with revocation-sets/revocation-set.json",
"basic_info_pid": 32769,
"certification_declaration": "3081e706092a864886f70d010702a081d93081d6020103310d300b0609608648016503040201304306092a864886f70d010701a0360434152400012501f1ff3602050180182403162c0413435341303030303053574330303030302d303124050024060024070124080018317d307b020103801462fa823359acfaa9963e1cfa140addf504f37160300b0609608648016503040201300a06082a8648ce3d0403020447304502204dc6be89beeb5a49adec51ee7f0e6d1263ffc9e6238f2044385a5e0c86751b83022100ed902842f7a5784368d63eba6a2fb90086dd65a0ce3c283d86b915a3536afdac",
"pai_cert": "308201cb30820171a003020102020856ad8222ad945b64300a06082a8648ce3d04030230303118301606035504030c0f4d617474657220546573742050414131143012060a2b0601040182a27c02010c04464646313020170d3232303230353030303030305a180f39393939313233313233353935395a303d3125302306035504030c1c4d6174746572204465762050414920307846464631206e6f2050494431143012060a2b0601040182a27c02010c04464646313059301306072a8648ce3d020106082a8648ce3d03010703420004419a9315c2173e0c8c876d03ccfc944852647f7fec5e5082f4059928eca894c594151309ac631e4cb03392af684b0bafb7e65b3b8162c2f52bf931b8e77aaa82a366306430120603551d130101ff040830060101ff020100300e0603551d0f0101ff040403020106301d0603551d0e0416041463540e47f64b1c38d13884a462d16c195d8ffb3c301f0603551d230418301680146afd22771f511fecbf1641976710dcdc31a1717e300a06082a8648ce3d0403020348003045022100b2ef27f49ae9b50fb91eeac94c4d0bdbb8d7929c6cb88face529368d12054c0c0220655dc92b86bd909882a6c62177b825d7d05edbe7c22f9fea71220e7ea703f891",
diff --git a/credentials/test/revoked-attestation-certificates/dac-provider-test-vectors/revoked-dac-03.json b/credentials/test/revoked-attestation-certificates/dac-provider-test-vectors/revoked-dac-03.json
index a629f86..cfc1442 100644
--- a/credentials/test/revoked-attestation-certificates/dac-provider-test-vectors/revoked-dac-03.json
+++ b/credentials/test/revoked-attestation-certificates/dac-provider-test-vectors/revoked-dac-03.json
@@ -1,5 +1,5 @@
{
- "description": "Revoked DAC 03: use this with revocation-sets/revocation-set-for-pai.json",
+ "description": "Revoked DAC 03: use this with revocation-sets/revocation-set.json",
"basic_info_pid": 32769,
"certification_declaration": "3081e706092a864886f70d010702a081d93081d6020103310d300b0609608648016503040201304306092a864886f70d010701a0360434152400012501f1ff3602050180182403162c0413435341303030303053574330303030302d303124050024060024070124080018317d307b020103801462fa823359acfaa9963e1cfa140addf504f37160300b0609608648016503040201300a06082a8648ce3d0403020447304502204dc6be89beeb5a49adec51ee7f0e6d1263ffc9e6238f2044385a5e0c86751b83022100ed902842f7a5784368d63eba6a2fb90086dd65a0ce3c283d86b915a3536afdac",
"pai_cert": "308201cb30820171a003020102020856ad8222ad945b64300a06082a8648ce3d04030230303118301606035504030c0f4d617474657220546573742050414131143012060a2b0601040182a27c02010c04464646313020170d3232303230353030303030305a180f39393939313233313233353935395a303d3125302306035504030c1c4d6174746572204465762050414920307846464631206e6f2050494431143012060a2b0601040182a27c02010c04464646313059301306072a8648ce3d020106082a8648ce3d03010703420004419a9315c2173e0c8c876d03ccfc944852647f7fec5e5082f4059928eca894c594151309ac631e4cb03392af684b0bafb7e65b3b8162c2f52bf931b8e77aaa82a366306430120603551d130101ff040830060101ff020100300e0603551d0f0101ff040403020106301d0603551d0e0416041463540e47f64b1c38d13884a462d16c195d8ffb3c301f0603551d230418301680146afd22771f511fecbf1641976710dcdc31a1717e300a06082a8648ce3d0403020348003045022100b2ef27f49ae9b50fb91eeac94c4d0bdbb8d7929c6cb88face529368d12054c0c0220655dc92b86bd909882a6c62177b825d7d05edbe7c22f9fea71220e7ea703f891",
diff --git a/credentials/test/revoked-attestation-certificates/dac-provider-test-vectors/revoked-dac-and-pai.json b/credentials/test/revoked-attestation-certificates/dac-provider-test-vectors/revoked-dac-and-pai.json
new file mode 100644
index 0000000..83b2d12
--- /dev/null
+++ b/credentials/test/revoked-attestation-certificates/dac-provider-test-vectors/revoked-dac-and-pai.json
@@ -0,0 +1,9 @@
+{
+ "description": "Revoked DAC and PAI",
+ "basic_info_pid": 32769,
+ "certification_declaration": "3081e706092a864886f70d010702a081d93081d6020103310d300b0609608648016503040201304306092a864886f70d010701a0360434152400012501f1ff3602050180182403162c0413435341303030303053574330303030302d303124050024060024070124080018317d307b020103801462fa823359acfaa9963e1cfa140addf504f37160300b0609608648016503040201300a06082a8648ce3d0403020447304502204dc6be89beeb5a49adec51ee7f0e6d1263ffc9e6238f2044385a5e0c86751b83022100ed902842f7a5784368d63eba6a2fb90086dd65a0ce3c283d86b915a3536afdac",
+ "pai_cert": "308201d43082017aa0030201020208302664392b8a3f2a300a06082a8648ce3d04030230303118301606035504030c0f4d617474657220546573742050414131143012060a2b0601040182a27c02010c04464646313020170d3234313231333030303030305a180f39393939313233313233353935395a3046312e302c06035504030c254d617474657220546573742050414920307846464631206e6f20504944205265766f6b656431143012060a2b0601040182a27c02010c04464646313059301306072a8648ce3d020106082a8648ce3d03010703420004bd58a84f7862e0751c4e56280f149697df7c51aadc5a4fa393c96277a59079de40907ab7860d069de652ea8bc8f7053bfe7c3a8ef4700d76b9cc20db312caf91a366306430120603551d130101ff040830060101ff020100300e0603551d0f0101ff040403020106301d0603551d0e0416041491337c5cfe7bb29376fe887d3c94e7f59dd83d2f301f0603551d230418301680146afd22771f511fecbf1641976710dcdc31a1717e300a06082a8648ce3d04030203480030450221009c74f6a84b3acb5a369de90399114ebf0a55150babd3d52b2898708847bc9c6e0220651881c81b7a20c346b97c68313c4be1c0a88f4f3a4072ed3c7ea11dc60984fc",
+ "dac_cert": "30820202308201a8a0030201020208735e75c0fe8f5ac5300a06082a8648ce3d0403023046312e302c06035504030c254d617474657220546573742050414920307846464631206e6f20504944205265766f6b656431143012060a2b0601040182a27c02010c04464646313020170d3235303332353030303030305a180f39393939313233313233353935395a30643136303406035504030c2d4d61747465722054657374205265766f6b656420444143205369676e6564206279205265766f6b65642050414931143012060a2b0601040182a27c02010c044646463131143012060a2b0601040182a27c02020c04383030313059301306072a8648ce3d020106082a8648ce3d030107034200046842cff376b3bf9faf74983ebe63bf83ab5d67da1b58b59665d81ab6277eff1e65780486a411202f4a44bf5519ef8a25e1b2ba4b6f3b7902ab200641db176a59a360305e300c0603551d130101ff04023000300e0603551d0f0101ff040403020780301d0603551d0e0416041433b549c91ee6a34d55d227e1a1a0b1b1a1516b3a301f0603551d2304183016801491337c5cfe7bb29376fe887d3c94e7f59dd83d2f300a06082a8648ce3d0403020348003045022063bfa8ef688253310c43cca65c2b8b4a37d6244b83fa7ea80ca1b540b50e25b102210082fe143c0b0f8ef8f580f31668b7bdc676eb64eb9783eedb8ce14f78e0c8b457",
+ "dac_private_key": "9a0b29ec2bb2f05ae32d26f7bc94907aaf64704d8e5df6339c5b2b5e50f92847",
+ "dac_public_key": "046842cff376b3bf9faf74983ebe63bf83ab5d67da1b58b59665d81ab6277eff1e65780486a411202f4a44bf5519ef8a25e1b2ba4b6f3b7902ab200641db176a59"
+}
diff --git a/credentials/test/revoked-attestation-certificates/revocation-sets/revocation-set-for-paa.json b/credentials/test/revoked-attestation-certificates/revocation-sets/revocation-set-for-paa.json
deleted file mode 100644
index 93edb94..0000000
--- a/credentials/test/revoked-attestation-certificates/revocation-sets/revocation-set-for-paa.json
+++ /dev/null
@@ -1,9 +0,0 @@
-[
- {
- "type": "revocation_set",
- "issuer_subject_key_id": "6AFD22771F511FECBF1641976710DCDC31A1717E",
- "issuer_name": "MDAxGDAWBgNVBAMMD01hdHRlciBUZXN0IFBBQTEUMBIGCisGAQQBgqJ8AgEMBEZGRjE=",
- "revoked_serial_numbers": ["302664392B8A3F2A"],
- "crl_signer_cert": "MIIBvTCCAWSgAwIBAgIITqjoMYLUHBwwCgYIKoZIzj0EAwIwMDEYMBYGA1UEAwwPTWF0dGVyIFRlc3QgUEFBMRQwEgYKKwYBBAGConwCAQwERkZGMTAgFw0yMTA2MjgxNDIzNDNaGA85OTk5MTIzMTIzNTk1OVowMDEYMBYGA1UEAwwPTWF0dGVyIFRlc3QgUEFBMRQwEgYKKwYBBAGConwCAQwERkZGMTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABLbLY3KIfyko9brIGqnZOuJDHK2p154kL2UXfvnO2TKijs0Duq9qj8oYShpQNUKWDUU/MD8fGUIddR6Pjxqam3WjZjBkMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRq/SJ3H1Ef7L8WQZdnENzcMaFxfjAfBgNVHSMEGDAWgBRq/SJ3H1Ef7L8WQZdnENzcMaFxfjAKBggqhkjOPQQDAgNHADBEAiBQqoAC9NkyqaAFOPZTaK0P/8jvu8m+t9pWmDXPmqdRDgIgI7rI/g8j51RFtlM5CBpHmUkpxyqvChVI1A0DTVFLJd4="
- }
-]
diff --git a/credentials/test/revoked-attestation-certificates/revocation-sets/revocation-set-for-pai.json b/credentials/test/revoked-attestation-certificates/revocation-sets/revocation-set-for-pai.json
deleted file mode 100644
index 46c3c1b..0000000
--- a/credentials/test/revoked-attestation-certificates/revocation-sets/revocation-set-for-pai.json
+++ /dev/null
@@ -1,13 +0,0 @@
-[
- {
- "type": "revocation_set",
- "issuer_subject_key_id": "63540E47F64B1C38D13884A462D16C195D8FFB3C",
- "issuer_name": "MD0xJTAjBgNVBAMMHE1hdHRlciBEZXYgUEFJIDB4RkZGMSBubyBQSUQxFDASBgorBgEEAYKifAIBDARGRkYx",
- "revoked_serial_numbers": [
- "0AB042494323FE54",
- "19367D978EAC533A",
- "2569383D24BB36EA"
- ],
- "crl_signer_cert": "MIIByzCCAXGgAwIBAgIIVq2CIq2UW2QwCgYIKoZIzj0EAwIwMDEYMBYGA1UEAwwPTWF0dGVyIFRlc3QgUEFBMRQwEgYKKwYBBAGConwCAQwERkZGMTAgFw0yMjAyMDUwMDAwMDBaGA85OTk5MTIzMTIzNTk1OVowPTElMCMGA1UEAwwcTWF0dGVyIERldiBQQUkgMHhGRkYxIG5vIFBJRDEUMBIGCisGAQQBgqJ8AgEMBEZGRjEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARBmpMVwhc+DIyHbQPM/JRIUmR/f+xeUIL0BZko7KiUxZQVEwmsYx5MsDOSr2hLC6+35ls7gWLC9Sv5MbjneqqCo2YwZDASBgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUY1QOR/ZLHDjROISkYtFsGV2P+zwwHwYDVR0jBBgwFoAUav0idx9RH+y/FkGXZxDc3DGhcX4wCgYIKoZIzj0EAwIDSAAwRQIhALLvJ/Sa6bUPuR7qyUxNC9u415KcbLiPrOUpNo0SBUwMAiBlXckrhr2QmIKmxiF3uCXX0F7b58Ivn+pxIg5+pwP4kQ=="
- }
-]
diff --git a/credentials/test/revoked-attestation-certificates/revocation-sets/indirect-revocation-set.json b/credentials/test/revoked-attestation-certificates/revocation-sets/revocation-set.json
similarity index 68%
rename from credentials/test/revoked-attestation-certificates/revocation-sets/indirect-revocation-set.json
rename to credentials/test/revoked-attestation-certificates/revocation-sets/revocation-set.json
index 6d22cd9..91a49b3 100644
--- a/credentials/test/revoked-attestation-certificates/revocation-sets/indirect-revocation-set.json
+++ b/credentials/test/revoked-attestation-certificates/revocation-sets/revocation-set.json
@@ -3,6 +3,31 @@
"type": "revocation_set",
"issuer_subject_key_id": "6AFD22771F511FECBF1641976710DCDC31A1717E",
"issuer_name": "MDAxGDAWBgNVBAMMD01hdHRlciBUZXN0IFBBQTEUMBIGCisGAQQBgqJ8AgEMBEZGRjE=",
+ "revoked_serial_numbers": ["302664392B8A3F2A"],
+ "crl_signer_cert": "MIIBvTCCAWSgAwIBAgIITqjoMYLUHBwwCgYIKoZIzj0EAwIwMDEYMBYGA1UEAwwPTWF0dGVyIFRlc3QgUEFBMRQwEgYKKwYBBAGConwCAQwERkZGMTAgFw0yMTA2MjgxNDIzNDNaGA85OTk5MTIzMTIzNTk1OVowMDEYMBYGA1UEAwwPTWF0dGVyIFRlc3QgUEFBMRQwEgYKKwYBBAGConwCAQwERkZGMTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABLbLY3KIfyko9brIGqnZOuJDHK2p154kL2UXfvnO2TKijs0Duq9qj8oYShpQNUKWDUU/MD8fGUIddR6Pjxqam3WjZjBkMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRq/SJ3H1Ef7L8WQZdnENzcMaFxfjAfBgNVHSMEGDAWgBRq/SJ3H1Ef7L8WQZdnENzcMaFxfjAKBggqhkjOPQQDAgNHADBEAiBQqoAC9NkyqaAFOPZTaK0P/8jvu8m+t9pWmDXPmqdRDgIgI7rI/g8j51RFtlM5CBpHmUkpxyqvChVI1A0DTVFLJd4="
+ },
+ {
+ "type": "revocation_set",
+ "issuer_subject_key_id": "63540E47F64B1C38D13884A462D16C195D8FFB3C",
+ "issuer_name": "MD0xJTAjBgNVBAMMHE1hdHRlciBEZXYgUEFJIDB4RkZGMSBubyBQSUQxFDASBgorBgEEAYKifAIBDARGRkYx",
+ "revoked_serial_numbers": [
+ "0AB042494323FE54",
+ "19367D978EAC533A",
+ "2569383D24BB36EA"
+ ],
+ "crl_signer_cert": "MIIByzCCAXGgAwIBAgIIVq2CIq2UW2QwCgYIKoZIzj0EAwIwMDEYMBYGA1UEAwwPTWF0dGVyIFRlc3QgUEFBMRQwEgYKKwYBBAGConwCAQwERkZGMTAgFw0yMjAyMDUwMDAwMDBaGA85OTk5MTIzMTIzNTk1OVowPTElMCMGA1UEAwwcTWF0dGVyIERldiBQQUkgMHhGRkYxIG5vIFBJRDEUMBIGCisGAQQBgqJ8AgEMBEZGRjEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARBmpMVwhc+DIyHbQPM/JRIUmR/f+xeUIL0BZko7KiUxZQVEwmsYx5MsDOSr2hLC6+35ls7gWLC9Sv5MbjneqqCo2YwZDASBgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUY1QOR/ZLHDjROISkYtFsGV2P+zwwHwYDVR0jBBgwFoAUav0idx9RH+y/FkGXZxDc3DGhcX4wCgYIKoZIzj0EAwIDSAAwRQIhALLvJ/Sa6bUPuR7qyUxNC9u415KcbLiPrOUpNo0SBUwMAiBlXckrhr2QmIKmxiF3uCXX0F7b58Ivn+pxIg5+pwP4kQ=="
+ },
+ {
+ "type": "revocation_set",
+ "issuer_subject_key_id": "91337C5CFE7BB29376FE887D3C94E7F59DD83D2F",
+ "issuer_name": "MEYxLjAsBgNVBAMMJU1hdHRlciBUZXN0IFBBSSAweEZGRjEgbm8gUElEIFJldm9rZWQxFDASBgorBgEEAYKifAIBDARGRkYx",
+ "revoked_serial_numbers": ["735E75C0FE8F5AC5"],
+ "crl_signer_cert": "MIIB1DCCAXqgAwIBAgIIMCZkOSuKPyowCgYIKoZIzj0EAwIwMDEYMBYGA1UEAwwPTWF0dGVyIFRlc3QgUEFBMRQwEgYKKwYBBAGConwCAQwERkZGMTAgFw0yNDEyMTMwMDAwMDBaGA85OTk5MTIzMTIzNTk1OVowRjEuMCwGA1UEAwwlTWF0dGVyIFRlc3QgUEFJIDB4RkZGMSBubyBQSUQgUmV2b2tlZDEUMBIGCisGAQQBgqJ8AgEMBEZGRjEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS9WKhPeGLgdRxOVigPFJaX33xRqtxaT6OTyWJ3pZB53kCQereGDQad5lLqi8j3BTv+fDqO9HANdrnMINsxLK+Ro2YwZDASBgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUkTN8XP57spN2/oh9PJTn9Z3YPS8wHwYDVR0jBBgwFoAUav0idx9RH+y/FkGXZxDc3DGhcX4wCgYIKoZIzj0EAwIDSAAwRQIhAJx09qhLOstaNp3pA5kRTr8KVRULq9PVKyiYcIhHvJxuAiBlGIHIG3ogw0a5fGgxPEvhwKiPTzpAcu08fqEdxgmE/A=="
+ },
+ {
+ "type": "revocation_set",
+ "issuer_subject_key_id": "6AFD22771F511FECBF1641976710DCDC31A1717E",
+ "issuer_name": "MDAxGDAWBgNVBAMMD01hdHRlciBUZXN0IFBBQTEUMBIGCisGAQQBgqJ8AgEMBEZGRjE=",
"revoked_serial_numbers": ["5433500AF72D566DD0C0FD2710AB6F8562BD6F8F"],
"crl_signer_cert": "MIIBqzCCAVGgAwIBAgIUXW/ACwFp8g4/ggzUuEv9UF2neywwCgYIKoZIzj0EAwIwMDEYMBYGA1UEAwwPTWF0dGVyIFRlc3QgUEFBMRQwEgYKKwYBBAGConwCAQwERkZGMTAgFw0yNTAxMDkwOTU3MzdaGA8yMTI0MTIxNjA5NTczN1owFzEVMBMGA1UEAwwMUEFBIERlbGVnYXRlMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEQrA57jV+Fp6fRFPc5nh1w3sZoDaBVIpTA9kFQ4HxwHlVL4X+cV40JRYvfoFz5T/ODkxBypk/Air9kGtMz+Yo9KNgMF4wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCAQIwHQYDVR0OBBYEFK0B3AudYWs+yb8OfosFL8yvc0/yMB8GA1UdIwQYMBaAFGr9IncfUR/svxZBl2cQ3NwxoXF+MAoGCCqGSM49BAMCA0gAMEUCIQCOLt9F4MmItvqDQHVpY1m/gFfJ9ucjBzCtGEoun1mHQQIga8oBW2T46R8t6Dshi/xZQo3IrAdN38Oj3QrfXo3Yo1k=",
"crl_signer_delegator": "MIIBvTCCAWSgAwIBAgIITqjoMYLUHBwwCgYIKoZIzj0EAwIwMDEYMBYGA1UEAwwPTWF0dGVyIFRlc3QgUEFBMRQwEgYKKwYBBAGConwCAQwERkZGMTAgFw0yMTA2MjgxNDIzNDNaGA85OTk5MTIzMTIzNTk1OVowMDEYMBYGA1UEAwwPTWF0dGVyIFRlc3QgUEFBMRQwEgYKKwYBBAGConwCAQwERkZGMTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABLbLY3KIfyko9brIGqnZOuJDHK2p154kL2UXfvnO2TKijs0Duq9qj8oYShpQNUKWDUU/MD8fGUIddR6Pjxqam3WjZjBkMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRq/SJ3H1Ef7L8WQZdnENzcMaFxfjAfBgNVHSMEGDAWgBRq/SJ3H1Ef7L8WQZdnENzcMaFxfjAKBggqhkjOPQQDAgNHADBEAiBQqoAC9NkyqaAFOPZTaK0P/8jvu8m+t9pWmDXPmqdRDgIgI7rI/g8j51RFtlM5CBpHmUkpxyqvChVI1A0DTVFLJd4="
diff --git a/docs/guides/device-attestation-revocation-guide.md b/docs/guides/device-attestation-revocation-guide.md
index 6ee4fee..04c38d4 100644
--- a/docs/guides/device-attestation-revocation-guide.md
+++ b/docs/guides/device-attestation-revocation-guide.md
@@ -44,9 +44,14 @@
### Test Vectors
-| Description | DAC Provider | Revocation Set | Expected Result |
-| --------------------- | ---------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------- |
-| PAI revoked by PAA | [revoked-pai.json](../../credentials/test/revoked-attestation-certificates/dac-provider-test-vectors/revoked-pai.json) | [revocation-set-for-paa.json](../../credentials/test/revoked-attestation-certificates/revocation-sets/revocation-set-for-paa.json) | Commissioning fails with `kPaiRevoked` (202) |
-| DAC-01 revoked by PAI | [revoked-dac-01.json](../../credentials/test/revoked-attestation-certificates/dac-provider-test-vectors/revoked-dac-01.json) | [revocation-set-for-pai.json](../../credentials/test/revoked-attestation-certificates/revocation-sets/revocation-set-for-pai.json) | Commissioning fails with `kDacRevoked` (302) |
-| DAC-02 revoked by PAI | [revoked-dac-02.json](../../credentials/test/revoked-attestation-certificates/dac-provider-test-vectors/revoked-dac-02.json) | [revocation-set-for-pai.json](../../credentials/test/revoked-attestation-certificates/revocation-sets/revocation-set-for-pai.json) | Commissioning fails with `kDacRevoked` (302) |
-| DAC-03 revoked by PAI | [revoked-dac-03.json](../../credentials/test/revoked-attestation-certificates/dac-provider-test-vectors/revoked-dac-03.json) | [revocation-set-for-pai.json](../../credentials/test/revoked-attestation-certificates/revocation-sets/revocation-set-for-pai.json) | Commissioning fails with `kDacRevoked` (302) |
+Please use
+`credentials/test/revoked-attestation-certificates/revocation-sets/revocation-set.json`
+as revocation set
+
+| Description | DAC Provider | Expected Result |
+| --------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------- |
+| PAI revoked by PAA | [revoked-pai.json](../../credentials/test/revoked-attestation-certificates/dac-provider-test-vectors/revoked-pai.json) | Commissioning fails with `kPaiRevoked` (202) |
+| DAC-01 revoked by PAI | [revoked-dac-01.json](../../credentials/test/revoked-attestation-certificates/dac-provider-test-vectors/revoked-dac-01.json) | Commissioning fails with `kDacRevoked` (302) |
+| DAC-02 revoked by PAI | [revoked-dac-02.json](../../credentials/test/revoked-attestation-certificates/dac-provider-test-vectors/revoked-dac-02.json) | Commissioning fails with `kDacRevoked` (302) |
+| DAC-03 revoked by PAI | [revoked-dac-03.json](../../credentials/test/revoked-attestation-certificates/dac-provider-test-vectors/revoked-dac-03.json) | Commissioning fails with `kDacRevoked` (302) |
+| DAC and PAI revoked | [revoked-dac-and-pai.json](../../credentials/test/revoked-attestation-certificates/dac-provider-test-vectors/revoked-dac-and-pai.json) | Commissioning fails with `kPaiAndDacRevoked` (208) |
diff --git a/src/python_testing/TC_DA_1_9.py b/src/python_testing/TC_DA_1_9.py
new file mode 100644
index 0000000..8bc2c24
--- /dev/null
+++ b/src/python_testing/TC_DA_1_9.py
@@ -0,0 +1,217 @@
+#!/usr/bin/env -S python3 -B
+#
+# Copyright (c) 2025 Project CHIP Authors
+# All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# This script is intended for QA use only and does not automatically
+# verify the results of the commissioning process. Please use with caution.
+#
+# [TC-DA-1.9] Device Attestation Revocation [DUT-Commissioner]
+#
+# This test is about commissioning a device configured with a revoked DAC and/or PAI
+# and checking if the commissioner warns about the device attestation error.
+# The test case will be successful if the commissioner warns about the device
+# attestation error and the device is not commissioned.
+
+# See https://github.com/project-chip/connectedhomeip/blob/master/docs/testing/python.md#defining-the-ci-test-arguments
+# for details about the block below.
+#
+# === BEGIN CI TEST ARGUMENTS ===
+# test-runner-runs:
+# run1:
+# script-args: >
+# --storage-path admin_storage.json
+# --PICS src/app/tests/suites/certification/ci-pics-values
+# --string-arg app_path:out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app
+# --string-arg dac_provider_base_path:credentials/test/revoked-attestation-certificates/dac-provider-test-vectors
+# --string-arg revocation_set_base_path:credentials/test/revoked-attestation-certificates/revocation-sets
+# --string-arg app_log_path:/tmp/TC_DA_1_9
+# --trace-to json:${TRACE_TEST_JSON}.json
+# --trace-to perfetto:${TRACE_TEST_PERFETTO}.perfetto
+# factory-reset: true
+# quiet: true
+# === END CI TEST ARGUMENTS ===
+
+import os
+import signal
+import subprocess
+
+from chip.testing.matter_testing import MatterBaseTest, TestStep, async_test_body, default_matter_test_main
+from mobly import asserts
+
+
+class TC_DA_1_9(MatterBaseTest):
+ def setup_class(self):
+ super().setup_class()
+
+ self.app_path = self.matter_test_config.global_test_params.get('app_path')
+ self.dac_provider_base_path = self.matter_test_config.global_test_params.get('dac_provider_base_path')
+ self.revocation_set_base_path = self.matter_test_config.global_test_params.get('revocation_set_base_path')
+
+ if self.app_path is None or not os.path.exists(self.app_path):
+ asserts.fail("--string-arg app_path:<app_path> is required for this test, please provide the path to the app (eg: all-clusters-app)")
+
+ if self.dac_provider_base_path is None or not os.path.exists(self.dac_provider_base_path):
+ asserts.fail("--string-arg dac_provider_base_path:<dac_provider_base_path> is required for this test, please provide the path to the dac provider test vectors, it can be found in Matter SDK at: credentials/test/revoked-attestation-certificates/dac-provider-test-vectors")
+
+ if self.revocation_set_base_path is None or not os.path.exists(self.revocation_set_base_path):
+ asserts.fail("--string-arg revocation_set_base_path:<revocation_set_base_path> is required for this test, please provide the path to the revocation set, it can be found in Matter SDK at: credentials/test/revoked-attestation-certificates/revocation-sets")
+
+ def desc_TC_DA_1_9(self) -> str:
+ return "[TC-DA-1.9] Device Attestation Revocation [DUT-Commissioner]"
+
+ def pics_TC_DA_1_9(self) -> list[str]:
+ pics = [
+ "MCORE.ROLE.COMMISSIONER",
+ ]
+ return pics
+
+ def steps_TC_DA_1_9(self) -> list[TestStep]:
+ return [
+ TestStep(1, "Test commissioning with revoked DAC",
+ "(DUT)Commissioner warns about commissioning the non-genuine device, Or Commissioning fails with device appropriate attestation error"),
+ TestStep(2, "Test commissioning with revoked PAI",
+ "(DUT)Commissioner warns about commissioning the non-genuine device, Or Commissioning fails with device appropriate attestation error"),
+ TestStep(3, "Test commissioning with both DAC and PAI revoked",
+ "(DUT)Commissioner warns about commissioning the non-genuine device, Or Commissioning fails with device appropriate attestation error"),
+ TestStep(4, "Test commissioning with revoked DAC using delegated CRL signer",
+ "(DUT)Commissioner warns about commissioning the non-genuine device, Or Commissioning fails with device appropriate attestation error"),
+ TestStep(5, "Test commissioning with revoked PAI using delegated CRL signer",
+ "(DUT)Commissioner warns about commissioning the non-genuine device, Or Commissioning fails with device appropriate attestation error"),
+ TestStep(6, "Test commissioning with both DAC and PAI revoked using delegated CRL signer",
+ "(DUT)Commissioner warns about commissioning the non-genuine device, Or Commissioning fails with device appropriate attestation error"),
+ TestStep(7, "Test commissioning with valid DAC and PAI",
+ "Commissioning succeeds without any attestation errors"),
+ ]
+
+ @async_test_body
+ async def test_TC_DA_1_9(self):
+ test_vectors = [
+ {
+ 'name': 'tc_dac_revoked',
+ 'dac_provider': 'revoked-dac-01.json',
+ 'revocation_set': 'revocation-set.json',
+ 'expects_commissioning_success': False,
+ 'manual_pairing_code': '14970112338',
+ 'discriminator': 0x700,
+ },
+ {
+ 'name': 'tc_pai_revoked',
+ 'dac_provider': 'revoked-pai.json',
+ 'revocation_set': 'revocation-set.json',
+ 'expects_commissioning_success': False,
+ 'manual_pairing_code': '20054912334',
+ 'discriminator': 0x800,
+ },
+ {
+ 'name': 'tc_dac_and_pai_revoked',
+ 'dac_provider': 'revoked-dac-and-pai.json',
+ 'revocation_set': 'revocation-set.json',
+ 'expects_commissioning_success': False,
+ 'manual_pairing_code': '21693312337',
+ 'discriminator': 0x900,
+ },
+ {
+ 'name': 'tc_dac_revoked_using_delegated_crl_signer',
+ 'dac_provider': 'indirect-revoked-dac-01.json',
+ 'revocation_set': 'revocation-set.json',
+ 'expects_commissioning_success': False,
+ 'manual_pairing_code': '23331712339',
+ 'discriminator': 0xA00,
+ },
+ {
+ 'name': 'tc_pai_revoked_using_delegated_crl_signer',
+ 'dac_provider': 'indirect-revoked-pai-03.json',
+ 'revocation_set': 'revocation-set.json',
+ 'expects_commissioning_success': False,
+ 'manual_pairing_code': '24970112330',
+ 'discriminator': 0xB00,
+ },
+ {
+ 'name': 'tc_dac_and_pai_revoked_using_delegated_crl_signer',
+ 'dac_provider': 'indirect-revoked-dac-01-pai-03.json',
+ 'revocation_set': 'revocation-set.json',
+ 'expects_commissioning_success': False,
+ 'manual_pairing_code': '30054912331',
+ 'discriminator': 0xC00,
+ },
+ {
+ 'name': 'tc_dac_and_pai_valid',
+ 'dac_provider': None,
+ 'revocation_set': 'revocation-set.json',
+ 'expects_commissioning_success': True,
+ 'manual_pairing_code': '31693312339',
+ 'discriminator': 0xD00,
+ }
+ ]
+
+ for idx, test_case in enumerate(test_vectors):
+ self.step(idx + 1)
+
+ # Clean up any existing KVS files
+ subprocess.call("rm -f all-clusters-kvs*", shell=True)
+
+ # Create log files for this test case
+ log_path = os.path.join(self.matter_test_config.logs_path, 'TC_DA_1_9')
+ os.makedirs(log_path, exist_ok=True)
+ app_log_file_name = os.path.join(log_path, f"{test_case['name']}_app.log")
+
+ with open(app_log_file_name, 'w') as app_log_file:
+ # Start the all-clusters-app with appropriate DAC provider
+ app_args = '--trace_decode 1 --KVS all-clusters-kvs'
+ if test_case['dac_provider']:
+ dac_provider_path = os.path.join(self.dac_provider_base_path, test_case['dac_provider'])
+ app_args += f' --dac_provider {dac_provider_path}'
+
+ if test_case['discriminator']:
+ discriminator = test_case['discriminator']
+ app_args += f' --discriminator {discriminator}'
+
+ app_cmd = f"{self.app_path} {app_args}"
+
+ # Run the all-clusters-app in background
+ app_process = subprocess.Popen(app_cmd.split(), stdout=app_log_file, stderr=app_log_file)
+
+ # Prompt user with instructions
+ prompt_msg = (
+ f"\nPlease commission the DUT with:\n"
+ f" Manual Pairing Code: '{test_case['manual_pairing_code']}'\n"
+ f" Revocation Set: {os.path.join(self.revocation_set_base_path, test_case['revocation_set'])}\n\n"
+ f"Input 'Y' if DUT successfully commissions without any warnings\n"
+ f"Input 'N' if commissioner warns about commissioning the non-genuine device, "
+ f"Or Commissioning fails with device appropriate attestation error\n"
+ )
+
+ # TODO: Run Python commissioner, commission the DUT, and check the return code
+ if self.is_pics_sdk_ci_only:
+ resp = 'Y' if test_case['expects_commissioning_success'] else 'N'
+ else:
+ resp = self.wait_for_user_input(prompt_msg)
+
+ commissioning_success = resp.lower() == 'y'
+
+ # Verify results
+ asserts.assert_equal(
+ commissioning_success,
+ test_case['expects_commissioning_success'],
+ f"Commissioning {'succeeded' if commissioning_success else 'failed'} when it should have {'succeeded' if test_case['expects_commissioning_success'] else 'failed'}"
+ )
+
+ app_process.send_signal(signal.SIGTERM.value)
+ app_process.wait()
+
+
+if __name__ == "__main__":
+ default_matter_test_main()