Received: by 2002:a5d:9c59:0:0:0:0:0 with SMTP id 25csp607215iof; Mon, 6 Jun 2022 09:17:15 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw/WML3xEyZuUa65R2XfLg/tjEJ6thbiTYyDADkWxa787ld/OWQGQznQl6o5JyiLPioFtm+ X-Received: by 2002:a17:902:f791:b0:15f:15aa:2b53 with SMTP id q17-20020a170902f79100b0015f15aa2b53mr24904457pln.6.1654532235235; Mon, 06 Jun 2022 09:17:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1654532235; cv=none; d=google.com; s=arc-20160816; b=LnDF1xzuqLVMFqVr42Po/psBLfw//4+a8KOKIQkFdUPOGInKkb6ktGn36kKIr60of7 U2zxhyxNBzlWjMRnfyUA+eVl66FSF7hYuGO7LuU7WE/QlL+4Pb5qWwDX84GnzpMKIFec LYWErXy74Usau89KrtbRY0cylMCCkQiRbCa7gFYP7SydxIqLtEMF7s+N5opFyWwRX5Hj GJlV/nQlM6o6uvbkQrrFcaLTKqj7x6wcIFKcvu9THkjGT0aEaNpeQUdEr/vO/mvtwV1z kqgUBoXzwsKKjOMbX7a8B7fgabULuHNb4tfvF2CUhTJS3/7fCdeO4c3mlCZmrdGB05Ep EtGQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=euDU8jbgTNjPDwJS2nH0BZgjoOFSUvgrUsndjG4JSYs=; b=uXkkZLCSidPU1bo1ct0jTWBtHeyn72GiXwSUKA7tag8GwcT3zBk7UhlekieFPB6Iam JpRXvAChHMCKF/UkFpGMVSRFSlXu0u8NF1fJxw1EqkXPRq4w2d8qCRp29swbjZiVEgME Qw9umZHpWgsM99LeEoGXd2BkMnMTCv83cUaQY6f2HO089EinOVRzWYnC6fLv2cmCIoA7 PDa3bpmcYrHA/K+fIorgDeFMLZu8EFvIIWFAyR0Wd33UcX3eoBGnKrL9vVzOS+VKVPLK TCR7HaJPKKQfGG6FK83xhEdbh5RyZHvQh7PcQRLBskDpFHhLk8m9hvoS2gXHPVd/fL8W woaQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=Detvh+Uz; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [2620:137:e000::1:18]) by mx.google.com with ESMTPS id ik8-20020a170902ab0800b001639975025bsi20578630plb.437.2022.06.06.09.17.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Jun 2022 09:17:15 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) client-ip=2620:137:e000::1:18; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=Detvh+Uz; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 1316F56419; Mon, 6 Jun 2022 09:00:52 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S241382AbiFFQAn (ORCPT + 99 others); Mon, 6 Jun 2022 12:00:43 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47178 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S241367AbiFFQAk (ORCPT ); Mon, 6 Jun 2022 12:00:40 -0400 Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1587754018; Mon, 6 Jun 2022 09:00:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1654531239; x=1686067239; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=WGQpwa4wfcy5RwIBvObKGIP791tD1mHJW8q2Q8kOAXA=; b=Detvh+UzOqmdRZV+tcri812G5sTZ9rrbEvPPrjO+L97B69TAUszV3gi0 U8uqKvIHXSbpwqbfdh/S53OXtnNAr40feyH7zXxFD7y5yBCV4KYiSDVnW G1hQFVc8wJq7usoFsbrDQLhCyIb/Pk80BygQPsIjb1wNAK4peTRS5SYLC Ks+YE7dXLy7BUb2FyYiVB9czLAhouFXrHS/jwl0m2zpDUCaoSKYdOjCkb aGyTHDAtfPSw/BEoRKfObkJZHrp86ULSUqLG/+vQ3be9+DxLZxsHP4UsN BAtCD+uBOURzcmmG0EoL894Q9AEzOOZmbRvnr/VUhGoHlnXX4MxOZ7TGP Q==; X-IronPort-AV: E=McAfee;i="6400,9594,10370"; a="257110970" X-IronPort-AV: E=Sophos;i="5.91,280,1647327600"; d="scan'208";a="257110970" Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Jun 2022 09:00:37 -0700 X-IronPort-AV: E=Sophos;i="5.91,280,1647327600"; d="scan'208";a="906607977" Received: from rhweight-mobl.amr.corp.intel.com (HELO rhweight-mobl.ra.intel.com) ([10.255.231.138]) by fmsmga005-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Jun 2022 09:00:36 -0700 From: Russ Weight To: mdf@kernel.org, hao.wu@intel.com, yilun.xu@intel.com, lee.jones@linaro.org, linux-fpga@vger.kernel.org, linux-kernel@vger.kernel.org Cc: trix@redhat.com, marpagan@redhat.com, lgoncalv@redhat.com, matthew.gerlach@linux.intel.com, basheer.ahmed.muddebihal@intel.com, tianfei.zhang@intel.com, Russ Weight Subject: [PATCH v23 4/5] fpga: m10bmc-sec: expose max10 canceled keys in sysfs Date: Mon, 6 Jun 2022 09:00:37 -0700 Message-Id: <20220606160038.846236-5-russell.h.weight@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220606160038.846236-1-russell.h.weight@intel.com> References: <20220606160038.846236-1-russell.h.weight@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-3.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RDNS_NONE,SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Extend the MAX10 BMC Secure Update driver to provide sysfs files to expose the 128 bit code signing key (CSK) cancellation vectors. These use the standard bitmap list format (e.g. 1,2-6,9). Each CSK is assigned an ID, a number between 0-127, during the signing process. CSK ID cancellation information is stored in 128-bit fields in write-once locations in flash. The cancellation of a CSK can be used to prevent the card from being rolled back to older images that were signed with a CSK that is now cancelled. Reviewed-by: Tom Rix Tested-by: Tianfei Zhang Acked-by: Xu Yilun Signed-off-by: Russ Weight --- v23: - Rebased for 5.19-rc1 v22: - Added Tested-by tag from Tianfei and Acked-by tag from Yilun. - Updated KernelVersion and Date in ABI documentation to 5.20 and Sep 2022 respectively. v21: - Replace WARN_ON(size % stride) with a more elaborate test. Return -EINVAL and write a message to the kernel log. Call WARN_ON_ONCE(). v20: - Added text to the commit message to further describe the cancellation of code signing keys. v19: - Change "card bmc" naming back to "m10 bmc" naming to be consistent with the parent driver. v18: - No change v17: - Update the Date and KernelVersion for the ABI documentation to Jul 2022 and 5.19 respectively. - Change "m10bmc" in symbol names to "cardbmc" to reflect the fact that the future devices will not necessarily use the MAX10. v16: - No Change v15: - Updated the Dates and KernelVersions in the ABI documentation v14: - No changes v13: - Updated ABI documentation date and kernel version v12: - Updated Date and KernelVersion fields in ABI documentation v11: - No change v10: - Changed the path expressions in the sysfs documentation to replace the n3000 reference with something more generic to accomodate other devices that use the same driver. v9: - Rebased to 5.12-rc2 next - Updated Date and KernelVersion in ABI documentation v8: - Previously patch 4/6, otherwise no change v7: - Updated Date and KernelVersion in ABI documentation v6: - Added WARN_ON() call for (size / stride) to ensure that the proper count is passed to regmap_bulk_read(). v5: - No change v4: - Moved sysfs files for displaying the code-signing-key (CSK) cancellation vectors from the FPGA Security Manger class driver to here. The m10bmc_csk_vector() and m10bmc_csk_cancel_nbits() functions are removed and the functionality from these functions is moved into a show_canceled_csk() function for for displaying the CSK vectors. - Added ABI documentation for new sysfs entries v3: - Changed: iops -> sops, imgr -> smgr, IFPGA_ -> FPGA_, ifpga_ to fpga_ - Changed "MAX10 BMC Secure Engine driver" to "MAX10 BMC Secure Update driver" - Removed wrapper functions (m10bmc_raw_*, m10bmc_sys_*). The underlying functions are now called directly. - Renamed get_csk_vector() to m10bmc_csk_vector() v2: - Replaced small function-creation macros for explicit function declarations. - Fixed get_csk_vector() function to properly apply the stride variable in calls to m10bmc_raw_bulk_read() - Added m10bmc_ prefix to functions in m10bmc_iops structure --- .../sysfs-driver-intel-m10-bmc-sec-update | 24 +++++++++ drivers/fpga/intel-m10-bmc-sec-update.c | 54 +++++++++++++++++++ 2 files changed, 78 insertions(+) diff --git a/Documentation/ABI/testing/sysfs-driver-intel-m10-bmc-sec-update b/Documentation/ABI/testing/sysfs-driver-intel-m10-bmc-sec-update index 6114e15885e5..0a41afe0ab4c 100644 --- a/Documentation/ABI/testing/sysfs-driver-intel-m10-bmc-sec-update +++ b/Documentation/ABI/testing/sysfs-driver-intel-m10-bmc-sec-update @@ -28,6 +28,30 @@ Description: Read only. Returns the root entry hash for the BMC image underlying device supports it. Format: string. +What: /sys/bus/platform/drivers/intel-m10bmc-sec-update/.../security/sr_canceled_csks +Date: Sep 2022 +KernelVersion: 5.20 +Contact: Russ Weight +Description: Read only. Returns a list of indices for canceled code + signing keys for the static region. The standard bitmap + list format is used (e.g. "1,2-6,9"). + +What: /sys/bus/platform/drivers/intel-m10bmc-sec-update/.../security/pr_canceled_csks +Date: Sep 2022 +KernelVersion: 5.20 +Contact: Russ Weight +Description: Read only. Returns a list of indices for canceled code + signing keys for the partial reconfiguration region. The + standard bitmap list format is used (e.g. "1,2-6,9"). + +What: /sys/bus/platform/drivers/intel-m10bmc-sec-update/.../security/bmc_canceled_csks +Date: Sep 2022 +KernelVersion: 5.20 +Contact: Russ Weight +Description: Read only. Returns a list of indices for canceled code + signing keys for the BMC. The standard bitmap list format + is used (e.g. "1,2-6,9"). + What: /sys/bus/platform/drivers/intel-m10bmc-sec-update/.../security/flash_count Date: Sep 2022 KernelVersion: 5.20 diff --git a/drivers/fpga/intel-m10-bmc-sec-update.c b/drivers/fpga/intel-m10-bmc-sec-update.c index 25b21f116976..65fec2a70901 100644 --- a/drivers/fpga/intel-m10-bmc-sec-update.c +++ b/drivers/fpga/intel-m10-bmc-sec-update.c @@ -78,6 +78,57 @@ DEVICE_ATTR_SEC_REH_RO(bmc, BMC_PROG_MAGIC, BMC_PROG_ADDR, BMC_REH_ADDR); DEVICE_ATTR_SEC_REH_RO(sr, SR_PROG_MAGIC, SR_PROG_ADDR, SR_REH_ADDR); DEVICE_ATTR_SEC_REH_RO(pr, PR_PROG_MAGIC, PR_PROG_ADDR, PR_REH_ADDR); +#define CSK_BIT_LEN 128U +#define CSK_32ARRAY_SIZE DIV_ROUND_UP(CSK_BIT_LEN, 32) + +static ssize_t +show_canceled_csk(struct device *dev, u32 addr, char *buf) +{ + unsigned int i, stride, size = CSK_32ARRAY_SIZE * sizeof(u32); + struct m10bmc_sec *sec = dev_get_drvdata(dev); + DECLARE_BITMAP(csk_map, CSK_BIT_LEN); + __le32 csk_le32[CSK_32ARRAY_SIZE]; + u32 csk32[CSK_32ARRAY_SIZE]; + int ret; + + stride = regmap_get_reg_stride(sec->m10bmc->regmap); + if (size % stride) { + dev_err(sec->dev, + "CSK vector size (0x%x) not aligned to stride (0x%x)\n", + size, stride); + WARN_ON_ONCE(1); + return -EINVAL; + } + + ret = regmap_bulk_read(sec->m10bmc->regmap, addr, csk_le32, + size / stride); + if (ret) { + dev_err(sec->dev, "failed to read CSK vector: %x cnt %x: %d\n", + addr, size / stride, ret); + return ret; + } + + for (i = 0; i < CSK_32ARRAY_SIZE; i++) + csk32[i] = le32_to_cpu(((csk_le32[i]))); + + bitmap_from_arr32(csk_map, csk32, CSK_BIT_LEN); + bitmap_complement(csk_map, csk_map, CSK_BIT_LEN); + return bitmap_print_to_pagebuf(1, buf, csk_map, CSK_BIT_LEN); +} + +#define DEVICE_ATTR_SEC_CSK_RO(_name, _addr) \ +static ssize_t _name##_canceled_csks_show(struct device *dev, \ + struct device_attribute *attr, \ + char *buf) \ +{ return show_canceled_csk(dev, _addr, buf); } \ +static DEVICE_ATTR_RO(_name##_canceled_csks) + +#define CSK_VEC_OFFSET 0x34 + +DEVICE_ATTR_SEC_CSK_RO(bmc, BMC_PROG_ADDR + CSK_VEC_OFFSET); +DEVICE_ATTR_SEC_CSK_RO(sr, SR_PROG_ADDR + CSK_VEC_OFFSET); +DEVICE_ATTR_SEC_CSK_RO(pr, PR_PROG_ADDR + CSK_VEC_OFFSET); + #define FLASH_COUNT_SIZE 4096 /* count stored as inverted bit vector */ static ssize_t flash_count_show(struct device *dev, @@ -125,6 +176,9 @@ static struct attribute *m10bmc_security_attrs[] = { &dev_attr_bmc_root_entry_hash.attr, &dev_attr_sr_root_entry_hash.attr, &dev_attr_pr_root_entry_hash.attr, + &dev_attr_sr_canceled_csks.attr, + &dev_attr_pr_canceled_csks.attr, + &dev_attr_bmc_canceled_csks.attr, NULL, }; -- 2.25.1