blob: 095e00cce36511fcb50ac9a440c95aa77c328b1a [file] [log] [blame]
Simon Glassd977ecd2016-07-03 09:40:46 -06001# SPDX-License-Identifier: GPL-2.0+
Tom Rini10e47792018-05-06 17:58:06 -04002# Copyright (c) 2016, Google Inc.
Simon Glassd977ecd2016-07-03 09:40:46 -06003#
4# U-Boot Verified Boot Test
5
6"""
7This tests verified boot in the following ways:
8
9For image verification:
10- Create FIT (unsigned) with mkimage
11- Check that verification shows that no keys are verified
12- Sign image
13- Check that verification shows that a key is now verified
14
15For configuration verification:
16- Corrupt signature and check for failure
17- Create FIT (with unsigned configuration) with mkimage
Simon Glassd5deca02016-07-31 17:35:04 -060018- Check that image verification works
Simon Glassd977ecd2016-07-03 09:40:46 -060019- Sign the FIT and mark the key as 'required' for verification
20- Check that image verification works
21- Corrupt the signature
22- Check that image verification no-longer works
23
24Tests run with both SHA1 and SHA256 hashing.
25"""
26
Simon Glasse9eeca82021-09-19 15:14:48 -060027import os
Simon Glass5e942f72021-02-15 17:08:08 -070028import shutil
Teddy Reede6a47832018-06-09 11:38:05 -040029import struct
Simon Glass861b5042020-03-18 11:44:05 -060030import pytest
Simon Glassd977ecd2016-07-03 09:40:46 -060031import u_boot_utils as util
Simon Glassc35df8f2020-03-18 11:43:59 -060032import vboot_forge
Simon Glass5e942f72021-02-15 17:08:08 -070033import vboot_evil
Simon Glassd977ecd2016-07-03 09:40:46 -060034
Simon Glass5e942f72021-02-15 17:08:08 -070035# Only run the full suite on a few combinations, since it doesn't add any more
36# test coverage.
Simon Glassa0ba39d2020-03-18 11:44:00 -060037TESTDATA = [
Simon Glasse9eeca82021-09-19 15:14:48 -060038 ['sha1-basic', 'sha1', '', None, False, True],
39 ['sha1-pad', 'sha1', '', '-E -p 0x10000', False, False],
40 ['sha1-pss', 'sha1', '-pss', None, False, False],
41 ['sha1-pss-pad', 'sha1', '-pss', '-E -p 0x10000', False, False],
42 ['sha256-basic', 'sha256', '', None, False, False],
43 ['sha256-pad', 'sha256', '', '-E -p 0x10000', False, False],
44 ['sha256-pss', 'sha256', '-pss', None, False, False],
45 ['sha256-pss-pad', 'sha256', '-pss', '-E -p 0x10000', False, False],
46 ['sha256-pss-required', 'sha256', '-pss', None, True, False],
47 ['sha256-pss-pad-required', 'sha256', '-pss', '-E -p 0x10000', True, True],
Simon Glassa0ba39d2020-03-18 11:44:00 -060048]
49
Michal Simek6e035ab2016-07-18 08:49:08 +020050@pytest.mark.boardspec('sandbox')
Simon Glassd977ecd2016-07-03 09:40:46 -060051@pytest.mark.buildconfigspec('fit_signature')
Stephen Warren2079db32017-09-18 11:11:49 -060052@pytest.mark.requiredtool('dtc')
53@pytest.mark.requiredtool('fdtget')
54@pytest.mark.requiredtool('fdtput')
55@pytest.mark.requiredtool('openssl')
Simon Glasse9eeca82021-09-19 15:14:48 -060056@pytest.mark.parametrize("name,sha_algo,padding,sign_options,required,full_test",
Simon Glass5e942f72021-02-15 17:08:08 -070057 TESTDATA)
Simon Glasse9eeca82021-09-19 15:14:48 -060058def test_vboot(u_boot_console, name, sha_algo, padding, sign_options, required,
Simon Glass5e942f72021-02-15 17:08:08 -070059 full_test):
Simon Glassd977ecd2016-07-03 09:40:46 -060060 """Test verified boot signing with mkimage and verification with 'bootm'.
61
62 This works using sandbox only as it needs to update the device tree used
63 by U-Boot to hold public keys from the signing process.
64
65 The SHA1 and SHA256 tests are combined into a single test since the
66 key-generation process is quite slow and we want to avoid doing it twice.
67 """
68 def dtc(dts):
Simon Glassd5deca02016-07-31 17:35:04 -060069 """Run the device tree compiler to compile a .dts file
Simon Glassd977ecd2016-07-03 09:40:46 -060070
71 The output file will be the same as the input file but with a .dtb
72 extension.
73
74 Args:
75 dts: Device tree file to compile.
76 """
77 dtb = dts.replace('.dts', '.dtb')
Simon Glassba8116c2016-07-31 17:35:05 -060078 util.run_and_log(cons, 'dtc %s %s%s -O dtb '
79 '-o %s%s' % (dtc_args, datadir, dts, tmpdir, dtb))
Simon Glassd977ecd2016-07-03 09:40:46 -060080
Simon Glass5e942f72021-02-15 17:08:08 -070081 def run_bootm(sha_algo, test_type, expect_string, boots, fit=None):
Simon Glassd977ecd2016-07-03 09:40:46 -060082 """Run a 'bootm' command U-Boot.
83
84 This always starts a fresh U-Boot instance since the device tree may
85 contain a new public key.
86
87 Args:
Simon Glassf223c732016-07-31 17:35:06 -060088 test_type: A string identifying the test type.
89 expect_string: A string which is expected in the output.
90 sha_algo: Either 'sha1' or 'sha256', to select the algorithm to
91 use.
Tom Rinib65ce462016-09-18 09:46:58 -040092 boots: A boolean that is True if Linux should boot and False if
93 we are expected to not boot
Simon Glass5e942f72021-02-15 17:08:08 -070094 fit: FIT filename to load and verify
Simon Glassd977ecd2016-07-03 09:40:46 -060095 """
Simon Glass5e942f72021-02-15 17:08:08 -070096 if not fit:
97 fit = '%stest.fit' % tmpdir
Simon Glass37c2ce12016-07-31 17:35:08 -060098 cons.restart_uboot()
Simon Glass2a40d832016-07-31 17:35:07 -060099 with cons.log.section('Verified boot %s %s' % (sha_algo, test_type)):
100 output = cons.run_command_list(
Simon Glass5e942f72021-02-15 17:08:08 -0700101 ['host load hostfs - 100 %s' % fit,
Simon Glass861b5042020-03-18 11:44:05 -0600102 'fdt addr 100',
103 'bootm 100'])
104 assert expect_string in ''.join(output)
Tom Rinib65ce462016-09-18 09:46:58 -0400105 if boots:
Simon Glass861b5042020-03-18 11:44:05 -0600106 assert 'sandbox: continuing, as we cannot run' in ''.join(output)
Philippe Reynes1d5ef522019-09-18 16:04:53 +0200107 else:
Simon Glass724c03b2020-03-18 11:44:04 -0600108 assert('sandbox: continuing, as we cannot run'
109 not in ''.join(output))
Simon Glassd977ecd2016-07-03 09:40:46 -0600110
111 def make_fit(its):
Simon Glassd5deca02016-07-31 17:35:04 -0600112 """Make a new FIT from the .its source file.
Simon Glassd977ecd2016-07-03 09:40:46 -0600113
114 This runs 'mkimage -f' to create a new FIT.
115
116 Args:
Simon Glassd5deca02016-07-31 17:35:04 -0600117 its: Filename containing .its source.
Simon Glassd977ecd2016-07-03 09:40:46 -0600118 """
119 util.run_and_log(cons, [mkimage, '-D', dtc_args, '-f',
120 '%s%s' % (datadir, its), fit])
121
Philippe Reynes2fbd17c2020-04-29 15:26:16 +0200122 def sign_fit(sha_algo, options):
Simon Glassd977ecd2016-07-03 09:40:46 -0600123 """Sign the FIT
124
125 Signs the FIT and writes the signature into it. It also writes the
126 public key into the dtb.
Simon Glassf223c732016-07-31 17:35:06 -0600127
128 Args:
129 sha_algo: Either 'sha1' or 'sha256', to select the algorithm to
130 use.
Philippe Reynes2fbd17c2020-04-29 15:26:16 +0200131 options: Options to provide to mkimage.
Simon Glassd977ecd2016-07-03 09:40:46 -0600132 """
Philippe Reynes2fbd17c2020-04-29 15:26:16 +0200133 args = [mkimage, '-F', '-k', tmpdir, '-K', dtb, '-r', fit]
134 if options:
135 args += options.split(' ')
Simon Glassf223c732016-07-31 17:35:06 -0600136 cons.log.action('%s: Sign images' % sha_algo)
Philippe Reynes2fbd17c2020-04-29 15:26:16 +0200137 util.run_and_log(cons, args)
Simon Glassd977ecd2016-07-03 09:40:46 -0600138
Thirupathaiah Annapureddy7e703f72020-08-16 23:01:10 -0700139 def sign_fit_norequire(sha_algo, options):
140 """Sign the FIT
141
142 Signs the FIT and writes the signature into it. It also writes the
143 public key into the dtb. It does not mark key as 'required' in dtb.
144
145 Args:
146 sha_algo: Either 'sha1' or 'sha256', to select the algorithm to
147 use.
148 options: Options to provide to mkimage.
149 """
150 args = [mkimage, '-F', '-k', tmpdir, '-K', dtb, fit]
151 if options:
152 args += options.split(' ')
153 cons.log.action('%s: Sign images' % sha_algo)
154 util.run_and_log(cons, args)
155
Teddy Reede6a47832018-06-09 11:38:05 -0400156 def replace_fit_totalsize(size):
157 """Replace FIT header's totalsize with something greater.
158
159 The totalsize must be less than or equal to FIT_SIGNATURE_MAX_SIZE.
160 If the size is greater, the signature verification should return false.
161
162 Args:
163 size: The new totalsize of the header
164
165 Returns:
166 prev_size: The previous totalsize read from the header
167 """
168 total_size = 0
169 with open(fit, 'r+b') as handle:
170 handle.seek(4)
171 total_size = handle.read(4)
172 handle.seek(4)
173 handle.write(struct.pack(">I", size))
174 return struct.unpack(">I", total_size)[0]
175
Simon Glassb4a2f6a2020-03-18 11:44:07 -0600176 def create_rsa_pair(name):
177 """Generate a new RSA key paid and certificate
178
179 Args:
180 name: Name of of the key (e.g. 'dev')
181 """
182 public_exponent = 65537
183 util.run_and_log(cons, 'openssl genpkey -algorithm RSA -out %s%s.key '
184 '-pkeyopt rsa_keygen_bits:2048 '
185 '-pkeyopt rsa_keygen_pubexp:%d' %
186 (tmpdir, name, public_exponent))
187
188 # Create a certificate containing the public key
189 util.run_and_log(cons, 'openssl req -batch -new -x509 -key %s%s.key '
190 '-out %s%s.crt' % (tmpdir, name, tmpdir, name))
191
Philippe Reynes2fbd17c2020-04-29 15:26:16 +0200192 def test_with_algo(sha_algo, padding, sign_options):
Simon Glassd5deca02016-07-31 17:35:04 -0600193 """Test verified boot with the given hash algorithm.
Simon Glassd977ecd2016-07-03 09:40:46 -0600194
195 This is the main part of the test code. The same procedure is followed
196 for both hashing algorithms.
197
198 Args:
Simon Glassf223c732016-07-31 17:35:06 -0600199 sha_algo: Either 'sha1' or 'sha256', to select the algorithm to
200 use.
Philippe Reynes2fbd17c2020-04-29 15:26:16 +0200201 padding: Either '' or '-pss', to select the padding to use for the
202 rsa signature algorithm.
203 sign_options: Options to mkimage when signing a fit image.
Simon Glassd977ecd2016-07-03 09:40:46 -0600204 """
Simon Glassdc3ab7e2016-07-31 17:35:02 -0600205 # Compile our device tree files for kernel and U-Boot. These are
206 # regenerated here since mkimage will modify them (by adding a
207 # public key) below.
Simon Glassd977ecd2016-07-03 09:40:46 -0600208 dtc('sandbox-kernel.dts')
209 dtc('sandbox-u-boot.dts')
210
211 # Build the FIT, but don't sign anything yet
Simon Glassf223c732016-07-31 17:35:06 -0600212 cons.log.action('%s: Test FIT with signed images' % sha_algo)
Simon Glass861b5042020-03-18 11:44:05 -0600213 make_fit('sign-images-%s%s.its' % (sha_algo, padding))
Tom Rinib65ce462016-09-18 09:46:58 -0400214 run_bootm(sha_algo, 'unsigned images', 'dev-', True)
Simon Glassd977ecd2016-07-03 09:40:46 -0600215
216 # Sign images with our dev keys
Philippe Reynes2fbd17c2020-04-29 15:26:16 +0200217 sign_fit(sha_algo, sign_options)
Tom Rinib65ce462016-09-18 09:46:58 -0400218 run_bootm(sha_algo, 'signed images', 'dev+', True)
Simon Glassd977ecd2016-07-03 09:40:46 -0600219
220 # Create a fresh .dtb without the public keys
221 dtc('sandbox-u-boot.dts')
222
Simon Glassf223c732016-07-31 17:35:06 -0600223 cons.log.action('%s: Test FIT with signed configuration' % sha_algo)
Simon Glass861b5042020-03-18 11:44:05 -0600224 make_fit('sign-configs-%s%s.its' % (sha_algo, padding))
Tom Rinib65ce462016-09-18 09:46:58 -0400225 run_bootm(sha_algo, 'unsigned config', '%s+ OK' % sha_algo, True)
Simon Glassd977ecd2016-07-03 09:40:46 -0600226
227 # Sign images with our dev keys
Philippe Reynes2fbd17c2020-04-29 15:26:16 +0200228 sign_fit(sha_algo, sign_options)
Tom Rinib65ce462016-09-18 09:46:58 -0400229 run_bootm(sha_algo, 'signed config', 'dev+', True)
Simon Glassd977ecd2016-07-03 09:40:46 -0600230
Simon Glassf223c732016-07-31 17:35:06 -0600231 cons.log.action('%s: Check signed config on the host' % sha_algo)
Simon Glassd977ecd2016-07-03 09:40:46 -0600232
Simon Glassf411a892020-03-18 11:43:58 -0600233 util.run_and_log(cons, [fit_check_sign, '-f', fit, '-k', dtb])
Simon Glassd977ecd2016-07-03 09:40:46 -0600234
Simon Glass5e942f72021-02-15 17:08:08 -0700235 if full_test:
Simon Glassb823daa2021-02-15 17:08:12 -0700236 # Make sure that U-Boot checks that the config is in the list of
237 # hashed nodes. If it isn't, a security bypass is possible.
Simon Glass5e942f72021-02-15 17:08:08 -0700238 ffit = '%stest.forged.fit' % tmpdir
239 shutil.copyfile(fit, ffit)
240 with open(ffit, 'rb') as fd:
241 root, strblock = vboot_forge.read_fdt(fd)
242 root, strblock = vboot_forge.manipulate(root, strblock)
243 with open(ffit, 'w+b') as fd:
244 vboot_forge.write_fdt(root, strblock, fd)
245 util.run_and_log_expect_exception(
246 cons, [fit_check_sign, '-f', ffit, '-k', dtb],
247 1, 'Failed to verify required signature')
248
249 run_bootm(sha_algo, 'forged config', 'Bad Data Hash', False, ffit)
Simon Glassc35df8f2020-03-18 11:43:59 -0600250
Simon Glass5e942f72021-02-15 17:08:08 -0700251 # Try adding an evil root node. This should be detected.
252 efit = '%stest.evilf.fit' % tmpdir
253 shutil.copyfile(fit, efit)
254 vboot_evil.add_evil_node(fit, efit, evil_kernel, 'fakeroot')
255
256 util.run_and_log_expect_exception(
257 cons, [fit_check_sign, '-f', efit, '-k', dtb],
258 1, 'Failed to verify required signature')
Simon Glass19d2c022021-02-15 17:08:11 -0700259 run_bootm(sha_algo, 'evil fakeroot', 'Bad FIT kernel image format',
260 False, efit)
Simon Glass5e942f72021-02-15 17:08:08 -0700261
262 # Try adding an @ to the kernel node name. This should be detected.
263 efit = '%stest.evilk.fit' % tmpdir
264 shutil.copyfile(fit, efit)
265 vboot_evil.add_evil_node(fit, efit, evil_kernel, 'kernel@')
266
Simon Glassb823daa2021-02-15 17:08:12 -0700267 msg = 'Signature checking prevents use of unit addresses (@) in nodes'
Simon Glass5e942f72021-02-15 17:08:08 -0700268 util.run_and_log_expect_exception(
269 cons, [fit_check_sign, '-f', efit, '-k', dtb],
Simon Glassb823daa2021-02-15 17:08:12 -0700270 1, msg)
271 run_bootm(sha_algo, 'evil kernel@', msg, False, efit)
Simon Glassc35df8f2020-03-18 11:43:59 -0600272
273 # Create a new properly signed fit and replace header bytes
274 make_fit('sign-configs-%s%s.its' % (sha_algo, padding))
Philippe Reynes2fbd17c2020-04-29 15:26:16 +0200275 sign_fit(sha_algo, sign_options)
Teddy Reede6a47832018-06-09 11:38:05 -0400276 bcfg = u_boot_console.config.buildconfig
277 max_size = int(bcfg.get('config_fit_signature_max_size', 0x10000000), 0)
278 existing_size = replace_fit_totalsize(max_size + 1)
Simon Glass724c03b2020-03-18 11:44:04 -0600279 run_bootm(sha_algo, 'Signed config with bad hash', 'Bad Data Hash',
280 False)
Teddy Reede6a47832018-06-09 11:38:05 -0400281 cons.log.action('%s: Check overflowed FIT header totalsize' % sha_algo)
282
283 # Replace with existing header bytes
284 replace_fit_totalsize(existing_size)
285 run_bootm(sha_algo, 'signed config', 'dev+', True)
286 cons.log.action('%s: Check default FIT header totalsize' % sha_algo)
287
Simon Glassd977ecd2016-07-03 09:40:46 -0600288 # Increment the first byte of the signature, which should cause failure
Simon Glassba8116c2016-07-31 17:35:05 -0600289 sig = util.run_and_log(cons, 'fdtget -t bx %s %s value' %
290 (fit, sig_node))
Simon Glassd977ecd2016-07-03 09:40:46 -0600291 byte_list = sig.split()
292 byte = int(byte_list[0], 16)
Simon Glassdc3ab7e2016-07-31 17:35:02 -0600293 byte_list[0] = '%x' % (byte + 1)
Simon Glassd977ecd2016-07-03 09:40:46 -0600294 sig = ' '.join(byte_list)
Simon Glassba8116c2016-07-31 17:35:05 -0600295 util.run_and_log(cons, 'fdtput -t bx %s %s value %s' %
296 (fit, sig_node, sig))
Simon Glassd977ecd2016-07-03 09:40:46 -0600297
Simon Glass724c03b2020-03-18 11:44:04 -0600298 run_bootm(sha_algo, 'Signed config with bad hash', 'Bad Data Hash',
299 False)
Simon Glassd977ecd2016-07-03 09:40:46 -0600300
Simon Glassf223c732016-07-31 17:35:06 -0600301 cons.log.action('%s: Check bad config on the host' % sha_algo)
Simon Glass861b5042020-03-18 11:44:05 -0600302 util.run_and_log_expect_exception(
303 cons, [fit_check_sign, '-f', fit, '-k', dtb],
304 1, 'Failed to verify required signature')
Simon Glassd977ecd2016-07-03 09:40:46 -0600305
Philippe Reynes2fbd17c2020-04-29 15:26:16 +0200306 def test_required_key(sha_algo, padding, sign_options):
Philippe Reynes1d5ef522019-09-18 16:04:53 +0200307 """Test verified boot with the given hash algorithm.
308
Simon Glass724c03b2020-03-18 11:44:04 -0600309 This function tests if U-Boot rejects an image when a required key isn't
310 used to sign a FIT.
Philippe Reynes1d5ef522019-09-18 16:04:53 +0200311
312 Args:
Simon Glass724c03b2020-03-18 11:44:04 -0600313 sha_algo: Either 'sha1' or 'sha256', to select the algorithm to use
Philippe Reynes2fbd17c2020-04-29 15:26:16 +0200314 padding: Either '' or '-pss', to select the padding to use for the
315 rsa signature algorithm.
316 sign_options: Options to mkimage when signing a fit image.
Philippe Reynes1d5ef522019-09-18 16:04:53 +0200317 """
318 # Compile our device tree files for kernel and U-Boot. These are
319 # regenerated here since mkimage will modify them (by adding a
320 # public key) below.
321 dtc('sandbox-kernel.dts')
322 dtc('sandbox-u-boot.dts')
323
Philippe Reynes1d5ef522019-09-18 16:04:53 +0200324 cons.log.action('%s: Test FIT with configs images' % sha_algo)
Simon Glass724c03b2020-03-18 11:44:04 -0600325
326 # Build the FIT with prod key (keys required) and sign it. This puts the
327 # signature into sandbox-u-boot.dtb, marked 'required'
Simon Glass861b5042020-03-18 11:44:05 -0600328 make_fit('sign-configs-%s%s-prod.its' % (sha_algo, padding))
Philippe Reynes2fbd17c2020-04-29 15:26:16 +0200329 sign_fit(sha_algo, sign_options)
Simon Glass724c03b2020-03-18 11:44:04 -0600330
331 # Build the FIT with dev key (keys NOT required). This adds the
332 # signature into sandbox-u-boot.dtb, NOT marked 'required'.
Simon Glass861b5042020-03-18 11:44:05 -0600333 make_fit('sign-configs-%s%s.its' % (sha_algo, padding))
Thirupathaiah Annapureddy7e703f72020-08-16 23:01:10 -0700334 sign_fit_norequire(sha_algo, sign_options)
Philippe Reynes1d5ef522019-09-18 16:04:53 +0200335
Simon Glass724c03b2020-03-18 11:44:04 -0600336 # So now sandbox-u-boot.dtb two signatures, for the prod and dev keys.
337 # Only the prod key is set as 'required'. But FIT we just built has
Thirupathaiah Annapureddy7e703f72020-08-16 23:01:10 -0700338 # a dev signature only (sign_fit_norequire() overwrites the FIT).
Simon Glass724c03b2020-03-18 11:44:04 -0600339 # Try to boot the FIT with dev key. This FIT should not be accepted by
340 # U-Boot because the prod key is required.
341 run_bootm(sha_algo, 'required key', '', False)
Philippe Reynes1d5ef522019-09-18 16:04:53 +0200342
Thirupathaiah Annapureddy7e703f72020-08-16 23:01:10 -0700343 # Build the FIT with dev key (keys required) and sign it. This puts the
344 # signature into sandbox-u-boot.dtb, marked 'required'.
345 make_fit('sign-configs-%s%s.its' % (sha_algo, padding))
346 sign_fit(sha_algo, sign_options)
347
348 # Set the required-mode policy to "any".
349 # So now sandbox-u-boot.dtb two signatures, for the prod and dev keys.
350 # Both the dev and prod key are set as 'required'. But FIT we just built has
351 # a dev signature only (sign_fit() overwrites the FIT).
352 # Try to boot the FIT with dev key. This FIT should be accepted by
353 # U-Boot because the dev key is required and policy is "any" required key.
354 util.run_and_log(cons, 'fdtput -t s %s /signature required-mode any' %
355 (dtb))
356 run_bootm(sha_algo, 'multi required key', 'dev+', True)
357
358 # Set the required-mode policy to "all".
359 # So now sandbox-u-boot.dtb two signatures, for the prod and dev keys.
360 # Both the dev and prod key are set as 'required'. But FIT we just built has
361 # a dev signature only (sign_fit() overwrites the FIT).
362 # Try to boot the FIT with dev key. This FIT should not be accepted by
363 # U-Boot because the prod key is required and policy is "all" required key
364 util.run_and_log(cons, 'fdtput -t s %s /signature required-mode all' %
365 (dtb))
366 run_bootm(sha_algo, 'multi required key', '', False)
367
Simon Glassd977ecd2016-07-03 09:40:46 -0600368 cons = u_boot_console
Simon Glasse9eeca82021-09-19 15:14:48 -0600369 tmpdir = os.path.join(cons.config.result_dir, name) + '/'
370 if not os.path.exists(tmpdir):
371 os.mkdir(tmpdir)
Stephen Warren7047d952016-07-18 10:07:25 -0600372 datadir = cons.config.source_dir + '/test/py/tests/vboot/'
Simon Glassd977ecd2016-07-03 09:40:46 -0600373 fit = '%stest.fit' % tmpdir
374 mkimage = cons.config.build_dir + '/tools/mkimage'
375 fit_check_sign = cons.config.build_dir + '/tools/fit_check_sign'
376 dtc_args = '-I dts -O dtb -i %s' % tmpdir
377 dtb = '%ssandbox-u-boot.dtb' % tmpdir
Philippe Reynesa28e9222018-11-14 13:51:05 +0100378 sig_node = '/configurations/conf-1/signature'
Simon Glassd977ecd2016-07-03 09:40:46 -0600379
Simon Glassb4a2f6a2020-03-18 11:44:07 -0600380 create_rsa_pair('dev')
381 create_rsa_pair('prod')
Philippe Reynes1d5ef522019-09-18 16:04:53 +0200382
Simon Glassd977ecd2016-07-03 09:40:46 -0600383 # Create a number kernel image with zeroes
Simon Glass5e942f72021-02-15 17:08:08 -0700384 with open('%stest-kernel.bin' % tmpdir, 'wb') as fd:
385 fd.write(500 * b'\0')
386
387 # Create a second kernel image with ones
388 evil_kernel = '%stest-kernel1.bin' % tmpdir
389 with open(evil_kernel, 'wb') as fd:
390 fd.write(500 * b'\x01')
Simon Glassd977ecd2016-07-03 09:40:46 -0600391
392 try:
393 # We need to use our own device tree file. Remember to restore it
394 # afterwards.
395 old_dtb = cons.config.dtb
396 cons.config.dtb = dtb
Simon Glassa0ba39d2020-03-18 11:44:00 -0600397 if required:
Philippe Reynes2fbd17c2020-04-29 15:26:16 +0200398 test_required_key(sha_algo, padding, sign_options)
Simon Glassa0ba39d2020-03-18 11:44:00 -0600399 else:
Philippe Reynes2fbd17c2020-04-29 15:26:16 +0200400 test_with_algo(sha_algo, padding, sign_options)
Simon Glassd977ecd2016-07-03 09:40:46 -0600401 finally:
Simon Glass37c2ce12016-07-31 17:35:08 -0600402 # Go back to the original U-Boot with the correct dtb.
Simon Glassd977ecd2016-07-03 09:40:46 -0600403 cons.config.dtb = old_dtb
Simon Glass37c2ce12016-07-31 17:35:08 -0600404 cons.restart_uboot()