using System; using System.Security.Cryptography; using Renci.SshNet.Abstractions; using Renci.SshNet.Common; using Renci.SshNet.Security.Cryptography.Ciphers; namespace Renci.SshNet.Security.Cryptography { /// /// Implements RSA digital signature algorithm. /// public class RsaDigitalSignature : CipherDigitalSignature, IDisposable { private HashAlgorithm _hash; /// /// Initializes a new instance of the class. /// /// The RSA key. public RsaDigitalSignature(RsaKey rsaKey) : base(new ObjectIdentifier(1, 3, 14, 3, 2, 26), new RsaCipher(rsaKey)) { _hash = CryptoAbstraction.CreateSHA1(); } /// /// Hashes the specified input. /// /// The input. /// /// Hashed data. /// protected override byte[] Hash(byte[] input) { return _hash.ComputeHash(input); } #region IDisposable Members private bool _isDisposed; /// /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. /// public void Dispose() { Dispose(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) { var hash = _hash; if (hash != null) { hash.Dispose(); _hash = null; } _isDisposed = true; } } /// /// Releases unmanaged resources and performs other cleanup operations before the /// is reclaimed by garbage collection. /// ~RsaDigitalSignature() { Dispose(false); } #endregion } }