Skip to content

Commit fd8cb31

Browse files
committed
[nrf fromlist] scripts: imgtool: fix compression with encryption
adds TLV which stores compressed image size in case encryption is on. This is to avoid wrong streaam size due to encryption padding. Upstream PR #: 2170 Signed-off-by: Mateusz Michalek <mateusz.michalek@nordicsemi.no> (cherry picked from commit a44416620f8475692cc5509532801164e80fb50d)
1 parent b82206c commit fd8cb31

File tree

2 files changed

+21
-8
lines changed

2 files changed

+21
-8
lines changed

scripts/imgtool/image.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@
9494
'DECOMP_SIZE': 0x70,
9595
'DECOMP_SHA': 0x71,
9696
'DECOMP_SIGNATURE': 0x72,
97+
'COMP_DEC_SIZE' : 0x73,
9798
}
9899

99100
TLV_SIZE = 4
@@ -459,7 +460,7 @@ def create(self, key, public_key_format, enckey, dependencies=None,
459460
sw_type=None, custom_tlvs=None, compression_tlvs=None,
460461
compression_type=None, encrypt_keylen=128, clear=False,
461462
fixed_sig=None, pub_key=None, vector_to_sign=None,
462-
user_sha='auto', is_pure=False):
463+
user_sha='auto', is_pure=False, keep_comp_size=False, dont_encrypt=False):
463464
self.enckey = enckey
464465

465466
# key decides on sha, then pub_key; of both are none default is used
@@ -521,6 +522,9 @@ def create(self, key, public_key_format, enckey, dependencies=None,
521522
dependencies_num = len(dependencies[DEP_IMAGES_KEY])
522523
protected_tlv_size += (dependencies_num * 16)
523524

525+
if keep_comp_size:
526+
compression_tlvs["COMP_DEC_SIZE"] = struct.pack(
527+
self.get_struct_endian() + 'L', self.image_size)
524528
if compression_tlvs is not None:
525529
for value in compression_tlvs.values():
526530
protected_tlv_size += TLV_SIZE + len(value)
@@ -536,7 +540,7 @@ def create(self, key, public_key_format, enckey, dependencies=None,
536540
#
537541
# This adds the padding if image is not aligned to the 16 Bytes
538542
# in encrypted mode
539-
if self.enckey is not None:
543+
if self.enckey is not None and dont_encrypt is False:
540544
pad_len = len(self.payload) % 16
541545
if pad_len > 0:
542546
pad = bytes(16 - pad_len)
@@ -593,6 +597,7 @@ def create(self, key, public_key_format, enckey, dependencies=None,
593597
prot_tlv.add(tag, value)
594598

595599
protected_tlv_off = len(self.payload)
600+
596601
self.payload += prot_tlv.get()
597602

598603
tlv = TLV(self.endian)
@@ -657,7 +662,7 @@ def create(self, key, public_key_format, enckey, dependencies=None,
657662
if protected_tlv_off is not None:
658663
self.payload = self.payload[:protected_tlv_off]
659664

660-
if enckey is not None:
665+
if enckey is not None and dont_encrypt is False:
661666
if encrypt_keylen == 256:
662667
plainkey = os.urandom(32)
663668
else:

scripts/imgtool/main.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -521,12 +521,11 @@ def sign(key, public_key_format, align, version, pad_sig, header_size,
521521
'Pure signatures, currently, enforces preferred hash algorithm, '
522522
'and forbids sha selection by user.')
523523

524-
img.create(key, public_key_format, enckey, dependencies, boot_record,
524+
if compression in ["lzma2", "lzma2armthumb"]:
525+
img.create(key, public_key_format, enckey, dependencies, boot_record,
525526
custom_tlvs, compression_tlvs, None, int(encrypt_keylen), clear,
526527
baked_signature, pub_key, vector_to_sign, user_sha=user_sha,
527-
is_pure=is_pure)
528-
529-
if compression in ["lzma2", "lzma2armthumb"]:
528+
is_pure=is_pure, keep_comp_size=False, dont_encrypt=True)
530529
compressed_img = image.Image(version=decode_version(version),
531530
header_size=header_size, pad_header=pad_header,
532531
pad=pad, confirm=confirm, align=int(align),
@@ -562,11 +561,20 @@ def sign(key, public_key_format, align, version, pad_sig, header_size,
562561
lc = comp_default_lc, lp = comp_default_lp)
563562
compressed_img.load_compressed(compressed_data, compression_header)
564563
compressed_img.base_addr = img.base_addr
564+
keep_comp_size = False;
565+
if enckey:
566+
keep_comp_size = True
565567
compressed_img.create(key, public_key_format, enckey,
566568
dependencies, boot_record, custom_tlvs, compression_tlvs,
567569
compression, int(encrypt_keylen), clear, baked_signature,
568-
pub_key, vector_to_sign)
570+
pub_key, vector_to_sign, user_sha=user_sha,
571+
is_pure=is_pure, keep_comp_size=keep_comp_size)
569572
img = compressed_img
573+
else:
574+
img.create(key, public_key_format, enckey, dependencies, boot_record,
575+
custom_tlvs, compression_tlvs, None, int(encrypt_keylen), clear,
576+
baked_signature, pub_key, vector_to_sign, user_sha=user_sha,
577+
is_pure=is_pure)
570578
img.save(outfile, hex_addr)
571579
if sig_out is not None:
572580
new_signature = img.get_signature()

0 commit comments

Comments
 (0)