Skip to content

Commit e1fea4d

Browse files
committed
syntax and formatting update, no functional changes
1 parent e3a42e9 commit e1fea4d

15 files changed

Lines changed: 185 additions & 244 deletions

Asn1Parser/Asn1Builder.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ public class Asn1Builder {
1616
readonly List<Byte> _rawData;
1717

1818
Asn1Builder() {
19-
_rawData = new List<Byte>();
19+
_rawData = [];
2020
}
2121

2222
Asn1Builder(Asn1Builder builder) {
23-
_rawData = new List<Byte>(builder._rawData);
23+
_rawData = [..builder._rawData];
2424
}
2525

2626
/// <summary>

Asn1Parser/Asn1Reader.cs

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -22,19 +22,15 @@ namespace SysadminsLV.Asn1Parser;
2222
/// </remarks>
2323
public class Asn1Reader {
2424
// a list of primitive tags. Source: http://en.wikipedia.org/wiki/Distinguished_Encoding_Rules#DER_encoding
25-
static readonly List<Byte> _excludedTags = new List<Byte>(
26-
new Byte[] { 0, 1, 2, 5, 6, 9, 10, 13 }
27-
);
28-
readonly List<Byte> _rawData = new List<Byte>();
29-
readonly Dictionary<Int64, AsnInternalMap> _offsetMap = new Dictionary<Int64, AsnInternalMap>();
30-
readonly List<Byte> _multiNestedTypes = new List<Byte>(
31-
new[] {
25+
static readonly List<Byte> _excludedTags = [ 0, 1, 2, 5, 6, 9, 10, 13 ];
26+
readonly List<Byte> _rawData = [];
27+
readonly Dictionary<Int64, AsnInternalMap> _offsetMap = [];
28+
readonly List<Byte> _multiNestedTypes = [
3229
(Byte)Asn1Type.SEQUENCE,
33-
(Byte)((Byte)Asn1Type.SEQUENCE | (Byte)Asn1Class.CONSTRUCTED),
30+
(Byte)Asn1Type.SEQUENCE | (Byte)Asn1Class.CONSTRUCTED,
3431
(Byte)Asn1Type.SET,
35-
(Byte)((Byte)Asn1Type.SET | (Byte)Asn1Class.CONSTRUCTED)
36-
}
37-
);
32+
(Byte)Asn1Type.SET | (Byte)Asn1Class.CONSTRUCTED
33+
];
3834
AsnInternalMap currentPosition;
3935
Int32 childCount;
4036

@@ -64,9 +60,13 @@ public Asn1Reader(Asn1Reader asn) : this(asn.GetTagRawData()) { }
6460
public Asn1Reader(Byte[] rawData) : this(rawData, 0) { }
6561

6662
Asn1Reader(Byte[] rawData, Int32 offset) {
67-
if (rawData == null) { throw new ArgumentNullException(nameof(rawData)); }
68-
if (rawData.Length < 2) { throw new Win32Exception(ErrorCode.InvalidDataException); }
69-
currentPosition = new AsnInternalMap();
63+
if (rawData == null) {
64+
throw new ArgumentNullException(nameof(rawData));
65+
}
66+
if (rawData.Length < 2) {
67+
throw new Win32Exception(ErrorCode.InvalidDataException);
68+
}
69+
currentPosition = new AsnInternalMap(0, 0);
7070
_offsetMap.Add(0, currentPosition);
7171
decode(rawData, offset);
7272
}
@@ -250,7 +250,7 @@ Boolean predict(Int64 start, Int32 projectedLength, Boolean assignMap, out Int32
250250
Int64 pl = calculatePredictLength(start);
251251
sum += pl;
252252
if (assignMap && sum <= projectedLength) {
253-
_offsetMap.Add(start, new AsnInternalMap { LevelStart = levelStart, LevelEnd = projectedLength });
253+
_offsetMap.Add(start, new AsnInternalMap(levelStart, projectedLength));
254254
}
255255
start += pl;
256256
estimatedChildCount++;
@@ -303,12 +303,16 @@ Int64 calculatePredictLength(Int64 offset) {
303303
return pPayloadLength + lengthBytes + 2;
304304
}
305305
void moveAndExpectTypes(Func<Boolean> action, params Byte[] expectedTypes) {
306-
if (expectedTypes == null) { throw new ArgumentNullException(nameof(expectedTypes)); }
306+
if (expectedTypes == null) {
307+
throw new ArgumentNullException(nameof(expectedTypes));
308+
}
307309
var set = new HashSet<Byte>();
308310
foreach (Byte tag in expectedTypes) {
309311
set.Add(tag);
310312
}
311-
if (!action.Invoke()) { throw new InvalidDataException("The data is invalid."); }
313+
if (!action.Invoke()) {
314+
throw new InvalidDataException("The data is invalid.");
315+
}
312316

313317
if (!set.Contains(Tag)) {
314318
throw new Asn1InvalidTagException();
@@ -383,7 +387,9 @@ public Int32 GetNestedNodeCount() {
383387
/// <strong>False</strong>
384388
/// </returns>
385389
public Boolean MoveNext() {
386-
if (NextOffset == 0) { return false; }
390+
if (NextOffset == 0) {
391+
return false;
392+
}
387393
currentPosition = _offsetMap[NextOffset];
388394
decode(null, NextOffset);
389395
return true;
@@ -441,7 +447,9 @@ public void MoveNextAndExpectTags(params Asn1Type[] expectedTags) {
441447
/// level), otherwise <strong>False</strong>.
442448
/// </returns>
443449
public Boolean MoveNextSibling() {
444-
if (NextSiblingOffset == 0) { return false; }
450+
if (NextSiblingOffset == 0) {
451+
return false;
452+
}
445453
currentPosition = _offsetMap[NextSiblingOffset];
446454
decode(null, NextSiblingOffset);
447455
return true;
@@ -507,10 +515,10 @@ public Boolean Seek(Int32 newPosition) {
507515
if (_offsetMap == null) {
508516
throw new InvalidOperationException();
509517
}
510-
if (!_offsetMap.ContainsKey(newPosition)) {
518+
if (!_offsetMap.TryGetValue(newPosition, out AsnInternalMap value)) {
511519
return false;
512520
}
513-
currentPosition = _offsetMap[newPosition];
521+
currentPosition = value;
514522
decode(null, newPosition);
515523
return true;
516524
}
@@ -592,8 +600,8 @@ public static String GetTagName(Byte tag) {
592600
return ((Asn1Type)index).ToString();
593601
}
594602

595-
class AsnInternalMap {
596-
public Int64 LevelStart { get; set; }
597-
public Int64 LevelEnd { get; set; }
603+
record AsnInternalMap(Int64 LevelStart, Int64 LevelEnd) {
604+
public Int64 LevelStart { get; } = LevelStart;
605+
public Int64 LevelEnd { get; } = LevelEnd;
598606
}
599607
}

Asn1Parser/Asn1Utils.cs

Lines changed: 33 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public static class Asn1Utils {
1616
/// <returns>Encoded tag length header. Return value do not contain tag and payload.</returns>
1717
public static Byte[] GetLengthBytes(Int32 payloadLength) {
1818
if (payloadLength < 128) {
19-
return new[] { (Byte)payloadLength };
19+
return [(Byte)payloadLength];
2020
}
2121
Byte[] lenBytes = new Byte[4];
2222
Int32 num = payloadLength;
@@ -49,9 +49,15 @@ public static Byte[] GetLengthBytes(Int32 payloadLength) {
4949
/// </exception>
5050
/// <returns>ASN.1 payload length in bytes.</returns>
5151
public static Int64 CalculatePayloadLength(Byte[] asnHeader) {
52-
if (asnHeader == null) { throw new ArgumentNullException(nameof(asnHeader)); }
53-
if (asnHeader.Length == 0) { return 0; }
54-
if (asnHeader[0] < 127) { return asnHeader[0]; }
52+
if (asnHeader == null) {
53+
throw new ArgumentNullException(nameof(asnHeader));
54+
}
55+
if (asnHeader.Length == 0) {
56+
return 0;
57+
}
58+
if (asnHeader[0] < 127) {
59+
return asnHeader[0];
60+
}
5561
Int32 lengthBytes = asnHeader[0] - 128;
5662
// max length can be encoded by using 4 bytes.
5763
if (lengthBytes > 4 || asnHeader.Length < 1 + lengthBytes) {
@@ -73,7 +79,7 @@ public static Int64 CalculatePayloadLength(Byte[] asnHeader) {
7379
/// <remarks>If <strong>rawData</strong> is null, an empty tag is encoded.</remarks>
7480
public static Byte[] Encode(Byte[] rawData, Byte enclosingTag) {
7581
if (rawData == null) {
76-
return new Byte[] { enclosingTag, 0 };
82+
return [enclosingTag, 0];
7783
}
7884
Byte[] retValue;
7985
if (rawData.Length < 128) {
@@ -120,35 +126,28 @@ public static Byte[] Encode(Byte[] rawData, Asn1Type type) {
120126
#region internal
121127
public static String GetViewValue(Asn1Reader asn) {
122128
if (asn.PayloadLength == 0 && asn.Tag != (Byte)Asn1Type.NULL) { return "NULL"; }
123-
switch (asn.Tag) {
124-
case (Byte)Asn1Type.BOOLEAN:
125-
return new Asn1Boolean(asn).Value.ToString();
126-
case (Byte)Asn1Type.INTEGER:
127-
return new Asn1Integer(asn).Value.ToString();
128-
case (Byte)Asn1Type.BIT_STRING: return decodeBitString(asn);
129-
case (Byte)Asn1Type.OCTET_STRING: return decodeOctetString(asn);
130-
case (Byte)Asn1Type.NULL: return null;
131-
case (Byte)Asn1Type.OBJECT_IDENTIFIER:
132-
return new Asn1ObjectIdentifier(asn).GetDisplayValue();
133-
case (Byte)Asn1Type.UTF8String:
134-
return new Asn1UTF8String(asn).Value;
135-
case (Byte)Asn1Type.NumericString:
136-
case (Byte)Asn1Type.PrintableString:
137-
case (Byte)Asn1Type.TeletexString:
138-
case (Byte)Asn1Type.VideotexString:
139-
case (Byte)Asn1Type.IA5String:
140-
return decodeAsciiString(asn);
141-
case (Byte)Asn1Type.UTCTime:
142-
return decodeUtcTime(asn);
143-
case (Byte)Asn1Type.BMPString:
144-
return new Asn1BMPString(asn).Value;
145-
case (Byte)Asn1Type.GeneralizedTime:
146-
return decodeGeneralizedTime(asn);
147-
default:
148-
return (asn.Tag & (Byte)Asn1Type.TAG_MASK) == 6
149-
? new Asn1UTF8String(asn).Value
150-
: decodeOctetString(asn);
151-
}
129+
130+
return asn.Tag switch {
131+
132+
(Byte)Asn1Type.BOOLEAN => new Asn1Boolean(asn).Value.ToString(),
133+
(Byte)Asn1Type.INTEGER => new Asn1Integer(asn).Value.ToString(),
134+
(Byte)Asn1Type.BIT_STRING => decodeBitString(asn),
135+
(Byte)Asn1Type.OCTET_STRING => decodeOctetString(asn),
136+
(Byte)Asn1Type.NULL => null,
137+
(Byte)Asn1Type.OBJECT_IDENTIFIER => new Asn1ObjectIdentifier(asn).GetDisplayValue(),
138+
(Byte)Asn1Type.UTF8String => new Asn1UTF8String(asn).Value,
139+
(Byte)Asn1Type.NumericString
140+
or (Byte)Asn1Type.PrintableString
141+
or (Byte)Asn1Type.TeletexString
142+
or (Byte)Asn1Type.VideotexString
143+
or (Byte)Asn1Type.IA5String => decodeAsciiString(asn),
144+
(Byte)Asn1Type.UTCTime => decodeUtcTime(asn),
145+
(Byte)Asn1Type.BMPString => new Asn1BMPString(asn).Value,
146+
(Byte)Asn1Type.GeneralizedTime => decodeGeneralizedTime(asn),
147+
_ => (asn.Tag & (Byte)Asn1Type.TAG_MASK) == 6
148+
? new Asn1UTF8String(asn).Value
149+
: decodeOctetString(asn)
150+
};
152151
}
153152
static String decodeBitString(Asn1Reader asn) {
154153
return String.Format(

Asn1Parser/AsnFormatter.cs

Lines changed: 34 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -44,22 +44,16 @@ public static String BinaryToString(Byte[] rawData, EncodingType encoding = Enco
4444
if (PemHeader.ContainsEncoding(encoding)) {
4545
return BinaryToStringFormatter.ToBase64(rawData, encoding, format, start, count);
4646
}
47-
switch (encoding) {
48-
case EncodingType.Base64:
49-
return BinaryToStringFormatter.ToBase64(rawData, encoding, format, start, count);
50-
case EncodingType.Hex:
51-
return BinaryToStringFormatter.ToHex(rawData, format, start, count, forceUpperCase);
52-
case EncodingType.HexAddress:
53-
return BinaryToStringFormatter.ToHexAddress(rawData, format, start, count, forceUpperCase);
54-
case EncodingType.HexAscii:
55-
return BinaryToStringFormatter.ToHexAscii(rawData, format, start, count, forceUpperCase);
56-
case EncodingType.HexAsciiAddress:
57-
return BinaryToStringFormatter.ToHexAddressAndAscii(rawData, format, start, count, forceUpperCase);
58-
case EncodingType.HexRaw:
59-
return BinaryToStringFormatter.ToHexRaw(rawData, start, count, forceUpperCase);
60-
default:
61-
throw new ArgumentException("Specified encoding is invalid.");
62-
}
47+
48+
return encoding switch {
49+
EncodingType.Base64 => BinaryToStringFormatter.ToBase64(rawData, encoding, format, start, count),
50+
EncodingType.Hex => BinaryToStringFormatter.ToHex(rawData, format, start, count, forceUpperCase),
51+
EncodingType.HexAddress => BinaryToStringFormatter.ToHexAddress(rawData, format, start, count, forceUpperCase),
52+
EncodingType.HexAscii => BinaryToStringFormatter.ToHexAscii(rawData, format, start, count, forceUpperCase),
53+
EncodingType.HexAsciiAddress => BinaryToStringFormatter.ToHexAddressAndAscii(rawData, format, start, count, forceUpperCase),
54+
EncodingType.HexRaw => BinaryToStringFormatter.ToHexRaw(rawData, start, count, forceUpperCase),
55+
_ => throw new ArgumentException("Specified encoding is invalid.")
56+
};
6357
}
6458
/// <summary>
6559
/// Converts and formats current position af the <see cref="Asn1Reader"/> object.
@@ -102,22 +96,16 @@ public static String BinaryToString(Asn1Reader asn, EncodingType encoding = Enco
10296
if (PemHeader.ContainsEncoding(encoding)) {
10397
return BinaryToStringFormatter.ToBase64(asn.GetRawData(), encoding, format, asn.PayloadStartOffset, asn.PayloadLength);
10498
}
105-
switch (encoding) {
106-
case EncodingType.Base64:
107-
return BinaryToStringFormatter.ToBase64(asn.GetRawData(), encoding, format, asn.PayloadStartOffset, asn.PayloadLength);
108-
case EncodingType.Hex:
109-
return BinaryToStringFormatter.ToHex(asn.GetRawData(), format, asn.PayloadStartOffset, asn.PayloadLength, forceUpperCase);
110-
case EncodingType.HexAddress:
111-
return BinaryToStringFormatter.ToHexAddress(asn.GetRawData(), format, asn.PayloadStartOffset, asn.PayloadLength, forceUpperCase);
112-
case EncodingType.HexAscii:
113-
return BinaryToStringFormatter.ToHexAscii(asn.GetRawData(), format, asn.PayloadStartOffset, asn.PayloadLength, forceUpperCase);
114-
case EncodingType.HexAsciiAddress:
115-
return BinaryToStringFormatter.ToHexAddressAndAscii(asn.GetRawData(), format, asn.PayloadStartOffset, asn.PayloadLength, forceUpperCase);
116-
case EncodingType.HexRaw:
117-
return BinaryToStringFormatter.ToHexRaw(asn.GetRawData(), asn.PayloadStartOffset, asn.PayloadLength, forceUpperCase);
118-
default:
119-
throw new ArgumentException("Specified encoding is invalid.");
120-
}
99+
100+
return encoding switch {
101+
EncodingType.Base64 => BinaryToStringFormatter.ToBase64(asn.GetRawData(), encoding, format, asn.PayloadStartOffset, asn.PayloadLength),
102+
EncodingType.Hex => BinaryToStringFormatter.ToHex(asn.GetRawData(), format, asn.PayloadStartOffset, asn.PayloadLength, forceUpperCase),
103+
EncodingType.HexAddress => BinaryToStringFormatter.ToHexAddress(asn.GetRawData(), format, asn.PayloadStartOffset, asn.PayloadLength, forceUpperCase),
104+
EncodingType.HexAscii => BinaryToStringFormatter.ToHexAscii(asn.GetRawData(), format, asn.PayloadStartOffset, asn.PayloadLength, forceUpperCase),
105+
EncodingType.HexAsciiAddress => BinaryToStringFormatter.ToHexAddressAndAscii(asn.GetRawData(), format, asn.PayloadStartOffset, asn.PayloadLength, forceUpperCase),
106+
EncodingType.HexRaw => BinaryToStringFormatter.ToHexRaw(asn.GetRawData(), asn.PayloadStartOffset, asn.PayloadLength, forceUpperCase),
107+
_ => throw new ArgumentException("Specified encoding is invalid.")
108+
};
121109
}
122110
/// <summary>
123111
/// Converts previously formatted string back to a byte array.
@@ -142,38 +130,20 @@ public static Byte[] StringToBinary(String input, EncodingType encoding = Encodi
142130
var pemHeader = PemHeader.GetHeader(encoding);
143131
rawData = StringToBinaryFormatter.FromBase64Header(input, pemHeader.GetHeader(), pemHeader.GetFooter());
144132
} else {
145-
switch (encoding) {
146-
case EncodingType.Binary:
147-
rawData = StringToBinaryFormatter.FromBinary(input);
148-
break;
149-
case EncodingType.Base64:
150-
rawData = StringToBinaryFormatter.FromBase64(input);
151-
break;
152-
case EncodingType.Base64Any:
153-
rawData = StringToBinaryFormatter.FromBase64Any(input);
154-
break;
155-
case EncodingType.StringAny:
156-
rawData = StringToBinaryFormatter.FromStringAny(input);
157-
break;
158-
case EncodingType.Hex:
159-
case EncodingType.HexRaw:
160-
rawData = StringToBinaryFormatter.FromHex(input);
161-
break;
162-
case EncodingType.HexAddress:
163-
rawData = StringToBinaryFormatter.FromHexAddr(input);
164-
break;
165-
case EncodingType.HexAscii:
166-
rawData = StringToBinaryFormatter.FromHexAscii(input);
167-
break;
168-
case EncodingType.HexAsciiAddress:
169-
rawData = StringToBinaryFormatter.FromHexAddrAscii(input);
170-
break;
171-
case EncodingType.HexAny:
172-
rawData = StringToBinaryFormatter.FromHexAny(input);
173-
break;
174-
default:
175-
throw new ArgumentException("Invalid encoding type is specified.");
176-
}
133+
rawData = encoding switch {
134+
135+
EncodingType.Binary => StringToBinaryFormatter.FromBinary(input),
136+
EncodingType.Base64 => StringToBinaryFormatter.FromBase64(input),
137+
EncodingType.Base64Any => StringToBinaryFormatter.FromBase64Any(input),
138+
EncodingType.StringAny => StringToBinaryFormatter.FromStringAny(input),
139+
EncodingType.Hex
140+
or EncodingType.HexRaw => StringToBinaryFormatter.FromHex(input),
141+
EncodingType.HexAddress => StringToBinaryFormatter.FromHexAddr(input),
142+
EncodingType.HexAscii => StringToBinaryFormatter.FromHexAscii(input),
143+
EncodingType.HexAsciiAddress => StringToBinaryFormatter.FromHexAddrAscii(input),
144+
EncodingType.HexAny => StringToBinaryFormatter.FromHexAny(input),
145+
_ => throw new ArgumentException("Invalid encoding type is specified.")
146+
};
177147
}
178148

179149

0 commit comments

Comments
 (0)