blob: ac8ed9f114502c4148f99315b2c59aed7066dde5 [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 = [
Jan Kiszka30f64652022-02-03 21:43:50 +010038 ['sha1-basic', 'sha1', '', None, False, True, False],
39 ['sha1-pad', 'sha1', '', '-E -p 0x10000', False, False, False],
40 ['sha1-pss', 'sha1', '-pss', None, False, False, False],
41 ['sha1-pss-pad', 'sha1', '-pss', '-E -p 0x10000', False, False, False],
42 ['sha256-basic', 'sha256', '', None, False, False, False],
43 ['sha256-pad', 'sha256', '', '-E -p 0x10000', False, False, False],
44 ['sha256-pss', 'sha256', '-pss', None, False, False, False],
45 ['sha256-pss-pad', 'sha256', '-pss', '-E -p 0x10000', False, False, False],
46 ['sha256-pss-required', 'sha256', '-pss', None, True, False, False],
47 ['sha256-pss-pad-required', 'sha256', '-pss', '-E -p 0x10000', True, True, False],
48 ['sha384-basic', 'sha384', '', None, False, False, False],
49 ['sha384-pad', 'sha384', '', '-E -p 0x10000', False, False, False],
50 ['algo-arg', 'algo-arg', '', '-o sha256,rsa2048', False, False, True],
Simon Glassa0ba39d2020-03-18 11:44:00 -060051]
52
Michal Simek6e035ab2016-07-18 08:49:08 +020053@pytest.mark.boardspec('sandbox')
Simon Glassd977ecd2016-07-03 09:40:46 -060054@pytest.mark.buildconfigspec('fit_signature')
Stephen Warren2079db32017-09-18 11:11:49 -060055@pytest.mark.requiredtool('dtc')
56@pytest.mark.requiredtool('fdtget')
57@pytest.mark.requiredtool('fdtput')
58@pytest.mark.requiredtool('openssl')
Jan Kiszka30f64652022-02-03 21:43:50 +010059@pytest.mark.parametrize("name,sha_algo,padding,sign_options,required,full_test,algo_arg",
Simon Glass5e942f72021-02-15 17:08:08 -070060 TESTDATA)
Simon Glasse9eeca82021-09-19 15:14:48 -060061def test_vboot(u_boot_console, name, sha_algo, padding, sign_options, required,
Jan Kiszka30f64652022-02-03 21:43:50 +010062 full_test, algo_arg):
Simon Glassd977ecd2016-07-03 09:40:46 -060063 """Test verified boot signing with mkimage and verification with 'bootm'.
64
65 This works using sandbox only as it needs to update the device tree used
66 by U-Boot to hold public keys from the signing process.
67
68 The SHA1 and SHA256 tests are combined into a single test since the
69 key-generation process is quite slow and we want to avoid doing it twice.
70 """
71 def dtc(dts):
Simon Glassd5deca02016-07-31 17:35:04 -060072 """Run the device tree compiler to compile a .dts file
Simon Glassd977ecd2016-07-03 09:40:46 -060073
74 The output file will be the same as the input file but with a .dtb
75 extension.
76
77 Args:
78 dts: Device tree file to compile.
79 """
80 dtb = dts.replace('.dts', '.dtb')
Simon Glassba8116c2016-07-31 17:35:05 -060081 util.run_and_log(cons, 'dtc %s %s%s -O dtb '
82 '-o %s%s' % (dtc_args, datadir, dts, tmpdir, dtb))
Simon Glassd977ecd2016-07-03 09:40:46 -060083
Simon Glass5e942f72021-02-15 17:08:08 -070084 def run_bootm(sha_algo, test_type, expect_string, boots, fit=None):
Simon Glassd977ecd2016-07-03 09:40:46 -060085 """Run a 'bootm' command U-Boot.
86
87 This always starts a fresh U-Boot instance since the device tree may
88 contain a new public key.
89
90 Args:
Simon Glassf223c732016-07-31 17:35:06 -060091 test_type: A string identifying the test type.
92 expect_string: A string which is expected in the output.
93 sha_algo: Either 'sha1' or 'sha256', to select the algorithm to
94 use.
Tom Rinib65ce462016-09-18 09:46:58 -040095 boots: A boolean that is True if Linux should boot and False if
96 we are expected to not boot
Simon Glass5e942f72021-02-15 17:08:08 -070097 fit: FIT filename to load and verify
Simon Glassd977ecd2016-07-03 09:40:46 -060098 """
Simon Glass5e942f72021-02-15 17:08:08 -070099 if not fit:
100 fit = '%stest.fit' % tmpdir
Simon Glass37c2ce12016-07-31 17:35:08 -0600101 cons.restart_uboot()
Simon Glass2a40d832016-07-31 17:35:07 -0600102 with cons.log.section('Verified boot %s %s' % (sha_algo, test_type)):
103 output = cons.run_command_list(
Simon Glass5e942f72021-02-15 17:08:08 -0700104 ['host load hostfs - 100 %s' % fit,
Simon Glass861b5042020-03-18 11:44:05 -0600105 'fdt addr 100',
106 'bootm 100'])
107 assert expect_string in ''.join(output)
Tom Rinib65ce462016-09-18 09:46:58 -0400108 if boots:
Simon Glass861b5042020-03-18 11:44:05 -0600109 assert 'sandbox: continuing, as we cannot run' in ''.join(output)
Philippe Reynes1d5ef522019-09-18 16:04:53 +0200110 else:
Simon Glass724c03b2020-03-18 11:44:04 -0600111 assert('sandbox: continuing, as we cannot run'
112 not in ''.join(output))
Simon Glassd977ecd2016-07-03 09:40:46 -0600113
114 def make_fit(its):
Simon Glassd5deca02016-07-31 17:35:04 -0600115 """Make a new FIT from the .its source file.
Simon Glassd977ecd2016-07-03 09:40:46 -0600116
117 This runs 'mkimage -f' to create a new FIT.
118
119 Args:
Simon Glassd5deca02016-07-31 17:35:04 -0600120 its: Filename containing .its source.
Simon Glassd977ecd2016-07-03 09:40:46 -0600121 """
122 util.run_and_log(cons, [mkimage, '-D', dtc_args, '-f',
123 '%s%s' % (datadir, its), fit])
124
Philippe Reynes2fbd17c2020-04-29 15:26:16 +0200125 def sign_fit(sha_algo, options):
Simon Glassd977ecd2016-07-03 09:40:46 -0600126 """Sign the FIT
127
128 Signs the FIT and writes the signature into it. It also writes the
129 public key into the dtb.
Simon Glassf223c732016-07-31 17:35:06 -0600130
131 Args:
132 sha_algo: Either 'sha1' or 'sha256', to select the algorithm to
133 use.
Philippe Reynes2fbd17c2020-04-29 15:26:16 +0200134 options: Options to provide to mkimage.
Simon Glassd977ecd2016-07-03 09:40:46 -0600135 """
Philippe Reynes2fbd17c2020-04-29 15:26:16 +0200136 args = [mkimage, '-F', '-k', tmpdir, '-K', dtb, '-r', fit]
137 if options:
138 args += options.split(' ')
Simon Glassf223c732016-07-31 17:35:06 -0600139 cons.log.action('%s: Sign images' % sha_algo)
Philippe Reynes2fbd17c2020-04-29 15:26:16 +0200140 util.run_and_log(cons, args)
Simon Glassd977ecd2016-07-03 09:40:46 -0600141
Thirupathaiah Annapureddy7e703f72020-08-16 23:01:10 -0700142 def sign_fit_norequire(sha_algo, options):
143 """Sign the FIT
144
145 Signs the FIT and writes the signature into it. It also writes the
146 public key into the dtb. It does not mark key as 'required' in dtb.
147
148 Args:
149 sha_algo: Either 'sha1' or 'sha256', to select the algorithm to
150 use.
151 options: Options to provide to mkimage.
152 """
153 args = [mkimage, '-F', '-k', tmpdir, '-K', dtb, fit]
154 if options:
155 args += options.split(' ')
156 cons.log.action('%s: Sign images' % sha_algo)
157 util.run_and_log(cons, args)
158
Teddy Reede6a47832018-06-09 11:38:05 -0400159 def replace_fit_totalsize(size):
160 """Replace FIT header's totalsize with something greater.
161
162 The totalsize must be less than or equal to FIT_SIGNATURE_MAX_SIZE.
163 If the size is greater, the signature verification should return false.
164
165 Args:
166 size: The new totalsize of the header
167
168 Returns:
169 prev_size: The previous totalsize read from the header
170 """
171 total_size = 0
172 with open(fit, 'r+b') as handle:
173 handle.seek(4)
174 total_size = handle.read(4)
175 handle.seek(4)
176 handle.write(struct.pack(">I", size))
177 return struct.unpack(">I", total_size)[0]
178
Simon Glassb4a2f6a2020-03-18 11:44:07 -0600179 def create_rsa_pair(name):
180 """Generate a new RSA key paid and certificate
181
182 Args:
183 name: Name of of the key (e.g. 'dev')
184 """
185 public_exponent = 65537
Jamin Lin5975ad72022-01-19 16:23:21 +0800186
187 if sha_algo == "sha384":
188 rsa_keygen_bits = 3072
189 else:
190 rsa_keygen_bits = 2048
191
Simon Glassb4a2f6a2020-03-18 11:44:07 -0600192 util.run_and_log(cons, 'openssl genpkey -algorithm RSA -out %s%s.key '
Jamin Lin5975ad72022-01-19 16:23:21 +0800193 '-pkeyopt rsa_keygen_bits:%d '
Simon Glassb4a2f6a2020-03-18 11:44:07 -0600194 '-pkeyopt rsa_keygen_pubexp:%d' %
Jamin Lin5975ad72022-01-19 16:23:21 +0800195 (tmpdir, name, rsa_keygen_bits, public_exponent))
Simon Glassb4a2f6a2020-03-18 11:44:07 -0600196
197 # Create a certificate containing the public key
198 util.run_and_log(cons, 'openssl req -batch -new -x509 -key %s%s.key '
199 '-out %s%s.crt' % (tmpdir, name, tmpdir, name))
200
Philippe Reynes2fbd17c2020-04-29 15:26:16 +0200201 def test_with_algo(sha_algo, padding, sign_options):
Simon Glassd5deca02016-07-31 17:35:04 -0600202 """Test verified boot with the given hash algorithm.
Simon Glassd977ecd2016-07-03 09:40:46 -0600203
204 This is the main part of the test code. The same procedure is followed
205 for both hashing algorithms.
206
207 Args:
Simon Glassf223c732016-07-31 17:35:06 -0600208 sha_algo: Either 'sha1' or 'sha256', to select the algorithm to
209 use.
Philippe Reynes2fbd17c2020-04-29 15:26:16 +0200210 padding: Either '' or '-pss', to select the padding to use for the
211 rsa signature algorithm.
212 sign_options: Options to mkimage when signing a fit image.
Simon Glassd977ecd2016-07-03 09:40:46 -0600213 """
Simon Glassdc3ab7e2016-07-31 17:35:02 -0600214 # Compile our device tree files for kernel and U-Boot. These are
215 # regenerated here since mkimage will modify them (by adding a
216 # public key) below.
Simon Glassd977ecd2016-07-03 09:40:46 -0600217 dtc('sandbox-kernel.dts')
218 dtc('sandbox-u-boot.dts')
219
220 # Build the FIT, but don't sign anything yet
Simon Glassf223c732016-07-31 17:35:06 -0600221 cons.log.action('%s: Test FIT with signed images' % sha_algo)
Simon Glass861b5042020-03-18 11:44:05 -0600222 make_fit('sign-images-%s%s.its' % (sha_algo, padding))
Jan Kiszka30f64652022-02-03 21:43:50 +0100223 run_bootm(sha_algo, 'unsigned images', ' - OK' if algo_arg else 'dev-', True)
Simon Glassd977ecd2016-07-03 09:40:46 -0600224
225 # Sign images with our dev keys
Philippe Reynes2fbd17c2020-04-29 15:26:16 +0200226 sign_fit(sha_algo, sign_options)
Tom Rinib65ce462016-09-18 09:46:58 -0400227 run_bootm(sha_algo, 'signed images', 'dev+', True)
Simon Glassd977ecd2016-07-03 09:40:46 -0600228
229 # Create a fresh .dtb without the public keys
230 dtc('sandbox-u-boot.dts')
231
Simon Glassf223c732016-07-31 17:35:06 -0600232 cons.log.action('%s: Test FIT with signed configuration' % sha_algo)
Simon Glass861b5042020-03-18 11:44:05 -0600233 make_fit('sign-configs-%s%s.its' % (sha_algo, padding))
Jan Kiszka30f64652022-02-03 21:43:50 +0100234 run_bootm(sha_algo, 'unsigned config', '%s+ OK' % ('sha256' if algo_arg else sha_algo), True)
Simon Glassd977ecd2016-07-03 09:40:46 -0600235
236 # Sign images with our dev keys
Philippe Reynes2fbd17c2020-04-29 15:26:16 +0200237 sign_fit(sha_algo, sign_options)
Tom Rinib65ce462016-09-18 09:46:58 -0400238 run_bootm(sha_algo, 'signed config', 'dev+', True)
Simon Glassd977ecd2016-07-03 09:40:46 -0600239
Simon Glassf223c732016-07-31 17:35:06 -0600240 cons.log.action('%s: Check signed config on the host' % sha_algo)
Simon Glassd977ecd2016-07-03 09:40:46 -0600241
Simon Glassf411a892020-03-18 11:43:58 -0600242 util.run_and_log(cons, [fit_check_sign, '-f', fit, '-k', dtb])
Simon Glassd977ecd2016-07-03 09:40:46 -0600243
Simon Glass5e942f72021-02-15 17:08:08 -0700244 if full_test:
Simon Glassb823daa2021-02-15 17:08:12 -0700245 # Make sure that U-Boot checks that the config is in the list of
246 # hashed nodes. If it isn't, a security bypass is possible.
Simon Glass5e942f72021-02-15 17:08:08 -0700247 ffit = '%stest.forged.fit' % tmpdir
248 shutil.copyfile(fit, ffit)
249 with open(ffit, 'rb') as fd:
250 root, strblock = vboot_forge.read_fdt(fd)
251 root, strblock = vboot_forge.manipulate(root, strblock)
252 with open(ffit, 'w+b') as fd:
253 vboot_forge.write_fdt(root, strblock, fd)
254 util.run_and_log_expect_exception(
255 cons, [fit_check_sign, '-f', ffit, '-k', dtb],
256 1, 'Failed to verify required signature')
257
258 run_bootm(sha_algo, 'forged config', 'Bad Data Hash', False, ffit)
Simon Glassc35df8f2020-03-18 11:43:59 -0600259
Simon Glass5e942f72021-02-15 17:08:08 -0700260 # Try adding an evil root node. This should be detected.
261 efit = '%stest.evilf.fit' % tmpdir
262 shutil.copyfile(fit, efit)
263 vboot_evil.add_evil_node(fit, efit, evil_kernel, 'fakeroot')
264
265 util.run_and_log_expect_exception(
266 cons, [fit_check_sign, '-f', efit, '-k', dtb],
267 1, 'Failed to verify required signature')
Simon Glass19d2c022021-02-15 17:08:11 -0700268 run_bootm(sha_algo, 'evil fakeroot', 'Bad FIT kernel image format',
269 False, efit)
Simon Glass5e942f72021-02-15 17:08:08 -0700270
271 # Try adding an @ to the kernel node name. This should be detected.
272 efit = '%stest.evilk.fit' % tmpdir
273 shutil.copyfile(fit, efit)
274 vboot_evil.add_evil_node(fit, efit, evil_kernel, 'kernel@')
275
Simon Glassb823daa2021-02-15 17:08:12 -0700276 msg = 'Signature checking prevents use of unit addresses (@) in nodes'
Simon Glass5e942f72021-02-15 17:08:08 -0700277 util.run_and_log_expect_exception(
278 cons, [fit_check_sign, '-f', efit, '-k', dtb],
Simon Glassb823daa2021-02-15 17:08:12 -0700279 1, msg)
280 run_bootm(sha_algo, 'evil kernel@', msg, False, efit)
Simon Glassc35df8f2020-03-18 11:43:59 -0600281
282 # Create a new properly signed fit and replace header bytes
283 make_fit('sign-configs-%s%s.its' % (sha_algo, padding))
Philippe Reynes2fbd17c2020-04-29 15:26:16 +0200284 sign_fit(sha_algo, sign_options)
Teddy Reede6a47832018-06-09 11:38:05 -0400285 bcfg = u_boot_console.config.buildconfig
286 max_size = int(bcfg.get('config_fit_signature_max_size', 0x10000000), 0)
287 existing_size = replace_fit_totalsize(max_size + 1)
Simon Glass724c03b2020-03-18 11:44:04 -0600288 run_bootm(sha_algo, 'Signed config with bad hash', 'Bad Data Hash',
289 False)
Teddy Reede6a47832018-06-09 11:38:05 -0400290 cons.log.action('%s: Check overflowed FIT header totalsize' % sha_algo)
291
292 # Replace with existing header bytes
293 replace_fit_totalsize(existing_size)
294 run_bootm(sha_algo, 'signed config', 'dev+', True)
295 cons.log.action('%s: Check default FIT header totalsize' % sha_algo)
296
Simon Glassd977ecd2016-07-03 09:40:46 -0600297 # Increment the first byte of the signature, which should cause failure
Simon Glassba8116c2016-07-31 17:35:05 -0600298 sig = util.run_and_log(cons, 'fdtget -t bx %s %s value' %
299 (fit, sig_node))
Simon Glassd977ecd2016-07-03 09:40:46 -0600300 byte_list = sig.split()
301 byte = int(byte_list[0], 16)
Simon Glassdc3ab7e2016-07-31 17:35:02 -0600302 byte_list[0] = '%x' % (byte + 1)
Simon Glassd977ecd2016-07-03 09:40:46 -0600303 sig = ' '.join(byte_list)
Simon Glassba8116c2016-07-31 17:35:05 -0600304 util.run_and_log(cons, 'fdtput -t bx %s %s value %s' %
305 (fit, sig_node, sig))
Simon Glassd977ecd2016-07-03 09:40:46 -0600306
Simon Glass724c03b2020-03-18 11:44:04 -0600307 run_bootm(sha_algo, 'Signed config with bad hash', 'Bad Data Hash',
308 False)
Simon Glassd977ecd2016-07-03 09:40:46 -0600309
Simon Glassf223c732016-07-31 17:35:06 -0600310 cons.log.action('%s: Check bad config on the host' % sha_algo)
Simon Glass861b5042020-03-18 11:44:05 -0600311 util.run_and_log_expect_exception(
312 cons, [fit_check_sign, '-f', fit, '-k', dtb],
313 1, 'Failed to verify required signature')
Simon Glassd977ecd2016-07-03 09:40:46 -0600314
Philippe Reynes2fbd17c2020-04-29 15:26:16 +0200315 def test_required_key(sha_algo, padding, sign_options):
Philippe Reynes1d5ef522019-09-18 16:04:53 +0200316 """Test verified boot with the given hash algorithm.
317
Simon Glass724c03b2020-03-18 11:44:04 -0600318 This function tests if U-Boot rejects an image when a required key isn't
319 used to sign a FIT.
Philippe Reynes1d5ef522019-09-18 16:04:53 +0200320
321 Args:
Simon Glass724c03b2020-03-18 11:44:04 -0600322 sha_algo: Either 'sha1' or 'sha256', to select the algorithm to use
Philippe Reynes2fbd17c2020-04-29 15:26:16 +0200323 padding: Either '' or '-pss', to select the padding to use for the
324 rsa signature algorithm.
325 sign_options: Options to mkimage when signing a fit image.
Philippe Reynes1d5ef522019-09-18 16:04:53 +0200326 """
327 # Compile our device tree files for kernel and U-Boot. These are
328 # regenerated here since mkimage will modify them (by adding a
329 # public key) below.
330 dtc('sandbox-kernel.dts')
331 dtc('sandbox-u-boot.dts')
332
Philippe Reynes1d5ef522019-09-18 16:04:53 +0200333 cons.log.action('%s: Test FIT with configs images' % sha_algo)
Simon Glass724c03b2020-03-18 11:44:04 -0600334
335 # Build the FIT with prod key (keys required) and sign it. This puts the
336 # signature into sandbox-u-boot.dtb, marked 'required'
Simon Glass861b5042020-03-18 11:44:05 -0600337 make_fit('sign-configs-%s%s-prod.its' % (sha_algo, padding))
Philippe Reynes2fbd17c2020-04-29 15:26:16 +0200338 sign_fit(sha_algo, sign_options)
Simon Glass724c03b2020-03-18 11:44:04 -0600339
340 # Build the FIT with dev key (keys NOT required). This adds the
341 # signature into sandbox-u-boot.dtb, NOT marked 'required'.
Simon Glass861b5042020-03-18 11:44:05 -0600342 make_fit('sign-configs-%s%s.its' % (sha_algo, padding))
Thirupathaiah Annapureddy7e703f72020-08-16 23:01:10 -0700343 sign_fit_norequire(sha_algo, sign_options)
Philippe Reynes1d5ef522019-09-18 16:04:53 +0200344
Simon Glass724c03b2020-03-18 11:44:04 -0600345 # So now sandbox-u-boot.dtb two signatures, for the prod and dev keys.
346 # Only the prod key is set as 'required'. But FIT we just built has
Thirupathaiah Annapureddy7e703f72020-08-16 23:01:10 -0700347 # a dev signature only (sign_fit_norequire() overwrites the FIT).
Simon Glass724c03b2020-03-18 11:44:04 -0600348 # Try to boot the FIT with dev key. This FIT should not be accepted by
349 # U-Boot because the prod key is required.
350 run_bootm(sha_algo, 'required key', '', False)
Philippe Reynes1d5ef522019-09-18 16:04:53 +0200351
Thirupathaiah Annapureddy7e703f72020-08-16 23:01:10 -0700352 # Build the FIT with dev key (keys required) and sign it. This puts the
353 # signature into sandbox-u-boot.dtb, marked 'required'.
354 make_fit('sign-configs-%s%s.its' % (sha_algo, padding))
355 sign_fit(sha_algo, sign_options)
356
357 # Set the required-mode policy to "any".
358 # So now sandbox-u-boot.dtb two signatures, for the prod and dev keys.
359 # Both the dev and prod key are set as 'required'. But FIT we just built has
360 # a dev signature only (sign_fit() overwrites the FIT).
361 # Try to boot the FIT with dev key. This FIT should be accepted by
362 # U-Boot because the dev key is required and policy is "any" required key.
363 util.run_and_log(cons, 'fdtput -t s %s /signature required-mode any' %
364 (dtb))
365 run_bootm(sha_algo, 'multi required key', 'dev+', True)
366
367 # Set the required-mode policy to "all".
368 # So now sandbox-u-boot.dtb two signatures, for the prod and dev keys.
369 # Both the dev and prod key are set as 'required'. But FIT we just built has
370 # a dev signature only (sign_fit() overwrites the FIT).
371 # Try to boot the FIT with dev key. This FIT should not be accepted by
372 # U-Boot because the prod key is required and policy is "all" required key
373 util.run_and_log(cons, 'fdtput -t s %s /signature required-mode all' %
374 (dtb))
375 run_bootm(sha_algo, 'multi required key', '', False)
376
Simon Glassd977ecd2016-07-03 09:40:46 -0600377 cons = u_boot_console
Simon Glasse9eeca82021-09-19 15:14:48 -0600378 tmpdir = os.path.join(cons.config.result_dir, name) + '/'
379 if not os.path.exists(tmpdir):
380 os.mkdir(tmpdir)
Stephen Warren7047d952016-07-18 10:07:25 -0600381 datadir = cons.config.source_dir + '/test/py/tests/vboot/'
Simon Glassd977ecd2016-07-03 09:40:46 -0600382 fit = '%stest.fit' % tmpdir
383 mkimage = cons.config.build_dir + '/tools/mkimage'
384 fit_check_sign = cons.config.build_dir + '/tools/fit_check_sign'
385 dtc_args = '-I dts -O dtb -i %s' % tmpdir
386 dtb = '%ssandbox-u-boot.dtb' % tmpdir
Philippe Reynesa28e9222018-11-14 13:51:05 +0100387 sig_node = '/configurations/conf-1/signature'
Simon Glassd977ecd2016-07-03 09:40:46 -0600388
Simon Glassb4a2f6a2020-03-18 11:44:07 -0600389 create_rsa_pair('dev')
390 create_rsa_pair('prod')
Philippe Reynes1d5ef522019-09-18 16:04:53 +0200391
Simon Glassd977ecd2016-07-03 09:40:46 -0600392 # Create a number kernel image with zeroes
Simon Glass5e942f72021-02-15 17:08:08 -0700393 with open('%stest-kernel.bin' % tmpdir, 'wb') as fd:
394 fd.write(500 * b'\0')
395
396 # Create a second kernel image with ones
397 evil_kernel = '%stest-kernel1.bin' % tmpdir
398 with open(evil_kernel, 'wb') as fd:
399 fd.write(500 * b'\x01')
Simon Glassd977ecd2016-07-03 09:40:46 -0600400
401 try:
402 # We need to use our own device tree file. Remember to restore it
403 # afterwards.
404 old_dtb = cons.config.dtb
405 cons.config.dtb = dtb
Simon Glassa0ba39d2020-03-18 11:44:00 -0600406 if required:
Philippe Reynes2fbd17c2020-04-29 15:26:16 +0200407 test_required_key(sha_algo, padding, sign_options)
Simon Glassa0ba39d2020-03-18 11:44:00 -0600408 else:
Philippe Reynes2fbd17c2020-04-29 15:26:16 +0200409 test_with_algo(sha_algo, padding, sign_options)
Simon Glassd977ecd2016-07-03 09:40:46 -0600410 finally:
Simon Glass37c2ce12016-07-31 17:35:08 -0600411 # Go back to the original U-Boot with the correct dtb.
Simon Glassd977ecd2016-07-03 09:40:46 -0600412 cons.config.dtb = old_dtb
Simon Glass37c2ce12016-07-31 17:35:08 -0600413 cons.restart_uboot()