ED25519Key
Contains ED25519 private and public key.
using Org.BouncyCastle.Math.EC.Rfc8032;
using Renci.SshNet.Common;
using Renci.SshNet.Security.Cryptography;
using System;
using System.Numerics;
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 => Ed25519.PublicKeySize * 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)
{
ThrowHelper.ThrowIfNull(publicKeyData, "publicKeyData");
if (publicKeyData.Name != "ssh-ed25519" || publicKeyData.Keys.Length != 1)
throw new ArgumentException($"""{publicKeyData.Name}""{publicKeyData.Keys.Length}""", "publicKeyData");
PublicKey = publicKeyData.Keys[0].ToByteArray(false, true).TrimLeadingZeros().Pad(Ed25519.PublicKeySize);
PrivateKey = new byte[Ed25519.SecretKeySize];
}
public ED25519Key(byte[] privateKeyData)
{
PrivateKey = new byte[Ed25519.SecretKeySize];
PublicKey = new byte[Ed25519.PublicKeySize];
Buffer.BlockCopy(privateKeyData, 0, PrivateKey, 0, Ed25519.SecretKeySize);
Ed25519.GeneratePublicKey(privateKeyData, 0, PublicKey, 0);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!_isDisposed && disposing)
_isDisposed = true;
}
}
}