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; } } } }