1268 lines
30 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|