Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
Asn1Tag.cs
Go to the documentation of this file.
2
4
5public readonly struct Asn1Tag : IEquatable<Asn1Tag>
6{
7 private readonly byte _controlFlags;
8
9 internal static readonly Asn1Tag EndOfContents = new Asn1Tag((byte)0, 0);
10
11 public static readonly Asn1Tag Boolean = new Asn1Tag((byte)0, 1);
12
13 public static readonly Asn1Tag Integer = new Asn1Tag((byte)0, 2);
14
15 public static readonly Asn1Tag PrimitiveBitString = new Asn1Tag((byte)0, 3);
16
17 public static readonly Asn1Tag ConstructedBitString = new Asn1Tag(32, 3);
18
19 public static readonly Asn1Tag PrimitiveOctetString = new Asn1Tag((byte)0, 4);
20
21 public static readonly Asn1Tag ConstructedOctetString = new Asn1Tag(32, 4);
22
23 public static readonly Asn1Tag Null = new Asn1Tag((byte)0, 5);
24
25 public static readonly Asn1Tag ObjectIdentifier = new Asn1Tag((byte)0, 6);
26
27 public static readonly Asn1Tag Enumerated = new Asn1Tag((byte)0, 10);
28
29 public static readonly Asn1Tag Sequence = new Asn1Tag(32, 16);
30
31 public static readonly Asn1Tag SetOf = new Asn1Tag(32, 17);
32
33 public static readonly Asn1Tag UtcTime = new Asn1Tag((byte)0, 23);
34
35 public static readonly Asn1Tag GeneralizedTime = new Asn1Tag((byte)0, 24);
36
38
39 public bool IsConstructed => (_controlFlags & 0x20) != 0;
40
41 public int TagValue { get; }
42
43 private Asn1Tag(byte controlFlags, int tagValue)
44 {
45 _controlFlags = (byte)(controlFlags & 0xE0u);
46 TagValue = tagValue;
47 }
48
49 public Asn1Tag(UniversalTagNumber universalTagNumber, bool isConstructed = false)
50 : this((byte)(isConstructed ? 32 : 0), (int)universalTagNumber)
51 {
52 if (universalTagNumber < UniversalTagNumber.EndOfContents || universalTagNumber > UniversalTagNumber.RelativeObjectIdentifierIRI || universalTagNumber == (UniversalTagNumber)15)
53 {
54 throw new ArgumentOutOfRangeException("universalTagNumber");
55 }
56 }
57
58 public Asn1Tag(TagClass tagClass, int tagValue, bool isConstructed = false)
59 : this((byte)((byte)tagClass | (isConstructed ? 32u : 0u)), tagValue)
60 {
61 switch (tagClass)
62 {
63 default:
64 throw new ArgumentOutOfRangeException("tagClass");
65 case TagClass.Universal:
66 case TagClass.Application:
67 case TagClass.ContextSpecific:
68 case TagClass.Private:
69 if (tagValue < 0)
70 {
71 throw new ArgumentOutOfRangeException("tagValue");
72 }
73 break;
74 }
75 }
76
78 {
79 return new Asn1Tag((byte)(_controlFlags | 0x20u), TagValue);
80 }
81
83 {
84 return new Asn1Tag((byte)(_controlFlags & 0xFFFFFFDFu), TagValue);
85 }
86
87 public static bool TryDecode(ReadOnlySpan<byte> source, out Asn1Tag tag, out int bytesConsumed)
88 {
89 tag = default(Asn1Tag);
90 bytesConsumed = 0;
91 if (source.IsEmpty)
92 {
93 return false;
94 }
95 byte b = source[bytesConsumed];
96 bytesConsumed++;
97 uint num = b & 0x1Fu;
98 if (num == 31)
99 {
100 num = 0u;
101 byte b2;
102 do
103 {
104 if (source.Length <= bytesConsumed)
105 {
106 bytesConsumed = 0;
107 return false;
108 }
109 b2 = source[bytesConsumed];
110 byte b3 = (byte)(b2 & 0x7Fu);
111 bytesConsumed++;
112 if (num >= 33554432)
113 {
114 bytesConsumed = 0;
115 return false;
116 }
117 num <<= 7;
118 num |= b3;
119 if (num == 0)
120 {
121 bytesConsumed = 0;
122 return false;
123 }
124 }
125 while ((b2 & 0x80) == 128);
126 if (num <= 30)
127 {
128 bytesConsumed = 0;
129 return false;
130 }
131 if (num > int.MaxValue)
132 {
133 bytesConsumed = 0;
134 return false;
135 }
136 }
137 tag = new Asn1Tag(b, (int)num);
138 return true;
139 }
140
141 public static Asn1Tag Decode(ReadOnlySpan<byte> source, out int bytesConsumed)
142 {
143 if (TryDecode(source, out var tag, out bytesConsumed))
144 {
145 return tag;
146 }
148 }
149
151 {
152 if (TagValue < 31)
153 {
154 return 1;
155 }
156 if (TagValue <= 127)
157 {
158 return 2;
159 }
160 if (TagValue <= 16383)
161 {
162 return 3;
163 }
164 if (TagValue <= 2097151)
165 {
166 return 4;
167 }
168 if (TagValue <= 268435455)
169 {
170 return 5;
171 }
172 return 6;
173 }
174
175 public bool TryEncode(Span<byte> destination, out int bytesWritten)
176 {
177 int num = CalculateEncodedSize();
178 if (destination.Length < num)
179 {
180 bytesWritten = 0;
181 return false;
182 }
183 if (num == 1)
184 {
185 byte b = (byte)(_controlFlags | TagValue);
186 destination[0] = b;
187 bytesWritten = 1;
188 return true;
189 }
190 byte b2 = (byte)(_controlFlags | 0x1Fu);
191 destination[0] = b2;
192 int num2 = TagValue;
193 int num3 = num - 1;
194 while (num2 > 0)
195 {
196 int num4 = num2 & 0x7F;
197 if (num2 != TagValue)
198 {
199 num4 |= 0x80;
200 }
201 destination[num3] = (byte)num4;
202 num2 >>= 7;
203 num3--;
204 }
205 bytesWritten = num;
206 return true;
207 }
208
210 {
211 if (TryEncode(destination, out var bytesWritten))
212 {
213 return bytesWritten;
214 }
216 }
217
218 public bool Equals(Asn1Tag other)
219 {
220 if (_controlFlags == other._controlFlags)
221 {
222 return TagValue == other.TagValue;
223 }
224 return false;
225 }
226
227 public override bool Equals([NotNullWhen(true)] object? obj)
228 {
229 if (obj is Asn1Tag other)
230 {
231 return Equals(other);
232 }
233 return false;
234 }
235
236 public override int GetHashCode()
237 {
238 return (_controlFlags << 24) ^ TagValue;
239 }
240
241 public static bool operator ==(Asn1Tag left, Asn1Tag right)
242 {
243 return left.Equals(right);
244 }
245
246 public static bool operator !=(Asn1Tag left, Asn1Tag right)
247 {
248 return !left.Equals(right);
249 }
250
252 {
253 if (TagValue == other.TagValue)
254 {
255 return TagClass == other.TagClass;
256 }
257 return false;
258 }
259
260 public override string ToString()
261 {
262 string text = ((TagClass != 0) ? (TagClass.ToString() + "-" + TagValue) : ((UniversalTagNumber)TagValue).ToString());
263 if (IsConstructed)
264 {
265 return "Constructed " + text;
266 }
267 return text;
268 }
269}
static string Argument_DestinationTooShort
Definition SR.cs:14
static string ContentException_InvalidTag
Definition SR.cs:60
Definition SR.cs:7
static readonly Asn1Tag Integer
Definition Asn1Tag.cs:13
readonly byte _controlFlags
Definition Asn1Tag.cs:7
static readonly Asn1Tag Enumerated
Definition Asn1Tag.cs:27
static readonly Asn1Tag ConstructedBitString
Definition Asn1Tag.cs:17
static readonly Asn1Tag Sequence
Definition Asn1Tag.cs:29
Asn1Tag(byte controlFlags, int tagValue)
Definition Asn1Tag.cs:43
static readonly Asn1Tag ConstructedOctetString
Definition Asn1Tag.cs:21
Asn1Tag(TagClass tagClass, int tagValue, bool isConstructed=false)
Definition Asn1Tag.cs:58
static Asn1Tag Decode(ReadOnlySpan< byte > source, out int bytesConsumed)
Definition Asn1Tag.cs:141
static bool TryDecode(ReadOnlySpan< byte > source, out Asn1Tag tag, out int bytesConsumed)
Definition Asn1Tag.cs:87
static readonly Asn1Tag PrimitiveBitString
Definition Asn1Tag.cs:15
bool TryEncode(Span< byte > destination, out int bytesWritten)
Definition Asn1Tag.cs:175
static readonly Asn1Tag SetOf
Definition Asn1Tag.cs:31
int Encode(Span< byte > destination)
Definition Asn1Tag.cs:209
static readonly Asn1Tag UtcTime
Definition Asn1Tag.cs:33
static readonly Asn1Tag PrimitiveOctetString
Definition Asn1Tag.cs:19
static readonly Asn1Tag GeneralizedTime
Definition Asn1Tag.cs:35
override bool Equals([NotNullWhen(true)] object? obj)
Definition Asn1Tag.cs:227
static bool operator!=(Asn1Tag left, Asn1Tag right)
Definition Asn1Tag.cs:246
static readonly Asn1Tag ObjectIdentifier
Definition Asn1Tag.cs:25
Asn1Tag(UniversalTagNumber universalTagNumber, bool isConstructed=false)
Definition Asn1Tag.cs:49
static bool operator==(Asn1Tag left, Asn1Tag right)
Definition Asn1Tag.cs:241
override int GetHashCode()
Definition Asn1Tag.cs:236
override string ToString()
Definition Asn1Tag.cs:260
static readonly Asn1Tag EndOfContents
Definition Asn1Tag.cs:9
bool Equals(Asn1Tag other)
Definition Asn1Tag.cs:218
bool HasSameClassAndValue(Asn1Tag other)
Definition Asn1Tag.cs:251
static readonly Asn1Tag Null
Definition Asn1Tag.cs:23