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; } }