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

EcdsaDigitalSignature

Implements ECDSA digital signature algorithm.
using Renci.SshNet.Common; using System; namespace Renci.SshNet.Security.Cryptography { public class EcdsaDigitalSignature : DigitalSignature, IDisposable { private sealed class SshDataSignature : SshData { private readonly int _signature_size; private byte[] _signature_r; private byte[] _signature_s; public byte[] Signature { get { byte[] array = new byte[_signature_size]; Buffer.BlockCopy(_signature_r, 0, array, 0, _signature_r.Length); Buffer.BlockCopy(_signature_s, 0, array, _signature_r.Length, _signature_s.Length); return array; } set { byte[] array = new byte[_signature_size / 2]; Buffer.BlockCopy(value, 0, array, 0, array.Length); _signature_r = Extensions.ToByteArray(array.ToBigInteger2(), false, true); byte[] array2 = new byte[_signature_size / 2]; Buffer.BlockCopy(value, array.Length, array2, 0, array2.Length); _signature_s = Extensions.ToByteArray(array2.ToBigInteger2(), false, true); } } protected override int BufferCapacity => base.BufferCapacity + 4 + _signature_r.Length + 4 + _signature_s.Length; public SshDataSignature(int sig_size) { _signature_size = sig_size; } public SshDataSignature(byte[] data, int sig_size) { _signature_size = sig_size; Load(data); } protected override void LoadData() { _signature_r = ReadBinary().TrimLeadingZeros().Pad(_signature_size / 2); _signature_s = ReadBinary().TrimLeadingZeros().Pad(_signature_size / 2); } protected override void SaveData() { WriteBinaryString(Extensions.ToByteArray(_signature_r.ToBigInteger2(), false, true)); WriteBinaryString(Extensions.ToByteArray(_signature_s.ToBigInteger2(), false, true)); } } private readonly EcdsaKey _key; public EcdsaDigitalSignature(EcdsaKey key) { ThrowHelper.ThrowIfNull(key, "key"); _key = key; } public override bool Verify(byte[] input, byte[] signature) { int sig_size = (_key.KeyLength == 521) ? 132 : (_key.KeyLength / 4); SshDataSignature sshDataSignature = new SshDataSignature(signature, sig_size); return _key._impl.Verify(input, sshDataSignature.Signature); } public override byte[] Sign(byte[] input) { byte[] array = _key._impl.Sign(input); return new SshDataSignature(array.Length) { Signature = array }.GetBytes(); } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { } } }