From patchwork Mon Apr 7 08:28:24 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Avri Altman X-Patchwork-Id: 878949 Received: from esa4.hgst.iphmx.com (esa4.hgst.iphmx.com [216.71.154.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4C2F923A6 for ; Mon, 7 Apr 2025 08:33:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=216.71.154.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744014811; cv=none; b=RLMGivOIOShKw3Ew0vQhrrCPMLYzNLXMkJjtb4JcrJPL2GIoxilUdJfxY5LVHBRdEFXw+TpRnemznrTjXO1QSYarYKBaRgJfXRJw9oQXizh9TMMNc8Yi9sw6eeanmKUPlnmCcJcLQwq7sDx7M+NeMKMwE0Xy3wGcjQ9zYe/ibJU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744014811; c=relaxed/simple; bh=EyEKPI//75bKxvR1UXdzWDPYKNRGXiLSbtKWsayQLKc=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=uAAB2khZeIPSmIBswTwcwlbPd5mTk8pW4N4mmTyRizzyAealgu1TGUKT2Dm8aKucDnAzfqRrTiHQVGfGyXu/3duy5BJsvmlMGIYZebGGP9u4I6qa5q7nAqM0GjjOsRA5S0Sx3pTOtP53+rqholnKUo4OtbdpeggcRCEYxs1g5HU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=sandisk.com; spf=pass smtp.mailfrom=sandisk.com; dkim=pass (2048-bit key) header.d=sandisk.com header.i=@sandisk.com header.b=qBQo2p2s; arc=none smtp.client-ip=216.71.154.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=sandisk.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=sandisk.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=sandisk.com header.i=@sandisk.com header.b="qBQo2p2s" DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=sandisk.com; i=@sandisk.com; q=dns/txt; s=dkim.sandisk.com; t=1744014810; x=1775550810; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=EyEKPI//75bKxvR1UXdzWDPYKNRGXiLSbtKWsayQLKc=; b=qBQo2p2saDtXIgT/ahudjmRTHrILprfLCRvw1qsk9bnI0qySbc1evVjT StAQednrFcPV2TJe9T3LBXfIKF84bx14vGq9yOZ9PT3eYpHcxUWDChjRl YmJ3GpJs5Hf3C9wEcJyW9aC260SVrd/rXQPGwq4taXhldfW7fTx/PC/CD KI+Ir+u6jXjP5qyXehEMNrJwowelzAl6y0xxnwT37FCAJ519iW+Lt+qLS mKyn91r98sMfqpaAtKSyykCk0ES1hhcZRsuG6JzTj68W7Fpn+w/QmKtU5 3XrVzGx7Tb07ywI7YQgqZ4tunm+5SSjno+Z4/picRqEPbTnNdNIhvLC5W Q==; X-CSE-ConnectionGUID: 0oBhC8bdSke8wLT4/cv63Q== X-CSE-MsgGUID: u4FQsGSZSSe4u0U9fPHDLA== X-IronPort-AV: E=Sophos;i="6.15,193,1739808000"; d="scan'208";a="74116708" Received: from uls-op-cesaip01.wdc.com (HELO uls-op-cesaep01.wdc.com) ([199.255.45.14]) by ob1.hgst.iphmx.com with ESMTP; 07 Apr 2025 16:33:11 +0800 IronPort-SDR: 67f37fc8_4HhFilp2yKBmidDpwyi/LgzXRNXBF/shcxIh1EdYRZnMNfH 5nrKT4hyv6U7ZoW3KuAW4SRZHWKiLh5RJp0tbRw== Received: from uls-op-cesaip01.wdc.com ([10.248.3.36]) by uls-op-cesaep01.wdc.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 07 Apr 2025 00:33:28 -0700 WDCIronportException: Internal Received: from avri-office.ad.shared (HELO avri-office.sdcorp.global.sandisk.com) ([10.45.31.142]) by uls-op-cesaip01.wdc.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 07 Apr 2025 01:33:10 -0700 From: Avri Altman To: Ulf Hansson , linux-mmc@vger.kernel.org Cc: Avri Altman Subject: [PATCH 01/10] mmc-utils: Initialize RPMB frame_out structures to zero Date: Mon, 7 Apr 2025 11:28:24 +0300 Message-Id: <20250407082833.108616-2-avri.altman@sandisk.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20250407082833.108616-1-avri.altman@sandisk.com> References: <20250407082833.108616-1-avri.altman@sandisk.com> Precedence: bulk X-Mailing-List: linux-mmc@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Avri Altman This patch ensures that the `frame_out` structures are properly initialized to zero. It would helps prevent potential issues with uninitialized memory and ensures that all fields are set to a known state before use. Signed-off-by: Avri Altman --- mmc_cmds.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mmc_cmds.c b/mmc_cmds.c index dbe18ab..125816d 100644 --- a/mmc_cmds.c +++ b/mmc_cmds.c @@ -2224,7 +2224,7 @@ int do_rpmb_write_key(int nargs, char **argv) int ret, dev_fd, key_fd; struct rpmb_frame frame_in = { .req_resp = htobe16(MMC_RPMB_WRITE_KEY) - }, frame_out; + }, frame_out = {}; if (nargs != 3) { fprintf(stderr, "Usage: mmc rpmb write-key \n"); @@ -2285,7 +2285,7 @@ static int rpmb_read_counter(int dev_fd, unsigned int *cnt) int ret; struct rpmb_frame frame_in = { .req_resp = htobe16(MMC_RPMB_READ_CNT) - }, frame_out; + }, frame_out = {}; /* Execute RPMB op */ ret = do_rpmb_op(dev_fd, &frame_in, &frame_out, 1); @@ -2499,7 +2499,7 @@ int do_rpmb_write_block(int nargs, char **argv) struct rpmb_frame frame_in = { .req_resp = htobe16(MMC_RPMB_WRITE), .block_count = htobe16(1) - }, frame_out; + }, frame_out = {}; if (nargs != 5) { fprintf(stderr, "Usage: mmc rpmb write-block
\n"); From patchwork Mon Apr 7 08:28:25 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Avri Altman X-Patchwork-Id: 879983 Received: from esa4.hgst.iphmx.com (esa4.hgst.iphmx.com [216.71.154.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1B846226CE6 for ; Mon, 7 Apr 2025 08:33:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=216.71.154.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744014813; cv=none; b=brlfr6kkLRqmqzBMN+Zd58hmr5dpdcOgCiX0LNr9E8tKWlj+rRJXk7BUeXlacJoh1IPGLUQAx6DpmORd3nAyMub0DtTxjVBfD7Cdq1hZpkPXEdqd3fQ4Z6t6uPZL9x8ej6stl+jwImdKerigCyiCzCBzfuaz4RP42iiZEItdUIU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744014813; c=relaxed/simple; bh=EsyfZ4tmhjNz0FzKcwIZKsp2ON9zuXCsumdrtCOPEfs=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=kfEGmOfpSQ0HIo5oMKVpJyqTk1k69YLide+gNEHD4J0OoXk+K/LIlJfVJQjWsOVM6pjZQNFYKquUoOAVdCMTcE4Ro8yBtiHBhObzT2FdoC/VGtqg+oUHnRp5vi+3qkzQyVYs/0gnD8XZcNSN7HzKc8nDDLBhOLXylLpxKsHU5VM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=sandisk.com; spf=pass smtp.mailfrom=sandisk.com; dkim=pass (2048-bit key) header.d=sandisk.com header.i=@sandisk.com header.b=piHYlAb7; arc=none smtp.client-ip=216.71.154.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=sandisk.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=sandisk.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=sandisk.com header.i=@sandisk.com header.b="piHYlAb7" DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=sandisk.com; i=@sandisk.com; q=dns/txt; s=dkim.sandisk.com; t=1744014812; x=1775550812; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=EsyfZ4tmhjNz0FzKcwIZKsp2ON9zuXCsumdrtCOPEfs=; b=piHYlAb7p3g1jjYDHZjVYquIwAuq0qTLFCKsq+5ZrVr2P7/blqMVW4yS gKUJ/Vow2wMrScftTc0Ev1JblALz2YY9UAXvZXE3TLCjKU12r95hRSpm0 61Qs/VDrYByn/U52Sj0wgzRDtyzpBiaOXdxJcJgEHqPJFEgIFodD5OB8s RCQcOuOWjXSgP7/gm4zeTKdLS39tbc0Mnfmfttk82HlDdKPJsWZphAeHb LaHIGuBOlYXSMijqoYI8jT2jtLkCkQvl5D+Y8uH8V3Nb7eSg7/bJ7Wclx X2C2JCtW5ewsP08WMaWHNy6BLuSFta7OEw4mO/FXuuPvyOrKO0Mzf6Zwp w==; X-CSE-ConnectionGUID: cm5G9MIIRU+9rS/cnS65oA== X-CSE-MsgGUID: dD8oXzDxSNSm6rk+gnKiwQ== X-IronPort-AV: E=Sophos;i="6.15,193,1739808000"; d="scan'208";a="74116720" Received: from uls-op-cesaip01.wdc.com (HELO uls-op-cesaep01.wdc.com) ([199.255.45.14]) by ob1.hgst.iphmx.com with ESMTP; 07 Apr 2025 16:33:20 +0800 IronPort-SDR: 67f37fd0_S01SL0WcB0M+HPgHIkVAa4BWXhgwsi7w4eICyJ8a4IOqM8Y qy3Q/liwM93Ga4V0B0ZL2YRY9iHmibZTgqg+4vA== Received: from uls-op-cesaip01.wdc.com ([10.248.3.36]) by uls-op-cesaep01.wdc.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 07 Apr 2025 00:33:37 -0700 WDCIronportException: Internal Received: from avri-office.ad.shared (HELO avri-office.sdcorp.global.sandisk.com) ([10.45.31.142]) by uls-op-cesaip01.wdc.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 07 Apr 2025 01:33:19 -0700 From: Avri Altman To: Ulf Hansson , linux-mmc@vger.kernel.org Cc: Avri Altman Subject: [PATCH 02/10] mmc-utils: Reduce scope of nargs for RPMB commands Date: Mon, 7 Apr 2025 11:28:25 +0300 Message-Id: <20250407082833.108616-3-avri.altman@sandisk.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20250407082833.108616-1-avri.altman@sandisk.com> References: <20250407082833.108616-1-avri.altman@sandisk.com> Precedence: bulk X-Mailing-List: linux-mmc@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 This commit fixes the loose definition of the `nargs` member in the `struct Command` for RPMB commands. The `nargs` member specifies the number of arguments required for each command, and this change ensures that the correct number of arguments is enforced for each RPMB command. This reduction in the scope of the `nargs` variable helps to prevent incorrect usage of the RPMB commands by ensuring that the correct number of arguments is provided. Signed-off-by: Avri Altman --- mmc.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mmc.c b/mmc.c index 077e901..b73dd24 100644 --- a/mmc.c +++ b/mmc.c @@ -157,7 +157,7 @@ static struct Command commands[] = { "Send Sanitize command to the .\nThis will delete the unmapped memory region of the device.", NULL }, - { do_rpmb_write_key, -1, + { do_rpmb_write_key, 2, "rpmb write-key", " \n" "Program authentication key which is 32 bytes length and stored\n" "in the specified file. Also you can specify '-' instead of\n" @@ -168,12 +168,12 @@ static struct Command commands[] = { " mmc rpmb write-key /dev/mmcblk0rpmb -", NULL }, - { do_rpmb_read_counter, -1, + { do_rpmb_read_counter, 1, "rpmb read-counter", "\n" "Counter value for the will be read to stdout.", NULL }, - { do_rpmb_read_block, -1, + { do_rpmb_read_block, -4, "rpmb read-block", "
[key file]\n" "Blocks of 256 bytes will be read from to output\n" "file or stdout if '-' is specified. If key is specified - read\n" @@ -186,7 +186,7 @@ static struct Command commands[] = { " $ mmc rpmb read-block /dev/mmcblk0rpmb 0x02 2 /tmp/block", NULL }, - { do_rpmb_write_block, -1, + { do_rpmb_write_block, 4, "rpmb write-block", "
<256 byte data file> \n" "Block of 256 bytes will be written from data file to\n" ". Also you can specify '-' instead of key\n" From patchwork Mon Apr 7 08:28:26 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Avri Altman X-Patchwork-Id: 878948 Received: from esa2.hgst.iphmx.com (esa2.hgst.iphmx.com [68.232.143.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B0CA919F40A for ; Mon, 7 Apr 2025 08:33:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=68.232.143.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744014814; cv=none; b=f+67zAcDo0wtBGiCwSypCxh22tstLdb55zewgqENtGh2gWX3uu2VUjFYjO2PYOvjsxU8NnH6T9Fl+fZcFUbZIskuI7Zjm1w2lJCjqOnRDkBG6jt+/NMbhQiKiTxbZLRm0z2Vxl5TpMIekROLuiR7g3LcB2/Uzw0NmhYqOeE2V74= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744014814; c=relaxed/simple; bh=zmbYH3FSYYP34X0/tALY3dNlbNTmcVhEUoz9fwdIV8o=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=uH+/X53unrlIlMloibz/exNmP/GzKCaGGDLLMLMOVbTncrP04tn+TiRuHZ/6/nmXAHJw8USwtGT4tfnc+OyXQh+skW/w+PUDIvDBv2n4n5Q3qZfvyGI0wu3RudDIt+0n+IIz4XVT9ApbjP0KMfQ6MH2SU75nAAL2Pp4Vt0u/sqQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=sandisk.com; spf=pass smtp.mailfrom=sandisk.com; dkim=pass (2048-bit key) header.d=sandisk.com header.i=@sandisk.com header.b=YQ+84A0V; arc=none smtp.client-ip=68.232.143.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=sandisk.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=sandisk.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=sandisk.com header.i=@sandisk.com header.b="YQ+84A0V" DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=sandisk.com; i=@sandisk.com; q=dns/txt; s=dkim.sandisk.com; t=1744014812; x=1775550812; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=zmbYH3FSYYP34X0/tALY3dNlbNTmcVhEUoz9fwdIV8o=; b=YQ+84A0VXtc8/pxQwolR5mfxv5qppsY2+mYvVbBQAVpnM6L/a8m+cyLD vuNA1mvNQu9Dw8WVnfQfTtyfK9M+JRPeblSi7KCDp3Z4CJOPkenzQm2SC NVfYDS9fD548CJ/G0s/LB2MzZ6ZxAVJ+JMq8LkW3YJZ499eKm+7mQyzBX Vh7oxPAVNFDVQhf9Lq4PEwwWJm5E5Z/xw5+zBdMgV/kwrkzcH3u/m1Epl SKWCdhrV+Gqp97V+RvP8SD5Q4bW9f4ts2tZKPyARb55b+P4Eo0VuHSrkz ZIT/CvkQkiauBeRzeWWOsa0MjLpql7La4EoovMJhSeTCKWkSP0F+65ZBf w==; X-CSE-ConnectionGUID: hZT+1bdBTr6+jeuu3ptOiA== X-CSE-MsgGUID: ZxnVlSrRTTGO5jHzCJyLmA== X-IronPort-AV: E=Sophos;i="6.15,193,1739808000"; d="scan'208";a="78092734" Received: from h199-255-45-14.hgst.com (HELO uls-op-cesaep01.wdc.com) ([199.255.45.14]) by ob1.hgst.iphmx.com with ESMTP; 07 Apr 2025 16:33:25 +0800 IronPort-SDR: 67f37fd6_wsS+Ldj15qucrHzzWRFp2KIjlGwCOfdLMcAWNimIhcZo4/i Lo+ocxtTP4lNndNT+t0azlgkyQb+ha98exS+SmQ== Received: from uls-op-cesaip01.wdc.com ([10.248.3.36]) by uls-op-cesaep01.wdc.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 07 Apr 2025 00:33:43 -0700 WDCIronportException: Internal Received: from avri-office.ad.shared (HELO avri-office.sdcorp.global.sandisk.com) ([10.45.31.142]) by uls-op-cesaip01.wdc.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 07 Apr 2025 01:33:24 -0700 From: Avri Altman To: Ulf Hansson , linux-mmc@vger.kernel.org Cc: Avri Altman Subject: [PATCH 03/10] mmc-utils: Pack rpmb_frame structure to avoid padding bytes Date: Mon, 7 Apr 2025 11:28:26 +0300 Message-Id: <20250407082833.108616-4-avri.altman@sandisk.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20250407082833.108616-1-avri.altman@sandisk.com> References: <20250407082833.108616-1-avri.altman@sandisk.com> Precedence: bulk X-Mailing-List: linux-mmc@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Avri Altman This patch adds the __attribute__((packed)) attribute to the rpmb_frame structure to ensure that it is packed without any padding bytes. This guarantees that each field in the structure corresponds exactly to the specified offsets, which is crucial for correct data interpretation and communication with hardware. Signed-off-by: Avri Altman --- mmc_cmds.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mmc_cmds.c b/mmc_cmds.c index 125816d..d53ed9c 100644 --- a/mmc_cmds.c +++ b/mmc_cmds.c @@ -2110,7 +2110,7 @@ struct rpmb_frame { u_int16_t block_count; u_int16_t result; u_int16_t req_resp; -}; +} __attribute__((packed)); static inline void set_single_cmd(struct mmc_ioc_cmd *ioc, __u32 opcode, int write_flag, unsigned int blocks, From patchwork Mon Apr 7 08:28:27 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Avri Altman X-Patchwork-Id: 879982 Received: from esa2.hgst.iphmx.com (esa2.hgst.iphmx.com [68.232.143.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 85236227E90 for ; Mon, 7 Apr 2025 08:33:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=68.232.143.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744014816; cv=none; b=vE6ynBCwJdnROhyObYxA6dad8AuDTxQ5/0JmsCqswkKm51mslQC22H7dsLJSdHR8izznqZhAbZ1q4YMNwEs4tlB5NtGdYq64C4PYJS36pIMm2zqB+815dYscZmvWDCzIPswEgX0AIycrY0D+lhEPpQ+OqKVez37jflS//It2RI0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744014816; c=relaxed/simple; bh=D7XtQdgkouIkZDvZ5yZU3b1HyN1qkvJVJXoSEnWXIHU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=GLg6Xujq38tcpM5pDR6wHiZL3cparHsXyaLZ76N17fAe8ghCrKkVQLJUOTqh7KiHA5LZQ4y8vpXnlBHmguHNRPz/4SfNSGau/w27Lrt0P3+mJmRNYqZXR8W5f/wgKFE9pAThASMYHEEJa3oBtjAb1FJKk0PJImCI2kVcV4w4JYM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=sandisk.com; spf=pass smtp.mailfrom=sandisk.com; dkim=pass (2048-bit key) header.d=sandisk.com header.i=@sandisk.com header.b=u5q+1i7d; arc=none smtp.client-ip=68.232.143.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=sandisk.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=sandisk.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=sandisk.com header.i=@sandisk.com header.b="u5q+1i7d" DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=sandisk.com; i=@sandisk.com; q=dns/txt; s=dkim.sandisk.com; t=1744014814; x=1775550814; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=D7XtQdgkouIkZDvZ5yZU3b1HyN1qkvJVJXoSEnWXIHU=; b=u5q+1i7d9UJ5675SA0f0vUtDJFWlc+pxKl9LufLgA5a0tsB3EYna8nvw PgT4yA4TaT+Z7CYob1kcGlPQLRlqqfzHB24ZnXbFy0vT1lB4pU5RUPweE QpucD8P5/i2tU6tqmtLf3NuSk4GbzJ387MFAk5uXUOhohCVbNv87dYmi0 A0TDStQJtVTknniM008oiNDYU10APQ2JaTyCxeC0IRI1CiSOFwRXQg/D3 7oQML/1RKJt2DIo+VQ3wqXTDacg3xnmPup2VXkedwh+Qy1weg6mXdttw4 APzVKXu+nsAK8x3BcIUvV6Q92DVfnLQQxSNsd2mUow6ZgEuHZh+kBaBnV Q==; X-CSE-ConnectionGUID: DvvjvgMUTqGZFBidVWoF7w== X-CSE-MsgGUID: fowW1Qb9R/2U0fKf+AFxoQ== X-IronPort-AV: E=Sophos;i="6.15,193,1739808000"; d="scan'208";a="78092848" Received: from h199-255-45-14.hgst.com (HELO uls-op-cesaep01.wdc.com) ([199.255.45.14]) by ob1.hgst.iphmx.com with ESMTP; 07 Apr 2025 16:33:31 +0800 IronPort-SDR: 67f37fdc_4me/iv/NnejORui2lqI5UAEEeW6XAum6VOjqFfxLU5gRGp2 +PjmX8yjqwtl4mNHqTxHc1DLRxqoQDPXPAyf11g== Received: from uls-op-cesaip01.wdc.com ([10.248.3.36]) by uls-op-cesaep01.wdc.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 07 Apr 2025 00:33:49 -0700 WDCIronportException: Internal Received: from avri-office.ad.shared (HELO avri-office.sdcorp.global.sandisk.com) ([10.45.31.142]) by uls-op-cesaip01.wdc.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 07 Apr 2025 01:33:30 -0700 From: Avri Altman To: Ulf Hansson , linux-mmc@vger.kernel.org Cc: Avri Altman Subject: [PATCH 04/10] mmc-utils: Add byte offset comments to rpmb_frame structure Date: Mon, 7 Apr 2025 11:28:27 +0300 Message-Id: <20250407082833.108616-5-avri.altman@sandisk.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20250407082833.108616-1-avri.altman@sandisk.com> References: <20250407082833.108616-1-avri.altman@sandisk.com> Precedence: bulk X-Mailing-List: linux-mmc@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Added comments to the `rpmb_frame` structure to document the byte offsets of each field within the 512-byte packed frame. The specification defines the frame format in terms of byte offsets, and these comments make it easier to align the code with the spec and improve readability. No functional changes were made. Signed-off-by: Avri Altman --- mmc_cmds.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/mmc_cmds.c b/mmc_cmds.c index d53ed9c..7e3ac7e 100644 --- a/mmc_cmds.c +++ b/mmc_cmds.c @@ -2101,15 +2101,15 @@ enum rpmb_op_type { }; struct rpmb_frame { - u_int8_t stuff[196]; - u_int8_t key_mac[32]; - u_int8_t data[256]; - u_int8_t nonce[16]; - u_int32_t write_counter; - u_int16_t addr; - u_int16_t block_count; - u_int16_t result; - u_int16_t req_resp; + u_int8_t stuff[196]; /* Bytes 511 - 316 */ + u_int8_t key_mac[32]; /* Bytes 315 - 284 */ + u_int8_t data[256]; /* Bytes 283 - 28 */ + u_int8_t nonce[16]; /* Bytes 27 - 12 */ + u_int32_t write_counter; /* Bytes 11 - 8 */ + u_int16_t addr; /* Bytes 7 - 6 */ + u_int16_t block_count; /* Bytes 5 - 4 */ + u_int16_t result; /* Bytes 3 - 2 */ + u_int16_t req_resp; /* Bytes 1 - 0 */ } __attribute__((packed)); static inline void set_single_cmd(struct mmc_ioc_cmd *ioc, __u32 opcode, From patchwork Mon Apr 7 08:28:28 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Avri Altman X-Patchwork-Id: 878947 Received: from esa4.hgst.iphmx.com (esa4.hgst.iphmx.com [216.71.154.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F1A5F23A6 for ; Mon, 7 Apr 2025 08:33:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=216.71.154.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744014821; cv=none; b=NVceIaBeY3gBgpGYhHRMyYvSdIAVI/eIEwBd9k6Ek1CuaQevEffQNAjyJcgFsSnVI/svyQKBvQorfQomtTm55iHEKh3KnfrB/c3dGrB/dJBMoOSnAQ+suHRZZSJaQYz1jjbydgGZ9ERHN8bYFACb71AXG4p3t3C62Nc3OImEYv4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744014821; c=relaxed/simple; bh=+UKp4ILNAIzKNE7F6m6NoKjHwghYlFRYzy4o3opKA9Y=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=ssTWtUGWqJh7riWmCOr3TmiYoKuAy/LqUoahQ2EZAo2ye/U56PgIHODE8tIs/AeFoCqQBwvIYjKSLoytweFwSYKTmW0gZWfbCy5mYqV60WlvfZMJCyCMEkPaZFgKTHmlOUZdoX0fRQvQy1xxeJE3cz5wEuoHth4SVmG9Yiq111I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=sandisk.com; spf=pass smtp.mailfrom=sandisk.com; dkim=pass (2048-bit key) header.d=sandisk.com header.i=@sandisk.com header.b=mLkUCqa5; arc=none smtp.client-ip=216.71.154.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=sandisk.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=sandisk.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=sandisk.com header.i=@sandisk.com header.b="mLkUCqa5" DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=sandisk.com; i=@sandisk.com; q=dns/txt; s=dkim.sandisk.com; t=1744014820; x=1775550820; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=+UKp4ILNAIzKNE7F6m6NoKjHwghYlFRYzy4o3opKA9Y=; b=mLkUCqa56cQm8QnQvSpjpE/e1uyL3w3BmSwYa5LcjVial/Jvis3j+esu kPHFKDgaI00oYuFE67ScMZjN06U+H3ZUnQLjWp0xevdHQfolUd2fevzJN g+SwrKaVD4HqHqfMopnGdy5nmlcd6FlhlGgHbIkGFoPTWFppJMQHWy50j Tmmz+QYDMuvpA5bzizWgWD0xEN6WZnk+rn27ZzUMDI5NNFwj8tU29q9ol FliK8cJ8kML5mOSs36jGaAxEYvztZVlCTo7kjsVvvkBBR8B3jJFY/KbOe 7QoiX5x4Dadh7JCCZV9VDj4Z3Ka/DsL4sRhUcTS6AuCpilGsfOoyhKRE5 Q==; X-CSE-ConnectionGUID: LHSmDUcvRvqbCXQYcFe8tg== X-CSE-MsgGUID: fEBdcpK0Rp64zKkY6jI4cQ== X-IronPort-AV: E=Sophos;i="6.15,193,1739808000"; d="scan'208";a="74116738" Received: from uls-op-cesaip01.wdc.com (HELO uls-op-cesaep01.wdc.com) ([199.255.45.14]) by ob1.hgst.iphmx.com with ESMTP; 07 Apr 2025 16:33:38 +0800 IronPort-SDR: 67f37fe2_hHKbAga+QqzcUsdZcKcs19w1dgLDq4Dov9L7IaCX2QJxKLP IjXO8d/pqUzPHniCo1DGFKTqj7OLcwaD8uZcjaA== Received: from uls-op-cesaip01.wdc.com ([10.248.3.36]) by uls-op-cesaep01.wdc.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 07 Apr 2025 00:33:55 -0700 WDCIronportException: Internal Received: from avri-office.ad.shared (HELO avri-office.sdcorp.global.sandisk.com) ([10.45.31.142]) by uls-op-cesaip01.wdc.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 07 Apr 2025 01:33:37 -0700 From: Avri Altman To: Ulf Hansson , linux-mmc@vger.kernel.org Cc: Avri Altman Subject: [PATCH 05/10] mmc-utils: Add SECURE_WP_INFO field in ext_csd register Date: Mon, 7 Apr 2025 11:28:28 +0300 Message-Id: <20250407082833.108616-6-avri.altman@sandisk.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20250407082833.108616-1-avri.altman@sandisk.com> References: <20250407082833.108616-1-avri.altman@sandisk.com> Precedence: bulk X-Mailing-List: linux-mmc@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Avri Altman This patch adds support for reading and displaying the SECURE_WP_INFO field from the ext_csd register. The SECURE_WP_INFO field provides information about the secure write protection features supported by the eMMC device. Signed-off-by: Avri Altman --- mmc.h | 1 + mmc_cmds.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/mmc.h b/mmc.h index 14dac38..9fc22ec 100644 --- a/mmc.h +++ b/mmc.h @@ -106,6 +106,7 @@ #define EXT_CSD_SEC_COUNT_2 214 #define EXT_CSD_SEC_COUNT_1 213 #define EXT_CSD_SEC_COUNT_0 212 +#define EXT_CSD_SECURE_WP_INFO 211 #define EXT_CSD_PART_SWITCH_TIME 199 #define EXT_CSD_REV 192 #define EXT_CSD_BOOT_CFG 179 diff --git a/mmc_cmds.c b/mmc_cmds.c index 7e3ac7e..d019dc8 100644 --- a/mmc_cmds.c +++ b/mmc_cmds.c @@ -1952,6 +1952,10 @@ int do_read_extcsd(int nargs, char **argv) if (ext_csd_rev >= 7) { printf("eMMC Firmware Version: %.8s\n", (char*)&ext_csd[EXT_CSD_FIRMWARE_VERSION]); + + printf("eMMC SECURE_WP_SUPPORT: %u\n", ext_csd[EXT_CSD_SECURE_WP_INFO] & 1); + printf("eMMC SECURE_WP_EN_STATUS: %u\n", (ext_csd[EXT_CSD_SECURE_WP_INFO] & 2) >> 1); + printf("eMMC Life Time Estimation A [EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_A]: 0x%02x\n", ext_csd[EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_A]); printf("eMMC Life Time Estimation B [EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_B]: 0x%02x\n", From patchwork Mon Apr 7 08:28:29 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Avri Altman X-Patchwork-Id: 879981 Received: from esa5.hgst.iphmx.com (esa5.hgst.iphmx.com [216.71.153.144]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3D5161448D5 for ; Mon, 7 Apr 2025 08:33:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=216.71.153.144 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744014834; cv=none; b=O7nNbzbjSaeOItcp3vM+vk/cOZuHSjbL/wmpiiOlF+MY0twrzReigkzm2M2lfoCkqw+IbCm0AHPlrpXX7N0AEbn1msrbFMNBkcY3KVbhFs89m40r5dp4JtV5BS7PAlzexjWTAq2xX8ISrYTnevUwutkV9DAC9wdyIFpRaG5S+AI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744014834; c=relaxed/simple; bh=WsQfU94sdRkJSoCKmdOTQra69uQgF3XATvf/bYmWmwo=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=dsKeAWhNx1lFw+8x9qE8kc5LP7ohcUavT3q3h18e+oHAzZc9YSpCaf0slBL0/DIjXsLrSvdkd42e+SJBHGSqHJD4n/4sCCosj1GBiXuLYp0EtEMo5fQ8FZ59IVCf/7ncwELBA2t/9xXr/dhvgCUgKbh1jJ9UD729hrar5f87mN4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=sandisk.com; spf=pass smtp.mailfrom=sandisk.com; dkim=pass (2048-bit key) header.d=sandisk.com header.i=@sandisk.com header.b=DZLcdUNz; arc=none smtp.client-ip=216.71.153.144 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=sandisk.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=sandisk.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=sandisk.com header.i=@sandisk.com header.b="DZLcdUNz" DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=sandisk.com; i=@sandisk.com; q=dns/txt; s=dkim.sandisk.com; t=1744014832; x=1775550832; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=WsQfU94sdRkJSoCKmdOTQra69uQgF3XATvf/bYmWmwo=; b=DZLcdUNzSx1m1OlqPRV7pOiwtbchIcTvONO6AWtBHGpunPWrYGbqfP9f Qeqjm8zO327guR9LVeB+0huq56eDBHeQlLgPzzvCDeGrrti61YeggmtSR bXnUfPajDwRI9GLWJeG94NUstKI6XzcQgS0OGDrR1zD638vvKwsSEAR78 uM7Ep6UaxKT7v+6XHWuB1XSsuf77dU+vZ553qebkrqJcc4DnRwoNFYgtr N2bs4XEdJ7xFhSOelrVDqQ1DJDl35neexQ1YK9BgOom0wInhOE9hVR+ps zggZa6emLToTMZxLI9gW04A6MYRqiv1uYicix1Nl35mz+zwHPG4U7odPN A==; X-CSE-ConnectionGUID: 70pe0/CDRSeb/5K6Xz4w4A== X-CSE-MsgGUID: xAxDaBHrSa+Mn9QWT8QYYQ== X-IronPort-AV: E=Sophos;i="6.15,193,1739808000"; d="scan'208";a="72607260" Received: from h199-255-45-14.hgst.com (HELO uls-op-cesaep01.wdc.com) ([199.255.45.14]) by ob1.hgst.iphmx.com with ESMTP; 07 Apr 2025 16:33:44 +0800 IronPort-SDR: 67f37fe9_XeZnYbTRvqSf9GAXC5WtDum7PNQqU7K006oQMA4z71gc5gU RlOdHqqyR+htUwP41zDS5azcJci1Jk3YoxgZLHA== Received: from uls-op-cesaip01.wdc.com ([10.248.3.36]) by uls-op-cesaep01.wdc.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 07 Apr 2025 00:34:02 -0700 WDCIronportException: Internal Received: from avri-office.ad.shared (HELO avri-office.sdcorp.global.sandisk.com) ([10.45.31.142]) by uls-op-cesaip01.wdc.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 07 Apr 2025 01:33:43 -0700 From: Avri Altman To: Ulf Hansson , linux-mmc@vger.kernel.org Cc: Avri Altman Subject: [PATCH 06/10] mmc-utils: Refactor RPMB key handling into a separate function Date: Mon, 7 Apr 2025 11:28:29 +0300 Message-Id: <20250407082833.108616-7-avri.altman@sandisk.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20250407082833.108616-1-avri.altman@sandisk.com> References: <20250407082833.108616-1-avri.altman@sandisk.com> Precedence: bulk X-Mailing-List: linux-mmc@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Avri Altman This patch refactors the key handling logic into a new function `rpmb_get_key`. The new function centralizes the logic for reading the key from a file or standard input, and optionally performing HMAC SHA256 encryption. Signed-off-by: Avri Altman --- mmc_cmds.c | 147 ++++++++++++++++++++++------------------------------- 1 file changed, 62 insertions(+), 85 deletions(-) diff --git a/mmc_cmds.c b/mmc_cmds.c index d019dc8..80ac6ab 100644 --- a/mmc_cmds.c +++ b/mmc_cmds.c @@ -2128,6 +2128,52 @@ static inline void set_single_cmd(struct mmc_ioc_cmd *ioc, __u32 opcode, ioc->flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_ADTC; } +static int rpmb_get_key(const char key_file_name[], struct rpmb_frame *frame_in, + unsigned char key_out[32], bool encrypt) +{ + int ret, key_fd; + unsigned char key[32] = {}; + + if (strcmp(key_file_name, "-") == 0) { + key_fd = STDIN_FILENO; + } else { + key_fd = open(key_file_name, O_RDONLY); + if (key_fd < 0) { + perror("can't open key file"); + return EXIT_FAILURE; + } + } + + ret = DO_IO(read, key_fd, key, sizeof(key)); + if (ret < 0) { + perror("read the key"); + goto out; + } else if (ret != sizeof(key)) { + printf("Auth key must be %lu bytes length, but we read only %d, exit\n", + (unsigned long)sizeof(key), ret); + ret = -EINVAL; + goto out; + } + + if (key_out) + memcpy(key_out, key, 32); + + if (encrypt) { + /* Calculate HMAC SHA256 */ + hmac_sha256(key, sizeof(key), frame_in->data, + sizeof(struct rpmb_frame) - offsetof(struct rpmb_frame, data), + frame_in->key_mac, sizeof(frame_in->key_mac)); + } + + ret = 0; + +out: + if (key_fd != STDIN_FILENO) + close(key_fd); + + return ret; +} + /* Performs RPMB operation. * * @fd: RPMB device on which we should perform ioctl command @@ -2137,10 +2183,8 @@ static inline void set_single_cmd(struct mmc_ioc_cmd *ioc, __u32 opcode, * @out_cnt: count of outer frames. Used only for multiple blocks reading, * in the other cases -EINVAL will be returned. */ -static int do_rpmb_op(int fd, - const struct rpmb_frame *frame_in, - struct rpmb_frame *frame_out, - unsigned int out_cnt) +static int do_rpmb_op(int fd, const struct rpmb_frame *frame_in, + struct rpmb_frame *frame_out, unsigned int out_cnt) { int err; u_int16_t rpmb_type; @@ -2225,7 +2269,7 @@ out: int do_rpmb_write_key(int nargs, char **argv) { - int ret, dev_fd, key_fd; + int ret, dev_fd; struct rpmb_frame frame_in = { .req_resp = htobe16(MMC_RPMB_WRITE_KEY) }, frame_out = {}; @@ -2241,28 +2285,9 @@ int do_rpmb_write_key(int nargs, char **argv) exit(1); } - if (0 == strcmp(argv[2], "-")) - key_fd = STDIN_FILENO; - else { - key_fd = open(argv[2], O_RDONLY); - if (key_fd < 0) { - perror("can't open key file"); - exit(1); - } - } - - /* Read the auth key */ - ret = DO_IO(read, key_fd, frame_in.key_mac, sizeof(frame_in.key_mac)); - if (ret < 0) { - perror("read the key"); - exit(1); - } else if (ret != sizeof(frame_in.key_mac)) { - printf("Auth key must be %lu bytes length, but we read only %d, exit\n", - (unsigned long)sizeof(frame_in.key_mac), - ret); - exit(1); - } - + ret = rpmb_get_key(argv[2], &frame_in, NULL, false); + if (ret) + return ret; /* Execute RPMB op */ ret = do_rpmb_op(dev_fd, &frame_in, &frame_out, 1); if (ret != 0) { @@ -2278,8 +2303,6 @@ int do_rpmb_write_key(int nargs, char **argv) } close(dev_fd); - if (key_fd != STDIN_FILENO) - close(key_fd); return ret; } @@ -2342,7 +2365,7 @@ int do_rpmb_read_counter(int nargs, char **argv) int do_rpmb_read_block(int nargs, char **argv) { - int i, ret, dev_fd, data_fd, key_fd = -1; + int i, ret, dev_fd, data_fd; uint16_t addr; /* * for reading RPMB, number of blocks is set by CMD23 only, the packet @@ -2407,26 +2430,9 @@ int do_rpmb_read_block(int nargs, char **argv) /* Key is specified */ if (nargs == 6) { - if (0 == strcmp(argv[5], "-")) - key_fd = STDIN_FILENO; - else { - key_fd = open(argv[5], O_RDONLY); - if (key_fd < 0) { - perror("can't open input key file"); - exit(1); - } - } - - ret = DO_IO(read, key_fd, key, sizeof(key)); - if (ret < 0) { - perror("read the key data"); - exit(1); - } else if (ret != sizeof(key)) { - printf("Data must be %lu bytes length, but we read only %d, exit\n", - (unsigned long)sizeof(key), - ret); - exit(1); - } + ret = rpmb_get_key(argv[5], &frame_in, key, false); + if (ret) + return ret; } /* Execute RPMB op */ @@ -2488,16 +2494,13 @@ int do_rpmb_read_block(int nargs, char **argv) close(dev_fd); if (data_fd != STDOUT_FILENO) close(data_fd); - if (key_fd != -1 && key_fd != STDIN_FILENO) - close(key_fd); return ret; } int do_rpmb_write_block(int nargs, char **argv) { - int ret, dev_fd, key_fd, data_fd; - unsigned char key[32]; + int ret, dev_fd, data_fd; uint16_t addr; unsigned int cnt; struct rpmb_frame frame_in = { @@ -2555,33 +2558,9 @@ int do_rpmb_write_block(int nargs, char **argv) exit(1); } - /* Read the auth key */ - if (0 == strcmp(argv[4], "-")) - key_fd = STDIN_FILENO; - else { - key_fd = open(argv[4], O_RDONLY); - if (key_fd < 0) { - perror("can't open key file"); - exit(1); - } - } - - ret = DO_IO(read, key_fd, key, sizeof(key)); - if (ret < 0) { - perror("read the key"); - exit(1); - } else if (ret != sizeof(key)) { - printf("Auth key must be %lu bytes length, but we read only %d, exit\n", - (unsigned long)sizeof(key), - ret); - exit(1); - } - - /* Calculate HMAC SHA256 */ - hmac_sha256( - key, sizeof(key), - frame_in.data, sizeof(frame_in) - offsetof(struct rpmb_frame, data), - frame_in.key_mac, sizeof(frame_in.key_mac)); + ret = rpmb_get_key(argv[4], &frame_in, NULL, true); + if (ret) + return ret; /* Execute RPMB op */ ret = do_rpmb_op(dev_fd, &frame_in, &frame_out, 1); @@ -2600,8 +2579,6 @@ int do_rpmb_write_block(int nargs, char **argv) close(dev_fd); if (data_fd != STDIN_FILENO) close(data_fd); - if (key_fd != STDIN_FILENO) - close(key_fd); return ret; } @@ -2686,8 +2663,8 @@ static int erase(int dev_fd, __u32 argin, __u32 start, __u32 end) fprintf(stderr, "High Capacity Erase Unit Size=%d bytes\n" \ "High Capacity Erase Timeout=%d ms\n" \ "High Capacity Write Protect Group Size=%d bytes\n", - ext_csd[224]*0x80000, - ext_csd[223]*300, + ext_csd[224]*0x80000, + ext_csd[223]*300, ext_csd[221]*ext_csd[224]*0x80000); } From patchwork Mon Apr 7 08:28:30 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Avri Altman X-Patchwork-Id: 878946 Received: from esa5.hgst.iphmx.com (esa5.hgst.iphmx.com [216.71.153.144]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1B860225A40 for ; Mon, 7 Apr 2025 08:33:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=216.71.153.144 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744014837; cv=none; b=MQ/fnl4rJlF0mAqe8x5x1feXZJzFJ0ghGejoYaiUic3FnlQ97jlyLpr/3d22cUKDxXgvRPCfA86Ph5w1YKCneNL4pxtoTdkB6Ym7zVYtZCNaDpy1L8YvNdwJnpB7sj1++Zb350HoBLNH90FFySpacp8Z9e5+4FR3YEpGz1Xzbfg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744014837; c=relaxed/simple; bh=95zApcFzFaRBnwRLdAR5oF/u82+rEBIE9KjTUiDjfu0=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=rQhNrRALtMPTn43Z4UW+GJGk0QeiPs44qtZRD+etMWbPpKWMjFVH0o8IQj9yt0aEM+vQ9T44b7jqt+5FQtgg7x5biGIR0Ma/sXbDghtz+0mgJRaLYEWz/x4QyE7kJuWwfOfFiYGEOuSiAIgjHepJ6meXeEBOi9ai7ASgpRjdzBE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=sandisk.com; spf=pass smtp.mailfrom=sandisk.com; dkim=pass (2048-bit key) header.d=sandisk.com header.i=@sandisk.com header.b=gV5+ZFpU; arc=none smtp.client-ip=216.71.153.144 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=sandisk.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=sandisk.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=sandisk.com header.i=@sandisk.com header.b="gV5+ZFpU" DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=sandisk.com; i=@sandisk.com; q=dns/txt; s=dkim.sandisk.com; t=1744014834; x=1775550834; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=95zApcFzFaRBnwRLdAR5oF/u82+rEBIE9KjTUiDjfu0=; b=gV5+ZFpUJ/fvNwdqhqIjpVjuHTr+pOs/U0QRdSJs1Ax0o5GFVMhP8PmA ECtEwvZONp0AJ8uM3QDlyPLsZG3a9/56N7pmH4wDAKLGaLX6HAS4dgB6C vdD7fyds2cVraGF/5KlhuUqasgPjtPI1ZSpEGGeZltRTQMRIHHbfZXyFc zVDqPM9JyZeUkvwq1LGYydU6R7PmpQtsK+MW7ZCrTXH0R7gdADRF69is7 +N0yoJiq43X7Eu3uTVnm5J91o4xqvuL+C0PNRjlo/MXvh4c0i24qkppKQ rKrDoTjlJSgBTnhIvaXvGYxr/NFyg0ioFhcDGbhYbOerxmXJLBPV8gpyq g==; X-CSE-ConnectionGUID: rZd60U65SP+Leo3Kw4Hsnw== X-CSE-MsgGUID: NjBB3oZsS4i+B1517nPS6Q== X-IronPort-AV: E=Sophos;i="6.15,193,1739808000"; d="scan'208";a="72607406" Received: from h199-255-45-14.hgst.com (HELO uls-op-cesaep01.wdc.com) ([199.255.45.14]) by ob1.hgst.iphmx.com with ESMTP; 07 Apr 2025 16:33:51 +0800 IronPort-SDR: 67f37fef_rR9bk2k8eMoF60AARgUakkurtHBVeMP6rQ3x1MY8ZbH+Ip6 2Hensi4HRgeih2VK/xPAZ/7bFIrNx9hEbFrl1aw== Received: from uls-op-cesaip01.wdc.com ([10.248.3.36]) by uls-op-cesaep01.wdc.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 07 Apr 2025 00:34:08 -0700 WDCIronportException: Internal Received: from avri-office.ad.shared (HELO avri-office.sdcorp.global.sandisk.com) ([10.45.31.142]) by uls-op-cesaip01.wdc.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 07 Apr 2025 01:33:50 -0700 From: Avri Altman To: Ulf Hansson , linux-mmc@vger.kernel.org Cc: Avri Altman Subject: [PATCH 07/10] mmc-utils: Add secure write-protect mode enable/disable Date: Mon, 7 Apr 2025 11:28:30 +0300 Message-Id: <20250407082833.108616-8-avri.altman@sandisk.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20250407082833.108616-1-avri.altman@sandisk.com> References: <20250407082833.108616-1-avri.altman@sandisk.com> Precedence: bulk X-Mailing-List: linux-mmc@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Avri Altman Allow toggling the SECURE_WP_EN field in the SECURE_WP_MODE_ENABLE part of Device Configuration area. Access to the Device Configuration area is regulated via Authenticated Device Configuration write request. Signed-off-by: Avri Altman --- mmc.c | 23 ++++++++++++ mmc_cmds.c | 104 +++++++++++++++++++++++++++++++++++++++++++++++++++++ mmc_cmds.h | 2 ++ 3 files changed, 129 insertions(+) diff --git a/mmc.c b/mmc.c index b73dd24..0cffa5b 100644 --- a/mmc.c +++ b/mmc.c @@ -197,6 +197,29 @@ static struct Command commands[] = { " mmc rpmb write-block /dev/mmcblk0rpmb 0x02 - -", NULL }, + { do_rpmb_sec_wp_enable, 3, + "rpmb secure-wp-mode-on", " \n" + "Enable Secure Write Protection mode.\n" + "The access to the write protection related EXT_CSD and\n" + "CSD fields depends on the value of SECURE_WP_MASK bit in\n" + "SECURE_WP_MODE_CONFIG field\n" + "You can specify '-' instead of key\n" + "Example:\n" + " echo -n AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHH | \\\n" + " mmc rpmb secure-wp-mode-on /dev/block/mmcblk0 /dev/mmcblk0rpmb -", + NULL + }, + { do_rpmb_sec_wp_disable, 3, + "rpmb secure-wp-mode-off", " \n" + "Legacy Write Protection mode.\n" + "TMP_WRITE_PROTECT[12] and PERM_WRITE_PROTECT[13] is updated by CMD27.\n" + "USER_WP[171], BOOT_WP[173] and BOOT_WP_STATUS[174] are updated by CMD6\n" + "You can specify '-' instead of key\n" + "Example:\n" + " echo -n AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHH | \\\n" + " mmc rpmb secure-wp-mode-off /dev/block/mmcblk0 /dev/mmcblk0rpmb -", + NULL + }, { do_cache_en, -1, "cache enable", "\n" "Enable the eMMC cache feature on .\n" diff --git a/mmc_cmds.c b/mmc_cmds.c index 80ac6ab..07bd9ad 100644 --- a/mmc_cmds.c +++ b/mmc_cmds.c @@ -2099,6 +2099,7 @@ enum rpmb_op_type { MMC_RPMB_READ_CNT = 0x02, MMC_RPMB_WRITE = 0x03, MMC_RPMB_READ = 0x04, + MMC_RPMB_CONF_WRITE = 0x06, /* For internal usage only, do not use it directly */ MMC_RPMB_READ_RESP = 0x05 @@ -2210,6 +2211,7 @@ static int do_rpmb_op(int fd, const struct rpmb_frame *frame_in, switch(rpmb_type) { case MMC_RPMB_WRITE: case MMC_RPMB_WRITE_KEY: + case MMC_RPMB_CONF_WRITE: if (out_cnt != 1) { err = -EINVAL; goto out; @@ -2498,6 +2500,108 @@ int do_rpmb_read_block(int nargs, char **argv) return ret; } +static bool secure_wp_supported(char *device) +{ + __u8 ext_csd[512]; + int fd; + + fd = open(device, O_RDWR); + if (fd < 0) { + perror("open"); + return false; + } + + if (read_extcsd(fd, ext_csd)) { + fprintf(stderr, "Could not read EXT_CSD from %s\n", device); + close(fd); + return false; + } + + close(fd); + + if (ext_csd[EXT_CSD_REV] < EXT_CSD_REV_V5_0) { + fprintf(stderr, "SECURE_WP_SUPPORT option is only available on devices >= MMC 5.0 %s\n", device); + return false; + } + + return !!(ext_csd[EXT_CSD_SECURE_WP_INFO] & 1); +} + +static int rpmb_auth_write(int nargs, char **argv, uint16_t addr, + uint8_t config_data, char *usage) +{ + int ret, dev_fd; + unsigned int cnt; + struct rpmb_frame frame_in = { + .req_resp = htobe16(MMC_RPMB_CONF_WRITE), + .block_count = htobe16(1), + .addr = htobe16(addr), + }, frame_out = {}; + + if (nargs != 4) { + fprintf(stderr, "%s", usage); + return EXIT_FAILURE; + } + + if (!secure_wp_supported(argv[1])) { + fprintf(stderr, "secure wp not supported %s", argv[1]); + return EXIT_FAILURE; + } + + dev_fd = open(argv[2], O_RDWR); + if (dev_fd < 0) { + perror("device open"); + return EXIT_FAILURE; + } + + ret = rpmb_read_counter(dev_fd, &cnt); + /* Check RPMB response */ + if (ret != 0) { + printf("RPMB read counter operation failed, retcode 0x%04x\n", ret); + goto out; + } + frame_in.write_counter = htobe32(cnt); + + frame_in.data[255] = config_data; /* Byte 28 */ + + ret = rpmb_get_key(argv[3], &frame_in, NULL, true); + if (ret) { + printf("failed to read and apply key %d\n", ret); + goto out; + } + + /* Execute RPMB op */ + ret = do_rpmb_op(dev_fd, &frame_in, &frame_out, 1); + if (ret != 0) { + perror("RPMB ioctl failed"); + goto out; + } + + /* Check RPMB response */ + if (frame_out.result != 0) { + printf("RPMB operation failed, retcode 0x%04x\n", + be16toh(frame_out.result)); + } + +out: + close(dev_fd); + return ret; +} + +int do_rpmb_sec_wp_enable(int nargs, char **argv) +{ + char *usage = "Usage: mmc rpmb secure-wp-mode-on \n"; + + return rpmb_auth_write(nargs, argv, 1, 1, usage); +} + +int do_rpmb_sec_wp_disable(int nargs, char **argv) +{ + char *usage = "Usage: mmc rpmb secure-wp-mode-off \n"; + + return rpmb_auth_write(nargs, argv, 1, 0, usage); +} + int do_rpmb_write_block(int nargs, char **argv) { int ret, dev_fd, data_fd; diff --git a/mmc_cmds.h b/mmc_cmds.h index 407cbe6..873d9b2 100644 --- a/mmc_cmds.h +++ b/mmc_cmds.h @@ -39,6 +39,8 @@ int do_rpmb_write_key(int nargs, char **argv); int do_rpmb_read_counter(int nargs, char **argv); int do_rpmb_read_block(int nargs, char **argv); int do_rpmb_write_block(int nargs, char **argv); +int do_rpmb_sec_wp_enable(int nargs, char **argv); +int do_rpmb_sec_wp_disable(int nargs, char **argv); int do_cache_en(int nargs, char **argv); int do_cache_dis(int nargs, char **argv); int do_ffu(int nargs, char **argv); From patchwork Mon Apr 7 08:28:31 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Avri Altman X-Patchwork-Id: 879980 Received: from esa1.hgst.iphmx.com (esa1.hgst.iphmx.com [68.232.141.245]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BC6F9225A20 for ; Mon, 7 Apr 2025 08:34:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=68.232.141.245 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744014842; cv=none; b=Uxnb68xwmX5SDWEi24zngqLUyccEsTqhPEPmEdTVH+y+z9R/GHwz3VTQqVs1baKIhfMV/He3CoLxBPI4XlPxBua8uQ6eV5uS2Yrfvu0sfMTd6vhHx2QmPG/DeUthizGajD4r9YTtRonBs9zwoJyU2QDZ+70luEnWDTMFArGEwgU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744014842; c=relaxed/simple; bh=cqn4jvG3cVHgoIMPxb7ME//tNbSCYE4xTotDfogc878=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=qbTlYW/TVppVqhrobFGWsVmfl5qY4GwEW3MIBNM7i63O1pbNn67uvVRwki7oaIe3FuGG97S87Y1Y3FQP09ZrO8l/ucbOUy6RZ23OfUl7HbL3zdZpq9RDNELBrjo1BgtGomSRIfvxzOIReuxHqh/Pvkt6NC6N3K7uUW9KqmtBNm8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=sandisk.com; spf=pass smtp.mailfrom=sandisk.com; dkim=pass (2048-bit key) header.d=sandisk.com header.i=@sandisk.com header.b=GnW3JmCL; arc=none smtp.client-ip=68.232.141.245 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=sandisk.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=sandisk.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=sandisk.com header.i=@sandisk.com header.b="GnW3JmCL" DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=sandisk.com; i=@sandisk.com; q=dns/txt; s=dkim.sandisk.com; t=1744014840; x=1775550840; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=cqn4jvG3cVHgoIMPxb7ME//tNbSCYE4xTotDfogc878=; b=GnW3JmCLA8tcv8w3Sz/Yp536AX4LMFJuLP3o1ZXHQGPJXEpCkUW/ajS4 tIs1W7jxP6k9xInElLxRKTDlc66EkDeGKoTD4n4oTROOGJQEEXayPMkJK l5ZfqXvoR4gnGjwZfCkvGZ7folTCOurThH8hqucxFKZ9Ym26/z4myHjne J7vQpnp3ftt/k78jwhmXu7QQ58vYgA/NF9WrDHo3zcLqmb88gDABX2yVS CICa0mEfKERW2tFTPprNjGOcSYH0jdgGdNkHTRXg4LemPT7n4gaXAhv60 v660VLGQBhs3igIBNLdGPxTG5DqgexsWWus6Pp7sI5U1o2yCKLdg6toIF w==; X-CSE-ConnectionGUID: IkRhB+9qRruL2CTZmTchfg== X-CSE-MsgGUID: vY4ZB8QJR6W7VGz4MLnppQ== X-IronPort-AV: E=Sophos;i="6.15,193,1739808000"; d="scan'208";a="72021587" Received: from h199-255-45-14.hgst.com (HELO uls-op-cesaep01.wdc.com) ([199.255.45.14]) by ob1.hgst.iphmx.com with ESMTP; 07 Apr 2025 16:33:59 +0800 IronPort-SDR: 67f37ff8_6yHKQdvOH7D+0hCSL5qEhQ4Gs8v5ugJbtf4zgAnSilL6hSu SnE78a0lT0wB1gJhU72vV8CmUW0CxxaqwlezG+g== Received: from uls-op-cesaip01.wdc.com ([10.248.3.36]) by uls-op-cesaep01.wdc.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 07 Apr 2025 00:34:17 -0700 WDCIronportException: Internal Received: from avri-office.ad.shared (HELO avri-office.sdcorp.global.sandisk.com) ([10.45.31.142]) by uls-op-cesaip01.wdc.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 07 Apr 2025 01:33:58 -0700 From: Avri Altman To: Ulf Hansson , linux-mmc@vger.kernel.org Cc: Avri Altman Subject: [PATCH 08/10] mmc-utils: Enable/Disable write protect Date: Mon, 7 Apr 2025 11:28:31 +0300 Message-Id: <20250407082833.108616-9-avri.altman@sandisk.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20250407082833.108616-1-avri.altman@sandisk.com> References: <20250407082833.108616-1-avri.altman@sandisk.com> Precedence: bulk X-Mailing-List: linux-mmc@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Avri Altman In secure write protected mode, the updatability of USER_WP[171], BOOT_WP[173], TMP_WRITE_PROTECT[12] and PERM_WRITE_PROTECT[13] are controlled by SECURE_WP_MASK bit in the SECURE _WP_MODE_CONFIG of the Authenticated Device Configuration Area. Setting it, enables updating WP related EXT_CSD and CSD fields, and clearing it vice versa. Access to the Authenticated Device Configuration Area is regulated via Authenticated Device Configuration Write Request. Signed-off-by: Avri Altman --- mmc.c | 20 ++++++++++++++++++++ mmc_cmds.c | 14 ++++++++++++++ mmc_cmds.h | 2 ++ 3 files changed, 36 insertions(+) diff --git a/mmc.c b/mmc.c index 0cffa5b..578b00c 100644 --- a/mmc.c +++ b/mmc.c @@ -220,6 +220,26 @@ static struct Command commands[] = { " mmc rpmb secure-wp-mode-off /dev/block/mmcblk0 /dev/mmcblk0rpmb -", NULL }, + { do_rpmb_sec_wp_mode_set, 3, + "rpmb secure-wp-disable", " \n" + "Enabling updating WP related EXT_CSD and CSD fields.\n" + "Applicable only if secure wp mode is enabled.\n" + "You can specify '-' instead of key\n" + "Example:\n" + " echo -n AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHH | \\\n" + " mmc rpmb secure-wp-disable /dev/block/mmcblk0 /dev/mmcblk0rpmb -", + NULL + }, + { do_rpmb_sec_wp_mode_clear, 3, + "rpmb secure-wp-enable", " \n" + "Disabling updating WP related EXT_CSD and CSD fields.\n" + "Applicable only if secure wp mode is enabled.\n" + "You can specify '-' instead of key\n" + "Example:\n" + " echo -n AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHH | \\\n" + " mmc rpmb secure-wp-enable /dev/block/mmcblk0 /dev/mmcblk0rpmb -", + NULL + }, { do_cache_en, -1, "cache enable", "\n" "Enable the eMMC cache feature on .\n" diff --git a/mmc_cmds.c b/mmc_cmds.c index 07bd9ad..2ef4252 100644 --- a/mmc_cmds.c +++ b/mmc_cmds.c @@ -2602,6 +2602,20 @@ int do_rpmb_sec_wp_disable(int nargs, char **argv) return rpmb_auth_write(nargs, argv, 1, 0, usage); } +int do_rpmb_sec_wp_mode_set(int nargs, char **argv) +{ + char *usage = "Usage: mmc rpmb secure-wp-disable \n"; + + return rpmb_auth_write(nargs, argv, 2, 1, usage); +} + +int do_rpmb_sec_wp_mode_clear(int nargs, char **argv) +{ + char *usage = "Usage: mmc rpmb secure-wp-enable \n"; + + return rpmb_auth_write(nargs, argv, 2, 0, usage); +} + int do_rpmb_write_block(int nargs, char **argv) { int ret, dev_fd, data_fd; diff --git a/mmc_cmds.h b/mmc_cmds.h index 873d9b2..61fe337 100644 --- a/mmc_cmds.h +++ b/mmc_cmds.h @@ -41,6 +41,8 @@ int do_rpmb_read_block(int nargs, char **argv); int do_rpmb_write_block(int nargs, char **argv); int do_rpmb_sec_wp_enable(int nargs, char **argv); int do_rpmb_sec_wp_disable(int nargs, char **argv); +int do_rpmb_sec_wp_mode_set(int nargs, char **argv); +int do_rpmb_sec_wp_mode_clear(int nargs, char **argv); int do_cache_en(int nargs, char **argv); int do_cache_dis(int nargs, char **argv); int do_ffu(int nargs, char **argv); From patchwork Mon Apr 7 08:28:32 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Avri Altman X-Patchwork-Id: 878945 Received: from esa5.hgst.iphmx.com (esa5.hgst.iphmx.com [216.71.153.144]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 604AC226CFD for ; Mon, 7 Apr 2025 08:34:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=216.71.153.144 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744014850; cv=none; b=iAMtMUZmVHf9pdBzMsCVTYBfiUVZVxMBlO5gCJG+fdEDW8n06Ovh+tJ32ZNcRvjTnYVBaZknuX02O0R7SFTwBfTxbKzLvCYJ+jv9VrFKnUQXQwwk9clo+gssAxcWLtpb8A0Pfg+Q3BtXX/8ekjpJr1ZVZ36+V4nO+wJNtMwy9J4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744014850; c=relaxed/simple; bh=SkSGNZBN8/s/RsEhKOOX5r3R5uQSocC8lg6KmEVh63M=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=V7Y5ihtMDAWb6cNtOXEtsnms6fiZHW8f83RvYlfbUPV3PrpjLh+HTl8v+JzIhwMTAk1blqPx8PdR7DGF/ZvgK4j9XkIFBwxM4o6tjBAD48n597OjQG0E0aYehdgvtnwDcdYfrqekpvL5yxZuBubZzPdvp7eRnP6ZziBh0vIymjk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=sandisk.com; spf=pass smtp.mailfrom=sandisk.com; dkim=pass (2048-bit key) header.d=sandisk.com header.i=@sandisk.com header.b=XNqfkXX4; arc=none smtp.client-ip=216.71.153.144 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=sandisk.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=sandisk.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=sandisk.com header.i=@sandisk.com header.b="XNqfkXX4" DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=sandisk.com; i=@sandisk.com; q=dns/txt; s=dkim.sandisk.com; t=1744014848; x=1775550848; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=SkSGNZBN8/s/RsEhKOOX5r3R5uQSocC8lg6KmEVh63M=; b=XNqfkXX4lRha3i83JG0CX6XUhYApBx8lh3lJbmvoN33QyJKsZfxt9P0j a8GZIDxuG9QhkMQGfLproM00Qdl1EI6OPC8PVCB56uswxbzqPIcu5KFVD Xj7KYCy208h6CKrpr4DtyM5p2vhNCzeVhgu/dlyLY9Ho0bZ6X/1SXcVgl w5iDK7V+DAj8Y37mhEy5Fh0HTDYa1oSwg76aMdhzd7JezPc4zuc7DFb30 9R4yigyfhDvP+NyA1soy1bvDAQV9fxkOMnfRqwtIuR0LdfHnNyTjhCRw1 xVnPzgTlciR0N73zCqodbhnSN88aDf/SYlqAfekkAYgl3h44pRns8Axls w==; X-CSE-ConnectionGUID: RGgGTPLXRPWPNI6FXqtyMA== X-CSE-MsgGUID: Tw3w9kgIS66/TZUaHrPY+g== X-IronPort-AV: E=Sophos;i="6.15,193,1739808000"; d="scan'208";a="72607786" Received: from h199-255-45-14.hgst.com (HELO uls-op-cesaep01.wdc.com) ([199.255.45.14]) by ob1.hgst.iphmx.com with ESMTP; 07 Apr 2025 16:34:07 +0800 IronPort-SDR: 67f38000_jWG8blXQCcpiTAjMk9jGhRloDBMJ1qikYZ0jYmX2hstxcBO DeFN4gNRya5imZO9fONzqgaTAYN6493MNtjdDOA== Received: from uls-op-cesaip01.wdc.com ([10.248.3.36]) by uls-op-cesaep01.wdc.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 07 Apr 2025 00:34:25 -0700 WDCIronportException: Internal Received: from avri-office.ad.shared (HELO avri-office.sdcorp.global.sandisk.com) ([10.45.31.142]) by uls-op-cesaip01.wdc.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 07 Apr 2025 01:34:06 -0700 From: Avri Altman To: Ulf Hansson , linux-mmc@vger.kernel.org Cc: Avri Altman Subject: [PATCH 09/10] mmc-utils: Secure Write Protect Mode Read Date: Mon, 7 Apr 2025 11:28:32 +0300 Message-Id: <20250407082833.108616-10-avri.altman@sandisk.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20250407082833.108616-1-avri.altman@sandisk.com> References: <20250407082833.108616-1-avri.altman@sandisk.com> Precedence: bulk X-Mailing-List: linux-mmc@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Avri Altman Reads the status of the secure write protect mode. Specifically, it returns the values of SECURE_WP_MODE_ENABLE and SECURE_WP_MODE_CONFIG registers. Those registers are available via rpmb Authenticated Device Configuration Read request. Signed-off-by: Avri Altman --- mmc.c | 11 +++++++ mmc_cmds.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ mmc_cmds.h | 1 + 3 files changed, 96 insertions(+) diff --git a/mmc.c b/mmc.c index 578b00c..36cfe90 100644 --- a/mmc.c +++ b/mmc.c @@ -240,6 +240,17 @@ static struct Command commands[] = { " mmc rpmb secure-wp-enable /dev/block/mmcblk0 /dev/mmcblk0rpmb -", NULL }, + { do_rpmb_sec_wp_en_read, -2, + "rpmb secure-wp-en-read", " [key file]\n" + "Reads the status of the SECURE_WP_EN & SECURE_WP_MASK fields.\n" + "You can specify '-' instead of key\n" + "Example:\n" + " echo -n AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHH | \\\n" + " mmc rpmb secure-wp-en-read /dev/mmcblk0 /dev/mmcblk0rpmb -\n" + "or read without verification\n" + " $ mmc rpmb secure-wp-en-read /dev/mmcblk0 /dev/mmcblk0rpmb", + NULL + }, { do_cache_en, -1, "cache enable", "\n" "Enable the eMMC cache feature on .\n" diff --git a/mmc_cmds.c b/mmc_cmds.c index 2ef4252..d7e4bca 100644 --- a/mmc_cmds.c +++ b/mmc_cmds.c @@ -2100,6 +2100,7 @@ enum rpmb_op_type { MMC_RPMB_WRITE = 0x03, MMC_RPMB_READ = 0x04, MMC_RPMB_CONF_WRITE = 0x06, + MMC_RPMB_CONF_READ = 0x07, /* For internal usage only, do not use it directly */ MMC_RPMB_READ_RESP = 0x05 @@ -2237,6 +2238,7 @@ static int do_rpmb_op(int fd, const struct rpmb_frame *frame_in, break; case MMC_RPMB_READ_CNT: + case MMC_RPMB_CONF_READ: if (out_cnt != 1) { err = -EINVAL; goto out; @@ -2588,6 +2590,81 @@ out: return ret; } +static int rpmb_auth_read(int nargs, char **argv, char *usage) +{ + int ret, dev_fd; + struct rpmb_frame frame_in = { + .req_resp = htobe16(MMC_RPMB_CONF_READ), + }, frame_out = {}; + unsigned char key[32] = {}; + + if (nargs != 3 && nargs != 4) { + fprintf(stderr, "%s", usage); + return EXIT_FAILURE; + } + + if (!secure_wp_supported(argv[1])) { + fprintf(stderr, "secure wp not supported %s", argv[1]); + return EXIT_FAILURE; + } + + dev_fd = open(argv[2], O_RDWR); + if (dev_fd < 0) { + perror("device open"); + return EXIT_FAILURE; + } + + if (nargs == 4) { + ret = rpmb_get_key(argv[3], &frame_in, key, false); + if (ret) { + printf("failed to read and apply key %d\n", ret); + goto out; + } + } + + /* Execute RPMB op */ + ret = do_rpmb_op(dev_fd, &frame_in, &frame_out, 1); + if (ret != 0) { + perror("RPMB ioctl failed"); + goto out; + } + + /* Check RPMB response */ + if (frame_out.result != 0) { + printf("RPMB operation failed, retcode 0x%04x\n", be16toh(frame_out.result)); + goto out; + } + + close(dev_fd); + + /* verify data against key */ + if (nargs == 4) { + unsigned char mac[32] = {}; + hmac_sha256_ctx ctx; + + hmac_sha256_init(&ctx, key, sizeof(key)); + hmac_sha256_update(&ctx, frame_out.data, + sizeof(frame_out) - offsetof(struct rpmb_frame, data)); + + hmac_sha256_final(&ctx, mac, sizeof(mac)); + + /* Compare calculated MAC and MAC from last frame */ + if (memcmp(mac, frame_out.key_mac, sizeof(mac))) { + printf("RPMB MAC mismatch\n"); + return EXIT_FAILURE; + } + } + + printf("SECURE_WP_MODE_ENABLE: 0x%02x]\n", frame_out.data[255]); + printf("SECURE_WP_MODE_CONFIG: 0x%02x]\n", frame_out.data[254]); + + return 0; + +out: + close(dev_fd); + return ret; +} + int do_rpmb_sec_wp_enable(int nargs, char **argv) { char *usage = "Usage: mmc rpmb secure-wp-mode-on \n"; @@ -2616,6 +2693,13 @@ int do_rpmb_sec_wp_mode_clear(int nargs, char **argv) return rpmb_auth_write(nargs, argv, 2, 0, usage); } +int do_rpmb_sec_wp_en_read(int nargs, char **argv) +{ + char *usage = "Usage: mmc rpmb secure-wp-enable-read [/path/to/key]\n"; + + return rpmb_auth_read(nargs, argv, usage); +} + int do_rpmb_write_block(int nargs, char **argv) { int ret, dev_fd, data_fd; diff --git a/mmc_cmds.h b/mmc_cmds.h index 61fe337..d83fb57 100644 --- a/mmc_cmds.h +++ b/mmc_cmds.h @@ -43,6 +43,7 @@ int do_rpmb_sec_wp_enable(int nargs, char **argv); int do_rpmb_sec_wp_disable(int nargs, char **argv); int do_rpmb_sec_wp_mode_set(int nargs, char **argv); int do_rpmb_sec_wp_mode_clear(int nargs, char **argv); +int do_rpmb_sec_wp_en_read(int nargs, char **argv); int do_cache_en(int nargs, char **argv); int do_cache_dis(int nargs, char **argv); int do_ffu(int nargs, char **argv); From patchwork Mon Apr 7 08:28:33 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Avri Altman X-Patchwork-Id: 879979 Received: from esa2.hgst.iphmx.com (esa2.hgst.iphmx.com [68.232.143.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B9985228CB7 for ; Mon, 7 Apr 2025 08:34:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=68.232.143.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744014859; cv=none; b=BCbvHx8PCk22BWZggMWTXzQwA5HL0wccyxUEk6C3b5bjWqau7uNRzxndZwdzWLu5PuFqGIQ1uIi8uYLH/MOR/QREpvMDdEwyGAlwQcGatIi4FOq4S8/ZrVCZ5RXgMt6IonOyfqC7+Kw7Oa+PFvH+/mnGRllhJ86d0Uzfkm0N+os= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744014859; c=relaxed/simple; bh=jFbSgVC6e8PJpYBXHxwCaiWaVW06k7b3K5g88XSbuEw=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=BM9YisQGv5tiE76JsMomdRRHSy9f84tNaPnPLCbyoWOP+gTMLeTOpWN47rB2SiC4FnyV3zpRsLhHNhOsh8VsSZ24bjRJFK4+/Q1ke2XR0c9Qzx7L3M+PYT7EgVWjSEPE8/ptohzvHuyJPuTz2UhI5aIvqP5rVz84D4FnmM6q2Fs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=sandisk.com; spf=pass smtp.mailfrom=sandisk.com; dkim=pass (2048-bit key) header.d=sandisk.com header.i=@sandisk.com header.b=iMDz9kfo; arc=none smtp.client-ip=68.232.143.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=sandisk.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=sandisk.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=sandisk.com header.i=@sandisk.com header.b="iMDz9kfo" DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=sandisk.com; i=@sandisk.com; q=dns/txt; s=dkim.sandisk.com; t=1744014857; x=1775550857; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=jFbSgVC6e8PJpYBXHxwCaiWaVW06k7b3K5g88XSbuEw=; b=iMDz9kforlhPr0uMzo85OJV9sXRxUkK4bovQSTAPx49IBI6z5z9ZmJlU Q2Rs5h3NKnk9h8RH2oZlbwImK4izpN3LOtf0lxxd7Ma6vcGJdiRwS/05b gaGVk+2Fw2HvfNWw2nU+umNSUwwWCuy2A4RLlJ4Cy1uhLg0HCE9iIFz/j 7/Glv4fHJR8msHYY2rxcjuI/Hqko5meWLmp99CUxaYCaN5iF4GhRz0mYX A9lbdtl/NscxR+/yoA+jqGNyhMRrGgg3kvspHVpqPoEPAZg4UsXEwR2Xb q67eg7z07/ju+l0Z3DsNwUWZlIYDTwcCZylKn8husWxNkp1dKIZ28jDsB w==; X-CSE-ConnectionGUID: QpTvo1/GSiSOFmduCdPz7Q== X-CSE-MsgGUID: pIKQqmKSTKO94/SBRQLmvg== X-IronPort-AV: E=Sophos;i="6.15,193,1739808000"; d="scan'208";a="78093031" Received: from h199-255-45-14.hgst.com (HELO uls-op-cesaep01.wdc.com) ([199.255.45.14]) by ob1.hgst.iphmx.com with ESMTP; 07 Apr 2025 16:34:15 +0800 IronPort-SDR: 67f38008_r61VF1Clc6QLV+tHO5Sk+wzRJ19rTRjAbBDKmKyugY8ajlt 9c05dQzj9DbIJHgolPZMhyx7uiEfzREYUQm+Smg== Received: from uls-op-cesaip01.wdc.com ([10.248.3.36]) by uls-op-cesaep01.wdc.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 07 Apr 2025 00:34:32 -0700 WDCIronportException: Internal Received: from avri-office.ad.shared (HELO avri-office.sdcorp.global.sandisk.com) ([10.45.31.142]) by uls-op-cesaip01.wdc.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 07 Apr 2025 01:34:14 -0700 From: Avri Altman To: Ulf Hansson , linux-mmc@vger.kernel.org Cc: Avri Altman Subject: [PATCH 10/10] mmc-utils: Doc: new secure write protect commands Date: Mon, 7 Apr 2025 11:28:33 +0300 Message-Id: <20250407082833.108616-11-avri.altman@sandisk.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20250407082833.108616-1-avri.altman@sandisk.com> References: <20250407082833.108616-1-avri.altman@sandisk.com> Precedence: bulk X-Mailing-List: linux-mmc@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Avri Altman This patch updates the tool's man and HOWTO pages with secure write protect commands documentation. Signed-off-by: Avri Altman --- docs/HOWTO.rst | 14 ++++++++++++++ mmc.1 | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/docs/HOWTO.rst b/docs/HOWTO.rst index 7a27a50..f2f2f35 100644 --- a/docs/HOWTO.rst +++ b/docs/HOWTO.rst @@ -93,3 +93,17 @@ Running mmc-utils ``mmc rpmb read-block
[key file]`` Reads blocks of data from the RPMB partition. + + ``mmc rpmb secure-wp-mode-on `` + Enable Secure Write Protection mode. + + ``mmc rpmb secure-wp-mode-off `` + Disable Secure Write Protection mode = legacy mode. + + ``mmc rpmb secure-wp-disable `` + Enable updating WP related EXT_CSD and CSD fields. + Applicable only if secure write protect mode is enabled. + + ``mmc rpmb secure-wp-enable `` + Disable updating WP related EXT_CSD and CSD fields. + Applicable only if secure write protect mode is enabled. diff --git a/mmc.1 b/mmc.1 index 921ca19..e4ac7bd 100644 --- a/mmc.1 +++ b/mmc.1 @@ -166,6 +166,45 @@ Block of 256 bytes will be written from data file to .br Also you can specify '-' instead of key file path or data file to read the data from stdin. .TP +.BI rpmb " " secure\-wp\-mode\-on " " \fIrpmb\-device\fR " " \fIkey\-file\fR +Enable Secure Write Protection mode. +.br +The access to the write protection related EXT_CSD and +CSD fields depends on the value of SECURE_WP_MASK bit in +SECURE_WP_MODE_CONFIG field. +.br +You can specify '-' instead of key. +.TP +.BI rpmb " " secure\-wp\-mode\-off " " \fIrpmb\-device\fR " " \fIkey\-file\fR +Disable Secure Write Protection mode = legacy mode. +.br +TMP_WRITE_PROTECT[12] and PERM_WRITE_PROTECT[13] are updated by CMD27. +.br +USER_WP[171], BOOT_WP[173], and BOOT_WP_STATUS[174] are updated by CMD6. +.br +You can specify '-' instead of key. +.TP +.BI rpmb " " secure\-wp\-disable " " \fIrpmb\-device\fR " " \fIkey\-file\fR +Enabling updating WP related EXT_CSD and CSD fields. +.br +Applicable only if secure wp mode is enabled. +.br +You can specify '-' instead of key. +.TP +.BI rpmb " " secure\-wp\-enable " " \fIrpmb\-device\fR " " \fIkey\-file\fR +Disabling updating WP related EXT_CSD and CSD fields. +.br +Applicable only if secure wp mode is enabled. +.br +You can specify '-' instead of key. +.TP +.BI rpmb " " secure\-wp\-en\-read " " \fIrpmb\-device\fR " " [\fIkey\-file\fR] +Reads the status of the SECURE_WP_EN & SECURE_WP_MASK fields +.br +Applicable only if secure wp mode is enabled. +.br +You can specify '-' instead of key. +.TP .BI cache " " enable " " \fIdevice\fR Enable the eMMC cache feature on the device. .br