Skip to content

Commit 309d1e4

Browse files
committed
fix the validation logic to compare the full DN
Signed-off-by: Jun Kimura <jun.kimura@datachain.jp>
1 parent a9e8d06 commit 309d1e4

File tree

9 files changed

+482
-83
lines changed

9 files changed

+482
-83
lines changed

crates/collaterals/src/certs.rs

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ use crate::{
44
};
55
use anyhow::bail;
66
use dcap_types::cert::{
7-
SgxExtensions, SGX_PCK_CERT_CN, SGX_PCK_PLATFORM_CA_CN, SGX_PCK_PROCESSOR_CA_CN,
7+
SgxExtensions, INTEL_SGX_COUNTRY_NAME, INTEL_SGX_LOCALITY_NAME, INTEL_SGX_ORGANIZATION_NAME,
8+
INTEL_SGX_PCK_CERT_COMMON_NAME, INTEL_SGX_PCK_PLATFORM_CA_COMMON_NAME,
9+
INTEL_SGX_PCK_PROCESSOR_CA_COMMON_NAME, INTEL_SGX_STATE_OR_PROVINCE_NAME,
810
};
911
use openssl::{
1012
asn1::{Asn1Integer, Asn1Object, Asn1OctetString, Asn1Time},
@@ -202,20 +204,20 @@ pub enum PckCa {
202204
impl PckCa {
203205
/// Create a PckCa from the CN of the certificate
204206
pub fn from_cn(cn: &str) -> Result<Self, anyhow::Error> {
205-
if cn == SGX_PCK_PROCESSOR_CA_CN {
207+
if cn == INTEL_SGX_PCK_PROCESSOR_CA_COMMON_NAME {
206208
Ok(PckCa::Processor)
207-
} else if cn == SGX_PCK_PLATFORM_CA_CN {
209+
} else if cn == INTEL_SGX_PCK_PLATFORM_CA_COMMON_NAME {
208210
Ok(PckCa::Platform)
209211
} else {
210-
bail!("Invalid PCK CA CN: {}", cn)
212+
bail!("Invalid PCK CA CN: {}", cn);
211213
}
212214
}
213215

214216
/// Get the CN of the PckCa
215217
pub fn cn(&self) -> &'static str {
216218
match self {
217-
PckCa::Processor => SGX_PCK_PROCESSOR_CA_CN,
218-
PckCa::Platform => SGX_PCK_PLATFORM_CA_CN,
219+
PckCa::Processor => INTEL_SGX_PCK_PROCESSOR_CA_COMMON_NAME,
220+
PckCa::Platform => INTEL_SGX_PCK_PLATFORM_CA_COMMON_NAME,
219221
}
220222
}
221223

@@ -298,7 +300,7 @@ pub fn gen_pck_cert(
298300
Asn1Integer::from_bn(BigNum::from_slice(calc_skid(pck_cert_pkey).as_slice())?.as_ref())?
299301
.as_ref(),
300302
)?;
301-
builder.set_subject_name(build_x509_name(SGX_PCK_CERT_CN)?.as_ref())?;
303+
builder.set_subject_name(build_x509_name(INTEL_SGX_PCK_CERT_COMMON_NAME)?.as_ref())?;
302304
builder.set_pubkey(pck_cert_pkey)?;
303305

304306
builder.set_not_before(&validity.not_before())?;
@@ -463,10 +465,26 @@ impl Validity {
463465
pub fn build_x509_name(cn: &str) -> Result<X509Name, ErrorStack> {
464466
let mut builder = X509Name::builder()?;
465467
builder.append_entry_by_text("CN", cn)?;
466-
builder.append_entry_by_text("O", "Intel Corporation")?;
467-
builder.append_entry_by_text("L", "Santa Clara")?;
468-
builder.append_entry_by_text("ST", "CA")?;
469-
builder.append_entry_by_text("C", "US")?;
468+
builder.append_entry_by_text("O", INTEL_SGX_ORGANIZATION_NAME)?;
469+
builder.append_entry_by_text("L", INTEL_SGX_LOCALITY_NAME)?;
470+
builder.append_entry_by_text("ST", INTEL_SGX_STATE_OR_PROVINCE_NAME)?;
471+
builder.append_entry_by_text("C", INTEL_SGX_COUNTRY_NAME)?;
472+
Ok(builder.build())
473+
}
474+
475+
pub fn build_x509_name_with_values(
476+
cn: &str,
477+
o: &str,
478+
l: &str,
479+
st: &str,
480+
c: &str,
481+
) -> Result<X509Name, ErrorStack> {
482+
let mut builder = X509Name::builder()?;
483+
builder.append_entry_by_text("CN", cn)?;
484+
builder.append_entry_by_text("O", o)?;
485+
builder.append_entry_by_text("L", l)?;
486+
builder.append_entry_by_text("ST", st)?;
487+
builder.append_entry_by_text("C", c)?;
470488
Ok(builder.build())
471489
}
472490

crates/pcs/src/client.rs

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
use anyhow::{anyhow, bail, Error};
2-
use dcap_quote_verifier::cert::{get_x509_subject_cn, parse_certchain};
2+
use dcap_quote_verifier::cert::{
3+
is_sgx_pck_platform_ca_dn, is_sgx_pck_processor_ca_dn, parse_certchain,
4+
};
35
use dcap_quote_verifier::collateral::QvCollateral;
46
use dcap_quote_verifier::sgx_extensions::extract_sgx_extensions;
57
use dcap_types::quotes::CertData;
@@ -97,17 +99,14 @@ impl PCSClient {
9799
let qe_identity_json =
98100
http_get(format!("{base_url}/qe/identity?update={update_policy}"))?.text()?;
99101

100-
let pck_crl_url = match get_x509_subject_cn(pck_cert_issuer).as_str() {
101-
"Intel SGX PCK Platform CA" => {
102-
format!("{pcs_url}/sgx/certification/v4/pckcrl?ca=platform&encoding=der")
103-
}
104-
"Intel SGX PCK Processor CA" => {
105-
format!("{pcs_url}/sgx/certification/v4/pckcrl?ca=processor&encoding=der")
106-
}
107-
cn => {
108-
bail!("unknown PCK issuer: {}", cn);
109-
}
102+
let pck_crl_url = if is_sgx_pck_platform_ca_dn(pck_cert_issuer.subject())? {
103+
format!("{pcs_url}/sgx/certification/v4/pckcrl?ca=platform&encoding=der")
104+
} else if is_sgx_pck_processor_ca_dn(pck_cert_issuer.subject())? {
105+
format!("{pcs_url}/sgx/certification/v4/pckcrl?ca=processor&encoding=der")
106+
} else {
107+
bail!("unknown PCK issuer");
110108
};
109+
111110
let sgx_pck_crl_der = http_get(pck_crl_url)?.bytes()?.to_vec();
112111

113112
let sgx_root_cert_der = http_get(format!(

0 commit comments

Comments
 (0)