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