Skip to content

Commit b0a11e1

Browse files
committed
asn-compiler: Getting started with Tags resolution
Added `Asn1ResolvedTag` to a base type as an `Option`. In the 'resolve' value of each ingeger etc, we'll be resolving the actual tag if present (or the module level support suggests `IMPLICIT/EXPLICIT` tags etc. Right now just basic structure definitions etc.
1 parent 2d09588 commit b0a11e1

File tree

4 files changed

+40
-11
lines changed

4 files changed

+40
-11
lines changed

asn-compiler/src/parser/asn/structs/types/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,8 +147,9 @@ pub(crate) enum Asn1TagMode {
147147
Implicit,
148148
}
149149

150-
#[derive(Debug, Clone)]
150+
#[derive(Debug, Clone, Default)]
151151
pub(crate) enum Asn1TagClass {
152+
#[default]
152153
Universal,
153154
Application,
154155
ContextSpecific,

asn-compiler/src/resolver/asn/structs/types/base.rs

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//! Structs for the resolved Base Types
22
use std::collections::{BTreeSet, HashMap};
33

4-
use crate::resolver::asn::structs::types::constraints::Asn1ConstraintValueSet;
4+
use crate::resolver::asn::structs::types::{constraints::Asn1ConstraintValueSet, Asn1ResolvedTag};
55

66
#[derive(Debug, Clone)]
77
pub(crate) enum ResolvedBaseType {
@@ -26,6 +26,7 @@ pub(crate) struct Asn1ResolvedInteger {
2626
pub(crate) signed: bool,
2727
pub(crate) resolved_constraints: Option<Asn1ConstraintValueSet>,
2828
pub(crate) named_values: Option<HashMap<String, i128>>,
29+
pub(crate) tag: Option<Asn1ResolvedTag>,
2930
}
3031

3132
impl Default for Asn1ResolvedInteger {
@@ -35,6 +36,7 @@ impl Default for Asn1ResolvedInteger {
3536
signed: true,
3637
named_values: None,
3738
resolved_constraints: None,
39+
tag: None,
3840
}
3941
}
4042
}
@@ -49,6 +51,7 @@ pub(crate) struct Asn1ResolvedEnumerated {
4951
pub(crate) excepts: Option<BTreeSet<i128>>,
5052
pub(crate) named_root_values: Vec<(String, i128)>,
5153
pub(crate) named_ext_values: Vec<(String, i128)>,
54+
pub(crate) tag: Option<Asn1ResolvedTag>,
5255
}
5356

5457
impl Default for Asn1ResolvedEnumerated {
@@ -62,6 +65,7 @@ impl Default for Asn1ResolvedEnumerated {
6265
excepts: None,
6366
named_root_values: vec![],
6467
named_ext_values: vec![],
68+
tag: None,
6569
}
6670
}
6771
}
@@ -74,33 +78,45 @@ pub(crate) struct Asn1ResolvedBitString {
7478

7579
// We support only up to 128 named bits, if more than that is required, change this to appropriate. value
7680
pub(crate) named_values: HashMap<String, u8>,
81+
82+
pub(crate) tag: Option<Asn1ResolvedTag>,
7783
}
7884

7985
// Just an empty structure for Resolved `BOOLEAN` type.
8086
#[derive(Debug, Default, Clone)]
81-
pub(crate) struct Asn1ResolvedBoolean;
87+
pub(crate) struct Asn1ResolvedBoolean {
88+
pub(crate) tag: Option<Asn1ResolvedTag>,
89+
}
8290

8391
// Just an empty structure for Resolved `NULL` type.
8492
#[derive(Debug, Default, Clone)]
85-
pub(crate) struct Asn1ResolvedNull;
93+
pub(crate) struct Asn1ResolvedNull {
94+
pub(crate) tag: Option<Asn1ResolvedTag>,
95+
}
8696

87-
// Just an empty structure for Resolved `NULL` type.
97+
// Just an empty structure for Resolved `REAL` type.
8898
#[derive(Debug, Default, Clone)]
89-
pub(crate) struct Asn1ResolvedReal;
99+
pub(crate) struct Asn1ResolvedReal {
100+
pub(crate) tag: Option<Asn1ResolvedTag>,
101+
}
90102

91103
// A structure representing a Resolved `OCTET STRING`. `SIZE` Constraint is resolved as well. The
92104
// `CONTAINING` Constraint is not resolved.
93105
#[derive(Debug, Default, Clone)]
94106
pub(crate) struct Asn1ResolvedOctetString {
95107
pub(crate) size: Option<Asn1ConstraintValueSet>,
108+
pub(crate) tag: Option<Asn1ResolvedTag>,
96109
}
97110

98111
// A structure representing a Resolved `CharacterString`. `SIZE` Constraint is resolved as well. The
99112
#[derive(Debug, Default, Clone)]
100113
pub(crate) struct Asn1ResolvedCharacterString {
101114
pub(crate) str_type: String,
102115
pub(crate) size: Option<Asn1ConstraintValueSet>,
116+
pub(crate) tag: Option<Asn1ResolvedTag>,
103117
}
104118

105119
#[derive(Debug, Default, Clone)]
106-
pub(crate) struct Asn1ResolvedObjectIdentifier;
120+
pub(crate) struct Asn1ResolvedObjectIdentifier {
121+
pub(crate) tag: Asn1ResolvedTag,
122+
}

asn-compiler/src/resolver/asn/structs/types/mod.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
use std::collections::BTreeMap;
22

3+
use crate::parser::asn::structs::types::Asn1TagClass;
4+
35
pub(crate) mod constructed;
46
use constructed::ResolvedConstructedType;
57

@@ -32,3 +34,11 @@ pub(crate) enum Asn1ResolvedType {
3234
// A Set of Resolved Types. This is true if the type is obtained from Object Sets or Value Sets
3335
Set(ResolvedSetType),
3436
}
37+
38+
// When tags are to be supported, an instance of this class will be available for each of the
39+
// 'resolved' type.
40+
#[derive(Debug, Clone, Default)]
41+
pub(crate) struct Asn1ResolvedTag {
42+
num: u32,
43+
class: Asn1TagClass,
44+
}

asn-compiler/src/resolver/asn/types/base/mod.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,18 +38,20 @@ pub(crate) fn resolve_base_type(
3838
Asn1BuiltinType::BitString(ref b) => Ok(ResolvedBaseType::BitString(
3939
Asn1ResolvedBitString::resolve_bit_string(ty, b, resolver)?,
4040
)),
41-
Asn1BuiltinType::Boolean => Ok(ResolvedBaseType::Boolean(Asn1ResolvedBoolean)),
41+
Asn1BuiltinType::Boolean => {
42+
Ok(ResolvedBaseType::Boolean(Asn1ResolvedBoolean::default()))
43+
}
4244
Asn1BuiltinType::OctetString => Ok(ResolvedBaseType::OctetString(
4345
Asn1ResolvedOctetString::resolve_octet_string(ty, resolver)?,
4446
)),
4547
Asn1BuiltinType::CharacterString { .. } => Ok(ResolvedBaseType::CharacterString(
4648
Asn1ResolvedCharacterString::resolve_character_string(ty, resolver)?,
4749
)),
4850
Asn1BuiltinType::ObjectIdentifier => Ok(ResolvedBaseType::ObjectIdentifier(
49-
Asn1ResolvedObjectIdentifier,
51+
Asn1ResolvedObjectIdentifier::default(),
5052
)),
51-
Asn1BuiltinType::Null => Ok(ResolvedBaseType::Null(Asn1ResolvedNull)),
52-
Asn1BuiltinType::Real => Ok(ResolvedBaseType::Real(Asn1ResolvedReal)),
53+
Asn1BuiltinType::Null => Ok(ResolvedBaseType::Null(Asn1ResolvedNull::default())),
54+
Asn1BuiltinType::Real => Ok(ResolvedBaseType::Real(Asn1ResolvedReal::default())),
5355
_ => Err(resolve_error!(
5456
"parse_base_type: Not Implemented! {:#?}",
5557
ty

0 commit comments

Comments
 (0)