1a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch# Author: Trevor Perrin
2a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch# See the LICENSE file for legal information regarding use of this file.
3a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""OpenSSL/M2Crypto RC4 implementation."""
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochfrom .cryptomath import *
7a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochfrom .rc4 import RC4
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if m2cryptoLoaded:
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    def new(key):
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return OpenSSL_RC4(key)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    class OpenSSL_RC4(RC4):
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        def __init__(self, key):
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            RC4.__init__(self, key, "openssl")
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            self.rc4 = m2.rc4_new()
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            m2.rc4_set_key(self.rc4, key)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        def __del__(self):
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            m2.rc4_free(self.rc4)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        def encrypt(self, plaintext):
25a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch            return bytearray(m2.rc4_update(self.rc4, plaintext))
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        def decrypt(self, ciphertext):
28a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch            return bytearray(self.encrypt(ciphertext))
29