using System;
using Renci.SshNet.Common;
using Renci.SshNet.Security.Chaos.NaCl;
namespace Renci.SshNet.Security.Cryptography
{
///
/// Implements ECDSA digital signature algorithm.
///
public class ED25519DigitalSignature : DigitalSignature, IDisposable
{
private readonly ED25519Key _key;
private bool _isDisposed;
///
/// Initializes a new instance of the class.
///
/// The ED25519Key key.
/// is null.
public ED25519DigitalSignature(ED25519Key key)
{
if (key is null)
{
throw new ArgumentNullException(nameof(key));
}
_key = key;
}
///
/// Verifies the signature.
///
/// The input.
/// The signature.
///
/// true if signature was successfully verified; otherwise false.
///
/// Invalid signature.
public override bool Verify(byte[] input, byte[] signature)
{
return Ed25519.Verify(signature, input, _key.PublicKey);
}
///
/// Creates the signature.
///
/// The input.
///
/// Signed input data.
///
/// Invalid ED25519Key key.
public override byte[] Sign(byte[] input)
{
return Ed25519.Sign(input, _key.PrivateKey);
}
///
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
///
public void Dispose()
{
Dispose(disposing: true);
GC.SuppressFinalize(this);
}
///
/// Releases unmanaged and - optionally - managed resources
///
/// true to release both managed and unmanaged resources; false to release only unmanaged resources.
protected virtual void Dispose(bool disposing)
{
if (_isDisposed)
{
return;
}
if (disposing)
{
_isDisposed = true;
}
}
///
/// Finalizes an instance of the class.
///
~ED25519DigitalSignature()
{
Dispose(disposing: false);
}
}
}