Files
2026-06-04 11:42:34 +02:00

390 lines
8.2 KiB
C#

using System;
using System.Collections;
using System.IO;
using System.Text;
namespace Mono.Security
{
// Token: 0x0200000E RID: 14
public class ASN1
{
// Token: 0x06000079 RID: 121 RVA: 0x00004CA8 File Offset: 0x00002EA8
public ASN1()
: this(0, null)
{
}
// Token: 0x0600007A RID: 122 RVA: 0x00004CB4 File Offset: 0x00002EB4
public ASN1(byte tag)
: this(tag, null)
{
}
// Token: 0x0600007B RID: 123 RVA: 0x00004CC0 File Offset: 0x00002EC0
public ASN1(byte tag, byte[] data)
{
this.m_nTag = tag;
this.m_aValue = data;
}
// Token: 0x0600007C RID: 124 RVA: 0x00004CD8 File Offset: 0x00002ED8
public ASN1(byte[] data)
{
this.m_nTag = data[0];
int num = 0;
int num2 = (int)data[1];
if (num2 > 128)
{
num = num2 - 128;
num2 = 0;
for (int i = 0; i < num; i++)
{
num2 *= 256;
num2 += (int)data[i + 2];
}
}
else if (num2 == 128)
{
throw new NotSupportedException("Undefined length encoding.");
}
this.m_aValue = new byte[num2];
Buffer.BlockCopy(data, 2 + num, this.m_aValue, 0, num2);
if ((this.m_nTag & 32) == 32)
{
int num3 = 2 + num;
this.Decode(data, ref num3, data.Length);
}
}
// Token: 0x17000005 RID: 5
// (get) Token: 0x0600007D RID: 125 RVA: 0x00004D8C File Offset: 0x00002F8C
public int Count
{
get
{
if (this.elist == null)
{
return 0;
}
return this.elist.Count;
}
}
// Token: 0x17000006 RID: 6
// (get) Token: 0x0600007E RID: 126 RVA: 0x00004DA8 File Offset: 0x00002FA8
public byte Tag
{
get
{
return this.m_nTag;
}
}
// Token: 0x17000007 RID: 7
// (get) Token: 0x0600007F RID: 127 RVA: 0x00004DB0 File Offset: 0x00002FB0
public int Length
{
get
{
if (this.m_aValue != null)
{
return this.m_aValue.Length;
}
return 0;
}
}
// Token: 0x17000008 RID: 8
// (get) Token: 0x06000080 RID: 128 RVA: 0x00004DC8 File Offset: 0x00002FC8
// (set) Token: 0x06000081 RID: 129 RVA: 0x00004DF8 File Offset: 0x00002FF8
public byte[] Value
{
get
{
if (this.m_aValue == null)
{
this.GetBytes();
}
return (byte[])this.m_aValue.Clone();
}
set
{
if (value != null)
{
this.m_aValue = (byte[])value.Clone();
}
}
}
// Token: 0x06000082 RID: 130 RVA: 0x00004E14 File Offset: 0x00003014
private bool CompareArray(byte[] array1, byte[] array2)
{
bool flag = array1.Length == array2.Length;
if (flag)
{
for (int i = 0; i < array1.Length; i++)
{
if (array1[i] != array2[i])
{
return false;
}
}
}
return flag;
}
// Token: 0x06000083 RID: 131 RVA: 0x00004E54 File Offset: 0x00003054
public bool Equals(byte[] asn1)
{
return this.CompareArray(this.GetBytes(), asn1);
}
// Token: 0x06000084 RID: 132 RVA: 0x00004E64 File Offset: 0x00003064
public bool CompareValue(byte[] value)
{
return this.CompareArray(this.m_aValue, value);
}
// Token: 0x06000085 RID: 133 RVA: 0x00004E74 File Offset: 0x00003074
public ASN1 Add(ASN1 asn1)
{
if (asn1 != null)
{
if (this.elist == null)
{
this.elist = new ArrayList();
}
this.elist.Add(asn1);
}
return asn1;
}
// Token: 0x06000086 RID: 134 RVA: 0x00004EAC File Offset: 0x000030AC
public virtual byte[] GetBytes()
{
byte[] array = null;
if (this.Count > 0)
{
int num = 0;
ArrayList arrayList = new ArrayList();
foreach (object obj in this.elist)
{
ASN1 asn = (ASN1)obj;
byte[] bytes = asn.GetBytes();
arrayList.Add(bytes);
num += bytes.Length;
}
array = new byte[num];
int num2 = 0;
for (int i = 0; i < this.elist.Count; i++)
{
byte[] array2 = (byte[])arrayList[i];
Buffer.BlockCopy(array2, 0, array, num2, array2.Length);
num2 += array2.Length;
}
}
else if (this.m_aValue != null)
{
array = this.m_aValue;
}
int num3 = 0;
byte[] array3;
if (array != null)
{
int num4 = array.Length;
if (num4 > 127)
{
if (num4 <= 255)
{
array3 = new byte[3 + num4];
Buffer.BlockCopy(array, 0, array3, 3, num4);
num3 = 129;
array3[2] = (byte)num4;
}
else if (num4 <= 65535)
{
array3 = new byte[4 + num4];
Buffer.BlockCopy(array, 0, array3, 4, num4);
num3 = 130;
array3[2] = (byte)(num4 >> 8);
array3[3] = (byte)num4;
}
else if (num4 <= 16777215)
{
array3 = new byte[5 + num4];
Buffer.BlockCopy(array, 0, array3, 5, num4);
num3 = 131;
array3[2] = (byte)(num4 >> 16);
array3[3] = (byte)(num4 >> 8);
array3[4] = (byte)num4;
}
else
{
array3 = new byte[6 + num4];
Buffer.BlockCopy(array, 0, array3, 6, num4);
num3 = 132;
array3[2] = (byte)(num4 >> 24);
array3[3] = (byte)(num4 >> 16);
array3[4] = (byte)(num4 >> 8);
array3[5] = (byte)num4;
}
}
else
{
array3 = new byte[2 + num4];
Buffer.BlockCopy(array, 0, array3, 2, num4);
num3 = num4;
}
if (this.m_aValue == null)
{
this.m_aValue = array;
}
}
else
{
array3 = new byte[2];
}
array3[0] = this.m_nTag;
array3[1] = (byte)num3;
return array3;
}
// Token: 0x06000087 RID: 135 RVA: 0x0000511C File Offset: 0x0000331C
protected void Decode(byte[] asn1, ref int anPos, int anLength)
{
while (anPos < anLength - 1)
{
byte b;
int num;
byte[] array;
this.DecodeTLV(asn1, ref anPos, out b, out num, out array);
if (b != 0)
{
ASN1 asn2 = this.Add(new ASN1(b, array));
if ((b & 32) == 32)
{
int num2 = anPos;
asn2.Decode(asn1, ref num2, num2 + num);
}
anPos += num;
}
}
}
// Token: 0x06000088 RID: 136 RVA: 0x00005184 File Offset: 0x00003384
protected void DecodeTLV(byte[] asn1, ref int pos, out byte tag, out int length, out byte[] content)
{
tag = asn1[pos++];
length = (int)asn1[pos++];
if ((length & 128) == 128)
{
int num = length & 127;
length = 0;
for (int i = 0; i < num; i++)
{
length = length * 256 + (int)asn1[pos++];
}
}
content = new byte[length];
Buffer.BlockCopy(asn1, pos, content, 0, length);
}
// Token: 0x17000009 RID: 9
public ASN1 this[int index]
{
get
{
ASN1 asn;
try
{
if (this.elist == null || index >= this.elist.Count)
{
asn = null;
}
else
{
asn = (ASN1)this.elist[index];
}
}
catch (ArgumentOutOfRangeException)
{
asn = null;
}
return asn;
}
}
// Token: 0x0600008A RID: 138 RVA: 0x00005288 File Offset: 0x00003488
public ASN1 Element(int index, byte anTag)
{
ASN1 asn;
try
{
if (this.elist == null || index >= this.elist.Count)
{
asn = null;
}
else
{
ASN1 asn2 = (ASN1)this.elist[index];
if (asn2.Tag == anTag)
{
asn = asn2;
}
else
{
asn = null;
}
}
}
catch (ArgumentOutOfRangeException)
{
asn = null;
}
return asn;
}
// Token: 0x0600008B RID: 139 RVA: 0x00005314 File Offset: 0x00003514
public override string ToString()
{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.AppendFormat("Tag: {0} {1}", this.m_nTag.ToString("X2"), Environment.NewLine);
stringBuilder.AppendFormat("Length: {0} {1}", this.Value.Length, Environment.NewLine);
stringBuilder.Append("Value: ");
stringBuilder.Append(Environment.NewLine);
for (int i = 0; i < this.Value.Length; i++)
{
stringBuilder.AppendFormat("{0} ", this.Value[i].ToString("X2"));
if ((i + 1) % 16 == 0)
{
stringBuilder.AppendFormat(Environment.NewLine, new object[0]);
}
}
return stringBuilder.ToString();
}
// Token: 0x0600008C RID: 140 RVA: 0x000053DC File Offset: 0x000035DC
public void SaveToFile(string filename)
{
if (filename == null)
{
throw new ArgumentNullException("filename");
}
using (FileStream fileStream = File.Create(filename))
{
byte[] bytes = this.GetBytes();
fileStream.Write(bytes, 0, bytes.Length);
}
}
// Token: 0x04000031 RID: 49
private byte m_nTag;
// Token: 0x04000032 RID: 50
private byte[] m_aValue;
// Token: 0x04000033 RID: 51
private ArrayList elist;
}
}