Files
Dec2017-Script-Dump/Mono.Security/Security/Authenticode/PrivateKey.cs
T
2026-06-04 11:42:34 +02:00

267 lines
7.0 KiB
C#

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using Mono.Security.Cryptography;
namespace Mono.Security.Authenticode
{
// Token: 0x02000022 RID: 34
public class PrivateKey
{
// Token: 0x06000169 RID: 361 RVA: 0x00009A30 File Offset: 0x00007C30
public PrivateKey()
{
this.keyType = 2;
}
// Token: 0x0600016A RID: 362 RVA: 0x00009A40 File Offset: 0x00007C40
public PrivateKey(byte[] data, string password)
{
if (data == null)
{
throw new ArgumentNullException("data");
}
if (!this.Decode(data, password))
{
throw new CryptographicException(Locale.GetText("Invalid data and/or password"));
}
}
// Token: 0x17000052 RID: 82
// (get) Token: 0x0600016B RID: 363 RVA: 0x00009A84 File Offset: 0x00007C84
public bool Encrypted
{
get
{
return this.encrypted;
}
}
// Token: 0x17000053 RID: 83
// (get) Token: 0x0600016C RID: 364 RVA: 0x00009A8C File Offset: 0x00007C8C
// (set) Token: 0x0600016D RID: 365 RVA: 0x00009A94 File Offset: 0x00007C94
public int KeyType
{
get
{
return this.keyType;
}
set
{
this.keyType = value;
}
}
// Token: 0x17000054 RID: 84
// (get) Token: 0x0600016E RID: 366 RVA: 0x00009AA0 File Offset: 0x00007CA0
// (set) Token: 0x0600016F RID: 367 RVA: 0x00009AA8 File Offset: 0x00007CA8
public RSA RSA
{
get
{
return this.rsa;
}
set
{
this.rsa = value;
}
}
// Token: 0x17000055 RID: 85
// (get) Token: 0x06000170 RID: 368 RVA: 0x00009AB4 File Offset: 0x00007CB4
// (set) Token: 0x06000171 RID: 369 RVA: 0x00009AD0 File Offset: 0x00007CD0
public bool Weak
{
get
{
return !this.encrypted || this.weak;
}
set
{
this.weak = value;
}
}
// Token: 0x06000172 RID: 370 RVA: 0x00009ADC File Offset: 0x00007CDC
private byte[] DeriveKey(byte[] salt, string password)
{
byte[] bytes = Encoding.ASCII.GetBytes(password);
SHA1 sha = SHA1.Create();
sha.TransformBlock(salt, 0, salt.Length, salt, 0);
sha.TransformFinalBlock(bytes, 0, bytes.Length);
byte[] array = new byte[16];
Buffer.BlockCopy(sha.Hash, 0, array, 0, 16);
sha.Clear();
Array.Clear(bytes, 0, bytes.Length);
return array;
}
// Token: 0x06000173 RID: 371 RVA: 0x00009B40 File Offset: 0x00007D40
private bool Decode(byte[] pvk, string password)
{
if (BitConverterLE.ToUInt32(pvk, 0) != 2964713758U)
{
return false;
}
if (BitConverterLE.ToUInt32(pvk, 4) != 0U)
{
return false;
}
this.keyType = BitConverterLE.ToInt32(pvk, 8);
this.encrypted = BitConverterLE.ToUInt32(pvk, 12) == 1U;
int num = BitConverterLE.ToInt32(pvk, 16);
int num2 = BitConverterLE.ToInt32(pvk, 20);
byte[] array = new byte[num2];
Buffer.BlockCopy(pvk, 24 + num, array, 0, num2);
if (num > 0)
{
if (password == null)
{
return false;
}
byte[] array2 = new byte[num];
Buffer.BlockCopy(pvk, 24, array2, 0, num);
byte[] array3 = this.DeriveKey(array2, password);
RC4 rc = RC4.Create();
ICryptoTransform cryptoTransform = rc.CreateDecryptor(array3, null);
cryptoTransform.TransformBlock(array, 8, array.Length - 8, array, 8);
try
{
this.rsa = CryptoConvert.FromCapiPrivateKeyBlob(array);
this.weak = false;
}
catch (CryptographicException)
{
this.weak = true;
Buffer.BlockCopy(pvk, 24 + num, array, 0, num2);
Array.Clear(array3, 5, 11);
RC4 rc2 = RC4.Create();
cryptoTransform = rc2.CreateDecryptor(array3, null);
cryptoTransform.TransformBlock(array, 8, array.Length - 8, array, 8);
this.rsa = CryptoConvert.FromCapiPrivateKeyBlob(array);
}
Array.Clear(array3, 0, array3.Length);
}
else
{
this.weak = true;
this.rsa = CryptoConvert.FromCapiPrivateKeyBlob(array);
Array.Clear(array, 0, array.Length);
}
Array.Clear(pvk, 0, pvk.Length);
return this.rsa != null;
}
// Token: 0x06000174 RID: 372 RVA: 0x00009CD0 File Offset: 0x00007ED0
public void Save(string filename)
{
this.Save(filename, null);
}
// Token: 0x06000175 RID: 373 RVA: 0x00009CDC File Offset: 0x00007EDC
public void Save(string filename, string password)
{
if (filename == null)
{
throw new ArgumentNullException("filename");
}
byte[] array = null;
FileStream fileStream = File.Open(filename, FileMode.Create, FileAccess.Write);
try
{
byte[] array2 = new byte[4];
byte[] array3 = BitConverterLE.GetBytes(2964713758U);
fileStream.Write(array3, 0, 4);
fileStream.Write(array2, 0, 4);
array3 = BitConverterLE.GetBytes(this.keyType);
fileStream.Write(array3, 0, 4);
this.encrypted = password != null;
array = CryptoConvert.ToCapiPrivateKeyBlob(this.rsa);
if (this.encrypted)
{
array3 = BitConverterLE.GetBytes(1);
fileStream.Write(array3, 0, 4);
array3 = BitConverterLE.GetBytes(16);
fileStream.Write(array3, 0, 4);
array3 = BitConverterLE.GetBytes(array.Length);
fileStream.Write(array3, 0, 4);
byte[] array4 = new byte[16];
RC4 rc = RC4.Create();
byte[] array5 = null;
try
{
RandomNumberGenerator randomNumberGenerator = RandomNumberGenerator.Create();
randomNumberGenerator.GetBytes(array4);
fileStream.Write(array4, 0, array4.Length);
array5 = this.DeriveKey(array4, password);
if (this.Weak)
{
Array.Clear(array5, 5, 11);
}
ICryptoTransform cryptoTransform = rc.CreateEncryptor(array5, null);
cryptoTransform.TransformBlock(array, 8, array.Length - 8, array, 8);
}
finally
{
Array.Clear(array4, 0, array4.Length);
Array.Clear(array5, 0, array5.Length);
rc.Clear();
}
}
else
{
fileStream.Write(array2, 0, 4);
fileStream.Write(array2, 0, 4);
array3 = BitConverterLE.GetBytes(array.Length);
fileStream.Write(array3, 0, 4);
}
fileStream.Write(array, 0, array.Length);
}
finally
{
Array.Clear(array, 0, array.Length);
fileStream.Close();
}
}
// Token: 0x06000176 RID: 374 RVA: 0x00009EA8 File Offset: 0x000080A8
public static PrivateKey CreateFromFile(string filename)
{
return PrivateKey.CreateFromFile(filename, null);
}
// Token: 0x06000177 RID: 375 RVA: 0x00009EB4 File Offset: 0x000080B4
public static PrivateKey CreateFromFile(string filename, string password)
{
if (filename == null)
{
throw new ArgumentNullException("filename");
}
byte[] array = null;
using (FileStream fileStream = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.Read))
{
array = new byte[fileStream.Length];
fileStream.Read(array, 0, array.Length);
fileStream.Close();
}
return new PrivateKey(array, password);
}
// Token: 0x040000A4 RID: 164
private const uint magic = 2964713758U;
// Token: 0x040000A5 RID: 165
private bool encrypted;
// Token: 0x040000A6 RID: 166
private RSA rsa;
// Token: 0x040000A7 RID: 167
private bool weak;
// Token: 0x040000A8 RID: 168
private int keyType;
}
}