DsaKey
Contains DSA private and public key.
using Renci.SshNet.Common;
using Renci.SshNet.Security.Cryptography;
using System;
namespace Renci.SshNet.Security
{
public class DsaKey : Key, IDisposable
{
private DsaDigitalSignature _digitalSignature;
private bool _isDisposed;
public BigInteger P { get; }
public BigInteger Q { get; }
public BigInteger G { get; }
public BigInteger Y { get; }
public BigInteger X { get; }
public override int KeyLength => P.BitLength;
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)
{
if (publicKeyData == null)
throw new ArgumentNullException("publicKeyData");
if (publicKeyData.Name != "ssh-dss" || publicKeyData.Keys.Length != 4)
throw new ArgumentException($"""{publicKeyData.Name}""{publicKeyData.Keys.Length}""", "publicKeyData");
P = publicKeyData.Keys[0];
Q = publicKeyData.Keys[1];
G = publicKeyData.Keys[2];
Y = publicKeyData.Keys[3];
}
public DsaKey(byte[] privateKeyData)
{
if (privateKeyData == null)
throw new ArgumentNullException("privateKeyData");
DerData derData = new DerData(privateKeyData, false);
derData.ReadBigInteger();
P = derData.ReadBigInteger();
Q = derData.ReadBigInteger();
G = derData.ReadBigInteger();
Y = derData.ReadBigInteger();
X = derData.ReadBigInteger();
if (!derData.IsEndOfData)
throw new InvalidOperationException("Invalid private key (expected EOF).");
}
public DsaKey(BigInteger p, BigInteger q, BigInteger g, BigInteger y, BigInteger x)
{
P = p;
Q = q;
G = g;
Y = y;
X = x;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!_isDisposed && disposing) {
DsaDigitalSignature digitalSignature = _digitalSignature;
if (digitalSignature != null) {
digitalSignature.Dispose();
_digitalSignature = null;
}
_isDisposed = true;
}
}
~DsaKey()
{
Dispose(false);
}
}
}