Skip to content

Commit e5a7f7e

Browse files
hfreudehcahca
authored andcommitted
s390/pkey: Provide and pass xflags within pkey and zcrypt layers
Provide and pass the xflag parameter from pkey ioctls through the pkey handler and further down to the implementations (CCA, EP11, PCKMO and UV). So all the code is now prepared and ready to support xflags ("execution flag"). The pkey layer supports the xflag PKEY_XFLAG_NOMEMALLOC: 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. Within the pkey handlers this flag is then to be translated to appropriate zcrypt xflags before any zcrypt related functions are called. So the PKEY_XFLAG_NOMEMALLOC translates to ZCRYPT_XFLAG_NOMEMALLOC - If this flag is set, no memory allocations which may trigger any IO operations are done. The pkey in-kernel pkey API still does not provide this xflag param. That's intended to come with a separate patch which enables this functionality. Signed-off-by: Harald Freudenberger <[email protected]> Reviewed-by: Holger Dengler <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Heiko Carstens <[email protected]>
1 parent a42831f commit e5a7f7e

File tree

13 files changed

+224
-151
lines changed

13 files changed

+224
-151
lines changed

arch/s390/include/asm/pkey.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,14 @@
2525
int pkey_key2protkey(const u8 *key, u32 keylen,
2626
u8 *protkey, u32 *protkeylen, u32 *protkeytype);
2727

28+
/*
29+
* If this flag is given in the xflags parameter, the pkey implementation
30+
* is not allowed to allocate memory but instead should fall back to use
31+
* preallocated memory or simple fail with -ENOMEM.
32+
* This flag is for protected key derive within a cipher or similar
33+
* which must not allocate memory which would cause io operations - see
34+
* also the CRYPTO_ALG_ALLOCATES_MEMORY flag in crypto.h.
35+
*/
36+
#define PKEY_XFLAG_NOMEMALLOC 0x0001
37+
2838
#endif /* _KAPI_PKEY_H */

drivers/s390/crypto/pkey_api.c

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -24,22 +24,23 @@
2424
*/
2525
static int key2protkey(const struct pkey_apqn *apqns, size_t nr_apqns,
2626
const u8 *key, size_t keylen,
27-
u8 *protkey, u32 *protkeylen, u32 *protkeytype)
27+
u8 *protkey, u32 *protkeylen, u32 *protkeytype,
28+
u32 xflags)
2829
{
2930
int rc;
3031

3132
/* try the direct way */
3233
rc = pkey_handler_key_to_protkey(apqns, nr_apqns,
3334
key, keylen,
3435
protkey, protkeylen,
35-
protkeytype);
36+
protkeytype, xflags);
3637

3738
/* if this did not work, try the slowpath way */
3839
if (rc == -ENODEV) {
3940
rc = pkey_handler_slowpath_key_to_protkey(apqns, nr_apqns,
4041
key, keylen,
4142
protkey, protkeylen,
42-
protkeytype);
43+
protkeytype, xflags);
4344
if (rc)
4445
rc = -ENODEV;
4546
}
@@ -55,13 +56,14 @@ int pkey_key2protkey(const u8 *key, u32 keylen,
5556
u8 *protkey, u32 *protkeylen, u32 *protkeytype)
5657
{
5758
int rc;
59+
const u32 xflags = 0;
5860

5961
rc = key2protkey(NULL, 0, key, keylen,
60-
protkey, protkeylen, protkeytype);
62+
protkey, protkeylen, protkeytype, xflags);
6163
if (rc == -ENODEV) {
6264
pkey_handler_request_modules();
6365
rc = key2protkey(NULL, 0, key, keylen,
64-
protkey, protkeylen, protkeytype);
66+
protkey, protkeylen, protkeytype, xflags);
6567
}
6668

6769
return rc;
@@ -103,7 +105,7 @@ static int pkey_ioctl_genseck(struct pkey_genseck __user *ugs)
103105
keybuflen = sizeof(kgs.seckey.seckey);
104106
rc = pkey_handler_gen_key(&apqn, 1,
105107
kgs.keytype, PKEY_TYPE_CCA_DATA, 0, 0,
106-
kgs.seckey.seckey, &keybuflen, NULL);
108+
kgs.seckey.seckey, &keybuflen, NULL, 0);
107109
pr_debug("gen_key()=%d\n", rc);
108110
if (!rc && copy_to_user(ugs, &kgs, sizeof(kgs)))
109111
rc = -EFAULT;
@@ -129,7 +131,7 @@ static int pkey_ioctl_clr2seck(struct pkey_clr2seck __user *ucs)
129131
kcs.keytype, PKEY_TYPE_CCA_DATA, 0, 0,
130132
kcs.clrkey.clrkey,
131133
pkey_keytype_aes_to_size(kcs.keytype),
132-
kcs.seckey.seckey, &keybuflen, NULL);
134+
kcs.seckey.seckey, &keybuflen, NULL, 0);
133135
pr_debug("clr_to_key()=%d\n", rc);
134136
if (!rc && copy_to_user(ucs, &kcs, sizeof(kcs)))
135137
rc = -EFAULT;
@@ -154,7 +156,8 @@ static int pkey_ioctl_sec2protk(struct pkey_sec2protk __user *usp)
154156
ksp.seckey.seckey,
155157
sizeof(ksp.seckey.seckey),
156158
ksp.protkey.protkey,
157-
&ksp.protkey.len, &ksp.protkey.type);
159+
&ksp.protkey.len, &ksp.protkey.type,
160+
0);
158161
pr_debug("key_to_protkey()=%d\n", rc);
159162
if (!rc && copy_to_user(usp, &ksp, sizeof(ksp)))
160163
rc = -EFAULT;
@@ -198,7 +201,7 @@ static int pkey_ioctl_clr2protk(struct pkey_clr2protk __user *ucp)
198201
rc = key2protkey(NULL, 0,
199202
tmpbuf, sizeof(*t) + keylen,
200203
kcp.protkey.protkey,
201-
&kcp.protkey.len, &kcp.protkey.type);
204+
&kcp.protkey.len, &kcp.protkey.type, 0);
202205
pr_debug("key2protkey()=%d\n", rc);
203206

204207
kfree_sensitive(tmpbuf);
@@ -228,12 +231,12 @@ static int pkey_ioctl_findcard(struct pkey_findcard __user *ufc)
228231
rc = pkey_handler_apqns_for_key(kfc.seckey.seckey,
229232
sizeof(kfc.seckey.seckey),
230233
PKEY_FLAGS_MATCH_CUR_MKVP,
231-
apqns, &nr_apqns);
234+
apqns, &nr_apqns, 0);
232235
if (rc == -ENODEV)
233236
rc = pkey_handler_apqns_for_key(kfc.seckey.seckey,
234237
sizeof(kfc.seckey.seckey),
235238
PKEY_FLAGS_MATCH_ALT_MKVP,
236-
apqns, &nr_apqns);
239+
apqns, &nr_apqns, 0);
237240
pr_debug("apqns_for_key()=%d\n", rc);
238241
if (rc) {
239242
kfree(apqns);
@@ -262,7 +265,7 @@ static int pkey_ioctl_skey2pkey(struct pkey_skey2pkey __user *usp)
262265
sizeof(ksp.seckey.seckey),
263266
ksp.protkey.protkey,
264267
&ksp.protkey.len,
265-
&ksp.protkey.type);
268+
&ksp.protkey.type, 0);
266269
pr_debug("key_to_protkey()=%d\n", rc);
267270
if (!rc && copy_to_user(usp, &ksp, sizeof(ksp)))
268271
rc = -EFAULT;
@@ -285,7 +288,7 @@ static int pkey_ioctl_verifykey(struct pkey_verifykey __user *uvk)
285288
rc = pkey_handler_verify_key(kvk.seckey.seckey,
286289
sizeof(kvk.seckey.seckey),
287290
&kvk.cardnr, &kvk.domain,
288-
&keytype, &keybitsize, &flags);
291+
&keytype, &keybitsize, &flags, 0);
289292
pr_debug("verify_key()=%d\n", rc);
290293
if (!rc && keytype != PKEY_TYPE_CCA_DATA)
291294
rc = -EINVAL;
@@ -312,7 +315,7 @@ static int pkey_ioctl_genprotk(struct pkey_genprotk __user *ugp)
312315
rc = pkey_handler_gen_key(NULL, 0, kgp.keytype,
313316
PKEY_TYPE_PROTKEY, 0, 0,
314317
kgp.protkey.protkey, &kgp.protkey.len,
315-
&kgp.protkey.type);
318+
&kgp.protkey.type, 0);
316319
pr_debug("gen_key()=%d\n", rc);
317320
if (!rc && copy_to_user(ugp, &kgp, sizeof(kgp)))
318321
rc = -EFAULT;
@@ -354,7 +357,7 @@ static int pkey_ioctl_verifyprotk(struct pkey_verifyprotk __user *uvp)
354357
memcpy(t->protkey, kvp.protkey.protkey, kvp.protkey.len);
355358

356359
rc = pkey_handler_verify_key(tmpbuf, sizeof(*t),
357-
NULL, NULL, NULL, NULL, NULL);
360+
NULL, NULL, NULL, NULL, NULL, 0);
358361
pr_debug("verify_key()=%d\n", rc);
359362

360363
kfree_sensitive(tmpbuf);
@@ -377,7 +380,7 @@ static int pkey_ioctl_kblob2protk(struct pkey_kblob2pkey __user *utp)
377380
ktp.protkey.len = sizeof(ktp.protkey.protkey);
378381
rc = key2protkey(NULL, 0, kkey, ktp.keylen,
379382
ktp.protkey.protkey, &ktp.protkey.len,
380-
&ktp.protkey.type);
383+
&ktp.protkey.type, 0);
381384
pr_debug("key2protkey()=%d\n", rc);
382385
kfree_sensitive(kkey);
383386
if (!rc && copy_to_user(utp, &ktp, sizeof(ktp)))
@@ -414,7 +417,7 @@ static int pkey_ioctl_genseck2(struct pkey_genseck2 __user *ugs)
414417
}
415418
rc = pkey_handler_gen_key(apqns, kgs.apqn_entries,
416419
u, kgs.type, kgs.size, kgs.keygenflags,
417-
kkey, &klen, NULL);
420+
kkey, &klen, NULL, 0);
418421
pr_debug("gen_key()=%d\n", rc);
419422
kfree(apqns);
420423
if (rc) {
@@ -471,7 +474,7 @@ static int pkey_ioctl_clr2seck2(struct pkey_clr2seck2 __user *ucs)
471474
rc = pkey_handler_clr_to_key(apqns, kcs.apqn_entries,
472475
u, kcs.type, kcs.size, kcs.keygenflags,
473476
kcs.clrkey.clrkey, kcs.size / 8,
474-
kkey, &klen, NULL);
477+
kkey, &klen, NULL, 0);
475478
pr_debug("clr_to_key()=%d\n", rc);
476479
kfree(apqns);
477480
if (rc) {
@@ -514,7 +517,7 @@ static int pkey_ioctl_verifykey2(struct pkey_verifykey2 __user *uvk)
514517

515518
rc = pkey_handler_verify_key(kkey, kvk.keylen,
516519
&kvk.cardnr, &kvk.domain,
517-
&kvk.type, &kvk.size, &kvk.flags);
520+
&kvk.type, &kvk.size, &kvk.flags, 0);
518521
pr_debug("verify_key()=%d\n", rc);
519522

520523
kfree_sensitive(kkey);
@@ -544,7 +547,7 @@ static int pkey_ioctl_kblob2protk2(struct pkey_kblob2pkey2 __user *utp)
544547
ktp.protkey.len = sizeof(ktp.protkey.protkey);
545548
rc = key2protkey(apqns, ktp.apqn_entries, kkey, ktp.keylen,
546549
ktp.protkey.protkey, &ktp.protkey.len,
547-
&ktp.protkey.type);
550+
&ktp.protkey.type, 0);
548551
pr_debug("key2protkey()=%d\n", rc);
549552
kfree(apqns);
550553
kfree_sensitive(kkey);
@@ -579,7 +582,7 @@ static int pkey_ioctl_apqns4k(struct pkey_apqns4key __user *uak)
579582
return PTR_ERR(kkey);
580583
}
581584
rc = pkey_handler_apqns_for_key(kkey, kak.keylen, kak.flags,
582-
apqns, &nr_apqns);
585+
apqns, &nr_apqns, 0);
583586
pr_debug("apqns_for_key()=%d\n", rc);
584587
kfree_sensitive(kkey);
585588
if (rc && rc != -ENOSPC) {
@@ -626,7 +629,7 @@ static int pkey_ioctl_apqns4kt(struct pkey_apqns4keytype __user *uat)
626629
}
627630
rc = pkey_handler_apqns_for_keytype(kat.type,
628631
kat.cur_mkvp, kat.alt_mkvp,
629-
kat.flags, apqns, &nr_apqns);
632+
kat.flags, apqns, &nr_apqns, 0);
630633
pr_debug("apqns_for_keytype()=%d\n", rc);
631634
if (rc && rc != -ENOSPC) {
632635
kfree(apqns);
@@ -678,7 +681,7 @@ static int pkey_ioctl_kblob2protk3(struct pkey_kblob2pkey3 __user *utp)
678681
return -ENOMEM;
679682
}
680683
rc = key2protkey(apqns, ktp.apqn_entries, kkey, ktp.keylen,
681-
protkey, &protkeylen, &ktp.pkeytype);
684+
protkey, &protkeylen, &ktp.pkeytype, 0);
682685
pr_debug("key2protkey()=%d\n", rc);
683686
kfree(apqns);
684687
kfree_sensitive(kkey);

drivers/s390/crypto/pkey_base.c

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,8 @@ EXPORT_SYMBOL(pkey_handler_put);
150150

151151
int pkey_handler_key_to_protkey(const struct pkey_apqn *apqns, size_t nr_apqns,
152152
const u8 *key, u32 keylen,
153-
u8 *protkey, u32 *protkeylen, u32 *protkeytype)
153+
u8 *protkey, u32 *protkeylen, u32 *protkeytype,
154+
u32 xflags)
154155
{
155156
const struct pkey_handler *h;
156157
int rc = -ENODEV;
@@ -159,7 +160,7 @@ int pkey_handler_key_to_protkey(const struct pkey_apqn *apqns, size_t nr_apqns,
159160
if (h && h->key_to_protkey) {
160161
rc = h->key_to_protkey(apqns, nr_apqns, key, keylen,
161162
protkey, protkeylen,
162-
protkeytype);
163+
protkeytype, xflags);
163164
}
164165
pkey_handler_put(h);
165166

@@ -177,7 +178,7 @@ int pkey_handler_slowpath_key_to_protkey(const struct pkey_apqn *apqns,
177178
size_t nr_apqns,
178179
const u8 *key, u32 keylen,
179180
u8 *protkey, u32 *protkeylen,
180-
u32 *protkeytype)
181+
u32 *protkeytype, u32 xflags)
181182
{
182183
const struct pkey_handler *h, *htmp[10];
183184
int i, n = 0, rc = -ENODEV;
@@ -199,7 +200,7 @@ int pkey_handler_slowpath_key_to_protkey(const struct pkey_apqn *apqns,
199200
rc = h->slowpath_key_to_protkey(apqns, nr_apqns,
200201
key, keylen,
201202
protkey, protkeylen,
202-
protkeytype);
203+
protkeytype, xflags);
203204
module_put(h->module);
204205
}
205206

@@ -210,7 +211,7 @@ EXPORT_SYMBOL(pkey_handler_slowpath_key_to_protkey);
210211
int pkey_handler_gen_key(const struct pkey_apqn *apqns, size_t nr_apqns,
211212
u32 keytype, u32 keysubtype,
212213
u32 keybitsize, u32 flags,
213-
u8 *keybuf, u32 *keybuflen, u32 *keyinfo)
214+
u8 *keybuf, u32 *keybuflen, u32 *keyinfo, u32 xflags)
214215
{
215216
const struct pkey_handler *h;
216217
int rc = -ENODEV;
@@ -219,7 +220,7 @@ int pkey_handler_gen_key(const struct pkey_apqn *apqns, size_t nr_apqns,
219220
if (h && h->gen_key) {
220221
rc = h->gen_key(apqns, nr_apqns, keytype, keysubtype,
221222
keybitsize, flags,
222-
keybuf, keybuflen, keyinfo);
223+
keybuf, keybuflen, keyinfo, xflags);
223224
}
224225
pkey_handler_put(h);
225226

@@ -231,7 +232,8 @@ int pkey_handler_clr_to_key(const struct pkey_apqn *apqns, size_t nr_apqns,
231232
u32 keytype, u32 keysubtype,
232233
u32 keybitsize, u32 flags,
233234
const u8 *clrkey, u32 clrkeylen,
234-
u8 *keybuf, u32 *keybuflen, u32 *keyinfo)
235+
u8 *keybuf, u32 *keybuflen, u32 *keyinfo,
236+
u32 xflags)
235237
{
236238
const struct pkey_handler *h;
237239
int rc = -ENODEV;
@@ -240,7 +242,7 @@ int pkey_handler_clr_to_key(const struct pkey_apqn *apqns, size_t nr_apqns,
240242
if (h && h->clr_to_key) {
241243
rc = h->clr_to_key(apqns, nr_apqns, keytype, keysubtype,
242244
keybitsize, flags, clrkey, clrkeylen,
243-
keybuf, keybuflen, keyinfo);
245+
keybuf, keybuflen, keyinfo, xflags);
244246
}
245247
pkey_handler_put(h);
246248

@@ -250,15 +252,16 @@ EXPORT_SYMBOL(pkey_handler_clr_to_key);
250252

251253
int pkey_handler_verify_key(const u8 *key, u32 keylen,
252254
u16 *card, u16 *dom,
253-
u32 *keytype, u32 *keybitsize, u32 *flags)
255+
u32 *keytype, u32 *keybitsize, u32 *flags,
256+
u32 xflags)
254257
{
255258
const struct pkey_handler *h;
256259
int rc = -ENODEV;
257260

258261
h = pkey_handler_get_keybased(key, keylen);
259262
if (h && h->verify_key) {
260263
rc = h->verify_key(key, keylen, card, dom,
261-
keytype, keybitsize, flags);
264+
keytype, keybitsize, flags, xflags);
262265
}
263266
pkey_handler_put(h);
264267

@@ -267,14 +270,16 @@ int pkey_handler_verify_key(const u8 *key, u32 keylen,
267270
EXPORT_SYMBOL(pkey_handler_verify_key);
268271

269272
int pkey_handler_apqns_for_key(const u8 *key, u32 keylen, u32 flags,
270-
struct pkey_apqn *apqns, size_t *nr_apqns)
273+
struct pkey_apqn *apqns, size_t *nr_apqns,
274+
u32 xflags)
271275
{
272276
const struct pkey_handler *h;
273277
int rc = -ENODEV;
274278

275279
h = pkey_handler_get_keybased(key, keylen);
276280
if (h && h->apqns_for_key)
277-
rc = h->apqns_for_key(key, keylen, flags, apqns, nr_apqns);
281+
rc = h->apqns_for_key(key, keylen, flags, apqns, nr_apqns,
282+
xflags);
278283
pkey_handler_put(h);
279284

280285
return rc;
@@ -283,7 +288,8 @@ EXPORT_SYMBOL(pkey_handler_apqns_for_key);
283288

284289
int pkey_handler_apqns_for_keytype(enum pkey_key_type keysubtype,
285290
u8 cur_mkvp[32], u8 alt_mkvp[32], u32 flags,
286-
struct pkey_apqn *apqns, size_t *nr_apqns)
291+
struct pkey_apqn *apqns, size_t *nr_apqns,
292+
u32 xflags)
287293
{
288294
const struct pkey_handler *h;
289295
int rc = -ENODEV;
@@ -292,7 +298,7 @@ int pkey_handler_apqns_for_keytype(enum pkey_key_type keysubtype,
292298
if (h && h->apqns_for_keytype) {
293299
rc = h->apqns_for_keytype(keysubtype,
294300
cur_mkvp, alt_mkvp, flags,
295-
apqns, nr_apqns);
301+
apqns, nr_apqns, xflags);
296302
}
297303
pkey_handler_put(h);
298304

0 commit comments

Comments
 (0)