50 lines
1.6 KiB
C#
50 lines
1.6 KiB
C#
using System;
|
|
using Org.BouncyCastle.Math.EC;
|
|
|
|
namespace Org.BouncyCastle.Crypto.Parameters;
|
|
|
|
public class SM2KeyExchangePrivateParameters : ICipherParameters
|
|
{
|
|
private readonly bool mInitiator;
|
|
|
|
private readonly ECPrivateKeyParameters mStaticPrivateKey;
|
|
|
|
private readonly ECPoint mStaticPublicPoint;
|
|
|
|
private readonly ECPrivateKeyParameters mEphemeralPrivateKey;
|
|
|
|
private readonly ECPoint mEphemeralPublicPoint;
|
|
|
|
public virtual bool IsInitiator => mInitiator;
|
|
|
|
public virtual ECPrivateKeyParameters StaticPrivateKey => mStaticPrivateKey;
|
|
|
|
public virtual ECPoint StaticPublicPoint => mStaticPublicPoint;
|
|
|
|
public virtual ECPrivateKeyParameters EphemeralPrivateKey => mEphemeralPrivateKey;
|
|
|
|
public virtual ECPoint EphemeralPublicPoint => mEphemeralPublicPoint;
|
|
|
|
public SM2KeyExchangePrivateParameters(bool initiator, ECPrivateKeyParameters staticPrivateKey, ECPrivateKeyParameters ephemeralPrivateKey)
|
|
{
|
|
if (staticPrivateKey == null)
|
|
{
|
|
throw new ArgumentNullException("staticPrivateKey");
|
|
}
|
|
if (ephemeralPrivateKey == null)
|
|
{
|
|
throw new ArgumentNullException("ephemeralPrivateKey");
|
|
}
|
|
ECDomainParameters parameters = staticPrivateKey.Parameters;
|
|
if (!parameters.Equals(ephemeralPrivateKey.Parameters))
|
|
{
|
|
throw new ArgumentException("Static and ephemeral private keys have different domain parameters");
|
|
}
|
|
mInitiator = initiator;
|
|
mStaticPrivateKey = staticPrivateKey;
|
|
mStaticPublicPoint = parameters.G.Multiply(staticPrivateKey.D).Normalize();
|
|
mEphemeralPrivateKey = ephemeralPrivateKey;
|
|
mEphemeralPublicPoint = parameters.G.Multiply(ephemeralPrivateKey.D).Normalize();
|
|
}
|
|
}
|