From patchwork Mon Aug 13 15:53:47 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jens Wiklander X-Patchwork-Id: 144033 Delivered-To: patches@linaro.org Received: by 2002:a2e:9754:0:0:0:0:0 with SMTP id f20-v6csp3247116ljj; Mon, 13 Aug 2018 08:54:18 -0700 (PDT) X-Received: by 2002:a19:6902:: with SMTP id e2-v6mr10898456lfc.70.1534175658851; Mon, 13 Aug 2018 08:54:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1534175658; cv=none; d=google.com; s=arc-20160816; b=ERuM/uj/ok2mRgpU1FqVmwPuIDp04voqJ1YpotIwAr1UDmX33bJ7Jdh+MlE9WBY4WD WTtdHfLRwc5LfyAGYsfeCZGcJFRkAWwLwf9MwI2goHMvALtvkUTvCHc0OJBstAla9xiA TDOLaA9INwc3ocMXgmDpPNdGKp+42uQtg+phk1vguVQzVzfINKcbd0B7EEwoNsSuAyBK 18lXCW+crI911BkMEfOLLHd3hIJOqj5sM5bT4mwh8hahYG2tCALUS/bp3a+tukQkAgh4 aMrHVcTlpv24uDOmtAk7BEqY3Sqy2yF+C4rtZhBpmuuXWd/LN5yiXWZibbfmwsB93owP Ggpw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=3se3hkKGk2god4isRvd2wcG+mGc29Uu+JrhU0KyA6Hc=; b=klcdX1gemvpH45dZrSqfpmCaatMzuR04zH1M230iCKC3P4tTiRf2t/7puvlkpXKQIe NF7BKDc404SqI6sZtbxYrqf9a3Ucm0ZN2EVjt8oeyCHkY46JTg0UNuwW7XSHj6unnhgI 3HGUrFO1jtSEYF+a65Tdomjj0QCaCNn9y0fqYofw61DlkCjEFK3rXNfjFyQeIzG11hWP H7Jq8XjBaIic9mKAUHF2sbBh9/BDR2a3ecy+S8osAvz1PZrPKEcl0nIYVIPcL1c9F/JZ 5nA6RRydBlnmuYBxmweFN9g1zVdnjhTuv6PhJ9WdaQ7v2y/K1TYP3a36ukJ8bF587o+x fslQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=avzieltJ; spf=pass (google.com: domain of jens.wiklander@linaro.org designates 209.85.220.41 as permitted sender) smtp.mailfrom=jens.wiklander@linaro.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from mail-sor-f41.google.com (mail-sor-f41.google.com. [209.85.220.41]) by mx.google.com with SMTPS id r66-v6sor1668051lfd.37.2018.08.13.08.54.18 for (Google Transport Security); Mon, 13 Aug 2018 08:54:18 -0700 (PDT) Received-SPF: pass (google.com: domain of jens.wiklander@linaro.org designates 209.85.220.41 as permitted sender) client-ip=209.85.220.41; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=avzieltJ; spf=pass (google.com: domain of jens.wiklander@linaro.org designates 209.85.220.41 as permitted sender) smtp.mailfrom=jens.wiklander@linaro.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=3se3hkKGk2god4isRvd2wcG+mGc29Uu+JrhU0KyA6Hc=; b=avzieltJCqb8R9sATSa2Pk17FNVbOqpalm40Ko+HaVrgP7HdOheDpdHYkQLzgQGZOj 9ltPuCHqduP6axNQjKjntPWRrE+kEWc/6qmp0Af9i334LllG05VICTijkB58364kpmfK T8nGJ9+GsgiXnQ8nrfd0WNIUX6y0hl2URbAY4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=3se3hkKGk2god4isRvd2wcG+mGc29Uu+JrhU0KyA6Hc=; b=CiIu2nVC2LGemQ8AID2GAaYkTtjXBuzarNKlcOhjJONGr8OUKsZcGCzU3bhD0+GSG/ fPOOzG9HO0XL/wNds7CJfiLLu1e19+Jz7oKpZCX/I8LpESHgUatYztlMio4Tfu0lcYOq ySEWWlNcl4T4qoH8DNp8nnkYJRRKtmOKuMkWI6HTlwPVe01UM2zrlWi1Orc4S6DZU/Is axS/j81doT/pNfnVH5SBri3Jo83wFDDy6zK0e3NB5A0xMw3j9OZaHzew3pTtXHqYUI8d 4XQmorKbAIlKZpsAbDCmN0Yrfv+DDAMGCWkZI/ieYlslZl4lf4yK1vqfa1RjhwAvtZy8 qq2w== X-Gm-Message-State: AOUpUlHYB8UNc5Pd7TdzUMHueo8hY86wuh4XS22xtEf9W95zdmYm3N1B QIcSIYQLJDaqGdvu+02E6kA/eJIZ X-Google-Smtp-Source: AA+uWPx6UT6UMUDo87FwoilGWDfZ+kRtak5awtSDlOChEHyvLpg4MNgR3tMAJxgZQiVcUd7U/0z7ZQ== X-Received: by 2002:a19:4344:: with SMTP id m4-v6mr11897595lfj.111.1534175658594; Mon, 13 Aug 2018 08:54:18 -0700 (PDT) Return-Path: Received: from jax.urgonet (h-84-105.A175.priv.bahnhof.se. [79.136.84.105]) by smtp.gmail.com with ESMTPSA id q12-v6sm2791624lfc.26.2018.08.13.08.54.17 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 13 Aug 2018 08:54:17 -0700 (PDT) From: Jens Wiklander To: u-boot@lists.denx.de Cc: Simon Glass , Igor Opaniuk , Tom Rini , Jaehoon Chung , Pierre Aubert , Albert Aribaud , Peter Griffin , Michal Simek , Jens Wiklander Subject: [PATCH 10/10] avb_verify: support using OP-TEE TA AVB Date: Mon, 13 Aug 2018 17:53:47 +0200 Message-Id: <20180813155347.13844-11-jens.wiklander@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180813155347.13844-1-jens.wiklander@linaro.org> References: <20180813155347.13844-1-jens.wiklander@linaro.org> With CONFIG_OPTEE_TA_AVB use the trusted application AVB provided by OP-TEE to manage rollback indexes and device lock status. Signed-off-by: Jens Wiklander --- common/avb_verify.c | 132 ++++++++++++++++++++++++++++++++++++++++++- include/avb_verify.h | 4 ++ 2 files changed, 135 insertions(+), 1 deletion(-) -- 2.17.1 Tested-by: Igor Opaniuk diff --git a/common/avb_verify.c b/common/avb_verify.c index 20e35ade3029..a50c05bf7847 100644 --- a/common/avb_verify.c +++ b/common/avb_verify.c @@ -10,6 +10,8 @@ #include #include #include +#include +#include const unsigned char avb_root_pub[1032] = { 0x0, 0x0, 0x10, 0x0, 0x55, 0xd9, 0x4, 0xad, 0xd8, 0x4, @@ -594,6 +596,79 @@ static AvbIOResult validate_vbmeta_public_key(AvbOps *ops, return AVB_IO_RESULT_OK; } +#ifdef CONFIG_OPTEE_TA_AVB +static void uuid_to_octets(u8 d[TEE_UUID_LEN], + const struct tee_optee_ta_uuid *s) +{ + d[0] = s->time_low >> 24; + d[1] = s->time_low >> 16; + d[2] = s->time_low >> 8; + d[3] = s->time_low; + d[4] = s->time_mid >> 8; + d[5] = s->time_mid; + d[6] = s->time_hi_and_version >> 8; + d[7] = s->time_hi_and_version; + memcpy(d + 8, s->clock_seq_and_node, sizeof(s->clock_seq_and_node)); +} + +static int get_open_session(struct AvbOpsData *ops_data) +{ + struct udevice *tee = NULL; + + while (!ops_data->tee) { + const struct tee_optee_ta_uuid uuid = TA_AVB_UUID; + struct tee_open_session_arg arg; + int rc; + + tee = tee_find_device(tee, NULL, NULL, NULL); + if (!tee) + return -ENODEV; + + memset(&arg, 0, sizeof(arg)); + uuid_to_octets(arg.uuid, &uuid); + rc = tee_open_session(tee, &arg, 0, NULL); + if (!rc) { + ops_data->tee = tee; + ops_data->session = arg.session; + } + } + + return 0; +} + +static AvbIOResult invoke_func(struct AvbOpsData *ops_data, u32 func, + ulong num_param, struct tee_param *param) +{ + struct tee_invoke_arg arg; + + if (get_open_session(ops_data)) + return AVB_IO_RESULT_ERROR_IO; + + memset(&arg, 0, sizeof(arg)); + arg.func = func; + arg.session = ops_data->session; + + if (tee_invoke_func(ops_data->tee, &arg, num_param, param)) + return AVB_IO_RESULT_ERROR_IO; + switch (arg.ret) { + case TEE_SUCCESS: + return AVB_IO_RESULT_OK; + case TEE_ERROR_OUT_OF_MEMORY: + return AVB_IO_RESULT_ERROR_OOM; + case TEE_ERROR_TARGET_DEAD: + /* + * The TA has paniced, close the session to reload the TA + * for the next request. + */ + tee_close_session(ops_data->tee, ops_data->session); + ops_data->tee = NULL; + return AVB_IO_RESULT_ERROR_IO; + default: + return AVB_IO_RESULT_ERROR_IO; + } +} +#endif + /** * read_rollback_index() - gets the rollback index corresponding to the * location of given by @out_rollback_index. @@ -609,6 +684,7 @@ static AvbIOResult read_rollback_index(AvbOps *ops, size_t rollback_index_slot, u64 *out_rollback_index) { +#ifndef CONFIG_OPTEE_TA_AVB /* For now we always return 0 as the stored rollback index. */ printf("%s not supported yet\n", __func__); @@ -616,6 +692,27 @@ static AvbIOResult read_rollback_index(AvbOps *ops, *out_rollback_index = 0; return AVB_IO_RESULT_OK; +#else + AvbIOResult rc; + struct tee_param param[2]; + + if (rollback_index_slot >= TA_AVB_MAX_ROLLBACK_LOCATIONS) + return AVB_IO_RESULT_ERROR_NO_SUCH_VALUE; + + memset(param, 0, sizeof(param)); + param[0].attr = TEE_PARAM_ATTR_TYPE_VALUE_INPUT; + param[0].u.value.a = rollback_index_slot; + param[1].attr = TEE_PARAM_ATTR_TYPE_VALUE_OUTPUT; + + rc = invoke_func(ops->user_data, TA_AVB_CMD_READ_ROLLBACK_INDEX, + ARRAY_SIZE(param), param); + if (rc) + return rc; + + *out_rollback_index = (u64)param[1].u.value.a << 32 | + (u32)param[1].u.value.b; + return AVB_IO_RESULT_OK; +#endif } /** @@ -633,10 +730,27 @@ static AvbIOResult write_rollback_index(AvbOps *ops, size_t rollback_index_slot, u64 rollback_index) { +#ifndef CONFIG_OPTEE_TA_AVB /* For now this is a no-op. */ printf("%s not supported yet\n", __func__); return AVB_IO_RESULT_OK; +#else + struct tee_param param[2]; + + if (rollback_index_slot >= TA_AVB_MAX_ROLLBACK_LOCATIONS) + return AVB_IO_RESULT_ERROR_NO_SUCH_VALUE; + + memset(param, 0, sizeof(param)); + param[0].attr = TEE_PARAM_ATTR_TYPE_VALUE_INPUT; + param[0].u.value.a = rollback_index_slot; + param[1].attr = TEE_PARAM_ATTR_TYPE_VALUE_INPUT; + param[1].u.value.a = (u32)(rollback_index >> 32); + param[1].u.value.b = (u32)rollback_index; + + return invoke_func(ops->user_data, TA_AVB_CMD_WRITE_ROLLBACK_INDEX, + ARRAY_SIZE(param), param); +#endif } /** @@ -652,6 +766,7 @@ static AvbIOResult write_rollback_index(AvbOps *ops, */ static AvbIOResult read_is_device_unlocked(AvbOps *ops, bool *out_is_unlocked) { +#ifndef CONFIG_OPTEE_TA_AVB /* For now we always return that the device is unlocked. */ printf("%s not supported yet\n", __func__); @@ -659,6 +774,16 @@ static AvbIOResult read_is_device_unlocked(AvbOps *ops, bool *out_is_unlocked) *out_is_unlocked = true; return AVB_IO_RESULT_OK; +#else + AvbIOResult rc; + struct tee_param param = { .attr = TEE_PARAM_ATTR_TYPE_VALUE_OUTPUT }; + + rc = invoke_func(ops->user_data, TA_AVB_CMD_READ_LOCK_STATE, 1, ¶m); + if (rc) + return rc; + *out_is_unlocked = !param.u.value.a; + return AVB_IO_RESULT_OK; +#endif } /** @@ -737,6 +862,11 @@ void avb_ops_free(AvbOps *ops) ops_data = ops->user_data; - if (ops_data) + if (ops_data) { +#ifdef CONFIG_OPTEE_TA_AVB + if (ops_data->tee) + tee_close_session(ops_data->tee, ops_data->session); +#endif avb_free(ops_data); + } } diff --git a/include/avb_verify.h b/include/avb_verify.h index eaa60f5393ef..a532a2331aea 100644 --- a/include/avb_verify.h +++ b/include/avb_verify.h @@ -27,6 +27,10 @@ struct AvbOpsData { struct AvbOps ops; int mmc_dev; enum avb_boot_state boot_state; +#ifdef CONFIG_OPTEE_TA_AVB + struct udevice *tee; + u32 session; +#endif }; struct mmc_part {