24 Commits

Author SHA1 Message Date
Matt Nadareski
e632f8537b Bump version 2024-11-20 15:55:54 -05:00
Matt Nadareski
ce8c4b1831 Fix issue with 0 unused bits 2024-11-20 15:03:26 -05:00
Matt Nadareski
2bdb56aca2 Bump version 2024-11-15 20:51:12 -05:00
Matt Nadareski
ce6ffd3f7f Framework only matters for executable 2024-11-15 20:48:13 -05:00
Matt Nadareski
c06618c66c Update IO to 1.5.1 2024-11-15 20:46:27 -05:00
Matt Nadareski
eb356483b4 Fix path in GHA 2024-11-13 11:58:19 -05:00
Matt Nadareski
0e76552df8 Fix path in GHA 2024-11-13 11:55:55 -05:00
Matt Nadareski
070274e33f Bump version 2024-11-13 00:50:36 -05:00
Matt Nadareski
dd64d6f843 Add .NET 9 to target frameworks 2024-11-13 00:50:16 -05:00
Matt Nadareski
69992f64be Add proper multi-framework support 2024-11-05 19:40:49 -05:00
Matt Nadareski
e63921fbc2 Linq just isn't needed 2024-11-05 19:38:24 -05:00
Matt Nadareski
69dc21c814 Bump version 2024-10-01 13:32:24 -04:00
Matt Nadareski
4c07f24e3c Update IO to 1.4.12 2024-10-01 13:31:41 -04:00
Matt Nadareski
b6b43d9e1b Fix README location for package 2024-10-01 13:09:54 -04:00
Matt Nadareski
7c972c1ea2 Move project to subfolder 2024-10-01 13:07:45 -04:00
Matt Nadareski
7c40583898 Some old .NET simplification 2024-10-01 12:41:53 -04:00
Matt Nadareski
ef479c783a Remove Linq requirement from old .NET 2024-10-01 01:53:26 -04:00
Matt Nadareski
1ebd9f82ee Update IO to 1.4.11 2024-09-25 10:54:48 -04:00
Matt Nadareski
774597b17c Bump version 2024-04-26 21:22:20 -04:00
Matt Nadareski
29437475fb Make Linux publish script executable 2024-04-26 21:21:19 -04:00
Matt Nadareski
214d4e4f9e Add publish scripts 2024-04-26 21:20:50 -04:00
Matt Nadareski
06c742cd15 Update SabreTools.IO 2024-04-26 21:18:34 -04:00
Matt Nadareski
bc591f367f Bump version 2024-03-05 11:07:01 -05:00
Matt Nadareski
8c6b962bd6 Update SabreTools.IO 2024-03-05 10:47:16 -05:00
15 changed files with 150 additions and 73 deletions

View File

@@ -16,7 +16,7 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.0.x
dotnet-version: 9.0.x
- name: Restore dependencies
run: dotnet restore
@@ -28,13 +28,13 @@ jobs:
uses: actions/upload-artifact@v4
with:
name: 'Nuget Package'
path: 'bin/Release/*.nupkg'
path: 'SabreTools.ASN1/bin/Release/*.nupkg'
- name: Upload to rolling
uses: ncipollo/release-action@v1.14.0
with:
allowUpdates: True
artifacts: 'bin/Release/*.nupkg'
artifacts: 'SabreTools.ASN1/bin/Release/*.nupkg'
body: 'Last built commit: ${{ github.sha }}'
name: 'Rolling Release'
prerelease: True

View File

@@ -11,7 +11,7 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.0.x
dotnet-version: 9.0.x
- name: Build
run: dotnet build

View File

@@ -1,38 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<!-- Assembly Properties -->
<TargetFrameworks>net20;net35;net40;net452;net462;net472;net48;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0</TargetFrameworks>
<RuntimeIdentifiers>win-x86;win-x64;win-arm64;linux-x64;linux-arm64;osx-x64;osx-arm64</RuntimeIdentifiers>
<LangVersion>latest</LangVersion>
<Nullable>enable</Nullable>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<Version>1.3.0</Version>
<!-- Package Properties -->
<Authors>Matt Nadareski</Authors>
<Description>Serialization and deserialization helpers for various types</Description>
<Copyright>Copyright (c) Matt Nadareski 2022-2024</Copyright>
<PackageProjectUrl>https://github.com/SabreTools/</PackageProjectUrl>
<PackageReadmeFile>README.md</PackageReadmeFile>
<RepositoryUrl>https://github.com/SabreTools/SabreTools.ASN1</RepositoryUrl>
<RepositoryType>git</RepositoryType>
<PackageTags>asn asn1 dot oid</PackageTags>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
</PropertyGroup>
<ItemGroup>
<None Include="README.md" Pack="true" PackagePath=""/>
</ItemGroup>
<!-- Support for old .NET versions -->
<ItemGroup Condition="$(TargetFramework.StartsWith(`net2`)) OR $(TargetFramework.StartsWith(`net3`))">
<PackageReference Include="Net30.LinqBridge" Version="1.3.0" />
<PackageReference Include="NetLegacySupport.Numerics" Version="1.0.1" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="SabreTools.IO" Version="1.3.0" />
</ItemGroup>
</Project>

View File

@@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31903.59
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.ASN1", "SabreTools.ASN1.csproj", "{88EA40DD-E313-479C-94EA-0AB948DB4720}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.ASN1", "SabreTools.ASN1\SabreTools.ASN1.csproj", "{88EA40DD-E313-479C-94EA-0AB948DB4720}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution

View File

@@ -1,4 +1,4 @@
using System.Linq;
using System;
using System.Text;
#pragma warning disable CS0162 // Unreachable code detected
@@ -48,7 +48,14 @@ namespace SabreTools.ASN1
// Add trailing items as just values
nameBuilder.Append("/");
nameBuilder.Append(string.Join("/", values.Skip(index).Select(v => v.ToString()).ToArray()));
// Get the remaining values in a new array
var remainingValues = new ulong[values.Length - index];
Array.Copy(values, index, remainingValues, 0, remainingValues.Length);
// Convert the values and append to the builder
var stringValues = Array.ConvertAll(remainingValues, v => v.ToString());
nameBuilder.Append(string.Join("/", stringValues));
// Create and return the string
return nameBuilder.ToString();

View File

@@ -1,4 +1,4 @@
using System.Linq;
using System;
using System.Text;
namespace SabreTools.ASN1
@@ -41,7 +41,14 @@ namespace SabreTools.ASN1
// Add trailing items as just values
nameBuilder.Append("/");
nameBuilder.Append(string.Join("/", values.Skip(index).Select(index => index.ToString()).ToArray()));
// Get the remaining values in a new array
var remainingValues = new ulong[values.Length - index];
Array.Copy(values, index, remainingValues, 0, remainingValues.Length);
// Convert the values and append to the builder
var stringValues = Array.ConvertAll(remainingValues, v => v.ToString());
nameBuilder.Append(string.Join("/", stringValues));
// Create and return the string
return nameBuilder.ToString();

View File

@@ -1,4 +1,4 @@
using System.Linq;
using System;
namespace SabreTools.ASN1
{
@@ -18,7 +18,8 @@ namespace SabreTools.ASN1
if (values == null || values.Length == 0)
return null;
return string.Join(".", values.Select(v => v.ToString()).ToArray());
var stringValues = Array.ConvertAll(values, v => v.ToString());
return string.Join(".", [.. stringValues]);
}
}
}

View File

@@ -0,0 +1,36 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<!-- Assembly Properties -->
<TargetFrameworks>net20;net35;net40;net452;net462;net472;net48;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0</TargetFrameworks>
<LangVersion>latest</LangVersion>
<Nullable>enable</Nullable>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<Version>1.4.2</Version>
<!-- Package Properties -->
<Authors>Matt Nadareski</Authors>
<Description>Serialization and deserialization helpers for various types</Description>
<Copyright>Copyright (c) Matt Nadareski 2022-2024</Copyright>
<PackageProjectUrl>https://github.com/SabreTools/</PackageProjectUrl>
<PackageReadmeFile>README.md</PackageReadmeFile>
<RepositoryUrl>https://github.com/SabreTools/SabreTools.ASN1</RepositoryUrl>
<RepositoryType>git</RepositoryType>
<PackageTags>asn asn1 dot oid</PackageTags>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
</PropertyGroup>
<ItemGroup>
<None Include="../README.md" Pack="true" PackagePath="" />
</ItemGroup>
<!-- Support for old .NET versions -->
<ItemGroup Condition="$(TargetFramework.StartsWith(`net2`)) OR $(TargetFramework.StartsWith(`net3`))">
<PackageReference Include="NetLegacySupport.Numerics" Version="1.0.1" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="SabreTools.IO" Version="1.5.1" />
</ItemGroup>
</Project>

View File

@@ -1,9 +1,8 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using System.Text;
using SabreTools.IO;
using SabreTools.IO.Extensions;
namespace SabreTools.ASN1
{
@@ -35,36 +34,36 @@ namespace SabreTools.ASN1
public TypeLengthValue(byte[] data, ref int index)
{
// Get the type and modifiers
this.Type = (ASN1Type)data[index++];
Type = (ASN1Type)data[index++];
// If we have an end indicator, we just return
if (this.Type == ASN1Type.V_ASN1_EOC)
if (Type == ASN1Type.V_ASN1_EOC)
return;
// Get the length of the value
this.Length = ReadLength(data, ref index);
Length = ReadLength(data, ref index);
// Read the value
#if NET20 || NET35
if ((this.Type & ASN1Type.V_ASN1_CONSTRUCTED) != 0)
if ((Type & ASN1Type.V_ASN1_CONSTRUCTED) != 0)
#else
if (this.Type.HasFlag(ASN1Type.V_ASN1_CONSTRUCTED))
if (Type.HasFlag(ASN1Type.V_ASN1_CONSTRUCTED))
#endif
{
var valueList = new List<TypeLengthValue>();
int currentIndex = index;
while (index < currentIndex + (int)this.Length)
while (index < currentIndex + (int)Length)
{
valueList.Add(new TypeLengthValue(data, ref index));
}
this.Value = valueList.ToArray();
Value = valueList.ToArray();
}
else
{
// TODO: Get more granular based on type
this.Value = data.ReadBytes(ref index, (int)this.Length);
Value = data.ReadBytes(ref index, (int)Length);
}
}
@@ -79,30 +78,30 @@ namespace SabreTools.ASN1
string padding = new(' ', paddingLevel);
// If we have an invalid item
if (this.Type == 0)
if (Type == 0)
return $"{padding}UNKNOWN TYPE";
// Create the string builder
var formatBuilder = new StringBuilder();
// Append the type
formatBuilder.Append($"{padding}Type: {this.Type}");
if (this.Type == ASN1Type.V_ASN1_EOC)
formatBuilder.Append($"{padding}Type: {Type}");
if (Type == ASN1Type.V_ASN1_EOC)
return formatBuilder.ToString();
// Append the length
formatBuilder.Append($", Length: {this.Length}");
if (this.Length == 0)
formatBuilder.Append($", Length: {Length}");
if (Length == 0)
return formatBuilder.ToString();
// If we have a constructed type
#if NET20 || NET35
if ((this.Type & ASN1Type.V_ASN1_CONSTRUCTED) != 0)
if ((Type & ASN1Type.V_ASN1_CONSTRUCTED) != 0)
#else
if (this.Type.HasFlag(ASN1Type.V_ASN1_CONSTRUCTED))
if (Type.HasFlag(ASN1Type.V_ASN1_CONSTRUCTED))
#endif
{
if (this.Value is not TypeLengthValue[] valueAsObjectArray)
if (Value is not TypeLengthValue[] valueAsObjectArray)
{
formatBuilder.Append(", Value: [INVALID DATA TYPE]");
return formatBuilder.ToString();
@@ -120,18 +119,18 @@ namespace SabreTools.ASN1
}
// Get the value as a byte array
if (this.Value is not byte[] valueAsByteArray)
if (Value is not byte[] valueAsByteArray)
{
formatBuilder.Append(", Value: [INVALID DATA TYPE]");
return formatBuilder.ToString();
}
// If we have a primitive type
switch (this.Type)
switch (Type)
{
/// <see href="https://learn.microsoft.com/en-us/windows/win32/seccertenroll/about-boolean"/>
case ASN1Type.V_ASN1_BOOLEAN:
if (this.Length > 1 || valueAsByteArray.Length > 1)
if (Length > 1 || valueAsByteArray.Length > 1)
formatBuilder.Append($" [Expected length of 1]");
bool booleanValue = valueAsByteArray[0] != 0x00;
@@ -149,7 +148,10 @@ namespace SabreTools.ASN1
case ASN1Type.V_ASN1_BIT_STRING:
// TODO: Read into a BitArray and print that out instead?
int unusedBits = valueAsByteArray[0];
formatBuilder.Append($", Value with {unusedBits} unused bits: {BitConverter.ToString(valueAsByteArray.Skip(1).ToArray()).Replace('-', ' ')}");
if (unusedBits == 0)
formatBuilder.Append($", Value with {unusedBits} unused bits");
else
formatBuilder.Append($", Value with {unusedBits} unused bits: {BitConverter.ToString(valueAsByteArray, 1).Replace('-', ' ')}");
break;
/// <see href="https://learn.microsoft.com/en-us/windows/win32/seccertenroll/about-octet-string"/>
@@ -161,7 +163,7 @@ namespace SabreTools.ASN1
/// <see cref="http://snmpsharpnet.com/index.php/2009/03/02/ber-encoding-and-decoding-oid-values/"/>
case ASN1Type.V_ASN1_OBJECT:
// Derive array of values
ulong[] objectNodes = ObjectIdentifier.ParseDERIntoArray(valueAsByteArray, this.Length);
ulong[] objectNodes = ObjectIdentifier.ParseDERIntoArray(valueAsByteArray, Length);
// Append the dot and modified OID-IRI notations
string? dotNotationString = ObjectIdentifier.ParseOIDToDotNotation(objectNodes);
@@ -203,7 +205,7 @@ namespace SabreTools.ASN1
break;
default:
formatBuilder.Append($", Value (Unknown Format): {BitConverter.ToString(this.Value as byte[] ?? []).Replace('-', ' ')}");
formatBuilder.Append($", Value (Unknown Format): {BitConverter.ToString(Value as byte[] ?? []).Replace('-', ' ')}");
break;
}

36
publish-nix.sh Executable file
View File

@@ -0,0 +1,36 @@
#! /bin/bash
# This batch file assumes the following:
# - .NET 9.0 (or newer) SDK is installed and in PATH
#
# If any of these are not satisfied, the operation may fail
# in an unpredictable way and result in an incomplete output.
# Optional parameters
NO_BUILD=false
while getopts "b" OPTION
do
case $OPTION in
b)
NO_BUILD=true
;;
*)
echo "Invalid option provided"
exit 1
;;
esac
done
# Set the current directory as a variable
BUILD_FOLDER=$PWD
# Only build if requested
if [ $NO_BUILD = false ]
then
# Restore Nuget packages for all builds
echo "Restoring Nuget packages"
dotnet restore
# Create Nuget Package
dotnet pack SabreTools.ASN1/SabreTools.ASN1.csproj --output $BUILD_FOLDER
fi

26
publish-win.ps1 Normal file
View File

@@ -0,0 +1,26 @@
# This batch file assumes the following:
# - .NET 9.0 (or newer) SDK is installed and in PATH
#
# If any of these are not satisfied, the operation may fail
# in an unpredictable way and result in an incomplete output.
# Optional parameters
param(
[Parameter(Mandatory = $false)]
[Alias("NoBuild")]
[switch]$NO_BUILD
)
# Set the current directory as a variable
$BUILD_FOLDER = $PSScriptRoot
# Only build if requested
if (!$NO_BUILD.IsPresent)
{
# Restore Nuget packages for all builds
Write-Host "Restoring Nuget packages"
dotnet restore
# Create Nuget Package
dotnet pack SabreTools.ASN1\SabreTools.ASN1.csproj --output $BUILD_FOLDER
}