ED25519Key
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);
}
}
}