public GcmCryptoModeBlock16X86(IBlockCrypto crypto, IBlockCrypto crypto16) { if (crypto.BlockSize is not BlockSize) { throw new ArgumentException($@"Crypto block size must be {BlockSize} bytes.", nameof(crypto)); } if (crypto16.BlockSize is not BlockSize16) { throw new ArgumentException($@"Crypto block size must be {BlockSize16} bytes.", nameof(crypto16)); } _crypto = crypto; _crypto16 = crypto16; _buffer = ArrayPool <byte> .Shared.Rent(BlockSize16); _tagBuffer = ArrayPool <byte> .Shared.Rent(TagSize); _counterBlock = ArrayPool <byte> .Shared.Rent(BlockSize16); Span <byte> key = _buffer.AsSpan(0, 16); _crypto.Encrypt(Init, key); _gHash = GHashUtils.Create(key); }