public static unsafe void Sign(out Span <byte> signatureBytes, Span <byte> privateKeyBytes, Span <byte> hashBytes, Span <byte> domainBytes) { Span <byte> blsPrivateKeyBytes = stackalloc byte[BlsPrivateKeyLength]; Span <byte> blsSignatureBytes = stackalloc byte[BlsSignatureLength]; signatureBytes = new byte[SignatureLength]; Span <byte> hashWithDomain = stackalloc byte[HashLength + DomainLength]; hashBytes.CopyTo(hashWithDomain.Slice(0, 32)); domainBytes.CopyTo(hashWithDomain.Slice(32, 8)); fixed(byte *privateKeyBytesRef = privateKeyBytes) fixed(byte *blsPrivateKeyRef = blsPrivateKeyBytes) fixed(byte *signatureBytesRef = signatureBytes) fixed(byte *blsSignatureBytesRef = blsSignatureBytes) fixed(byte *hashWithDomainRef = hashWithDomain) { DeserializePrivateKey(blsPrivateKeyRef, privateKeyBytesRef); switch (Platform) { case OsPlatform.Windows: Win64Lib.blsSignHashWithDomain(blsSignatureBytesRef, blsPrivateKeyRef, hashWithDomainRef); break; case OsPlatform.Mac: MacLib.blsSignHashWithDomain(blsSignatureBytesRef, blsPrivateKeyRef, hashWithDomainRef); break; case OsPlatform.Linux: PosixLib.blsSignHashWithDomain(blsSignatureBytesRef, blsPrivateKeyRef, hashWithDomainRef); break; default: throw new ArgumentOutOfRangeException(Platform.ToString()); } SerializeSignature(signatureBytesRef, blsSignatureBytesRef); } }