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

194 lines
8.3 KiB
C#

using System;
using System.Security.Cryptography;
using System.Text;
namespace Mono.Security.Protocol.Tls
{
// Token: 0x0200009A RID: 154
internal class SslCipherSuite : CipherSuite
{
// Token: 0x0600059F RID: 1439 RVA: 0x000202B8 File Offset: 0x0001E4B8
public SslCipherSuite(short code, string name, CipherAlgorithmType cipherAlgorithmType, HashAlgorithmType hashAlgorithmType, ExchangeAlgorithmType exchangeAlgorithmType, bool exportable, bool blockMode, byte keyMaterialSize, byte expandedKeyMaterialSize, short effectiveKeyBytes, byte ivSize, byte blockSize)
: base(code, name, cipherAlgorithmType, hashAlgorithmType, exchangeAlgorithmType, exportable, blockMode, keyMaterialSize, expandedKeyMaterialSize, effectiveKeyBytes, ivSize, blockSize)
{
int num = ((hashAlgorithmType != HashAlgorithmType.Md5) ? 40 : 48);
this.pad1 = new byte[num];
this.pad2 = new byte[num];
for (int i = 0; i < num; i++)
{
this.pad1[i] = 54;
this.pad2[i] = 92;
}
}
// Token: 0x060005A0 RID: 1440 RVA: 0x00020330 File Offset: 0x0001E530
public override byte[] ComputeServerRecordMAC(ContentType contentType, byte[] fragment)
{
HashAlgorithm hashAlgorithm = HashAlgorithm.Create(base.HashAlgorithmName);
byte[] serverWriteMAC = base.Context.Read.ServerWriteMAC;
hashAlgorithm.TransformBlock(serverWriteMAC, 0, serverWriteMAC.Length, serverWriteMAC, 0);
hashAlgorithm.TransformBlock(this.pad1, 0, this.pad1.Length, this.pad1, 0);
if (this.header == null)
{
this.header = new byte[11];
}
ulong num = ((!(base.Context is ClientContext)) ? base.Context.WriteSequenceNumber : base.Context.ReadSequenceNumber);
base.Write(this.header, 0, num);
this.header[8] = (byte)contentType;
base.Write(this.header, 9, (short)fragment.Length);
hashAlgorithm.TransformBlock(this.header, 0, this.header.Length, this.header, 0);
hashAlgorithm.TransformBlock(fragment, 0, fragment.Length, fragment, 0);
hashAlgorithm.TransformFinalBlock(CipherSuite.EmptyArray, 0, 0);
byte[] hash = hashAlgorithm.Hash;
hashAlgorithm.Initialize();
hashAlgorithm.TransformBlock(serverWriteMAC, 0, serverWriteMAC.Length, serverWriteMAC, 0);
hashAlgorithm.TransformBlock(this.pad2, 0, this.pad2.Length, this.pad2, 0);
hashAlgorithm.TransformBlock(hash, 0, hash.Length, hash, 0);
hashAlgorithm.TransformFinalBlock(CipherSuite.EmptyArray, 0, 0);
return hashAlgorithm.Hash;
}
// Token: 0x060005A1 RID: 1441 RVA: 0x00020488 File Offset: 0x0001E688
public override byte[] ComputeClientRecordMAC(ContentType contentType, byte[] fragment)
{
HashAlgorithm hashAlgorithm = HashAlgorithm.Create(base.HashAlgorithmName);
byte[] clientWriteMAC = base.Context.Current.ClientWriteMAC;
hashAlgorithm.TransformBlock(clientWriteMAC, 0, clientWriteMAC.Length, clientWriteMAC, 0);
hashAlgorithm.TransformBlock(this.pad1, 0, this.pad1.Length, this.pad1, 0);
if (this.header == null)
{
this.header = new byte[11];
}
ulong num = ((!(base.Context is ClientContext)) ? base.Context.ReadSequenceNumber : base.Context.WriteSequenceNumber);
base.Write(this.header, 0, num);
this.header[8] = (byte)contentType;
base.Write(this.header, 9, (short)fragment.Length);
hashAlgorithm.TransformBlock(this.header, 0, this.header.Length, this.header, 0);
hashAlgorithm.TransformBlock(fragment, 0, fragment.Length, fragment, 0);
hashAlgorithm.TransformFinalBlock(CipherSuite.EmptyArray, 0, 0);
byte[] hash = hashAlgorithm.Hash;
hashAlgorithm.Initialize();
hashAlgorithm.TransformBlock(clientWriteMAC, 0, clientWriteMAC.Length, clientWriteMAC, 0);
hashAlgorithm.TransformBlock(this.pad2, 0, this.pad2.Length, this.pad2, 0);
hashAlgorithm.TransformBlock(hash, 0, hash.Length, hash, 0);
hashAlgorithm.TransformFinalBlock(CipherSuite.EmptyArray, 0, 0);
return hashAlgorithm.Hash;
}
// Token: 0x060005A2 RID: 1442 RVA: 0x000205E0 File Offset: 0x0001E7E0
public override void ComputeMasterSecret(byte[] preMasterSecret)
{
TlsStream tlsStream = new TlsStream();
tlsStream.Write(this.prf(preMasterSecret, "A", base.Context.RandomCS));
tlsStream.Write(this.prf(preMasterSecret, "BB", base.Context.RandomCS));
tlsStream.Write(this.prf(preMasterSecret, "CCC", base.Context.RandomCS));
base.Context.MasterSecret = tlsStream.ToArray();
}
// Token: 0x060005A3 RID: 1443 RVA: 0x0002065C File Offset: 0x0001E85C
public override void ComputeKeys()
{
TlsStream tlsStream = new TlsStream();
char c = 'A';
int num = 1;
while (tlsStream.Length < (long)base.KeyBlockSize)
{
string text = string.Empty;
for (int i = 0; i < num; i++)
{
text += c.ToString();
}
byte[] array = this.prf(base.Context.MasterSecret, text.ToString(), base.Context.RandomSC);
int num2 = ((tlsStream.Length + (long)array.Length <= (long)base.KeyBlockSize) ? array.Length : (base.KeyBlockSize - (int)tlsStream.Length));
tlsStream.Write(array, 0, num2);
c += '\u0001';
num++;
}
TlsStream tlsStream2 = new TlsStream(tlsStream.ToArray());
base.Context.Negotiating.ClientWriteMAC = tlsStream2.ReadBytes(base.HashSize);
base.Context.Negotiating.ServerWriteMAC = tlsStream2.ReadBytes(base.HashSize);
base.Context.ClientWriteKey = tlsStream2.ReadBytes((int)base.KeyMaterialSize);
base.Context.ServerWriteKey = tlsStream2.ReadBytes((int)base.KeyMaterialSize);
if (!base.IsExportable)
{
if (base.IvSize != 0)
{
base.Context.ClientWriteIV = tlsStream2.ReadBytes((int)base.IvSize);
base.Context.ServerWriteIV = tlsStream2.ReadBytes((int)base.IvSize);
}
else
{
base.Context.ClientWriteIV = CipherSuite.EmptyArray;
base.Context.ServerWriteIV = CipherSuite.EmptyArray;
}
}
else
{
HashAlgorithm hashAlgorithm = MD5.Create();
int num3 = hashAlgorithm.HashSize >> 3;
byte[] array2 = new byte[num3];
hashAlgorithm.TransformBlock(base.Context.ClientWriteKey, 0, base.Context.ClientWriteKey.Length, array2, 0);
hashAlgorithm.TransformFinalBlock(base.Context.RandomCS, 0, base.Context.RandomCS.Length);
byte[] array3 = new byte[(int)base.ExpandedKeyMaterialSize];
Buffer.BlockCopy(hashAlgorithm.Hash, 0, array3, 0, (int)base.ExpandedKeyMaterialSize);
hashAlgorithm.Initialize();
hashAlgorithm.TransformBlock(base.Context.ServerWriteKey, 0, base.Context.ServerWriteKey.Length, array2, 0);
hashAlgorithm.TransformFinalBlock(base.Context.RandomSC, 0, base.Context.RandomSC.Length);
byte[] array4 = new byte[(int)base.ExpandedKeyMaterialSize];
Buffer.BlockCopy(hashAlgorithm.Hash, 0, array4, 0, (int)base.ExpandedKeyMaterialSize);
base.Context.ClientWriteKey = array3;
base.Context.ServerWriteKey = array4;
if (base.IvSize > 0)
{
hashAlgorithm.Initialize();
array2 = hashAlgorithm.ComputeHash(base.Context.RandomCS, 0, base.Context.RandomCS.Length);
base.Context.ClientWriteIV = new byte[(int)base.IvSize];
Buffer.BlockCopy(array2, 0, base.Context.ClientWriteIV, 0, (int)base.IvSize);
hashAlgorithm.Initialize();
array2 = hashAlgorithm.ComputeHash(base.Context.RandomSC, 0, base.Context.RandomSC.Length);
base.Context.ServerWriteIV = new byte[(int)base.IvSize];
Buffer.BlockCopy(array2, 0, base.Context.ServerWriteIV, 0, (int)base.IvSize);
}
else
{
base.Context.ClientWriteIV = CipherSuite.EmptyArray;
base.Context.ServerWriteIV = CipherSuite.EmptyArray;
}
}
ClientSessionCache.SetContextInCache(base.Context);
tlsStream2.Reset();
tlsStream.Reset();
}
// Token: 0x060005A4 RID: 1444 RVA: 0x00020A10 File Offset: 0x0001EC10
private byte[] prf(byte[] secret, string label, byte[] random)
{
HashAlgorithm hashAlgorithm = MD5.Create();
HashAlgorithm hashAlgorithm2 = SHA1.Create();
TlsStream tlsStream = new TlsStream();
tlsStream.Write(Encoding.ASCII.GetBytes(label));
tlsStream.Write(secret);
tlsStream.Write(random);
byte[] array = hashAlgorithm2.ComputeHash(tlsStream.ToArray(), 0, (int)tlsStream.Length);
tlsStream.Reset();
tlsStream.Write(secret);
tlsStream.Write(array);
byte[] array2 = hashAlgorithm.ComputeHash(tlsStream.ToArray(), 0, (int)tlsStream.Length);
tlsStream.Reset();
return array2;
}
// Token: 0x040002C6 RID: 710
private const int MacHeaderLength = 11;
// Token: 0x040002C7 RID: 711
private byte[] pad1;
// Token: 0x040002C8 RID: 712
private byte[] pad2;
// Token: 0x040002C9 RID: 713
private byte[] header;
}
}