From 01bbce5bd186aaaf322e9e819488a1bd0cbe4cc4 Mon Sep 17 00:00:00 2001 From: ErvinsK Date: Fri, 31 Oct 2025 23:52:55 +0200 Subject: [PATCH] fix: Issue #506 --- src/per/de.rs | 5 +++-- tests/issue506.rs | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 tests/issue506.rs diff --git a/src/per/de.rs b/src/per/de.rs index 50d624ec..727c6a63 100644 --- a/src/per/de.rs +++ b/src/per/de.rs @@ -709,11 +709,12 @@ impl<'input, const RFC: usize, const EFC: usize> crate::Decoder for Decoder<'inp ) -> Result { let mut octet_string = Vec::new(); let codec = self.codec(); - + if codec == crate::Codec::Aper { + self.input = self.parse_padding(self.input)?; + } self.decode_extensible_container(constraints, |input, length| { let (input, part) = nom::bytes::streaming::take(length * 8)(input) .map_err(|e| DecodeError::map_nom_err(e, codec))?; - let mut bytes = part.to_bitvec(); bytes.force_align(); octet_string.extend_from_slice(bytes.as_raw_slice()); diff --git a/tests/issue506.rs b/tests/issue506.rs new file mode 100644 index 00000000..886103b5 --- /dev/null +++ b/tests/issue506.rs @@ -0,0 +1,39 @@ +use rasn::prelude::*; + +/* +World-Schema DEFINITIONS AUTOMATIC TAGS ::= +BEGIN + A ::= SEQUENCE { + i OCTET STRING (SIZE(3)), + t OCTET STRING (SIZE(2)), + e INTEGER OPTIONAL, + ... +} +END +*/ + +#[doc = "SEQUENCE A"] +#[derive(AsnType, Debug, Clone, Decode, Encode, PartialEq, Eq, Hash)] +#[non_exhaustive] +pub struct A { + pub i: FixedOctetString<3>, + pub t: FixedOctetString<2>, + pub e: Option, +} + +#[test] +fn test_sequence_a() { + // Encoded byte array + let encoded_value = [0x00u8, 0x19, 0xf0, 0x45, 0x00, 0x01]; + // Decoded ASN.1 structure + let original = A { + i: FixedOctetString::from([0x19, 0xf0, 0x45]), + t: FixedOctetString::from([0x00, 0x01]), + e: None, + }; + let encoded = rasn::aper::encode(&original).expect("encode"); + println!("Encoded: {:x?}", encoded); + assert_eq!(&encoded_value, &encoded[..]); + let decoded: A = rasn::aper::decode(&encoded).expect("decode"); + assert_eq!(decoded, original); +}