From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 04BA8C433F5 for ; Mon, 28 Mar 2022 20:58:52 +0000 (UTC) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id DCDD783FAC; Mon, 28 Mar 2022 22:57:58 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=softathome.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=softathome1.onmicrosoft.com header.i=@softathome1.onmicrosoft.com header.b="GaeFndPk"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id D3B9783C84; Mon, 28 Mar 2022 22:57:26 +0200 (CEST) Received: from FRA01-MR2-obe.outbound.protection.outlook.com (mail-mr2fra01on0613.outbound.protection.outlook.com [IPv6:2a01:111:f400:7e19::613]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id F310883F86 for ; Mon, 28 Mar 2022 22:57:15 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=softathome.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=philippe.reynes@softathome.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=OFTkVvdQk90rz+bSX1wXSq5U9Q7ksfrZI4ULaxD/CgU9h6t3fDpXcGwasLSgesXmKAKas9K6PmeKdzQ3jsH4bWKLZqs82o8AJt/nk+qKqSqQx134N57YZQax2sJEFretcVD9vQ0Z6Mx2LpqJRmsa4fMwJ75VPQcZLsROrcAEY9Oh54ysv0NRawL1fN42GoguyLAC9hAYcgCM66FdIuO5QkZgO5ue/cFtZrLaAdYG4z4q2hNFEXjWyCFMaADbjul8guFSYF7yjEce3HIaCTiNkkhhLRX8e0meQ303feojrWwJ/EZJEt3azxYbgF0E04xvyPO9ky+E7oU9yBpfmNvucw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=ZE7T5jmEI/D0JNFpRTkkgs/yT9qNmGUYYk5ALagAm2E=; b=KMwKe9kR/wn7NLnkyMSm6OE8+nnLBQruWet5FMP1xw1lz22QPeSkHEEBmBJRl6rkhLztD3qhyGvQDTDjv33494eTYZvyO65QqCCTsM2AjLUbVFXU+sicmRPdynG8EwJflVsFejSI7uQ12JSPfwq49gFuWYYuFmiGWFNQQg3ePki3u33HCBiW72t1UV6sWcXCVPis1SAsGyIgWEjpHcThWNRwhPHUoWRplCU5N2r6GOCVgHpj/+12fNxfxkt11j/kpGQtOu04iPn/XpDCzFoh86g8tHEDMMQ46WeffLXIvcYP2fdo3E3bMfE3ZwGUF2pJtS/LarSnvlzp+ZkmwZzQ/Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 149.6.166.170) smtp.rcpttodomain=chromium.org smtp.mailfrom=softathome.com; dmarc=bestguesspass action=none header.from=softathome.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=softathome1.onmicrosoft.com; s=selector1-softathome1-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=ZE7T5jmEI/D0JNFpRTkkgs/yT9qNmGUYYk5ALagAm2E=; b=GaeFndPkD+Kjg9UQKmk/IG98Sxs7VjCe1FgNtYjNir3OSEFyBd9mBhu2VwktMoBBO2Ra60jc/71XgF9F577ZM/e+VGx90j4LPTTnnjqa03qKCr3J3wx6oP82BFAph7CrPCsSTfLvyjleHic0dl8ChTCjp7CvI324dSHshxFrJNx1KA4cUxy2zkqUpFFeJX+gd55A6e40CyDPGOkM+ExZMn+RD8Xrj7GhfiWl+uqbTGDyxJF6SR2eMykt92c9qw1HeBIFvvr0TAuC7WJ1DxJ+ggOp5AVxs7f0wkePrhJaqnkEAJ3j04vyRZbhzbU2JkTmMOFO5cJHJZqzOWSgKXIEaw== Received: from MR2P264CA0065.FRAP264.PROD.OUTLOOK.COM (2603:10a6:500:31::29) by PR1P264MB2189.FRAP264.PROD.OUTLOOK.COM (2603:10a6:102:1b5::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5102.17; Mon, 28 Mar 2022 20:57:14 +0000 Received: from MR2FRA01FT014.eop-fra01.prod.protection.outlook.com (2603:10a6:500:31:cafe::e3) by MR2P264CA0065.outlook.office365.com (2603:10a6:500:31::29) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5102.16 via Frontend Transport; Mon, 28 Mar 2022 20:57:14 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 149.6.166.170) smtp.mailfrom=softathome.com; dkim=none (message not signed) header.d=none;dmarc=bestguesspass action=none header.from=softathome.com; Received-SPF: Pass (protection.outlook.com: domain of softathome.com designates 149.6.166.170 as permitted sender) receiver=protection.outlook.com; client-ip=149.6.166.170; helo=proxy.softathome.com; Received: from proxy.softathome.com (149.6.166.170) by MR2FRA01FT014.mail.protection.outlook.com (10.152.50.113) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5102.17 via Frontend Transport; Mon, 28 Mar 2022 20:57:13 +0000 Received: from localhost.localdomain (unknown [192.168.72.32]) by proxy.softathome.com (Postfix) with ESMTPSA id B9B5020047; Mon, 28 Mar 2022 22:57:12 +0200 (CEST) From: Philippe Reynes To: sjg@chromium.org, rasmus.villemoes@prevas.dk Cc: u-boot@lists.denx.de, Philippe Reynes Subject: [PATCH v8 10/15] mkimage: add public key for image pre-load stage Date: Mon, 28 Mar 2022 22:57:02 +0200 Message-Id: <20220328205707.348270-11-philippe.reynes@softathome.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220328205707.348270-1-philippe.reynes@softathome.com> References: <20220328205707.348270-1-philippe.reynes@softathome.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email Content-Type: text/plain X-MS-Office365-Filtering-Correlation-Id: f4ae73f8-a794-4adf-b1e3-08da10fd8903 X-MS-TrafficTypeDiagnostic: PR1P264MB2189:EE_ X-Microsoft-Antispam-PRVS: X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: Ujkde9MR/Pi4mD3+JXM5SO7KvjWT6Zm02whT+X60RNfibJhd1H1j9jGfIJp0DcL1IFGTwJUdnr1EVf4OS6N8f1ARDfAHSx9xwJdgG1x3+VDX0neTmLPRibJT89BFJKGVRtYmsniMgQtMHkPtpjrMlMoPtoTBJoaKKxkDIF6sae/74uUnl+SW3P97JcebSUozvv7/PitX9XWWczeVsacrKMNH/w/gQmj+qG8+fMO5nNFEfVG67q5gh8+1dX30k5OS1CBzgNUUgrm/ZOaBSIPW08g0fUZp7MlQUGkIurU67pWTyS2kVTtqm+eYjZS6ZhFcOtG0wwcLh/vOiRpEYN++CJlA4CLQFMd9bBkAMBg14oQ1DL9XoQynV9i6PPhd7b/wtGE17XmZ9J2NpqzIW4cZ4u3Y4jg8PTAeHU7U66RCzSyNnB7u8M8qsnkFgC3HAh3D5wAdY0Mh2xI2IvtXccrnJUUQdOQed0F7fdV1uJDU4+T/vfrL9546xbvDCaySWV7+33Pf7+qSJTr8/mEQ9Xr+MwGXk+HqcbjTSavkm+aIJadGKYRCLwWR/EHBKtFKR4pNotXN7NVqah37fsQoaZZD9GKnlq1WDKlmLeUEGZhRtTsUXOH5UOlNXT2RUvJ/KJ/1XoBwL27ibn00WS9tioTNtWxi4PMvivsChdvV7j+sZkVHD/hbCbtw8w68cOudLC3XDktfURK5jxeJ3vK2YrALdg== X-Forefront-Antispam-Report: CIP:149.6.166.170; CTRY:FR; LANG:en; SCL:1; SRV:; IPV:CAL; SFV:NSPM; H:proxy.softathome.com; PTR:InfoDomainNonexistent; CAT:NONE; SFS:(13230001)(4636009)(36840700001)(40470700004)(46966006)(36860700001)(82960400001)(316002)(107886003)(40460700003)(44832011)(70206006)(2906002)(47076005)(86362001)(36756003)(186003)(2616005)(82310400004)(508600001)(26005)(81166007)(426003)(83380400001)(336012)(8676002)(6666004)(8936002)(1076003)(356005)(70586007)(6266002)(4326008)(6966003)(5660300002)(36900700001); DIR:OUT; SFP:1101; X-OriginatorOrg: softathome.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Mar 2022 20:57:13.7056 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: f4ae73f8-a794-4adf-b1e3-08da10fd8903 X-MS-Exchange-CrossTenant-Id: aa10e044-e405-4c10-8353-36b4d0cce511 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=aa10e044-e405-4c10-8353-36b4d0cce511; Ip=[149.6.166.170]; Helo=[proxy.softathome.com] X-MS-Exchange-CrossTenant-AuthSource: MR2FRA01FT014.eop-fra01.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PR1P264MB2189 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.39 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.5 at phobos.denx.de X-Virus-Status: Clean This commit enhances mkimage to update the node /image/pre-load/sig with the public key. Reviewed-by: Simon Glass Signed-off-by: Philippe Reynes --- include/image.h | 15 ++++++ tools/fit_image.c | 3 ++ tools/image-host.c | 114 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 132 insertions(+) diff --git a/include/image.h b/include/image.h index 496b7af3f3..498eb7f2e3 100644 --- a/include/image.h +++ b/include/image.h @@ -1019,6 +1019,21 @@ int fit_image_hash_get_value(const void *fit, int noffset, uint8_t **value, int fit_set_timestamp(void *fit, int noffset, time_t timestamp); +/** + * fit_pre_load_data() - add public key to fdt blob + * + * Adds public key to the node pre load. + * + * @keydir: Directory containing keys + * @keydest: FDT blob to write public key + * @fit: Pointer to the FIT format image header + * + * returns: + * 0, on success + * < 0, on failure + */ +int fit_pre_load_data(const char *keydir, void *keydest, void *fit); + int fit_cipher_data(const char *keydir, void *keydest, void *fit, const char *comment, int require_keys, const char *engine_id, const char *cmdname); diff --git a/tools/fit_image.c b/tools/fit_image.c index 15f7c82d61..1884a2eb0b 100644 --- a/tools/fit_image.c +++ b/tools/fit_image.c @@ -59,6 +59,9 @@ static int fit_add_file_data(struct image_tool_params *params, size_t size_inc, ret = fit_set_timestamp(ptr, 0, time); } + if (!ret) + ret = fit_pre_load_data(params->keydir, dest_blob, ptr); + if (!ret) { ret = fit_cipher_data(params->keydir, dest_blob, ptr, params->comment, diff --git a/tools/image-host.c b/tools/image-host.c index eaeb76545c..ab6f756cf1 100644 --- a/tools/image-host.c +++ b/tools/image-host.c @@ -14,6 +14,11 @@ #include #include +#include +#include + +#define IMAGE_PRE_LOAD_PATH "/image/pre-load/sig" + /** * fit_set_hash_value - set hash value in requested has node * @fit: pointer to the FIT format image header @@ -1111,6 +1116,115 @@ static int fit_config_add_verification_data(const char *keydir, return 0; } +/* + * 0) open file (open) + * 1) read certificate (PEM_read_X509) + * 2) get public key (X509_get_pubkey) + * 3) provide der format (d2i_RSAPublicKey) + */ +static int read_pub_key(const char *keydir, const void *name, + unsigned char **pubkey, int *pubkey_len) +{ + char path[1024]; + EVP_PKEY *key = NULL; + X509 *cert; + FILE *f; + int ret; + + memset(path, 0, 1024); + snprintf(path, sizeof(path), "%s/%s.crt", keydir, (char *)name); + + /* Open certificate file */ + f = fopen(path, "r"); + if (!f) { + fprintf(stderr, "Couldn't open RSA certificate: '%s': %s\n", + path, strerror(errno)); + return -EACCES; + } + + /* Read the certificate */ + cert = NULL; + if (!PEM_read_X509(f, &cert, NULL, NULL)) { + printf("Couldn't read certificate"); + ret = -EINVAL; + goto err_cert; + } + + /* Get the public key from the certificate. */ + key = X509_get_pubkey(cert); + if (!key) { + printf("Couldn't read public key\n"); + ret = -EINVAL; + goto err_pubkey; + } + + /* Get DER form */ + ret = i2d_PublicKey(key, pubkey); + if (ret < 0) { + printf("Couldn't get DER form\n"); + ret = -EINVAL; + goto err_pubkey; + } + + *pubkey_len = ret; + ret = 0; + +err_pubkey: + X509_free(cert); +err_cert: + fclose(f); + return ret; +} + +int fit_pre_load_data(const char *keydir, void *keydest, void *fit) +{ + int pre_load_noffset; + const void *algo_name; + const void *key_name; + unsigned char *pubkey = NULL; + int ret, pubkey_len; + + if (!keydir || !keydest || !fit) + return 0; + + /* Search node pre-load sig */ + pre_load_noffset = fdt_path_offset(keydest, IMAGE_PRE_LOAD_PATH); + if (pre_load_noffset < 0) { + ret = 0; + goto out; + } + + algo_name = fdt_getprop(keydest, pre_load_noffset, "algo-name", NULL); + key_name = fdt_getprop(keydest, pre_load_noffset, "key-name", NULL); + + /* Check that all mandatory properties are present */ + if (!algo_name || !key_name) { + if (!algo_name) + printf("The property algo-name is missing in the node %s\n", + IMAGE_PRE_LOAD_PATH); + if (!key_name) + printf("The property key-name is missing in the node %s\n", + IMAGE_PRE_LOAD_PATH); + ret = -ENODATA; + goto out; + } + + /* Read public key */ + ret = read_pub_key(keydir, key_name, &pubkey, &pubkey_len); + if (ret < 0) + goto out; + + /* Add the public key to the device tree */ + ret = fdt_setprop(keydest, pre_load_noffset, "public-key", + pubkey, pubkey_len); + if (ret) + printf("Can't set public-key in node %s (ret = %d)\n", + IMAGE_PRE_LOAD_PATH, ret); + + out: + return ret; +} + int fit_cipher_data(const char *keydir, void *keydest, void *fit, const char *comment, int require_keys, const char *engine_id, const char *cmdname) -- 2.25.1