imgtool: Add rust pubkey generation
Add a `--rust` flag to the getpub subcommand to output the public key in
Rust format rather than C.
Signed-off-by: David Brown <david.brown@linaro.org>
diff --git a/scripts/imgtool.py b/scripts/imgtool.py
index 6f0fb4e..ea28934 100755
--- a/scripts/imgtool.py
+++ b/scripts/imgtool.py
@@ -26,7 +26,13 @@
def do_getpub(args):
key = keys.load(args.key)
- key.emit_c()
+ if args.lang == 'c':
+ key.emit_c()
+ elif args.lang == 'rust':
+ key.emit_rust()
+ else:
+ msg = "Unsupported language, valid are: c, or rust"
+ raise argparse.ArgumentTypeError(msg)
def do_sign(args):
if args.rsa_pkcs1_15:
@@ -73,6 +79,7 @@
getpub = subs.add_parser('getpub', help='Get public key from keypair')
getpub.add_argument('-k', '--key', metavar='filename', required=True)
+ getpub.add_argument('-l', '--lang', metavar='lang', default='c')
sign = subs.add_parser('sign', help='Sign an image with a private key')
sign.add_argument('-k', '--key', metavar='filename')
diff --git a/scripts/imgtool/keys.py b/scripts/imgtool/keys.py
index e81f6f6..fddfec9 100644
--- a/scripts/imgtool/keys.py
+++ b/scripts/imgtool/keys.py
@@ -34,13 +34,16 @@
with open(path, 'wb') as f:
f.write(self.key.exportKey('PEM'))
- def emit_c(self):
+ def get_public_bytes(self):
node = RSAPublicKey()
node['modulus'] = self.key.n
node['publicExponent'] = self.key.e
+ return bytearray(encode(node))
+
+ def emit_c(self):
print(AUTOGEN_MESSAGE)
print("const unsigned char rsa_pub_key[] = {", end='')
- encoded = bytearray(encode(node))
+ encoded = self.get_public_bytes()
for count, b in enumerate(encoded):
if count % 8 == 0:
print("\n\t", end='')
@@ -50,6 +53,18 @@
print("\n};")
print("const unsigned int rsa_pub_key_len = {};".format(len(encoded)))
+ def emit_rust(self):
+ print(AUTOGEN_MESSAGE)
+ print("static RSA_PUB_KEY: &'static [u8] = &[", end='')
+ encoded = self.get_public_bytes()
+ for count, b in enumerate(encoded):
+ if count % 8 == 0:
+ print("\n ", end='')
+ else:
+ print(" ", end='')
+ print("0x{:02x},".format(b), end='')
+ print("\n];")
+
def sig_type(self):
"""Return the type of this signature (as a string)"""
if sign_rsa_pss: