public TripleDESTransform (TripleDES algo, bool encryption, byte[] key, byte[] iv) : base (algo, encryption, iv)
{
#if NET_2_0
if (key == null) {
key = GetStrongKey ();
}
#endif
// note: checking weak keys also checks valid key length
if (TripleDES.IsWeakKey (key)) {
string msg = Locale.GetText ("This is a known weak key.");
throw new CryptographicException (msg);
}
byte[] key1 = new byte [8];
byte[] key2 = new byte [8];
byte[] key3 = new byte [8];
DES des = DES.Create ();
Buffer.BlockCopy (key, 0, key1, 0, 8);
Buffer.BlockCopy (key, 8, key2, 0, 8);
if (key.Length == 16)
Buffer.BlockCopy (key, 0, key3, 0, 8);
else
Buffer.BlockCopy (key, 16, key3, 0, 8);
// note: some modes (like CFB) requires encryption when decrypting
if ((encryption) || (algo.Mode == CipherMode.CFB)) {
E1 = new DESTransform (des, true, key1, iv);
D2 = new DESTransform (des, false, key2, iv);
E3 = new DESTransform (des, true, key3, iv);
}
else {
D1 = new DESTransform (des, false, key3, iv);
E2 = new DESTransform (des, true, key2, iv);
D3 = new DESTransform (des, false, key1, iv);
}
}