use crate::ast::*;
use alloc::vec::Vec;
pub fn build_wireguard_payload(spec: &WireguardSpec, payload: &[u8]) -> (Vec<u8>, u16) {
let msg_type = spec.msg_type.unwrap_or(WireguardType::Initiation);
let mut wg = Vec::new();
match msg_type {
WireguardType::Initiation => {
wg.reserve(148);
wg.push(1); wg.extend_from_slice(&[0, 0, 0]); let sender = spec.sender.unwrap_or(1);
wg.extend_from_slice(&sender.to_le_bytes());
wg.extend_from_slice(&[0u8; 32]); wg.extend_from_slice(&[0u8; 48]); wg.extend_from_slice(&[0u8; 28]); wg.extend_from_slice(&[0u8; 16]); wg.extend_from_slice(&[0u8; 16]); }
WireguardType::Response => {
wg.reserve(92);
wg.push(2);
wg.extend_from_slice(&[0, 0, 0]);
wg.extend_from_slice(&spec.sender.unwrap_or(1).to_le_bytes());
wg.extend_from_slice(&spec.receiver.unwrap_or(2).to_le_bytes());
wg.extend_from_slice(&[0u8; 32]); wg.extend_from_slice(&[0u8; 16]); wg.extend_from_slice(&[0u8; 16]); wg.extend_from_slice(&[0u8; 16]); }
WireguardType::Cookie => {
wg.reserve(64);
wg.push(3);
wg.extend_from_slice(&[0, 0, 0]);
wg.extend_from_slice(&spec.receiver.unwrap_or(1).to_le_bytes());
wg.extend_from_slice(&[0u8; 24]); wg.extend_from_slice(&[0u8; 32]); }
WireguardType::Data => {
wg.reserve(32 + payload.len());
wg.push(4);
wg.extend_from_slice(&[0, 0, 0]);
wg.extend_from_slice(&spec.receiver.unwrap_or(1).to_le_bytes());
wg.extend_from_slice(&spec.counter.unwrap_or(0).to_le_bytes());
wg.extend_from_slice(payload);
if payload.len() < 16 {
wg.extend_from_slice(&[0u8; 16]);
}
}
}
(wg, 51820)
}