use synta::{FromDer, Integer, ToDer};
fn main() {
println!("=== ASN.1 Integer Decoding Example ===\n");
let data1 = vec![0x02, 0x01, 0x2A]; decode_and_display("Small positive (42)", &data1);
let data2 = vec![0x02, 0x02, 0x03, 0xE8]; decode_and_display("Larger positive (1000)", &data2);
let data3 = vec![0x02, 0x01, 0xFF]; decode_and_display("Negative (-1)", &data3);
let data4 = vec![0x02, 0x08, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF];
decode_and_display("Large (i64::MAX)", &data4);
let data5 = vec![0x02, 0x01, 0x00]; decode_and_display("Zero", &data5);
println!("\n=== Encoding Example ===\n");
let value = 12345;
println!("Encoding integer: {}", value);
let integer = Integer::from(value);
let encoded = integer.to_der().unwrap();
println!("Encoded bytes: {:02X?}", encoded);
println!("Length: {} bytes", encoded.len());
let decoded = Integer::from_der(&encoded).unwrap();
println!("Decoded back: {}", decoded.as_i64().unwrap());
}
fn decode_and_display(label: &str, data: &[u8]) {
println!("{}:", label);
println!(" Raw bytes: {:02X?}", data);
match Integer::from_der(data) {
Ok(integer) => {
match integer.as_i64() {
Ok(value) => println!(" Decoded value: {}", value),
Err(_) => println!(" Value too large for i64"),
}
println!(" Raw bytes: {:02X?}", integer.as_bytes());
}
Err(e) => println!(" Error: {:?}", e),
}
println!();
}