Skip to content

Commit

Permalink
crypto: ccp - Add support for setting user ID for dynamic boost control
Browse files Browse the repository at this point in the history
As part of the authentication flow for Dynamic Boost Control, the calling
software will need to send a uid used in all of its future
communications.

Add support for another IOCTL call to let userspace software set this up.

Acked-by: Tom Lendacky <thomas.lendacky@amd.com>
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
  • Loading branch information
Mario Limonciello authored and Herbert Xu committed Jul 20, 2023
1 parent c04cf9e commit d940871
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 0 deletions.
18 changes: 18 additions & 0 deletions drivers/crypto/ccp/dbc.c
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,24 @@ static long dbc_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
goto unlock;
}
break;
case DBCIOCUID:
dbc_dev->mbox->req.header.payload_size = sizeof(dbc_dev->mbox->dbc_set_uid);
if (copy_from_user(&dbc_dev->mbox->dbc_set_uid.user, argp,
sizeof(struct dbc_user_setuid))) {
ret = -EFAULT;
goto unlock;
}

ret = send_dbc_cmd(dbc_dev, PSP_DYNAMIC_BOOST_SET_UID);
if (ret)
goto unlock;

if (copy_to_user(argp, &dbc_dev->mbox->dbc_set_uid.user,
sizeof(struct dbc_user_setuid))) {
ret = -EFAULT;
goto unlock;
}
break;
default:
ret = -EINVAL;

Expand Down
6 changes: 6 additions & 0 deletions drivers/crypto/ccp/dbc.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,15 @@ struct dbc_nonce {
struct dbc_user_nonce user;
} __packed;

struct dbc_set_uid {
struct psp_req_buffer_hdr header;
struct dbc_user_setuid user;
} __packed;

union dbc_buffer {
struct psp_request req;
struct dbc_nonce dbc_nonce;
struct dbc_set_uid dbc_set_uid;
};

void dbc_dev_destroy(struct psp_device *psp);
Expand Down
1 change: 1 addition & 0 deletions include/linux/psp-platform-access.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ enum psp_platform_access_msg {
PSP_CMD_NONE = 0x0,
PSP_I2C_REQ_BUS_CMD = 0x64,
PSP_DYNAMIC_BOOST_GET_NONCE,
PSP_DYNAMIC_BOOST_SET_UID,
};

struct psp_req_buffer_hdr {
Expand Down
20 changes: 20 additions & 0 deletions include/uapi/linux/psp-dbc.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

#define DBC_NONCE_SIZE 16
#define DBC_SIG_SIZE 32
#define DBC_UID_SIZE 16

/**
* struct dbc_user_nonce - Nonce exchange structure (input/output).
Expand All @@ -34,6 +35,16 @@ struct dbc_user_nonce {
__u8 signature[DBC_SIG_SIZE];
} __packed;

/**
* struct dbc_user_setuid - UID exchange structure (input).
* @uid: 16 byte value representing software identity
* @signature: 32 byte signature created by software using a previous nonce
*/
struct dbc_user_setuid {
__u8 uid[DBC_UID_SIZE];
__u8 signature[DBC_SIG_SIZE];
} __packed;

/**
* Dynamic Boost Control (DBC) IOC
*
Expand Down Expand Up @@ -64,4 +75,13 @@ struct dbc_user_nonce {
*/
#define DBCIOCNONCE _IOWR(DBC_IOC_TYPE, 0x1, struct dbc_user_nonce)

/**
* DBCIOCUID - Set the user ID (UID) of a calling process.
* The user ID is 8 bytes long. It must be programmed using a
* 32 byte signature built using the nonce fetched from
* DBCIOCNONCE.
* The UID can only be set once until the system is rebooted.
*/
#define DBCIOCUID _IOW(DBC_IOC_TYPE, 0x2, struct dbc_user_setuid)

#endif /* __PSP_DBC_USER_H__ */

0 comments on commit d940871

Please sign in to comment.