1a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch# Author: Trevor Perrin
2a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch# See the LICENSE file for legal information regarding use of this file.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch"""Abstract class for 3DES."""
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochclass TripleDES(object):
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    def __init__(self, key, mode, IV, implementation):
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if len(key) != 24:
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            raise ValueError()
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if mode != 2:
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            raise ValueError()
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if len(IV) != 8:
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            raise ValueError()
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.isBlockCipher = True
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.block_size = 8
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.implementation = implementation
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.name = "3des"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #CBC-Mode encryption, returns ciphertext
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #WARNING: *MAY* modify the input as well
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    def encrypt(self, plaintext):
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert(len(plaintext) % 8 == 0)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #CBC-Mode decryption, returns plaintext
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #WARNING: *MAY* modify the input as well
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    def decrypt(self, ciphertext):
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert(len(ciphertext) % 8 == 0)
28