From nobody Thu Dec 18 20:24:56 2025 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 68F3AC001B0 for ; Mon, 14 Aug 2023 05:53:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233282AbjHNFxC (ORCPT ); Mon, 14 Aug 2023 01:53:02 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52004 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231698AbjHNFwz (ORCPT ); Mon, 14 Aug 2023 01:52:55 -0400 Received: from NAM12-DM6-obe.outbound.protection.outlook.com (mail-dm6nam12on2059.outbound.protection.outlook.com [40.107.243.59]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5C36BE6D for ; Sun, 13 Aug 2023 22:52:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=TRl9NHMetBzkTudYcuTF+dqhS2MNJ2qAv9muCQBB+2U4YVXMsqSsKBFE/tMtiEdYrsdJKDjvKfV2fJJjmupAnnDLRIAdwygH++sI5muDD0QeDwEH7GgKggjhZa56+yRjhQd+qMUCyUv/vDTbzLPu99T7SB1ZoCuAq998udNe7YpgnbCjB3CJU7gowrNMDiTOKmmYz9CXsNo+1I7Vd0uL6d3e5gQkcnG5HmDrnwy93IufCA4lU6EdoIW61Kvxz68dpm5pX9DKZNSoyIabet71vE2JdysKmQv1d60VMV0xVNfpshw0LcNeszbcjRTEZgKaG/ruNK2sqJIoDa9PeFqNAA== 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=DI7P1CYIuK4BsbDUxJOzD/PR3364YAAh7mLoYZPB7Jc=; b=k9Ri4xc5tiG8Wqn0/QfUMGkTRmi1ErSn7sCR9+N9sCNzhjkMHycLNmegSM0bre4URObrf1AoAxtcHTj7w7BYIbQ7kDWWoY7Yb6Du3rY9VQaMijS5+nUY5KGG2zy0YpB6YAMa+SMS5BF7z9ILlgwuhKh4wMp99XfySJX5cOYYsQqJ2w93KKSPER8eg2WNkVadLAGSJTaa3kJJ/+ljdbHeaedi6ehmKGB+xpbtEv7ME5wSuIH5HfmJIq5I2Gjt8cgf5x18Evpz4lo9ja+QchsBjtm4spnq6cMWMF9OA3K0Y+avqbhukyuRzeGFFOFmaYoXsRN0UW2yOIQmUW4gxx+Zjg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=DI7P1CYIuK4BsbDUxJOzD/PR3364YAAh7mLoYZPB7Jc=; b=y9dpT7if2ofZeFJqjzfa5qjG79D6M61OAp5V+aFTM8j+v6aJ11TKRsMtZSPuGqOgHYudt1vkBOPw9Yaz0oNwmLI0YysPhylwCID0Pk+jkXd9RJrm5R8DCRofmpYDcTK5qnN8GlaeVrhbRFyOetQdb/NW6t54dpjdRX4Szlf2/Fw= Received: from CYXPR02CA0083.namprd02.prod.outlook.com (2603:10b6:930:ce::18) by PH0PR12MB5401.namprd12.prod.outlook.com (2603:10b6:510:d4::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6678.24; Mon, 14 Aug 2023 05:52:51 +0000 Received: from CY4PEPF0000E9CF.namprd03.prod.outlook.com (2603:10b6:930:ce:cafe::ee) by CYXPR02CA0083.outlook.office365.com (2603:10b6:930:ce::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6652.33 via Frontend Transport; Mon, 14 Aug 2023 05:52:51 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=SATLEXMB04.amd.com; pr=C Received: from SATLEXMB04.amd.com (165.204.84.17) by CY4PEPF0000E9CF.mail.protection.outlook.com (10.167.241.142) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.6699.12 via Frontend Transport; Mon, 14 Aug 2023 05:52:51 +0000 Received: from gomati.amd.com (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.27; Mon, 14 Aug 2023 00:52:48 -0500 From: Nikunj A Dadhania To: , CC: , , , , , , Subject: [PATCH v4 01/14] virt: sev-guest: Use AES GCM crypto library Date: Mon, 14 Aug 2023 11:22:09 +0530 Message-ID: <20230814055222.1056404-2-nikunj@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230814055222.1056404-1-nikunj@amd.com> References: <20230814055222.1056404-1-nikunj@amd.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [10.180.168.240] X-ClientProxiedBy: SATLEXMB04.amd.com (10.181.40.145) To SATLEXMB04.amd.com (10.181.40.145) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CY4PEPF0000E9CF:EE_|PH0PR12MB5401:EE_ X-MS-Office365-Filtering-Correlation-Id: 363027de-d119-44b6-669c-08db9c8ab26a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: VPmz+C1KZvVJrJi32mpb/yBxuRFn8n2dv/2P0Q4JZOkJ5tmQ+wXyZzoFWKu96HTL0QyGA4rDhRkSR6cDtJS2kL8u+cugzlRKqTpMMl+KX+aq3oNZs6FOjfKcnhAYFk+gYoFm/5Ob58hkQDwvnkS4txn/5tCDUKsrCw4ljBADtbtKrJ0A6akuzOBCAzSC9ozwbLK5CR7jjt1F9qaIDZrhOJR9d7GLI5St7uANo+V7f3TiysGiwHwtXYiSVfEmmh0YdLb9fMUwqHvFbEaDuF7qrCMoWalprleMcjRAdku97J3A0IQVnRnK8AS4A7ii58HH/t5Y0AQTI+QgXVcxWPeKOXhCoUkNNxu1LoMQEhqVAiVBZsn6uwfMF1vSxRpdhz+axVVFR/vNIY8WIApGt8ctxrP2fcyxMwV8EjNpc/b1ewA5DDcXThyMOkLU9tLD4ZwN98xLFl6Ob4TQPmzljGRSRFIAUlSgSOR38RTTzEfSS7iJdJtSaCDj0x16M+8DzhvCo/9Pk1tkDMEaAX6qyJDBmqFLGSDYM1uw4Muqw5qBHEtfPzYNdJ1ORMSMcQtIqYcjU7+R1rP8Pz8KFZnOYvK/VA2fByK7uUYcjcCHWbNvZLchlov9KZ+5mIu9ulcpg2u4Z7iw5tSSRTUsu+EUmhJd3OMo1vSSsko0dk9H/d/hoRpJIdTH3CRq1quQf2JLR0kvWsTCeE7kxVdt2Dj+xyug9cVjmfSC30U/OMWfhY60XFwc+RNkytI5iDZnIBPHSzH4h2IpGtziT7Gpe5G6E3FQCA== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:SATLEXMB04.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230028)(4636009)(396003)(39860400002)(136003)(376002)(346002)(451199021)(186006)(82310400008)(1800799006)(40470700004)(46966006)(36840700001)(966005)(7696005)(6666004)(54906003)(478600001)(40480700001)(110136005)(16526019)(426003)(2616005)(30864003)(1076003)(336012)(26005)(2906002)(70206006)(4326008)(316002)(8676002)(70586007)(41300700001)(5660300002)(8936002)(40460700003)(36756003)(47076005)(36860700001)(82740400003)(81166007)(356005)(83380400001)(36900700001);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Aug 2023 05:52:51.4700 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 363027de-d119-44b6-669c-08db9c8ab26a X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: CY4PEPF0000E9CF.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR12MB5401 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The sev-guest driver encryption code uses Crypto API for SNP guest messaging to interact with AMD Security processor. For enabling SecureTSC, SEV-SNP guests need to send a TSC_INFO request guest message before the smpboot phase starts. Details from the TSC_INFO response will be used to program the VMSA before the secondary CPUs are brought up. The Crypto API is not available this early in the boot phase. In preparation of moving the encryption code out of sev-guest driver to support SecureTSC and make reviewing the diff easier, start using AES GCM library implementation instead of Crypto API. Link: https://lore.kernel.org/all/20221103192259.2229-1-ardb@kernel.org CC: Ard Biesheuvel Signed-off-by: Nikunj A Dadhania Reviewed-by: Tom Lendacky --- drivers/virt/coco/sev-guest/Kconfig | 3 +- drivers/virt/coco/sev-guest/sev-guest.c | 172 +++++++----------------- drivers/virt/coco/sev-guest/sev-guest.h | 3 + 3 files changed, 53 insertions(+), 125 deletions(-) diff --git a/drivers/virt/coco/sev-guest/Kconfig b/drivers/virt/coco/sev-gu= est/Kconfig index f9db0799ae67..bcc760bfb468 100644 --- a/drivers/virt/coco/sev-guest/Kconfig +++ b/drivers/virt/coco/sev-guest/Kconfig @@ -2,8 +2,7 @@ config SEV_GUEST tristate "AMD SEV Guest driver" default m depends on AMD_MEM_ENCRYPT - select CRYPTO_AEAD2 - select CRYPTO_GCM + select CRYPTO_LIB_AESGCM help SEV-SNP firmware provides the guest a mechanism to communicate with the PSP without risk from a malicious hypervisor who wishes to read, diff --git a/drivers/virt/coco/sev-guest/sev-guest.c b/drivers/virt/coco/se= v-guest/sev-guest.c index 97dbe715e96a..520e2b6613a7 100644 --- a/drivers/virt/coco/sev-guest/sev-guest.c +++ b/drivers/virt/coco/sev-guest/sev-guest.c @@ -16,8 +16,7 @@ #include #include #include -#include -#include +#include #include #include #include @@ -28,24 +27,16 @@ #include "sev-guest.h" =20 #define DEVICE_NAME "sev-guest" -#define AAD_LEN 48 -#define MSG_HDR_VER 1 =20 #define SNP_REQ_MAX_RETRY_DURATION (60*HZ) #define SNP_REQ_RETRY_DELAY (2*HZ) =20 -struct snp_guest_crypto { - struct crypto_aead *tfm; - u8 *iv, *authtag; - int iv_len, a_len; -}; - struct snp_guest_dev { struct device *dev; struct miscdevice misc; =20 void *certs_data; - struct snp_guest_crypto *crypto; + struct aesgcm_ctx *ctx; /* request and response are in unencrypted memory */ struct snp_guest_msg *request, *response; =20 @@ -68,6 +59,15 @@ MODULE_PARM_DESC(vmpck_id, "The VMPCK ID to use when com= municating with the PSP. /* Mutex to serialize the shared buffer access and command handling. */ static DEFINE_MUTEX(snp_cmd_mutex); =20 +static inline unsigned int get_ctx_authsize(struct snp_guest_dev *snp_dev) +{ + if (snp_dev && snp_dev->ctx) + return snp_dev->ctx->authsize; + + WARN_ONCE(1, "Unable to get crypto authsize\n"); + return 0; +} + static bool is_vmpck_empty(struct snp_guest_dev *snp_dev) { char zero_key[VMPCK_KEY_LEN] =3D {0}; @@ -152,132 +152,59 @@ static inline struct snp_guest_dev *to_snp_dev(struc= t file *file) return container_of(dev, struct snp_guest_dev, misc); } =20 -static struct snp_guest_crypto *init_crypto(struct snp_guest_dev *snp_dev,= u8 *key, size_t keylen) +static struct aesgcm_ctx *snp_init_crypto(u8 *key, size_t keylen) { - struct snp_guest_crypto *crypto; + struct aesgcm_ctx *ctx; =20 - crypto =3D kzalloc(sizeof(*crypto), GFP_KERNEL_ACCOUNT); - if (!crypto) + ctx =3D kzalloc(sizeof(*ctx), GFP_KERNEL_ACCOUNT); + if (!ctx) return NULL; =20 - crypto->tfm =3D crypto_alloc_aead("gcm(aes)", 0, 0); - if (IS_ERR(crypto->tfm)) - goto e_free; - - if (crypto_aead_setkey(crypto->tfm, key, keylen)) - goto e_free_crypto; - - crypto->iv_len =3D crypto_aead_ivsize(crypto->tfm); - crypto->iv =3D kmalloc(crypto->iv_len, GFP_KERNEL_ACCOUNT); - if (!crypto->iv) - goto e_free_crypto; - - if (crypto_aead_authsize(crypto->tfm) > MAX_AUTHTAG_LEN) { - if (crypto_aead_setauthsize(crypto->tfm, MAX_AUTHTAG_LEN)) { - dev_err(snp_dev->dev, "failed to set authsize to %d\n", MAX_AUTHTAG_LEN= ); - goto e_free_iv; - } + if (aesgcm_expandkey(ctx, key, keylen, AUTHTAG_LEN)) { + pr_err("SNP: crypto init failed\n"); + kfree(ctx); + return NULL; } =20 - crypto->a_len =3D crypto_aead_authsize(crypto->tfm); - crypto->authtag =3D kmalloc(crypto->a_len, GFP_KERNEL_ACCOUNT); - if (!crypto->authtag) - goto e_free_iv; - - return crypto; - -e_free_iv: - kfree(crypto->iv); -e_free_crypto: - crypto_free_aead(crypto->tfm); -e_free: - kfree(crypto); - - return NULL; + return ctx; } =20 -static void deinit_crypto(struct snp_guest_crypto *crypto) -{ - crypto_free_aead(crypto->tfm); - kfree(crypto->iv); - kfree(crypto->authtag); - kfree(crypto); -} - -static int enc_dec_message(struct snp_guest_crypto *crypto, struct snp_gue= st_msg *msg, - u8 *src_buf, u8 *dst_buf, size_t len, bool enc) -{ - struct snp_guest_msg_hdr *hdr =3D &msg->hdr; - struct scatterlist src[3], dst[3]; - DECLARE_CRYPTO_WAIT(wait); - struct aead_request *req; - int ret; - - req =3D aead_request_alloc(crypto->tfm, GFP_KERNEL); - if (!req) - return -ENOMEM; - - /* - * AEAD memory operations: - * +------ AAD -------+------- DATA -----+---- AUTHTAG----+ - * | msg header | plaintext | hdr->authtag | - * | bytes 30h - 5Fh | or | | - * | | cipher | | - * +------------------+------------------+----------------+ - */ - sg_init_table(src, 3); - sg_set_buf(&src[0], &hdr->algo, AAD_LEN); - sg_set_buf(&src[1], src_buf, hdr->msg_sz); - sg_set_buf(&src[2], hdr->authtag, crypto->a_len); - - sg_init_table(dst, 3); - sg_set_buf(&dst[0], &hdr->algo, AAD_LEN); - sg_set_buf(&dst[1], dst_buf, hdr->msg_sz); - sg_set_buf(&dst[2], hdr->authtag, crypto->a_len); - - aead_request_set_ad(req, AAD_LEN); - aead_request_set_tfm(req, crypto->tfm); - aead_request_set_callback(req, 0, crypto_req_done, &wait); - - aead_request_set_crypt(req, src, dst, len, crypto->iv); - ret =3D crypto_wait_req(enc ? crypto_aead_encrypt(req) : crypto_aead_decr= ypt(req), &wait); - - aead_request_free(req); - return ret; -} - -static int __enc_payload(struct snp_guest_dev *snp_dev, struct snp_guest_m= sg *msg, +static int __enc_payload(struct aesgcm_ctx *ctx, struct snp_guest_msg *msg, void *plaintext, size_t len) { - struct snp_guest_crypto *crypto =3D snp_dev->crypto; struct snp_guest_msg_hdr *hdr =3D &msg->hdr; + u8 iv[GCM_AES_IV_SIZE] =3D {}; =20 - memset(crypto->iv, 0, crypto->iv_len); - memcpy(crypto->iv, &hdr->msg_seqno, sizeof(hdr->msg_seqno)); + if (WARN_ON((hdr->msg_sz + ctx->authsize) > sizeof(msg->payload))) + return -EBADMSG; =20 - return enc_dec_message(crypto, msg, plaintext, msg->payload, len, true); + memcpy(iv, &hdr->msg_seqno, sizeof(hdr->msg_seqno)); + aesgcm_encrypt(ctx, msg->payload, plaintext, len, &hdr->algo, AAD_LEN, + iv, hdr->authtag); + return 0; } =20 -static int dec_payload(struct snp_guest_dev *snp_dev, struct snp_guest_msg= *msg, +static int dec_payload(struct aesgcm_ctx *ctx, struct snp_guest_msg *msg, void *plaintext, size_t len) { - struct snp_guest_crypto *crypto =3D snp_dev->crypto; struct snp_guest_msg_hdr *hdr =3D &msg->hdr; + u8 iv[GCM_AES_IV_SIZE] =3D {}; =20 - /* Build IV with response buffer sequence number */ - memset(crypto->iv, 0, crypto->iv_len); - memcpy(crypto->iv, &hdr->msg_seqno, sizeof(hdr->msg_seqno)); - - return enc_dec_message(crypto, msg, msg->payload, plaintext, len, false); + memcpy(iv, &hdr->msg_seqno, sizeof(hdr->msg_seqno)); + if (aesgcm_decrypt(ctx, plaintext, msg->payload, len, &hdr->algo, + AAD_LEN, iv, hdr->authtag)) + return 0; + else + return -EBADMSG; } =20 static int verify_and_dec_payload(struct snp_guest_dev *snp_dev, void *pay= load, u32 sz) { - struct snp_guest_crypto *crypto =3D snp_dev->crypto; struct snp_guest_msg *resp =3D &snp_dev->secret_response; struct snp_guest_msg *req =3D &snp_dev->secret_request; struct snp_guest_msg_hdr *req_hdr =3D &req->hdr; struct snp_guest_msg_hdr *resp_hdr =3D &resp->hdr; + struct aesgcm_ctx *ctx =3D snp_dev->ctx; =20 dev_dbg(snp_dev->dev, "response [seqno %lld type %d version %d sz %d]\n", resp_hdr->msg_seqno, resp_hdr->msg_type, resp_hdr->msg_version, resp_hdr= ->msg_sz); @@ -298,11 +225,11 @@ static int verify_and_dec_payload(struct snp_guest_de= v *snp_dev, void *payload, * If the message size is greater than our buffer length then return * an error. */ - if (unlikely((resp_hdr->msg_sz + crypto->a_len) > sz)) + if (unlikely((resp_hdr->msg_sz + ctx->authsize) > sz)) return -EBADMSG; =20 /* Decrypt the payload */ - return dec_payload(snp_dev, resp, payload, resp_hdr->msg_sz + crypto->a_l= en); + return dec_payload(ctx, resp, payload, resp_hdr->msg_sz); } =20 static int enc_payload(struct snp_guest_dev *snp_dev, u64 seqno, int versi= on, u8 type, @@ -329,7 +256,7 @@ static int enc_payload(struct snp_guest_dev *snp_dev, u= 64 seqno, int version, u8 dev_dbg(snp_dev->dev, "request [seqno %lld type %d version %d sz %d]\n", hdr->msg_seqno, hdr->msg_type, hdr->msg_version, hdr->msg_sz); =20 - return __enc_payload(snp_dev, req, payload, sz); + return __enc_payload(snp_dev->ctx, req, payload, sz); } =20 static int __handle_guest_request(struct snp_guest_dev *snp_dev, u64 exit_= code, @@ -472,7 +399,6 @@ static int handle_guest_request(struct snp_guest_dev *s= np_dev, u64 exit_code, =20 static int get_report(struct snp_guest_dev *snp_dev, struct snp_guest_requ= est_ioctl *arg) { - struct snp_guest_crypto *crypto =3D snp_dev->crypto; struct snp_report_resp *resp; struct snp_report_req req; int rc, resp_len; @@ -490,7 +416,7 @@ static int get_report(struct snp_guest_dev *snp_dev, st= ruct snp_guest_request_io * response payload. Make sure that it has enough space to cover the * authtag. */ - resp_len =3D sizeof(resp->data) + crypto->a_len; + resp_len =3D sizeof(resp->data) + get_ctx_authsize(snp_dev); resp =3D kzalloc(resp_len, GFP_KERNEL_ACCOUNT); if (!resp) return -ENOMEM; @@ -511,7 +437,6 @@ static int get_report(struct snp_guest_dev *snp_dev, st= ruct snp_guest_request_io =20 static int get_derived_key(struct snp_guest_dev *snp_dev, struct snp_guest= _request_ioctl *arg) { - struct snp_guest_crypto *crypto =3D snp_dev->crypto; struct snp_derived_key_resp resp =3D {0}; struct snp_derived_key_req req; int rc, resp_len; @@ -528,7 +453,7 @@ static int get_derived_key(struct snp_guest_dev *snp_de= v, struct snp_guest_reque * response payload. Make sure that it has enough space to cover the * authtag. */ - resp_len =3D sizeof(resp.data) + crypto->a_len; + resp_len =3D sizeof(resp.data) + get_ctx_authsize(snp_dev); if (sizeof(buf) < resp_len) return -ENOMEM; =20 @@ -552,7 +477,6 @@ static int get_derived_key(struct snp_guest_dev *snp_de= v, struct snp_guest_reque =20 static int get_ext_report(struct snp_guest_dev *snp_dev, struct snp_guest_= request_ioctl *arg) { - struct snp_guest_crypto *crypto =3D snp_dev->crypto; struct snp_ext_report_req req; struct snp_report_resp *resp; int ret, npages =3D 0, resp_len; @@ -590,7 +514,7 @@ static int get_ext_report(struct snp_guest_dev *snp_dev= , struct snp_guest_reques * response payload. Make sure that it has enough space to cover the * authtag. */ - resp_len =3D sizeof(resp->data) + crypto->a_len; + resp_len =3D sizeof(resp->data) + get_ctx_authsize(snp_dev); resp =3D kzalloc(resp_len, GFP_KERNEL_ACCOUNT); if (!resp) return -ENOMEM; @@ -802,8 +726,8 @@ static int __init sev_guest_probe(struct platform_devic= e *pdev) goto e_free_response; =20 ret =3D -EIO; - snp_dev->crypto =3D init_crypto(snp_dev, snp_dev->vmpck, VMPCK_KEY_LEN); - if (!snp_dev->crypto) + snp_dev->ctx =3D snp_init_crypto(snp_dev->vmpck, VMPCK_KEY_LEN); + if (!snp_dev->ctx) goto e_free_cert_data; =20 misc =3D &snp_dev->misc; @@ -818,11 +742,13 @@ static int __init sev_guest_probe(struct platform_dev= ice *pdev) =20 ret =3D misc_register(misc); if (ret) - goto e_free_cert_data; + goto e_free_ctx; =20 dev_info(dev, "Initialized SEV guest driver (using vmpck_id %d)\n", vmpck= _id); return 0; =20 +e_free_ctx: + kfree(snp_dev->ctx); e_free_cert_data: free_shared_pages(snp_dev->certs_data, SEV_FW_BLOB_MAX_SIZE); e_free_response: @@ -841,7 +767,7 @@ static int __exit sev_guest_remove(struct platform_devi= ce *pdev) free_shared_pages(snp_dev->certs_data, SEV_FW_BLOB_MAX_SIZE); free_shared_pages(snp_dev->response, sizeof(struct snp_guest_msg)); free_shared_pages(snp_dev->request, sizeof(struct snp_guest_msg)); - deinit_crypto(snp_dev->crypto); + kfree(snp_dev->ctx); misc_deregister(&snp_dev->misc); =20 return 0; diff --git a/drivers/virt/coco/sev-guest/sev-guest.h b/drivers/virt/coco/se= v-guest/sev-guest.h index 21bda26fdb95..ceb798a404d6 100644 --- a/drivers/virt/coco/sev-guest/sev-guest.h +++ b/drivers/virt/coco/sev-guest/sev-guest.h @@ -13,6 +13,9 @@ #include =20 #define MAX_AUTHTAG_LEN 32 +#define AUTHTAG_LEN 16 +#define AAD_LEN 48 +#define MSG_HDR_VER 1 =20 /* See SNP spec SNP_GUEST_REQUEST section for the structure */ enum msg_type { --=20 2.34.1