Skip to content

Commit

Permalink
dangerous_extract_secrets(): test ConnectionTrafficSecrets variant
Browse files Browse the repository at this point in the history
  • Loading branch information
ctz committed Mar 25, 2024
1 parent 2d5c80e commit fb6e70a
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 3 deletions.
8 changes: 5 additions & 3 deletions rustls/src/crypto/aws_lc_rs/tls12.rs
Original file line number Diff line number Diff line change
Expand Up @@ -183,9 +183,11 @@ impl Tls12AeadAlgorithm for GcmAlgorithm {
write_iv: &[u8],
explicit: &[u8],
) -> Result<ConnectionTrafficSecrets, UnsupportedOperationError> {
Ok(ConnectionTrafficSecrets::Aes128Gcm {
key,
iv: gcm_iv(write_iv, explicit),
let iv = gcm_iv(write_iv, explicit);
Ok(match self.0.key_len() {
16 => ConnectionTrafficSecrets::Aes128Gcm { key, iv },
32 => ConnectionTrafficSecrets::Aes256Gcm { key, iv },
_ => unreachable!(),
})
}
}
Expand Down
69 changes: 69 additions & 0 deletions rustls/tests/api.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5418,6 +5418,75 @@ fn test_secret_extraction_enabled() {
}
}

#[test]
fn test_secret_extract_produces_correct_variant() {
fn check(suite: SupportedCipherSuite, f: impl Fn(ConnectionTrafficSecrets) -> bool) {
let kt = KeyType::Rsa;

let provider: Arc<CryptoProvider> = CryptoProvider {
cipher_suites: vec![suite],
..provider::default_provider()
}
.into();

let mut server_config = finish_server_config(
kt,
ServerConfig::builder_with_provider(provider.clone())
.with_safe_default_protocol_versions()
.unwrap(),
);

server_config.enable_secret_extraction = true;
let server_config = Arc::new(server_config);

let mut client_config = finish_client_config(
kt,
ClientConfig::builder_with_provider(provider)
.with_safe_default_protocol_versions()
.unwrap(),
);
client_config.enable_secret_extraction = true;

let (mut client, mut server) =
make_pair_for_arc_configs(&Arc::new(client_config), &server_config);

do_handshake(&mut client, &mut server);

let client_secrets = client
.dangerous_extract_secrets()
.unwrap();
let server_secrets = server
.dangerous_extract_secrets()
.unwrap();

assert!(f(client_secrets.tx.1));
assert!(f(client_secrets.rx.1));
assert!(f(server_secrets.tx.1));
assert!(f(server_secrets.rx.1));
}

check(cipher_suite::TLS13_AES_128_GCM_SHA256, |sec| {
matches!(sec, ConnectionTrafficSecrets::Aes128Gcm { .. })
});
check(cipher_suite::TLS13_AES_256_GCM_SHA384, |sec| {
matches!(sec, ConnectionTrafficSecrets::Aes256Gcm { .. })
});
check(cipher_suite::TLS13_CHACHA20_POLY1305_SHA256, |sec| {
matches!(sec, ConnectionTrafficSecrets::Chacha20Poly1305 { .. })
});

check(cipher_suite::TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, |sec| {
matches!(sec, ConnectionTrafficSecrets::Aes128Gcm { .. })
});
check(cipher_suite::TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, |sec| {
matches!(sec, ConnectionTrafficSecrets::Aes256Gcm { .. })
});
check(
cipher_suite::TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
|sec| matches!(sec, ConnectionTrafficSecrets::Chacha20Poly1305 { .. }),
);
}

/// Test that secrets cannot be extracted unless explicitly enabled, and until
/// the handshake is done.
#[cfg(feature = "tls12")]
Expand Down

0 comments on commit fb6e70a

Please sign in to comment.