Skip to content

Commit 9b57d42

Browse files
committed
[nrf mergeup] merge upsteram up to commit aab2118
Signed-off-by: Andrzej Puzdrowski <[email protected]>
2 parents 289f108 + aab2118 commit 9b57d42

File tree

6 files changed

+95
-45
lines changed

6 files changed

+95
-45
lines changed

boot/zephyr/Kconfig

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -206,22 +206,9 @@ config ZEPHYR_TRY_MASS_ERASE
206206

207207
This is not available for all targets.
208208

209-
config BOOT_HAVE_LOGGING
210-
bool "MCUboot have logging enabled"
211-
default y
212-
select LOG
213-
select LOG_IMMEDIATE
214-
help
215-
If y, enables logging on the serial port. The log level can
216-
be defined by setting `CONFIG_MCUBOOT_LOG_LEVEL_*`.
217-
If unsure, leave at the default value.
218-
219-
if BOOT_HAVE_LOGGING
220209
module = MCUBOOT
221-
module-dep = LOG
222-
module-str = Log level for MCUBOOT application
210+
module-str = MCUBoot bootloader
223211
source "subsys/logging/Kconfig.template.log_config"
224-
endif
225212

226213
menuconfig MCUBOOT_SERIAL
227214
bool "MCUboot serial recovery"

boot/zephyr/prj.conf

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,5 +39,7 @@ CONFIG_MULTITHREADING=n
3939
# CONFIG_BT_CTLR is not set
4040
# CONFIG_I2C is not set
4141

42+
CONFIG_LOG=y
43+
CONFIG_LOG_IMMEDIATE=y
4244
### Ensure Zephyr logging changes don't use more resources
4345
CONFIG_LOG_DEFAULT_LEVEL=0

repository.yml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ repo.versions:
2727
"1.3.0": "v1.3.0"
2828

2929
"0-dev": "0.0.0" # master
30-
"0-latest": "1.2.0" # latest stable release
30+
"0-latest": "1.3.0" # latest stable release
31+
"1-latest": "1.3.0" # latest stable release
3132

32-
"1.0-latest": "1.2.0"
33+
"1.0-latest": "1.3.0"

samples/zephyr/hello-world/CMakeLists.txt

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,6 @@
1111

1212
cmake_minimum_required(VERSION 3.8)
1313

14-
# The default top-level application configuration is prj.conf.
15-
# You can place additional board-specific files in boards/${BOARD}.conf,
16-
# and they will be merged into the configuration along with prj.conf.
17-
macro(set_conf_file)
18-
if(EXISTS ${APPLICATION_SOURCE_DIR}/boards/${BOARD}.conf)
19-
set(CONF_FILE "prj.conf ${APPLICATION_SOURCE_DIR}/boards/${BOARD}.conf")
20-
else()
21-
set(CONF_FILE "prj.conf")
22-
endif()
23-
endmacro()
24-
2514
# Standard Zephyr application boilerplate.
2615
include($ENV{ZEPHYR_BASE}/cmake/app/boilerplate.cmake NO_POLICY_SCOPE)
2716
project(NONE)

scripts/imgtool/image.py

Lines changed: 58 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# Copyright 2018 Nordic Semiconductor ASA
22
# Copyright 2017 Linaro Limited
3+
# Copyright 2019 Arm Limited
34
#
45
# Licensed under the Apache License, Version 2.0 (the "License");
56
# you may not use this file except in compliance with the License.
@@ -32,6 +33,8 @@
3233
BIN_EXT = "bin"
3334
INTEL_HEX_EXT = "hex"
3435
DEFAULT_MAX_SECTORS = 128
36+
DEP_IMAGES_KEY = "images"
37+
DEP_VERSIONS_KEY = "versions"
3538

3639
# Image header flags.
3740
IMAGE_F = {
@@ -48,6 +51,7 @@
4851
'ECDSA256': 0x22,
4952
'ENCRSA2048': 0x30,
5053
'ENCKW128': 0x31,
54+
'DEPENDENCY': 0x40
5155
}
5256

5357
TLV_INFO_SIZE = 4
@@ -168,11 +172,49 @@ def check(self):
168172
len(self.payload), tsize, self.slot_size)
169173
raise Exception(msg)
170174

171-
def create(self, key, enckey):
172-
self.add_header(enckey)
175+
def create(self, key, enckey, dependencies=None):
176+
if dependencies is None:
177+
dependencies_num = 0
178+
protected_tlv_size = 0
179+
else:
180+
# Size of a Dependency TLV = Header ('BBH') + Payload('IBBHI')
181+
# = 16 Bytes
182+
dependencies_num = len(dependencies[DEP_IMAGES_KEY])
183+
protected_tlv_size = (dependencies_num * 16) + TLV_INFO_SIZE
184+
185+
self.add_header(enckey, protected_tlv_size)
173186

174187
tlv = TLV(self.endian)
175188

189+
if protected_tlv_size != 0:
190+
for i in range(dependencies_num):
191+
e = STRUCT_ENDIAN_DICT[self.endian]
192+
payload = struct.pack(
193+
e + 'I'+'BBHI',
194+
int(dependencies[DEP_IMAGES_KEY][i]),
195+
dependencies[DEP_VERSIONS_KEY][i].major,
196+
dependencies[DEP_VERSIONS_KEY][i].minor,
197+
dependencies[DEP_VERSIONS_KEY][i].revision,
198+
dependencies[DEP_VERSIONS_KEY][i].build
199+
)
200+
tlv.add('DEPENDENCY', payload)
201+
# Full TLV size needs to be calculated in advance, because the
202+
# header will be protected as well
203+
tlv_header_size = 4
204+
payload_digest_size = 32
205+
keyhash_size = 32
206+
cipherkey_size = 32
207+
208+
full_size = TLV_INFO_SIZE + len(tlv.buf) + tlv_header_size \
209+
+ payload_digest_size
210+
if key is not None:
211+
full_size += tlv_header_size + keyhash_size \
212+
+ tlv_header_size + key.sig_len()
213+
if enckey is not None:
214+
full_size += tlv_header_size + cipherkey_size
215+
tlv_header = struct.pack(e + 'HH', TLV_INFO_MAGIC, full_size)
216+
self.payload += tlv_header + bytes(tlv.buf)
217+
176218
# Note that ecdsa wants to do the hashing itself, which means
177219
# we get to hash it twice.
178220
sha = hashlib.sha256()
@@ -208,9 +250,9 @@ def create(self, key, enckey):
208250
self.payload[self.header_size:] = encryptor.update(img) + \
209251
encryptor.finalize()
210252

211-
self.payload += tlv.get()
253+
self.payload += tlv.get()[protected_tlv_size:]
212254

213-
def add_header(self, enckey):
255+
def add_header(self, enckey, protected_tlv_size):
214256
"""Install the image header."""
215257

216258
flags = 0
@@ -219,29 +261,29 @@ def add_header(self, enckey):
219261

220262
e = STRUCT_ENDIAN_DICT[self.endian]
221263
fmt = (e +
222-
# type ImageHdr struct {
223-
'I' + # Magic uint32
224-
'I' + # LoadAddr uint32
225-
'H' + # HdrSz uint16
226-
'H' + # Pad1 uint16
227-
'I' + # ImgSz uint32
228-
'I' + # Flags uint32
229-
'BBHI' + # Vers ImageVersion
230-
'I' # Pad2 uint32
231-
) # }
264+
# type ImageHdr struct {
265+
'I' + # Magic uint32
266+
'I' + # LoadAddr uint32
267+
'H' + # HdrSz uint16
268+
'H' + # PTLVSz uint16
269+
'I' + # ImgSz uint32
270+
'I' + # Flags uint32
271+
'BBHI' + # Vers ImageVersion
272+
'I' # Pad1 uint32
273+
) # }
232274
assert struct.calcsize(fmt) == IMAGE_HEADER_SIZE
233275
header = struct.pack(fmt,
234276
IMAGE_MAGIC,
235277
0, # LoadAddr
236278
self.header_size,
237-
0, # Pad1
279+
protected_tlv_size, # TLV Info header + Dependency TLVs
238280
len(self.payload) - self.header_size, # ImageSz
239281
flags, # Flags
240282
self.version.major,
241283
self.version.minor or 0,
242284
self.version.revision or 0,
243285
self.version.build or 0,
244-
0) # Pad2
286+
0) # Pad1
245287
self.payload = bytearray(self.payload)
246288
self.payload[:len(header)] = header
247289

scripts/imgtool/main.py

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#! /usr/bin/env python3
22
#
33
# Copyright 2017 Linaro Limited
4+
# Copyright 2019 Arm Limited
45
#
56
# Licensed under the Apache License, Version 2.0 (the "License");
67
# you may not use this file except in compliance with the License.
@@ -14,6 +15,7 @@
1415
# See the License for the specific language governing permissions and
1516
# limitations under the License.
1617

18+
import re
1719
import click
1820
import getpass
1921
import imgtool.keys as keys
@@ -106,6 +108,29 @@ def validate_header_size(ctx, param, value):
106108
return value
107109

108110

111+
def get_dependencies(ctx, param, value):
112+
if value is not None:
113+
versions = []
114+
images = re.findall(r"\((\d+)", value)
115+
if len(images) == 0:
116+
raise click.BadParameter(
117+
"Image dependency format is invalid: {}".format(value))
118+
raw_versions = re.findall(r",\s*([0-9.+]+)\)", value)
119+
if len(images) != len(raw_versions):
120+
raise click.BadParameter(
121+
'''There's a mismatch between the number of dependency images
122+
and versions in: {}'''.format(value))
123+
for raw_version in raw_versions:
124+
try:
125+
versions.append(decode_version(raw_version))
126+
except ValueError as e:
127+
raise click.BadParameter("{}".format(e))
128+
dependencies = dict()
129+
dependencies[image.DEP_IMAGES_KEY] = images
130+
dependencies[image.DEP_VERSIONS_KEY] = versions
131+
return dependencies
132+
133+
109134
class BasedIntParamType(click.ParamType):
110135
name = 'integer'
111136

@@ -138,6 +163,9 @@ def convert(self, value, param, ctx):
138163
help='Add --header-size zeroed bytes at the beginning of the image')
139164
@click.option('-H', '--header-size', callback=validate_header_size,
140165
type=BasedIntParamType(), required=True)
166+
@click.option('-d', '--dependencies', callback=get_dependencies,
167+
required=False, help='''Add dependence on another image, format:
168+
"(<image_ID>,<image_version>), ... "''')
141169
@click.option('-v', '--version', callback=validate_version, required=True)
142170
@click.option('--align', type=click.Choice(['1', '2', '4', '8']),
143171
required=True)
@@ -146,7 +174,8 @@ def convert(self, value, param, ctx):
146174
INFILE and OUTFILE are parsed as Intel HEX if the params have
147175
.hex extension, othewise binary format is used''')
148176
def sign(key, align, version, header_size, pad_header, slot_size, pad,
149-
max_sectors, overwrite_only, endian, encrypt, infile, outfile):
177+
max_sectors, overwrite_only, endian, encrypt, infile, outfile,
178+
dependencies):
150179
img = image.Image(version=decode_version(version), header_size=header_size,
151180
pad_header=pad_header, pad=pad, align=int(align),
152181
slot_size=slot_size, max_sectors=max_sectors,
@@ -159,7 +188,7 @@ def sign(key, align, version, header_size, pad_header, slot_size, pad,
159188
raise Exception("Encryption only available with RSA key")
160189
if key and not isinstance(key, keys.RSA2048):
161190
raise Exception("Signing only available with private RSA key")
162-
img.create(key, enckey)
191+
img.create(key, enckey, dependencies)
163192
img.save(outfile)
164193

165194

0 commit comments

Comments
 (0)