use crate::internal_alloc::Vec;
use noxtls_core::{Error, Result};
pub use noxtls_io::{TlsRecordDeframer, TLS_MAX_RECORD_PAYLOAD_LEN, TLS_RECORD_HEADER_LEN};
pub fn split_tls13_handshake_payload(payload: &[u8]) -> Result<Vec<Vec<u8>>> {
const HANDSHAKE_HEADER_LEN: usize = 4;
let mut cursor = 0_usize;
let mut messages = Vec::new();
while cursor < payload.len() {
if payload.len().saturating_sub(cursor) < HANDSHAKE_HEADER_LEN {
return Err(Error::ParseFailure(
"truncated tls handshake header in inner handshake payload",
));
}
let message_len = ((payload[cursor + 1] as usize) << 16)
| ((payload[cursor + 2] as usize) << 8)
| payload[cursor + 3] as usize;
let full_len = HANDSHAKE_HEADER_LEN.saturating_add(message_len);
if payload.len().saturating_sub(cursor) < full_len {
return Err(Error::ParseFailure(
"truncated tls handshake message body in inner handshake payload",
));
}
messages.push(payload[cursor..cursor + full_len].to_vec());
cursor = cursor.saturating_add(full_len);
}
Ok(messages)
}