/// <inheritdoc /> public override bool TrySignData(ReadOnlySpan <byte> privateKey, ReadOnlySpan <byte> data, Span <byte> destination, out int bytesWritten) { if (destination.Length < SignatureLength) { bytesWritten = 0; return(false); } EnsureInitialised(); // TODO: Generate random key if null // EnsurePrivateKey(); var blsSecretKey = default(Bls384Interop.BlsSecretKey); int bytesRead; unsafe { fixed(byte *privateKeyPtr = privateKey) { bytesRead = Bls384Interop.SecretKeyDeserialize(ref blsSecretKey, privateKeyPtr, privateKey !.Length); } } if (bytesRead != privateKey.Length) { throw new Exception($"Error deserializing BLS private key, length: {bytesRead}"); } var blsSignature = default(Bls384Interop.BlsSignature); unsafe { fixed(byte *dataPtr = data) { Bls384Interop.Sign(ref blsSignature, ref blsSecretKey, dataPtr, data.Length); } } unsafe { fixed(byte *destinationPtr = destination) { bytesWritten = Bls384Interop.SignatureSerialize(destinationPtr, SignatureLength, ref blsSignature); } } if (bytesWritten != SignatureLength) { throw new Exception($"Error serializing BLS signature, length: {bytesWritten}"); } return(true); }