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)
{
}
}
}