use synta::types::constructed::{Element, Sequence};
use synta::types::primitive::{Boolean, Integer};
use synta::types::string::OctetStringRef;
use synta::{Decoder, Encoding, ToDer};
#[test]
fn test_ber_indefinite_length_sequence() {
let data = vec![
0x30, 0x80, 0x02, 0x01, 0x2A, 0x00, 0x00, ];
let mut decoder = Decoder::new(&data, Encoding::Ber);
let result = decoder.decode::<Sequence>();
assert!(
result.is_ok(),
"Failed to decode indefinite length sequence"
);
let elements = result.unwrap().into_elements().unwrap();
assert_eq!(elements.len(), 1);
match &elements[0] {
Element::Integer(i) => assert_eq!(i.as_i64().unwrap(), 42),
_ => panic!("Expected Integer element"),
}
}
#[test]
fn test_ber_nested_indefinite_length() {
let data = vec![
0x30, 0x80, 0x30, 0x80, 0x02, 0x01, 0x2A, 0x00, 0x00, 0x00, 0x00, ];
let mut decoder = Decoder::new(&data, Encoding::Ber);
let result = decoder.decode::<Sequence>();
assert!(result.is_ok(), "Failed to decode nested indefinite length");
let elements = result.unwrap().into_elements().unwrap();
assert_eq!(elements.len(), 1);
match &elements[0] {
Element::Sequence(inner) => {
let inner_els = inner.clone().into_elements().unwrap();
assert_eq!(inner_els.len(), 1);
match &inner_els[0] {
Element::Integer(i) => assert_eq!(i.as_i64().unwrap(), 42),
_ => panic!("Expected Integer in inner sequence"),
}
}
_ => panic!("Expected Sequence element"),
}
}
#[test]
fn test_ber_indefinite_length_multiple_elements() {
let data = vec![
0x30, 0x80, 0x02, 0x01, 0x2A, 0x01, 0x01, 0xFF, 0x02, 0x01, 0x05, 0x00, 0x00, ];
let mut decoder = Decoder::new(&data, Encoding::Ber);
let result = decoder.decode::<Sequence>();
assert!(result.is_ok());
let elements = result.unwrap().into_elements().unwrap();
assert_eq!(elements.len(), 3);
match &elements[0] {
Element::Integer(i) => assert_eq!(i.as_i64().unwrap(), 42),
_ => panic!("Expected Integer"),
}
match &elements[1] {
Element::Boolean(b) => assert!(b.value()),
_ => panic!("Expected Boolean"),
}
match &elements[2] {
Element::Integer(i) => assert_eq!(i.as_i64().unwrap(), 5),
_ => panic!("Expected Integer"),
}
}
#[test]
fn test_ber_indefinite_length_rejected_in_der() {
let data = vec![
0x30, 0x80, 0x02, 0x01, 0x2A, 0x00, 0x00, ];
let mut decoder = Decoder::new(&data, Encoding::Der);
let result = decoder.decode::<Sequence>();
assert!(result.is_err(), "DER should reject indefinite length");
}
#[test]
fn test_ber_missing_end_of_contents() {
let data = vec![
0x30, 0x80, 0x02, 0x01, 0x2A, ];
let mut decoder = Decoder::new(&data, Encoding::Ber);
let result = decoder.decode::<Sequence>();
assert!(result.is_err(), "Should fail without end-of-contents");
}
#[test]
fn test_ber_definite_length_still_works() {
let data = vec![
0x30, 0x03, 0x02, 0x01, 0x2A, ];
let mut decoder = Decoder::new(&data, Encoding::Ber);
let result = decoder.decode::<Sequence>();
assert!(result.is_ok());
let elements = result.unwrap().into_elements().unwrap();
assert_eq!(elements.len(), 1);
}
#[test]
fn test_ber_relaxed_boolean() {
let data = vec![0x01, 0x01, 0x42];
let mut decoder = Decoder::new(&data, Encoding::Ber);
let result = decoder.decode::<Boolean>();
assert!(result.is_ok());
assert!(result.unwrap().value());
}
#[test]
fn test_ber_encoding_uses_definite_length() {
let mut seq = Sequence::new();
seq.push(Element::Integer(Integer::from(42)));
let encoded = seq.to_ber().unwrap();
assert_eq!(encoded[0], 0x30); assert!(encoded[1] != 0x80);
let mut decoder = Decoder::new(&encoded, Encoding::Ber);
let decoded = decoder.decode::<Sequence>().unwrap();
assert_eq!(decoded.into_elements().unwrap().len(), 1);
}
#[test]
fn test_ber_roundtrip() {
let mut seq = Sequence::new();
let octet_data = vec![1, 2, 3, 4];
seq.push(Element::Integer(Integer::from(100)));
seq.push(Element::Boolean(Boolean::new(true)));
seq.push(Element::OctetString(OctetStringRef::new(&octet_data)));
let encoded = seq.to_ber().unwrap();
let mut decoder = Decoder::new(&encoded, Encoding::Ber);
let decoded = decoder.decode::<Sequence>().unwrap();
assert_eq!(decoded.into_elements().unwrap().len(), 3);
}