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

ED25519Key

public class ED25519Key : Key, IDisposable
Contains ED25519 private and public key.
using Renci.SshNet.Common; using Renci.SshNet.Security.Chaos.NaCl; using Renci.SshNet.Security.Cryptography; using System; namespace Renci.SshNet.Security { public class ED25519Key : Key, IDisposable { private ED25519DigitalSignature _digitalSignature; private bool _isDisposed; public override BigInteger[] Public => new BigInteger[1] { PublicKey.ToBigInteger2() }; public override int KeyLength => PublicKey.Length * 8; protected internal override DigitalSignature DigitalSignature { get { if (_digitalSignature == null) _digitalSignature = new ED25519DigitalSignature(this); return _digitalSignature; } } public byte[] PublicKey { get; } public byte[] PrivateKey { get; } public override string ToString() { return "ssh-ed25519"; } public ED25519Key(SshKeyData publicKeyData) { if (publicKeyData == null) throw new ArgumentNullException("publicKeyData"); if (publicKeyData.Name != "ssh-ed25519" || publicKeyData.Keys.Length != 1) throw new ArgumentException($"""{publicKeyData.Name}""{publicKeyData.Keys.Length}""", "publicKeyData"); PublicKey = publicKeyData.Keys[0].ToByteArray().Reverse().TrimLeadingZeros() .Pad(Ed25519.PublicKeySizeInBytes); PrivateKey = new byte[Ed25519.ExpandedPrivateKeySizeInBytes]; } public ED25519Key(byte[] privateKeyData) { byte[] array = new byte[Ed25519.PrivateKeySeedSizeInBytes]; Buffer.BlockCopy(privateKeyData, 0, array, 0, array.Length); Ed25519.KeyPairFromSeed(out byte[] publicKey, out byte[] expandedPrivateKey, array); PublicKey = publicKey; PrivateKey = expandedPrivateKey; } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (!_isDisposed && disposing) _isDisposed = true; } ~ED25519Key() { Dispose(false); } } }