Skip to main content

decode_integer/
decode_integer.rs

1//! Example: Decoding ASN.1 integers
2//!
3//! This example demonstrates how to decode ASN.1 INTEGER values from DER-encoded data.
4//!
5//! Run with: cargo run --example decode_integer
6
7use synta::{FromDer, Integer, ToDer};
8
9fn main() {
10    println!("=== ASN.1 Integer Decoding Example ===\n");
11
12    // Example 1: Small positive integer (42)
13    let data1 = vec![0x02, 0x01, 0x2A]; // INTEGER 42
14    decode_and_display("Small positive (42)", &data1);
15
16    // Example 2: Larger positive integer (1000)
17    let data2 = vec![0x02, 0x02, 0x03, 0xE8]; // INTEGER 1000
18    decode_and_display("Larger positive (1000)", &data2);
19
20    // Example 3: Negative integer (-1)
21    let data3 = vec![0x02, 0x01, 0xFF]; // INTEGER -1
22    decode_and_display("Negative (-1)", &data3);
23
24    // Example 4: Large integer (i64::MAX)
25    let data4 = vec![0x02, 0x08, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF];
26    decode_and_display("Large (i64::MAX)", &data4);
27
28    // Example 5: Zero
29    let data5 = vec![0x02, 0x01, 0x00]; // INTEGER 0
30    decode_and_display("Zero", &data5);
31
32    println!("\n=== Encoding Example ===\n");
33
34    // Encode an integer
35    let value = 12345;
36    println!("Encoding integer: {}", value);
37
38    let integer = Integer::from(value);
39    let encoded = integer.to_der().unwrap();
40
41    println!("Encoded bytes: {:02X?}", encoded);
42    println!("Length: {} bytes", encoded.len());
43
44    // Verify by decoding
45    let decoded = Integer::from_der(&encoded).unwrap();
46    println!("Decoded back: {}", decoded.as_i64().unwrap());
47}
48
49fn decode_and_display(label: &str, data: &[u8]) {
50    println!("{}:", label);
51    println!("  Raw bytes: {:02X?}", data);
52
53    match Integer::from_der(data) {
54        Ok(integer) => {
55            match integer.as_i64() {
56                Ok(value) => println!("  Decoded value: {}", value),
57                Err(_) => println!("  Value too large for i64"),
58            }
59            println!("  Raw bytes: {:02X?}", integer.as_bytes());
60        }
61        Err(e) => println!("  Error: {:?}", e),
62    }
63    println!();
64}