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

280 lines
8.3 KiB
C#

using System;
using System.Security.Cryptography;
using Mono.Math;
namespace Mono.Security.Cryptography
{
// Token: 0x0200002A RID: 42
public sealed class DiffieHellmanManaged : DiffieHellman
{
// Token: 0x060001BA RID: 442 RVA: 0x0000B960 File Offset: 0x00009B60
public DiffieHellmanManaged()
: this(1024, 160, DHKeyGeneration.Static)
{
}
// Token: 0x060001BB RID: 443 RVA: 0x0000B974 File Offset: 0x00009B74
public DiffieHellmanManaged(int bitLength, int l, DHKeyGeneration method)
{
if (bitLength < 256 || l < 0)
{
throw new ArgumentException();
}
BigInteger bigInteger;
BigInteger bigInteger2;
this.GenerateKey(bitLength, method, out bigInteger, out bigInteger2);
this.Initialize(bigInteger, bigInteger2, null, l, false);
}
// Token: 0x060001BC RID: 444 RVA: 0x0000B9B8 File Offset: 0x00009BB8
public DiffieHellmanManaged(byte[] p, byte[] g, byte[] x)
{
if (p == null || g == null)
{
throw new ArgumentNullException();
}
if (x == null)
{
this.Initialize(new BigInteger(p), new BigInteger(g), null, 0, true);
}
else
{
this.Initialize(new BigInteger(p), new BigInteger(g), new BigInteger(x), 0, true);
}
}
// Token: 0x060001BD RID: 445 RVA: 0x0000BA18 File Offset: 0x00009C18
public DiffieHellmanManaged(byte[] p, byte[] g, int l)
{
if (p == null || g == null)
{
throw new ArgumentNullException();
}
if (l < 0)
{
throw new ArgumentException();
}
this.Initialize(new BigInteger(p), new BigInteger(g), null, l, true);
}
// Token: 0x060001BF RID: 447 RVA: 0x0000BAB8 File Offset: 0x00009CB8
private void Initialize(BigInteger p, BigInteger g, BigInteger x, int secretLen, bool checkInput)
{
if (checkInput && (!p.IsProbablePrime() || g <= 0 || g >= p || (x != null && (x <= 0 || x > p - 2))))
{
throw new CryptographicException();
}
if (secretLen == 0)
{
secretLen = p.BitCount();
}
this.m_P = p;
this.m_G = g;
if (x == null)
{
BigInteger bigInteger = this.m_P - 1;
this.m_X = BigInteger.GenerateRandom(secretLen);
while (this.m_X >= bigInteger || this.m_X == 0U)
{
this.m_X = BigInteger.GenerateRandom(secretLen);
}
}
else
{
this.m_X = x;
}
}
// Token: 0x060001C0 RID: 448 RVA: 0x0000BBB8 File Offset: 0x00009DB8
public override byte[] CreateKeyExchange()
{
BigInteger bigInteger = this.m_G.ModPow(this.m_X, this.m_P);
byte[] bytes = bigInteger.GetBytes();
bigInteger.Clear();
return bytes;
}
// Token: 0x060001C1 RID: 449 RVA: 0x0000BBEC File Offset: 0x00009DEC
public override byte[] DecryptKeyExchange(byte[] keyEx)
{
BigInteger bigInteger = new BigInteger(keyEx);
BigInteger bigInteger2 = bigInteger.ModPow(this.m_X, this.m_P);
byte[] bytes = bigInteger2.GetBytes();
bigInteger2.Clear();
return bytes;
}
// Token: 0x1700005C RID: 92
// (get) Token: 0x060001C2 RID: 450 RVA: 0x0000BC24 File Offset: 0x00009E24
public override string KeyExchangeAlgorithm
{
get
{
return "1.2.840.113549.1.3";
}
}
// Token: 0x1700005D RID: 93
// (get) Token: 0x060001C3 RID: 451 RVA: 0x0000BC2C File Offset: 0x00009E2C
public override string SignatureAlgorithm
{
get
{
return null;
}
}
// Token: 0x060001C4 RID: 452 RVA: 0x0000BC30 File Offset: 0x00009E30
protected override void Dispose(bool disposing)
{
if (!this.m_Disposed)
{
this.m_P.Clear();
this.m_G.Clear();
this.m_X.Clear();
}
this.m_Disposed = true;
}
// Token: 0x060001C5 RID: 453 RVA: 0x0000BC68 File Offset: 0x00009E68
public override DHParameters ExportParameters(bool includePrivateParameters)
{
DHParameters dhparameters = default(DHParameters);
dhparameters.P = this.m_P.GetBytes();
dhparameters.G = this.m_G.GetBytes();
if (includePrivateParameters)
{
dhparameters.X = this.m_X.GetBytes();
}
return dhparameters;
}
// Token: 0x060001C6 RID: 454 RVA: 0x0000BCBC File Offset: 0x00009EBC
public override void ImportParameters(DHParameters parameters)
{
if (parameters.P == null)
{
throw new CryptographicException("Missing P value.");
}
if (parameters.G == null)
{
throw new CryptographicException("Missing G value.");
}
BigInteger bigInteger = new BigInteger(parameters.P);
BigInteger bigInteger2 = new BigInteger(parameters.G);
BigInteger bigInteger3 = null;
if (parameters.X != null)
{
bigInteger3 = new BigInteger(parameters.X);
}
this.Initialize(bigInteger, bigInteger2, bigInteger3, 0, true);
}
// Token: 0x060001C7 RID: 455 RVA: 0x0000BD38 File Offset: 0x00009F38
~DiffieHellmanManaged()
{
this.Dispose(false);
}
// Token: 0x060001C8 RID: 456 RVA: 0x0000BD74 File Offset: 0x00009F74
private void GenerateKey(int bitlen, DHKeyGeneration keygen, out BigInteger p, out BigInteger g)
{
if (keygen == DHKeyGeneration.Static)
{
if (bitlen == 768)
{
p = new BigInteger(DiffieHellmanManaged.m_OAKLEY768);
}
else if (bitlen == 1024)
{
p = new BigInteger(DiffieHellmanManaged.m_OAKLEY1024);
}
else
{
if (bitlen != 1536)
{
throw new ArgumentException("Invalid bit size.");
}
p = new BigInteger(DiffieHellmanManaged.m_OAKLEY1536);
}
g = new BigInteger(22U);
}
else
{
p = BigInteger.GeneratePseudoPrime(bitlen);
g = new BigInteger(3U);
}
}
// Token: 0x040000B9 RID: 185
private BigInteger m_P;
// Token: 0x040000BA RID: 186
private BigInteger m_G;
// Token: 0x040000BB RID: 187
private BigInteger m_X;
// Token: 0x040000BC RID: 188
private bool m_Disposed;
// Token: 0x040000BD RID: 189
private static byte[] m_OAKLEY768 = new byte[]
{
byte.MaxValue, byte.MaxValue, byte.MaxValue, byte.MaxValue, byte.MaxValue, byte.MaxValue, byte.MaxValue, byte.MaxValue, 201, 15,
218, 162, 33, 104, 194, 52, 196, 198, 98, 139,
128, 220, 28, 209, 41, 2, 78, 8, 138, 103,
204, 116, 2, 11, 190, 166, 59, 19, 155, 34,
81, 74, 8, 121, 142, 52, 4, 221, 239, 149,
25, 179, 205, 58, 67, 27, 48, 43, 10, 109,
242, 95, 20, 55, 79, 225, 53, 109, 109, 81,
194, 69, 228, 133, 181, 118, 98, 94, 126, 198,
244, 76, 66, 233, 166, 58, 54, 32, byte.MaxValue, byte.MaxValue,
byte.MaxValue, byte.MaxValue, byte.MaxValue, byte.MaxValue, byte.MaxValue, byte.MaxValue
};
// Token: 0x040000BE RID: 190
private static byte[] m_OAKLEY1024 = new byte[]
{
byte.MaxValue, byte.MaxValue, byte.MaxValue, byte.MaxValue, byte.MaxValue, byte.MaxValue, byte.MaxValue, byte.MaxValue, 201, 15,
218, 162, 33, 104, 194, 52, 196, 198, 98, 139,
128, 220, 28, 209, 41, 2, 78, 8, 138, 103,
204, 116, 2, 11, 190, 166, 59, 19, 155, 34,
81, 74, 8, 121, 142, 52, 4, 221, 239, 149,
25, 179, 205, 58, 67, 27, 48, 43, 10, 109,
242, 95, 20, 55, 79, 225, 53, 109, 109, 81,
194, 69, 228, 133, 181, 118, 98, 94, 126, 198,
244, 76, 66, 233, 166, 55, 237, 107, 11, byte.MaxValue,
92, 182, 244, 6, 183, 237, 238, 56, 107, 251,
90, 137, 159, 165, 174, 159, 36, 17, 124, 75,
31, 230, 73, 40, 102, 81, 236, 230, 83, 129,
byte.MaxValue, byte.MaxValue, byte.MaxValue, byte.MaxValue, byte.MaxValue, byte.MaxValue, byte.MaxValue, byte.MaxValue
};
// Token: 0x040000BF RID: 191
private static byte[] m_OAKLEY1536 = new byte[]
{
byte.MaxValue, byte.MaxValue, byte.MaxValue, byte.MaxValue, byte.MaxValue, byte.MaxValue, byte.MaxValue, byte.MaxValue, 201, 15,
218, 162, 33, 104, 194, 52, 196, 198, 98, 139,
128, 220, 28, 209, 41, 2, 78, 8, 138, 103,
204, 116, 2, 11, 190, 166, 59, 19, 155, 34,
81, 74, 8, 121, 142, 52, 4, 221, 239, 149,
25, 179, 205, 58, 67, 27, 48, 43, 10, 109,
242, 95, 20, 55, 79, 225, 53, 109, 109, 81,
194, 69, 228, 133, 181, 118, 98, 94, 126, 198,
244, 76, 66, 233, 166, 55, 237, 107, 11, byte.MaxValue,
92, 182, 244, 6, 183, 237, 238, 56, 107, 251,
90, 137, 159, 165, 174, 159, 36, 17, 124, 75,
31, 230, 73, 40, 102, 81, 236, 228, 91, 61,
194, 0, 124, 184, 161, 99, 191, 5, 152, 218,
72, 54, 28, 85, 211, 154, 105, 22, 63, 168,
253, 36, 207, 95, 131, 101, 93, 35, 220, 163,
173, 150, 28, 98, 243, 86, 32, 133, 82, 187,
158, 213, 41, 7, 112, 150, 150, 109, 103, 12,
53, 78, 74, 188, 152, 4, 241, 116, 108, 8,
202, 35, 115, 39, byte.MaxValue, byte.MaxValue, byte.MaxValue, byte.MaxValue, byte.MaxValue, byte.MaxValue,
byte.MaxValue, byte.MaxValue
};
}
}