1bc420748SJens Wiklander#!/usr/bin/env python 21bb92983SJerome Forissier# SPDX-License-Identifier: BSD-2-Clause 3bc420748SJens Wiklander# 4bc420748SJens Wiklander# Copyright (c) 2015, Linaro Limited 5bc420748SJens Wiklander# 6bc420748SJens Wiklander 7049aefa8SJerome Forissier 8bc420748SJens Wiklanderdef get_args(): 9bc420748SJens Wiklander import argparse 10bc420748SJens Wiklander 11bc420748SJens Wiklander parser = argparse.ArgumentParser() 12049aefa8SJerome Forissier parser.add_argument( 13049aefa8SJerome Forissier '--prefix', 14049aefa8SJerome Forissier required=True, 15bc420748SJens Wiklander help='Prefix for the public key exponent and modulus in c file') 16bc420748SJens Wiklander 17049aefa8SJerome Forissier parser.add_argument('--out', required=True, 18bc420748SJens Wiklander help='Name of c file for the public key') 19bc420748SJens Wiklander 20bc420748SJens Wiklander parser.add_argument('--key', required=True, help='Name of key file') 21bc420748SJens Wiklander 22bc420748SJens Wiklander return parser.parse_args() 23bc420748SJens Wiklander 24049aefa8SJerome Forissier 25bc420748SJens Wiklanderdef main(): 26bc420748SJens Wiklander import array 27bc420748SJens Wiklander from Crypto.PublicKey import RSA 28bc420748SJens Wiklander from Crypto.Util.number import long_to_bytes 29bc420748SJens Wiklander 30049aefa8SJerome Forissier args = get_args() 31bc420748SJens Wiklander 32bc420748SJens Wiklander f = open(args.key, 'r') 33bc420748SJens Wiklander key = RSA.importKey(f.read()) 34bc420748SJens Wiklander f.close 35bc420748SJens Wiklander 36*0a6f2bcaSMarkus S. Wamser # Refuse public exponent with more than 32 bits. Otherwise the C 37*0a6f2bcaSMarkus S. Wamser # compiler may simply truncate the value and proceed. 38*0a6f2bcaSMarkus S. Wamser # This will lead to TAs seemingly having invalid signatures with a 39*0a6f2bcaSMarkus S. Wamser # possible security issue for any e = k*2^32 + 1 (for any integer k). 40*0a6f2bcaSMarkus S. Wamser if key.publickey().e > 0xffffffff: 41*0a6f2bcaSMarkus S. Wamser raise ValueError( 42*0a6f2bcaSMarkus S. Wamser 'Unsupported large public exponent detected. ' + 43*0a6f2bcaSMarkus S. Wamser 'OP-TEE handles only public exponents up to 2^32 - 1.') 44*0a6f2bcaSMarkus S. Wamser 45bc420748SJens Wiklander f = open(args.out, 'w') 46bc420748SJens Wiklander 47049aefa8SJerome Forissier f.write("#include <stdint.h>\n") 48049aefa8SJerome Forissier f.write("#include <stddef.h>\n\n") 49bc420748SJens Wiklander 50bc420748SJens Wiklander f.write("const uint32_t " + args.prefix + "_exponent = " + 51bc420748SJens Wiklander str(key.publickey().e) + ";\n\n") 52bc420748SJens Wiklander 53bc420748SJens Wiklander f.write("const uint8_t " + args.prefix + "_modulus[] = {\n") 54049aefa8SJerome Forissier i = 0 55bc420748SJens Wiklander for x in array.array("B", long_to_bytes(key.publickey().n)): 56bc420748SJens Wiklander f.write("0x" + '{0:02x}'.format(x) + ",") 57049aefa8SJerome Forissier i = i + 1 58bc420748SJens Wiklander if i % 8 == 0: 59049aefa8SJerome Forissier f.write("\n") 60bc420748SJens Wiklander else: 61049aefa8SJerome Forissier f.write(" ") 62049aefa8SJerome Forissier f.write("};\n") 63bc420748SJens Wiklander 64049aefa8SJerome Forissier f.write("const size_t " + args.prefix + "_modulus_size = sizeof(" + 65bc420748SJens Wiklander args.prefix + "_modulus);\n") 66bc420748SJens Wiklander 67bc420748SJens Wiklander f.close() 68bc420748SJens Wiklander 69049aefa8SJerome Forissier 70bc420748SJens Wiklanderif __name__ == "__main__": 71bc420748SJens Wiklander main() 72