1 /**
2 * DESX
3 * 
4 * Copyright:
5 * (C) 1999-2007 Jack Lloyd
6 * (C) 2014-2015 Etienne Cimon
7 *
8 * License:
9 * Botan is released under the Simplified BSD License (see LICENSE.md)
10 */
11 module botan.block.desx;
12 
13 import botan.constants;
14 static if (BOTAN_HAS_DES):
15 
16 import botan.block.des;
17 import botan.utils.xor_buf;
18 import botan.utils.mem_ops;
19 
20 /**
21 * DESX
22 */
23 final class DESX : BlockCipherFixedParams!(8, 24), BlockCipher, SymmetricAlgorithm
24 {
25 public:
26     /*
27     * DESX Encryption
28     */
29     override void encryptN(const(ubyte)* input, ubyte* output, size_t blocks)
30     {
31         foreach (size_t i; 0 .. blocks)
32         {
33             xorBuf(output, cast(ubyte*)input, m_K1.ptr, BLOCK_SIZE);
34             m_des.encrypt(output);
35             xorBuf(output, cast(ubyte*)m_K2.ptr, BLOCK_SIZE);
36             
37             input += BLOCK_SIZE;
38             output += BLOCK_SIZE;
39         }
40     }
41 
42     /*
43     * DESX Decryption
44     */
45     override void decryptN(const(ubyte)* input, ubyte* output, size_t blocks)
46     {    
47         foreach (size_t i; 0 .. blocks)
48         {
49             xorBuf(output, cast(ubyte*)input, m_K2.ptr, BLOCK_SIZE);
50             m_des.decrypt(output);
51             xorBuf(output, m_K1.ptr, BLOCK_SIZE);
52             
53             input += BLOCK_SIZE;
54             output += BLOCK_SIZE;
55         }
56     }
57 
58     override void clear()
59     {
60         m_des = new DES;
61         zap(m_K1);
62         zap(m_K2);
63     }
64 
65     @property string name() const { return "DESX"; }
66     override @property size_t parallelism() const { return 1; }
67     override BlockCipher clone() const { return new DESX; }
68     override size_t blockSize() const { return super.blockSize(); }
69     override KeyLengthSpecification keySpec() const { return super.keySpec(); }
70 
71 protected:
72     /*
73     * DESX Key Schedule
74     */
75     override void keySchedule(const(ubyte)* key, size_t)
76     {
77         m_K1[] = key[0 .. 8];
78         m_des.setKey(key + 8, 8);
79         m_K2[] = key[16 .. 24];
80     }
81 
82     SecureVector!ubyte m_K1, m_K2;
83     Unique!DES m_des;
84 }