|
| 1 | +using System; |
| 2 | +using System.Security.Cryptography; |
| 3 | +using Microsoft.VisualStudio.TestTools.UnitTesting; |
| 4 | +using SysadminsLV.Asn1Parser; |
| 5 | +using SysadminsLV.Asn1Parser.Universal; |
| 6 | + |
| 7 | +namespace Asn1Parser.Tests.Builder; |
| 8 | + |
| 9 | +[TestClass] |
| 10 | +public class Asn1BuilderTests { |
| 11 | + const String EXPECTED_ENCODED = """ |
| 12 | + MIIBGQEB/wEBAAIBBQMCBLADBAACAQEEAgECBAMCAQQFAAYIKwYBBQUHAwEKAQMM |
| 13 | + ClVURjhTdHJpbmcNAQUwBgIBAQIBAjADAgEFMQYCAQECAQIxAwIBBRIHNTU1IDU1 |
| 14 | + NRMPUHJpbnRhYmxlU3RyaW5nFA1UZWxldGV4U3RyaW5nFQ5WaWRlb3RleFN0cmlu |
| 15 | + ZxYJSUE1U3RyaW5nFw0yNTAxMDExODAwMDBaGA8yMDI1MDEwMTE4MDAwMFoaDVZp |
| 16 | + c2libGVTdHJpbmccPAAAAFUAAABuAAAAaQAAAHYAAABlAAAAcgAAAHMAAABhAAAA |
| 17 | + bAAAAFMAAAB0AAAAcgAAAGkAAABuAAAAZx4SAEIATQBQAFMAdAByAGkAbgBn |
| 18 | + """; |
| 19 | + static Asn1Builder BuildTestSimple() { |
| 20 | + return Asn1Builder.Create() |
| 21 | + .AddBoolean(true) |
| 22 | + .AddBoolean(false) |
| 23 | + .AddInteger(5) |
| 24 | + .AddBitString([0xb0], true) |
| 25 | + .AddBitString(builder => builder.AddInteger(1)) |
| 26 | + .AddOctetString(new Byte[] { 1, 2 }) |
| 27 | + .AddOctetString(builder => builder.AddInteger(4)) |
| 28 | + .AddNull() |
| 29 | + .AddObjectIdentifier(new Oid("1.3.6.1.5.5.7.3.1")) |
| 30 | + .AddEnumerated(3) |
| 31 | + .AddUTF8String("UTF8String") |
| 32 | + .AddRelativeOid(".5") |
| 33 | + .AddSequence(builder => builder.AddInteger(1).AddInteger(2)) |
| 34 | + .AddSequence(new Asn1Integer(5).GetRawDataAsMemory().Span) |
| 35 | + .AddSet(builder => builder.AddInteger(1).AddInteger(2)) |
| 36 | + .AddSet(new Asn1Integer(5).GetRawDataAsMemory().Span) |
| 37 | + .AddNumericString("555 555") |
| 38 | + .AddPrintableString("PrintableString") |
| 39 | + .AddTeletexString("TeletexString") |
| 40 | + .AddVideotexString("VideotexString") |
| 41 | + .AddIA5String("IA5String") |
| 42 | + .AddUtcTime(DateTime.Parse("2025-01-01 20:00:00")) |
| 43 | + .AddGeneralizedTime(DateTime.Parse("2025-01-01 20:00:00")) |
| 44 | + .AddVisibleString("VisibleString") |
| 45 | + .AddUniversalString("UniversalString") |
| 46 | + .AddBMPString("BMPString"); |
| 47 | + } |
| 48 | + |
| 49 | + [TestMethod] |
| 50 | + public void TestBuilderSimple() { |
| 51 | + Asn1Builder builder = BuildTestSimple(); |
| 52 | + ReadOnlyMemory<Byte> encoded = builder.GetEncodedAsMemory(); |
| 53 | + |
| 54 | + String base64 = Convert.ToBase64String(encoded.Span); |
| 55 | + Assert.AreEqual(EXPECTED_ENCODED.Replace("\r\n", null), base64.Replace("\r\n", null)); |
| 56 | + |
| 57 | + // read envelope |
| 58 | + var reader = new Asn1Reader(encoded); |
| 59 | + Assert.AreEqual(reader.Tag, 0x30); |
| 60 | + |
| 61 | + Asn1BuilderTestBase.AssertBoolean(reader, true); |
| 62 | + Asn1BuilderTestBase.AssertBoolean(reader, false); |
| 63 | + Asn1BuilderTestBase.AssertInteger(reader, 5); |
| 64 | + Asn1BuilderTestBase.AssertBitStringSimple(reader, [0xb0], 4); |
| 65 | + Asn1BuilderTestBase.AssertBitString(reader); |
| 66 | + Asn1Reader nestedReader = reader.GetReader(); |
| 67 | + Asn1BuilderTestBase.AssertInteger(nestedReader, 1); |
| 68 | + Asn1BuilderTestBase.AssertOctetString(reader, [1, 2], useSibling: true); |
| 69 | + Asn1BuilderTestBase.AssertOctetString(reader); |
| 70 | + nestedReader = reader.GetReader(); |
| 71 | + Asn1BuilderTestBase.AssertInteger(nestedReader, 4); |
| 72 | + Asn1BuilderTestBase.AssertNull(reader, useSibling: true); |
| 73 | + Asn1BuilderTestBase.AssertObjectIdentifier(reader, "1.3.6.1.5.5.7.3.1"); |
| 74 | + Asn1BuilderTestBase.AssertEnumerated(reader, 3); |
| 75 | + Asn1BuilderTestBase.AssertString(reader, Asn1Type.UTF8String, Asn1Type.UTF8String.ToString()); |
| 76 | + Asn1BuilderTestBase.AssertRelativeOid(reader, ".5"); |
| 77 | + Asn1BuilderTestBase.AssertSequence(reader); |
| 78 | + nestedReader = reader.GetReader(); |
| 79 | + Asn1BuilderTestBase.AssertInteger(nestedReader, 1); |
| 80 | + Asn1BuilderTestBase.AssertInteger(nestedReader, 2); |
| 81 | + Asn1BuilderTestBase.AssertSequence(reader, useSibling: true); |
| 82 | + nestedReader = reader.GetReader(); |
| 83 | + Asn1BuilderTestBase.AssertInteger(nestedReader, 5); |
| 84 | + Asn1BuilderTestBase.AssertSet(reader, useSibling: true); |
| 85 | + nestedReader = reader.GetReader(); |
| 86 | + Asn1BuilderTestBase.AssertInteger(nestedReader, 1); |
| 87 | + Asn1BuilderTestBase.AssertInteger(nestedReader, 2); |
| 88 | + Asn1BuilderTestBase.AssertSet(reader, useSibling: true); |
| 89 | + nestedReader = reader.GetReader(); |
| 90 | + Asn1BuilderTestBase.AssertInteger(nestedReader, 5); |
| 91 | + Asn1BuilderTestBase.AssertString(reader, Asn1Type.NumericString, "555 555", useSibling: true); |
| 92 | + Asn1BuilderTestBase.AssertString(reader, Asn1Type.PrintableString, Asn1Type.PrintableString.ToString()); |
| 93 | + Asn1BuilderTestBase.AssertString(reader, Asn1Type.TeletexString, Asn1Type.TeletexString.ToString()); |
| 94 | + Asn1BuilderTestBase.AssertString(reader, Asn1Type.VideotexString, Asn1Type.VideotexString.ToString()); |
| 95 | + Asn1BuilderTestBase.AssertString(reader, Asn1Type.IA5String, Asn1Type.IA5String.ToString()); |
| 96 | + Asn1BuilderTestBase.AssertDateTime(reader, DateTime.Parse("2025-01-01 20:00:00"), true); |
| 97 | + Asn1BuilderTestBase.AssertDateTime(reader, DateTime.Parse("2025-01-01 20:00:00"), false); |
| 98 | + Asn1BuilderTestBase.AssertString(reader, Asn1Type.VisibleString, Asn1Type.VisibleString.ToString()); |
| 99 | + Asn1BuilderTestBase.AssertString(reader, Asn1Type.UniversalString, Asn1Type.UniversalString.ToString()); |
| 100 | + Asn1BuilderTestBase.AssertString(reader, Asn1Type.BMPString, Asn1Type.BMPString.ToString()); |
| 101 | + } |
| 102 | +} |
0 commit comments