Support Unicode strings in encrypt/decrypt (#125)

This commit is contained in:
Anders Melchiorsen 2018-08-08 16:52:03 +02:00 committed by Teemu R
parent e612560b35
commit a6d515b5cb
2 changed files with 34 additions and 14 deletions

View File

@ -86,14 +86,16 @@ class TPLinkSmartHomeProtocol:
:return: ciphertext request
"""
key = TPLinkSmartHomeProtocol.INITIALIZATION_VECTOR
buffer = bytearray(struct.pack(">I", len(request)))
for char in request:
cipher = key ^ ord(char)
key = cipher
buffer.append(cipher)
plainbytes = request.encode()
buffer = bytearray(struct.pack(">I", len(plainbytes)))
return buffer
for plainbyte in plainbytes:
cipherbyte = key ^ plainbyte
key = cipherbyte
buffer.append(cipherbyte)
return bytes(buffer)
@staticmethod
def decrypt(ciphertext: bytes) -> str:
@ -106,13 +108,11 @@ class TPLinkSmartHomeProtocol:
key = TPLinkSmartHomeProtocol.INITIALIZATION_VECTOR
buffer = []
ciphertext_str = ciphertext.decode('latin-1')
for cipherbyte in ciphertext:
plainbyte = key ^ cipherbyte
key = cipherbyte
buffer.append(plainbyte)
for char in ciphertext_str:
plain = key ^ ord(char)
key = ord(char)
buffer.append(chr(plain))
plaintext = bytes(buffer)
plaintext = ''.join(buffer)
return plaintext
return plaintext.decode()

View File

@ -10,3 +10,23 @@ class TestTPLinkSmartHomeProtocol(TestCase):
# encrypt adds a 4 byte header
encrypted = encrypted[4:]
self.assertEqual(d, TPLinkSmartHomeProtocol.decrypt(encrypted))
def test_encrypt_unicode(self):
d = "{'snowman': '\u2603'}"
e = bytes([208, 247, 132, 234, 133, 242, 159, 254, 144, 183,
141, 173, 138, 104, 240, 115, 84, 41])
encrypted = TPLinkSmartHomeProtocol.encrypt(d)
# encrypt adds a 4 byte header
encrypted = encrypted[4:]
self.assertEqual(e, encrypted)
def test_decrypt_unicode(self):
e = bytes([208, 247, 132, 234, 133, 242, 159, 254, 144, 183,
141, 173, 138, 104, 240, 115, 84, 41])
d = "{'snowman': '\u2603'}"
self.assertEqual(d, TPLinkSmartHomeProtocol.decrypt(e))