public static byte[] FormatSignature(this ISshKey key, byte[] signature)
{
AsymmetricKeyParameter publicKey = key.GetPublicKeyParameters();
if (publicKey is DsaPublicKeyParameters ||
publicKey is ECPublicKeyParameters) {
Asn1Sequence seq = (Asn1Sequence)Asn1Object.FromByteArray(signature);
BigInteger r = ((DerInteger)seq[0]).PositiveValue;
BigInteger s = ((DerInteger)seq[1]).PositiveValue;
BlobBuilder formatedSignature = new BlobBuilder();
if (publicKey is ECPublicKeyParameters) {
var bytes = r.ToByteArray().ToList ();
while (bytes.Count < 20)
bytes.Insert(0, 0);
formatedSignature.AddBlob(bytes.ToArray());
bytes = s.ToByteArray().ToList();
while (bytes.Count < 20)
bytes.Insert(0, 0);
formatedSignature.AddBlob(bytes.ToArray());
} else {
var bytes = r.ToByteArrayUnsigned().ToList();
while (bytes.Count < 20)
bytes.Insert(0, 0);
formatedSignature.AddBytes(bytes.ToArray());
bytes = s.ToByteArrayUnsigned().ToList();
while (bytes.Count < 20)
bytes.Insert(0, 0);
formatedSignature.AddBytes(bytes.ToArray());
}
return formatedSignature.GetBlob();
} else if (publicKey is RsaKeyParameters || publicKey is Ed25519PublicKeyParameter) {
return signature;
}
throw new Exception("Unsupported algorithm");
}