blob: eb6639db631347277632acb7f9dffff35d375f4b [file] [log] [blame]
#!/usr/bin/env python3
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
import os
AES_128_KEY = "aes_128_key"
AES_128_INPUT = "aes_128_input"
AES_128_ECB_EXPECTED = "aes_128_ecb_expected"
AES_128_CBC_IV = "aes_128_cbc_iv"
AES_128_CBC_EXPECTED = "aes_128_cbc_expected"
AES_128_CTR_NONCE = "aes_128_ctr_nonce"
AES_128_CTR_EXPECTED = "aes_128_ctr_expected"
LICENSE = """
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
"""
def write_header(f):
f.write(LICENSE)
f.write("\n/* Auto-generated file */\n\n")
f.write("#include <stdint.h>\n\n")
def write_buffer(f, name, _type, buffer):
f.write("{} {}[] = {{".format(_type, name))
li = list(buffer)
for i, el in enumerate(li):
if i % 8 == 0:
f.write("\n ")
else:
f.write(" ")
f.write("0x{:02x},".format(el))
f.write("\n};\n\n")
def write_aes_128_ecb_tables(f, key, inbuf):
backend = default_backend()
cipher = Cipher(algorithms.AES(key), modes.ECB(), backend=backend)
encryptor = cipher.encryptor()
ct = encryptor.update(inbuf) + encryptor.finalize()
write_buffer(f, AES_128_ECB_EXPECTED, "uint8_t", ct)
def write_aes_128_cbc_tables(f, key, inbuf, iv):
backend = default_backend()
cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=backend)
encryptor = cipher.encryptor()
ct = encryptor.update(inbuf) + encryptor.finalize()
write_buffer(f, AES_128_CBC_EXPECTED, "uint8_t", ct)
def write_aes_128_ctr_tables(f, key, inbuf, nonce):
backend = default_backend()
cipher = Cipher(algorithms.AES(key), modes.CTR(nonce), backend=backend)
encryptor = cipher.encryptor()
ct = encryptor.update(inbuf) + encryptor.finalize()
write_buffer(f, AES_128_CTR_EXPECTED, "uint8_t", ct)
if __name__ == "__main__":
with open("tables.c", "w") as f:
write_header(f)
key = os.urandom(16)
write_buffer(f, AES_128_KEY, "uint8_t", key)
iv = os.urandom(16)
write_buffer(f, AES_128_CBC_IV, "uint8_t", iv)
nonce = os.urandom(16)
write_buffer(f, AES_128_CTR_NONCE, "uint8_t", nonce)
inbuf = os.urandom(4096)
write_buffer(f, AES_128_INPUT, "uint8_t", inbuf)
write_aes_128_ecb_tables(f, key, inbuf)
write_aes_128_cbc_tables(f, key, inbuf, iv)
write_aes_128_ctr_tables(f, key, inbuf, nonce)