1 /* SPDX-License-Identifier: GPL-2.0 */
3 * Kernelspace interface to the pkey device driver
5 * Copyright IBM Corp. 2016
7 * Author: Harald Freudenberger <freude@de.ibm.com>
14 #include <linux/ioctl.h>
15 #include <linux/types.h>
16 #include <uapi/asm/pkey.h>
19 * Generate (AES) random secure key.
20 * @param cardnr may be -1 (use default card)
21 * @param domain may be -1 (use default domain)
22 * @param keytype one of the PKEY_KEYTYPE values
23 * @param seckey pointer to buffer receiving the secure key
24 * @return 0 on success, negative errno value on failure
26 int pkey_genseckey(__u16 cardnr
, __u16 domain
,
27 __u32 keytype
, struct pkey_seckey
*seckey
);
30 * Generate (AES) secure key with given key value.
31 * @param cardnr may be -1 (use default card)
32 * @param domain may be -1 (use default domain)
33 * @param keytype one of the PKEY_KEYTYPE values
34 * @param clrkey pointer to buffer with clear key data
35 * @param seckey pointer to buffer receiving the secure key
36 * @return 0 on success, negative errno value on failure
38 int pkey_clr2seckey(__u16 cardnr
, __u16 domain
, __u32 keytype
,
39 const struct pkey_clrkey
*clrkey
,
40 struct pkey_seckey
*seckey
);
43 * Derive (AES) proteced key from the (AES) secure key blob.
44 * @param cardnr may be -1 (use default card)
45 * @param domain may be -1 (use default domain)
46 * @param seckey pointer to buffer with the input secure key
47 * @param protkey pointer to buffer receiving the protected key and
48 * additional info (type, length)
49 * @return 0 on success, negative errno value on failure
51 int pkey_sec2protkey(__u16 cardnr
, __u16 domain
,
52 const struct pkey_seckey
*seckey
,
53 struct pkey_protkey
*protkey
);
56 * Derive (AES) protected key from a given clear key value.
57 * @param keytype one of the PKEY_KEYTYPE values
58 * @param clrkey pointer to buffer with clear key data
59 * @param protkey pointer to buffer receiving the protected key and
60 * additional info (type, length)
61 * @return 0 on success, negative errno value on failure
63 int pkey_clr2protkey(__u32 keytype
,
64 const struct pkey_clrkey
*clrkey
,
65 struct pkey_protkey
*protkey
);
68 * Search for a matching crypto card based on the Master Key
69 * Verification Pattern provided inside a secure key.
70 * @param seckey pointer to buffer with the input secure key
71 * @param cardnr pointer to cardnr, receives the card number on success
72 * @param domain pointer to domain, receives the domain number on success
73 * @param verify if set, always verify by fetching verification pattern
75 * @return 0 on success, negative errno value on failure. If no card could be
76 * found, -ENODEV is returned.
78 int pkey_findcard(const struct pkey_seckey
*seckey
,
79 __u16
*cardnr
, __u16
*domain
, int verify
);
82 * Find card and transform secure key to protected key.
83 * @param seckey pointer to buffer with the input secure key
84 * @param protkey pointer to buffer receiving the protected key and
85 * additional info (type, length)
86 * @return 0 on success, negative errno value on failure
88 int pkey_skey2pkey(const struct pkey_seckey
*seckey
,
89 struct pkey_protkey
*protkey
);
92 * Verify the given secure key for being able to be useable with
93 * the pkey module. Check for correct key type and check for having at
94 * least one crypto card being able to handle this key (master key
95 * or old master key verification pattern matches).
96 * Return some info about the key: keysize in bits, keytype (currently
97 * only AES), flag if key is wrapped with an old MKVP.
98 * @param seckey pointer to buffer with the input secure key
99 * @param pcardnr pointer to cardnr, receives the card number on success
100 * @param pdomain pointer to domain, receives the domain number on success
101 * @param pkeysize pointer to keysize, receives the bitsize of the key
102 * @param pattributes pointer to attributes, receives additional info
103 * PKEY_VERIFY_ATTR_AES if the key is an AES key
104 * PKEY_VERIFY_ATTR_OLD_MKVP if key has old mkvp stored in
105 * @return 0 on success, negative errno value on failure. If no card could
106 * be found which is able to handle this key, -ENODEV is returned.
108 int pkey_verifykey(const struct pkey_seckey
*seckey
,
109 u16
*pcardnr
, u16
*pdomain
,
110 u16
*pkeysize
, u32
*pattributes
);
113 * In-kernel API: Generate (AES) random protected key.
114 * @param keytype one of the PKEY_KEYTYPE values
115 * @param protkey pointer to buffer receiving the protected key
116 * @return 0 on success, negative errno value on failure
118 int pkey_genprotkey(__u32 keytype
, struct pkey_protkey
*protkey
);
121 * In-kernel API: Verify an (AES) protected key.
122 * @param protkey pointer to buffer containing the protected key to verify
123 * @return 0 on success, negative errno value on failure. In case the protected
124 * key is not valid -EKEYREJECTED is returned
126 int pkey_verifyprotkey(const struct pkey_protkey
*protkey
);
129 * In-kernel API: Transform an key blob (of any type) into a protected key.
130 * @param key pointer to a buffer containing the key blob
131 * @param keylen size of the key blob in bytes
132 * @param protkey pointer to buffer receiving the protected key
133 * @return 0 on success, negative errno value on failure
135 int pkey_keyblob2pkey(const __u8
*key
, __u32 keylen
,
136 struct pkey_protkey
*protkey
);
138 #endif /* _KAPI_PKEY_H */