Exemplo n.º 1
0
        protected override void initCipher(byte[] iv, bool isCipher)
        {
            base.initCipher(iv, isCipher);

            IntPtr ctx;

            if (isCipher)
            {
                if (_encryptCtx == IntPtr.Zero)
                {
                    ctx         = Marshal.AllocHGlobal(_cipherInfo[3]);
                    _encryptCtx = ctx;
                }
                else
                {
                    ctx = _encryptCtx;
                }
            }
            else
            {
                if (_decryptCtx == IntPtr.Zero)
                {
                    ctx         = Marshal.AllocHGlobal(_cipherInfo[3]);
                    _decryptCtx = ctx;
                }
                else
                {
                    ctx = _decryptCtx;
                }
            }
            byte[] realkey;
            if (_method == "rc4-md5")
            {
                byte[] temp = new byte[keyLen + ivLen];
                realkey = new byte[keyLen];
                Array.Copy(_key, 0, temp, 0, keyLen);
                Array.Copy(iv, 0, temp, keyLen, ivLen);
                realkey = MD5.Create().ComputeHash(temp);
            }
            else
            {
                realkey = _key;
            }
            if (_cipher == CIPHER_AES)
            {
                PolarSSL.aes_init(ctx);
                // PolarSSL takes key length by bit
                // since we'll use CFB mode, here we both do enc, not dec
                PolarSSL.aes_setkey_enc(ctx, realkey, keyLen * 8);
            }
            else if (_cipher == CIPHER_RC4)
            {
                PolarSSL.arc4_init(ctx);
                // PolarSSL RC4 takes key length by byte
                PolarSSL.arc4_setup(ctx, realkey, keyLen);
            }
        }
        protected virtual void Dispose(bool disposing)
        {
            lock (this)
            {
                if (_disposed)
                {
                    return;
                }
                _disposed = true;
            }

            if (disposing)
            {
            }

            if (_encryptCtx != IntPtr.Zero)
            {
                switch (_cipher)
                {
                case CIPHER_AES:
                    PolarSSL.aes_free(_encryptCtx);
                    break;

                case CIPHER_RC4:
                    PolarSSL.arc4_free(_encryptCtx);
                    break;
                }
                Marshal.FreeHGlobal(_encryptCtx);
                _encryptCtx = IntPtr.Zero;
            }
            if (_decryptCtx != IntPtr.Zero)
            {
                switch (_cipher)
                {
                case CIPHER_AES:
                    PolarSSL.aes_free(_decryptCtx);
                    break;

                case CIPHER_RC4:
                    PolarSSL.arc4_free(_decryptCtx);
                    break;
                }
                Marshal.FreeHGlobal(_decryptCtx);
                _decryptCtx = IntPtr.Zero;
            }
        }
        protected override void cipherUpdate(bool isCipher, int length, byte[] buf, byte[] outbuf)
        {
            // C# could be multi-threaded
            if (_disposed)
            {
                throw new ObjectDisposedException(this.ToString());
            }
            byte[] iv;
            int    ivOffset;
            IntPtr ctx;

            if (isCipher)
            {
                iv       = _encryptIV;
                ivOffset = _encryptIVOffset;
                ctx      = _encryptCtx;
            }
            else
            {
                iv       = _decryptIV;
                ivOffset = _decryptIVOffset;
                ctx      = _decryptCtx;
            }
            switch (_cipher)
            {
            case CIPHER_AES:
                PolarSSL.aes_crypt_cfb128(ctx, isCipher ? PolarSSL.AES_ENCRYPT : PolarSSL.AES_DECRYPT, length, ref ivOffset, iv, buf, outbuf);
                if (isCipher)
                {
                    _encryptIVOffset = ivOffset;
                }
                else
                {
                    _decryptIVOffset = ivOffset;
                }
                break;

            case CIPHER_RC4:
                PolarSSL.arc4_crypt(ctx, length, buf, outbuf);
                break;
            }
        }