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());