diff --git a/scripts/imgtool/image.py b/scripts/imgtool/image.py index 919b8ccafb..a59e0b4ed4 100644 --- a/scripts/imgtool/image.py +++ b/scripts/imgtool/image.py @@ -306,7 +306,7 @@ def ecies_hkdf(self, enckey, plainkey): return cipherkey, ciphermac, pubk def create(self, key, public_key_format, enckey, dependencies=None, - sw_type=None, custom_tlvs=None, encrypt_keylen=128, clear=False, fixed_sig=None, pub_key=None, vector_to_sign=None): + sw_type=None, custom_tlvs=None, encrypt_keylen=128, clear=False, fixed_sig=None, pub_key=None, vector_to_sign=None, use_legacy_tlv=False): self.enckey = enckey # Check what hashing algorithm should be used @@ -469,10 +469,17 @@ def create(self, key, public_key_format, enckey, dependencies=None, else: print(os.path.basename(__file__) + ": sign the digest") sig = key.sign_digest(digest) - tlv.add(key.sig_tlv(), sig) + # only ecdsa256 has legacy tlv type + if use_legacy_tlv and isinstance(key, ecdsa.ECDSA256P1): + tlv.add(key.legacy_sig_tlv(),sig) + else: + tlv.add(key.sig_tlv(), sig) self.signature = sig elif fixed_sig is not None and key is None: - tlv.add(pub_key.sig_tlv(), fixed_sig['value']) + if use_legacy_tlv and isinstance(pub_key, ecdsa.ECDSA256P1Public): + tlv.add(pub_key.legacy_sig_tlv(), fixed_sig['value']) + else: + tlv.add(pub_key.sig_tlv(), fixed_sig['value']) self.signature = fixed_sig['value'] else: raise click.UsageError("Can not sign using key and provide fixed-signature at the same time") diff --git a/scripts/imgtool/main.py b/scripts/imgtool/main.py index 04a4769e28..0a0b23e9db 100755 --- a/scripts/imgtool/main.py +++ b/scripts/imgtool/main.py @@ -354,6 +354,8 @@ def convert(self, value, param, ctx): help='send to OUTFILE the payload or payload''s digest instead ' 'of complied image. These data can be used for external image ' 'signing') +@click.option('--legacy-ecdsa-tlv', default=False, is_flag=True, + help='Use the old curve specific ECDSA TLV') @click.command(help='''Create a signed or unsigned image\n INFILE and OUTFILE are parsed as Intel HEX if the params have .hex extension, otherwise binary format is used''') @@ -362,7 +364,7 @@ def sign(key, public_key_format, align, version, pad_sig, header_size, endian, encrypt_keylen, encrypt, infile, outfile, dependencies, load_addr, hex_addr, erased_val, save_enctlv, security_counter, boot_record, custom_tlv, rom_fixed, max_align, clear, fix_sig, - fix_sig_pubkey, sig_out, vector_to_sign): + fix_sig_pubkey, sig_out, vector_to_sign, legacy_ecdsa_tlv): if confirm: # Confirmed but non-padded images don't make much sense, because @@ -429,7 +431,7 @@ def sign(key, public_key_format, align, version, pad_sig, header_size, img.create(key, public_key_format, enckey, dependencies, boot_record, custom_tlvs, int(encrypt_keylen), clear, baked_signature, - pub_key, vector_to_sign) + pub_key, vector_to_sign, legacy_ecdsa_tlv) img.save(outfile, hex_addr) if sig_out is not None: