| # This file is dual licensed under the terms of the Apache License, Version |
| # 2.0, and the BSD License. See the LICENSE file in the root of this repository |
| # for complete details. |
| |
| from __future__ import absolute_import, division, print_function |
| |
| import binascii |
| |
| from cryptography.hazmat.backends import default_backend |
| from cryptography.hazmat.primitives.ciphers import algorithms, base, modes |
| |
| |
| def encrypt(mode, key, iv, plaintext): |
| cipher = base.Cipher( |
| algorithms.CAST5(binascii.unhexlify(key)), |
| mode(binascii.unhexlify(iv)), |
| default_backend() |
| ) |
| encryptor = cipher.encryptor() |
| ct = encryptor.update(binascii.unhexlify(plaintext)) |
| ct += encryptor.finalize() |
| return binascii.hexlify(ct) |
| |
| |
| def build_vectors(mode, filename): |
| vector_file = open(filename, "r") |
| |
| 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 = {}".format( |
| encrypt(mode, key, iv, plaintext)) |
| ) |
| output.append("\nCOUNT = {}".format(count)) |
| count += 1 |
| name, key = line.split(" = ") |
| output.append("KEY = {}".format(key)) |
| elif line.startswith("IV"): |
| name, iv = line.split(" = ") |
| iv = iv[0:16] |
| output.append("IV = {}".format(iv)) |
| elif line.startswith("PLAINTEXT"): |
| name, plaintext = line.split(" = ") |
| output.append("PLAINTEXT = {}".format(plaintext)) |
| |
| output.append("CIPHERTEXT = {}".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), "cast5-cbc.txt") |
| ofb_path = "tests/hazmat/primitives/vectors/ciphers/AES/OFB/OFBMMT128.rsp" |
| write_file(build_vectors(modes.OFB, ofb_path), "cast5-ofb.txt") |
| cfb_path = "tests/hazmat/primitives/vectors/ciphers/AES/CFB/CFB128MMT128.rsp" |
| write_file(build_vectors(modes.CFB, cfb_path), "cast5-cfb.txt") |
| ctr_path = "tests/hazmat/primitives/vectors/ciphers/AES/CTR/aes-128-ctr.txt" |
| write_file(build_vectors(modes.CTR, ctr_path), "cast5-ctr.txt") |