From: AKASHI Takahiro <takahiro.akashi@linaro.org>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 15/16] efi_loader, pytest: add UEFI secure boot tests (authenticated variables)
Date: Mon, 18 Nov 2019 14:58:26 +0900 [thread overview]
Message-ID: <20191118055824.GN22427@linaro.org> (raw)
In-Reply-To: <dd98ac09-9e4e-2ec1-8bdf-1570e934fcad@gmx.de>
On Sat, Nov 16, 2019 at 09:28:56PM +0100, Heinrich Schuchardt wrote:
> On 11/13/19 1:53 AM, AKASHI Takahiro wrote:
> >Provide a couple of test cases for variable authentication.
>
> Please, tell us more in the commit message.
About what?
I have lots of 'text case' descriptions in *.py files.
> >
> >Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
> >---
> > .../py/tests/test_efi_secboot/test_authvar.py | 289 ++++++++++++++++++
> > 1 file changed, 289 insertions(+)
> > create mode 100644 test/py/tests/test_efi_secboot/test_authvar.py
> >
> >diff --git a/test/py/tests/test_efi_secboot/test_authvar.py b/test/py/tests/test_efi_secboot/test_authvar.py
> >new file mode 100644
> >index 000000000000..ed18b80084d6
> >--- /dev/null
> >+++ b/test/py/tests/test_efi_secboot/test_authvar.py
> >@@ -0,0 +1,289 @@
> >+# SPDX-License-Identifier: GPL-2.0+
> >+# Copyright (c) 2019, Linaro Limited
> >+# Author: AKASHI Takahiro <takahiro.akashi@linaro.org>
> >+#
> >+# U-Boot UEFI: Variable Authentication Test
> >+
> >+"""
> >+This test verifies variable authentication
> >+"""
> >+
> >+import pytest
> >+import re
> >+from defs import *
> >+
> >+ at pytest.mark.boardspec('sandbox')
>
> Why can't we run this on other architectures?
As you see, we need some data files, most of which contain data for
signature database variables, to run test cases. Using sandbox
is the easiest way to minimize hardware requirements.
> The sandbox currently only runs in 64bit mode. This way we might miss
> errors that only occur on 32bit systems.
Right, but this is not my patch-specific issue.
> >+ at pytest.mark.buildconfigspec('efi_secure_boot')
> >+ at pytest.mark.buildconfigspec('cmd_fat')
> >+ at pytest.mark.buildconfigspec('cmd_nvedit_efi')
> >+ at pytest.mark.slow
> >+class TestEfiAuthVar(object):
> >+ def test_efi_var_auth1(self, u_boot_console, efi_boot_env):
> >+ """
> >+ Test Case 1 - Install signature database
> >+ """
> >+ disk_img = efi_boot_env
> >+ with u_boot_console.log.section('Test Case 1a'):
> >+ # Test Case 1a, Initial secure state
> >+ output = u_boot_console.run_command_list([
> >+ 'host bind 0 %s' % disk_img,
> >+ 'printenv -e SecureBoot'])
> >+ assert(re.search('00000000: 00', ''.join(output)))
> >+
> >+ output = u_boot_console.run_command(
> >+ 'printenv -e SecureBoot')
> >+ assert('00000000: 00' in output)
> >+ output = u_boot_console.run_command(
> >+ 'printenv -e SetupMode')
> >+ assert('00000000: 01' in output)
> >+
> >+ with u_boot_console.log.section('Test Case 1b'):
> >+ # Test Case 1b, PK without AUTHENTICATED_WRITE_ACCESS
> >+ output = u_boot_console.run_command_list([
> >+ 'host bind 0 %s' % disk_img,
> >+ 'fatload host 0:1 4000000 PK.auth',
> >+ 'setenv -e -nv -bs -rt -i 4000000,$filesize PK'])
> >+ assert(re.search('Failed to set EFI variable', ''.join(output)))
> >+
> >+ with u_boot_console.log.section('Test Case 1c'):
> >+ # Test Case 1c, install PK
> >+ output = u_boot_console.run_command_list([
> >+ 'fatload host 0:1 4000000 PK.auth',
> >+ 'setenv -e -nv -bs -rt -at -i 4000000,$filesize PK',
> >+ 'printenv -e PK'])
> >+ assert(re.search('PK:', ''.join(output)))
> >+
> >+ output = u_boot_console.run_command(
> >+ 'printenv -e SecureBoot')
> >+ assert('00000000: 01' in output)
> >+ output = u_boot_console.run_command(
> >+ 'printenv -e SetupMode')
> >+ assert('00000000: 00' in output)
> >+
> >+ with u_boot_console.log.section('Test Case 1d'):
> >+ # Test Case 1d, db/dbx without KEK
> >+ output = u_boot_console.run_command_list([
> >+ 'fatload host 0:1 4000000 db.auth',
> >+ 'setenv -e -nv -bs -rt -at -i 4000000,$filesize db'])
> >+ assert(re.search('Failed to set EFI variable', ''.join(output)))
> >+
> >+ output = u_boot_console.run_command_list([
> >+ 'fatload host 0:1 4000000 db.auth',
> >+ 'setenv -e -nv -bs -rt -at -i 4000000,$filesize dbx'])
> >+ assert(re.search('Failed to set EFI variable', ''.join(output)))
> >+
> >+ with u_boot_console.log.section('Test Case 1e'):
> >+ # Test Case 1e, install KEK
> >+ output = u_boot_console.run_command_list([
> >+ 'fatload host 0:1 4000000 KEK.auth',
> >+ 'setenv -e -nv -bs -rt -i 4000000,$filesize KEK'])
> >+ assert(re.search('Failed to set EFI variable', ''.join(output)))
> >+
> >+ output = u_boot_console.run_command_list([
> >+ 'fatload host 0:1 4000000 KEK.auth',
> >+ 'setenv -e -nv -bs -rt -at -i 4000000,$filesize KEK',
> >+ 'printenv -e KEK'])
> >+ assert(re.search('KEK:', ''.join(output)))
> >+
> >+ output = u_boot_console.run_command(
> >+ 'printenv -e SecureBoot')
> >+ assert('00000000: 01' in output)
> >+
> >+ with u_boot_console.log.section('Test Case 1f'):
> >+ # Test Case 1f, install db
> >+ output = u_boot_console.run_command_list([
> >+ 'fatload host 0:1 4000000 db.auth',
> >+ 'setenv -e -nv -bs -rt -i 4000000,$filesize db'])
> >+ assert(re.search('Failed to set EFI variable', ''.join(output)))
> >+
> >+ output = u_boot_console.run_command_list([
> >+ 'fatload host 0:1 4000000 db.auth',
> >+ 'setenv -e -nv -bs -rt -at -i 4000000,$filesize db',
> >+ 'printenv -e -guid d719b2cb-3d3a-4596-a3bc-dad00e67656f db'])
> >+ assert(not re.search('Failed to set EFI variable', ''.join(output)))
> >+ assert(re.search('db:', ''.join(output)))
> >+
> >+ output = u_boot_console.run_command(
> >+ 'printenv -e SecureBoot')
> >+ assert('00000000: 01' in output)
> >+
> >+ with u_boot_console.log.section('Test Case 1g'):
> >+ # Test Case 1g, install dbx
> >+ output = u_boot_console.run_command_list([
> >+ 'fatload host 0:1 4000000 db.auth',
> >+ 'setenv -e -nv -bs -rt -i 4000000,$filesize db'])
> >+ assert(re.search('Failed to set EFI variable', ''.join(output)))
> >+
> >+ output = u_boot_console.run_command_list([
> >+ 'fatload host 0:1 4000000 db.auth',
> >+ 'setenv -e -nv -bs -rt -at -i 4000000,$filesize db',
> >+ 'printenv -e -guid d719b2cb-3d3a-4596-a3bc-dad00e67656f db'])
> >+ assert(not re.search('Failed to set EFI variable', ''.join(output)))
> >+ assert(re.search('db:', ''.join(output)))
> >+
> >+ output = u_boot_console.run_command(
> >+ 'printenv -e SecureBoot')
> >+ assert('00000000: 01' in output)
> >+
> >+ def test_efi_var_auth2(self, u_boot_console, efi_boot_env):
> >+ """
> >+ Test Case 2 - Update database by overwriting
> >+ """
> >+ disk_img = efi_boot_env
> >+ with u_boot_console.log.section('Test Case 2a'):
> >+ # Test Case 2a, update without AUTHENTICATED_WRITE_ACCESS
> >+ output = u_boot_console.run_command_list([
> >+ 'host bind 0 %s' % disk_img,
> >+ 'fatload host 0:1 4000000 PK.auth',
> >+ 'setenv -e -nv -bs -rt -at -i 4000000,$filesize PK',
> >+ 'fatload host 0:1 4000000 KEK.auth',
> >+ 'setenv -e -nv -bs -rt -at -i 4000000,$filesize KEK',
> >+ 'fatload host 0:1 4000000 db.auth',
> >+ 'setenv -e -nv -bs -rt -at -i 4000000,$filesize db',
> >+ 'printenv -e -guid d719b2cb-3d3a-4596-a3bc-dad00e67656f db'])
> >+ assert(not re.search('Failed to set EFI variable', ''.join(output)))
> >+ assert(re.search('db:', ''.join(output)))
> >+ assert(re.search('DataSize = 0x327', ''.join(output)))
> >+
> >+ output = u_boot_console.run_command_list([
> >+ 'fatload host 0:1 4000000 db1.auth',
> >+ 'setenv -e -nv -bs -rt -i 4000000,$filesize db'])
> >+ assert(re.search('Failed to set EFI variable', ''.join(output)))
> >+
> >+ with u_boot_console.log.section('Test Case 2b'):
> >+ # Test Case 2b, update without correct signature
> >+ output = u_boot_console.run_command_list([
> >+ 'fatload host 0:1 4000000 db.esl',
> >+ 'setenv -e -nv -bs -rt -at -i 4000000,$filesize db'])
> >+ assert(re.search('Failed to set EFI variable', ''.join(output)))
> >+
> >+ with u_boot_console.log.section('Test Case 2c'):
> >+ # Test Case 2c, update with correct signature
> >+ output = u_boot_console.run_command_list([
> >+ 'fatload host 0:1 4000000 db1.auth',
> >+ 'setenv -e -nv -bs -rt -at -i 4000000,$filesize db',
> >+ 'printenv -e -guid d719b2cb-3d3a-4596-a3bc-dad00e67656f db'])
> >+ assert(not re.search('Failed to set EFI variable', ''.join(output)))
> >+ assert(re.search('db:', ''.join(output)))
> >+ assert(re.search('DataSize = 0x329', ''.join(output)))
> >+
> >+ def test_efi_var_auth3(self, u_boot_console, efi_boot_env):
> >+ """
> >+ Test Case 3 - Append database
> >+ """
> >+ disk_img = efi_boot_env
> >+ with u_boot_console.log.section('Test Case 3a'):
> >+ # Test Case 3a, update without AUTHENTICATED_WRITE_ACCESS
> >+ output = u_boot_console.run_command_list([
> >+ 'host bind 0 %s' % disk_img,
> >+ 'fatload host 0:1 4000000 PK.auth',
> >+ 'setenv -e -nv -bs -rt -at -i 4000000,$filesize PK',
> >+ 'fatload host 0:1 4000000 KEK.auth',
> >+ 'setenv -e -nv -bs -rt -at -i 4000000,$filesize KEK',
> >+ 'fatload host 0:1 4000000 db.auth',
> >+ 'setenv -e -nv -bs -rt -at -i 4000000,$filesize db',
> >+ 'printenv -e -guid d719b2cb-3d3a-4596-a3bc-dad00e67656f db'])
> >+ assert(not re.search('Failed to set EFI variable', ''.join(output)))
> >+ assert(re.search('db:', ''.join(output)))
> >+ assert(re.search('DataSize = 0x327', ''.join(output)))
> >+
> >+ output = u_boot_console.run_command_list([
> >+ 'fatload host 0:1 4000000 db1.auth',
> >+ 'setenv -e -nv -bs -rt -a -i 4000000,$filesize db'])
> >+ assert(re.search('Failed to set EFI variable', ''.join(output)))
> >+
> >+ with u_boot_console.log.section('Test Case 3b'):
> >+ # Test Case 3b, update without correct signature
> >+ output = u_boot_console.run_command_list([
> >+ 'fatload host 0:1 4000000 db.esl',
>
> Where do find all the files you try to load here?
>
> You cannot assume that the sandbox is connected to any special file
> system while the test is running as there is no buildconfigspec
> requiring it.
Will add a dependency on 'fs_fat'
-Takahiro Akashi
> Best regards
>
> Heinrich
>
> >+ 'setenv -e -nv -bs -rt -at -a -i 4000000,$filesize db'])
> >+ assert(re.search('Failed to set EFI variable', ''.join(output)))
> >+
> >+ with u_boot_console.log.section('Test Case 3c'):
> >+ # Test Case 3c, update with correct signature
> >+ output = u_boot_console.run_command_list([
> >+ 'fatload host 0:1 4000000 db1.auth',
> >+ 'setenv -e -nv -bs -rt -at -a -i 4000000,$filesize db',
> >+ 'printenv -e -guid d719b2cb-3d3a-4596-a3bc-dad00e67656f db'])
> >+ assert(not re.search('Failed to set EFI variable', ''.join(output)))
> >+ assert(re.search('db:', ''.join(output)))
> >+ assert(re.search('DataSize = 0x650', ''.join(output)))
> >+
> >+ def test_efi_var_auth4(self, u_boot_console, efi_boot_env):
> >+ """
> >+ Test Case 4 - Delete database without authentication
> >+ """
> >+ disk_img = efi_boot_env
> >+ with u_boot_console.log.section('Test Case 4a'):
> >+ # Test Case 4a, update without AUTHENTICATED_WRITE_ACCESS
> >+ output = u_boot_console.run_command_list([
> >+ 'host bind 0 %s' % disk_img,
> >+ 'fatload host 0:1 4000000 PK.auth',
> >+ 'setenv -e -nv -bs -rt -at -i 4000000,$filesize PK',
> >+ 'fatload host 0:1 4000000 KEK.auth',
> >+ 'setenv -e -nv -bs -rt -at -i 4000000,$filesize KEK',
> >+ 'fatload host 0:1 4000000 db.auth',
> >+ 'setenv -e -nv -bs -rt -at -i 4000000,$filesize db',
> >+ 'printenv -e -guid d719b2cb-3d3a-4596-a3bc-dad00e67656f db'])
> >+ assert(not re.search('Failed to set EFI variable', ''.join(output)))
> >+ assert(re.search('db:', ''.join(output)))
> >+ assert(re.search('DataSize = 0x327', ''.join(output)))
> >+
> >+ output = u_boot_console.run_command_list([
> >+ 'setenv -e -nv -bs -rt db',
> >+ 'printenv -e -guid d719b2cb-3d3a-4596-a3bc-dad00e67656f db'])
> >+ assert(re.search('Failed to set EFI variable', ''.join(output)))
> >+ assert(re.search('db:', ''.join(output)))
> >+ assert(re.search('DataSize = 0x327', ''.join(output)))
> >+
> >+ with u_boot_console.log.section('Test Case 4b'):
> >+ # Test Case 4b, update without correct signature/data
> >+ output = u_boot_console.run_command_list([
> >+ 'setenv -e -nv -bs -rt -at db',
> >+ 'printenv -e -guid d719b2cb-3d3a-4596-a3bc-dad00e67656f db'])
> >+ assert(re.search('Failed to set EFI variable', ''.join(output)))
> >+ assert(re.search('db:', ''.join(output)))
> >+ assert(re.search('DataSize = 0x327', ''.join(output)))
> >+
> >+ def test_efi_var_auth5(self, u_boot_console, efi_boot_env):
> >+ """
> >+ Test Case 5 - Uninstall(delete) PK
> >+ """
> >+ disk_img = efi_boot_env
> >+ with u_boot_console.log.section('Test Case 4a'):
> >+ # Test Case 5a, Uninstall PK without correct signature
> >+ output = u_boot_console.run_command_list([
> >+ 'host bind 0 %s' % disk_img,
> >+ 'fatload host 0:1 4000000 PK.auth',
> >+ 'setenv -e -nv -bs -rt -at -i 4000000,$filesize PK',
> >+ 'fatload host 0:1 4000000 KEK.auth',
> >+ 'setenv -e -nv -bs -rt -at -i 4000000,$filesize KEK',
> >+ 'fatload host 0:1 4000000 db.auth',
> >+ 'setenv -e -nv -bs -rt -at -i 4000000,$filesize db',
> >+ 'printenv -e PK'])
> >+ assert(not re.search('Failed to set EFI variable', ''.join(output)))
> >+ assert(re.search('PK:', ''.join(output)))
> >+# assert(re.search('DataSize = 0x31d', ''.join(output)))
> >+
> >+ output = u_boot_console.run_command_list([
> >+ 'fatload host 0:1 4000000 PK_null.esl',
> >+ 'setenv -e -nv -bs -rt -at -i 4000000,$filesize PK',
> >+ 'printenv -e PK'])
> >+ assert(re.search('Failed to set EFI variable', ''.join(output)))
> >+ assert(re.search('PK:', ''.join(output)))
> >+
> >+ with u_boot_console.log.section('Test Case 5b'):
> >+ # Test Case 5b, Uninstall PK with correct signature
> >+ output = u_boot_console.run_command_list([
> >+ 'fatload host 0:1 4000000 PK_null.auth',
> >+ 'setenv -e -nv -bs -rt -at -i 4000000,$filesize PK',
> >+ 'printenv -e PK'])
> >+ assert(not re.search('Failed to set EFI variable', ''.join(output)))
> >+ assert(re.search('\"PK\" not defined', ''.join(output)))
> >+
> >+ output = u_boot_console.run_command(
> >+ 'printenv -e SecureBoot')
> >+ assert('00000000: 00' in output)
> >+ output = u_boot_console.run_command(
> >+ 'printenv -e SetupMode')
> >+ assert('00000000: 01' in output)
> >
>
next prev parent reply other threads:[~2019-11-18 5:58 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-11-13 0:52 [U-Boot] [PATCH 00/16] efi_loader: add secure boot support AKASHI Takahiro
2019-11-13 0:52 ` [U-Boot] [PATCH 01/16] include: pe.h: add signature-related definitions AKASHI Takahiro
2019-11-16 17:42 ` Heinrich Schuchardt
2019-11-18 5:44 ` AKASHI Takahiro
2019-11-18 6:26 ` Heinrich Schuchardt
2019-11-18 6:53 ` AKASHI Takahiro
2019-11-13 0:52 ` [U-Boot] [PATCH 02/16] include: image.h: export hash algorithm helper functions AKASHI Takahiro
2019-11-16 17:59 ` Heinrich Schuchardt
2019-11-18 6:22 ` AKASHI Takahiro
2019-11-13 0:52 ` [U-Boot] [PATCH 03/16] secure boot: rename CONFIG_SECURE_BOOT config option AKASHI Takahiro
2019-11-13 0:52 ` [U-Boot] [PATCH 04/16] efi_loader: add CONFIG_EFI_SECURE_BOOT " AKASHI Takahiro
2019-11-13 0:52 ` [U-Boot] [PATCH 05/16] efi_loader: add signature verification functions AKASHI Takahiro
2019-11-16 20:00 ` Heinrich Schuchardt
2019-11-18 7:57 ` AKASHI Takahiro
2019-11-18 8:31 ` AKASHI Takahiro
2019-11-19 5:22 ` AKASHI Takahiro
2019-11-13 0:52 ` [U-Boot] [PATCH 06/16] efi_loader: add signature database parser AKASHI Takahiro
2019-11-13 0:52 ` [U-Boot] [PATCH 07/16] efi_loader: variable: support variable authentication AKASHI Takahiro
2019-11-16 20:02 ` Heinrich Schuchardt
2019-11-18 7:08 ` AKASHI Takahiro
2019-11-13 0:52 ` [U-Boot] [PATCH 08/16] efi_loader: variable: add secure boot state transition AKASHI Takahiro
2019-11-13 0:52 ` [U-Boot] [PATCH 09/16] efi_loader: variable: add VendorKeys variable AKASHI Takahiro
2019-11-13 0:53 ` [U-Boot] [PATCH 10/16] efi_loader: image_loader: support image authentication AKASHI Takahiro
2019-11-13 0:53 ` [U-Boot] [PATCH 11/16] efi_loader: set up secure boot AKASHI Takahiro
2019-11-13 0:53 ` [U-Boot] [PATCH 12/16] cmd: env: use appropriate guid for authenticated UEFI variable AKASHI Takahiro
2019-11-16 20:10 ` Heinrich Schuchardt
2019-11-18 6:34 ` AKASHI Takahiro
2019-11-18 6:56 ` Patrick Wildt
2019-11-13 0:53 ` [U-Boot] [PATCH 13/16] cmd: env: add "-at" option to "env set -e" command AKASHI Takahiro
2019-11-13 0:53 ` [U-Boot] [PATCH 14/16] efi_loader, pytest: set up secure boot environment AKASHI Takahiro
2019-11-16 20:19 ` Heinrich Schuchardt
2019-11-18 5:52 ` AKASHI Takahiro
2019-11-13 0:53 ` [U-Boot] [PATCH 15/16] efi_loader, pytest: add UEFI secure boot tests (authenticated variables) AKASHI Takahiro
2019-11-16 20:28 ` Heinrich Schuchardt
2019-11-18 5:58 ` AKASHI Takahiro [this message]
2019-11-20 2:17 ` AKASHI Takahiro
2019-11-13 0:53 ` [U-Boot] [PATCH 16/16] efi_loader, pytest: add UEFI secure boot tests (image) AKASHI Takahiro
2019-11-16 20:31 ` Heinrich Schuchardt
2019-11-18 6:00 ` AKASHI Takahiro
2019-11-15 2:19 ` [U-Boot] [PATCH 00/16] efi_loader: add secure boot support AKASHI Takahiro
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20191118055824.GN22427@linaro.org \
--to=takahiro.akashi@linaro.org \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox