| import binascii |
| |
| from cryptography.hazmat.backends.openssl.backend import backend |
| from cryptography.hazmat.primitives.ciphers import algorithms, base, modes |
| |
| |
| def encrypt(mode, key, iv, plaintext): |
| cipher = base.Cipher( |
| algorithms.IDEA(binascii.unhexlify(key)), |
| mode(binascii.unhexlify(iv)), |
| backend, |
| ) |
| encryptor = cipher.encryptor() |
| ct = encryptor.update(binascii.unhexlify(plaintext)) |
| ct += encryptor.finalize() |
| return binascii.hexlify(ct) |
| |
| |
| def build_vectors(mode, filename): |
| with open(filename, "r") as f: |
| vector_file = f.read().splitlines() |
| |
| count = 0 |
| output = [] |
| key = None |
| iv = None |
| plaintext = None |
| for line in vector_file: |
| line = line.strip() |
| if line.startswith("KEY"): |
| if count != 0: |
| output.append( |
| "CIPHERTEXT = {0}".format( |
| encrypt(mode, key, iv, plaintext) |
| ) |
| ) |
| output.append("\nCOUNT = {0}".format(count)) |
| count += 1 |
| name, key = line.split(" = ") |
| output.append("KEY = {0}".format(key)) |
| elif line.startswith("IV"): |
| name, iv = line.split(" = ") |
| iv = iv[0:16] |
| output.append("IV = {0}".format(iv)) |
| elif line.startswith("PLAINTEXT"): |
| name, plaintext = line.split(" = ") |
| output.append("PLAINTEXT = {0}".format(plaintext)) |
| |
| output.append("CIPHERTEXT = {0}".format(encrypt(mode, key, iv, plaintext))) |
| return "\n".join(output) |
| |
| |
| def write_file(data, filename): |
| with open(filename, "w") as f: |
| f.write(data) |
| |
| |
| CBC_PATH = "tests/hazmat/primitives/vectors/ciphers/AES/CBC/CBCMMT128.rsp" |
| write_file(build_vectors(modes.CBC, CBC_PATH), "idea-cbc.txt") |
| OFB_PATH = "tests/hazmat/primitives/vectors/ciphers/AES/OFB/OFBMMT128.rsp" |
| write_file(build_vectors(modes.OFB, OFB_PATH), "idea-ofb.txt") |
| CFB_PATH = "tests/hazmat/primitives/vectors/ciphers/AES/CFB/CFB128MMT128.rsp" |
| write_file(build_vectors(modes.CFB, CFB_PATH), "idea-cfb.txt") |