public static byte[] RecoverKeyFromCompact(byte[] messageHash, byte[] compactSignature, int recoveryId, bool compressed) { byte[] publicKey = new byte[64]; byte[] serializedPublicKey = new byte[compressed ? 33 : 65]; uint outputSize = (uint)serializedPublicKey.Length; uint flags = compressed ? Secp256K1EcCompressed : Secp256K1EcUncompressed; byte[] recoverableSignature = new byte[65]; if (IsWindows ? !Win64Lib.secp256k1_ecdsa_recoverable_signature_parse_compact(Context, recoverableSignature, compactSignature, recoveryId) : !PosixLib.secp256k1_ecdsa_recoverable_signature_parse_compact(Context, recoverableSignature, compactSignature, recoveryId)) { return(null); } if (IsWindows ? !Win64Lib.secp256k1_ecdsa_recover(Context, publicKey, recoverableSignature, messageHash) : !PosixLib.secp256k1_ecdsa_recover(Context, publicKey, recoverableSignature, messageHash)) { return(null); } if (IsWindows ? !Win64Lib.secp256k1_ec_pubkey_serialize(Context, serializedPublicKey, ref outputSize, publicKey, flags) : !PosixLib.secp256k1_ec_pubkey_serialize(Context, serializedPublicKey, ref outputSize, publicKey, flags)) { return(null); } return(serializedPublicKey); }