From f55bc410705f9b31e16af5aa89468f2321134181 Mon Sep 17 00:00:00 2001 From: dishmaker <141624503+dishmaker@users.noreply.github.com> Date: Fri, 3 Jul 2026 23:31:04 +0200 Subject: [PATCH] der: fix impl `EncodeValue` for `&SequenceRef` --- der/src/asn1/sequence.rs | 2 +- der/tests/derive_no_alloc.rs | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/der/src/asn1/sequence.rs b/der/src/asn1/sequence.rs index cfa6d76ad..75c0b65a7 100644 --- a/der/src/asn1/sequence.rs +++ b/der/src/asn1/sequence.rs @@ -78,7 +78,7 @@ impl<'a> DecodeValue<'a> for &'a SequenceRef { } } -impl EncodeValue for SequenceRef { +impl EncodeValue for &SequenceRef { fn value_len(&self) -> Result { Ok(self.body.len()) } diff --git a/der/tests/derive_no_alloc.rs b/der/tests/derive_no_alloc.rs index 95ad59ed7..bec99ac06 100644 --- a/der/tests/derive_no_alloc.rs +++ b/der/tests/derive_no_alloc.rs @@ -99,6 +99,41 @@ mod sequence { assert_eq!(obj, obj_decoded); } } + +/// Custom derive test cases for the `Sequence` macro with oid support. +#[cfg(all(feature = "oid", feature = "heapless"))] +mod sequence_oid { + use const_oid::ObjectIdentifier; + use der::Decode; + use der::Encode; + use der::Sequence; + use der::asn1::SequenceRef; + use hex_literal::hex; + + /// Example from: + #[derive(Debug, Sequence)] + pub struct OidAndImplicitSequence<'a> { + pub oid: ObjectIdentifier, + #[asn1(context_specific = "0", tag_mode = "IMPLICIT")] + pub data: &'a SequenceRef, + } + + #[test] + fn roundtrip_oid_and_implicit_sequence() { + let obj_data: &[u8] = &hex!( + "30 09" // SEQUENCE + "06 03" // OBJECT IDENTIFIER + "29 01 01" // oid "1.1.1.1" + "A0 02" // CONTEXT-SPECIFIC [0] (constructed) + "AA BB" + ); + let obj = OidAndImplicitSequence::from_der(obj_data).unwrap(); + + assert_eq!(obj.data.as_bytes(), &hex!("AA BB")); + assert_eq!(obj_data, &obj.to_der().unwrap()); + } +} + /// Custom derive test cases for the `Sequence` macro with heapless crate. #[cfg(all(feature = "oid", feature = "heapless"))] mod sequence_heapless_vec {