use oxirush_security::*;
fn main() {
let key: [u8; 16] = [
0x2b, 0xd6, 0x45, 0x9f, 0x82, 0xc5, 0xb3, 0x00, 0x95, 0x2c, 0x49, 0x10, 0x48, 0x81,
0xff, 0x48,
];
let count: u32 = 0x38a6f056; let bearer: u8 = 0x01; let direction: u8 = 0;
let message = b"Hello 5G NAS integrity!";
println!("=== NAS Integrity MAC computation ===\n");
println!(
"Key: {}",
key.iter().map(|b| format!("{b:02x}")).collect::<String>()
);
println!("COUNT: 0x{count:08x}");
println!("Bearer: {bearer}");
println!("Direction: {direction} (uplink)");
println!("Message: {:?}\n", String::from_utf8_lossy(message));
let mac_nia1 = nas_mac(&key, count, bearer, direction, message, 0x01);
println!("NIA1 (SNOW 3G) MAC: 0x{mac_nia1:08x}");
let mac_nia2 = nas_mac(&key, count, bearer, direction, message, 0x02);
println!("NIA2 (AES-CMAC) MAC: 0x{mac_nia2:08x}");
let mac_nia3 = nas_mac(&key, count, bearer, direction, message, 0x03);
println!("NIA3 (ZUC) MAC: 0x{mac_nia3:08x}");
let mac_nia0 = nas_mac(&key, count, bearer, direction, message, 0x00);
println!("NIA0 (null) MAC: 0x{mac_nia0:08x}");
assert_eq!(mac_nia0, 0, "NIA0 must always return 0");
assert_ne!(mac_nia1, mac_nia2);
assert_ne!(mac_nia2, mac_nia3);
println!("\nAll MACs computed successfully.");
}