protected unsafe override void Deserialize( ReadOnlySpan <byte> span, out SecureMemoryHandle?keyHandle, out PublicKeyBytes publicKeyBytes) { if (Unsafe.SizeOf <PublicKeyBytes>() != crypto_sign_ed25519_PUBLICKEYBYTES) { throw Error.InvalidOperation_InternalError(); } Debug.Assert(span.Length == crypto_sign_ed25519_SEEDBYTES); keyHandle = SecureMemoryHandle.Create(crypto_sign_ed25519_SECRETKEYBYTES); fixed(PublicKeyBytes *pk = &publicKeyBytes) fixed(byte *seed_ = span) { int error = crypto_sign_ed25519_seed_keypair(pk, keyHandle, seed_); Debug.Assert(error == 0); } }
internal override unsafe void CreateKey( ReadOnlySpan <byte> seed, out SecureMemoryHandle keyHandle, out PublicKey?publicKey) { if (Unsafe.SizeOf <PublicKeyBytes>() != crypto_sign_ed25519_PUBLICKEYBYTES) { throw Error.InvalidOperation_InternalError(); } Debug.Assert(seed.Length == crypto_sign_ed25519_SEEDBYTES); publicKey = new PublicKey(this); keyHandle = SecureMemoryHandle.Create(crypto_sign_ed25519_SECRETKEYBYTES); fixed(PublicKeyBytes *pk = publicKey) fixed(byte *seed_ = seed) { int error = crypto_sign_ed25519_seed_keypair(pk, keyHandle, seed_); Debug.Assert(error == 0); } }