use crate::ast::*;
use crate::builders::WireContext;
use alloc::vec::Vec;
pub fn build_tls_payload(
_ctx: &WireContext,
spec: &TlsSpec,
payload_bytes: &[u8],
) -> Vec<u8> {
let rec_version = spec.record_version.unwrap_or(0x0303);
if spec.is_server_hello {
let mut hs_body = Vec::new();
hs_body.extend_from_slice(&0x0303u16.to_be_bytes()); hs_body.extend_from_slice(&[0xaa; 32]); hs_body.push(0); hs_body.extend_from_slice(&0x1301u16.to_be_bytes()); hs_body.push(0); hs_body.extend_from_slice(&0u16.to_be_bytes());
let hs_len = hs_body.len() as u32;
let mut hs = alloc::vec![
2, (hs_len >> 16) as u8,
(hs_len >> 8) as u8,
hs_len as u8,
];
hs.extend_from_slice(&hs_body);
let rec_len = hs.len() as u16;
let mut rec = Vec::new();
rec.push(22); rec.extend_from_slice(&rec_version.to_be_bytes());
rec.extend_from_slice(&rec_len.to_be_bytes());
rec.extend_from_slice(&hs);
return rec;
}
let mut hs_body = Vec::new();
hs_body.extend_from_slice(&0x0303u16.to_be_bytes()); hs_body.extend_from_slice(&[0x11; 32]); hs_body.push(0);
hs_body.extend_from_slice(&4u16.to_be_bytes()); hs_body.extend_from_slice(&0x1301u16.to_be_bytes()); hs_body.extend_from_slice(&0x1302u16.to_be_bytes());
hs_body.push(1); hs_body.push(0);
let mut exts = Vec::new();
if let Some(sni) = spec.sni {
let sni_bytes = sni.as_bytes();
exts.extend_from_slice(&0u16.to_be_bytes()); let ext_len = (sni_bytes.len() + 5) as u16;
exts.extend_from_slice(&ext_len.to_be_bytes());
let list_len = (sni_bytes.len() + 3) as u16;
exts.extend_from_slice(&list_len.to_be_bytes());
exts.push(0); exts.extend_from_slice(&(sni_bytes.len() as u16).to_be_bytes());
exts.extend_from_slice(sni_bytes);
}
hs_body.extend_from_slice(&(exts.len() as u16).to_be_bytes());
hs_body.extend_from_slice(&exts);
let hs_len = hs_body.len() as u32;
let mut hs = alloc::vec![
1, (hs_len >> 16) as u8,
(hs_len >> 8) as u8,
hs_len as u8,
];
hs.extend_from_slice(&hs_body);
if !payload_bytes.is_empty() {
hs.extend_from_slice(payload_bytes);
}
let rec_len = hs.len() as u16;
let mut rec = Vec::new();
rec.push(22); rec.extend_from_slice(&rec_version.to_be_bytes());
rec.extend_from_slice(&rec_len.to_be_bytes());
rec.extend_from_slice(&hs);
rec
}