15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""Abstract class for 3DES."""
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from compat import * #For True
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TripleDES:
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    def __init__(self, key, mode, IV, implementation):
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if len(key) != 24:
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            raise ValueError()
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if mode != 2:
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            raise ValueError()
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if len(IV) != 8:
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            raise ValueError()
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.isBlockCipher = True
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.block_size = 8
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.implementation = implementation
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.name = "3des"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #CBC-Mode encryption, returns ciphertext
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #WARNING: *MAY* modify the input as well
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    def encrypt(self, plaintext):
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert(len(plaintext) % 8 == 0)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #CBC-Mode decryption, returns plaintext
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #WARNING: *MAY* modify the input as well
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    def decrypt(self, ciphertext):
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert(len(ciphertext) % 8 == 0)
27