use super::*;
impl Connection {
pub fn noxtls_derive_tls13_quic_initial_secrets_v1(
destination_connection_id: &[u8],
) -> Result<Tls13QuicInitialSecrets> {
if destination_connection_id.is_empty() {
return Err(Error::InvalidLength(
"quic destination connection id must not be empty",
));
}
let initial_secret =
noxtls_hkdf_extract_sha256(&TLS13_QUIC_V1_INITIAL_SALT, destination_connection_id)
.to_vec();
let client_initial_secret = noxtls_tls13_expand_label_for_hash(
HashAlgorithm::Sha256,
&initial_secret,
b"client in",
&[],
32,
)?;
let server_initial_secret = noxtls_tls13_expand_label_for_hash(
HashAlgorithm::Sha256,
&initial_secret,
b"server in",
&[],
32,
)?;
Ok(Tls13QuicInitialSecrets {
initial_secret,
client_initial_secret,
server_initial_secret,
})
}
pub fn noxtls_derive_tls13_quic_packet_protection_keys(
noxtls_hash_algorithm: HashAlgorithm,
traffic_secret: &[u8],
key_len: usize,
header_protection_key_len: usize,
) -> Result<Tls13QuicPacketProtectionKeys> {
if key_len == 0 {
return Err(Error::InvalidLength(
"quic key length must be greater than zero",
));
}
if header_protection_key_len == 0 {
return Err(Error::InvalidLength(
"quic header protection key length must be greater than zero",
));
}
let key = noxtls_tls13_expand_label_for_hash(
noxtls_hash_algorithm,
traffic_secret,
b"quic key",
&[],
key_len,
)?;
let iv = noxtls_tls13_expand_label_for_hash(
noxtls_hash_algorithm,
traffic_secret,
b"quic iv",
&[],
12,
)?;
let header_protection_key = noxtls_tls13_expand_label_for_hash(
noxtls_hash_algorithm,
traffic_secret,
b"quic hp",
&[],
header_protection_key_len,
)?;
Ok(Tls13QuicPacketProtectionKeys {
key,
iv,
header_protection_key,
})
}
pub fn noxtls_tls13_quic_traffic_secret_snapshot(
&self,
) -> Result<Tls13QuicTrafficSecretSnapshot> {
if !self.version.uses_tls13_handshake_semantics() {
return Err(Error::StateError(
"quic traffic secret snapshot is only defined for TLS 1.3",
));
}
let client_handshake_secret =
self.tls13_client_handshake_traffic_secret
.clone()
.ok_or(Error::StateError(
"tls13 client handshake traffic secret is not installed",
))?;
let server_handshake_secret =
self.tls13_server_handshake_traffic_secret
.clone()
.ok_or(Error::StateError(
"tls13 server handshake traffic secret is not installed",
))?;
let client_application_secret = self
.tls13_client_application_traffic_secret
.clone()
.ok_or(Error::StateError(
"tls13 client application traffic secret is not installed",
))?;
let server_application_secret = self
.tls13_server_application_traffic_secret
.clone()
.ok_or(Error::StateError(
"tls13 server application traffic secret is not installed",
))?;
Ok(Tls13QuicTrafficSecretSnapshot {
client_handshake_secret,
server_handshake_secret,
client_application_secret,
server_application_secret,
})
}
pub fn noxtls_derive_tls13_quic_next_traffic_secrets(
&self,
) -> Result<Tls13QuicNextTrafficSecrets> {
if !self.version.uses_tls13_handshake_semantics() {
return Err(Error::StateError(
"quic key noxtls_update secrets are only defined for TLS 1.3",
));
}
let noxtls_hash_algorithm = self.noxtls_negotiated_hash_algorithm();
let hash_len = noxtls_hash_algorithm.output_len();
let client_secret = self
.tls13_client_application_traffic_secret
.as_ref()
.ok_or(Error::StateError(
"tls13 application client traffic secret is not installed",
))?;
let server_secret = self
.tls13_server_application_traffic_secret
.as_ref()
.ok_or(Error::StateError(
"tls13 application server traffic secret is not installed",
))?;
let client_next_application_secret = noxtls_tls13_expand_label_for_hash(
noxtls_hash_algorithm,
client_secret,
b"quic ku",
&[],
hash_len,
)?;
let server_next_application_secret = noxtls_tls13_expand_label_for_hash(
noxtls_hash_algorithm,
server_secret,
b"quic ku",
&[],
hash_len,
)?;
Ok(Tls13QuicNextTrafficSecrets {
client_next_application_secret,
server_next_application_secret,
})
}
pub fn noxtls_export_quic_keying_material(
&self,
label: &[u8],
context: &[u8],
len: usize,
) -> Result<Vec<u8>> {
if !label.starts_with(b"EXPORTER-QUIC ") {
return Err(Error::StateError(
"quic exporter requires label prefix EXPORTER-QUIC ",
));
}
self.noxtls_export_keying_material(label, context, len)
}
}