Skip to content

Commit 6cb5d40

Browse files
committed
Revert "[nrf fromlist] scripts: imgtool: compression"
This reverts commit 4927e39.
1 parent 9101a24 commit 6cb5d40

File tree

2 files changed

+15
-135
lines changed

2 files changed

+15
-135
lines changed

scripts/imgtool/image.py

Lines changed: 8 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,7 @@
2020
Image signing and management.
2121
"""
2222

23-
from . import version as versmod
24-
from .boot_record import create_sw_component_data
25-
import click
26-
import copy
27-
from enum import Enum
28-
import array
29-
from intelhex import IntelHex
3023
import hashlib
31-
import array
3224
import os.path
3325
import struct
3426
from enum import Enum
@@ -68,8 +60,6 @@
6860
'NON_BOOTABLE': 0x0000010,
6961
'RAM_LOAD': 0x0000020,
7062
'ROM_FIXED': 0x0000100,
71-
'COMPRESSED_LZMA1': 0x0000200,
72-
'COMPRESSED_LZMA2': 0x0000400,
7363
}
7464

7565
TLV_VALUES = {
@@ -89,9 +79,6 @@
8979
'DEPENDENCY': 0x40,
9080
'SEC_CNT': 0x50,
9181
'BOOT_RECORD': 0x60,
92-
'DECOMP_SIZE': 0x70,
93-
'DECOMP_SHA': 0x71,
94-
'DECOMP_SIGNATURE': 0x72,
9582
}
9683

9784
TLV_SIZE = 4
@@ -250,9 +237,6 @@ def __init__(self, version=None, header_size=IMAGE_HEADER_SIZE,
250237
if load_addr and rom_fixed:
251238
raise click.UsageError("Can not set rom_fixed and load_addr at the same time")
252239

253-
self.image_hash = None
254-
self.image_size = None
255-
self.signature = None
256240
self.version = version or versmod.decode_version("0")
257241
self.header_size = header_size
258242
self.pad_header = pad_header
@@ -268,7 +252,6 @@ def __init__(self, version=None, header_size=IMAGE_HEADER_SIZE,
268252
self.rom_fixed = rom_fixed
269253
self.erased_val = 0xff if erased_val is None else int(erased_val, 0)
270254
self.payload = []
271-
self.infile_data = []
272255
self.enckey = None
273256
self.save_enctlv = save_enctlv
274257
self.enctlv_len = 0
@@ -317,39 +300,19 @@ def __repr__(self):
317300
self.__class__.__name__,
318301
len(self.payload))
319302

320-
def load(self, path, compression_header=None):
303+
def load(self, path):
321304
"""Load an image from a given file"""
322305
ext = os.path.splitext(path)[1][1:].lower()
323306
try:
324307
if ext == INTEL_HEX_EXT:
325308
ih = IntelHex(path)
326-
self.infile_data = ih.tobinarray()
327-
self.payload = copy.copy(self.infile_data)
309+
self.payload = ih.tobinarray()
328310
self.base_addr = ih.minaddr()
329311
else:
330312
with open(path, 'rb') as f:
331-
self.infile_data = f.read()
332-
self.payload = copy.copy(self.infile_data)
333-
if compression_header is not None:
334-
self.payload = compression_header + self.payload
313+
self.payload = f.read()
335314
except FileNotFoundError:
336315
raise click.UsageError("Input file not found")
337-
self.image_size = len(self.payload)
338-
339-
# Add the image header if needed.
340-
if self.pad_header and self.header_size > 0:
341-
if self.base_addr:
342-
# Adjust base_addr for new header
343-
self.base_addr -= self.header_size
344-
self.payload = bytes([self.erased_val] * self.header_size) + \
345-
self.payload
346-
347-
self.check_header()
348-
349-
def load_compressed(self, data, compression_header):
350-
"""Load an image from buffer"""
351-
self.payload = compression_header + data
352-
self.image_size = len(self.payload)
353316

354317
# Add the image header if needed.
355318
if self.pad_header and self.header_size > 0:
@@ -444,8 +407,7 @@ def ecies_hkdf(self, enckey, plainkey):
444407
return cipherkey, ciphermac, pubk
445408

446409
def create(self, key, public_key_format, enckey, dependencies=None,
447-
sw_type=None, custom_tlvs=None, compression_tlvs=None,
448-
compression_type=None, encrypt_keylen=128, clear=False,
410+
sw_type=None, custom_tlvs=None, encrypt_keylen=128, clear=False,
449411
fixed_sig=None, pub_key=None, vector_to_sign=None, user_sha='auto'):
450412
self.enckey = enckey
451413

@@ -508,9 +470,6 @@ def create(self, key, public_key_format, enckey, dependencies=None,
508470
dependencies_num = len(dependencies[DEP_IMAGES_KEY])
509471
protected_tlv_size += (dependencies_num * 16)
510472

511-
if compression_tlvs is not None:
512-
for value in compression_tlvs.values():
513-
protected_tlv_size += TLV_SIZE + len(value)
514473
if custom_tlvs is not None:
515474
for value in custom_tlvs.values():
516475
protected_tlv_size += TLV_SIZE + len(value)
@@ -532,15 +491,11 @@ def create(self, key, public_key_format, enckey, dependencies=None,
532491
else:
533492
self.payload.extend(pad)
534493

535-
compression_flags = 0x0
536-
if compression_tlvs is not None:
537-
if compression_type == "lzma2":
538-
compression_flags = IMAGE_F['COMPRESSED_LZMA2']
539494
# This adds the header to the payload as well
540495
if encrypt_keylen == 256:
541-
self.add_header(enckey, protected_tlv_size, compression_flags, 256)
496+
self.add_header(enckey, protected_tlv_size, 256)
542497
else:
543-
self.add_header(enckey, protected_tlv_size, compression_flags)
498+
self.add_header(enckey, protected_tlv_size)
544499

545500
prot_tlv = TLV(self.endian, TLV_PROT_INFO_MAGIC)
546501

@@ -570,9 +525,6 @@ def create(self, key, public_key_format, enckey, dependencies=None,
570525
)
571526
prot_tlv.add('DEPENDENCY', payload)
572527

573-
if compression_tlvs is not None:
574-
for tag, value in compression_tlvs.items():
575-
prot_tlv.add(tag, value)
576528
if custom_tlvs is not None:
577529
for tag, value in custom_tlvs.items():
578530
prot_tlv.add(tag, value)
@@ -591,7 +543,6 @@ def create(self, key, public_key_format, enckey, dependencies=None,
591543
digest = sha.digest()
592544
message = digest;
593545
tlv.add(hash_tlv, digest)
594-
self.image_hash = digest
595546

596547
if vector_to_sign == 'payload':
597548
# Stop amending data to the image
@@ -671,16 +622,10 @@ def create(self, key, public_key_format, enckey, dependencies=None,
671622

672623
self.check_trailer()
673624

674-
def get_struct_endian(self):
675-
return STRUCT_ENDIAN_DICT[self.endian]
676-
677625
def get_signature(self):
678626
return self.signature
679627

680-
def get_infile_data(self):
681-
return self.infile_data
682-
683-
def add_header(self, enckey, protected_tlv_size, compression_flags, aes_length=128):
628+
def add_header(self, enckey, protected_tlv_size, aes_length=128):
684629
"""Install the image header."""
685630

686631
flags = 0
@@ -718,7 +663,7 @@ def add_header(self, enckey, protected_tlv_size, compression_flags, aes_length=1
718663
protected_tlv_size, # TLV Info header +
719664
# Protected TLVs
720665
len(self.payload) - self.header_size, # ImageSz
721-
flags | compression_flags,
666+
flags,
722667
self.version.major,
723668
self.version.minor or 0,
724669
self.version.revision or 0,

scripts/imgtool/main.py

Lines changed: 7 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -22,24 +22,13 @@
2222
import getpass
2323
import imgtool.keys as keys
2424
import sys
25-
import struct
26-
import os
27-
import lzma
28-
import hashlib
2925
import base64
3026
from imgtool import image, imgtool_version
3127
from imgtool.version import decode_version
3228
from imgtool.dumpinfo import dump_imginfo
3329
from .keys import (
3430
RSAUsageError, ECDSAUsageError, Ed25519UsageError, X25519UsageError)
3531

36-
comp_default_dictsize=131072
37-
comp_default_pb=2
38-
comp_default_lc=3
39-
comp_default_lp=1
40-
comp_default_preset=9
41-
42-
4332
MIN_PYTHON_VERSION = (3, 6)
4433
if sys.version_info < MIN_PYTHON_VERSION:
4534
sys.exit("Python %s.%s or newer is required by imgtool."
@@ -311,14 +300,6 @@ def get_dependencies(ctx, param, value):
311300
dependencies[image.DEP_VERSIONS_KEY] = versions
312301
return dependencies
313302

314-
def create_lzma2_header(dictsize, pb, lc, lp):
315-
header = bytearray()
316-
for i in range(0, 40):
317-
if dictsize <= ((2 | ((i) & 1)) << int((i) / 2 + 11)):
318-
header.append(i)
319-
break
320-
header.append( ( pb * 5 + lp) * 9 + lc)
321-
return header
322303

323304
class BasedIntParamType(click.ParamType):
324305
name = 'integer'
@@ -362,11 +343,6 @@ def convert(self, value, param, ctx):
362343
type=click.Choice(['128', '256']),
363344
help='When encrypting the image using AES, select a 128 bit or '
364345
'256 bit key len.')
365-
@click.option('--compression', default='disabled',
366-
type=click.Choice(['disabled', 'lzma2']),
367-
help='Enable image compression using specified type. '
368-
'Will fall back without image compression automatically '
369-
'if the compression increases the image size.')
370346
@click.option('-c', '--clear', required=False, is_flag=True, default=False,
371347
help='Output a non-encrypted image with encryption capabilities,'
372348
'so it can be installed in the primary slot, and encrypted '
@@ -438,11 +414,10 @@ def convert(self, value, param, ctx):
438414
.hex extension, otherwise binary format is used''')
439415
def sign(key, public_key_format, align, version, pad_sig, header_size,
440416
pad_header, slot_size, pad, confirm, max_sectors, overwrite_only,
441-
endian, encrypt_keylen, encrypt, compression, infile, outfile,
442-
dependencies, load_addr, hex_addr, erased_val, save_enctlv,
443-
security_counter, boot_record, custom_tlv, rom_fixed, max_align,
444-
clear, fix_sig, fix_sig_pubkey, sig_out, user_sha, vector_to_sign,
445-
non_bootable):
417+
endian, encrypt_keylen, encrypt, infile, outfile, dependencies,
418+
load_addr, hex_addr, erased_val, save_enctlv, security_counter,
419+
boot_record, custom_tlv, rom_fixed, max_align, clear, fix_sig,
420+
fix_sig_pubkey, sig_out, user_sha, vector_to_sign, non_bootable):
446421

447422
if confirm:
448423
# Confirmed but non-padded images don't make much sense, because
@@ -456,7 +431,6 @@ def sign(key, public_key_format, align, version, pad_sig, header_size,
456431
erased_val=erased_val, save_enctlv=save_enctlv,
457432
security_counter=security_counter, max_align=max_align,
458433
non_bootable=non_bootable)
459-
compression_tlvs = {}
460434
img.load(infile)
461435
key = load_key(key) if key else None
462436
enckey = load_key(encrypt) if encrypt else None
@@ -510,49 +484,10 @@ def sign(key, public_key_format, align, version, pad_sig, header_size,
510484
}
511485

512486
img.create(key, public_key_format, enckey, dependencies, boot_record,
513-
custom_tlvs, compression_tlvs, int(encrypt_keylen), clear,
514-
baked_signature, pub_key, vector_to_sign, user_sha)
515-
516-
if compression == "lzma2" :
517-
compressed_img = image.Image(version=decode_version(version),
518-
header_size=header_size, pad_header=pad_header,
519-
pad=pad, confirm=confirm, align=int(align),
520-
slot_size=slot_size, max_sectors=max_sectors,
521-
overwrite_only=overwrite_only, endian=endian,
522-
load_addr=load_addr, rom_fixed=rom_fixed,
523-
erased_val=erased_val, save_enctlv=save_enctlv,
524-
security_counter=security_counter, max_align=max_align)
525-
compression_filters = [
526-
{"id": lzma.FILTER_LZMA2, "preset": comp_default_preset,
527-
"dict_size": comp_default_dictsize, "lp": comp_default_lp,
528-
"lc": comp_default_lc}
529-
]
530-
compressed_data = lzma.compress(img.get_infile_data(),filters=compression_filters,
531-
format=lzma.FORMAT_RAW)
532-
uncompressed_size = len(img.get_infile_data())
533-
compressed_size = len(compressed_data)
534-
print("compressed image size:", compressed_size,
535-
"bytes\noriginal image size:", uncompressed_size, "bytes")
536-
compression_tlvs["DECOMP_SIZE"] = struct.pack(
537-
img.get_struct_endian() + 'L', img.image_size)
538-
compression_tlvs["DECOMP_SHA"] = img.image_hash
539-
compression_tlvs_size = len(compression_tlvs["DECOMP_SIZE"])
540-
compression_tlvs_size += len(compression_tlvs["DECOMP_SHA"])
541-
if img.get_signature() is not None and img.get_signature() != "" :
542-
compression_tlvs["DECOMP_SIGNATURE"] = img.get_signature()
543-
compression_tlvs_size += len(compression_tlvs["DECOMP_SIGNATURE"])
544-
if (compressed_size + compression_tlvs_size) < uncompressed_size:
545-
compression_header = create_lzma2_header(
546-
dictsize = comp_default_dictsize, pb = comp_default_pb,
547-
lc = comp_default_lc, lp = comp_default_lp)
548-
compressed_img.load_compressed(compressed_data, compression_header)
549-
compressed_img.base_addr = img.base_addr
550-
compressed_img.create(key, public_key_format, enckey,
551-
dependencies, boot_record, custom_tlvs, compression_tlvs,
552-
compression, int(encrypt_keylen), clear, baked_signature,
553-
pub_key, vector_to_sign)
554-
img = compressed_img
487+
custom_tlvs, int(encrypt_keylen), clear, baked_signature,
488+
pub_key, vector_to_sign, user_sha)
555489
img.save(outfile, hex_addr)
490+
556491
if sig_out is not None:
557492
new_signature = img.get_signature()
558493
save_signature(sig_out, new_signature)

0 commit comments

Comments
 (0)