Skip to content

Commit 16f84f9

Browse files
authored
Merge pull request #568 from zigbee-alliance/#524-Enable-removing-NOC-root-certs
#524 Enable removing NOC root certificates
2 parents 6f3b8bf + c9cb99b commit 16f84f9

File tree

20 files changed

+2099
-314
lines changed

20 files changed

+2099
-314
lines changed

docs/transactions.md

+20
Original file line numberDiff line numberDiff line change
@@ -1406,6 +1406,26 @@ Revoked certificates can be retrieved by using the [GET_REVOKED_CERT](#get_revok
14061406
- Validation:
14071407
- a NOC Root Certificate with the provided `subject` and `subject_key_id` must exist in the ledger.
14081408

1409+
#### REMOVE_NOC_ROOT
1410+
1411+
**Status: Implemented**
1412+
1413+
This transaction completely removes the given NOC root certificate owned by the Vendor from the ledger.
1414+
Removed NOC root certificates can be re-added using the [ADD_NOC_ROOT](#add_noc_root) transaction.
1415+
1416+
- Who can send: Vendor account
1417+
- Vid field associated with the corresponding NOC certificate on the ledger must be equal to the Vendor account's VID.
1418+
- Validation:
1419+
- a NOC Root Certificate with the provided `subject` and `subject_key_id` must exist in the ledger.
1420+
- Parameters:
1421+
- subject: `string` - base64 encoded subject DER sequence bytes of the certificate.
1422+
- subject_key_id: `string` - certificate's `Subject Key Id` in hex string format, e.g., `5A:88:0E:6C:36:53:D0:7F:B0:89:71:A3:F4:73:79:09:30:E6:2B:DB`.
1423+
- serial_number: `optional(string)` - certificate's serial number. If not provided, the transaction will remove all certificates that match the given `subject` and `subject_key_id` combination.
1424+
- CLI command:
1425+
- `dcld tx pki remove-noc-x509-root-cert --subject=<base64 string> --subject-key-id=<hex string> --from=<account>`
1426+
1427+
1428+
14091429
#### ADD_NOC_ICA
14101430

14111431
**Status: Implemented**

integration_tests/cli/pki-remove-noc-certificates.sh

+108-1
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,19 @@ root_cert_1_path="integration_tests/constants/noc_root_cert_1"
55
root_cert_subject="MHoxCzAJBgNVBAYTAlVaMRMwEQYDVQQIDApTb21lIFN0YXRlMREwDwYDVQQHDAhUYXNoa2VudDEYMBYGA1UECgwPRXhhbXBsZSBDb21wYW55MRkwFwYDVQQLDBBUZXN0aW5nIERpdmlzaW9uMQ4wDAYDVQQDDAVOT0MtMQ=="
66
root_cert_subject_key_id="44:EB:4C:62:6B:25:48:CD:A2:B3:1C:87:41:5A:08:E7:2B:B9:83:26"
77
root_cert_1_serial_number="47211865327720222621302679792296833381734533449"
8+
9+
root_cert_1_copy_path="integration_tests/constants/noc_root_cert_1_copy"
10+
root_cert_1_copy_serial_number="460647353168152946606945669687905527879095841977"
11+
812
root_cert_vid=65521
13+
914
intermediate_cert_1_path="integration_tests/constants/noc_cert_1"
1015
intermediate_cert_2_path="integration_tests/constants/noc_cert_1_copy"
1116
intermediate_cert_subject="MIGCMQswCQYDVQQGEwJVWjETMBEGA1UECAwKU29tZSBTdGF0ZTETMBEGA1UEBwwKU29tZSBTdGF0ZTEYMBYGA1UECgwPRXhhbXBsZSBDb21wYW55MRkwFwYDVQQLDBBUZXN0aW5nIERpdmlzaW9uMRQwEgYDVQQDDAtOT0MtY2hpbGQtMQ=="
1217
intermediate_cert_subject_key_id="02:72:6E:BC:BB:EF:D6:BD:8D:9B:42:AE:D4:3C:C0:55:5F:66:3A:B3"
1318
intermediate_cert_1_serial_number="631388393741945881054190991612463928825155142122"
1419
intermediate_cert_2_serial_number="169445068204646961882009388640343665944683778293"
20+
1521
leaf_cert_path="integration_tests/constants/noc_leaf_cert_1"
1622
leaf_cert_subject="MIGBMQswCQYDVQQGEwJVWjETMBEGA1UECAwKU29tZSBTdGF0ZTETMBEGA1UEBwwKU29tZSBTdGF0ZTEYMBYGA1UECgwPRXhhbXBsZSBDb21wYW55MRkwFwYDVQQLDBBUZXN0aW5nIERpdmlzaW9uMRMwEQYDVQQDDApOT0MtbGVhZi0x"
1723
leaf_cert_subject_key_id="77:1F:DB:C4:4C:B1:29:7E:3C:EB:3E:D8:2A:38:0B:63:06:07:00:01"
@@ -21,7 +27,7 @@ trustee_account="jack"
2127

2228
test_divider
2329

24-
echo "REMOVE NOC ICA CERTIFICATES"
30+
echo "REMOVING the NOC and ICA CERTIFICATES"
2531

2632
vendor_account_65521=vendor_account_$root_cert_vid
2733
echo "Create Vendor account - $vendor_account_65521"
@@ -206,4 +212,105 @@ response_does_not_contain "$result" "\"serialNumber\": \"$intermediate_cert_1_se
206212
response_does_not_contain "$result" "\"serialNumber\": \"$intermediate_cert_2_serial_number\""
207213
response_does_not_contain "$result" "\"serialNumber\": \"$leaf_cert_serial_number"
208214

215+
echo "Add second NOC root certificate"
216+
result=$(echo "$passphrase" | dcld tx pki add-noc-x509-root-cert --certificate="$root_cert_1_copy_path" --from $vendor_account_65521 --yes)
217+
result=$(get_txn_result "$result")
218+
check_response "$result" "\"code\": 0"
219+
220+
echo "Re-add an ICA certificate"
221+
result=$(echo "$passphrase" | dcld tx pki add-noc-x509-ica-cert --certificate="$intermediate_cert_1_path" --from $vendor_account_65521 --yes)
222+
result=$(get_txn_result "$result")
223+
check_response "$result" "\"code\": 0"
224+
225+
echo "Check that root cert is added. Request all approved certificates."
226+
result=$(dcld query pki all-x509-certs)
227+
echo $result | jq
228+
check_response "$result" "\"serialNumber\": \"$root_cert_1_serial_number\""
229+
check_response "$result" "\"serialNumber\": \"$root_cert_1_copy_serial_number\""
230+
231+
echo "Try to remove NOC root certificate with invalid serialNumber"
232+
result=$(echo "$passphrase" | dcld tx pki remove-noc-x509-root-cert --subject="$root_cert_subject" --subject-key-id="$root_cert_subject_key_id" --serial-number="invalid" --from=$vendor_account_65521 --yes)
233+
result=$(get_txn_result "$result")
234+
check_response "$result" "\"code\": 404"
235+
236+
echo "Try to remove NOC root certificate when sender is not Vendor account"
237+
result=$(echo "$passphrase" | dcld tx pki remove-noc-x509-root-cert --subject="$root_cert_subject" --subject-key-id="$root_cert_subject_key_id" --serial-number="$root_cert_1_serial_number" --from=$trustee_account --yes)
238+
result=$(get_txn_result "$result")
239+
check_response "$result" "\"code\": 4"
240+
241+
echo "Try to remove NOC root certificate using a vendor account with other VID"
242+
result=$(echo "$passphrase" | dcld tx pki remove-noc-x509-root-cert --subject="$root_cert_subject" --subject-key-id="$root_cert_subject_key_id" --serial-number="$root_cert_1_serial_number" --from=$vendor_account_65522 --yes)
243+
result=$(get_txn_result "$result")
244+
check_response "$result" "\"code\": 4"
245+
246+
echo "Revoke NOC root certificate with serialNumber $root_cert_1_serial_number"
247+
result=$(echo "$passphrase" | dcld tx pki revoke-noc-x509-root-cert --subject="$root_cert_subject" --subject-key-id="$root_cert_subject_key_id" --serial-number="$root_cert_1_serial_number" --from=$vendor_account_65521 --yes)
248+
result=$(get_txn_result "$result")
249+
check_response "$result" "\"code\": 0"
250+
251+
echo "Request all revoked certificates should contain NOC root certificate with serialNumber $root_cert_1_serial_number"
252+
result=$(dcld query pki all-revoked-x509-certs)
253+
echo $result | jq
254+
check_response "$result" "\"serialNumber\": \"$root_cert_1_serial_number\""
255+
256+
echo "Remove NOC root certificate with serialNumber $root_cert_1_serial_number"
257+
result=$(echo "$passphrase" | dcld tx pki remove-noc-x509-root-cert --subject="$root_cert_subject" --subject-key-id="$root_cert_subject_key_id" --serial-number="$root_cert_1_serial_number" --from=$vendor_account_65521 --yes)
258+
result=$(get_txn_result "$result")
259+
check_response "$result" "\"code\": 0"
260+
261+
echo "Request all certificates should contain only one NOC root certificate"
262+
result=$(dcld query pki all-x509-certs)
263+
echo $result | jq
264+
check_response "$result" "\"serialNumber\": \"$root_cert_1_copy_serial_number\""
265+
check_response "$result" "\"serialNumber\": \"$intermediate_cert_1_serial_number\""
266+
response_does_not_contain "$result" "\"serialNumber\": \"$root_cert_1_serial_number\""
267+
268+
echo "Request NOC certificates by VID should contain one NOC root certificate"
269+
result=$(dcld query pki noc-x509-root-certs --vid="$root_cert_vid")
270+
echo $result | jq
271+
check_response "$result" "\"serialNumber\": \"$root_cert_1_copy_serial_number\""
272+
response_does_not_contain "$result" "\"serialNumber\": \"$root_cert_1_serial_number\""
273+
274+
echo "Request approved certificates by NOC root's subject and subjectKeyId should contain only one root certificate"
275+
result=$(dcld query pki x509-cert --subject="$root_cert_subject" --subject-key-id="$root_cert_subject_key_id")
276+
echo $result | jq
277+
check_response "$result" "\"serialNumber\": \"$root_cert_1_copy_serial_number\""
278+
response_does_not_contain "$result" "\"serialNumber\": \"$root_cert_1_serial_number\""
279+
280+
echo "Re-add NOC root certificate"
281+
result=$(echo "$passphrase" | dcld tx pki add-noc-x509-root-cert --certificate="$root_cert_1_path" --from $vendor_account_65521 --yes)
282+
result=$(get_txn_result "$result")
283+
check_response "$result" "\"code\": 0"
284+
285+
echo "Check that root cert is added. Request all approved certificates."
286+
result=$(dcld query pki all-x509-certs)
287+
echo $result | jq
288+
check_response "$result" "\"serialNumber\": \"$root_cert_1_serial_number\""
289+
check_response "$result" "\"serialNumber\": \"$root_cert_1_copy_serial_number\""
290+
291+
echo "Remove NOC root certificates"
292+
result=$(echo "$passphrase" | dcld tx pki remove-noc-x509-root-cert --subject="$root_cert_subject" --subject-key-id="$root_cert_subject_key_id" --from=$vendor_account_65521 --yes)
293+
result=$(get_txn_result "$result")
294+
check_response "$result" "\"code\": 0"
295+
296+
echo "Request approved NOC root certificates should be empty"
297+
result=$(dcld query pki x509-cert --subject="$root_cert_subject" --subject-key-id="$root_cert_subject_key_id")
298+
echo $result | jq
299+
check_response "$result" "Not Found"
300+
response_does_not_contain "$result" "\"serialNumber\": \"$root_cert_1_serial_number"
301+
response_does_not_contain "$result" "\"serialNumber\": \"$root_cert_1_copy_serial_number"
302+
303+
echo "Request NOC root certificates by VID should be empty"
304+
result=$(dcld query pki noc-x509-root-certs --vid="$root_cert_vid")
305+
echo $result | jq
306+
response_does_not_contain "$result" "\"serialNumber\": \"$root_cert_1_serial_number"
307+
response_does_not_contain "$result" "\"serialNumber\": \"$root_cert_1_copy_serial_number"
308+
309+
echo "Request all certificates should contain only ICA certificate"
310+
result=$(dcld query pki all-x509-certs)
311+
echo $result | jq
312+
check_response "$result" "\"serialNumber\": \"$intermediate_cert_1_serial_number\""
313+
response_does_not_contain "$result" "\"serialNumber\": \"$root_cert_1_serial_number"
314+
response_does_not_contain "$result" "\"serialNumber\": \"$root_cert_1_copy_serial_number"
315+
209316
test_divider

integration_tests/grpc_rest/pki/noc_cert_helpers.go

+81
Original file line numberDiff line numberDiff line change
@@ -667,4 +667,85 @@ func NocCertDemo(suite *utils.TestSuite) {
667667
require.Empty(suite.T, certificates)
668668
certificates = GetNocX509IcaCertsBySubjectAndSKID(suite, vid1, testconstants.NocLeafCert1Subject, testconstants.NocLeafCert1SubjectKeyID)
669669
require.Empty(suite.T, certificates)
670+
671+
// Remove revoked NOC root certificate by invalid serial number
672+
msgRemoveRootCert := pkitypes.MsgRemoveNocX509RootCert{
673+
Signer: vendor1Account.Address,
674+
Subject: testconstants.NocRootCert1Subject,
675+
SubjectKeyId: testconstants.NocRootCert1SubjectKeyID,
676+
SerialNumber: "invalid",
677+
}
678+
_, err = suite.BuildAndBroadcastTx([]sdk.Msg{&msgRemoveRootCert}, vendor1Name, vendor1Account)
679+
require.Error(suite.T, err)
680+
681+
// Remove revoked NOC root certificate by serial number
682+
msgRemoveRootCert = pkitypes.MsgRemoveNocX509RootCert{
683+
Signer: vendor1Account.Address,
684+
Subject: testconstants.NocRootCert1Subject,
685+
SubjectKeyId: testconstants.NocRootCert1SubjectKeyID,
686+
SerialNumber: testconstants.NocRootCert1SerialNumber,
687+
}
688+
_, err = suite.BuildAndBroadcastTx([]sdk.Msg{&msgRemoveRootCert}, vendor1Name, vendor1Account)
689+
require.NoError(suite.T, err)
690+
691+
// Check that NOC root certificate is removed
692+
revokedCerts, _ = GetRevokedX509Cert(suite, testconstants.NocRootCert1Subject, testconstants.NocRootCert1SubjectKeyID)
693+
require.Equal(suite.T, 1, len(revokedCerts.Certs))
694+
require.Equal(suite.T, testconstants.NocRootCert1CopySerialNumber, revokedCerts.Certs[0].SerialNumber)
695+
_, err = GetX509Cert(suite, testconstants.NocRootCert1Subject, testconstants.NocRootCert1SubjectKeyID)
696+
suite.AssertNotFound(err)
697+
698+
// Add root NOC certificate
699+
msgAddNocRootCert = pkitypes.MsgAddNocX509RootCert{
700+
Signer: vendor1Account.Address,
701+
Cert: testconstants.NocRootCert1,
702+
}
703+
_, err = suite.BuildAndBroadcastTx([]sdk.Msg{&msgAddNocRootCert}, vendor1Name, vendor1Account)
704+
require.NoError(suite.T, err)
705+
706+
// Remove revoked ICA certificate to re-add it again
707+
msgRemoveCert = pkitypes.MsgRemoveNocX509IcaCert{
708+
Signer: vendor1Account.Address,
709+
Subject: testconstants.NocCert1Subject,
710+
SubjectKeyId: testconstants.NocCert1SubjectKeyID,
711+
SerialNumber: "",
712+
}
713+
_, err = suite.BuildAndBroadcastTx([]sdk.Msg{&msgRemoveCert}, vendor1Name, vendor1Account)
714+
require.NoError(suite.T, err)
715+
716+
// Add ICA certificates
717+
msgAddNocCert = pkitypes.MsgAddNocX509IcaCert{
718+
Signer: vendor1Account.Address,
719+
Cert: testconstants.NocCert1,
720+
}
721+
_, err = suite.BuildAndBroadcastTx([]sdk.Msg{&msgAddNocCert}, vendor1Name, vendor1Account)
722+
require.NoError(suite.T, err)
723+
724+
certs, _ = GetX509Cert(suite, testconstants.NocRootCert1Subject, testconstants.NocRootCert1SubjectKeyID)
725+
require.Equal(suite.T, 1, len(certs.Certs))
726+
727+
// Remove revoked NOC root certificates
728+
msgRemoveRootCert = pkitypes.MsgRemoveNocX509RootCert{
729+
Signer: vendor1Account.Address,
730+
Subject: testconstants.NocRootCert1Subject,
731+
SubjectKeyId: testconstants.NocRootCert1SubjectKeyID,
732+
SerialNumber: "",
733+
}
734+
_, err = suite.BuildAndBroadcastTx([]sdk.Msg{&msgRemoveRootCert}, vendor1Name, vendor1Account)
735+
require.NoError(suite.T, err)
736+
737+
// Check that certificates are removed
738+
_, err = GetX509Cert(suite, testconstants.NocRootCert1Subject, testconstants.NocRootCert1SubjectKeyID)
739+
suite.AssertNotFound(err)
740+
_, err = GetRevokedX509Cert(suite, testconstants.NocRootCert1Subject, testconstants.NocRootCert1SubjectKeyID)
741+
suite.AssertNotFound(err)
742+
_, err = GetNocX509RootCertsByVidAndSkid(suite, vid1, testconstants.NocRootCert1SubjectKeyID)
743+
suite.AssertNotFound(err)
744+
745+
// Check that child is not removed
746+
certs, _ = GetX509Cert(suite, testconstants.NocCert1Subject, testconstants.NocCert1SubjectKeyID)
747+
require.Equal(suite.T, 1, len(certs.Certs))
748+
certificates = GetNocX509IcaCertsBySubjectAndSKID(suite, vid1, testconstants.NocCert1Subject, testconstants.NocCert1SubjectKeyID)
749+
require.Equal(suite.T, 1, len(certificates))
750+
require.Equal(suite.T, testconstants.NocCert1SerialNumber, certificates[0].SerialNumber)
670751
}

proto/zigbeealliance/distributedcomplianceledger/pki/tx.proto

+10
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ service Msg {
2727
rpc RevokeNocX509RootCert(MsgRevokeNocX509RootCert) returns (MsgRevokeNocX509RootCertResponse);
2828
rpc RevokeNocX509IcaCert(MsgRevokeNocX509IcaCert) returns (MsgRevokeNocX509IcaCertResponse);
2929
rpc RemoveNocX509IcaCert (MsgRemoveNocX509IcaCert) returns (MsgRemoveNocX509IcaCertResponse);
30+
rpc RemoveNocX509RootCert (MsgRemoveNocX509RootCert) returns (MsgRemoveNocX509RootCertResponse);
3031
// this line is used by starport scaffolding # proto/tx/rpc
3132
}
3233

@@ -241,3 +242,12 @@ message MsgRemoveNocX509IcaCert {
241242
}
242243

243244
message MsgRemoveNocX509IcaCertResponse {}
245+
246+
message MsgRemoveNocX509RootCert {
247+
string signer = 1 [(cosmos_proto.scalar) = "cosmos.AddressString", (gogoproto.moretags) = "validate:\"required\""];
248+
string subject = 2 [(gogoproto.moretags) = "validate:\"required,max=1024\""];
249+
string subjectKeyId = 3 [(gogoproto.moretags) = "validate:\"required,max=256\""];
250+
string serialNumber = 4;
251+
}
252+
253+
message MsgRemoveNocX509RootCertResponse {}

scripts/ignite/07.pki_types.sh

+1
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@
22

33
# messages
44
ignite scaffold --module pki message RemoveNocX509IcaCert subject subjectKeyId serialNumber --signer signer
5+
ignite scaffold --module pki message RemoveNocX509RootCert subject subjectKeyId serialNumber --signer signer

0 commit comments

Comments
 (0)