use synta::types::constructed::Sequence;
use synta::types::primitive::{Boolean, Integer};
use synta::{Decoder, Encoder, Encoding};
#[test]
fn test_cer_boolean_strict() {
let data = [0x01, 0x01, 0xFF];
let mut decoder = Decoder::new(&data, Encoding::Cer);
let result = decoder.decode::<Boolean>();
assert!(result.is_ok());
assert!(result.unwrap().value());
let data = [0x01, 0x01, 0x00];
let mut decoder = Decoder::new(&data, Encoding::Cer);
let result = decoder.decode::<Boolean>();
assert!(result.is_ok());
assert!(!result.unwrap().value());
let data = [0x01, 0x01, 0x01];
let mut decoder = Decoder::new(&data, Encoding::Cer);
let result = decoder.decode::<Boolean>();
assert!(result.is_err());
assert!(matches!(
result.unwrap_err(),
synta::Error::CerViolation { .. }
));
let data = [0x01, 0x01, 0x42];
let mut decoder = Decoder::new(&data, Encoding::Cer);
let result = decoder.decode::<Boolean>();
assert!(result.is_err());
assert!(matches!(
result.unwrap_err(),
synta::Error::CerViolation { .. }
));
}
#[test]
fn test_cer_integer_minimal_encoding() {
let data = [0x02, 0x01, 0x7F];
let mut decoder = Decoder::new(&data, Encoding::Cer);
let result = decoder.decode::<Integer>();
assert!(result.is_ok());
assert_eq!(result.unwrap().as_i64().unwrap(), 127);
let data = [0x02, 0x02, 0x00, 0x80];
let mut decoder = Decoder::new(&data, Encoding::Cer);
let result = decoder.decode::<Integer>();
assert!(result.is_ok());
assert_eq!(result.unwrap().as_i64().unwrap(), 128);
let data = [0x02, 0x02, 0x00, 0x7F];
let mut decoder = Decoder::new(&data, Encoding::Cer);
let result = decoder.decode::<Integer>();
assert!(result.is_err());
assert!(matches!(
result.unwrap_err(),
synta::Error::CerViolation { .. }
));
let data = [0x02, 0x02, 0xFF, 0xFF];
let mut decoder = Decoder::new(&data, Encoding::Cer);
let result = decoder.decode::<Integer>();
assert!(result.is_err());
assert!(matches!(
result.unwrap_err(),
synta::Error::CerViolation { .. }
));
}
#[test]
fn test_cer_large_constructed_requires_indefinite() {
let mut content = vec![0x02, 0x01, 0x00]; while content.len() < 1001 {
content.extend_from_slice(&[0x02, 0x01, 0x00]);
}
let content_len = content.len();
let mut data = vec![0x30];
if content_len > 127 {
let len_bytes = if content_len <= 0xFF {
vec![content_len as u8]
} else {
vec![(content_len >> 8) as u8, (content_len & 0xFF) as u8]
};
data.push(0x80 | len_bytes.len() as u8);
data.extend_from_slice(&len_bytes);
} else {
data.push(content_len as u8);
}
data.extend_from_slice(&content);
let mut decoder = Decoder::new(&data, Encoding::Cer);
let result = decoder.decode::<Sequence>();
assert!(result.is_err());
assert!(matches!(
result.unwrap_err(),
synta::Error::CerViolation { .. }
));
}
#[test]
fn test_cer_small_constructed_allows_definite() {
let data = [
0x30, 0x06, 0x02, 0x01, 0x2A, 0x02, 0x01, 0x64, ];
let mut decoder = Decoder::new(&data, Encoding::Cer);
let result = decoder.decode::<Sequence>();
assert!(result.is_ok());
}
#[test]
fn test_cer_encoding_roundtrip() {
let value = Integer::from(42);
let mut encoder = Encoder::new(Encoding::Cer);
encoder.encode(&value).expect("Failed to encode");
let encoded = encoder.finish().expect("Failed to finish");
let mut decoder = Decoder::new(&encoded, Encoding::Cer);
let decoded: Integer = decoder.decode().expect("Failed to decode");
assert_eq!(value.as_i64().unwrap(), decoded.as_i64().unwrap());
}
#[test]
fn test_cer_vs_der_boolean() {
let data = [0x01, 0x01, 0xFF];
let mut cer_decoder = Decoder::new(&data, Encoding::Cer);
assert!(cer_decoder.decode::<Boolean>().is_ok());
let mut der_decoder = Decoder::new(&data, Encoding::Der);
assert!(der_decoder.decode::<Boolean>().is_ok());
let invalid_data = [0x01, 0x01, 0x42];
let mut cer_decoder = Decoder::new(&invalid_data, Encoding::Cer);
assert!(cer_decoder.decode::<Boolean>().is_err());
let mut der_decoder = Decoder::new(&invalid_data, Encoding::Der);
assert!(der_decoder.decode::<Boolean>().is_err());
}
#[test]
fn test_cer_vs_ber_boolean() {
let data = [0x01, 0x01, 0x01];
let mut cer_decoder = Decoder::new(&data, Encoding::Cer);
assert!(cer_decoder.decode::<Boolean>().is_err());
let mut ber_decoder = Decoder::new(&data, Encoding::Ber);
let result = ber_decoder.decode::<Boolean>();
assert!(result.is_ok());
assert!(result.unwrap().value());
}