Macro bsn1::constructed_der [−][src]
macro_rules! constructed_der { ($id:expr $(, ($id_n:expr, $contents_n:expr))*) => { ... }; ($id:expr $(, ($id_n:expr, $contents_n:expr))*,) => { ... }; }
Expand description
Builds a Der
instance representing ‘Constructed DER’ effectively.
Formula
constructed_der!(id: &IdRef [, (id_1, contents_1) [, (id_2, contents_2) [...]]]) => Der
id_n
and contents_n
must be bounded on AsRef<[u8]>
.
Warnings
ASN.1 does not allow some universal identifier for DER, however, this macro accepts
such an identifier.
For example, ‘Octet String’ must be primitive in DER, but this function will construct a
new instance even if id
represenets constructed ‘Octet String.’
Examples
Empty contents.
use bsn1::{Der, IdRef}; let id = IdRef::sequence(); let expected = Der::new(id, &[]); let der = constructed_der!(id); assert_eq!(expected, der);
Sequence of 2 DERs.
use bsn1::{contents, DerRef, IdRef}; use std::convert::TryFrom; let id = IdRef::sequence(); let id1 = IdRef::octet_string(); let contents1: [u8; 3] = [1, 2, 3]; let id2 = IdRef::integer(); let contents2 = contents::from_integer(10); let der = constructed_der!(id, (id1.to_owned(), contents1), (id2, &contents2)); assert_eq!(id, der.id()); let bytes = der.contents(); let der1 = <&DerRef>::try_from(bytes).unwrap(); assert_eq!(id1, der1.id()); assert_eq!(contents1, der1.contents()); let bytes = &bytes[der1.as_ref().len()..]; let der2 = <&DerRef>::try_from(bytes).unwrap(); assert_eq!(id2, der2.id()); assert_eq!(contents2.as_ref(), der2.contents());