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

139 lines
4.2 KiB
C#

using System;
using System.Security.Cryptography;
namespace Mono.Security.Protocol.Tls
{
// Token: 0x0200009B RID: 155
internal class SslHandshakeHash : HashAlgorithm
{
// Token: 0x060005A5 RID: 1445 RVA: 0x00020A98 File Offset: 0x0001EC98
public SslHandshakeHash(byte[] secret)
{
this.md5 = HashAlgorithm.Create("MD5");
this.sha = HashAlgorithm.Create("SHA1");
this.HashSizeValue = this.md5.HashSize + this.sha.HashSize;
this.secret = secret;
this.Initialize();
}
// Token: 0x060005A6 RID: 1446 RVA: 0x00020AF8 File Offset: 0x0001ECF8
public override void Initialize()
{
this.md5.Initialize();
this.sha.Initialize();
this.initializePad();
this.hashing = false;
}
// Token: 0x060005A7 RID: 1447 RVA: 0x00020B20 File Offset: 0x0001ED20
protected override byte[] HashFinal()
{
if (!this.hashing)
{
this.hashing = true;
}
this.md5.TransformBlock(this.secret, 0, this.secret.Length, this.secret, 0);
this.md5.TransformFinalBlock(this.innerPadMD5, 0, this.innerPadMD5.Length);
byte[] hash = this.md5.Hash;
this.md5.Initialize();
this.md5.TransformBlock(this.secret, 0, this.secret.Length, this.secret, 0);
this.md5.TransformBlock(this.outerPadMD5, 0, this.outerPadMD5.Length, this.outerPadMD5, 0);
this.md5.TransformFinalBlock(hash, 0, hash.Length);
this.sha.TransformBlock(this.secret, 0, this.secret.Length, this.secret, 0);
this.sha.TransformFinalBlock(this.innerPadSHA, 0, this.innerPadSHA.Length);
byte[] hash2 = this.sha.Hash;
this.sha.Initialize();
this.sha.TransformBlock(this.secret, 0, this.secret.Length, this.secret, 0);
this.sha.TransformBlock(this.outerPadSHA, 0, this.outerPadSHA.Length, this.outerPadSHA, 0);
this.sha.TransformFinalBlock(hash2, 0, hash2.Length);
this.Initialize();
byte[] array = new byte[36];
Buffer.BlockCopy(this.md5.Hash, 0, array, 0, 16);
Buffer.BlockCopy(this.sha.Hash, 0, array, 16, 20);
return array;
}
// Token: 0x060005A8 RID: 1448 RVA: 0x00020CCC File Offset: 0x0001EECC
protected override void HashCore(byte[] array, int ibStart, int cbSize)
{
if (!this.hashing)
{
this.hashing = true;
}
this.md5.TransformBlock(array, ibStart, cbSize, array, ibStart);
this.sha.TransformBlock(array, ibStart, cbSize, array, ibStart);
}
// Token: 0x060005A9 RID: 1449 RVA: 0x00020D10 File Offset: 0x0001EF10
public byte[] CreateSignature(RSA rsa)
{
if (rsa == null)
{
throw new CryptographicUnexpectedOperationException("missing key");
}
RSASslSignatureFormatter rsasslSignatureFormatter = new RSASslSignatureFormatter(rsa);
rsasslSignatureFormatter.SetHashAlgorithm("MD5SHA1");
return rsasslSignatureFormatter.CreateSignature(this.Hash);
}
// Token: 0x060005AA RID: 1450 RVA: 0x00020D4C File Offset: 0x0001EF4C
public bool VerifySignature(RSA rsa, byte[] rgbSignature)
{
if (rsa == null)
{
throw new CryptographicUnexpectedOperationException("missing key");
}
if (rgbSignature == null)
{
throw new ArgumentNullException("rgbSignature");
}
RSASslSignatureDeformatter rsasslSignatureDeformatter = new RSASslSignatureDeformatter(rsa);
rsasslSignatureDeformatter.SetHashAlgorithm("MD5SHA1");
return rsasslSignatureDeformatter.VerifySignature(this.Hash, rgbSignature);
}
// Token: 0x060005AB RID: 1451 RVA: 0x00020D9C File Offset: 0x0001EF9C
private void initializePad()
{
this.innerPadMD5 = new byte[48];
this.outerPadMD5 = new byte[48];
for (int i = 0; i < 48; i++)
{
this.innerPadMD5[i] = 54;
this.outerPadMD5[i] = 92;
}
this.innerPadSHA = new byte[40];
this.outerPadSHA = new byte[40];
for (int j = 0; j < 40; j++)
{
this.innerPadSHA[j] = 54;
this.outerPadSHA[j] = 92;
}
}
// Token: 0x040002CA RID: 714
private HashAlgorithm md5;
// Token: 0x040002CB RID: 715
private HashAlgorithm sha;
// Token: 0x040002CC RID: 716
private bool hashing;
// Token: 0x040002CD RID: 717
private byte[] secret;
// Token: 0x040002CE RID: 718
private byte[] innerPadMD5;
// Token: 0x040002CF RID: 719
private byte[] outerPadMD5;
// Token: 0x040002D0 RID: 720
private byte[] innerPadSHA;
// Token: 0x040002D1 RID: 721
private byte[] outerPadSHA;
}
}