* @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 flag is PKEY_XFLAG_NOMEMALLOC.
+ * 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,
*/
#define PKEY_XFLAG_NOMEMALLOC 0x0001
+/*
+ * Do not accept a clear key token as source for a protected key.
+ */
+#define PKEY_XFLAG_NOCLEARKEY 0x0002
+
#endif /* _KAPI_PKEY_H */
int i, len, rc;
u32 xflags;
+ if (pflags & PKEY_XFLAG_NOCLEARKEY) {
+ PKEY_DBF_ERR("%s clear key but xflag NOCLEARKEY\n", __func__);
+ return -EINVAL;
+ }
+
xflags = pflags & PKEY_XFLAG_NOMEMALLOC ? ZCRYPT_XFLAG_NOMEMALLOC : 0;
/* check keytype, subtype, clrkeylen, keybitsize */
int i, len, rc;
u32 xflags;
+ if (pflags & PKEY_XFLAG_NOCLEARKEY) {
+ PKEY_DBF_ERR("%s clear key but xflag NOCLEARKEY\n", __func__);
+ return -EINVAL;
+ }
+
xflags = pflags & PKEY_XFLAG_NOMEMALLOC ? ZCRYPT_XFLAG_NOMEMALLOC : 0;
/* check keytype, subtype, clrkeylen, keybitsize */
}
static int pckmo_key2protkey(const u8 *key, u32 keylen,
- u8 *protkey, u32 *protkeylen, u32 *protkeytype)
+ u8 *protkey, u32 *protkeylen, u32 *protkeytype,
+ u32 xflags)
{
struct keytoken_header *hdr = (struct keytoken_header *)key;
int rc = -EINVAL;
struct clearkeytoken *t = (struct clearkeytoken *)key;
u32 keysize;
+ if (xflags & PKEY_XFLAG_NOCLEARKEY) {
+ PKEY_DBF_ERR("%s clear key token but xflag NOCLEARKEY\n",
+ __func__);
+ goto out;
+ }
if (keylen < sizeof(*t) ||
keylen < sizeof(*t) + t->len)
goto out;
size_t _nr_apqns,
const u8 *key, u32 keylen,
u8 *protkey, u32 *protkeylen, u32 *keyinfo,
- u32 _xflags __always_unused)
+ u32 xflags)
{
return pckmo_key2protkey(key, keylen,
- protkey, protkeylen, keyinfo);
+ protkey, protkeylen, keyinfo, xflags);
}
static int pkey_pckmo_gen_key(const struct pkey_apqn *_apqns, size_t _nr_apqns,