| /* SPDX-License-Identifier: GPL-2.0 */ | |
| /* | |
| * Kernelspace interface to the pkey device driver | |
| * | |
| * Copyright IBM Corp. 2016, 2023 | |
| * | |
| * Author: Harald Freudenberger <freude@de.ibm.com> | |
| * | |
| */ | |
| #ifndef _KAPI_PKEY_H | |
| #define _KAPI_PKEY_H | |
| #include <linux/ioctl.h> | |
| #include <linux/types.h> | |
| #include <linux/delay.h> | |
| #include <uapi/asm/pkey.h> | |
| /* | |
| * In-kernel API: Transform an key blob (of any type) into a protected key. | |
| * @param key pointer to a buffer containing the key blob | |
| * @param keylen size of the key blob in bytes | |
| * @param protkey pointer to buffer receiving the protected key | |
| * @param xflags additional execution flags (see PKEY_XFLAG_* definitions below) | |
| * As of now the only supported flags are PKEY_XFLAG_NOMEMALLOC | |
| * and PKEY_XFLAG_NOCLEARKEY. | |
| * @return 0 on success, negative errno value on failure | |
| */ | |
| int pkey_key2protkey(const u8 *key, u32 keylen, | |
| u8 *protkey, u32 *protkeylen, u32 *protkeytype, | |
| u32 xflags); | |
| /* | |
| * If this flag is given in the xflags parameter, the pkey implementation | |
| * is not allowed to allocate memory but instead should fall back to use | |
| * preallocated memory or simple fail with -ENOMEM. | |
| * This flag is for protected key derive within a cipher or similar | |
| * which must not allocate memory which would cause io operations - see | |
| * also the CRYPTO_ALG_ALLOCATES_MEMORY flag in crypto.h. | |
| */ | |
| #define PKEY_XFLAG_NOMEMALLOC 0x0001 | |
| /* | |
| * Do not accept a clear key token as source for a protected key. | |
| */ | |
| #define PKEY_XFLAG_NOCLEARKEY 0x0002 | |
| static inline int pkey_handle_expired(void) | |
| { | |
| /* | |
| * Protected key expired due to relocation to another host. The long | |
| * running re-wrap has no asynchronous completion notification, so | |
| * polling is required. Trigger a re-schedule of this request by | |
| * returning -ENOSPC ("hardware queue full") to the crypto engine. | |
| * To avoid immediately re-invocation of this callback, | |
| * tell the scheduler to voluntarily give up the CPU here. | |
| */ | |
| msleep(1); | |
| pr_debug("rescheduling request\n"); | |
| return -ENOSPC; | |
| } | |
| #endif /* _KAPI_PKEY_H */ |