@@ -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-
9180pub 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+
144158fn 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
0 commit comments