示例#1
0
        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);
            }
        }