|
|
1.1 root 1: /*
2: Copyright (c) 2008 TrueCrypt Foundation. All rights reserved.
3:
4: Governed by the TrueCrypt License 2.4 the full text of which is contained
5: in the file License.txt included in TrueCrypt binary and source code
6: distribution packages.
7: */
8:
9: #include "Platform/Platform.h"
10: #include "Cipher.h"
11: #include "Crypto/Aes.h"
12: #include "Crypto/Blowfish.h"
13: #include "Crypto/Des.h"
14: #include "Crypto/Cast.h"
15: #include "Crypto/Serpent.h"
16: #include "Crypto/Twofish.h"
17:
18: namespace TrueCrypt
19: {
20: Cipher::Cipher () : Initialized (false)
21: {
22: }
23:
24: Cipher::~Cipher ()
25: {
26: }
27:
28: void Cipher::DecryptBlock (byte *data) const
29: {
30: if (!Initialized)
31: throw NotInitialized (SRC_POS);
32:
33: Decrypt (data);
34: }
35:
36: void Cipher::EncryptBlock (byte *data) const
37: {
38: if (!Initialized)
39: throw NotInitialized (SRC_POS);
40:
41: Encrypt (data);
42: }
43:
44: CipherList Cipher::GetAvailableCiphers ()
45: {
46: CipherList l;
47:
48: l.push_back (shared_ptr <Cipher> (new CipherAES ()));
49: l.push_back (shared_ptr <Cipher> (new CipherSerpent ()));
50: l.push_back (shared_ptr <Cipher> (new CipherTwofish ()));
51: l.push_back (shared_ptr <Cipher> (new CipherBlowfish ()));
52: l.push_back (shared_ptr <Cipher> (new CipherCast5 ()));
53: l.push_back (shared_ptr <Cipher> (new CipherTripleDES ()));
54:
55: return l;
56: }
57:
58: void Cipher::SetKey (const ConstBufferPtr &key)
59: {
60: if (key.Size() != GetKeySize ())
61: throw ParameterIncorrect (SRC_POS);
62:
63: if (!Initialized)
64: ScheduledKey.Allocate (GetScheduledKeySize ());
65:
66: SetCipherKey (key);
67: Initialized = true;
68: }
69:
70: #define TC_EXCEPTION(TYPE) TC_SERIALIZER_FACTORY_ADD(TYPE)
71: #undef TC_EXCEPTION_NODECL
72: #define TC_EXCEPTION_NODECL(TYPE) TC_SERIALIZER_FACTORY_ADD(TYPE)
73:
74: TC_SERIALIZER_FACTORY_ADD_EXCEPTION_SET (CipherException);
75:
76:
77: // AES
78: void CipherAES::Decrypt (byte *data) const
79: {
80: aes_decrypt (data, data, (aes_decrypt_ctx *) (ScheduledKey.Ptr() + sizeof (aes_encrypt_ctx)));
81: }
82:
83: void CipherAES::Encrypt (byte *data) const
84: {
85: aes_encrypt (data, data, (aes_encrypt_ctx *) ScheduledKey.Ptr());
86: }
87:
88: size_t CipherAES::GetScheduledKeySize () const
89: {
90: return sizeof(aes_encrypt_ctx) + sizeof(aes_decrypt_ctx);
91: }
92:
93: void CipherAES::SetCipherKey (const byte *key)
94: {
95: if (aes_encrypt_key (key, (int) GetKeySize(), (aes_encrypt_ctx *) ScheduledKey.Ptr()) != EXIT_SUCCESS)
96: throw CipherInitError (SRC_POS);
97:
98: if (aes_decrypt_key (key, (int) GetKeySize(), (aes_decrypt_ctx *) (ScheduledKey.Ptr() + sizeof (aes_encrypt_ctx))) != EXIT_SUCCESS)
99: throw CipherInitError (SRC_POS);
100: }
101:
102:
103: // Blowfish
104: void CipherBlowfish::Decrypt (byte *data) const
105: {
106: BF_ecb_le_encrypt (data, data, (BF_KEY *) ScheduledKey.Ptr(), 0);
107: }
108:
109: void CipherBlowfish::Encrypt (byte *data) const
110: {
111: BF_ecb_le_encrypt (data, data, (BF_KEY *) ScheduledKey.Ptr(), 1);
112: }
113:
114: size_t CipherBlowfish::GetScheduledKeySize () const
115: {
116: return 4168;
117: }
118:
119: void CipherBlowfish::SetCipherKey (const byte *key)
120: {
121: BF_set_key ((BF_KEY *) ScheduledKey.Ptr(), static_cast<int> (GetKeySize ()), (unsigned char *) key);
122: }
123:
124:
125: // CAST5
126: void CipherCast5::Decrypt (byte *data) const
127: {
128: CAST_ecb_encrypt (data, data, (CAST_KEY *) ScheduledKey.Ptr(), 0);
129: }
130:
131: void CipherCast5::Encrypt (byte *data) const
132: {
133: CAST_ecb_encrypt (data, data, (CAST_KEY *) ScheduledKey.Ptr(), 1);
134: }
135:
136: size_t CipherCast5::GetScheduledKeySize () const
137: {
138: return 128;
139: }
140:
141: void CipherCast5::SetCipherKey (const byte *key)
142: {
143: CAST_set_key((CAST_KEY *) ScheduledKey.Ptr(), static_cast<int> (GetKeySize ()), (unsigned char *) key);
144: }
145:
146:
147: // Serpent
148: void CipherSerpent::Decrypt (byte *data) const
149: {
150: serpent_decrypt (data, data, ScheduledKey);
151: }
152:
153: void CipherSerpent::Encrypt (byte *data) const
154: {
155: serpent_encrypt (data, data, ScheduledKey);
156: }
157:
158: size_t CipherSerpent::GetScheduledKeySize () const
159: {
160: return 140*4;
161: }
162:
163: void CipherSerpent::SetCipherKey (const byte *key)
164: {
165: serpent_set_key (key, static_cast<int> (GetKeySize ()), ScheduledKey);
166: }
167:
168:
169: // Triple-DES
170: void CipherTripleDES::Decrypt (byte *data) const
171: {
172: des_ecb3_encrypt ((des_cblock *) data, (des_cblock *) data,
173: (des_ks_struct *) ScheduledKey.Ptr(),
174: (des_ks_struct *) (ScheduledKey.Ptr() + 128),
175: (des_ks_struct *) (ScheduledKey.Ptr() + 128 * 2), 0);
176: }
177:
178: void CipherTripleDES::Encrypt (byte *data) const
179: {
180: des_ecb3_encrypt ((des_cblock *) data, (des_cblock *) data,
181: (des_ks_struct *) ScheduledKey.Ptr(),
182: (des_ks_struct *) (ScheduledKey.Ptr() + 128),
183: (des_ks_struct *) (ScheduledKey.Ptr() + 128 * 2), 1);
184: }
185:
186: size_t CipherTripleDES::GetScheduledKeySize () const
187: {
188: return 128 * 3;
189: }
190:
191: void CipherTripleDES::SetCipherKey (const byte *key)
192: {
193: des_key_sched ((des_cblock *) (key + 8 * 0), (struct des_ks_struct *) (ScheduledKey.Ptr() + 128 * 0));
194: des_key_sched ((des_cblock *) (key + 8 * 1), (struct des_ks_struct *) (ScheduledKey.Ptr() + 128 * 1));
195: des_key_sched ((des_cblock *) (key + 8 * 2), (struct des_ks_struct *) (ScheduledKey.Ptr() + 128 * 2));
196: }
197:
198:
199: // Twofish
200: void CipherTwofish::Decrypt (byte *data) const
201: {
202: twofish_decrypt ((TwofishInstance *) ScheduledKey.Ptr(), (unsigned int *)data, (unsigned int *)data);
203: }
204:
205: void CipherTwofish::Encrypt (byte *data) const
206: {
207: twofish_encrypt ((TwofishInstance *) ScheduledKey.Ptr(), (unsigned int *)data, (unsigned int *)data);
208: }
209:
210: size_t CipherTwofish::GetScheduledKeySize () const
211: {
212: return TWOFISH_KS;
213: }
214:
215: void CipherTwofish::SetCipherKey (const byte *key)
216: {
217: twofish_set_key ((TwofishInstance *) ScheduledKey.Ptr(), (unsigned int *) key, static_cast<int> (GetKeySize ()) * 8);
218: }
219: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.