text: # 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):
      count = 0
      output = []
      key = None
      iv = None
      plaintext = None
  
      with open(filename, "r") as vector_file:
          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")
  