xref: /optee_os/scripts/pem_to_pub_c.py (revision 1bb929836182ecb96d2d9d268daa807c67596396)
1bc420748SJens Wiklander#!/usr/bin/env python
2*1bb92983SJerome Forissier# SPDX-License-Identifier: BSD-2-Clause
3bc420748SJens Wiklander#
4bc420748SJens Wiklander# Copyright (c) 2015, Linaro Limited
5bc420748SJens Wiklander# All rights reserved.
6bc420748SJens Wiklander#
7bc420748SJens Wiklander# Redistribution and use in source and binary forms, with or without
8bc420748SJens Wiklander# modification, are permitted provided that the following conditions are met:
9bc420748SJens Wiklander#
10bc420748SJens Wiklander# 1. Redistributions of source code must retain the above copyright notice,
11bc420748SJens Wiklander# this list of conditions and the following disclaimer.
12bc420748SJens Wiklander#
13bc420748SJens Wiklander# 2. Redistributions in binary form must reproduce the above copyright notice,
14bc420748SJens Wiklander# this list of conditions and the following disclaimer in the documentation
15bc420748SJens Wiklander# and/or other materials provided with the distribution.
16bc420748SJens Wiklander#
17bc420748SJens Wiklander# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18bc420748SJens Wiklander# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19bc420748SJens Wiklander# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20bc420748SJens Wiklander# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
21bc420748SJens Wiklander# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22bc420748SJens Wiklander# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23bc420748SJens Wiklander# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24bc420748SJens Wiklander# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25bc420748SJens Wiklander# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26bc420748SJens Wiklander# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27bc420748SJens Wiklander# POSSIBILITY OF SUCH DAMAGE.
28bc420748SJens Wiklander#
29bc420748SJens Wiklander
30bc420748SJens Wiklanderdef get_args():
31bc420748SJens Wiklander	import argparse
32bc420748SJens Wiklander
33bc420748SJens Wiklander	parser = argparse.ArgumentParser()
34bc420748SJens Wiklander	parser.add_argument('--prefix', required=True, \
35bc420748SJens Wiklander		help='Prefix for the public key exponent and modulus in c file')
36bc420748SJens Wiklander
37bc420748SJens Wiklander	parser.add_argument('--out', required=True, \
38bc420748SJens Wiklander		help='Name of c file for the public key')
39bc420748SJens Wiklander
40bc420748SJens Wiklander	parser.add_argument('--key', required=True, help='Name of key file')
41bc420748SJens Wiklander
42bc420748SJens Wiklander	return parser.parse_args()
43bc420748SJens Wiklander
44bc420748SJens Wiklanderdef main():
45bc420748SJens Wiklander	import array
46bc420748SJens Wiklander	from Crypto.PublicKey import RSA
47bc420748SJens Wiklander	from Crypto.Util.number import long_to_bytes
48bc420748SJens Wiklander
49bc420748SJens Wiklander	args = get_args();
50bc420748SJens Wiklander
51bc420748SJens Wiklander	f = open(args.key, 'r')
52bc420748SJens Wiklander	key = RSA.importKey(f.read())
53bc420748SJens Wiklander	f.close
54bc420748SJens Wiklander
55bc420748SJens Wiklander	f = open(args.out, 'w')
56bc420748SJens Wiklander
57bc420748SJens Wiklander	f.write("#include <stdint.h>\n");
58bc420748SJens Wiklander	f.write("#include <stddef.h>\n\n");
59bc420748SJens Wiklander
60bc420748SJens Wiklander	f.write("const uint32_t " + args.prefix + "_exponent = " +
61bc420748SJens Wiklander		str(key.publickey().e) + ";\n\n")
62bc420748SJens Wiklander
63bc420748SJens Wiklander	f.write("const uint8_t " + args.prefix + "_modulus[] = {\n")
64bc420748SJens Wiklander	i = 0;
65bc420748SJens Wiklander	for x in array.array("B", long_to_bytes(key.publickey().n)):
66bc420748SJens Wiklander		f.write("0x" + '{0:02x}'.format(x) + ",")
67bc420748SJens Wiklander		i = i + 1;
68bc420748SJens Wiklander		if i % 8 == 0:
69bc420748SJens Wiklander			f.write("\n");
70bc420748SJens Wiklander		else:
71bc420748SJens Wiklander			f.write(" ");
72bc420748SJens Wiklander	f.write("};\n");
73bc420748SJens Wiklander
74bc420748SJens Wiklander	f.write("const size_t " + args.prefix + "_modulus_size = sizeof(" + \
75bc420748SJens Wiklander		args.prefix + "_modulus);\n")
76bc420748SJens Wiklander
77bc420748SJens Wiklander	f.close()
78bc420748SJens Wiklander
79bc420748SJens Wiklanderif __name__ == "__main__":
80bc420748SJens Wiklander	main()
81