From patchwork Wed Feb 27 20:26:58 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matthew Garrett X-Patchwork-Id: 10832301 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id E43BD1575 for ; Wed, 27 Feb 2019 20:27:22 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D825F2EB8E for ; Wed, 27 Feb 2019 20:27:22 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id CC4AE2EB91; Wed, 27 Feb 2019 20:27:22 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.5 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI, USER_IN_DEF_DKIM_WL autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 5050A2EB8E for ; Wed, 27 Feb 2019 20:27:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730447AbfB0U1Q (ORCPT ); Wed, 27 Feb 2019 15:27:16 -0500 Received: from mail-it1-f201.google.com ([209.85.166.201]:35737 "EHLO mail-it1-f201.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730368AbfB0U1P (ORCPT ); Wed, 27 Feb 2019 15:27:15 -0500 Received: by mail-it1-f201.google.com with SMTP id 142so6292258itx.0 for ; Wed, 27 Feb 2019 12:27:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=HzTSVpbyy+61Yj0es9srcGM5gLbmwFRA6fCyyZe10xo=; b=ZusZWA5EWkQ+3nCd805J8/tavC/3hxqnGpjfNPRYUqt8JvpiExogjJEkkVML/0y74E o4sGk7SOvvHT53H7iyoPjUCxgie//+BiD3SNozSwsExQVQufylbi25iDHzmzYakg+IdV 1Ttm+TAfpuB4mlGyUkkC+ol2rS2GCTcqrFQlcZ9199FAGgAD8gjrrALo7EYbcatNvBwl brG3+4j38HaJG88dsGO1Q4v6iBWPrZkkVhXw0xXW+WswXRIZ78LJEUAKCGnq9uYvAt0b nS+fyLV0dTnepFrhR/W51QHl5ZuyBfAsWUrNLvdfnVdQmdJn1JWGYFZBi1SIg/qGQQX7 XDvQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=HzTSVpbyy+61Yj0es9srcGM5gLbmwFRA6fCyyZe10xo=; b=sxWGqjmDdT70Lkm9edkSssQi3itM7EIF+zzRhmTij7g4CmHN4SxVNB32SpGlEuS6D3 vLH9k5sVhwdmV2KF8vx1xOBWz+450itM6fD3sWErLFEDP7JTb4GkiEY9qgWY/r6vpGC3 P6ToZWEGWapMg63yOCiYv9tjxGYQ5onQARxwaYO4+RL0Qhzo6kRHa97kljc10lYzZDf4 YyjFCKtXWSuRvSE0CHh6HqbPIuTp9RBosY3BeuaXa7clWjViv19Up6+G7Z+ZZiE9llxj qy+cT3kQZ8RMjO6l+aBK0EKFkOpWIyeWJsBm3IgTRx5yHV565/TDC9mxAaCoESu1Ie2K Yfsw== X-Gm-Message-State: APjAAAUGNxsEuGfg1GS/nNzFeODlZu615GYP/qJRN0cIspqfL/DKnWJI 4LQi10imkFdF/S7Y8aW3Fe86+vtWPkc1WrxlptKcWzI01VKNOOUBfl3ldN0Acllly/f2MPOJC4B NNGBDAZHAwz9MLKjsGX7ZHxyan0m1VhUjcPy2vs6AZDMC2W6m7Ba3iyiIkfz4MarNOTtB9m3ZVV IO9ftkpts8r+KCUJU41tE= X-Google-Smtp-Source: AHgI3IYEHy3njru0ZiQXMFT9KtKvZZOvQBghwSLugT0cTDATMRJw63EMRy3MT3DnTjp8rSqvXodtXe3T3G+COzFS3Dud+g== X-Received: by 2002:a24:cd07:: with SMTP id l7mr778172itg.22.1551299233980; Wed, 27 Feb 2019 12:27:13 -0800 (PST) Date: Wed, 27 Feb 2019 12:26:58 -0800 In-Reply-To: <20190227202658.197113-1-matthewgarrett@google.com> Message-Id: <20190227202658.197113-5-matthewgarrett@google.com> Mime-Version: 1.0 References: <20190227202658.197113-1-matthewgarrett@google.com> X-Mailer: git-send-email 2.21.0.352.gf09ad66450-goog Subject: [PATCH V5 4/4] efi: Attempt to get the TCG2 event log in the boot stub From: Matthew Garrett To: linux-integrity@vger.kernel.org Cc: peterhuewe@gmx.de, jarkko.sakkinen@linux.intel.com, jgg@ziepe.ca, roberto.sassu@huawei.com, linux-efi@vger.kernel.org, linux-security-module@vger.kernel.org, linux-kernel@vger.kernel.org, tweek@google.com, Matthew Garrett Sender: linux-integrity-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-integrity@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Matthew Garrett Right now we only attempt to obtain the SHA1-only event log. The protocol also supports a crypto agile log format, which contains digests for all algorithms in use. Attempt to obtain this first, and fall back to obtaining the older format if the system doesn't support it. This is lightly complicated by the event sizes being variable (as we don't know in advance which algorithms are in use), and the interface giving us back a pointer to the start of the final entry rather than a pointer to the end of the log - as a result, we need to parse the final entry to figure out its length in order to know how much data to copy up to the OS. Signed-off-by: Matthew Garrett --- drivers/firmware/efi/libstub/tpm.c | 50 ++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 17 deletions(-) diff --git a/drivers/firmware/efi/libstub/tpm.c b/drivers/firmware/efi/libstub/tpm.c index a90b0b8fc69a..523cd07c551c 100644 --- a/drivers/firmware/efi/libstub/tpm.c +++ b/drivers/firmware/efi/libstub/tpm.c @@ -59,7 +59,7 @@ void efi_enable_reset_attack_mitigation(efi_system_table_t *sys_table_arg) #endif -static void efi_retrieve_tpm2_eventlog_1_2(efi_system_table_t *sys_table_arg) +void efi_retrieve_tpm2_eventlog(efi_system_table_t *sys_table_arg) { efi_guid_t tcg2_guid = EFI_TCG2_PROTOCOL_GUID; efi_guid_t linux_eventlog_guid = LINUX_EFI_TPM_EVENT_LOG_GUID; @@ -69,6 +69,7 @@ static void efi_retrieve_tpm2_eventlog_1_2(efi_system_table_t *sys_table_arg) unsigned long first_entry_addr, last_entry_addr; size_t log_size, last_entry_size; efi_bool_t truncated; + int version = EFI_TCG2_EVENT_LOG_FORMAT_TCG_2; void *tcg2_protocol = NULL; status = efi_call_early(locate_protocol, &tcg2_guid, NULL, @@ -76,14 +77,20 @@ static void efi_retrieve_tpm2_eventlog_1_2(efi_system_table_t *sys_table_arg) if (status != EFI_SUCCESS) return; - status = efi_call_proto(efi_tcg2_protocol, get_event_log, tcg2_protocol, - EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2, - &log_location, &log_last_entry, &truncated); - if (status != EFI_SUCCESS) - return; + status = efi_call_proto(efi_tcg2_protocol, get_event_log, + tcg2_protocol, version, &log_location, + &log_last_entry, &truncated); + + if (status != EFI_SUCCESS || !log_location) { + version = EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2; + status = efi_call_proto(efi_tcg2_protocol, get_event_log, + tcg2_protocol, version, &log_location, + &log_last_entry, &truncated); + if (status != EFI_SUCCESS || !log_location) + return; + + } - if (!log_location) - return; first_entry_addr = (unsigned long) log_location; /* @@ -98,8 +105,23 @@ static void efi_retrieve_tpm2_eventlog_1_2(efi_system_table_t *sys_table_arg) * We need to calculate its size to deduce the full size of * the logs. */ - last_entry_size = sizeof(struct tcpa_event) + - ((struct tcpa_event *) last_entry_addr)->event_size; + if (version == EFI_TCG2_EVENT_LOG_FORMAT_TCG_2) { + /* + * The TCG2 log format has variable length entries, + * and the information to decode the hash algorithms + * back into a size is contained in the first entry - + * pass a pointer to the final entry (to calculate its + * size) and the first entry (so we know how long each + * digest is) + */ + last_entry_size = + __calc_tpm2_event_size((void *)last_entry_addr, + (void *)log_location, + false); + } else { + last_entry_size = sizeof(struct tcpa_event) + + ((struct tcpa_event *) last_entry_addr)->event_size; + } log_size = log_last_entry - log_location + last_entry_size; } @@ -116,7 +138,7 @@ static void efi_retrieve_tpm2_eventlog_1_2(efi_system_table_t *sys_table_arg) memset(log_tbl, 0, sizeof(*log_tbl) + log_size); log_tbl->size = log_size; - log_tbl->version = EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2; + log_tbl->version = version; memcpy(log_tbl->log, (void *) first_entry_addr, log_size); status = efi_call_early(install_configuration_table, @@ -128,9 +150,3 @@ static void efi_retrieve_tpm2_eventlog_1_2(efi_system_table_t *sys_table_arg) err_free: efi_call_early(free_pool, log_tbl); } - -void efi_retrieve_tpm2_eventlog(efi_system_table_t *sys_table_arg) -{ - /* Only try to retrieve the logs in 1.2 format. */ - efi_retrieve_tpm2_eventlog_1_2(sys_table_arg); -}