Example #1
0
        /// <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);
        }