forked from librasn/rasn
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtypes.rs
115 lines (100 loc) · 3.09 KB
/
types.rs
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
//! # Types
//! The `types` modules is a collection of Rust types and data structures that
//! are defined to represent various ASN.1 data types, and renamed to use
//! ASN.1's terminology.
mod instance;
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::{
instance::InstanceOf,
oid::{ConstOid, ObjectIdentifier, Oid},
open::Open,
prefix::{Explicit, Implicit},
tag::{Class, Tag},
};
/// Alias for `bitvec::BitVec` mapped to ASN.1'a `BIT STRING`.
pub type BitString = bitvec::vec::BitVec<bitvec::order::Msb0, u8>;
/// `IA5String` string alias that matches BER's encoding rules.
pub type IA5String = Implicit<tag::IA5_STRING, Utf8String>;
/// `PrintableString` string alias that matches BER's encoding rules.
pub type PrintableString = Implicit<tag::PRINTABLE_STRING, Utf8String>;
/// `VisibleString` string alias that matches BER's encoding rules.
pub type VisibleString = Implicit<tag::VISIBLE_STRING, Utf8String>;
/// `String` alias that matches `BmpString` BER's encoding rules.
pub type BmpString = Implicit<tag::BMP_STRING, Utf8String>;
/// Alias to `Vec<T>`.
pub type SetOf<T> = alloc::collections::BTreeSet<T>;
/// `UniversalString` string alias that matches BER's encoding rules.
pub type UniversalString = Implicit<tag::UNIVERSAL_STRING, Utf8String>;
/// Alias for `chrono::DateTime<Utc>`.
pub type UtcTime = chrono::DateTime<chrono::Utc>;
/// Alias for `chrono::DateTime<FixedOffset>`.
pub type GeneralizedTime = chrono::DateTime<chrono::FixedOffset>;
/// A trait representing any type that can represented in ASN.1.
pub trait AsnType {
/// The associated tag for the type.
///
/// **Note** When implementing `CHOICE` types, this should be set to
/// `Tag::EOC` to represent that's invalid for use.
const TAG: 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;
}
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;
}
impl<T> AsnType for SetOf<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;
}