From patchwork Mon Dec 14 22:19:44 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Petr Vorel X-Patchwork-Id: 11973233 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.7 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1CA7CC2BB9A for ; Mon, 14 Dec 2020 22:20:37 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id E483122522 for ; Mon, 14 Dec 2020 22:20:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2436975AbgLNWUg (ORCPT ); Mon, 14 Dec 2020 17:20:36 -0500 Received: from mx2.suse.de ([195.135.220.15]:44192 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2437152AbgLNWUg (ORCPT ); Mon, 14 Dec 2020 17:20:36 -0500 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.221.27]) by mx2.suse.de (Postfix) with ESMTP id CC77AAF2C; Mon, 14 Dec 2020 22:19:54 +0000 (UTC) From: Petr Vorel To: ltp@lists.linux.it Cc: Petr Vorel , Mimi Zohar , Lakshmi Ramasubramanian , Tushar Sugandhi , linux-integrity@vger.kernel.org Subject: [PATCH v5 2/4] IMA: Rewrite ima_boot_aggregate.c to new API Date: Mon, 14 Dec 2020 23:19:44 +0100 Message-Id: <20201214221946.6340-3-pvorel@suse.cz> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201214221946.6340-1-pvorel@suse.cz> References: <20201214221946.6340-1-pvorel@suse.cz> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-integrity@vger.kernel.org The main reason was to see TCONF messages, which are printed into stderr in new API (but to stdout in legacy API) and thus visible as the output is redirected into the variable. Changing boot_aggregate: to sha1: to be compatible with evmctl ima_boot_aggregate. Also require root (needed for reading /sys/kernel/security/tpm0/binary_bios_measurements). Signed-off-by: Petr Vorel --- .../integrity/ima/src/ima_boot_aggregate.c | 114 +++++++++--------- .../security/integrity/ima/tests/ima_tpm.sh | 2 +- 2 files changed, 58 insertions(+), 58 deletions(-) diff --git a/testcases/kernel/security/integrity/ima/src/ima_boot_aggregate.c b/testcases/kernel/security/integrity/ima/src/ima_boot_aggregate.c index 98893b99a..04d106662 100644 --- a/testcases/kernel/security/integrity/ima/src/ima_boot_aggregate.c +++ b/testcases/kernel/security/integrity/ima/src/ima_boot_aggregate.c @@ -1,19 +1,15 @@ +// SPDX-License-Identifier: GPL-2.0-or-later /* -* Copyright (c) International Business Machines Corp., 2009 -* -* Authors: -* Mimi Zohar -* -* This program is free software; you can redistribute it and/or -* modify it under the terms of the GNU General Public License as -* published by the Free Software Foundation, version 2 of the -* License. -* -* File: ima_boot_aggregate.c -* -* Calculate a SHA1 boot aggregate value based on the TPM -* binary_bios_measurements. -*/ + * Copyright (c) International Business Machines Corp., 2009 + * Copyright (c) 2016-2019 Petr Vorel + * + * Authors: Mimi Zohar + * + * Calculate a SHA1 boot aggregate value based on the TPM 1.2 + * binary_bios_measurements. + */ + +#include "config.h" #include #include #include @@ -23,10 +19,8 @@ #include #include -#include "config.h" -#include "test.h" - -char *TCID = "ima_boot_aggregate"; +#include "tst_test.h" +#include "tst_safe_stdio.h" #if HAVE_LIBCRYPTO #include @@ -36,7 +30,24 @@ char *TCID = "ima_boot_aggregate"; #define MAX_EVENT_DATA_SIZE (MAX_EVENT_SIZE - EVENT_HEADER_SIZE) #define NUM_PCRS 8 /* PCR registers 0-7 in boot aggregate */ -int TST_TOTAL = 1; +static char *debug; +static char *file; + +static unsigned char boot_aggregate[SHA_DIGEST_LENGTH]; + +static struct { + struct { + u_int32_t pcr; + u_int32_t type; + u_int8_t digest[SHA_DIGEST_LENGTH]; + u_int32_t len; + } header __attribute__ ((packed)); + char *data; +} event; + +static struct { + unsigned char digest[SHA_DIGEST_LENGTH]; +} pcr[NUM_PCRS]; static void display_sha1_digest(unsigned char *pcr) { @@ -47,45 +58,24 @@ static void display_sha1_digest(unsigned char *pcr) printf("\n"); } -int main(int argc, char *argv[]) +static void do_test(void) { - unsigned char boot_aggregate[SHA_DIGEST_LENGTH]; - struct { - struct { - u_int32_t pcr; - u_int32_t type; - u_int8_t digest[SHA_DIGEST_LENGTH]; - u_int32_t len; - } header __attribute__ ((packed)); - char *data; - } event; - struct { - unsigned char digest[SHA_DIGEST_LENGTH]; - } pcr[NUM_PCRS]; FILE *fp; - int i; - int debug = 0; SHA_CTX c; + int i; - if (argc != 2) { - printf("format: %s binary_bios_measurement file\n", argv[0]); - return 1; - } - fp = fopen(argv[1], "r"); - if (!fp) { - perror("unable to open pcr file\n"); - return 1; - } + if (!file) + tst_brk(TBROK, "missing binary_bios_measurement file, specify with -f"); + + fp = SAFE_FOPEN(file, "r"); /* Initialize psuedo PCR registers 0 - 7 */ for (i = 0; i < NUM_PCRS; i++) memset(&pcr[i].digest, 0, SHA_DIGEST_LENGTH); event.data = malloc(MAX_EVENT_DATA_SIZE); - if (!event.data) { - printf("Cannot allocate memory\n"); - return 1; - } + if (!event.data) + tst_brk(TBROK, "cannot allocate memory"); /* Extend the pseudo PCRs with the event digest */ while (fread(&event, sizeof(event.header), 1, fp)) { @@ -105,13 +95,14 @@ int main(int argc, char *argv[]) #if MAX_EVENT_DATA_SIZE < USHRT_MAX if (event.header.len > MAX_EVENT_DATA_SIZE) { - printf("Error event too long\n"); + tst_res(TWARN, "error event too long"); break; } #endif fread(event.data, event.header.len, 1, fp); } - fclose(fp); + + SAFE_FCLOSE(fp); free(event.data); /* Extend the boot aggregate with the pseudo PCR digest values */ @@ -126,14 +117,23 @@ int main(int argc, char *argv[]) } SHA1_Final(boot_aggregate, &c); - printf("boot_aggregate:"); + printf("sha1:"); display_sha1_digest(boot_aggregate); - tst_exit(); + tst_res(TPASS, "found sha1 hash"); } +static struct tst_option options[] = { + {"d", &debug, "-d enable debug"}, + {"f:", &file, "-f x binary_bios_measurement file (required)\n"}, + {NULL, NULL, NULL} +}; + +static struct tst_test test = { + .needs_root = 1, + .test_all = do_test, + .options = options, +}; + #else -int main(void) -{ - tst_brkm(TCONF, NULL, "test requires libcrypto and openssl development packages"); -} +TST_TEST_TCONF("libcrypto and openssl development packages required"); #endif diff --git a/testcases/kernel/security/integrity/ima/tests/ima_tpm.sh b/testcases/kernel/security/integrity/ima/tests/ima_tpm.sh index c69f891f1..dc958eb5c 100755 --- a/testcases/kernel/security/integrity/ima/tests/ima_tpm.sh +++ b/testcases/kernel/security/integrity/ima/tests/ima_tpm.sh @@ -33,7 +33,7 @@ test1() tst_res TFAIL "bios boot aggregate is not 0" fi else - boot_aggregate=$(ima_boot_aggregate $tpm_bios | grep "boot_aggregate:" | cut -d':' -f2) + boot_aggregate=$(ima_boot_aggregate -f $tpm_bios | grep "sha1:" | cut -d':' -f2) if [ "$boot_hash" = "$boot_aggregate" ]; then tst_res TPASS "bios aggregate matches IMA boot aggregate" else