DsaKey
Contains DSA private and public key.
using Renci.SshNet.Common;
using Renci.SshNet.Security.Cryptography;
using System;
using System.Formats.Asn1;
using System.Numerics;
using System.Runtime.CompilerServices;
using System.Security.Cryptography;
namespace Renci.SshNet.Security
{
[NullableContext(1)]
[Nullable(0)]
public class DsaKey : Key, IDisposable
{
[Nullable(2)]
private DsaDigitalSignature _digitalSignature;
internal DSA DSA { get; }
public BigInteger P { get; }
public BigInteger Q { get; }
public BigInteger G { get; }
public BigInteger Y { get; }
public BigInteger X { get; }
public override int KeyLength => (int)P.GetBitLength();
protected internal override DigitalSignature DigitalSignature {
get {
if (_digitalSignature == null)
_digitalSignature = new DsaDigitalSignature(this);
return _digitalSignature;
}
}
public override BigInteger[] Public => new BigInteger[4] {
P,
Q,
G,
Y
};
public DsaKey(SshKeyData publicKeyData)
{
ThrowHelper.ThrowIfNull(publicKeyData, "publicKeyData");
if (publicKeyData.Name != "ssh-dss" || publicKeyData.Keys.Length != 4) {
DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(34, 2);
defaultInterpolatedStringHandler.AppendLiteral("Invalid DSA public key data. (");
defaultInterpolatedStringHandler.AppendFormatted(publicKeyData.Name);
defaultInterpolatedStringHandler.AppendLiteral(", ");
defaultInterpolatedStringHandler.AppendFormatted(publicKeyData.Keys.Length);
defaultInterpolatedStringHandler.AppendLiteral(").");
throw new ArgumentException(defaultInterpolatedStringHandler.ToStringAndClear(), "publicKeyData");
}
P = publicKeyData.Keys[0];
Q = publicKeyData.Keys[1];
G = publicKeyData.Keys[2];
Y = publicKeyData.Keys[3];
DSA = LoadDSA();
}
public DsaKey(byte[] privateKeyData)
{
ThrowHelper.ThrowIfNull(privateKeyData, "privateKeyData");
AsnReader asnReader = new AsnReader(privateKeyData, AsnEncodingRules.DER, default(AsnReaderOptions)).ReadSequence(null);
asnReader.ReadInteger(null);
P = asnReader.ReadInteger(null);
Q = asnReader.ReadInteger(null);
G = asnReader.ReadInteger(null);
Y = asnReader.ReadInteger(null);
X = asnReader.ReadInteger(null);
asnReader.ThrowIfNotEmpty();
DSA = LoadDSA();
}
public DsaKey(BigInteger p, BigInteger q, BigInteger g, BigInteger y, BigInteger x)
{
P = p;
Q = q;
G = g;
Y = y;
X = x;
DSA = LoadDSA();
}
private DSA LoadDSA()
{
DSA val = DSA.Create();
val.ImportParameters(GetDSAParameters());
return val;
}
internal unsafe DSAParameters GetDSAParameters()
{
DSAParameters val = default(DSAParameters);
BigInteger bigInteger = P;
val.P = bigInteger.ToByteArray(true, true);
bigInteger = Q;
val.Q = bigInteger.ToByteArray(true, true);
DSAParameters val2 = val;
val2.G = G.ExportKeyParameter(((IntPtr)(void*)val2).P.Length);
val2.Y = Y.ExportKeyParameter(((IntPtr)(void*)val2).P.Length);
bigInteger = X;
if (!bigInteger.IsZero)
val2.X = X.ExportKeyParameter(((IntPtr)(void*)val2).Q.Length);
return val2;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing) {
_digitalSignature?.Dispose();
DSA.Dispose();
}
}
}
}