Skip to content

Commit e0e8a5e

Browse files
committed
client: make node run tls config gen do more work
1 parent a424f26 commit e0e8a5e

File tree

3 files changed

+69
-55
lines changed

3 files changed

+69
-55
lines changed

common/src/client/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// hello
1+
// TODO
22

33
pub mod certs;
44
pub mod tls;

common/src/client/tls.rs

Lines changed: 64 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -28,73 +28,62 @@ struct ClientProvisionCertVerifier {
2828

2929
// -- rustls TLS configs -- //
3030

31-
pub fn node_tls_config(
32-
node_cert: &NodeCert,
33-
ca_cert: &CaCert,
31+
pub fn node_run_tls_config(
32+
rng: &mut dyn Crng,
33+
seed: &RootSeed,
34+
dns_names: Vec<String>,
3435
) -> anyhow::Result<rustls::ServerConfig> {
35-
let ca_cert_der = ca_cert
36-
.serialize_der_signed()
37-
.context("Failed to self-sign + DER-serialize CA cert")?;
38-
let node_cert_der = node_cert
39-
.serialize_der_signed(ca_cert)
40-
.context("Failed to sign + DER-serialize node cert w/ CA cert")?;
41-
let node_key_der = node_cert.serialize_key_der();
42-
43-
let mut trust_anchors = rustls::RootCertStore::empty();
44-
trust_anchors
45-
.add(&rustls::Certificate(ca_cert_der))
36+
// derive the shared client-node CA cert from the root seed
37+
let ca_cert_key_pair = seed.derive_client_ca_key_pair();
38+
let ca_cert = CaCert::from_key_pair(ca_cert_key_pair)
39+
.context("Failed to build node-client CA cert")?;
40+
let ca_cert_der = rustls::Certificate(
41+
ca_cert
42+
.serialize_der_signed()
43+
.context("Failed to sign and serialize node-client CA cert")?,
44+
);
45+
46+
// build node cert and sign w/ the CA cert
47+
let node_key_pair = ed25519::gen_key_pair(rng);
48+
let node_cert = NodeCert::from_key_pair(node_key_pair, dns_names)
49+
.context("Failed to build ephemeral node cert")?;
50+
let node_cert_der = rustls::Certificate(
51+
node_cert
52+
.serialize_der_signed(&ca_cert)
53+
.context("Failed to sign and serialize ephemeral client cert")?,
54+
);
55+
let node_key_der = rustls::PrivateKey(node_cert.serialize_key_der());
56+
57+
// client cert trust root is just the derived CA cert
58+
let mut roots = rustls::RootCertStore::empty();
59+
roots
60+
.add(&ca_cert_der)
4661
.context("rustls failed to deserialize CA cert DER bytes")?;
4762

63+
// subject alt names for client are not useful here; just check for valid
64+
// cert chain
4865
let client_verifier =
49-
rustls::server::AllowAnyAuthenticatedClient::new(trust_anchors);
66+
rustls::server::AllowAnyAuthenticatedClient::new(roots);
5067

5168
// TODO(phlip9): use exactly TLSv1.3, ciphersuite TLS13_AES_128_GCM_SHA256,
5269
// and key exchange X25519
5370
let mut config = rustls::ServerConfig::builder()
5471
.with_safe_defaults()
5572
.with_client_cert_verifier(client_verifier)
56-
.with_single_cert(
57-
vec![rustls::Certificate(node_cert_der)],
58-
rustls::PrivateKey(node_key_der),
59-
)
73+
.with_single_cert(vec![node_cert_der], node_key_der)
6074
.context("Failed to build rustls::ServerConfig")?;
6175
config.alpn_protocols = vec!["h2".into(), "http/1.1".into()];
6276

6377
Ok(config)
6478
}
6579

66-
pub fn client_provision_tls_config(
67-
lexe_trust_anchor: &rustls::Certificate,
68-
expect_dummy_quote: bool,
69-
enclave_policy: attest::EnclavePolicy,
70-
) -> Result<rustls::ClientConfig> {
71-
let verifier = ClientProvisionCertVerifier {
72-
lexe_verifier: lexe_verifier(lexe_trust_anchor)?,
73-
attest_verifier: attest::ServerCertVerifier {
74-
expect_dummy_quote,
75-
enclave_policy,
76-
},
77-
};
78-
79-
// TODO(phlip9): use exactly TLSv1.3, ciphersuite TLS13_AES_128_GCM_SHA256,
80-
// and key exchange X25519
81-
let mut config = rustls::ClientConfig::builder()
82-
.with_safe_defaults()
83-
.with_custom_certificate_verifier(Arc::new(verifier))
84-
.with_no_client_auth();
85-
// TODO(phlip9): ensure this matches the reqwest config
86-
config.alpn_protocols = vec!["h2".into(), "http/1.1".into()];
87-
88-
Ok(config)
89-
}
90-
9180
pub fn client_run_tls_config(
9281
rng: &mut dyn Crng,
9382
lexe_trust_anchor: &rustls::Certificate,
94-
root_seed: &RootSeed,
83+
seed: &RootSeed,
9584
) -> Result<rustls::ClientConfig> {
9685
// derive the shared client-node CA cert from the root seed
97-
let ca_cert_key_pair = root_seed.derive_client_ca_key_pair();
86+
let ca_cert_key_pair = seed.derive_client_ca_key_pair();
9887
let ca_cert = CaCert::from_key_pair(ca_cert_key_pair)
9988
.context("Failed to build node-client CA cert")?;
10089
let ca_cert_der = rustls::Certificate(
@@ -141,6 +130,31 @@ pub fn client_run_tls_config(
141130
Ok(config)
142131
}
143132

133+
pub fn client_provision_tls_config(
134+
lexe_trust_anchor: &rustls::Certificate,
135+
expect_dummy_quote: bool,
136+
enclave_policy: attest::EnclavePolicy,
137+
) -> Result<rustls::ClientConfig> {
138+
let verifier = ClientProvisionCertVerifier {
139+
lexe_verifier: lexe_verifier(lexe_trust_anchor)?,
140+
attest_verifier: attest::ServerCertVerifier {
141+
expect_dummy_quote,
142+
enclave_policy,
143+
},
144+
};
145+
146+
// TODO(phlip9): use exactly TLSv1.3, ciphersuite TLS13_AES_128_GCM_SHA256,
147+
// and key exchange X25519
148+
let mut config = rustls::ClientConfig::builder()
149+
.with_safe_defaults()
150+
.with_custom_certificate_verifier(Arc::new(verifier))
151+
.with_no_client_auth();
152+
// TODO(phlip9): ensure this matches the reqwest config
153+
config.alpn_protocols = vec!["h2".into(), "http/1.1".into()];
154+
155+
Ok(config)
156+
}
157+
144158
fn lexe_verifier(
145159
lexe_trust_anchor: &rustls::Certificate,
146160
) -> Result<WebPkiVerifier> {
@@ -264,7 +278,7 @@ mod test {
264278
let client = async move {
265279
// should be able to independently derive CA key pair
266280
let seed = RootSeed::new(Secret::new(seed));
267-
let mut rng = SmallRng::new();
281+
let mut rng = SmallRng::from_u64(111);
268282

269283
// should be unused since no proxy
270284
let lexe_root =
@@ -300,15 +314,11 @@ mod test {
300314
let node = async move {
301315
// should be able to independently derive CA key pair
302316
let seed = RootSeed::new(Secret::new(seed));
303-
let ca_key_pair = seed.derive_client_ca_key_pair();
304-
let ca_cert = CaCert::from_key_pair(ca_key_pair).unwrap();
317+
let mut rng = SmallRng::from_u64(222);
305318

306-
let node_key_pair = ed25519::from_seed(&[0xf0; 32]);
307319
let dns_names = vec![dns_name.to_owned()];
308-
let node_cert =
309-
NodeCert::from_key_pair(node_key_pair, dns_names).unwrap();
310-
311-
let config = node_tls_config(&node_cert, &ca_cert).unwrap();
320+
let config =
321+
node_run_tls_config(&mut rng, &seed, dns_names).unwrap();
312322
let acceptor = tokio_rustls::TlsAcceptor::from(Arc::new(config));
313323
let mut stream = acceptor.accept(server_stream).await.unwrap();
314324

common/src/rng.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,10 @@ impl SmallRng {
8080
s1: 0xf00baa44,
8181
}
8282
}
83+
84+
pub fn from_u64(s: u64) -> Self {
85+
Self::seed_from_u64(s)
86+
}
8387
}
8488

8589
impl Default for SmallRng {

0 commit comments

Comments
 (0)