From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-yb1-f181.google.com (mail-yb1-f181.google.com [209.85.219.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9D5AB3002DD for ; Wed, 20 Aug 2025 11:31:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.181 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755689490; cv=none; b=pID/BOCuK/qCKpqNEiMpwvYfpIjF04wDbRsjVLyN4RiWYHemvYThxONhAtVwqbT5AjAAKzJ4gCpdULF3g9xhx+YQv7mBNMHTwZmzMZub8LZn0mO0L2JythPRW0OP5Zr1mfujTjhItFYBjyvJR8aBZIMKRyoaKqzPSO3v6p4nKL8= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755689490; c=relaxed/simple; bh=L3LoxzZ4PROtWS84UwW1svVSY4DgQPd/IdVh/5u4s18=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=PYWiEXHWnJ4g/rHntnXlgsHoUWq1fgSCqCQ8Obesac91a2R+VRAY9qaeoWP8HOC5txgCamu5Z1xWvtgyp4c3QiYDwAgsyubqJyl0lI327oKatNf8RkxuKXXz0ahuf6BTBCLFQgsr+zY+cdPmK0EPBakuXpTNsWVajVA3OKZ4Ddc= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Jx9xrpQ9; arc=none smtp.client-ip=209.85.219.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Jx9xrpQ9" Received: by mail-yb1-f181.google.com with SMTP id 3f1490d57ef6-e94d678e116so2852765276.2 for ; Wed, 20 Aug 2025 04:31:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1755689487; x=1756294287; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=pSdxdAknGMeWd2XIOB9nzII/aKO1TRQ9r3btsivLsPE=; b=Jx9xrpQ9x06V8F5yjUGquGLMdHVi3EUk7HKJoAN61D0ErS3WLsH0gFzvn3GBCWrqOF U3VIfW2DC8hA7PLq+zbUDjLLfEGUN3mn5z/Bkd6DBk49P4i/ZrypR/rM+bEMPjW8wQJ6 3jzbKdNtqfZbcuboxV03k8Vfz27jGt4kKaqg4WKwAVdLqW94m7r9O9A4pJ1b57WsBybp XPkiuk5uKFShpScgP5u7VOBqaKpg1x/nxUgk57vymPOB4l49RXLRboTH6Q5XGRb8Ps5f BQfNzhjFdjHIOECHWtlfVzBi1azy6SPppjlmZEMNZ17JD5b13Gq4BqifY3C9EtGErAmy YFEA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755689487; x=1756294287; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=pSdxdAknGMeWd2XIOB9nzII/aKO1TRQ9r3btsivLsPE=; b=EwQUFrRaZ9J25cnlXNJOO/jRm2X1j2qlcJgjxtN0/vredjWFS40w3ebCLOlbKIXpFn dHYm5daT9SBR55++9Q3Ih+z4fmlX2JNF7I4s9nDKWLHLHxCIKv0gijgG/wWygk4Lv4hS pFoKe/nPDZ+qz+8vybocP+GBQ+6tH8so/i27ouqco9KYVlsPTMjjZ6lD5v5X7XQyq/gQ /KMaSTFIyF4Wzu8nvwxas2q9NrO/Z8EyMPtLoRR/QYkF8Oa0CTefqPoM1/h16DNlOANc 7Sre5MnLv+f3KbYwYwsy6w8R3RZ1V68zA25ZzLrMeuBQN+ctp5QvQpY6t+XyPtgG84DJ Wa3A== X-Forwarded-Encrypted: i=1; AJvYcCW6fITWvD9UrI/KZ4r2zflH4IGMkaMY7Hi9De3cQzNL9uTw/wA2c0d9iFynlKOXRvFM+/fMReM=@vger.kernel.org X-Gm-Message-State: AOJu0Yw9MhwprWNLbvVq87jziMJCUaZukGBFIxWJ/pfBcrct0H4DTLp3 nbPzQSXNEbMOyAe6/e600RqnGfHRVa/1Es3oV1k4OYYqn1BxXlsjg/Oo X-Gm-Gg: ASbGncvzRX06mf3uoPtBP3z5th68lJ/Xg/IDsk5GwVBDIiXFYpncSFfDTVCIlV+/hBL RNxQ8Cuvs4zQq0AB8LVHHD/YMKP5BcZd4Hzxt/0IZqMeaztFqmaUbz9YqZYXJBnjqvGv9NDjzXT 68wDwB6kcgDoIywzWyMmnB/cyEPipz4n8SrSieHbBS7z8LPbbR+JcHAkJprEP797yGvbbDr1RUA DjRMURp8mQaoZQTM0BrUKog1Ket+HXMdmE5vLGSHencHR9g+YwfjH8ZO+UMKvNldcohNIMJtALr qrcq+oqEvikFWjOY9RlaIfBpsOPnkF+rNEghh2SJknHqska5+VmRvY2zdDuvjzrbDqFq86OV5OX ikPfpBSdW0DeDtgaDAWxu X-Google-Smtp-Source: AGHT+IHLt42MQpuaAdEyn8oGilfEqP1SZ9rUjZ/ytFP0Xf9M9pOK+viLzFrH+gCEutY5pstr50UH1A== X-Received: by 2002:a05:690c:f89:b0:71f:9c53:bac6 with SMTP id 00721157ae682-71fb322b56fmr33229317b3.36.1755689487373; Wed, 20 Aug 2025 04:31:27 -0700 (PDT) Received: from localhost ([2a03:2880:25ff:71::]) by smtp.gmail.com with ESMTPSA id 00721157ae682-71e6e058dbasm36004857b3.47.2025.08.20.04.31.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 Aug 2025 04:31:26 -0700 (PDT) From: Daniel Zahka To: Donald Hunter , Jakub Kicinski , "David S. Miller" , Eric Dumazet , Paolo Abeni , Simon Horman , Jonathan Corbet , Andrew Lunn Cc: Saeed Mahameed , Leon Romanovsky , Tariq Toukan , Boris Pismenny , Kuniyuki Iwashima , Willem de Bruijn , David Ahern , Neal Cardwell , Patrisious Haddad , Raed Salem , Jianbo Liu , Dragos Tatulea , Rahul Rameshbabu , Stanislav Fomichev , =?UTF-8?q?Toke=20H=C3=B8iland-J=C3=B8rgensen?= , Alexander Lobakin , Kiran Kella , Jacob Keller , netdev@vger.kernel.org Subject: [PATCH net-next v7 05/19] psp: add op for rotation of device key Date: Wed, 20 Aug 2025 04:31:03 -0700 Message-ID: <20250820113120.992829-6-daniel.zahka@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20250820113120.992829-1-daniel.zahka@gmail.com> References: <20250820113120.992829-1-daniel.zahka@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: Jakub Kicinski Rotating the device key is a key part of the PSP protocol design. Some external daemon needs to do it once a day, or so. Add a netlink op to perform this operation. Add a notification group for informing users that key has been rotated and they should rekey (next rotation will cut them off). Reviewed-by: Willem de Bruijn Signed-off-by: Jakub Kicinski Signed-off-by: Daniel Zahka --- Notes: v6: - use PSP_CMD_KEY_ROTATE_NTF instead of PSP_CMD_KEY_ROTATE as arg to genl_info_init_ntf() v1: - https://lore.kernel.org/netdev/20240510030435.120935-6-kuba@kernel.org/ Documentation/netlink/specs/psp.yaml | 21 +++++++++++++++ include/net/psp/types.h | 5 ++++ include/uapi/linux/psp.h | 3 +++ net/psp/psp-nl-gen.c | 15 +++++++++++ net/psp/psp-nl-gen.h | 2 ++ net/psp/psp_main.c | 3 ++- net/psp/psp_nl.c | 40 ++++++++++++++++++++++++++++ 7 files changed, 88 insertions(+), 1 deletion(-) diff --git a/Documentation/netlink/specs/psp.yaml b/Documentation/netlink/specs/psp.yaml index 706f4baf8764..054cc02b65ad 100644 --- a/Documentation/netlink/specs/psp.yaml +++ b/Documentation/netlink/specs/psp.yaml @@ -88,9 +88,30 @@ operations: notify: dev-get mcgrp: mgmt + - + name: key-rotate + doc: Rotate the device key. + attribute-set: dev + do: + request: + attributes: + - id + reply: + attributes: + - id + pre: psp-device-get-locked + post: psp-device-unlock + - + name: key-rotate-ntf + doc: Notification about device key getting rotated. + notify: key-rotate + mcgrp: use + mcast-groups: list: - name: mgmt + - + name: use ... diff --git a/include/net/psp/types.h b/include/net/psp/types.h index 4922fc8d42fd..66327fa80c92 100644 --- a/include/net/psp/types.h +++ b/include/net/psp/types.h @@ -102,6 +102,11 @@ struct psp_dev_ops { */ int (*set_config)(struct psp_dev *psd, struct psp_dev_config *conf, struct netlink_ext_ack *extack); + + /** + * @key_rotate: rotate the device key + */ + int (*key_rotate)(struct psp_dev *psd, struct netlink_ext_ack *extack); }; #endif /* __NET_PSP_H */ diff --git a/include/uapi/linux/psp.h b/include/uapi/linux/psp.h index 4a404f085190..cbfbf3f0f364 100644 --- a/include/uapi/linux/psp.h +++ b/include/uapi/linux/psp.h @@ -32,11 +32,14 @@ enum { PSP_CMD_DEV_DEL_NTF, PSP_CMD_DEV_SET, PSP_CMD_DEV_CHANGE_NTF, + PSP_CMD_KEY_ROTATE, + PSP_CMD_KEY_ROTATE_NTF, __PSP_CMD_MAX, PSP_CMD_MAX = (__PSP_CMD_MAX - 1) }; #define PSP_MCGRP_MGMT "mgmt" +#define PSP_MCGRP_USE "use" #endif /* _UAPI_LINUX_PSP_H */ diff --git a/net/psp/psp-nl-gen.c b/net/psp/psp-nl-gen.c index 859712e7c2c1..7f49577ac72f 100644 --- a/net/psp/psp-nl-gen.c +++ b/net/psp/psp-nl-gen.c @@ -21,6 +21,11 @@ static const struct nla_policy psp_dev_set_nl_policy[PSP_A_DEV_PSP_VERSIONS_ENA [PSP_A_DEV_PSP_VERSIONS_ENA] = NLA_POLICY_MASK(NLA_U32, 0xf), }; +/* PSP_CMD_KEY_ROTATE - do */ +static const struct nla_policy psp_key_rotate_nl_policy[PSP_A_DEV_ID + 1] = { + [PSP_A_DEV_ID] = NLA_POLICY_MIN(NLA_U32, 1), +}; + /* Ops table for psp */ static const struct genl_split_ops psp_nl_ops[] = { { @@ -46,10 +51,20 @@ static const struct genl_split_ops psp_nl_ops[] = { .maxattr = PSP_A_DEV_PSP_VERSIONS_ENA, .flags = GENL_CMD_CAP_DO, }, + { + .cmd = PSP_CMD_KEY_ROTATE, + .pre_doit = psp_device_get_locked, + .doit = psp_nl_key_rotate_doit, + .post_doit = psp_device_unlock, + .policy = psp_key_rotate_nl_policy, + .maxattr = PSP_A_DEV_ID, + .flags = GENL_CMD_CAP_DO, + }, }; static const struct genl_multicast_group psp_nl_mcgrps[] = { [PSP_NLGRP_MGMT] = { "mgmt", }, + [PSP_NLGRP_USE] = { "use", }, }; struct genl_family psp_nl_family __ro_after_init = { diff --git a/net/psp/psp-nl-gen.h b/net/psp/psp-nl-gen.h index a099686cab5d..00a2d4ec59e4 100644 --- a/net/psp/psp-nl-gen.h +++ b/net/psp/psp-nl-gen.h @@ -20,9 +20,11 @@ psp_device_unlock(const struct genl_split_ops *ops, struct sk_buff *skb, int psp_nl_dev_get_doit(struct sk_buff *skb, struct genl_info *info); int psp_nl_dev_get_dumpit(struct sk_buff *skb, struct netlink_callback *cb); int psp_nl_dev_set_doit(struct sk_buff *skb, struct genl_info *info); +int psp_nl_key_rotate_doit(struct sk_buff *skb, struct genl_info *info); enum { PSP_NLGRP_MGMT, + PSP_NLGRP_USE, }; extern struct genl_family psp_nl_family; diff --git a/net/psp/psp_main.c b/net/psp/psp_main.c index e09499b7b14a..f60155493afc 100644 --- a/net/psp/psp_main.c +++ b/net/psp/psp_main.c @@ -54,7 +54,8 @@ psp_dev_create(struct net_device *netdev, int err; if (WARN_ON(!psd_caps->versions || - !psd_ops->set_config)) + !psd_ops->set_config || + !psd_ops->key_rotate)) return ERR_PTR(-EINVAL); psd = kzalloc(sizeof(*psd), GFP_KERNEL); diff --git a/net/psp/psp_nl.c b/net/psp/psp_nl.c index fda5ce800f82..75f2702c1029 100644 --- a/net/psp/psp_nl.c +++ b/net/psp/psp_nl.c @@ -221,3 +221,43 @@ int psp_nl_dev_set_doit(struct sk_buff *skb, struct genl_info *info) nlmsg_free(rsp); return err; } + +int psp_nl_key_rotate_doit(struct sk_buff *skb, struct genl_info *info) +{ + struct psp_dev *psd = info->user_ptr[0]; + struct genl_info ntf_info; + struct sk_buff *ntf, *rsp; + int err; + + rsp = psp_nl_reply_new(info); + if (!rsp) + return -ENOMEM; + + genl_info_init_ntf(&ntf_info, &psp_nl_family, PSP_CMD_KEY_ROTATE_NTF); + ntf = psp_nl_reply_new(&ntf_info); + if (!ntf) { + err = -ENOMEM; + goto err_free_rsp; + } + + if (nla_put_u32(rsp, PSP_A_DEV_ID, psd->id) || + nla_put_u32(ntf, PSP_A_DEV_ID, psd->id)) { + err = -EMSGSIZE; + goto err_free_ntf; + } + + err = psd->ops->key_rotate(psd, info->extack); + if (err) + goto err_free_ntf; + + nlmsg_end(ntf, (struct nlmsghdr *)ntf->data); + genlmsg_multicast_netns(&psp_nl_family, dev_net(psd->main_netdev), ntf, + 0, PSP_NLGRP_USE, GFP_KERNEL); + return psp_nl_reply_send(rsp, info); + +err_free_ntf: + nlmsg_free(ntf); +err_free_rsp: + nlmsg_free(rsp); + return err; +} -- 2.47.3