1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
mod any;
mod instance;
pub(crate) mod oid;
mod open;
mod prefix;
mod tag;
use alloc::boxed::Box;
pub use ::{
alloc::string::String as Utf8String, bytes::Bytes as OctetString,
num_bigint::BigInt as Integer, rasn_derive::AsnType,
};
pub use self::{
any::Any,
instance::InstanceOf,
oid::{ConstOid, ObjectIdentifier, Oid},
open::Open,
prefix::{Explicit, Implicit},
tag::{Class, Tag, TagTree},
};
pub type BitString = bitvec::vec::BitVec<bitvec::order::Msb0, u8>;
pub type Ia5String = Implicit<tag::IA5_STRING, Utf8String>;
pub type PrintableString = Implicit<tag::PRINTABLE_STRING, Utf8String>;
pub type VisibleString = Implicit<tag::VISIBLE_STRING, Utf8String>;
pub type BmpString = Implicit<tag::BMP_STRING, Utf8String>;
pub type TeletexString = Implicit<tag::TELETEX_STRING, OctetString>;
pub type NumericString = Implicit<tag::NUMERIC_STRING, Utf8String>;
pub type SetOf<T> = alloc::collections::BTreeSet<T>;
pub type UniversalString = Implicit<tag::UNIVERSAL_STRING, Utf8String>;
pub type UtcTime = chrono::DateTime<chrono::Utc>;
pub type GeneralizedTime = chrono::DateTime<chrono::FixedOffset>;
pub type SequenceOf<T> = alloc::vec::Vec<T>;
pub trait AsnType {
const TAG: Tag;
const TAG_TREE: TagTree = TagTree::Leaf(Self::TAG);
}
macro_rules! asn_type {
($($name:ty: $value:ident),+) => {
$(
impl AsnType for $name {
const TAG: Tag = Tag::$value;
}
)+
}
}
asn_type! {
bool: BOOL,
i8: INTEGER,
i16: INTEGER,
i32: INTEGER,
i64: INTEGER,
i128: INTEGER,
isize: INTEGER,
u8: INTEGER,
u16: INTEGER,
u32: INTEGER,
u64: INTEGER,
u128: INTEGER,
usize: INTEGER,
Integer: INTEGER,
OctetString: OCTET_STRING,
ObjectIdentifier: OBJECT_IDENTIFIER,
Oid: OBJECT_IDENTIFIER,
ConstOid: OBJECT_IDENTIFIER,
BitString: BIT_STRING,
Utf8String: UTF8_STRING,
UtcTime: UTC_TIME,
GeneralizedTime: GENERALIZED_TIME,
(): NULL,
&'_ str: UTF8_STRING
}
impl<T: AsnType> AsnType for Box<T> {
const TAG: Tag = T::TAG;
const TAG_TREE: TagTree = T::TAG_TREE;
}
impl<T: AsnType> AsnType for alloc::vec::Vec<T> {
const TAG: Tag = Tag::SEQUENCE;
}
impl<T: AsnType> AsnType for Option<T> {
const TAG: Tag = T::TAG;
const TAG_TREE: TagTree = T::TAG_TREE;
}
impl<T> AsnType for alloc::collections::BTreeSet<T> {
const TAG: Tag = Tag::SET;
}
impl<T: AsnType, const N: usize> AsnType for [T; N] {
const TAG: Tag = Tag::SEQUENCE;
}
impl<T> AsnType for &'_ [T] {
const TAG: Tag = Tag::SEQUENCE;
}
impl AsnType for Any {
const TAG: Tag = Tag::EOC;
const TAG_TREE: TagTree = TagTree::Choice(&[]);
}