<PackageReference Include="SSH.NET" Version="2024.2.0" />

DsaKey

public class DsaKey : Key, IDisposable
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(); } } } }