diff --git a/BurnOutSharp.ASN1/AbstractSyntaxNotationOne.cs b/BurnOutSharp.ASN1/AbstractSyntaxNotationOne.cs new file mode 100644 index 00000000..e14eac95 --- /dev/null +++ b/BurnOutSharp.ASN1/AbstractSyntaxNotationOne.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; + +namespace BurnOutSharp.ASN1 +{ + /// + /// ASN.1 Parser + /// + public static class AbstractSyntaxNotationOne + { + /// + /// Parse a byte array into a DER-encoded ASN.1 structure + /// + /// Byte array representing the data + /// Current pointer into the data + /// + public static List Parse(byte[] data, int pointer) + { + // Create the output list to return + var topLevelValues = new List(); + + // Loop through the data and return all top-level values + while (pointer < data.Length) + { + var topLevelValue = new TypeLengthValue(data, ref pointer); + topLevelValues.Add(topLevelValue); + } + + return topLevelValues; + } + } +} diff --git a/BurnOutSharp.ASN1/BurnOutSharp.ASN1.csproj b/BurnOutSharp.ASN1/BurnOutSharp.ASN1.csproj new file mode 100644 index 00000000..3d3cba88 --- /dev/null +++ b/BurnOutSharp.ASN1/BurnOutSharp.ASN1.csproj @@ -0,0 +1,26 @@ + + + + netstandard2.0;net6.0 + BurnOutSharp.ASN1 + BurnOutSharp.ASN1 + Matt Nadareski + BurnOutSharp + Copyright (c)2022 Matt Nadareski + https://github.com/mnadareski/BurnOutSharp + 2.5 + 2.5 + 2.5 + true + true + + + + true + + + + + + + diff --git a/BurnOutSharp.ASN1/Enums.cs b/BurnOutSharp.ASN1/Enums.cs new file mode 100644 index 00000000..3612f8c6 --- /dev/null +++ b/BurnOutSharp.ASN1/Enums.cs @@ -0,0 +1,55 @@ +using System; + +namespace BurnOutSharp.ASN1 +{ + /// + /// ASN.1 type indicators + /// + [Flags] + public enum ASN1Type : byte + { + #region Modifiers + + V_ASN1_UNIVERSAL = 0x00, + V_ASN1_PRIMITIVE_TAG = 0x1F, + V_ASN1_CONSTRUCTED = 0x20, + V_ASN1_APPLICATION = 0x40, + V_ASN1_CONTEXT_SPECIFIC = 0x80, + V_ASN1_PRIVATE = 0xC0, + + #endregion + + #region Types + + V_ASN1_EOC = 0x00, + V_ASN1_BOOLEAN = 0x01, + V_ASN1_INTEGER = 0x02, + V_ASN1_BIT_STRING = 0x03, + V_ASN1_OCTET_STRING = 0x04, + V_ASN1_NULL = 0x05, + V_ASN1_OBJECT = 0x06, + V_ASN1_OBJECT_DESCRIPTOR = 0x07, + V_ASN1_EXTERNAL = 0x08, + V_ASN1_REAL = 0x09, + V_ASN1_ENUMERATED = 0x0A, + V_ASN1_UTF8STRING = 0x0C, + V_ASN1_SEQUENCE = 0x10, + V_ASN1_SET = 0x11, + V_ASN1_NUMERICSTRING = 0x12, + V_ASN1_PRINTABLESTRING = 0x13, + V_ASN1_T61STRING = 0x14, + V_ASN1_TELETEXSTRING = 0x14, + V_ASN1_VIDEOTEXSTRING = 0x15, + V_ASN1_IA5STRING = 0x16, + V_ASN1_UTCTIME = 0x17, + V_ASN1_GENERALIZEDTIME = 0x18, + V_ASN1_GRAPHICSTRING = 0x19, + V_ASN1_ISO64STRING = 0x1A, + V_ASN1_VISIBLESTRING = 0x1A, + V_ASN1_GENERALSTRING = 0x1B, + V_ASN1_UNIVERSALSTRING = 0x1C, + V_ASN1_BMPSTRING = 0x1E, + + #endregion + } +} diff --git a/BurnOutSharp.Builder/ObjectIdentifier.ASN1.cs b/BurnOutSharp.ASN1/ObjectIdentifier.ASN1.cs similarity index 96% rename from BurnOutSharp.Builder/ObjectIdentifier.ASN1.cs rename to BurnOutSharp.ASN1/ObjectIdentifier.ASN1.cs index 0cf1a0aa..4db2a7cd 100644 --- a/BurnOutSharp.Builder/ObjectIdentifier.ASN1.cs +++ b/BurnOutSharp.ASN1/ObjectIdentifier.ASN1.cs @@ -1,4 +1,4 @@ -namespace BurnOutSharp.Builder +namespace BurnOutSharp.ASN1 { #pragma warning disable IDE0011 diff --git a/BurnOutSharp.Builder/ObjectIdentifier.ModifiedOIDIRI.cs b/BurnOutSharp.ASN1/ObjectIdentifier.ModifiedOIDIRI.cs similarity index 99% rename from BurnOutSharp.Builder/ObjectIdentifier.ModifiedOIDIRI.cs rename to BurnOutSharp.ASN1/ObjectIdentifier.ModifiedOIDIRI.cs index 4dc9a861..b6cf8cfe 100644 --- a/BurnOutSharp.Builder/ObjectIdentifier.ModifiedOIDIRI.cs +++ b/BurnOutSharp.ASN1/ObjectIdentifier.ModifiedOIDIRI.cs @@ -1,7 +1,7 @@ using System.Linq; using System.Text; -namespace BurnOutSharp.Builder +namespace BurnOutSharp.ASN1 { #pragma warning disable IDE0011 diff --git a/BurnOutSharp.Builder/ObjectIdentifier.OIDIRI.cs b/BurnOutSharp.ASN1/ObjectIdentifier.OIDIRI.cs similarity index 99% rename from BurnOutSharp.Builder/ObjectIdentifier.OIDIRI.cs rename to BurnOutSharp.ASN1/ObjectIdentifier.OIDIRI.cs index 069b6f54..c60c0606 100644 --- a/BurnOutSharp.Builder/ObjectIdentifier.OIDIRI.cs +++ b/BurnOutSharp.ASN1/ObjectIdentifier.OIDIRI.cs @@ -1,7 +1,7 @@ using System.Linq; using System.Text; -namespace BurnOutSharp.Builder +namespace BurnOutSharp.ASN1 { #pragma warning disable IDE0011 diff --git a/BurnOutSharp.Builder/ObjectIdentifier.cs b/BurnOutSharp.ASN1/ObjectIdentifier.cs similarity index 98% rename from BurnOutSharp.Builder/ObjectIdentifier.cs rename to BurnOutSharp.ASN1/ObjectIdentifier.cs index b037475c..353ca2e2 100644 --- a/BurnOutSharp.Builder/ObjectIdentifier.cs +++ b/BurnOutSharp.ASN1/ObjectIdentifier.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; -namespace BurnOutSharp.Builder +namespace BurnOutSharp.ASN1 { /// /// Methods related to Object Identifiers (OID) diff --git a/BurnOutSharp.Builder/ObjectIdentifier.dot.cs b/BurnOutSharp.ASN1/ObjectIdentifier.dot.cs similarity index 96% rename from BurnOutSharp.Builder/ObjectIdentifier.dot.cs rename to BurnOutSharp.ASN1/ObjectIdentifier.dot.cs index ad345e5e..4e432120 100644 --- a/BurnOutSharp.Builder/ObjectIdentifier.dot.cs +++ b/BurnOutSharp.ASN1/ObjectIdentifier.dot.cs @@ -1,4 +1,4 @@ -namespace BurnOutSharp.Builder +namespace BurnOutSharp.ASN1 { #pragma warning disable IDE0011 diff --git a/BurnOutSharp.Builder/AbstractSyntaxNotationOne.cs b/BurnOutSharp.ASN1/TypeLengthValue.cs similarity index 79% rename from BurnOutSharp.Builder/AbstractSyntaxNotationOne.cs rename to BurnOutSharp.ASN1/TypeLengthValue.cs index 8f9e960f..10844c58 100644 --- a/BurnOutSharp.Builder/AbstractSyntaxNotationOne.cs +++ b/BurnOutSharp.ASN1/TypeLengthValue.cs @@ -5,90 +5,12 @@ using System.Numerics; using System.Text; using BurnOutSharp.Utilities; -namespace BurnOutSharp.Builder +namespace BurnOutSharp.ASN1 { - /// - /// ASN.1 type indicators - /// - [Flags] - public enum ASN1Type : byte - { - #region Modifiers - - V_ASN1_UNIVERSAL = 0x00, - V_ASN1_PRIMITIVE_TAG = 0x1F, - V_ASN1_CONSTRUCTED = 0x20, - V_ASN1_APPLICATION = 0x40, - V_ASN1_CONTEXT_SPECIFIC = 0x80, - V_ASN1_PRIVATE = 0xC0, - - #endregion - - #region Types - - V_ASN1_EOC = 0x00, - V_ASN1_BOOLEAN = 0x01, - V_ASN1_INTEGER = 0x02, - V_ASN1_BIT_STRING = 0x03, - V_ASN1_OCTET_STRING = 0x04, - V_ASN1_NULL = 0x05, - V_ASN1_OBJECT = 0x06, - V_ASN1_OBJECT_DESCRIPTOR = 0x07, - V_ASN1_EXTERNAL = 0x08, - V_ASN1_REAL = 0x09, - V_ASN1_ENUMERATED = 0x0A, - V_ASN1_UTF8STRING = 0x0C, - V_ASN1_SEQUENCE = 0x10, - V_ASN1_SET = 0x11, - V_ASN1_NUMERICSTRING = 0x12, - V_ASN1_PRINTABLESTRING = 0x13, - V_ASN1_T61STRING = 0x14, - V_ASN1_TELETEXSTRING = 0x14, - V_ASN1_VIDEOTEXSTRING = 0x15, - V_ASN1_IA5STRING = 0x16, - V_ASN1_UTCTIME = 0x17, - V_ASN1_GENERALIZEDTIME = 0x18, - V_ASN1_GRAPHICSTRING = 0x19, - V_ASN1_ISO64STRING = 0x1A, - V_ASN1_VISIBLESTRING = 0x1A, - V_ASN1_GENERALSTRING = 0x1B, - V_ASN1_UNIVERSALSTRING = 0x1C, - V_ASN1_BMPSTRING = 0x1E, - - #endregion - } - - /// - /// ASN.1 Parser - /// - public class AbstractSyntaxNotationOne - { - /// - /// Parse a byte array into a DER-encoded ASN.1 structure - /// - /// Byte array representing the data - /// Current pointer into the data - /// - public static List Parse(byte[] data, int pointer) - { - // Create the output list to return - var topLevelValues = new List(); - - // Loop through the data and return all top-level values - while (pointer < data.Length) - { - var topLevelValue = new ASN1TypeLengthValue(data, ref pointer); - topLevelValues.Add(topLevelValue); - } - - return topLevelValues; - } - } - /// /// ASN.1 type/length/value class that all types are based on /// - public class ASN1TypeLengthValue + public class TypeLengthValue { /// /// The ASN.1 type @@ -110,7 +32,7 @@ namespace BurnOutSharp.Builder /// /// Byte array representing data to read /// Index within the array to read at - public ASN1TypeLengthValue(byte[] data, ref int index) + public TypeLengthValue(byte[] data, ref int index) { // Get the type and modifiers this.Type = (ASN1Type)data[index++]; @@ -125,12 +47,12 @@ namespace BurnOutSharp.Builder // Read the value if (this.Type.HasFlag(ASN1Type.V_ASN1_CONSTRUCTED)) { - var valueList = new List(); + var valueList = new List(); int currentIndex = index; while (index < currentIndex + (int)this.Length) { - valueList.Add(new ASN1TypeLengthValue(data, ref index)); + valueList.Add(new TypeLengthValue(data, ref index)); } this.Value = valueList.ToArray(); @@ -172,7 +94,7 @@ namespace BurnOutSharp.Builder // If we have a constructed type if (this.Type.HasFlag(ASN1Type.V_ASN1_CONSTRUCTED)) { - var valueAsObjectArray = this.Value as ASN1TypeLengthValue[]; + var valueAsObjectArray = this.Value as TypeLengthValue[]; if (valueAsObjectArray == null) { formatBuilder.Append(", Value: [INVALID DATA TYPE]"); diff --git a/BurnOutSharp.Wrappers/BurnOutSharp.Wrappers.csproj b/BurnOutSharp.Wrappers/BurnOutSharp.Wrappers.csproj index b9240fa1..fd437ddb 100644 --- a/BurnOutSharp.Wrappers/BurnOutSharp.Wrappers.csproj +++ b/BurnOutSharp.Wrappers/BurnOutSharp.Wrappers.csproj @@ -24,6 +24,7 @@ + diff --git a/BurnOutSharp.Wrappers/PortableExecutable.cs b/BurnOutSharp.Wrappers/PortableExecutable.cs index 4ce69a44..b9f56be4 100644 --- a/BurnOutSharp.Wrappers/PortableExecutable.cs +++ b/BurnOutSharp.Wrappers/PortableExecutable.cs @@ -4,6 +4,7 @@ using System.IO; using System.Linq; using System.Text; using System.Xml; +using BurnOutSharp.ASN1; using BurnOutSharp.Utilities; using static BurnOutSharp.Builder.Extensions; @@ -1450,7 +1451,7 @@ namespace BurnOutSharp.Wrappers { Console.WriteLine(" Certificate Data [Formatted]"); Console.WriteLine(" -------------------------"); - var topLevelValues = Builder.AbstractSyntaxNotationOne.Parse(entry.Certificate, pointer: 0); + var topLevelValues = AbstractSyntaxNotationOne.Parse(entry.Certificate, pointer: 0); if (topLevelValues == null) { Console.WriteLine(" INVALID DATA FOUND"); @@ -1458,7 +1459,7 @@ namespace BurnOutSharp.Wrappers } else { - foreach (Builder.ASN1TypeLengthValue tlv in topLevelValues) + foreach (TypeLengthValue tlv in topLevelValues) { string tlvString = tlv.Format(paddingLevel: 4); Console.WriteLine(tlvString); diff --git a/BurnOutSharp.sln b/BurnOutSharp.sln index de3dd646..39541e9c 100644 --- a/BurnOutSharp.sln +++ b/BurnOutSharp.sln @@ -34,7 +34,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BurnOutSharp.Matching", "Bu EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "psxt001z", "psxt001z\psxt001z.csproj", "{D9574B47-0D6B-445A-97BF-272B5EF9AD3F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BurnOutSharp.Utilities", "BurnOutSharp.Utilities\BurnOutSharp.Utilities.csproj", "{3C1D1FE2-7E7C-4EC1-96B1-FE68B73282CD}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BurnOutSharp.Utilities", "BurnOutSharp.Utilities\BurnOutSharp.Utilities.csproj", "{3C1D1FE2-7E7C-4EC1-96B1-FE68B73282CD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BurnOutSharp.ASN1", "BurnOutSharp.ASN1\BurnOutSharp.ASN1.csproj", "{D5407F3A-236C-45B5-BE3A-1505412DCB22}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -90,6 +92,10 @@ Global {3C1D1FE2-7E7C-4EC1-96B1-FE68B73282CD}.Debug|Any CPU.Build.0 = Debug|Any CPU {3C1D1FE2-7E7C-4EC1-96B1-FE68B73282CD}.Release|Any CPU.ActiveCfg = Release|Any CPU {3C1D1FE2-7E7C-4EC1-96B1-FE68B73282CD}.Release|Any CPU.Build.0 = Release|Any CPU + {D5407F3A-236C-45B5-BE3A-1505412DCB22}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D5407F3A-236C-45B5-BE3A-1505412DCB22}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D5407F3A-236C-45B5-BE3A-1505412DCB22}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D5407F3A-236C-45B5-BE3A-1505412DCB22}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/BurnOutSharp/BurnOutSharp.csproj b/BurnOutSharp/BurnOutSharp.csproj index fce5bae6..744b106e 100644 --- a/BurnOutSharp/BurnOutSharp.csproj +++ b/BurnOutSharp/BurnOutSharp.csproj @@ -57,6 +57,14 @@ + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + runtime; build; native; contentfiles; analyzers; buildtransitive all