Skip to content

Commit 0bb16cc

Browse files
committed
#535 Add new txn to remove non-root certificates
Resolve MR's comments Signed-off-by: Abdulbois <abdulbois.tursunov@dsr-corporation.com> Signed-off-by: Abdulbois <abdulbois123@gmail.com>
1 parent 0414b0a commit 0bb16cc

File tree

5 files changed

+254
-38
lines changed

5 files changed

+254
-38
lines changed

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

+24-3
Original file line numberDiff line numberDiff line change
@@ -76,19 +76,31 @@ check_response "$result" "\"serialNumber\": \"$intermediate_cert_2_serial_number
7676
check_response "$result" "\"serialNumber\": \"$leaf_cert_serial_number\""
7777
response_does_not_contain "$result" "\"serialNumber\": \"$intermediate_cert_1_serial_number\""
7878

79-
echo "Request all approved intermediate certificates should contain only one certificate with serialNumber 4"
79+
echo "Request approved certificates by an intermediate certificate's subject and subjectKeyId should contain only one certificate with serialNumber 4"
8080
result=$(dcld query pki x509-cert --subject="$intermediate_cert_subject" --subject-key-id="$intermediate_cert_subject_key_id")
8181
echo $result | jq
8282
check_response "$result" "\"subject\": \"$intermediate_cert_subject\""
8383
check_response "$result" "\"subjectKeyId\": \"$intermediate_cert_subject_key_id\""
8484
check_response "$result" "\"serialNumber\": \"$intermediate_cert_2_serial_number\""
8585
response_does_not_contain "$result" "\"serialNumber\": \"$intermediate_cert_1_serial_number\""
8686

87-
echo "Remove intermediate certificate with subject and subjectKeyId"
87+
echo "Revoke an intermediate certificate with serialNumber 3"
88+
result=$(echo "$passphrase" | dcld tx pki revoke-x509-cert --subject="$intermediate_cert_subject" --subject-key-id="$intermediate_cert_subject_key_id" --serial-number="$intermediate_cert_1_serial_number" --from=$trustee_account --yes)
89+
check_response "$result" "\"code\": 0"
90+
91+
echo "Request all revoked certificates should contain only one intermediate certificate with serialNumber 3"
92+
result=$(dcld query pki all-revoked-x509-certs)
93+
echo $result | jq
94+
check_response "$result" "\"subject\": \"$intermediate_cert_subject\""
95+
check_response "$result" "\"subjectKeyId\": \"$intermediate_cert_subject_key_id\""
96+
check_response "$result" "\"serialNumber\": \"$intermediate_cert_1_serial_number\""
97+
response_does_not_contain "$result" "\"serialNumber\": \"$intermediate_cert_2_serial_number\""
98+
99+
echo "Remove an intermediate certificate with subject and subjectKeyId"
88100
result=$(echo "$passphrase" | dcld tx pki remove-x509-cert --subject="$intermediate_cert_subject" --subject-key-id="$intermediate_cert_subject_key_id" --from=$trustee_account --yes)
89101
check_response "$result" "\"code\": 0"
90102

91-
echo "Request approved intermediate certificates should be empty"
103+
echo "Request approved certificates by an intermediate certificate's subject and subjectKeyId should be empty"
92104
result=$(dcld query pki x509-cert --subject="$intermediate_cert_subject" --subject-key-id="$intermediate_cert_subject_key_id")
93105
echo $result | jq
94106
check_response "$result" "Not Found"
@@ -97,6 +109,15 @@ response_does_not_contain "$result" "\"subjectKeyId\": \"$intermediate_cert_subj
97109
response_does_not_contain "$result" "\"serialNumber\": \"$intermediate_cert_2_serial_number\""
98110
response_does_not_contain "$result" "\"serialNumber\": \"$intermediate_cert_1_serial_number\""
99111

112+
echo "Request all revoked certificates should be empty"
113+
result=$(dcld query pki all-revoked-x509-certs)
114+
echo $result | jq
115+
check_response "$result" "Not Found"
116+
response_does_not_contain "$result" "\"subject\": \"$intermediate_cert_subject\""
117+
response_does_not_contain "$result" "\"subjectKeyId\": \"$intermediate_cert_subject_key_id\""
118+
response_does_not_contain "$result" "\"serialNumber\": \"$intermediate_cert_1_serial_number\""
119+
response_does_not_contain "$result" "\"serialNumber\": \"$intermediate_cert_2_serial_number\""
120+
100121
echo "Request all certificates should contain only root and leaf certificates"
101122
result=$(dcld query pki all-x509-certs)
102123
echo $result | jq

integration_tests/grpc_rest/pki/helpers.go

-1
Original file line numberDiff line numberDiff line change
@@ -1844,7 +1844,6 @@ func Demo(suite *utils.TestSuite) {
18441844
suite.AssertNotFound(err)
18451845

18461846
// Remove x509 by subject, subject key id and serial number
1847-
18481847
// Add intermediate certificates
18491848
msgAddX509Cert = pkitypes.MsgAddX509Cert{
18501849
Cert: testconstants.IntermediateWithSameSubjectAndSKID1,

types/pki/errors.go

+10
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,16 @@ func NewErrMessageVidNotEqualAccountVid(msgVid int32, accountVid int32) error {
292292
return sdkerrors.Wrapf(ErrMessageVidNotEqualAccountVid, "Message vid=%d is not equal to account vid=%d", msgVid, accountVid)
293293
}
294294

295+
func NewErrMessageRemoveRoot(subject string, subjectKeyID string) error {
296+
return sdkerrors.Wrapf(ErrInappropriateCertificateType, "Inappropriate Certificate Type: Certificate with subject=%s and subjectKeyID=%s "+
297+
"is a root certificate.", subject, subjectKeyID,
298+
)
299+
}
300+
301+
func NewErrMessageOnlyOwnerCanExecute(command string) error {
302+
return sdkerrors.Wrapf(sdkerrors.ErrUnauthorized, "Only owner can revoke certificate using %s", command)
303+
}
304+
295305
func NewErrUnsupportedOperation(e interface{}) error {
296306
return sdkerrors.Wrapf(ErrUnsupportedOperation, "%v", e)
297307
}

x/pki/handler_test.go

+165-6
Original file line numberDiff line numberDiff line change
@@ -1676,7 +1676,7 @@ func TestHandler_RevokeX509Cert_BySerialNumber(t *testing.T) {
16761676
require.Equal(t, testconstants.IntermediateSubjectKeyID, revokedCerts.SubjectKeyId)
16771677
}
16781678

1679-
func TestHandler_RemoveX509Cert(t *testing.T) {
1679+
func TestHandler_RemoveX509Cert_BySubjectAndSKID(t *testing.T) {
16801680
setup := Setup(t)
16811681
// propose and approve x509 root certificate
16821682
rootCertOptions := &rootCertOptions{
@@ -1726,22 +1726,40 @@ func TestHandler_RemoveX509Cert(t *testing.T) {
17261726
leafCerts, _ := queryApprovedCertificates(setup, testconstants.LeafCertWithSameSubjectAndSKIDSubject, testconstants.LeafCertWithSameSubjectAndSKIDSubjectKeyID)
17271727
require.Equal(t, 1, len(leafCerts.Certs))
17281728
require.Equal(t, testconstants.LeafCertWithSameSubjectAndSKIDSerialNumber, leafCerts.Certs[0].SerialNumber)
1729+
}
1730+
1731+
func TestHandler_RemoveX509Cert_BySerialNumber(t *testing.T) {
1732+
setup := Setup(t)
1733+
// propose and approve x509 root certificate
1734+
rootCertOptions := &rootCertOptions{
1735+
pemCert: testconstants.RootCertWithSameSubjectAndSKID1,
1736+
subject: testconstants.RootCertWithSameSubjectAndSKIDSubject,
1737+
subjectKeyID: testconstants.RootCertWithSameSubjectAndSKIDSubjectKeyID,
1738+
info: testconstants.Info,
1739+
vid: 65521,
1740+
}
1741+
proposeAndApproveRootCertificate(setup, setup.Trustee1, rootCertOptions)
17291742

17301743
// Add two intermediate certificates again
1731-
addIntermediateX509Cert = types.NewMsgAddX509Cert(setup.Trustee1.String(), testconstants.IntermediateWithSameSubjectAndSKID1)
1732-
_, err = setup.Handler(setup.Ctx, addIntermediateX509Cert)
1744+
addIntermediateX509Cert := types.NewMsgAddX509Cert(setup.Trustee1.String(), testconstants.IntermediateWithSameSubjectAndSKID1)
1745+
_, err := setup.Handler(setup.Ctx, addIntermediateX509Cert)
17331746
require.NoError(t, err)
17341747
addIntermediateX509Cert = types.NewMsgAddX509Cert(setup.Trustee1.String(), testconstants.IntermediateWithSameSubjectAndSKID2)
17351748
_, err = setup.Handler(setup.Ctx, addIntermediateX509Cert)
17361749
require.NoError(t, err)
17371750

1751+
// Add a leaf certificate
1752+
addLeafX509Cert := types.NewMsgAddX509Cert(setup.Trustee1.String(), testconstants.LeafCertWithSameSubjectAndSKID)
1753+
_, err = setup.Handler(setup.Ctx, addLeafX509Cert)
1754+
require.NoError(t, err)
1755+
17381756
intermediateCerts, _ := queryApprovedCertificates(setup, testconstants.IntermediateCertWithSameSubjectAndSKIDSubject, testconstants.IntermediateCertWithSameSubjectAndSKIDSubjectKeyID)
17391757
require.Equal(t, 2, len(intermediateCerts.Certs))
17401758
require.Equal(t, testconstants.IntermediateCertWithSameSubjectAndSKIDSubject, intermediateCerts.Certs[0].Subject)
17411759
require.Equal(t, testconstants.IntermediateCertWithSameSubjectAndSKIDSubjectKeyID, intermediateCerts.Certs[0].SubjectKeyId)
17421760

17431761
// remove intermediate certificate by serial number
1744-
removeX509Cert = types.NewMsgRemoveX509Cert(
1762+
removeX509Cert := types.NewMsgRemoveX509Cert(
17451763
setup.Trustee1.String(),
17461764
testconstants.IntermediateCertWithSameSubjectAndSKIDSubject,
17471765
testconstants.IntermediateCertWithSameSubjectAndSKIDSubjectKeyID,
@@ -1751,10 +1769,10 @@ func TestHandler_RemoveX509Cert(t *testing.T) {
17511769
require.NoError(t, err)
17521770

17531771
// check that only root, intermediate(with serial number 3) and leaf certificates exists
1754-
allCerts, _ = queryAllApprovedCertificates(setup)
1772+
allCerts, _ := queryAllApprovedCertificates(setup)
17551773
require.Equal(t, 3, len(allCerts))
17561774
require.Equal(t, 3, len(allCerts[0].Certs)+len(allCerts[1].Certs)+len(allCerts[2].Certs))
1757-
leafCerts, _ = queryApprovedCertificates(setup, testconstants.LeafCertWithSameSubjectAndSKIDSubject, testconstants.LeafCertWithSameSubjectAndSKIDSubjectKeyID)
1775+
leafCerts, _ := queryApprovedCertificates(setup, testconstants.LeafCertWithSameSubjectAndSKIDSubject, testconstants.LeafCertWithSameSubjectAndSKIDSubjectKeyID)
17581776
require.Equal(t, 1, len(leafCerts.Certs))
17591777

17601778
intermediateCerts, _ = queryApprovedCertificates(setup, testconstants.IntermediateCertWithSameSubjectAndSKIDSubject, testconstants.IntermediateCertWithSameSubjectAndSKIDSubjectKeyID)
@@ -1782,6 +1800,147 @@ func TestHandler_RemoveX509Cert(t *testing.T) {
17821800
require.Equal(t, 1, len(leafCerts.Certs))
17831801
}
17841802

1803+
func TestHandler_RemoveX509Cert_RevokedCertificate(t *testing.T) {
1804+
setup := Setup(t)
1805+
// propose and approve x509 root certificate
1806+
rootCertOptions := &rootCertOptions{
1807+
pemCert: testconstants.RootCertPem,
1808+
subject: testconstants.RootSubject,
1809+
subjectKeyID: testconstants.RootSubjectKeyID,
1810+
info: testconstants.Info,
1811+
vid: 65521,
1812+
}
1813+
proposeAndApproveRootCertificate(setup, setup.Trustee1, rootCertOptions)
1814+
1815+
// Add two intermediate certificates again
1816+
addIntermediateX509Cert := types.NewMsgAddX509Cert(setup.Trustee1.String(), testconstants.IntermediateCertPem)
1817+
_, err := setup.Handler(setup.Ctx, addIntermediateX509Cert)
1818+
require.NoError(t, err)
1819+
1820+
intermediateCerts, _ := queryApprovedCertificates(setup, testconstants.IntermediateSubject, testconstants.IntermediateSubjectKeyID)
1821+
require.Equal(t, 1, len(intermediateCerts.Certs))
1822+
require.Equal(t, testconstants.IntermediateSubject, intermediateCerts.Certs[0].Subject)
1823+
require.Equal(t, testconstants.IntermediateSubjectKeyID, intermediateCerts.Certs[0].SubjectKeyId)
1824+
1825+
// revoke intermediate certificate by serial number
1826+
revokeX509Cert := types.NewMsgRevokeX509Cert(
1827+
setup.Trustee1.String(),
1828+
testconstants.IntermediateSubject,
1829+
testconstants.IntermediateSubjectKeyID,
1830+
testconstants.IntermediateSerialNumber,
1831+
testconstants.Info,
1832+
)
1833+
_, err = setup.Handler(setup.Ctx, revokeX509Cert)
1834+
require.NoError(t, err)
1835+
1836+
_, err = queryApprovedCertificates(setup, testconstants.IntermediateSubject, testconstants.IntermediateSubjectKeyID)
1837+
require.Equal(t, codes.NotFound, status.Code(err))
1838+
1839+
revokedCerts, _ := queryRevokedCertificates(setup, testconstants.IntermediateSubject, testconstants.IntermediateSubjectKeyID)
1840+
require.Equal(t, 1, len(revokedCerts.Certs))
1841+
require.Equal(t, testconstants.IntermediateSubject, revokedCerts.Certs[0].Subject)
1842+
require.Equal(t, testconstants.IntermediateSubjectKeyID, revokedCerts.Certs[0].SubjectKeyId)
1843+
1844+
// remove intermediate certificate by serial number
1845+
removeX509Cert := types.NewMsgRemoveX509Cert(
1846+
setup.Trustee1.String(),
1847+
testconstants.IntermediateSubject,
1848+
testconstants.IntermediateSubjectKeyID,
1849+
testconstants.IntermediateSerialNumber,
1850+
)
1851+
_, err = setup.Handler(setup.Ctx, removeX509Cert)
1852+
require.NoError(t, err)
1853+
1854+
allCerts, _ := queryAllApprovedCertificates(setup)
1855+
require.Equal(t, 1, len(allCerts))
1856+
require.Equal(t, true, allCerts[0].Certs[0].IsRoot)
1857+
1858+
_, err = queryApprovedCertificates(setup, testconstants.IntermediateSubject, testconstants.IntermediateSubjectKeyID)
1859+
require.Equal(t, codes.NotFound, status.Code(err))
1860+
_, err = queryRevokedCertificates(setup, testconstants.IntermediateSubject, testconstants.IntermediateSubjectKeyID)
1861+
require.Equal(t, codes.NotFound, status.Code(err))
1862+
}
1863+
1864+
func TestHandler_RemoveX509Cert_CertificateDoesNotExist(t *testing.T) {
1865+
setup := Setup(t)
1866+
1867+
removeX509Cert := types.NewMsgRemoveX509Cert(
1868+
setup.Trustee1.String(), testconstants.IntermediateSubject, testconstants.IntermediateSubjectKeyID, testconstants.IntermediateSerialNumber)
1869+
_, err := setup.Handler(setup.Ctx, removeX509Cert)
1870+
require.Error(t, err)
1871+
require.True(t, pkitypes.ErrCertificateDoesNotExist.Is(err))
1872+
}
1873+
1874+
func TestHandler_RemoveX509Cert_EmptyCertificatesList(t *testing.T) {
1875+
setup := Setup(t)
1876+
1877+
rootCertificate := rootCertificate(setup.Trustee1)
1878+
setup.Keeper.AddApprovedCertificate(setup.Ctx, rootCertificate)
1879+
1880+
setup.Keeper.SetApprovedCertificates(
1881+
setup.Ctx,
1882+
types.ApprovedCertificates{
1883+
Subject: testconstants.IntermediateSubject,
1884+
SubjectKeyId: testconstants.IntermediateSubjectKeyID,
1885+
},
1886+
)
1887+
1888+
removeX509Cert := types.NewMsgRemoveX509Cert(
1889+
setup.Trustee1.String(), testconstants.IntermediateSubject, testconstants.IntermediateSubjectKeyID, "")
1890+
_, err := setup.Handler(setup.Ctx, removeX509Cert)
1891+
require.Error(t, err)
1892+
require.True(t, pkitypes.ErrCertificateDoesNotExist.Is(err))
1893+
}
1894+
1895+
func TestHandler_RemoveX509Cert_ByNotOwner(t *testing.T) {
1896+
setup := Setup(t)
1897+
1898+
rootCertificate := rootCertificate(setup.Trustee1)
1899+
setup.Keeper.AddApprovedCertificate(setup.Ctx, rootCertificate)
1900+
1901+
addX509Cert := types.NewMsgAddX509Cert(setup.Trustee1.String(), testconstants.IntermediateCertPem)
1902+
_, err := setup.Handler(setup.Ctx, addX509Cert)
1903+
require.NoError(t, err)
1904+
1905+
anotherTrustee := GenerateAccAddress()
1906+
setup.AddAccount(anotherTrustee, []dclauthtypes.AccountRole{dclauthtypes.Trustee}, 1)
1907+
1908+
removeX509Cert := types.NewMsgRemoveX509Cert(
1909+
anotherTrustee.String(), testconstants.IntermediateSubject, testconstants.IntermediateSubjectKeyID, "")
1910+
_, err = setup.Handler(setup.Ctx, removeX509Cert)
1911+
require.Error(t, err)
1912+
require.True(t, sdkerrors.ErrUnauthorized.Is(err))
1913+
}
1914+
1915+
func TestHandler_RemoveX509Cert_ForRootCertificate(t *testing.T) {
1916+
setup := Setup(t)
1917+
1918+
rootCertOptions := createTestRootCertOptions()
1919+
proposeAndApproveRootCertificate(setup, setup.Trustee1, rootCertOptions)
1920+
1921+
removeX509Cert := types.NewMsgRemoveX509Cert(
1922+
setup.Trustee1.String(), testconstants.RootSubject, testconstants.RootSubjectKeyID, testconstants.RootSerialNumber)
1923+
_, err := setup.Handler(setup.Ctx, removeX509Cert)
1924+
require.Error(t, err)
1925+
require.True(t, pkitypes.ErrInappropriateCertificateType.Is(err))
1926+
}
1927+
1928+
func TestHandler_RemoveX509Cert_InvalidSerialNumber(t *testing.T) {
1929+
setup := Setup(t)
1930+
1931+
rootCertOptions := createTestRootCertOptions()
1932+
proposeAndApproveRootCertificate(setup, setup.Trustee1, rootCertOptions)
1933+
1934+
addX509Cert := types.NewMsgAddX509Cert(setup.Trustee1.String(), testconstants.IntermediateCertPem)
1935+
_, err := setup.Handler(setup.Ctx, addX509Cert)
1936+
require.NoError(t, err)
1937+
1938+
removeX509Cert := types.NewMsgRemoveX509Cert(
1939+
setup.Trustee1.String(), testconstants.IntermediateSubject, testconstants.IntermediateSubjectKeyID, "invalid")
1940+
_, err = setup.Handler(setup.Ctx, removeX509Cert)
1941+
require.Error(t, err)
1942+
require.True(t, pkitypes.ErrCertificateDoesNotExist.Is(err))
1943+
}
17851944
func TestHandler_RevokeX509RootCertsBySubjectKeyId(t *testing.T) {
17861945
setup := Setup(t)
17871946

0 commit comments

Comments
 (0)