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

1268 lines
30 KiB
C#

using System;
using System.Collections;
using System.Security.Cryptography;
using Mono.Security.X509;
namespace Mono.Security
{
// Token: 0x020000DD RID: 221
internal sealed class PKCS7
{
// Token: 0x06000B10 RID: 2832 RVA: 0x00030E6C File Offset: 0x0002F06C
private PKCS7()
{
}
// Token: 0x06000B11 RID: 2833 RVA: 0x00030E74 File Offset: 0x0002F074
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: 0x06000B12 RID: 2834 RVA: 0x00030EB0 File Offset: 0x0002F0B0
public static ASN1 AlgorithmIdentifier(string oid)
{
ASN1 asn = new ASN1(48);
asn.Add(ASN1Convert.FromOid(oid));
asn.Add(new ASN1(5));
return asn;
}
// Token: 0x06000B13 RID: 2835 RVA: 0x00030EE0 File Offset: 0x0002F0E0
public static ASN1 AlgorithmIdentifier(string oid, ASN1 parameters)
{
ASN1 asn = new ASN1(48);
asn.Add(ASN1Convert.FromOid(oid));
asn.Add(parameters);
return asn;
}
// Token: 0x06000B14 RID: 2836 RVA: 0x00030F0C File Offset: 0x0002F10C
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: 0x020000DE RID: 222
public class Oid
{
// Token: 0x040002D7 RID: 727
public const string rsaEncryption = "1.2.840.113549.1.1.1";
// Token: 0x040002D8 RID: 728
public const string data = "1.2.840.113549.1.7.1";
// Token: 0x040002D9 RID: 729
public const string signedData = "1.2.840.113549.1.7.2";
// Token: 0x040002DA RID: 730
public const string envelopedData = "1.2.840.113549.1.7.3";
// Token: 0x040002DB RID: 731
public const string signedAndEnvelopedData = "1.2.840.113549.1.7.4";
// Token: 0x040002DC RID: 732
public const string digestedData = "1.2.840.113549.1.7.5";
// Token: 0x040002DD RID: 733
public const string encryptedData = "1.2.840.113549.1.7.6";
// Token: 0x040002DE RID: 734
public const string contentType = "1.2.840.113549.1.9.3";
// Token: 0x040002DF RID: 735
public const string messageDigest = "1.2.840.113549.1.9.4";
// Token: 0x040002E0 RID: 736
public const string signingTime = "1.2.840.113549.1.9.5";
// Token: 0x040002E1 RID: 737
public const string countersignature = "1.2.840.113549.1.9.6";
}
// Token: 0x020000DF RID: 223
public class ContentInfo
{
// Token: 0x06000B16 RID: 2838 RVA: 0x00030FB4 File Offset: 0x0002F1B4
public ContentInfo()
{
this.content = new ASN1(160);
}
// Token: 0x06000B17 RID: 2839 RVA: 0x00030FCC File Offset: 0x0002F1CC
public ContentInfo(string oid)
: this()
{
this.contentType = oid;
}
// Token: 0x06000B18 RID: 2840 RVA: 0x00030FDC File Offset: 0x0002F1DC
public ContentInfo(byte[] data)
: this(new ASN1(data))
{
}
// Token: 0x06000B19 RID: 2841 RVA: 0x00030FEC File Offset: 0x0002F1EC
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: 0x17000173 RID: 371
// (get) Token: 0x06000B1A RID: 2842 RVA: 0x00031098 File Offset: 0x0002F298
public ASN1 ASN1
{
get
{
return this.GetASN1();
}
}
// Token: 0x17000174 RID: 372
// (get) Token: 0x06000B1B RID: 2843 RVA: 0x000310A0 File Offset: 0x0002F2A0
// (set) Token: 0x06000B1C RID: 2844 RVA: 0x000310A8 File Offset: 0x0002F2A8
public ASN1 Content
{
get
{
return this.content;
}
set
{
this.content = value;
}
}
// Token: 0x17000175 RID: 373
// (get) Token: 0x06000B1D RID: 2845 RVA: 0x000310B4 File Offset: 0x0002F2B4
// (set) Token: 0x06000B1E RID: 2846 RVA: 0x000310BC File Offset: 0x0002F2BC
public string ContentType
{
get
{
return this.contentType;
}
set
{
this.contentType = value;
}
}
// Token: 0x06000B1F RID: 2847 RVA: 0x000310C8 File Offset: 0x0002F2C8
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: 0x06000B20 RID: 2848 RVA: 0x0003111C File Offset: 0x0002F31C
public byte[] GetBytes()
{
return this.GetASN1().GetBytes();
}
// Token: 0x040002E2 RID: 738
private string contentType;
// Token: 0x040002E3 RID: 739
private ASN1 content;
}
// Token: 0x020000E0 RID: 224
public class EncryptedData
{
// Token: 0x06000B21 RID: 2849 RVA: 0x0003112C File Offset: 0x0002F32C
public EncryptedData()
{
this._version = 0;
}
// Token: 0x06000B22 RID: 2850 RVA: 0x0003113C File Offset: 0x0002F33C
public EncryptedData(byte[] data)
: this(new ASN1(data))
{
}
// Token: 0x06000B23 RID: 2851 RVA: 0x0003114C File Offset: 0x0002F34C
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: 0x17000176 RID: 374
// (get) Token: 0x06000B24 RID: 2852 RVA: 0x0003127C File Offset: 0x0002F47C
public ASN1 ASN1
{
get
{
return this.GetASN1();
}
}
// Token: 0x17000177 RID: 375
// (get) Token: 0x06000B25 RID: 2853 RVA: 0x00031284 File Offset: 0x0002F484
public PKCS7.ContentInfo ContentInfo
{
get
{
return this._content;
}
}
// Token: 0x17000178 RID: 376
// (get) Token: 0x06000B26 RID: 2854 RVA: 0x0003128C File Offset: 0x0002F48C
public PKCS7.ContentInfo EncryptionAlgorithm
{
get
{
return this._encryptionAlgorithm;
}
}
// Token: 0x17000179 RID: 377
// (get) Token: 0x06000B27 RID: 2855 RVA: 0x00031294 File Offset: 0x0002F494
public byte[] EncryptedContent
{
get
{
if (this._encrypted == null)
{
return null;
}
return (byte[])this._encrypted.Clone();
}
}
// Token: 0x1700017A RID: 378
// (get) Token: 0x06000B28 RID: 2856 RVA: 0x000312B4 File Offset: 0x0002F4B4
// (set) Token: 0x06000B29 RID: 2857 RVA: 0x000312BC File Offset: 0x0002F4BC
public byte Version
{
get
{
return this._version;
}
set
{
this._version = value;
}
}
// Token: 0x06000B2A RID: 2858 RVA: 0x000312C8 File Offset: 0x0002F4C8
internal ASN1 GetASN1()
{
return null;
}
// Token: 0x06000B2B RID: 2859 RVA: 0x000312CC File Offset: 0x0002F4CC
public byte[] GetBytes()
{
return this.GetASN1().GetBytes();
}
// Token: 0x040002E4 RID: 740
private byte _version;
// Token: 0x040002E5 RID: 741
private PKCS7.ContentInfo _content;
// Token: 0x040002E6 RID: 742
private PKCS7.ContentInfo _encryptionAlgorithm;
// Token: 0x040002E7 RID: 743
private byte[] _encrypted;
}
// Token: 0x020000E1 RID: 225
public class EnvelopedData
{
// Token: 0x06000B2C RID: 2860 RVA: 0x000312DC File Offset: 0x0002F4DC
public EnvelopedData()
{
this._version = 0;
this._content = new PKCS7.ContentInfo();
this._encryptionAlgorithm = new PKCS7.ContentInfo();
this._recipientInfos = new ArrayList();
}
// Token: 0x06000B2D RID: 2861 RVA: 0x00031318 File Offset: 0x0002F518
public EnvelopedData(byte[] data)
: this(new ASN1(data))
{
}
// Token: 0x06000B2E RID: 2862 RVA: 0x00031328 File Offset: 0x0002F528
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: 0x1700017B RID: 379
// (get) Token: 0x06000B2F RID: 2863 RVA: 0x000314D8 File Offset: 0x0002F6D8
public ArrayList RecipientInfos
{
get
{
return this._recipientInfos;
}
}
// Token: 0x1700017C RID: 380
// (get) Token: 0x06000B30 RID: 2864 RVA: 0x000314E0 File Offset: 0x0002F6E0
public ASN1 ASN1
{
get
{
return this.GetASN1();
}
}
// Token: 0x1700017D RID: 381
// (get) Token: 0x06000B31 RID: 2865 RVA: 0x000314E8 File Offset: 0x0002F6E8
public PKCS7.ContentInfo ContentInfo
{
get
{
return this._content;
}
}
// Token: 0x1700017E RID: 382
// (get) Token: 0x06000B32 RID: 2866 RVA: 0x000314F0 File Offset: 0x0002F6F0
public PKCS7.ContentInfo EncryptionAlgorithm
{
get
{
return this._encryptionAlgorithm;
}
}
// Token: 0x1700017F RID: 383
// (get) Token: 0x06000B33 RID: 2867 RVA: 0x000314F8 File Offset: 0x0002F6F8
public byte[] EncryptedContent
{
get
{
if (this._encrypted == null)
{
return null;
}
return (byte[])this._encrypted.Clone();
}
}
// Token: 0x17000180 RID: 384
// (get) Token: 0x06000B34 RID: 2868 RVA: 0x00031518 File Offset: 0x0002F718
// (set) Token: 0x06000B35 RID: 2869 RVA: 0x00031520 File Offset: 0x0002F720
public byte Version
{
get
{
return this._version;
}
set
{
this._version = value;
}
}
// Token: 0x06000B36 RID: 2870 RVA: 0x0003152C File Offset: 0x0002F72C
internal ASN1 GetASN1()
{
return new ASN1(48);
}
// Token: 0x06000B37 RID: 2871 RVA: 0x00031544 File Offset: 0x0002F744
public byte[] GetBytes()
{
return this.GetASN1().GetBytes();
}
// Token: 0x040002E8 RID: 744
private byte _version;
// Token: 0x040002E9 RID: 745
private PKCS7.ContentInfo _content;
// Token: 0x040002EA RID: 746
private PKCS7.ContentInfo _encryptionAlgorithm;
// Token: 0x040002EB RID: 747
private ArrayList _recipientInfos;
// Token: 0x040002EC RID: 748
private byte[] _encrypted;
}
// Token: 0x020000E2 RID: 226
public class RecipientInfo
{
// Token: 0x06000B38 RID: 2872 RVA: 0x00031554 File Offset: 0x0002F754
public RecipientInfo()
{
}
// Token: 0x06000B39 RID: 2873 RVA: 0x0003155C File Offset: 0x0002F75C
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: 0x17000181 RID: 385
// (get) Token: 0x06000B3A RID: 2874 RVA: 0x0003163C File Offset: 0x0002F83C
public string Oid
{
get
{
return this._oid;
}
}
// Token: 0x17000182 RID: 386
// (get) Token: 0x06000B3B RID: 2875 RVA: 0x00031644 File Offset: 0x0002F844
public byte[] Key
{
get
{
if (this._key == null)
{
return null;
}
return (byte[])this._key.Clone();
}
}
// Token: 0x17000183 RID: 387
// (get) Token: 0x06000B3C RID: 2876 RVA: 0x00031664 File Offset: 0x0002F864
public byte[] SubjectKeyIdentifier
{
get
{
if (this._ski == null)
{
return null;
}
return (byte[])this._ski.Clone();
}
}
// Token: 0x17000184 RID: 388
// (get) Token: 0x06000B3D RID: 2877 RVA: 0x00031684 File Offset: 0x0002F884
public string Issuer
{
get
{
return this._issuer;
}
}
// Token: 0x17000185 RID: 389
// (get) Token: 0x06000B3E RID: 2878 RVA: 0x0003168C File Offset: 0x0002F88C
public byte[] Serial
{
get
{
if (this._serial == null)
{
return null;
}
return (byte[])this._serial.Clone();
}
}
// Token: 0x17000186 RID: 390
// (get) Token: 0x06000B3F RID: 2879 RVA: 0x000316AC File Offset: 0x0002F8AC
public int Version
{
get
{
return this._version;
}
}
// Token: 0x040002ED RID: 749
private int _version;
// Token: 0x040002EE RID: 750
private string _oid;
// Token: 0x040002EF RID: 751
private byte[] _key;
// Token: 0x040002F0 RID: 752
private byte[] _ski;
// Token: 0x040002F1 RID: 753
private string _issuer;
// Token: 0x040002F2 RID: 754
private byte[] _serial;
}
// Token: 0x020000E3 RID: 227
public class SignedData
{
// Token: 0x06000B40 RID: 2880 RVA: 0x000316B4 File Offset: 0x0002F8B4
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: 0x06000B41 RID: 2881 RVA: 0x00031708 File Offset: 0x0002F908
public SignedData(byte[] data)
: this(new ASN1(data))
{
}
// Token: 0x06000B42 RID: 2882 RVA: 0x00031718 File Offset: 0x0002F918
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: 0x17000187 RID: 391
// (get) Token: 0x06000B43 RID: 2883 RVA: 0x0003191C File Offset: 0x0002FB1C
public ASN1 ASN1
{
get
{
return this.GetASN1();
}
}
// Token: 0x17000188 RID: 392
// (get) Token: 0x06000B44 RID: 2884 RVA: 0x00031924 File Offset: 0x0002FB24
public X509CertificateCollection Certificates
{
get
{
return this.certs;
}
}
// Token: 0x17000189 RID: 393
// (get) Token: 0x06000B45 RID: 2885 RVA: 0x0003192C File Offset: 0x0002FB2C
public PKCS7.ContentInfo ContentInfo
{
get
{
return this.contentInfo;
}
}
// Token: 0x1700018A RID: 394
// (get) Token: 0x06000B46 RID: 2886 RVA: 0x00031934 File Offset: 0x0002FB34
public ArrayList Crls
{
get
{
return this.crls;
}
}
// Token: 0x1700018B RID: 395
// (get) Token: 0x06000B47 RID: 2887 RVA: 0x0003193C File Offset: 0x0002FB3C
// (set) Token: 0x06000B48 RID: 2888 RVA: 0x00031944 File Offset: 0x0002FB44
public string HashName
{
get
{
return this.hashAlgorithm;
}
set
{
this.hashAlgorithm = value;
this.signerInfo.HashName = value;
}
}
// Token: 0x1700018C RID: 396
// (get) Token: 0x06000B49 RID: 2889 RVA: 0x0003195C File Offset: 0x0002FB5C
public PKCS7.SignerInfo SignerInfo
{
get
{
return this.signerInfo;
}
}
// Token: 0x1700018D RID: 397
// (get) Token: 0x06000B4A RID: 2890 RVA: 0x00031964 File Offset: 0x0002FB64
// (set) Token: 0x06000B4B RID: 2891 RVA: 0x0003196C File Offset: 0x0002FB6C
public byte Version
{
get
{
return this.version;
}
set
{
this.version = value;
}
}
// Token: 0x1700018E RID: 398
// (get) Token: 0x06000B4C RID: 2892 RVA: 0x00031978 File Offset: 0x0002FB78
// (set) Token: 0x06000B4D RID: 2893 RVA: 0x00031980 File Offset: 0x0002FB80
public bool UseAuthenticatedAttributes
{
get
{
return this.mda;
}
set
{
this.mda = value;
}
}
// Token: 0x06000B4E RID: 2894 RVA: 0x0003198C File Offset: 0x0002FB8C
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: 0x06000B4F RID: 2895 RVA: 0x00031A9C File Offset: 0x0002FC9C
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: 0x06000B50 RID: 2896 RVA: 0x00031B70 File Offset: 0x0002FD70
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: 0x06000B51 RID: 2897 RVA: 0x00031E54 File Offset: 0x00030054
public byte[] GetBytes()
{
return this.GetASN1().GetBytes();
}
// Token: 0x040002F3 RID: 755
private byte version;
// Token: 0x040002F4 RID: 756
private string hashAlgorithm;
// Token: 0x040002F5 RID: 757
private PKCS7.ContentInfo contentInfo;
// Token: 0x040002F6 RID: 758
private X509CertificateCollection certs;
// Token: 0x040002F7 RID: 759
private ArrayList crls;
// Token: 0x040002F8 RID: 760
private PKCS7.SignerInfo signerInfo;
// Token: 0x040002F9 RID: 761
private bool mda;
// Token: 0x040002FA RID: 762
private bool signed;
}
// Token: 0x020000E4 RID: 228
public class SignerInfo
{
// Token: 0x06000B52 RID: 2898 RVA: 0x00031E64 File Offset: 0x00030064
public SignerInfo()
{
this.version = 1;
this.authenticatedAttributes = new ArrayList();
this.unauthenticatedAttributes = new ArrayList();
}
// Token: 0x06000B53 RID: 2899 RVA: 0x00031E8C File Offset: 0x0003008C
public SignerInfo(byte[] data)
: this(new ASN1(data))
{
}
// Token: 0x06000B54 RID: 2900 RVA: 0x00031E9C File Offset: 0x0003009C
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: 0x1700018F RID: 399
// (get) Token: 0x06000B55 RID: 2901 RVA: 0x00032078 File Offset: 0x00030278
public string IssuerName
{
get
{
return this.issuer;
}
}
// Token: 0x17000190 RID: 400
// (get) Token: 0x06000B56 RID: 2902 RVA: 0x00032080 File Offset: 0x00030280
public byte[] SerialNumber
{
get
{
if (this.serial == null)
{
return null;
}
return (byte[])this.serial.Clone();
}
}
// Token: 0x17000191 RID: 401
// (get) Token: 0x06000B57 RID: 2903 RVA: 0x000320A0 File Offset: 0x000302A0
public byte[] SubjectKeyIdentifier
{
get
{
if (this.ski == null)
{
return null;
}
return (byte[])this.ski.Clone();
}
}
// Token: 0x17000192 RID: 402
// (get) Token: 0x06000B58 RID: 2904 RVA: 0x000320C0 File Offset: 0x000302C0
public ASN1 ASN1
{
get
{
return this.GetASN1();
}
}
// Token: 0x17000193 RID: 403
// (get) Token: 0x06000B59 RID: 2905 RVA: 0x000320C8 File Offset: 0x000302C8
public ArrayList AuthenticatedAttributes
{
get
{
return this.authenticatedAttributes;
}
}
// Token: 0x17000194 RID: 404
// (get) Token: 0x06000B5A RID: 2906 RVA: 0x000320D0 File Offset: 0x000302D0
// (set) Token: 0x06000B5B RID: 2907 RVA: 0x000320D8 File Offset: 0x000302D8
public X509Certificate Certificate
{
get
{
return this.x509;
}
set
{
this.x509 = value;
}
}
// Token: 0x17000195 RID: 405
// (get) Token: 0x06000B5C RID: 2908 RVA: 0x000320E4 File Offset: 0x000302E4
// (set) Token: 0x06000B5D RID: 2909 RVA: 0x000320EC File Offset: 0x000302EC
public string HashName
{
get
{
return this.hashAlgorithm;
}
set
{
this.hashAlgorithm = value;
}
}
// Token: 0x17000196 RID: 406
// (get) Token: 0x06000B5E RID: 2910 RVA: 0x000320F8 File Offset: 0x000302F8
// (set) Token: 0x06000B5F RID: 2911 RVA: 0x00032100 File Offset: 0x00030300
public AsymmetricAlgorithm Key
{
get
{
return this.key;
}
set
{
this.key = value;
}
}
// Token: 0x17000197 RID: 407
// (get) Token: 0x06000B60 RID: 2912 RVA: 0x0003210C File Offset: 0x0003030C
// (set) Token: 0x06000B61 RID: 2913 RVA: 0x0003212C File Offset: 0x0003032C
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: 0x17000198 RID: 408
// (get) Token: 0x06000B62 RID: 2914 RVA: 0x00032148 File Offset: 0x00030348
public ArrayList UnauthenticatedAttributes
{
get
{
return this.unauthenticatedAttributes;
}
}
// Token: 0x17000199 RID: 409
// (get) Token: 0x06000B63 RID: 2915 RVA: 0x00032150 File Offset: 0x00030350
// (set) Token: 0x06000B64 RID: 2916 RVA: 0x00032158 File Offset: 0x00030358
public byte Version
{
get
{
return this.version;
}
set
{
this.version = value;
}
}
// Token: 0x06000B65 RID: 2917 RVA: 0x00032164 File Offset: 0x00030364
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));
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));
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: 0x06000B66 RID: 2918 RVA: 0x000323AC File Offset: 0x000305AC
public byte[] GetBytes()
{
return this.GetASN1().GetBytes();
}
// Token: 0x040002FC RID: 764
private byte version;
// Token: 0x040002FD RID: 765
private X509Certificate x509;
// Token: 0x040002FE RID: 766
private string hashAlgorithm;
// Token: 0x040002FF RID: 767
private AsymmetricAlgorithm key;
// Token: 0x04000300 RID: 768
private ArrayList authenticatedAttributes;
// Token: 0x04000301 RID: 769
private ArrayList unauthenticatedAttributes;
// Token: 0x04000302 RID: 770
private byte[] signature;
// Token: 0x04000303 RID: 771
private string issuer;
// Token: 0x04000304 RID: 772
private byte[] serial;
// Token: 0x04000305 RID: 773
private byte[] ski;
}
}
}