Skip to content

Commit c22f0f2

Browse files
committed
Update static ASN1 and add tests
1 parent 92d5a09 commit c22f0f2

File tree

2 files changed

+89
-4
lines changed

2 files changed

+89
-4
lines changed
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
using System;
2+
using System.IO;
3+
using Xunit;
4+
5+
namespace SabreTools.ASN1.Test
6+
{
7+
public class AbstractSyntaxNotationOneTests
8+
{
9+
[Fact]
10+
public void Parse_EmptyArray_Throws()
11+
{
12+
byte[] data = [];
13+
Assert.Throws<InvalidDataException>(() => AbstractSyntaxNotationOne.Parse(data, 0));
14+
}
15+
16+
[Fact]
17+
public void Parse_ValidArrayNegativeIndex_Throws()
18+
{
19+
byte[] data = [0x00];
20+
Assert.Throws<IndexOutOfRangeException>(() => AbstractSyntaxNotationOne.Parse(data, -1));
21+
}
22+
23+
[Fact]
24+
public void Parse_ValidArrayOverIndex_Throws()
25+
{
26+
byte[] data = [0x00];
27+
Assert.Throws<IndexOutOfRangeException>(() => AbstractSyntaxNotationOne.Parse(data, 10));
28+
}
29+
30+
[Fact]
31+
public void Parse_ValidMinimalArray()
32+
{
33+
byte[] data = [0x00];
34+
var tlvs = AbstractSyntaxNotationOne.Parse(data, 0);
35+
36+
var tlv = Assert.Single(tlvs);
37+
Assert.Equal(ASN1Type.V_ASN1_EOC, tlv.Type);
38+
Assert.Equal(default, tlv.Length);
39+
Assert.Null(tlv.Value);
40+
}
41+
42+
[Fact]
43+
public void Parse_EmptyStream_Throws()
44+
{
45+
Stream data = new MemoryStream([], 0, 0, false, false);
46+
Assert.Throws<InvalidDataException>(() => AbstractSyntaxNotationOne.Parse(data));
47+
}
48+
49+
[Fact]
50+
public void Parse_ValidMinimalStream()
51+
{
52+
Stream data = new MemoryStream([0x00]);
53+
var tlvs = AbstractSyntaxNotationOne.Parse(data);
54+
55+
var tlv = Assert.Single(tlvs);
56+
Assert.Equal(ASN1Type.V_ASN1_EOC, tlv.Type);
57+
Assert.Equal(default, tlv.Length);
58+
Assert.Null(tlv.Value);
59+
}
60+
}
61+
}

SabreTools.ASN1/AbstractSyntaxNotationOne.cs

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
using System.Collections.Generic;
1+
using System;
2+
using System.Collections.Generic;
3+
using System.IO;
24

35
namespace SabreTools.ASN1
46
{
@@ -12,16 +14,38 @@ public static class AbstractSyntaxNotationOne
1214
/// </summary>
1315
/// <param name="data">Byte array representing the data</param>
1416
/// <param name="pointer">Current pointer into the data</param>
15-
/// <returns></returns>
1617
public static List<TypeLengthValue> Parse(byte[] data, int pointer)
1718
{
19+
// If the data is invalid
20+
if (data.Length == 0)
21+
throw new InvalidDataException(nameof(data));
22+
if (pointer < 0 || pointer >= data.Length)
23+
throw new IndexOutOfRangeException(nameof(pointer));
24+
25+
using var stream = new MemoryStream(data);
26+
stream.Seek(pointer, SeekOrigin.Begin);
27+
return Parse(stream);
28+
}
29+
30+
/// <summary>
31+
/// Parse a stream into a DER-encoded ASN.1 structure
32+
/// </summary>
33+
/// <param name="data">Stream representing the data</param>
34+
public static List<TypeLengthValue> Parse(Stream data)
35+
{
36+
// If the data is invalid
37+
if (data.Length == 0 || !data.CanRead)
38+
throw new InvalidDataException(nameof(data));
39+
if (data.Position < 0 || data.Position >= data.Length)
40+
throw new IndexOutOfRangeException(nameof(data));
41+
1842
// Create the output list to return
1943
var topLevelValues = new List<TypeLengthValue>();
2044

2145
// Loop through the data and return all top-level values
22-
while (pointer < data.Length)
46+
while (data.Position < data.Length)
2347
{
24-
var topLevelValue = new TypeLengthValue(data, ref pointer);
48+
var topLevelValue = new TypeLengthValue(data);
2549
topLevelValues.Add(topLevelValue);
2650
}
2751

0 commit comments

Comments
 (0)