Skip to content

Commit c9207f4

Browse files
committed
Make root store optional for verifier
1 parent fa5a156 commit c9207f4

2 files changed

Lines changed: 29 additions & 82 deletions

File tree

crates/attested-tls/src/lib.rs

Lines changed: 27 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -360,18 +360,21 @@ pub struct AttestedCertificateVerifier {
360360

361361
impl AttestedCertificateVerifier {
362362
pub fn new(
363-
root_store: RootCertStore,
363+
root_store: Option<RootCertStore>,
364364
attestation_verifier: AttestationVerifier,
365365
) -> Result<Self, AttestedTlsError> {
366366
Self::new_with_provider(root_store, attestation_verifier, default_crypto_provider()?)
367367
}
368368

369369
pub fn new_with_provider(
370-
root_store: RootCertStore,
370+
root_store: Option<RootCertStore>,
371371
attestation_verifier: AttestationVerifier,
372372
provider: Arc<CryptoProvider>,
373373
) -> Result<Self, AttestedTlsError> {
374-
let root_store = Arc::new(root_store);
374+
let root_store = Arc::new(match root_store {
375+
Some(root_store) => root_store,
376+
None => Self::synthetic_root_store()?,
377+
});
375378
let server_inner =
376379
WebPkiServerVerifier::builder_with_provider(root_store.clone(), provider.clone())
377380
.build()
@@ -383,6 +386,19 @@ impl AttestedCertificateVerifier {
383386
Ok(Self { server_inner, client_inner, attestation_verifier })
384387
}
385388

389+
fn synthetic_root_store() -> Result<RootCertStore, AttestedTlsError> {
390+
let key_pair = KeyPair::generate_for(&PKCS_ECDSA_P256_SHA256)?;
391+
let mut params =
392+
ra_tls::rcgen::CertificateParams::new(vec!["attested-tls-placeholder-ca".to_string()])?;
393+
params.is_ca = ra_tls::rcgen::IsCa::Ca(ra_tls::rcgen::BasicConstraints::Unconstrained);
394+
let cert = params.self_signed(&key_pair)?;
395+
396+
let mut root_store = RootCertStore::empty();
397+
root_store.add(cert.der().clone())?;
398+
399+
Ok(root_store)
400+
}
401+
386402
fn extract_custom_attestation_from_cert(
387403
cert: &CertificateDer<'_>,
388404
) -> Result<AttestationExchangeMessage, rustls::Error> {
@@ -713,14 +729,8 @@ mod tests {
713729
.await
714730
.unwrap();
715731

716-
let server_certificate =
717-
resolver.state.certificate.read().unwrap().first().unwrap().clone();
718-
719-
let mut roots = RootCertStore::empty();
720-
roots.add(server_certificate).unwrap();
721-
722732
let verifier = AttestedCertificateVerifier::new_with_provider(
723-
roots,
733+
None,
724734
AttestationVerifier::mock(),
725735
provider.clone(),
726736
)
@@ -780,7 +790,7 @@ mod tests {
780790
roots.add(ca_cert).unwrap();
781791

782792
let verifier = AttestedCertificateVerifier::new_with_provider(
783-
roots,
793+
Some(roots),
784794
AttestationVerifier::mock(),
785795
provider.clone(),
786796
)
@@ -882,36 +892,14 @@ mod tests {
882892
.await
883893
.expect("client resolver construction should succeed");
884894

885-
let server_certificate = server_resolver
886-
.state
887-
.certificate
888-
.read()
889-
.expect("certificate lock poisoned")
890-
.first()
891-
.expect("resolver should hold a certificate")
892-
.clone();
893-
let client_certificate = client_resolver
894-
.state
895-
.certificate
896-
.read()
897-
.expect("certificate lock poisoned")
898-
.first()
899-
.expect("resolver should hold a certificate")
900-
.clone();
901-
902-
let mut client_roots = RootCertStore::empty();
903-
client_roots.add(server_certificate).expect("server certificate should be trusted");
904-
let mut server_roots = RootCertStore::empty();
905-
server_roots.add(client_certificate).expect("client certificate should be trusted");
906-
907895
let server_verifier = AttestedCertificateVerifier::new_with_provider(
908-
server_roots,
896+
None,
909897
AttestationVerifier::mock(),
910898
provider.clone(),
911899
)
912900
.expect("server verifier construction should succeed");
913901
let client_verifier = AttestedCertificateVerifier::new_with_provider(
914-
client_roots,
902+
None,
915903
AttestationVerifier::mock(),
916904
provider.clone(),
917905
)
@@ -963,20 +951,8 @@ mod tests {
963951
)
964952
.await
965953
.expect("resolver construction should succeed");
966-
let server_certificate = resolver
967-
.state
968-
.certificate
969-
.read()
970-
.expect("certificate lock poisoned")
971-
.first()
972-
.expect("resolver should hold a certificate")
973-
.clone();
974-
975-
let mut roots = RootCertStore::empty();
976-
roots.add(server_certificate).expect("resolver certificate should be trusted");
977-
978954
let verifier = AttestedCertificateVerifier::new_with_provider(
979-
roots,
955+
None,
980956
AttestationVerifier::mock(),
981957
provider.clone(),
982958
)
@@ -1015,7 +991,7 @@ mod tests {
1015991
async fn malformed_certificate_returns_bad_encoding() {
1016992
let provider: Arc<CryptoProvider> = aws_lc_rs::default_provider().into();
1017993
let verifier = AttestedCertificateVerifier::new_with_provider(
1018-
non_empty_root_store(),
994+
None,
1019995
AttestationVerifier::mock(),
1020996
provider,
1021997
)
@@ -1038,7 +1014,7 @@ mod tests {
10381014
let mut roots = RootCertStore::empty();
10391015
roots.add(cert.clone()).expect("plain certificate should be trusted");
10401016
let verifier = AttestedCertificateVerifier::new_with_provider(
1041-
roots,
1017+
Some(roots),
10421018
AttestationVerifier::mock(),
10431019
provider,
10441020
)
@@ -1067,7 +1043,7 @@ mod tests {
10671043
.await
10681044
.expect("resolver construction should succeed");
10691045
let verifier = AttestedCertificateVerifier::new_with_provider(
1070-
non_empty_root_store(),
1046+
None,
10711047
AttestationVerifier::expect_none(),
10721048
provider,
10731049
)
@@ -1117,15 +1093,6 @@ mod tests {
11171093
.into()
11181094
}
11191095

1120-
fn non_empty_root_store() -> RootCertStore {
1121-
let mut roots = RootCertStore::empty();
1122-
let ca = test_ca();
1123-
let ca_cert = CertificateDer::from_pem_slice(ca.pem_cert.as_bytes())
1124-
.expect("test CA PEM should parse");
1125-
roots.add(ca_cert).expect("test CA certificate should be trusted");
1126-
roots
1127-
}
1128-
11291096
fn transfer_tls_client_to_server(client: &mut ClientConnection, server: &mut ServerConnection) {
11301097
let mut tls = Vec::new();
11311098

crates/attested-tls/tests/nested_tls.rs

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use rustls::{
99
RootCertStore,
1010
ServerConfig,
1111
crypto::{CryptoProvider, aws_lc_rs},
12-
pki_types::{CertificateDer, PrivateKeyDer, PrivatePkcs8KeyDer, ServerName, pem::PemObject},
12+
pki_types::{CertificateDer, PrivateKeyDer, PrivatePkcs8KeyDer, ServerName},
1313
};
1414
use tokio::io::{AsyncReadExt, AsyncWriteExt, duplex};
1515

@@ -103,7 +103,7 @@ async fn attested_server_config(server_name: &str, provider: Arc<CryptoProvider>
103103

104104
fn attested_client_config(provider: Arc<CryptoProvider>) -> ClientConfig {
105105
let verifier = AttestedCertificateVerifier::new_with_provider(
106-
non_empty_root_store(),
106+
None,
107107
AttestationVerifier::mock(),
108108
provider.clone(),
109109
)
@@ -116,23 +116,3 @@ fn attested_client_config(provider: Arc<CryptoProvider>) -> ClientConfig {
116116
.with_custom_certificate_verifier(Arc::new(verifier))
117117
.with_no_client_auth()
118118
}
119-
120-
fn non_empty_root_store() -> RootCertStore {
121-
let mut roots = RootCertStore::empty();
122-
let ca = test_ca();
123-
let ca_cert =
124-
CertificateDer::from_pem_slice(ca.pem_cert.as_bytes()).expect("test CA PEM should parse");
125-
roots.add(ca_cert).expect("test CA certificate should be trusted");
126-
roots
127-
}
128-
129-
fn test_ca() -> ra_tls::cert::CaCert {
130-
let key = KeyPair::generate_for(&PKCS_ECDSA_P256_SHA256)
131-
.expect("test CA key generation should succeed");
132-
let mut params = ra_tls::rcgen::CertificateParams::new(vec!["test-ca".to_string()])
133-
.expect("test CA params should be created");
134-
params.is_ca = ra_tls::rcgen::IsCa::Ca(ra_tls::rcgen::BasicConstraints::Unconstrained);
135-
let cert = params.self_signed(&key).expect("test CA certificate should be self-signed");
136-
137-
ra_tls::cert::CaCert::from_parts(key, cert)
138-
}

0 commit comments

Comments
 (0)