Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/965491/?format=api
{ "id": 965491, "url": "http://patchwork.ozlabs.org/api/patches/965491/?format=api", "web_url": "http://patchwork.ozlabs.org/project/uboot/patch/20180903144711.31585-18-jens.wiklander@linaro.org/", "project": { "id": 18, "url": "http://patchwork.ozlabs.org/api/projects/18/?format=api", "name": "U-Boot", "link_name": "uboot", "list_id": "u-boot.lists.denx.de", "list_email": "u-boot@lists.denx.de", "web_url": null, "scm_url": null, "webscm_url": null, "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20180903144711.31585-18-jens.wiklander@linaro.org>", "list_archive_url": null, "date": "2018-09-03T14:47:08", "name": "[U-Boot,v3,17/20] avb_verify: support using OP-TEE TA AVB", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "d8aa3bb594fed5cca1448575e758bd408725d1d1", "submitter": { "id": 66201, "url": "http://patchwork.ozlabs.org/api/people/66201/?format=api", "name": "Jens Wiklander", "email": "jens.wiklander@linaro.org" }, "delegate": { "id": 3651, "url": "http://patchwork.ozlabs.org/api/users/3651/?format=api", "username": "trini", "first_name": "Tom", "last_name": "Rini", "email": "trini@ti.com" }, "mbox": "http://patchwork.ozlabs.org/project/uboot/patch/20180903144711.31585-18-jens.wiklander@linaro.org/mbox/", "series": [ { "id": 63875, "url": "http://patchwork.ozlabs.org/api/series/63875/?format=api", "web_url": "http://patchwork.ozlabs.org/project/uboot/list/?series=63875", "date": "2018-09-03T14:46:51", "name": "AVB using OP-TEE", "version": 3, "mbox": "http://patchwork.ozlabs.org/series/63875/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/965491/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/965491/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<u-boot-bounces@lists.denx.de>", "X-Original-To": "incoming@patchwork.ozlabs.org", "Delivered-To": "patchwork-incoming@bilbo.ozlabs.org", "Authentication-Results": [ "ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=lists.denx.de\n\t(client-ip=81.169.180.215; helo=lists.denx.de;\n\tenvelope-from=u-boot-bounces@lists.denx.de;\n\treceiver=<UNKNOWN>)", "ozlabs.org;\n\tdmarc=fail (p=none dis=none) header.from=linaro.org", "ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=linaro.org header.i=@linaro.org\n\theader.b=\"H0k1F+j6\"; dkim-atps=neutral" ], "Received": [ "from lists.denx.de (dione.denx.de [81.169.180.215])\n\tby ozlabs.org (Postfix) with ESMTP id 423tRH1zNyz9s8F\n\tfor <incoming@patchwork.ozlabs.org>;\n\tTue, 4 Sep 2018 00:59:39 +1000 (AEST)", "by lists.denx.de (Postfix, from userid 105)\n\tid EC560C21E62; Mon, 3 Sep 2018 14:56:08 +0000 (UTC)", "from lists.denx.de (localhost [IPv6:::1])\n\tby lists.denx.de (Postfix) with ESMTP id 1ECFCC21F16;\n\tMon, 3 Sep 2018 14:48:10 +0000 (UTC)", "by lists.denx.de (Postfix, from userid 105)\n\tid 30D87C21EA7; Mon, 3 Sep 2018 14:47:54 +0000 (UTC)", "from mail-lf1-f68.google.com (mail-lf1-f68.google.com\n\t[209.85.167.68])\n\tby lists.denx.de (Postfix) with ESMTPS id 23979C21EF0\n\tfor <u-boot@lists.denx.de>; Mon, 3 Sep 2018 14:47:45 +0000 (UTC)", "by mail-lf1-f68.google.com with SMTP id j8-v6so658312lfb.4\n\tfor <u-boot@lists.denx.de>; Mon, 03 Sep 2018 07:47:45 -0700 (PDT)", "from jax.ideon.se ([85.235.10.227])\n\tby smtp.gmail.com with ESMTPSA id\n\tw18-v6sm3343431ljd.73.2018.09.03.07.47.42\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tMon, 03 Sep 2018 07:47:43 -0700 (PDT)" ], "X-Spam-Checker-Version": "SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de", "X-Spam-Level": "", "X-Spam-Status": "No, score=0.0 required=5.0 tests=RCVD_IN_MSPIKE_H2,\n\tT_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google;\n\th=from:to:cc:subject:date:message-id:in-reply-to:references;\n\tbh=XTd773w5P/Vj46SmIQFS3d5zP1Ly1I9xPhd1cY5R27M=;\n\tb=H0k1F+j6UZKmlcnquFAyZEfoW3mZRuy4fodoIw27XK4KitFaqnn9XE7mZ41YqT2/KZ\n\td8WeItLOD69bym0z2/VhowRTmrRpz/z3JMfoDH5pE0mNAdwNBBn7kz9oXL9WFUSomlvG\n\tHr1BGfdULiQUyRb4afM6St2MMbz/HeAjjUq9Q=", "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references;\n\tbh=XTd773w5P/Vj46SmIQFS3d5zP1Ly1I9xPhd1cY5R27M=;\n\tb=r949COjP71RqCOqdneBinsm5Kkpq3+Wk6QejYnCaR8SkMiIiN3qq3S51BAuo6LXSYY\n\t+qDpeU5lHUc9oIYQXNkbpfYD/R8eM3zHfydnst3HhU1YVBoS+Uoj/DCE/tP1FjXR1qXa\n\t+MsrwIiDBhP0aPJEhlQu3rkVvtlLf7dBjcNHHwwmHlPrZ5eFOl6pwQ827GaVN1D/ISGc\n\tqGm/wP0SsG5Ej6zxZyB/isAhQ/ftuRCuZBVGnqwGw75Ezifs9JmQtPcWQZNk4+xnJkPW\n\tE+UxRo74Jz/zFuZAjesamM1CFgfswe0Bb2o2S+L4jd7PAZL+FRXzo8sfEVVjMZZK9FPr\n\tR/0Q==", "X-Gm-Message-State": "APzg51DPgi1u/06XvoYaaZkK2P/PpiXkVI/MuZwvj27AoOVpCzk8XTLX\n\tyOZ5HtqjJ26glVyw0w+/w4C5NSFdqUg=", "X-Google-Smtp-Source": "ANB0VdbsK0kEnw8ffZzliZrGc4gPiZzkOswfDvj0n+9IacVjgq9JgT87sPlQBBohctA+TSQLyLU+rg==", "X-Received": "by 2002:a19:3bd4:: with SMTP id\n\td81-v6mr17052195lfl.96.1535986064258; \n\tMon, 03 Sep 2018 07:47:44 -0700 (PDT)", "From": "Jens Wiklander <jens.wiklander@linaro.org>", "To": "u-boot@lists.denx.de", "Date": "Mon, 3 Sep 2018 16:47:08 +0200", "Message-Id": "<20180903144711.31585-18-jens.wiklander@linaro.org>", "X-Mailer": "git-send-email 2.17.1", "In-Reply-To": "<20180903144711.31585-1-jens.wiklander@linaro.org>", "References": "<20180903144711.31585-1-jens.wiklander@linaro.org>", "Cc": "Tom Rini <trini@konsulko.com>, Pierre Aubert <p.aubert@staubli.com>", "Subject": "[U-Boot] [PATCH v3 17/20] avb_verify: support using OP-TEE TA AVB", "X-BeenThere": "u-boot@lists.denx.de", "X-Mailman-Version": "2.1.18", "Precedence": "list", "List-Id": "U-Boot discussion <u-boot.lists.denx.de>", "List-Unsubscribe": "<https://lists.denx.de/options/u-boot>,\n\t<mailto:u-boot-request@lists.denx.de?subject=unsubscribe>", "List-Archive": "<http://lists.denx.de/pipermail/u-boot/>", "List-Post": "<mailto:u-boot@lists.denx.de>", "List-Help": "<mailto:u-boot-request@lists.denx.de?subject=help>", "List-Subscribe": "<https://lists.denx.de/listinfo/u-boot>,\n\t<mailto:u-boot-request@lists.denx.de?subject=subscribe>", "MIME-Version": "1.0", "Content-Type": "text/plain; charset=\"utf-8\"", "Content-Transfer-Encoding": "base64", "Errors-To": "u-boot-bounces@lists.denx.de", "Sender": "\"U-Boot\" <u-boot-bounces@lists.denx.de>" }, "content": "With CONFIG_OPTEE_TA_AVB use the trusted application AVB provided by\nOP-TEE to manage rollback indexes and device lock status.\n\nSigned-off-by: Jens Wiklander <jens.wiklander@linaro.org>\n---\n common/avb_verify.c | 118 ++++++++++++++++++++++++++++++++++++++++++-\n doc/README.avb2 | 13 +++++\n include/avb_verify.h | 4 ++\n 3 files changed, 134 insertions(+), 1 deletion(-)", "diff": "diff --git a/common/avb_verify.c b/common/avb_verify.c\nindex 3a1282a09204..c2248c92514e 100644\n--- a/common/avb_verify.c\n+++ b/common/avb_verify.c\n@@ -10,6 +10,8 @@\n #include <image.h>\n #include <malloc.h>\n #include <part.h>\n+#include <tee.h>\n+#include <tee/optee_ta_avb.h>\n \n const unsigned char avb_root_pub[1032] = {\n \t0x0, 0x0, 0x10, 0x0, 0x55, 0xd9, 0x4, 0xad, 0xd8, 0x4,\n@@ -594,6 +596,65 @@ static AvbIOResult validate_vbmeta_public_key(AvbOps *ops,\n \treturn AVB_IO_RESULT_OK;\n }\n \n+#ifdef CONFIG_OPTEE_TA_AVB\n+static int get_open_session(struct AvbOpsData *ops_data)\n+{\n+\tstruct udevice *tee = NULL;\n+\n+\twhile (!ops_data->tee) {\n+\t\tconst struct tee_optee_ta_uuid uuid = TA_AVB_UUID;\n+\t\tstruct tee_open_session_arg arg;\n+\t\tint rc;\n+\n+\t\ttee = tee_find_device(tee, NULL, NULL, NULL);\n+\t\tif (!tee)\n+\t\t\treturn -ENODEV;\n+\n+\t\tmemset(&arg, 0, sizeof(arg));\n+\t\ttee_optee_ta_uuid_to_octets(arg.uuid, &uuid);\n+\t\trc = tee_open_session(tee, &arg, 0, NULL);\n+\t\tif (!rc) {\n+\t\t\tops_data->tee = tee;\n+\t\t\tops_data->session = arg.session;\n+\t\t}\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static AvbIOResult invoke_func(struct AvbOpsData *ops_data, u32 func,\n+\t\t\t ulong num_param, struct tee_param *param)\n+{\n+\tstruct tee_invoke_arg arg;\n+\n+\tif (get_open_session(ops_data))\n+\t\treturn AVB_IO_RESULT_ERROR_IO;\n+\n+\tmemset(&arg, 0, sizeof(arg));\n+\targ.func = func;\n+\targ.session = ops_data->session;\n+\n+\tif (tee_invoke_func(ops_data->tee, &arg, num_param, param))\n+\t\treturn AVB_IO_RESULT_ERROR_IO;\n+\tswitch (arg.ret) {\n+\tcase TEE_SUCCESS:\n+\t\treturn AVB_IO_RESULT_OK;\n+\tcase TEE_ERROR_OUT_OF_MEMORY:\n+\t\treturn AVB_IO_RESULT_ERROR_OOM;\n+\tcase TEE_ERROR_TARGET_DEAD:\n+\t\t/*\n+\t\t * The TA has paniced, close the session to reload the TA\n+\t\t * for the next request.\n+\t\t */\n+\t\ttee_close_session(ops_data->tee, ops_data->session);\n+\t\tops_data->tee = NULL;\n+\t\treturn AVB_IO_RESULT_ERROR_IO;\n+\tdefault:\n+\t\treturn AVB_IO_RESULT_ERROR_IO;\n+\t}\n+}\n+#endif\n+\n /**\n * read_rollback_index() - gets the rollback index corresponding to the\n * location of given by @out_rollback_index.\n@@ -609,6 +670,7 @@ static AvbIOResult read_rollback_index(AvbOps *ops,\n \t\t\t\t size_t rollback_index_slot,\n \t\t\t\t u64 *out_rollback_index)\n {\n+#ifndef CONFIG_OPTEE_TA_AVB\n \t/* For now we always return 0 as the stored rollback index. */\n \tprintf(\"%s not supported yet\\n\", __func__);\n \n@@ -616,6 +678,27 @@ static AvbIOResult read_rollback_index(AvbOps *ops,\n \t\t*out_rollback_index = 0;\n \n \treturn AVB_IO_RESULT_OK;\n+#else\n+\tAvbIOResult rc;\n+\tstruct tee_param param[2];\n+\n+\tif (rollback_index_slot >= TA_AVB_MAX_ROLLBACK_LOCATIONS)\n+\t\treturn AVB_IO_RESULT_ERROR_NO_SUCH_VALUE;\n+\n+\tmemset(param, 0, sizeof(param));\n+\tparam[0].attr = TEE_PARAM_ATTR_TYPE_VALUE_INPUT;\n+\tparam[0].u.value.a = rollback_index_slot;\n+\tparam[1].attr = TEE_PARAM_ATTR_TYPE_VALUE_OUTPUT;\n+\n+\trc = invoke_func(ops->user_data, TA_AVB_CMD_READ_ROLLBACK_INDEX,\n+\t\t\t ARRAY_SIZE(param), param);\n+\tif (rc)\n+\t\treturn rc;\n+\n+\t*out_rollback_index = (u64)param[1].u.value.a << 32 |\n+\t\t\t (u32)param[1].u.value.b;\n+\treturn AVB_IO_RESULT_OK;\n+#endif\n }\n \n /**\n@@ -633,10 +716,27 @@ static AvbIOResult write_rollback_index(AvbOps *ops,\n \t\t\t\t\tsize_t rollback_index_slot,\n \t\t\t\t\tu64 rollback_index)\n {\n+#ifndef CONFIG_OPTEE_TA_AVB\n \t/* For now this is a no-op. */\n \tprintf(\"%s not supported yet\\n\", __func__);\n \n \treturn AVB_IO_RESULT_OK;\n+#else\n+\tstruct tee_param param[2];\n+\n+\tif (rollback_index_slot >= TA_AVB_MAX_ROLLBACK_LOCATIONS)\n+\t\treturn AVB_IO_RESULT_ERROR_NO_SUCH_VALUE;\n+\n+\tmemset(param, 0, sizeof(param));\n+\tparam[0].attr = TEE_PARAM_ATTR_TYPE_VALUE_INPUT;\n+\tparam[0].u.value.a = rollback_index_slot;\n+\tparam[1].attr = TEE_PARAM_ATTR_TYPE_VALUE_INPUT;\n+\tparam[1].u.value.a = (u32)(rollback_index >> 32);\n+\tparam[1].u.value.b = (u32)rollback_index;\n+\n+\treturn invoke_func(ops->user_data, TA_AVB_CMD_WRITE_ROLLBACK_INDEX,\n+\t\t\t ARRAY_SIZE(param), param);\n+#endif\n }\n \n /**\n@@ -652,6 +752,7 @@ static AvbIOResult write_rollback_index(AvbOps *ops,\n */\n static AvbIOResult read_is_device_unlocked(AvbOps *ops, bool *out_is_unlocked)\n {\n+#ifndef CONFIG_OPTEE_TA_AVB\n \t/* For now we always return that the device is unlocked. */\n \n \tprintf(\"%s not supported yet\\n\", __func__);\n@@ -659,6 +760,16 @@ static AvbIOResult read_is_device_unlocked(AvbOps *ops, bool *out_is_unlocked)\n \t*out_is_unlocked = true;\n \n \treturn AVB_IO_RESULT_OK;\n+#else\n+\tAvbIOResult rc;\n+\tstruct tee_param param = { .attr = TEE_PARAM_ATTR_TYPE_VALUE_OUTPUT };\n+\n+\trc = invoke_func(ops->user_data, TA_AVB_CMD_READ_LOCK_STATE, 1, ¶m);\n+\tif (rc)\n+\t\treturn rc;\n+\t*out_is_unlocked = !param.u.value.a;\n+\treturn AVB_IO_RESULT_OK;\n+#endif\n }\n \n /**\n@@ -737,6 +848,11 @@ void avb_ops_free(AvbOps *ops)\n \n \tops_data = ops->user_data;\n \n-\tif (ops_data)\n+\tif (ops_data) {\n+#ifdef CONFIG_OPTEE_TA_AVB\n+\t\tif (ops_data->tee)\n+\t\t\ttee_close_session(ops_data->tee, ops_data->session);\n+#endif\n \t\tavb_free(ops_data);\n+\t}\n }\ndiff --git a/doc/README.avb2 b/doc/README.avb2\nindex 120279fedbe2..a29cee1b6f50 100644\n--- a/doc/README.avb2\n+++ b/doc/README.avb2\n@@ -18,6 +18,13 @@ Integrity of the bootloader (U-boot BLOB and environment) is out of scope.\n For additional details check:\n https://android.googlesource.com/platform/external/avb/+/master/README.md\n \n+1.1. AVB using OP-TEE (optional)\n+---------------------------------\n+If AVB is configured to use OP-TEE (see 4. below) rollback indexes and\n+device lock state are stored in RPMB. The RPMB partition is managed by\n+OP-TEE (https://www.op-tee.org/) which is a secure OS leveraging ARM\n+TrustZone.\n+\n \n 2. AVB 2.0 U-BOOT SHELL COMMANDS\n -----------------------------------\n@@ -61,6 +68,12 @@ CONFIG_LIBAVB=y\n CONFIG_AVB_VERIFY=y\n CONFIG_CMD_AVB=y\n \n+In addtion optionally if storing rollback indexes in RPMB with help of\n+OP-TEE:\n+CONFIG_TEE=y\n+CONFIG_OPTEE=y\n+CONFIG_OPTEE_TA_AVB=y\n+CONFIG_SUPPORT_EMMC_RPMB=y\n \n Then add `avb verify` invocation to your android boot sequence of commands,\n e.g.:\ndiff --git a/include/avb_verify.h b/include/avb_verify.h\nindex eaa60f5393ef..a532a2331aea 100644\n--- a/include/avb_verify.h\n+++ b/include/avb_verify.h\n@@ -27,6 +27,10 @@ struct AvbOpsData {\n \tstruct AvbOps ops;\n \tint mmc_dev;\n \tenum avb_boot_state boot_state;\n+#ifdef CONFIG_OPTEE_TA_AVB\n+\tstruct udevice *tee;\n+\tu32 session;\n+#endif\n };\n \n struct mmc_part {\n", "prefixes": [ "U-Boot", "v3", "17/20" ] }