69 lines
2.3 KiB
Python
69 lines
2.3 KiB
Python
# 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")
|