public OpenSslCryptoTransform(SymmetricAlgorithm algo, bool encrypt, byte[] rgbKey, byte[] rgbIV)
            : base(algo, encrypt, rgbKey, rgbIV)
        {
            OpenSslUtil.EnsureAvailability ();

            this.context = Native.EVP_CIPHER_CTX_new ();

            var cptr = this.GetCipher (algo.Mode, rgbKey.Length);
            var op = encrypt ? Native.CipherOperation.Encrypt : Native.CipherOperation.Decrypt;

            fixed (byte* pkey = &rgbKey[0])
                fixed (byte* piv = &iv[0]) {
                    Native.ExpectSuccess (Native.EVP_CipherInit_ex (this.context, cptr, IntPtr.Zero, (IntPtr)pkey, (IntPtr)piv, op));
                }

            Native.ExpectSuccess (Native.EVP_CIPHER_CTX_set_key_length (this.context, rgbKey.Length));
            Native.ExpectSuccess (Native.EVP_CIPHER_CTX_set_padding (this.context, 0));
        }
        public OpenSslCryptoTransform(SymmetricAlgorithm algo, bool encrypt, byte[] rgbKey, byte[] rgbIV)
            : base(algo, encrypt, rgbKey, rgbIV)
        {
            OpenSslUtil.EnsureAvailability();

            this.context = Native.EVP_CIPHER_CTX_new();

            var cptr = this.GetCipher(algo.Mode, rgbKey.Length);
            var op   = encrypt ? Native.CipherOperation.Encrypt : Native.CipherOperation.Decrypt;

            fixed(byte *pkey = &rgbKey[0])
            fixed(byte *piv = &iv[0])
            {
                Native.ExpectSuccess(Native.EVP_CipherInit_ex(this.context, cptr, IntPtr.Zero, (IntPtr)pkey, (IntPtr)piv, op));
            }

            Native.ExpectSuccess(Native.EVP_CIPHER_CTX_set_key_length(this.context, rgbKey.Length));
            Native.ExpectSuccess(Native.EVP_CIPHER_CTX_set_padding(this.context, 0));
        }