Received: by 2002:ab2:3319:0:b0:1ef:7a0f:c32d with SMTP id i25csp96420lqc; Thu, 7 Mar 2024 11:17:49 -0800 (PST) X-Forwarded-Encrypted: i=3; AJvYcCW1WYcjrzB5zAhywf7fz0YlqwrEN7pMKONFVRc9CdbGaxqmyTn4ckq09A9e/bwu1MNYX1itoAHKmOrCB5LTKR1PmdJYAGQuL/pdtd/+CA== X-Google-Smtp-Source: AGHT+IFmzvWI8neTIMGZeSaPsxER89/OC+UBqs+yMdwP34uPv4Ey9S1YHVH094N6mH8q2dC9hjw/ X-Received: by 2002:a05:6830:154b:b0:6e5:78c:45d2 with SMTP id l11-20020a056830154b00b006e5078c45d2mr3948143otp.8.1709839069762; Thu, 07 Mar 2024 11:17:49 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1709839069; cv=pass; d=google.com; s=arc-20160816; b=p9hE6BubRpqwvEo3Xi9o5qzIqnkummwVuYXlq4KelBrfabGvR0z0aAOdqUpLYDkoEC SVDT4RIR+fKWnDa+khqbSYEl1to2hfvwqFmkeqe52T8QYYTA2n2oCmUI0ahrpmbIM1wj Do4tSav6RyISIUgXxKOWIhY+/Mm3KRBATbFA8qG+kcvipzyREoFC7jlod/hOgiAlxyzm tSBFUt3NUfTNR1JmEA4PphGoXZOFZyQV187cPHz2mkTfVCpbYlDiQ1Puq3wZi7k1XxCy curisMx5BYb7+dvDNb6sdMWnB1eMmnHBAq8aAw03ZSpccpm52qsd64ktyfOMHiwUkiD3 Ixgw== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=in-reply-to:references:to:from:subject:cc:message-id:date :content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:dkim-signature; bh=dUTLfYVKE9GDpJKctnOgC7iCyp8f2y2pg3yfizCZbos=; fh=nKAep/XDSMl8dj3CYRaqsln016/c4yXm8P0CkNLe6Pk=; b=Qgxjbh5XMZFS0sbaM/mRA7W5/n6Y/MPkTOh7xydeG2FDTWKCc92z1g1dLTI6s383O5 L+9ifmUT+0MpLp2X4n8c7lezi2jwo4nx+0rdKlhcFKAq4tXIwKL7XrfmAv9kh1lWOhKC 4aG1A2I6ePhoTSyt06fQ/UeDRMy2bbOBc1mnsUDHjUPE32XBFEPJyddxH+nfETCkDAbv 8H90DdBWsTIvZ0ePYbyEPBxTh8DZuahm4QMCHbYGTtsqecdKbSAqwxpQrogKss/WzkLF ee0gzIknJAbq6DSpIQjomlJBHCpLJMIUYlS0F4BfASyY0yLezg3l5GiK8Zrn0LeIgJSF x/xA==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=RYnauVhQ; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-crypto+bounces-2568-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.48.161 as permitted sender) smtp.mailfrom="linux-crypto+bounces-2568-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from sy.mirrors.kernel.org (sy.mirrors.kernel.org. [147.75.48.161]) by mx.google.com with ESMTPS id c127-20020a633585000000b005cfd6ba16f7si14958094pga.647.2024.03.07.11.17.49 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 Mar 2024 11:17:49 -0800 (PST) Received-SPF: pass (google.com: domain of linux-crypto+bounces-2568-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.48.161 as permitted sender) client-ip=147.75.48.161; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=RYnauVhQ; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-crypto+bounces-2568-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.48.161 as permitted sender) smtp.mailfrom="linux-crypto+bounces-2568-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sy.mirrors.kernel.org (Postfix) with ESMTPS id 17287B21568 for ; Thu, 7 Mar 2024 19:17:46 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id DAD1B136650; Thu, 7 Mar 2024 19:17:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="RYnauVhQ" X-Original-To: linux-crypto@vger.kernel.org Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 585111332B3; Thu, 7 Mar 2024 19:17:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709839057; cv=none; b=tLcFULPT2BnlLp/tJIoUf1ARdKreqJjY2bEVk4HAb+V+ihlqNm4E2r/0K8lKbWY8uDoPyeo9kzR7Xzc1ZT0jqzXwe8KrLDMRtQM4BQ0vvTKZz5zXzoRlNX+QCy+jkOQ+W2406VObP9mz7Q9xpCD9WS2X2pOjtGBK9cIjaDa2l+o= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709839057; c=relaxed/simple; bh=i+8eL8XLkM2MtFkMzM2y/u9fNAxJ18G6R9oWqeOj5I4=; h=Mime-Version:Content-Type:Date:Message-Id:Cc:Subject:From:To: References:In-Reply-To; b=UW36tPyJa+Gjgz82ZeGuVQF8hMulkFZh9Pyrzy9SspZkUZkJ/JkNJtxatFSSTHy+YzcFBRQAtjifMK5mm6dsarYgmv25jENAueFug3g1J8ASL5JhSzNBMqE+YnKYXFAYsIM/o//qOlhdcSsT/5zyfREyOpddFquntbcYEe+jxoc= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=RYnauVhQ; arc=none smtp.client-ip=10.30.226.201 Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0E94EC433F1; Thu, 7 Mar 2024 19:17:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1709839056; bh=i+8eL8XLkM2MtFkMzM2y/u9fNAxJ18G6R9oWqeOj5I4=; h=Date:Cc:Subject:From:To:References:In-Reply-To:From; b=RYnauVhQUlNpULH43uQl8F8oGb7hqwZb/rVI9JWckXPB4eFUXxfzcw/lUVQJvQUGt FBpRAAn1znvwqpAx4/nF2yTc96SWyqabtSsbuZyVBwXUXOPrxvgPvWAtt8dtP5OTlJ ymMAyzgSoxNZxlWAqnkLxa5Nl+D40HnrrLcHUjMeN0VDQGXlVQH3IaV4QyPFTjq477 UH4FqVDYfSNv0ksRf18bZj3VZhgonaAoai2nt0PXRBTHXQFIC9RR48JWQYIffs3isA +6iPGwmA+BhPd/XjplT+ZW6WK1rC2D5dKExobYMs0XOqD48dOQprHFvLpODTAQB6RW geiD2MT/grmoQ== Precedence: bulk X-Mailing-List: linux-crypto@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=UTF-8 Date: Thu, 07 Mar 2024 21:17:28 +0200 Message-Id: Cc: "Shawn Guo" , "Jonathan Corbet" , "Sascha Hauer" , "Pengutronix Kernel Team" , "Fabio Estevam" , "NXP Linux Team" , "Ahmad Fatoum" , "sigma star Kernel Team" , "David Howells" , "Li Yang" , "Paul Moore" , "James Morris" , "Serge E. Hallyn" , "Paul E. McKenney" , "Randy Dunlap" , "Catalin Marinas" , "Rafael J. Wysocki" , "Tejun Heo" , "Steven Rostedt (Google)" , , , , , , , , , "Richard Weinberger" , "David Oberhollenzer" Subject: Re: [PATCH v6 1/6] crypto: mxs-dcp: Add support for hardware-bound keys From: "Jarkko Sakkinen" To: "David Gstir" , "Mimi Zohar" , "James Bottomley" , "Herbert Xu" , "David S. Miller" X-Mailer: aerc 0.17.0 References: <20240307153842.80033-1-david@sigma-star.at> <20240307153842.80033-2-david@sigma-star.at> In-Reply-To: <20240307153842.80033-2-david@sigma-star.at> On Thu Mar 7, 2024 at 5:38 PM EET, David Gstir wrote: > DCP (Data Co-Processor) is able to derive private keys for a fused > random seed, which can be referenced by handle but not accessed by > the CPU. Similarly, DCP is able to store arbitrary keys in four > dedicated key slots located in its secure memory area (internal SRAM). > These keys can be used to perform AES encryption. > > Expose these derived keys and key slots through the crypto API via their > handle. The main purpose is to add DCP-backed trusted keys. Other > use cases are possible too (see similar existing paes implementations), > but these should carefully be evaluated as e.g. enabling AF_ALG will > give userspace full access to use keys. In scenarios with untrustworthy > userspace, this will enable en-/decryption oracles. > > Co-developed-by: Richard Weinberger > Signed-off-by: Richard Weinberger > Co-developed-by: David Oberhollenzer > Signed-off-by: David Oberhollenzer > Signed-off-by: David Gstir > Acked-by: Herbert Xu > --- > drivers/crypto/mxs-dcp.c | 104 ++++++++++++++++++++++++++++++++++----- > include/soc/fsl/dcp.h | 20 ++++++++ > 2 files changed, 113 insertions(+), 11 deletions(-) > create mode 100644 include/soc/fsl/dcp.h > > diff --git a/drivers/crypto/mxs-dcp.c b/drivers/crypto/mxs-dcp.c > index 2b3ebe0db3a6..057d73c370b7 100644 > --- a/drivers/crypto/mxs-dcp.c > +++ b/drivers/crypto/mxs-dcp.c > @@ -15,6 +15,7 @@ > #include > #include > #include > +#include > =20 > #include > #include > @@ -101,6 +102,7 @@ struct dcp_async_ctx { > struct crypto_skcipher *fallback; > unsigned int key_len; > uint8_t key[AES_KEYSIZE_128]; > + bool key_referenced; > }; > =20 > struct dcp_aes_req_ctx { > @@ -155,6 +157,7 @@ static struct dcp *global_sdcp; > #define MXS_DCP_CONTROL0_HASH_TERM (1 << 13) > #define MXS_DCP_CONTROL0_HASH_INIT (1 << 12) > #define MXS_DCP_CONTROL0_PAYLOAD_KEY (1 << 11) > +#define MXS_DCP_CONTROL0_OTP_KEY (1 << 10) > #define MXS_DCP_CONTROL0_CIPHER_ENCRYPT (1 << 8) > #define MXS_DCP_CONTROL0_CIPHER_INIT (1 << 9) > #define MXS_DCP_CONTROL0_ENABLE_HASH (1 << 6) > @@ -168,6 +171,8 @@ static struct dcp *global_sdcp; > #define MXS_DCP_CONTROL1_CIPHER_MODE_ECB (0 << 4) > #define MXS_DCP_CONTROL1_CIPHER_SELECT_AES128 (0 << 0) > =20 > +#define MXS_DCP_CONTROL1_KEY_SELECT_SHIFT 8 > + > static int mxs_dcp_start_dma(struct dcp_async_ctx *actx) > { > int dma_err; > @@ -224,13 +229,16 @@ static int mxs_dcp_run_aes(struct dcp_async_ctx *ac= tx, > struct dcp *sdcp =3D global_sdcp; > struct dcp_dma_desc *desc =3D &sdcp->coh->desc[actx->chan]; > struct dcp_aes_req_ctx *rctx =3D skcipher_request_ctx(req); > + bool key_referenced =3D actx->key_referenced; > int ret; > =20 > - key_phys =3D dma_map_single(sdcp->dev, sdcp->coh->aes_key, > - 2 * AES_KEYSIZE_128, DMA_TO_DEVICE); > - ret =3D dma_mapping_error(sdcp->dev, key_phys); > - if (ret) > - return ret; > + if (!key_referenced) { > + key_phys =3D dma_map_single(sdcp->dev, sdcp->coh->aes_key, > + 2 * AES_KEYSIZE_128, DMA_TO_DEVICE); > + ret =3D dma_mapping_error(sdcp->dev, key_phys); > + if (ret) > + return ret; > + } > =20 > src_phys =3D dma_map_single(sdcp->dev, sdcp->coh->aes_in_buf, > DCP_BUF_SZ, DMA_TO_DEVICE); > @@ -255,8 +263,12 @@ static int mxs_dcp_run_aes(struct dcp_async_ctx *act= x, > MXS_DCP_CONTROL0_INTERRUPT | > MXS_DCP_CONTROL0_ENABLE_CIPHER; > =20 > - /* Payload contains the key. */ > - desc->control0 |=3D MXS_DCP_CONTROL0_PAYLOAD_KEY; > + if (key_referenced) > + /* Set OTP key bit to select the key via KEY_SELECT. */ > + desc->control0 |=3D MXS_DCP_CONTROL0_OTP_KEY; > + else > + /* Payload contains the key. */ > + desc->control0 |=3D MXS_DCP_CONTROL0_PAYLOAD_KEY; > =20 > if (rctx->enc) > desc->control0 |=3D MXS_DCP_CONTROL0_CIPHER_ENCRYPT; > @@ -270,6 +282,9 @@ static int mxs_dcp_run_aes(struct dcp_async_ctx *actx= , > else > desc->control1 |=3D MXS_DCP_CONTROL1_CIPHER_MODE_CBC; > =20 > + if (key_referenced) > + desc->control1 |=3D sdcp->coh->aes_key[0] << MXS_DCP_CONTROL1_KEY_SELE= CT_SHIFT; > + > desc->next_cmd_addr =3D 0; > desc->source =3D src_phys; > desc->destination =3D dst_phys; > @@ -284,9 +299,9 @@ static int mxs_dcp_run_aes(struct dcp_async_ctx *actx= , > err_dst: > dma_unmap_single(sdcp->dev, src_phys, DCP_BUF_SZ, DMA_TO_DEVICE); > err_src: > - dma_unmap_single(sdcp->dev, key_phys, 2 * AES_KEYSIZE_128, > - DMA_TO_DEVICE); > - > + if (!key_referenced) > + dma_unmap_single(sdcp->dev, key_phys, 2 * AES_KEYSIZE_128, > + DMA_TO_DEVICE); > return ret; > } > =20 > @@ -453,7 +468,7 @@ static int mxs_dcp_aes_enqueue(struct skcipher_reques= t *req, int enc, int ecb) > struct dcp_aes_req_ctx *rctx =3D skcipher_request_ctx(req); > int ret; > =20 > - if (unlikely(actx->key_len !=3D AES_KEYSIZE_128)) > + if (unlikely(actx->key_len !=3D AES_KEYSIZE_128 && !actx->key_reference= d)) > return mxs_dcp_block_fallback(req, enc); > =20 > rctx->enc =3D enc; > @@ -500,6 +515,7 @@ static int mxs_dcp_aes_setkey(struct crypto_skcipher = *tfm, const u8 *key, > * there can still be an operation in progress. > */ > actx->key_len =3D len; > + actx->key_referenced =3D false; > if (len =3D=3D AES_KEYSIZE_128) { > memcpy(actx->key, key, len); > return 0; > @@ -516,6 +532,32 @@ static int mxs_dcp_aes_setkey(struct crypto_skcipher= *tfm, const u8 *key, > return crypto_skcipher_setkey(actx->fallback, key, len); > } > =20 > +static int mxs_dcp_aes_setrefkey(struct crypto_skcipher *tfm, const u8 *= key, > + unsigned int len) > +{ > + struct dcp_async_ctx *actx =3D crypto_skcipher_ctx(tfm); > + > + if (len !=3D DCP_PAES_KEYSIZE) > + return -EINVAL; > + > + switch (key[0]) { > + case DCP_PAES_KEY_SLOT0: > + case DCP_PAES_KEY_SLOT1: > + case DCP_PAES_KEY_SLOT2: > + case DCP_PAES_KEY_SLOT3: > + case DCP_PAES_KEY_UNIQUE: > + case DCP_PAES_KEY_OTP: > + memcpy(actx->key, key, len); > + actx->key_len =3D len; > + actx->key_referenced =3D true; > + break; > + default: > + return -EINVAL; > + } > + > + return 0; > +} > + > static int mxs_dcp_aes_fallback_init_tfm(struct crypto_skcipher *tfm) > { > const char *name =3D crypto_tfm_alg_name(crypto_skcipher_tfm(tfm)); > @@ -539,6 +581,13 @@ static void mxs_dcp_aes_fallback_exit_tfm(struct cry= pto_skcipher *tfm) > crypto_free_skcipher(actx->fallback); > } > =20 > +static int mxs_dcp_paes_init_tfm(struct crypto_skcipher *tfm) > +{ > + crypto_skcipher_set_reqsize(tfm, sizeof(struct dcp_aes_req_ctx)); > + > + return 0; > +} > + > /* > * Hashing (SHA1/SHA256) > */ > @@ -889,6 +938,39 @@ static struct skcipher_alg dcp_aes_algs[] =3D { > .ivsize =3D AES_BLOCK_SIZE, > .init =3D mxs_dcp_aes_fallback_init_tfm, > .exit =3D mxs_dcp_aes_fallback_exit_tfm, > + }, { > + .base.cra_name =3D "ecb(paes)", > + .base.cra_driver_name =3D "ecb-paes-dcp", > + .base.cra_priority =3D 401, > + .base.cra_alignmask =3D 15, > + .base.cra_flags =3D CRYPTO_ALG_ASYNC | CRYPTO_ALG_INTERNAL, > + .base.cra_blocksize =3D AES_BLOCK_SIZE, > + .base.cra_ctxsize =3D sizeof(struct dcp_async_ctx), > + .base.cra_module =3D THIS_MODULE, > + > + .min_keysize =3D DCP_PAES_KEYSIZE, > + .max_keysize =3D DCP_PAES_KEYSIZE, > + .setkey =3D mxs_dcp_aes_setrefkey, > + .encrypt =3D mxs_dcp_aes_ecb_encrypt, > + .decrypt =3D mxs_dcp_aes_ecb_decrypt, > + .init =3D mxs_dcp_paes_init_tfm, > + }, { > + .base.cra_name =3D "cbc(paes)", > + .base.cra_driver_name =3D "cbc-paes-dcp", > + .base.cra_priority =3D 401, > + .base.cra_alignmask =3D 15, > + .base.cra_flags =3D CRYPTO_ALG_ASYNC | CRYPTO_ALG_INTERNAL, > + .base.cra_blocksize =3D AES_BLOCK_SIZE, > + .base.cra_ctxsize =3D sizeof(struct dcp_async_ctx), > + .base.cra_module =3D THIS_MODULE, > + > + .min_keysize =3D DCP_PAES_KEYSIZE, > + .max_keysize =3D DCP_PAES_KEYSIZE, > + .setkey =3D mxs_dcp_aes_setrefkey, > + .encrypt =3D mxs_dcp_aes_cbc_encrypt, > + .decrypt =3D mxs_dcp_aes_cbc_decrypt, > + .ivsize =3D AES_BLOCK_SIZE, > + .init =3D mxs_dcp_paes_init_tfm, > }, > }; > =20 > diff --git a/include/soc/fsl/dcp.h b/include/soc/fsl/dcp.h > new file mode 100644 > index 000000000000..3ec335d8ca8b > --- /dev/null > +++ b/include/soc/fsl/dcp.h > @@ -0,0 +1,20 @@ > +/* SPDX-License-Identifier: GPL-2.0-only */ > +/* > + * Copyright (C) 2021 sigma star gmbh > + * > + * Specifies paes key slot handles for NXP's DCP (Data Co-Processor) to = be used > + * with the crypto_skcipher_setkey(). > + */ > + > +#ifndef MXS_DCP_H > +#define MXS_DCP_H > + > +#define DCP_PAES_KEYSIZE 1 > +#define DCP_PAES_KEY_SLOT0 0x00 > +#define DCP_PAES_KEY_SLOT1 0x01 > +#define DCP_PAES_KEY_SLOT2 0x02 > +#define DCP_PAES_KEY_SLOT3 0x03 > +#define DCP_PAES_KEY_UNIQUE 0xfe > +#define DCP_PAES_KEY_OTP 0xff > + > +#endif /* MXS_DCP_H */ Looks to good enough to me: Reviewed-by: Jarkko Sakkinen BR, Jarkko