/// <inheritdoc /> public override bool VerifyData(ReadOnlySpan <byte> publicKey, ReadOnlySpan <byte> data, ReadOnlySpan <byte> signature) { if (signature.Length != SignatureLength) { throw new ArgumentOutOfRangeException(nameof(signature), signature.Length, $"Signature must be {SignatureLength} bytes long."); } EnsureInitialised(); // TODO: Maybe cache BlsPublicKey struct conversion? var blsPublicKey = default(Bls384Interop.BlsPublicKey); int publicKeyBytesRead; unsafe { fixed(byte *publicKeyPtr = publicKey) { publicKeyBytesRead = Bls384Interop.PublicKeyDeserialize(ref blsPublicKey, publicKeyPtr, publicKey !.Length); } } if (publicKeyBytesRead != publicKey.Length) { throw new Exception($"Error deserializing BLS public key, length: {publicKeyBytesRead}"); } var blsSignature = default(Bls384Interop.BlsSignature); int signatureBytesRead; unsafe { fixed(byte *signaturePtr = signature) { signatureBytesRead = Bls384Interop.SignatureDeserialize(ref blsSignature, signaturePtr, SignatureLength); } } if (signatureBytesRead != signature.Length) { throw new Exception($"Error deserializing BLS signature, length: {signatureBytesRead}"); } int result; unsafe { fixed(byte *dataPtr = data) { result = Bls384Interop.Verify(ref blsSignature, ref blsPublicKey, dataPtr, data.Length); } } return(result == 1); }