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

1315 lines
31 KiB
C#

using System;
using System.Collections;
using System.Security.Cryptography;
using Mono.Security.X509;
namespace Mono.Security
{
// Token: 0x02000011 RID: 17
public sealed class PKCS7
{
// Token: 0x060000AF RID: 175 RVA: 0x00005C0C File Offset: 0x00003E0C
private PKCS7()
{
}
// Token: 0x060000B0 RID: 176 RVA: 0x00005C14 File Offset: 0x00003E14
public static ASN1 Attribute(string oid, ASN1 value)
{
ASN1 asn = new ASN1(48);
asn.Add(ASN1Convert.FromOid(oid));
ASN1 asn2 = asn.Add(new ASN1(49));
asn2.Add(value);
return asn;
}
// Token: 0x060000B1 RID: 177 RVA: 0x00005C50 File Offset: 0x00003E50
public static ASN1 AlgorithmIdentifier(string oid)
{
ASN1 asn = new ASN1(48);
asn.Add(ASN1Convert.FromOid(oid));
asn.Add(new ASN1(5));
return asn;
}
// Token: 0x060000B2 RID: 178 RVA: 0x00005C80 File Offset: 0x00003E80
public static ASN1 AlgorithmIdentifier(string oid, ASN1 parameters)
{
ASN1 asn = new ASN1(48);
asn.Add(ASN1Convert.FromOid(oid));
asn.Add(parameters);
return asn;
}
// Token: 0x060000B3 RID: 179 RVA: 0x00005CAC File Offset: 0x00003EAC
public static ASN1 IssuerAndSerialNumber(X509Certificate x509)
{
ASN1 asn = null;
ASN1 asn2 = null;
ASN1 asn3 = new ASN1(x509.RawData);
int i = 0;
bool flag = false;
while (i < asn3[0].Count)
{
ASN1 asn4 = asn3[0][i++];
if (asn4.Tag == 2)
{
asn2 = asn4;
}
else if (asn4.Tag == 48)
{
if (flag)
{
asn = asn4;
break;
}
flag = true;
}
}
ASN1 asn5 = new ASN1(48);
asn5.Add(asn);
asn5.Add(asn2);
return asn5;
}
// Token: 0x02000012 RID: 18
public class Oid
{
// Token: 0x04000034 RID: 52
public const string rsaEncryption = "1.2.840.113549.1.1.1";
// Token: 0x04000035 RID: 53
public const string data = "1.2.840.113549.1.7.1";
// Token: 0x04000036 RID: 54
public const string signedData = "1.2.840.113549.1.7.2";
// Token: 0x04000037 RID: 55
public const string envelopedData = "1.2.840.113549.1.7.3";
// Token: 0x04000038 RID: 56
public const string signedAndEnvelopedData = "1.2.840.113549.1.7.4";
// Token: 0x04000039 RID: 57
public const string digestedData = "1.2.840.113549.1.7.5";
// Token: 0x0400003A RID: 58
public const string encryptedData = "1.2.840.113549.1.7.6";
// Token: 0x0400003B RID: 59
public const string contentType = "1.2.840.113549.1.9.3";
// Token: 0x0400003C RID: 60
public const string messageDigest = "1.2.840.113549.1.9.4";
// Token: 0x0400003D RID: 61
public const string signingTime = "1.2.840.113549.1.9.5";
// Token: 0x0400003E RID: 62
public const string countersignature = "1.2.840.113549.1.9.6";
}
// Token: 0x02000013 RID: 19
public class ContentInfo
{
// Token: 0x060000B5 RID: 181 RVA: 0x00005D54 File Offset: 0x00003F54
public ContentInfo()
{
this.content = new ASN1(160);
}
// Token: 0x060000B6 RID: 182 RVA: 0x00005D6C File Offset: 0x00003F6C
public ContentInfo(string oid)
: this()
{
this.contentType = oid;
}
// Token: 0x060000B7 RID: 183 RVA: 0x00005D7C File Offset: 0x00003F7C
public ContentInfo(byte[] data)
: this(new ASN1(data))
{
}
// Token: 0x060000B8 RID: 184 RVA: 0x00005D8C File Offset: 0x00003F8C
public ContentInfo(ASN1 asn1)
{
if (asn1.Tag != 48 || (asn1.Count < 1 && asn1.Count > 2))
{
throw new ArgumentException("Invalid ASN1");
}
if (asn1[0].Tag != 6)
{
throw new ArgumentException("Invalid contentType");
}
this.contentType = ASN1Convert.ToOid(asn1[0]);
if (asn1.Count > 1)
{
if (asn1[1].Tag != 160)
{
throw new ArgumentException("Invalid content");
}
this.content = asn1[1];
}
}
// Token: 0x1700000A RID: 10
// (get) Token: 0x060000B9 RID: 185 RVA: 0x00005E38 File Offset: 0x00004038
public ASN1 ASN1
{
get
{
return this.GetASN1();
}
}
// Token: 0x1700000B RID: 11
// (get) Token: 0x060000BA RID: 186 RVA: 0x00005E40 File Offset: 0x00004040
// (set) Token: 0x060000BB RID: 187 RVA: 0x00005E48 File Offset: 0x00004048
public ASN1 Content
{
get
{
return this.content;
}
set
{
this.content = value;
}
}
// Token: 0x1700000C RID: 12
// (get) Token: 0x060000BC RID: 188 RVA: 0x00005E54 File Offset: 0x00004054
// (set) Token: 0x060000BD RID: 189 RVA: 0x00005E5C File Offset: 0x0000405C
public string ContentType
{
get
{
return this.contentType;
}
set
{
this.contentType = value;
}
}
// Token: 0x060000BE RID: 190 RVA: 0x00005E68 File Offset: 0x00004068
internal ASN1 GetASN1()
{
ASN1 asn = new ASN1(48);
asn.Add(ASN1Convert.FromOid(this.contentType));
if (this.content != null && this.content.Count > 0)
{
asn.Add(this.content);
}
return asn;
}
// Token: 0x060000BF RID: 191 RVA: 0x00005EBC File Offset: 0x000040BC
public byte[] GetBytes()
{
return this.GetASN1().GetBytes();
}
// Token: 0x0400003F RID: 63
private string contentType;
// Token: 0x04000040 RID: 64
private ASN1 content;
}
// Token: 0x02000014 RID: 20
public class EncryptedData
{
// Token: 0x060000C0 RID: 192 RVA: 0x00005ECC File Offset: 0x000040CC
public EncryptedData()
{
this._version = 0;
}
// Token: 0x060000C1 RID: 193 RVA: 0x00005EDC File Offset: 0x000040DC
public EncryptedData(byte[] data)
: this(new ASN1(data))
{
}
// Token: 0x060000C2 RID: 194 RVA: 0x00005EEC File Offset: 0x000040EC
public EncryptedData(ASN1 asn1)
: this()
{
if (asn1.Tag != 48 || asn1.Count < 2)
{
throw new ArgumentException("Invalid EncryptedData");
}
if (asn1[0].Tag != 2)
{
throw new ArgumentException("Invalid version");
}
this._version = asn1[0].Value[0];
ASN1 asn2 = asn1[1];
if (asn2.Tag != 48)
{
throw new ArgumentException("missing EncryptedContentInfo");
}
ASN1 asn3 = asn2[0];
if (asn3.Tag != 6)
{
throw new ArgumentException("missing EncryptedContentInfo.ContentType");
}
this._content = new PKCS7.ContentInfo(ASN1Convert.ToOid(asn3));
ASN1 asn4 = asn2[1];
if (asn4.Tag != 48)
{
throw new ArgumentException("missing EncryptedContentInfo.ContentEncryptionAlgorithmIdentifier");
}
this._encryptionAlgorithm = new PKCS7.ContentInfo(ASN1Convert.ToOid(asn4[0]));
this._encryptionAlgorithm.Content = asn4[1];
ASN1 asn5 = asn2[2];
if (asn5.Tag != 128)
{
throw new ArgumentException("missing EncryptedContentInfo.EncryptedContent");
}
this._encrypted = asn5.Value;
}
// Token: 0x1700000D RID: 13
// (get) Token: 0x060000C3 RID: 195 RVA: 0x0000601C File Offset: 0x0000421C
public ASN1 ASN1
{
get
{
return this.GetASN1();
}
}
// Token: 0x1700000E RID: 14
// (get) Token: 0x060000C4 RID: 196 RVA: 0x00006024 File Offset: 0x00004224
public PKCS7.ContentInfo ContentInfo
{
get
{
return this._content;
}
}
// Token: 0x1700000F RID: 15
// (get) Token: 0x060000C5 RID: 197 RVA: 0x0000602C File Offset: 0x0000422C
public PKCS7.ContentInfo EncryptionAlgorithm
{
get
{
return this._encryptionAlgorithm;
}
}
// Token: 0x17000010 RID: 16
// (get) Token: 0x060000C6 RID: 198 RVA: 0x00006034 File Offset: 0x00004234
public byte[] EncryptedContent
{
get
{
if (this._encrypted == null)
{
return null;
}
return (byte[])this._encrypted.Clone();
}
}
// Token: 0x17000011 RID: 17
// (get) Token: 0x060000C7 RID: 199 RVA: 0x00006054 File Offset: 0x00004254
// (set) Token: 0x060000C8 RID: 200 RVA: 0x0000605C File Offset: 0x0000425C
public byte Version
{
get
{
return this._version;
}
set
{
this._version = value;
}
}
// Token: 0x060000C9 RID: 201 RVA: 0x00006068 File Offset: 0x00004268
internal ASN1 GetASN1()
{
return null;
}
// Token: 0x060000CA RID: 202 RVA: 0x0000606C File Offset: 0x0000426C
public byte[] GetBytes()
{
return this.GetASN1().GetBytes();
}
// Token: 0x04000041 RID: 65
private byte _version;
// Token: 0x04000042 RID: 66
private PKCS7.ContentInfo _content;
// Token: 0x04000043 RID: 67
private PKCS7.ContentInfo _encryptionAlgorithm;
// Token: 0x04000044 RID: 68
private byte[] _encrypted;
}
// Token: 0x02000015 RID: 21
public class EnvelopedData
{
// Token: 0x060000CB RID: 203 RVA: 0x0000607C File Offset: 0x0000427C
public EnvelopedData()
{
this._version = 0;
this._content = new PKCS7.ContentInfo();
this._encryptionAlgorithm = new PKCS7.ContentInfo();
this._recipientInfos = new ArrayList();
}
// Token: 0x060000CC RID: 204 RVA: 0x000060B8 File Offset: 0x000042B8
public EnvelopedData(byte[] data)
: this(new ASN1(data))
{
}
// Token: 0x060000CD RID: 205 RVA: 0x000060C8 File Offset: 0x000042C8
public EnvelopedData(ASN1 asn1)
: this()
{
if (asn1[0].Tag != 48 || asn1[0].Count < 3)
{
throw new ArgumentException("Invalid EnvelopedData");
}
if (asn1[0][0].Tag != 2)
{
throw new ArgumentException("Invalid version");
}
this._version = asn1[0][0].Value[0];
ASN1 asn2 = asn1[0][1];
if (asn2.Tag != 49)
{
throw new ArgumentException("missing RecipientInfos");
}
for (int i = 0; i < asn2.Count; i++)
{
ASN1 asn3 = asn2[i];
this._recipientInfos.Add(new PKCS7.RecipientInfo(asn3));
}
ASN1 asn4 = asn1[0][2];
if (asn4.Tag != 48)
{
throw new ArgumentException("missing EncryptedContentInfo");
}
ASN1 asn5 = asn4[0];
if (asn5.Tag != 6)
{
throw new ArgumentException("missing EncryptedContentInfo.ContentType");
}
this._content = new PKCS7.ContentInfo(ASN1Convert.ToOid(asn5));
ASN1 asn6 = asn4[1];
if (asn6.Tag != 48)
{
throw new ArgumentException("missing EncryptedContentInfo.ContentEncryptionAlgorithmIdentifier");
}
this._encryptionAlgorithm = new PKCS7.ContentInfo(ASN1Convert.ToOid(asn6[0]));
this._encryptionAlgorithm.Content = asn6[1];
ASN1 asn7 = asn4[2];
if (asn7.Tag != 128)
{
throw new ArgumentException("missing EncryptedContentInfo.EncryptedContent");
}
this._encrypted = asn7.Value;
}
// Token: 0x17000012 RID: 18
// (get) Token: 0x060000CE RID: 206 RVA: 0x00006278 File Offset: 0x00004478
public ArrayList RecipientInfos
{
get
{
return this._recipientInfos;
}
}
// Token: 0x17000013 RID: 19
// (get) Token: 0x060000CF RID: 207 RVA: 0x00006280 File Offset: 0x00004480
public ASN1 ASN1
{
get
{
return this.GetASN1();
}
}
// Token: 0x17000014 RID: 20
// (get) Token: 0x060000D0 RID: 208 RVA: 0x00006288 File Offset: 0x00004488
public PKCS7.ContentInfo ContentInfo
{
get
{
return this._content;
}
}
// Token: 0x17000015 RID: 21
// (get) Token: 0x060000D1 RID: 209 RVA: 0x00006290 File Offset: 0x00004490
public PKCS7.ContentInfo EncryptionAlgorithm
{
get
{
return this._encryptionAlgorithm;
}
}
// Token: 0x17000016 RID: 22
// (get) Token: 0x060000D2 RID: 210 RVA: 0x00006298 File Offset: 0x00004498
public byte[] EncryptedContent
{
get
{
if (this._encrypted == null)
{
return null;
}
return (byte[])this._encrypted.Clone();
}
}
// Token: 0x17000017 RID: 23
// (get) Token: 0x060000D3 RID: 211 RVA: 0x000062B8 File Offset: 0x000044B8
// (set) Token: 0x060000D4 RID: 212 RVA: 0x000062C0 File Offset: 0x000044C0
public byte Version
{
get
{
return this._version;
}
set
{
this._version = value;
}
}
// Token: 0x060000D5 RID: 213 RVA: 0x000062CC File Offset: 0x000044CC
internal ASN1 GetASN1()
{
return new ASN1(48);
}
// Token: 0x060000D6 RID: 214 RVA: 0x000062E4 File Offset: 0x000044E4
public byte[] GetBytes()
{
return this.GetASN1().GetBytes();
}
// Token: 0x04000045 RID: 69
private byte _version;
// Token: 0x04000046 RID: 70
private PKCS7.ContentInfo _content;
// Token: 0x04000047 RID: 71
private PKCS7.ContentInfo _encryptionAlgorithm;
// Token: 0x04000048 RID: 72
private ArrayList _recipientInfos;
// Token: 0x04000049 RID: 73
private byte[] _encrypted;
}
// Token: 0x02000016 RID: 22
public class RecipientInfo
{
// Token: 0x060000D7 RID: 215 RVA: 0x000062F4 File Offset: 0x000044F4
public RecipientInfo()
{
}
// Token: 0x060000D8 RID: 216 RVA: 0x000062FC File Offset: 0x000044FC
public RecipientInfo(ASN1 data)
{
if (data.Tag != 48)
{
throw new ArgumentException("Invalid RecipientInfo");
}
ASN1 asn = data[0];
if (asn.Tag != 2)
{
throw new ArgumentException("missing Version");
}
this._version = (int)asn.Value[0];
ASN1 asn2 = data[1];
if (asn2.Tag == 128 && this._version == 3)
{
this._ski = asn2.Value;
}
else
{
this._issuer = X501.ToString(asn2[0]);
this._serial = asn2[1].Value;
}
ASN1 asn3 = data[2];
this._oid = ASN1Convert.ToOid(asn3[0]);
ASN1 asn4 = data[3];
this._key = asn4.Value;
}
// Token: 0x17000018 RID: 24
// (get) Token: 0x060000D9 RID: 217 RVA: 0x000063DC File Offset: 0x000045DC
public string Oid
{
get
{
return this._oid;
}
}
// Token: 0x17000019 RID: 25
// (get) Token: 0x060000DA RID: 218 RVA: 0x000063E4 File Offset: 0x000045E4
public byte[] Key
{
get
{
if (this._key == null)
{
return null;
}
return (byte[])this._key.Clone();
}
}
// Token: 0x1700001A RID: 26
// (get) Token: 0x060000DB RID: 219 RVA: 0x00006404 File Offset: 0x00004604
public byte[] SubjectKeyIdentifier
{
get
{
if (this._ski == null)
{
return null;
}
return (byte[])this._ski.Clone();
}
}
// Token: 0x1700001B RID: 27
// (get) Token: 0x060000DC RID: 220 RVA: 0x00006424 File Offset: 0x00004624
public string Issuer
{
get
{
return this._issuer;
}
}
// Token: 0x1700001C RID: 28
// (get) Token: 0x060000DD RID: 221 RVA: 0x0000642C File Offset: 0x0000462C
public byte[] Serial
{
get
{
if (this._serial == null)
{
return null;
}
return (byte[])this._serial.Clone();
}
}
// Token: 0x1700001D RID: 29
// (get) Token: 0x060000DE RID: 222 RVA: 0x0000644C File Offset: 0x0000464C
public int Version
{
get
{
return this._version;
}
}
// Token: 0x0400004A RID: 74
private int _version;
// Token: 0x0400004B RID: 75
private string _oid;
// Token: 0x0400004C RID: 76
private byte[] _key;
// Token: 0x0400004D RID: 77
private byte[] _ski;
// Token: 0x0400004E RID: 78
private string _issuer;
// Token: 0x0400004F RID: 79
private byte[] _serial;
}
// Token: 0x02000017 RID: 23
public class SignedData
{
// Token: 0x060000DF RID: 223 RVA: 0x00006454 File Offset: 0x00004654
public SignedData()
{
this.version = 1;
this.contentInfo = new PKCS7.ContentInfo();
this.certs = new X509CertificateCollection();
this.crls = new ArrayList();
this.signerInfo = new PKCS7.SignerInfo();
this.mda = true;
this.signed = false;
}
// Token: 0x060000E0 RID: 224 RVA: 0x000064A8 File Offset: 0x000046A8
public SignedData(byte[] data)
: this(new ASN1(data))
{
}
// Token: 0x060000E1 RID: 225 RVA: 0x000064B8 File Offset: 0x000046B8
public SignedData(ASN1 asn1)
{
if (asn1[0].Tag != 48 || asn1[0].Count < 4)
{
throw new ArgumentException("Invalid SignedData");
}
if (asn1[0][0].Tag != 2)
{
throw new ArgumentException("Invalid version");
}
this.version = asn1[0][0].Value[0];
this.contentInfo = new PKCS7.ContentInfo(asn1[0][2]);
int num = 3;
this.certs = new X509CertificateCollection();
if (asn1[0][num].Tag == 160)
{
for (int i = 0; i < asn1[0][num].Count; i++)
{
this.certs.Add(new X509Certificate(asn1[0][num][i].GetBytes()));
}
num++;
}
this.crls = new ArrayList();
if (asn1[0][num].Tag == 161)
{
for (int j = 0; j < asn1[0][num].Count; j++)
{
this.crls.Add(asn1[0][num][j].GetBytes());
}
num++;
}
if (asn1[0][num].Count > 0)
{
this.signerInfo = new PKCS7.SignerInfo(asn1[0][num]);
}
else
{
this.signerInfo = new PKCS7.SignerInfo();
}
if (this.signerInfo.HashName != null)
{
this.HashName = this.OidToName(this.signerInfo.HashName);
}
this.mda = this.signerInfo.AuthenticatedAttributes.Count > 0;
}
// Token: 0x1700001E RID: 30
// (get) Token: 0x060000E2 RID: 226 RVA: 0x000066BC File Offset: 0x000048BC
public ASN1 ASN1
{
get
{
return this.GetASN1();
}
}
// Token: 0x1700001F RID: 31
// (get) Token: 0x060000E3 RID: 227 RVA: 0x000066C4 File Offset: 0x000048C4
public X509CertificateCollection Certificates
{
get
{
return this.certs;
}
}
// Token: 0x17000020 RID: 32
// (get) Token: 0x060000E4 RID: 228 RVA: 0x000066CC File Offset: 0x000048CC
public PKCS7.ContentInfo ContentInfo
{
get
{
return this.contentInfo;
}
}
// Token: 0x17000021 RID: 33
// (get) Token: 0x060000E5 RID: 229 RVA: 0x000066D4 File Offset: 0x000048D4
public ArrayList Crls
{
get
{
return this.crls;
}
}
// Token: 0x17000022 RID: 34
// (get) Token: 0x060000E6 RID: 230 RVA: 0x000066DC File Offset: 0x000048DC
// (set) Token: 0x060000E7 RID: 231 RVA: 0x000066E4 File Offset: 0x000048E4
public string HashName
{
get
{
return this.hashAlgorithm;
}
set
{
this.hashAlgorithm = value;
this.signerInfo.HashName = value;
}
}
// Token: 0x17000023 RID: 35
// (get) Token: 0x060000E8 RID: 232 RVA: 0x000066FC File Offset: 0x000048FC
public PKCS7.SignerInfo SignerInfo
{
get
{
return this.signerInfo;
}
}
// Token: 0x17000024 RID: 36
// (get) Token: 0x060000E9 RID: 233 RVA: 0x00006704 File Offset: 0x00004904
// (set) Token: 0x060000EA RID: 234 RVA: 0x0000670C File Offset: 0x0000490C
public byte Version
{
get
{
return this.version;
}
set
{
this.version = value;
}
}
// Token: 0x17000025 RID: 37
// (get) Token: 0x060000EB RID: 235 RVA: 0x00006718 File Offset: 0x00004918
// (set) Token: 0x060000EC RID: 236 RVA: 0x00006720 File Offset: 0x00004920
public bool UseAuthenticatedAttributes
{
get
{
return this.mda;
}
set
{
this.mda = value;
}
}
// Token: 0x060000ED RID: 237 RVA: 0x0000672C File Offset: 0x0000492C
public bool VerifySignature(AsymmetricAlgorithm aa)
{
if (aa == null)
{
return false;
}
RSAPKCS1SignatureDeformatter rsapkcs1SignatureDeformatter = new RSAPKCS1SignatureDeformatter(aa);
rsapkcs1SignatureDeformatter.SetHashAlgorithm(this.hashAlgorithm);
HashAlgorithm hashAlgorithm = HashAlgorithm.Create(this.hashAlgorithm);
byte[] signature = this.signerInfo.Signature;
byte[] array;
if (this.mda)
{
ASN1 asn = new ASN1(49);
foreach (object obj in this.signerInfo.AuthenticatedAttributes)
{
ASN1 asn2 = (ASN1)obj;
asn.Add(asn2);
}
array = hashAlgorithm.ComputeHash(asn.GetBytes());
}
else
{
array = hashAlgorithm.ComputeHash(this.contentInfo.Content[0].Value);
}
return array != null && signature != null && rsapkcs1SignatureDeformatter.VerifySignature(array, signature);
}
// Token: 0x060000EE RID: 238 RVA: 0x0000683C File Offset: 0x00004A3C
internal string OidToName(string oid)
{
switch (oid)
{
case "1.3.14.3.2.26":
return "SHA1";
case "1.2.840.113549.2.2":
return "MD2";
case "1.2.840.113549.2.5":
return "MD5";
case "2.16.840.1.101.3.4.1":
return "SHA256";
case "2.16.840.1.101.3.4.2":
return "SHA384";
case "2.16.840.1.101.3.4.3":
return "SHA512";
}
return oid;
}
// Token: 0x060000EF RID: 239 RVA: 0x00006910 File Offset: 0x00004B10
internal ASN1 GetASN1()
{
ASN1 asn = new ASN1(48);
byte[] array = new byte[] { this.version };
asn.Add(new ASN1(2, array));
ASN1 asn2 = asn.Add(new ASN1(49));
if (this.hashAlgorithm != null)
{
string text = CryptoConfig.MapNameToOID(this.hashAlgorithm);
asn2.Add(PKCS7.AlgorithmIdentifier(text));
}
ASN1 asn3 = this.contentInfo.ASN1;
asn.Add(asn3);
if (!this.signed && this.hashAlgorithm != null)
{
if (this.mda)
{
ASN1 asn4 = PKCS7.Attribute("1.2.840.113549.1.9.3", asn3[0]);
this.signerInfo.AuthenticatedAttributes.Add(asn4);
HashAlgorithm hashAlgorithm = HashAlgorithm.Create(this.hashAlgorithm);
byte[] array2 = hashAlgorithm.ComputeHash(asn3[1][0].Value);
ASN1 asn5 = new ASN1(48);
ASN1 asn6 = PKCS7.Attribute("1.2.840.113549.1.9.4", asn5.Add(new ASN1(4, array2)));
this.signerInfo.AuthenticatedAttributes.Add(asn6);
}
else
{
RSAPKCS1SignatureFormatter rsapkcs1SignatureFormatter = new RSAPKCS1SignatureFormatter(this.signerInfo.Key);
rsapkcs1SignatureFormatter.SetHashAlgorithm(this.hashAlgorithm);
HashAlgorithm hashAlgorithm2 = HashAlgorithm.Create(this.hashAlgorithm);
byte[] array3 = hashAlgorithm2.ComputeHash(asn3[1][0].Value);
this.signerInfo.Signature = rsapkcs1SignatureFormatter.CreateSignature(array3);
}
this.signed = true;
}
if (this.certs.Count > 0)
{
ASN1 asn7 = asn.Add(new ASN1(160));
foreach (X509Certificate x509Certificate in this.certs)
{
asn7.Add(new ASN1(x509Certificate.RawData));
}
}
if (this.crls.Count > 0)
{
ASN1 asn8 = asn.Add(new ASN1(161));
foreach (object obj in this.crls)
{
byte[] array4 = (byte[])obj;
asn8.Add(new ASN1(array4));
}
}
ASN1 asn9 = asn.Add(new ASN1(49));
if (this.signerInfo.Key != null)
{
asn9.Add(this.signerInfo.ASN1);
}
return asn;
}
// Token: 0x060000F0 RID: 240 RVA: 0x00006BF4 File Offset: 0x00004DF4
public byte[] GetBytes()
{
return this.GetASN1().GetBytes();
}
// Token: 0x04000050 RID: 80
private byte version;
// Token: 0x04000051 RID: 81
private string hashAlgorithm;
// Token: 0x04000052 RID: 82
private PKCS7.ContentInfo contentInfo;
// Token: 0x04000053 RID: 83
private X509CertificateCollection certs;
// Token: 0x04000054 RID: 84
private ArrayList crls;
// Token: 0x04000055 RID: 85
private PKCS7.SignerInfo signerInfo;
// Token: 0x04000056 RID: 86
private bool mda;
// Token: 0x04000057 RID: 87
private bool signed;
}
// Token: 0x02000018 RID: 24
public class SignerInfo
{
// Token: 0x060000F1 RID: 241 RVA: 0x00006C04 File Offset: 0x00004E04
public SignerInfo()
{
this.version = 1;
this.authenticatedAttributes = new ArrayList();
this.unauthenticatedAttributes = new ArrayList();
}
// Token: 0x060000F2 RID: 242 RVA: 0x00006C2C File Offset: 0x00004E2C
public SignerInfo(byte[] data)
: this(new ASN1(data))
{
}
// Token: 0x060000F3 RID: 243 RVA: 0x00006C3C File Offset: 0x00004E3C
public SignerInfo(ASN1 asn1)
: this()
{
if (asn1[0].Tag != 48 || asn1[0].Count < 5)
{
throw new ArgumentException("Invalid SignedData");
}
if (asn1[0][0].Tag != 2)
{
throw new ArgumentException("Invalid version");
}
this.version = asn1[0][0].Value[0];
ASN1 asn2 = asn1[0][1];
if (asn2.Tag == 128 && this.version == 3)
{
this.ski = asn2.Value;
}
else
{
this.issuer = X501.ToString(asn2[0]);
this.serial = asn2[1].Value;
}
ASN1 asn3 = asn1[0][2];
this.hashAlgorithm = ASN1Convert.ToOid(asn3[0]);
int num = 3;
ASN1 asn4 = asn1[0][num];
if (asn4.Tag == 160)
{
num++;
for (int i = 0; i < asn4.Count; i++)
{
this.authenticatedAttributes.Add(asn4[i]);
}
}
num++;
ASN1 asn5 = asn1[0][num++];
if (asn5.Tag == 4)
{
this.signature = asn5.Value;
}
ASN1 asn6 = asn1[0][num];
if (asn6 != null && asn6.Tag == 161)
{
for (int j = 0; j < asn6.Count; j++)
{
this.unauthenticatedAttributes.Add(asn6[j]);
}
}
}
// Token: 0x17000026 RID: 38
// (get) Token: 0x060000F4 RID: 244 RVA: 0x00006E18 File Offset: 0x00005018
public string IssuerName
{
get
{
return this.issuer;
}
}
// Token: 0x17000027 RID: 39
// (get) Token: 0x060000F5 RID: 245 RVA: 0x00006E20 File Offset: 0x00005020
public byte[] SerialNumber
{
get
{
if (this.serial == null)
{
return null;
}
return (byte[])this.serial.Clone();
}
}
// Token: 0x17000028 RID: 40
// (get) Token: 0x060000F6 RID: 246 RVA: 0x00006E40 File Offset: 0x00005040
public byte[] SubjectKeyIdentifier
{
get
{
if (this.ski == null)
{
return null;
}
return (byte[])this.ski.Clone();
}
}
// Token: 0x17000029 RID: 41
// (get) Token: 0x060000F7 RID: 247 RVA: 0x00006E60 File Offset: 0x00005060
public ASN1 ASN1
{
get
{
return this.GetASN1();
}
}
// Token: 0x1700002A RID: 42
// (get) Token: 0x060000F8 RID: 248 RVA: 0x00006E68 File Offset: 0x00005068
public ArrayList AuthenticatedAttributes
{
get
{
return this.authenticatedAttributes;
}
}
// Token: 0x1700002B RID: 43
// (get) Token: 0x060000F9 RID: 249 RVA: 0x00006E70 File Offset: 0x00005070
// (set) Token: 0x060000FA RID: 250 RVA: 0x00006E78 File Offset: 0x00005078
public X509Certificate Certificate
{
get
{
return this.x509;
}
set
{
this.x509 = value;
}
}
// Token: 0x1700002C RID: 44
// (get) Token: 0x060000FB RID: 251 RVA: 0x00006E84 File Offset: 0x00005084
// (set) Token: 0x060000FC RID: 252 RVA: 0x00006E8C File Offset: 0x0000508C
public string HashName
{
get
{
return this.hashAlgorithm;
}
set
{
this.hashAlgorithm = value;
}
}
// Token: 0x1700002D RID: 45
// (get) Token: 0x060000FD RID: 253 RVA: 0x00006E98 File Offset: 0x00005098
// (set) Token: 0x060000FE RID: 254 RVA: 0x00006EA0 File Offset: 0x000050A0
public AsymmetricAlgorithm Key
{
get
{
return this.key;
}
set
{
this.key = value;
}
}
// Token: 0x1700002E RID: 46
// (get) Token: 0x060000FF RID: 255 RVA: 0x00006EAC File Offset: 0x000050AC
// (set) Token: 0x06000100 RID: 256 RVA: 0x00006ECC File Offset: 0x000050CC
public byte[] Signature
{
get
{
if (this.signature == null)
{
return null;
}
return (byte[])this.signature.Clone();
}
set
{
if (value != null)
{
this.signature = (byte[])value.Clone();
}
}
}
// Token: 0x1700002F RID: 47
// (get) Token: 0x06000101 RID: 257 RVA: 0x00006EE8 File Offset: 0x000050E8
public ArrayList UnauthenticatedAttributes
{
get
{
return this.unauthenticatedAttributes;
}
}
// Token: 0x17000030 RID: 48
// (get) Token: 0x06000102 RID: 258 RVA: 0x00006EF0 File Offset: 0x000050F0
// (set) Token: 0x06000103 RID: 259 RVA: 0x00006EF8 File Offset: 0x000050F8
public byte Version
{
get
{
return this.version;
}
set
{
this.version = value;
}
}
// Token: 0x06000104 RID: 260 RVA: 0x00006F04 File Offset: 0x00005104
internal ASN1 GetASN1()
{
if (this.key == null || this.hashAlgorithm == null)
{
return null;
}
byte[] array = new byte[] { this.version };
ASN1 asn = new ASN1(48);
asn.Add(new ASN1(2, array));
asn.Add(PKCS7.IssuerAndSerialNumber(this.x509));
string text = CryptoConfig.MapNameToOID(this.hashAlgorithm);
asn.Add(PKCS7.AlgorithmIdentifier(text));
ASN1 asn2 = null;
if (this.authenticatedAttributes.Count > 0)
{
asn2 = asn.Add(new ASN1(160));
this.authenticatedAttributes.Sort(new PKCS7.SortedSet());
foreach (object obj in this.authenticatedAttributes)
{
ASN1 asn3 = (ASN1)obj;
asn2.Add(asn3);
}
}
if (this.key is RSA)
{
asn.Add(PKCS7.AlgorithmIdentifier("1.2.840.113549.1.1.1"));
if (asn2 != null)
{
RSAPKCS1SignatureFormatter rsapkcs1SignatureFormatter = new RSAPKCS1SignatureFormatter(this.key);
rsapkcs1SignatureFormatter.SetHashAlgorithm(this.hashAlgorithm);
byte[] bytes = asn2.GetBytes();
bytes[0] = 49;
HashAlgorithm hashAlgorithm = HashAlgorithm.Create(this.hashAlgorithm);
byte[] array2 = hashAlgorithm.ComputeHash(bytes);
this.signature = rsapkcs1SignatureFormatter.CreateSignature(array2);
}
asn.Add(new ASN1(4, this.signature));
if (this.unauthenticatedAttributes.Count > 0)
{
ASN1 asn4 = asn.Add(new ASN1(161));
this.unauthenticatedAttributes.Sort(new PKCS7.SortedSet());
foreach (object obj2 in this.unauthenticatedAttributes)
{
ASN1 asn5 = (ASN1)obj2;
asn4.Add(asn5);
}
}
return asn;
}
if (this.key is DSA)
{
throw new NotImplementedException("not yet");
}
throw new CryptographicException("Unknown assymetric algorithm");
}
// Token: 0x06000105 RID: 261 RVA: 0x0000716C File Offset: 0x0000536C
public byte[] GetBytes()
{
return this.GetASN1().GetBytes();
}
// Token: 0x04000059 RID: 89
private byte version;
// Token: 0x0400005A RID: 90
private X509Certificate x509;
// Token: 0x0400005B RID: 91
private string hashAlgorithm;
// Token: 0x0400005C RID: 92
private AsymmetricAlgorithm key;
// Token: 0x0400005D RID: 93
private ArrayList authenticatedAttributes;
// Token: 0x0400005E RID: 94
private ArrayList unauthenticatedAttributes;
// Token: 0x0400005F RID: 95
private byte[] signature;
// Token: 0x04000060 RID: 96
private string issuer;
// Token: 0x04000061 RID: 97
private byte[] serial;
// Token: 0x04000062 RID: 98
private byte[] ski;
}
// Token: 0x02000019 RID: 25
internal class SortedSet : IComparer
{
// Token: 0x06000107 RID: 263 RVA: 0x00007184 File Offset: 0x00005384
public int Compare(object x, object y)
{
if (x == null)
{
return (y != null) ? (-1) : 0;
}
if (y == null)
{
return 1;
}
ASN1 asn = x as ASN1;
ASN1 asn2 = y as ASN1;
if (asn == null || asn2 == null)
{
throw new ArgumentException(Locale.GetText("Invalid objects."));
}
byte[] bytes = asn.GetBytes();
byte[] bytes2 = asn2.GetBytes();
for (int i = 0; i < bytes.Length; i++)
{
if (i == bytes2.Length)
{
break;
}
if (bytes[i] != bytes2[i])
{
return (bytes[i] >= bytes2[i]) ? 1 : (-1);
}
}
if (bytes.Length > bytes2.Length)
{
return 1;
}
if (bytes.Length < bytes2.Length)
{
return -1;
}
return 0;
}
}
}
}