Skip to content

Commit 01c5476

Browse files
committed
#535 VID scoped x509 certificates
- Enable checking of VID Scoping while adding X509 certificates Signed-off-by: Abdulbois <abdulbois.tursunov@dsr-corporation.com> Signed-off-by: Abdulbois <abdulbois123@gmail.com>
1 parent f05b02e commit 01c5476

File tree

11 files changed

+371
-17
lines changed

11 files changed

+371
-17
lines changed

integration_tests/constants/constants.go

+73-2
Original file line numberDiff line numberDiff line change
@@ -315,8 +315,11 @@ CU3r1RXsbs8zuBEVIl8yUogwHwYDVR0jBBgwFoAUav0idx9RH+y/FkGXZxDc3DGh
315315
cX4wCgYIKoZIzj0EAwIDSAAwRQIhAJbJyM8uAYhgBdj1vHLAe3X9mldpWsSRETET
316316
i+oDPOUDAiAlVJQ75X1T1sR199I+v8/CA2zSm6Y5PsfvrYcUq3GCGQ==
317317
-----END CERTIFICATE-----`
318-
PAICertWithNumericPidVidVid = 65521
319-
PAICertWithNumericPidVidPid = 32768
318+
319+
PAICertWithNumericPidVidSubject = "MEYxGDAWBgNVBAMMD01hdHRlciBUZXN0IFBBSTEUMBIGCisGAQQBgqJ8AgEMBEZGRjExFDASBgorBgEEAYKifAICDAQ4MDAw"
320+
PAICertWithNumericPidVidSubjectKeyID = "AF:42:B7:09:4D:EB:D5:15:EC:6E:CF:33:B8:11:15:22:5F:32:52:88"
321+
PAICertWithNumericPidVidVid = 65521
322+
PAICertWithNumericPidVidPid = 32768
320323

321324
PAICertWithPidVid = `
322325
-----BEGIN CERTIFICATE-----
@@ -346,6 +349,9 @@ Q+ppaILVMAoGCCqGSM49BAMCA0gAMEUCIQDfwJ3oS/qVbWDW/vTirREL3iIqMogw
346349
pn4/F7keUYUaeAIgce2XGOSIsrjPlUQ1zj/zLqUFVhQ8TyycBaIK8z7Uytk=
347350
-----END CERTIFICATE-----`
348351

352+
PAICertWithNumericVidSubject = "MDAxGDAWBgNVBAMMD01hdHRlciBUZXN0IFBBSTEUMBIGCisGAQQBgqJ8AgEMBEZGRjI="
353+
PAICertWithNumericVidSubjectKeyID = "61:3D:D0:87:35:5E:F0:8B:AE:01:E4:C6:9A:8F:C7:3D:AC:8C:7D:FD"
354+
349355
PAICertWithVid = `-----BEGIN CERTIFICATE-----
350356
MIIBmzCCAUKgAwIBAgIIIt8JcSeGaqMwCgYIKoZIzj0EAwIwGjEYMBYGA1UEAwwP
351357
TWF0dGVyIFRlc3QgUEFBMCAXDTIxMDYyODE0MjM0M1oYDzk5OTkxMjMxMjM1OTU5
@@ -439,6 +445,7 @@ p6lc3hTEQsQZsUwVzH74wu+whWZdKHHrEY7rONc/QiLmwZl+w2nGs+S62z20GueU
439445
XSNIRw5NvAwLCvnog8A47MIqpuF211kdKvu2QFM/ekMvduL8BpkIFVKULSOY1t9d
440446
XPz2ZlXABob+/ovGOyGPDw/3tUmlBXU=
441447
-----END CERTIFICATE-----`
448+
442449
RootCertWithSameSubjectAndSKID2 = `-----BEGIN CERTIFICATE-----
443450
MIID0zCCArugAwIBAgIBAjANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCVVMx
444451
ETAPBgNVBAgMCE5ldyBZb3JrMREwDwYDVQQHDAhOZXcgWW9yazEYMBYGA1UECgwP
@@ -462,6 +469,7 @@ BQADggEBAENwaLKvyNz0IW1BNH2eTYNvgFl4f/I1pVYPOlA0O0ZB4BupqtgfKdTF
462469
XWQLy4RZmLIkrm7vj3uFWRpi7lOBkAPOgCm04RTYqJJwnI0UeJmvaxoFd42J+k3D
463470
xEsSrRoqMgkOX01+kkNn8Ugv3bEfeJ4=
464471
-----END CERTIFICATE-----`
472+
465473
IntermediateWithSameSubjectAndSKID1 = `-----BEGIN CERTIFICATE-----
466474
MIIDlTCCAn2gAwIBAgIBAzANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCVVMx
467475
ETAPBgNVBAgMCE5ldyBZb3JrMREwDwYDVQQHDAhOZXcgWW9yazEYMBYGA1UECgwP
@@ -484,6 +492,7 @@ xfBPUaspjiGALO8hBKlbVxt0RWv5MGyg2JJbSt9Ijexa6aoLzynq5gpSoEfQABUp
484492
wbfDZe4Cbio4ndASlsbtpo/5ZOuQKn9Wp54meOotFDrFntnD7XFohxMJc5YY0F1q
485493
Yk3FHd02VN0M
486494
-----END CERTIFICATE-----`
495+
487496
IntermediateWithSameSubjectAndSKID2 = `-----BEGIN CERTIFICATE-----
488497
MIIDlTCCAn2gAwIBAgIBBDANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCVVMx
489498
ETAPBgNVBAgMCE5ldyBZb3JrMREwDwYDVQQHDAhOZXcgWW9yazEYMBYGA1UECgwP
@@ -526,6 +535,57 @@ fjlqLDHoQ1UhBmEnocFTqd7QEZtUbRWPnlJw0ZK2uFK7IYmlnBKkewPCLVGI3ihx
526535
al/8sTx3xx7fWpS+rJ3jviCpHgP+cGV/ANg8hOlyr68u0FE+x6pye00TmxcFzDuo
527536
5/OA9jGQln82Z8inmc05wZPQPpjZxdCQteqJkNl7PrklgO5EevG9JlUArIets2Py
528537
2Vciq5eYOIi+PlP+HI5QzlZYxSqFjJrFcfzYCJ4=
538+
-----END CERTIFICATE-----`
539+
540+
RootCertWithVid = `-----BEGIN CERTIFICATE-----
541+
MIICdDCCAhmgAwIBAgIBATAKBggqhkjOPQQDAjCBmDELMAkGA1UEBhMCVVMxETAP
542+
BgNVBAgMCE5ldyBZb3JrMREwDwYDVQQHDAhOZXcgWW9yazEYMBYGA1UECgwPRXhh
543+
bXBsZSBDb21wYW55MRkwFwYDVQQLDBBUZXN0aW5nIERpdmlzaW9uMRgwFgYDVQQD
544+
DA93d3cuZXhhbXBsZS5jb20xFDASBgorBgEEAYKifAIBDARGRkYxMCAXDTI0MDIy
545+
NjExNTQzMVoYDzMwMjMwNjI5MTE1NDMxWjCBmDELMAkGA1UEBhMCVVMxETAPBgNV
546+
BAgMCE5ldyBZb3JrMREwDwYDVQQHDAhOZXcgWW9yazEYMBYGA1UECgwPRXhhbXBs
547+
ZSBDb21wYW55MRkwFwYDVQQLDBBUZXN0aW5nIERpdmlzaW9uMRgwFgYDVQQDDA93
548+
d3cuZXhhbXBsZS5jb20xFDASBgorBgEEAYKifAIBDARGRkYxMFkwEwYHKoZIzj0C
549+
AQYIKoZIzj0DAQcDQgAEDcguargOjH5nh4SCsflFk1ACqNBOR6Wua8huVYPBfse6
550+
uwfkgmyTJrCBCUAq9ayPD83jPVor1NN9YAx/V0zbsKNQME4wHQYDVR0OBBYEFM6o
551+
kmbq4IC9K7Vo5AsHxPosNG0xMB8GA1UdIwQYMBaAFM6okmbq4IC9K7Vo5AsHxPos
552+
NG0xMAwGA1UdEwQFMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAOdYHo1krgzyV+CT
553+
G+RKcYoxHr6YS9ddNOJibjBx/I63AiEAxNl6kcOH0Rovwi2wySHvTD26kfUYJAmi
554+
HGBcCo5whZU=
555+
-----END CERTIFICATE-----`
556+
557+
IntermediateCertWithVid1 = `-----BEGIN CERTIFICATE-----
558+
MIICejCCAiGgAwIBAgIBAzAKBggqhkjOPQQDAjCBmDELMAkGA1UEBhMCVVMxETAP
559+
BgNVBAgMCE5ldyBZb3JrMREwDwYDVQQHDAhOZXcgWW9yazEYMBYGA1UECgwPRXhh
560+
bXBsZSBDb21wYW55MRkwFwYDVQQLDBBUZXN0aW5nIERpdmlzaW9uMRgwFgYDVQQD
561+
DA93d3cuZXhhbXBsZS5jb20xFDASBgorBgEEAYKifAIBDARGRkYxMCAXDTI0MDIy
562+
NjEyMDczMloYDzMwMjMwNjI5MTIwNzMyWjCBrjELMAkGA1UEBhMCVVMxETAPBgNV
563+
BAgMCE5ldyBZb3JrMREwDwYDVQQHDAhOZXcgWW9yazEYMBYGA1UECgwPRXhhbXBs
564+
ZSBDb21wYW55MRkwFwYDVQQLDBBUZXN0aW5nIERpdmlzaW9uMRgwFgYDVQQDDA93
565+
d3cuZXhhbXBsZS5jb20xFDASBgorBgEEAYKifAIBDARGRkYxMRQwEgYKKwYBBAGC
566+
onwCAgwERkZGMTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOTNh8u27CnRGdj0
567+
G0/z0oo9rsKcpgUogQ8fYYEg/QClYFHJuhFbf1M+VdeMScbllpt4kGH2ih7aU1b7
568+
1jRkVsyjQjBAMB0GA1UdDgQWBBQOjOjIuKpQvCWFVrmxnMLH2cUvFzAfBgNVHSME
569+
GDAWgBTOqJJm6uCAvSu1aOQLB8T6LDRtMTAKBggqhkjOPQQDAgNHADBEAiAOQSIQ
570+
sdClGJ86LQ1p7e+kb0Dg+YsyxIv2XHdUvIVn2gIgBkbzBccRbDG3p/+gnPhF+7xP
571+
T/SKbO+GZvoizizl6Gc=
572+
-----END CERTIFICATE-----`
573+
574+
IntermediateCertWithVid2 = `-----BEGIN CERTIFICATE-----
575+
MIICezCCAiGgAwIBAgIBBDAKBggqhkjOPQQDAjCBmDELMAkGA1UEBhMCVVMxETAP
576+
BgNVBAgMCE5ldyBZb3JrMREwDwYDVQQHDAhOZXcgWW9yazEYMBYGA1UECgwPRXhh
577+
bXBsZSBDb21wYW55MRkwFwYDVQQLDBBUZXN0aW5nIERpdmlzaW9uMRgwFgYDVQQD
578+
DA93d3cuZXhhbXBsZS5jb20xFDASBgorBgEEAYKifAIBDARGRkYxMCAXDTI0MDIy
579+
NjEzMDcwNVoYDzMwMjMwNjI5MTMwNzA1WjCBrjELMAkGA1UEBhMCVVMxETAPBgNV
580+
BAgMCE5ldyBZb3JrMREwDwYDVQQHDAhOZXcgWW9yazEYMBYGA1UECgwPRXhhbXBs
581+
ZSBDb21wYW55MRkwFwYDVQQLDBBUZXN0aW5nIERpdmlzaW9uMRgwFgYDVQQDDA93
582+
d3cuZXhhbXBsZS5jb20xFDASBgorBgEEAYKifAIBDARGRkYyMRQwEgYKKwYBBAGC
583+
onwCAgwERkZGMjBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOTNh8u27CnRGdj0
584+
G0/z0oo9rsKcpgUogQ8fYYEg/QClYFHJuhFbf1M+VdeMScbllpt4kGH2ih7aU1b7
585+
1jRkVsyjQjBAMB0GA1UdDgQWBBQOjOjIuKpQvCWFVrmxnMLH2cUvFzAfBgNVHSME
586+
GDAWgBTOqJJm6uCAvSu1aOQLB8T6LDRtMTAKBggqhkjOPQQDAgNIADBFAiEAkApx
587+
PWFFDoptmYnsW1QhKqrcD+xmFgJA4SWTH5Q1efMCIDWqdG0sAgum+FphfM4HF6XV
588+
M6mDL6NurBAW1pJlg8OT
529589
-----END CERTIFICATE-----`
530590

531591
RootIssuer = "MDQxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApzb21lLXN0YXRlMRAwDgYDVQQKDAdyb290LWNh"
@@ -590,4 +650,15 @@ al/8sTx3xx7fWpS+rJ3jviCpHgP+cGV/ANg8hOlyr68u0FE+x6pye00TmxcFzDuo
590650
DataDigest = "9a5d2c1f4b3e6f8d7b1a0c9e2f5d8b7"
591651

592652
TestCertPemVid = 4701
653+
654+
RootCertWithVidSubject = "MIGYMQswCQYDVQQGEwJVUzERMA8GA1UECAwITmV3IFlvcmsxETAPBgNVBAcMCE5ldyBZb3JrMRgwFgYDVQQKDA9FeGFtcGxlIENvbXBhbnkxGTAXBgNVBAsMEFRlc3RpbmcgRGl2aXNpb24xGDAWBgNVBAMMD3d3dy5leGFtcGxlLmNvbTEUMBIGCisGAQQBgqJ8AgEMBEZGRjE="
655+
RootCertWithVidSubjectKeyID = "CE:A8:92:66:EA:E0:80:BD:2B:B5:68:E4:0B:07:C4:FA:2C:34:6D:31"
656+
RootCertWithVidVid = 65521
657+
658+
IntermediateCertWithVidSubject = "MIGuMQswCQYDVQQGEwJVUzERMA8GA1UECAwITmV3IFlvcmsxETAPBgNVBAcMCE5ldyBZb3JrMRgwFgYDVQQKDA9FeGFtcGxlIENvbXBhbnkxGTAXBgNVBAsMEFRlc3RpbmcgRGl2aXNpb24xGDAWBgNVBAMMD3d3dy5leGFtcGxlLmNvbTEUMBIGCisGAQQBgqJ8AgEMBEZGRjExFDASBgorBgEEAYKifAICDARGRkYx"
659+
IntermediateCertWithVidSubjectKeyID = "0E:8C:E8:C8:B8:AA:50:BC:25:85:56:B9:B1:9C:C2:C7:D9:C5:2F:17"
660+
IntermediateCertWithVid1SerialNumber = "3"
661+
IntermediateCertWithVid2SerialNumber = "4"
662+
IntermediateCertWithVid1Vid = 65521
663+
IntermediateCertWithVid2Vid = 65522
593664
)

integration_tests/grpc_rest/pki/helpers.go

+110
Original file line numberDiff line numberDiff line change
@@ -1983,4 +1983,114 @@ func Demo(suite *utils.TestSuite) {
19831983
suite.AssertNotFound(err)
19841984
_, err = GetX509Cert(suite, testconstants.LeafCertWithSameSubjectAndSKIDSubject, testconstants.LeafCertWithSameSubjectAndSKIDSubjectKeyID)
19851985
suite.AssertNotFound(err)
1986+
1987+
// Add VID scoped X509 certificate
1988+
1989+
// Check that if root cert is VID scoped and RootVID==CertVID==AccountVID then adding x509 should succeed
1990+
// Add root certificate
1991+
msgProposeAddX509RootCert = pkitypes.MsgProposeAddX509RootCert{
1992+
Cert: testconstants.RootCertWithVid,
1993+
Vid: testconstants.RootCertWithVidVid,
1994+
Signer: aliceAccount.Address,
1995+
}
1996+
_, err = suite.BuildAndBroadcastTx([]sdk.Msg{&msgProposeAddX509RootCert}, aliceName, aliceAccount)
1997+
require.NoError(suite.T, err)
1998+
1999+
msgApproveAddX509RootCert = pkitypes.MsgApproveAddX509RootCert{
2000+
Subject: testconstants.RootCertWithVidSubject,
2001+
SubjectKeyId: testconstants.RootCertWithVidSubjectKeyID,
2002+
Signer: jackAccount.Address,
2003+
}
2004+
_, err = suite.BuildAndBroadcastTx([]sdk.Msg{&msgApproveAddX509RootCert}, jackName, jackAccount)
2005+
require.NoError(suite.T, err)
2006+
2007+
// Register new Vendor account
2008+
vendorName = utils.RandString()
2009+
vendorAccount = test_dclauth.CreateVendorAccount(
2010+
suite,
2011+
vendorName,
2012+
dclauthtypes.AccountRoles{dclauthtypes.Vendor},
2013+
testconstants.RootCertWithVidVid,
2014+
testconstants.ProductIDsEmpty,
2015+
aliceName,
2016+
aliceAccount,
2017+
jackName,
2018+
jackAccount,
2019+
testconstants.Info,
2020+
)
2021+
require.NotNil(suite.T, vendorAccount)
2022+
2023+
// Add an intermediate certificate
2024+
msgAddX509Cert = pkitypes.MsgAddX509Cert{
2025+
Cert: testconstants.IntermediateCertWithVid1,
2026+
Signer: vendorAccount.Address,
2027+
}
2028+
_, err = suite.BuildAndBroadcastTx([]sdk.Msg{&msgAddX509Cert}, vendorName, vendorAccount)
2029+
require.NoError(suite.T, err)
2030+
2031+
// Check approved certificates
2032+
certs, _ = GetX509Cert(suite, testconstants.RootCertWithVidSubject, testconstants.RootCertWithVidSubjectKeyID)
2033+
require.Equal(suite.T, 1, len(certs.Certs))
2034+
certs, _ = GetX509Cert(suite, testconstants.IntermediateCertWithVidSubject, testconstants.IntermediateCertWithVidSubjectKeyID)
2035+
require.Equal(suite.T, 1, len(certs.Certs))
2036+
2037+
// Check that if root cert is VID scoped and rootVID != CertVID then adding an intermediate cert should fail
2038+
// Add an intermediate certificate
2039+
msgAddX509Cert = pkitypes.MsgAddX509Cert{
2040+
Cert: testconstants.IntermediateCertWithVid2,
2041+
Signer: vendorAccount.Address,
2042+
}
2043+
_, err = suite.BuildAndBroadcastTx([]sdk.Msg{&msgAddX509Cert}, vendorName, vendorAccount)
2044+
require.Error(suite.T, err)
2045+
2046+
// Check there is only one approved intermediate certificate
2047+
certs, _ = GetX509Cert(suite, testconstants.IntermediateCertWithVidSubject, testconstants.IntermediateCertWithVidSubjectKeyID)
2048+
require.Equal(suite.T, 1, len(certs.Certs))
2049+
require.Equal(suite.T, testconstants.IntermediateCertWithVid1SerialNumber, certs.Certs[0].SerialNumber)
2050+
2051+
// Check that if root cert is non-VID scoped and CertVID != AccountVID then adding an intermediate cert should fail
2052+
// Ensure that there is a non-VID root cert exists
2053+
certs, _ = GetX509Cert(suite, testconstants.PAACertNoVidSubject, testconstants.PAACertNoVidSubjectKeyID)
2054+
require.Equal(suite.T, 1, len(certs.Certs))
2055+
2056+
// Try to submit txn with another Vendor
2057+
newVendorName := utils.RandString()
2058+
newVendorAccount := test_dclauth.CreateVendorAccount(
2059+
suite,
2060+
vendorName,
2061+
dclauthtypes.AccountRoles{dclauthtypes.Vendor},
2062+
testconstants.IntermediateCertWithVid2Vid,
2063+
testconstants.ProductIDsEmpty,
2064+
aliceName,
2065+
aliceAccount,
2066+
jackName,
2067+
jackAccount,
2068+
testconstants.Info,
2069+
)
2070+
require.NotNil(suite.T, vendorAccount)
2071+
2072+
// Add an intermediate certificate
2073+
msgAddX509Cert = pkitypes.MsgAddX509Cert{
2074+
Cert: testconstants.PAICertWithNumericVid,
2075+
Signer: newVendorAccount.Address,
2076+
}
2077+
2078+
_, err = suite.BuildAndBroadcastTx([]sdk.Msg{&msgAddX509Cert}, newVendorName, newVendorAccount)
2079+
require.Error(suite.T, err)
2080+
2081+
// Check there is no an intermediate certificate
2082+
certs, _ = GetX509Cert(suite, testconstants.PAICertWithNumericVidSubject, testconstants.PAICertWithNumericVidSubjectKeyID)
2083+
require.Equal(suite.T, 0, len(certs.Certs))
2084+
2085+
// Check that if root cert is non-VID scoped and CertVID==AccountVID then adding x509 should succeed
2086+
// Add an intermediate certificate
2087+
msgAddX509Cert = pkitypes.MsgAddX509Cert{
2088+
Cert: testconstants.PAICertWithNumericVid,
2089+
Signer: vendorAccount.Address,
2090+
}
2091+
_, err = suite.BuildAndBroadcastTx([]sdk.Msg{&msgAddX509Cert}, vendorName, vendorAccount)
2092+
require.NoError(suite.T, err)
2093+
// Check there is only one approved intermediate certificate
2094+
certs, _ = GetX509Cert(suite, testconstants.PAICertWithNumericVidSubject, testconstants.PAICertWithNumericVidSubjectKeyID)
2095+
require.Equal(suite.T, 1, len(certs.Certs))
19862096
}

types/pki/errors.go

+23
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ var (
4848
ErrMessageVidNotEqualRootCertVid = sdkerrors.Register(ModuleName, 437, "Message vid is not equal to ledger's root certificate vid")
4949
ErrCertNotChainedBack = sdkerrors.Register(ModuleName, 438, "Certificate is not chained back to a root certificate on DCL")
5050
ErrCertVidNotEqualAccountVid = sdkerrors.Register(ModuleName, 439, "account's vid is not equal to ledger's certificate vid")
51+
ErrCertVidNotEqualToRootVid = sdkerrors.Register(ModuleName, 440, "certificate's vid is not equal to vid of root certificate ")
5152
)
5253

5354
func NewErrUnauthorizedRole(transactionName string, requiredRole types.AccountRole) error {
@@ -206,6 +207,28 @@ func NewErrExistingCertVidNotEqualAccountVid(subject string, subjectKeyID string
206207
subject, subjectKeyID, vid)
207208
}
208209

210+
func NewErrRootCertVidNotEqualToAccountVidOrCertVid(rootVID int32, accountVID int32, certVID int32) error {
211+
if rootVID != certVID {
212+
return sdkerrors.Wrapf(ErrCertVidNotEqualToRootVid,
213+
"Root certificate is VID scoped: An intermediate certificate must be also VID scoped to the same VID as a root one: "+
214+
"Root certificate's VID = %v, Certificate's VID = %v",
215+
rootVID, certVID)
216+
}
217+
218+
return sdkerrors.Wrapf(ErrCertVidNotEqualAccountVid,
219+
"Root certificate is VID scoped: "+
220+
"Only a Vendor associated with this VID can add an intermediate certificate: "+
221+
"Root certificate's VID = %v, Account VID = %v",
222+
rootVID, accountVID)
223+
}
224+
225+
func NewErrAccountVidNotEqualToCertVid(accountVID int32, certVID int32) error {
226+
return sdkerrors.Wrapf(ErrCertVidNotEqualAccountVid,
227+
"Intermediate certificate is VID scoped: Only a Vendor associated with this VID can add an intermediate certificate: "+
228+
"Account VID = %v, Certificate's VID = %v",
229+
accountVID, certVID)
230+
}
231+
209232
func NewErrCRLSignerCertificatePidNotEqualMsgPid(certificatePid int32, messagePid int32) error {
210233
return sdkerrors.Wrapf(
211234
ErrCRLSignerCertificatePidNotEqualMsgPid,

vue/src/store/generated/zigbee-alliance/distributed-compliance-ledger/zigbeealliance.distributedcomplianceledger.pki/module/types/pki/tx.ts

+1
Original file line numberDiff line numberDiff line change
@@ -2427,6 +2427,7 @@ export interface Msg {
24272427
AssignVid(request: MsgAssignVid): Promise<MsgAssignVidResponse>
24282428
AddNocX509RootCert(request: MsgAddNocX509RootCert): Promise<MsgAddNocX509RootCertResponse>
24292429
/** this line is used by starport scaffolding # proto/tx/rpc */
2430+
/** this line is used by starport scaffolding # proto/tx/rpc */
24302431
RemoveX509Cert(request: MsgRemoveX509Cert): Promise<MsgRemoveX509CertResponse>
24312432
}
24322433

0 commit comments

Comments
 (0)