1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * pkey device driver
4 *
5 * Copyright IBM Corp. 2017,2019
6 * Author(s): Harald Freudenberger
7 */
8
9 #define KMSG_COMPONENT "pkey"
10 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
11
12 #include <linux/fs.h>
13 #include <linux/init.h>
14 #include <linux/miscdevice.h>
15 #include <linux/module.h>
16 #include <linux/slab.h>
17 #include <linux/kallsyms.h>
18 #include <linux/debugfs.h>
19 #include <linux/random.h>
20 #include <linux/cpufeature.h>
21 #include <asm/zcrypt.h>
22 #include <asm/cpacf.h>
23 #include <asm/pkey.h>
24 #include <crypto/aes.h>
25
26 #include "zcrypt_api.h"
27 #include "zcrypt_ccamisc.h"
28 #include "zcrypt_ep11misc.h"
29
30 MODULE_LICENSE("GPL");
31 MODULE_AUTHOR("IBM Corporation");
32 MODULE_DESCRIPTION("s390 protected key interface");
33
34 #define KEYBLOBBUFSIZE 8192 /* key buffer size used for internal processing */
35 #define PROTKEYBLOBBUFSIZE 256 /* protected key buffer size used internal */
36 #define MAXAPQNSINLIST 64 /* max 64 apqns within a apqn list */
37
38 /*
39 * debug feature data and functions
40 */
41
42 static debug_info_t *debug_info;
43
44 #define DEBUG_DBG(...) debug_sprintf_event(debug_info, 6, ##__VA_ARGS__)
45 #define DEBUG_INFO(...) debug_sprintf_event(debug_info, 5, ##__VA_ARGS__)
46 #define DEBUG_WARN(...) debug_sprintf_event(debug_info, 4, ##__VA_ARGS__)
47 #define DEBUG_ERR(...) debug_sprintf_event(debug_info, 3, ##__VA_ARGS__)
48
pkey_debug_init(void)49 static void __init pkey_debug_init(void)
50 {
51 /* 5 arguments per dbf entry (including the format string ptr) */
52 debug_info = debug_register("pkey", 1, 1, 5 * sizeof(long));
53 debug_register_view(debug_info, &debug_sprintf_view);
54 debug_set_level(debug_info, 3);
55 }
56
pkey_debug_exit(void)57 static void __exit pkey_debug_exit(void)
58 {
59 debug_unregister(debug_info);
60 }
61
62 /* inside view of a protected key token (only type 0x00 version 0x01) */
63 struct protaeskeytoken {
64 u8 type; /* 0x00 for PAES specific key tokens */
65 u8 res0[3];
66 u8 version; /* should be 0x01 for protected AES key token */
67 u8 res1[3];
68 u32 keytype; /* key type, one of the PKEY_KEYTYPE values */
69 u32 len; /* bytes actually stored in protkey[] */
70 u8 protkey[MAXPROTKEYSIZE]; /* the protected key blob */
71 } __packed;
72
73 /* inside view of a clear key token (type 0x00 version 0x02) */
74 struct clearaeskeytoken {
75 u8 type; /* 0x00 for PAES specific key tokens */
76 u8 res0[3];
77 u8 version; /* 0x02 for clear AES key token */
78 u8 res1[3];
79 u32 keytype; /* key type, one of the PKEY_KEYTYPE values */
80 u32 len; /* bytes actually stored in clearkey[] */
81 u8 clearkey[]; /* clear key value */
82 } __packed;
83
84 /*
85 * Create a protected key from a clear key value.
86 */
pkey_clr2protkey(u32 keytype,const struct pkey_clrkey * clrkey,struct pkey_protkey * protkey)87 static int pkey_clr2protkey(u32 keytype,
88 const struct pkey_clrkey *clrkey,
89 struct pkey_protkey *protkey)
90 {
91 /* mask of available pckmo subfunctions */
92 static cpacf_mask_t pckmo_functions;
93
94 long fc;
95 int keysize;
96 u8 paramblock[64];
97
98 switch (keytype) {
99 case PKEY_KEYTYPE_AES_128:
100 keysize = 16;
101 fc = CPACF_PCKMO_ENC_AES_128_KEY;
102 break;
103 case PKEY_KEYTYPE_AES_192:
104 keysize = 24;
105 fc = CPACF_PCKMO_ENC_AES_192_KEY;
106 break;
107 case PKEY_KEYTYPE_AES_256:
108 keysize = 32;
109 fc = CPACF_PCKMO_ENC_AES_256_KEY;
110 break;
111 default:
112 DEBUG_ERR("%s unknown/unsupported keytype %d\n",
113 __func__, keytype);
114 return -EINVAL;
115 }
116
117 /* Did we already check for PCKMO ? */
118 if (!pckmo_functions.bytes[0]) {
119 /* no, so check now */
120 if (!cpacf_query(CPACF_PCKMO, &pckmo_functions))
121 return -ENODEV;
122 }
123 /* check for the pckmo subfunction we need now */
124 if (!cpacf_test_func(&pckmo_functions, fc)) {
125 DEBUG_ERR("%s pckmo functions not available\n", __func__);
126 return -ENODEV;
127 }
128
129 /* prepare param block */
130 memset(paramblock, 0, sizeof(paramblock));
131 memcpy(paramblock, clrkey->clrkey, keysize);
132
133 /* call the pckmo instruction */
134 cpacf_pckmo(fc, paramblock);
135
136 /* copy created protected key */
137 protkey->type = keytype;
138 protkey->len = keysize + 32;
139 memcpy(protkey->protkey, paramblock, keysize + 32);
140
141 return 0;
142 }
143
144 /*
145 * Find card and transform secure key into protected key.
146 */
pkey_skey2pkey(const u8 * key,struct pkey_protkey * pkey)147 static int pkey_skey2pkey(const u8 *key, struct pkey_protkey *pkey)
148 {
149 int rc, verify;
150 u16 cardnr, domain;
151 struct keytoken_header *hdr = (struct keytoken_header *)key;
152
153 /*
154 * The cca_xxx2protkey call may fail when a card has been
155 * addressed where the master key was changed after last fetch
156 * of the mkvp into the cache. Try 3 times: First witout verify
157 * then with verify and last round with verify and old master
158 * key verification pattern match not ignored.
159 */
160 for (verify = 0; verify < 3; verify++) {
161 rc = cca_findcard(key, &cardnr, &domain, verify);
162 if (rc < 0)
163 continue;
164 if (rc > 0 && verify < 2)
165 continue;
166 switch (hdr->version) {
167 case TOKVER_CCA_AES:
168 rc = cca_sec2protkey(cardnr, domain,
169 key, pkey->protkey,
170 &pkey->len, &pkey->type);
171 break;
172 case TOKVER_CCA_VLSC:
173 rc = cca_cipher2protkey(cardnr, domain,
174 key, pkey->protkey,
175 &pkey->len, &pkey->type);
176 break;
177 default:
178 return -EINVAL;
179 }
180 if (rc == 0)
181 break;
182 }
183
184 if (rc)
185 DEBUG_DBG("%s failed rc=%d\n", __func__, rc);
186
187 return rc;
188 }
189
190 /*
191 * Construct EP11 key with given clear key value.
192 */
pkey_clr2ep11key(const u8 * clrkey,size_t clrkeylen,u8 * keybuf,size_t * keybuflen)193 static int pkey_clr2ep11key(const u8 *clrkey, size_t clrkeylen,
194 u8 *keybuf, size_t *keybuflen)
195 {
196 int i, rc;
197 u16 card, dom;
198 u32 nr_apqns, *apqns = NULL;
199
200 /* build a list of apqns suitable for ep11 keys with cpacf support */
201 rc = ep11_findcard2(&apqns, &nr_apqns, 0xFFFF, 0xFFFF,
202 ZCRYPT_CEX7, EP11_API_V, NULL);
203 if (rc)
204 goto out;
205
206 /* go through the list of apqns and try to bild an ep11 key */
207 for (rc = -ENODEV, i = 0; i < nr_apqns; i++) {
208 card = apqns[i] >> 16;
209 dom = apqns[i] & 0xFFFF;
210 rc = ep11_clr2keyblob(card, dom, clrkeylen * 8,
211 0, clrkey, keybuf, keybuflen);
212 if (rc == 0)
213 break;
214 }
215
216 out:
217 kfree(apqns);
218 if (rc)
219 DEBUG_DBG("%s failed rc=%d\n", __func__, rc);
220 return rc;
221 }
222
223 /*
224 * Find card and transform EP11 secure key into protected key.
225 */
pkey_ep11key2pkey(const u8 * key,struct pkey_protkey * pkey)226 static int pkey_ep11key2pkey(const u8 *key, struct pkey_protkey *pkey)
227 {
228 int i, rc;
229 u16 card, dom;
230 u32 nr_apqns, *apqns = NULL;
231 struct ep11keyblob *kb = (struct ep11keyblob *) key;
232
233 /* build a list of apqns suitable for this key */
234 rc = ep11_findcard2(&apqns, &nr_apqns, 0xFFFF, 0xFFFF,
235 ZCRYPT_CEX7, EP11_API_V, kb->wkvp);
236 if (rc)
237 goto out;
238
239 /* go through the list of apqns and try to derive an pkey */
240 for (rc = -ENODEV, i = 0; i < nr_apqns; i++) {
241 card = apqns[i] >> 16;
242 dom = apqns[i] & 0xFFFF;
243 pkey->len = sizeof(pkey->protkey);
244 rc = ep11_kblob2protkey(card, dom, key, kb->head.len,
245 pkey->protkey, &pkey->len, &pkey->type);
246 if (rc == 0)
247 break;
248 }
249
250 out:
251 kfree(apqns);
252 if (rc)
253 DEBUG_DBG("%s failed rc=%d\n", __func__, rc);
254 return rc;
255 }
256
257 /*
258 * Verify key and give back some info about the key.
259 */
pkey_verifykey(const struct pkey_seckey * seckey,u16 * pcardnr,u16 * pdomain,u16 * pkeysize,u32 * pattributes)260 static int pkey_verifykey(const struct pkey_seckey *seckey,
261 u16 *pcardnr, u16 *pdomain,
262 u16 *pkeysize, u32 *pattributes)
263 {
264 struct secaeskeytoken *t = (struct secaeskeytoken *) seckey;
265 u16 cardnr, domain;
266 int rc;
267
268 /* check the secure key for valid AES secure key */
269 rc = cca_check_secaeskeytoken(debug_info, 3, (u8 *) seckey, 0);
270 if (rc)
271 goto out;
272 if (pattributes)
273 *pattributes = PKEY_VERIFY_ATTR_AES;
274 if (pkeysize)
275 *pkeysize = t->bitsize;
276
277 /* try to find a card which can handle this key */
278 rc = cca_findcard(seckey->seckey, &cardnr, &domain, 1);
279 if (rc < 0)
280 goto out;
281
282 if (rc > 0) {
283 /* key mkvp matches to old master key mkvp */
284 DEBUG_DBG("%s secure key has old mkvp\n", __func__);
285 if (pattributes)
286 *pattributes |= PKEY_VERIFY_ATTR_OLD_MKVP;
287 rc = 0;
288 }
289
290 if (pcardnr)
291 *pcardnr = cardnr;
292 if (pdomain)
293 *pdomain = domain;
294
295 out:
296 DEBUG_DBG("%s rc=%d\n", __func__, rc);
297 return rc;
298 }
299
300 /*
301 * Generate a random protected key
302 */
pkey_genprotkey(u32 keytype,struct pkey_protkey * protkey)303 static int pkey_genprotkey(u32 keytype, struct pkey_protkey *protkey)
304 {
305 struct pkey_clrkey clrkey;
306 int keysize;
307 int rc;
308
309 switch (keytype) {
310 case PKEY_KEYTYPE_AES_128:
311 keysize = 16;
312 break;
313 case PKEY_KEYTYPE_AES_192:
314 keysize = 24;
315 break;
316 case PKEY_KEYTYPE_AES_256:
317 keysize = 32;
318 break;
319 default:
320 DEBUG_ERR("%s unknown/unsupported keytype %d\n", __func__,
321 keytype);
322 return -EINVAL;
323 }
324
325 /* generate a dummy random clear key */
326 get_random_bytes(clrkey.clrkey, keysize);
327
328 /* convert it to a dummy protected key */
329 rc = pkey_clr2protkey(keytype, &clrkey, protkey);
330 if (rc)
331 return rc;
332
333 /* replace the key part of the protected key with random bytes */
334 get_random_bytes(protkey->protkey, keysize);
335
336 return 0;
337 }
338
339 /*
340 * Verify if a protected key is still valid
341 */
pkey_verifyprotkey(const struct pkey_protkey * protkey)342 static int pkey_verifyprotkey(const struct pkey_protkey *protkey)
343 {
344 unsigned long fc;
345 struct {
346 u8 iv[AES_BLOCK_SIZE];
347 u8 key[MAXPROTKEYSIZE];
348 } param;
349 u8 null_msg[AES_BLOCK_SIZE];
350 u8 dest_buf[AES_BLOCK_SIZE];
351 unsigned int k;
352
353 switch (protkey->type) {
354 case PKEY_KEYTYPE_AES_128:
355 fc = CPACF_KMC_PAES_128;
356 break;
357 case PKEY_KEYTYPE_AES_192:
358 fc = CPACF_KMC_PAES_192;
359 break;
360 case PKEY_KEYTYPE_AES_256:
361 fc = CPACF_KMC_PAES_256;
362 break;
363 default:
364 DEBUG_ERR("%s unknown/unsupported keytype %d\n", __func__,
365 protkey->type);
366 return -EINVAL;
367 }
368
369 memset(null_msg, 0, sizeof(null_msg));
370
371 memset(param.iv, 0, sizeof(param.iv));
372 memcpy(param.key, protkey->protkey, sizeof(param.key));
373
374 k = cpacf_kmc(fc | CPACF_ENCRYPT, ¶m, null_msg, dest_buf,
375 sizeof(null_msg));
376 if (k != sizeof(null_msg)) {
377 DEBUG_ERR("%s protected key is not valid\n", __func__);
378 return -EKEYREJECTED;
379 }
380
381 return 0;
382 }
383
384 /*
385 * Transform a non-CCA key token into a protected key
386 */
pkey_nonccatok2pkey(const u8 * key,u32 keylen,struct pkey_protkey * protkey)387 static int pkey_nonccatok2pkey(const u8 *key, u32 keylen,
388 struct pkey_protkey *protkey)
389 {
390 int rc = -EINVAL;
391 u8 *tmpbuf = NULL;
392 struct keytoken_header *hdr = (struct keytoken_header *)key;
393
394 switch (hdr->version) {
395 case TOKVER_PROTECTED_KEY: {
396 struct protaeskeytoken *t;
397
398 if (keylen != sizeof(struct protaeskeytoken))
399 goto out;
400 t = (struct protaeskeytoken *)key;
401 protkey->len = t->len;
402 protkey->type = t->keytype;
403 memcpy(protkey->protkey, t->protkey,
404 sizeof(protkey->protkey));
405 rc = pkey_verifyprotkey(protkey);
406 break;
407 }
408 case TOKVER_CLEAR_KEY: {
409 struct clearaeskeytoken *t;
410 struct pkey_clrkey ckey;
411 union u_tmpbuf {
412 u8 skey[SECKEYBLOBSIZE];
413 u8 ep11key[MAXEP11AESKEYBLOBSIZE];
414 };
415 size_t tmpbuflen = sizeof(union u_tmpbuf);
416
417 if (keylen < sizeof(struct clearaeskeytoken))
418 goto out;
419 t = (struct clearaeskeytoken *)key;
420 if (keylen != sizeof(*t) + t->len)
421 goto out;
422 if ((t->keytype == PKEY_KEYTYPE_AES_128 && t->len == 16)
423 || (t->keytype == PKEY_KEYTYPE_AES_192 && t->len == 24)
424 || (t->keytype == PKEY_KEYTYPE_AES_256 && t->len == 32))
425 memcpy(ckey.clrkey, t->clearkey, t->len);
426 else
427 goto out;
428 /* alloc temp key buffer space */
429 tmpbuf = kmalloc(tmpbuflen, GFP_ATOMIC);
430 if (!tmpbuf) {
431 rc = -ENOMEM;
432 goto out;
433 }
434 /* try direct way with the PCKMO instruction */
435 rc = pkey_clr2protkey(t->keytype, &ckey, protkey);
436 if (rc == 0)
437 break;
438 /* PCKMO failed, so try the CCA secure key way */
439 rc = cca_clr2seckey(0xFFFF, 0xFFFF, t->keytype,
440 ckey.clrkey, tmpbuf);
441 if (rc == 0)
442 rc = pkey_skey2pkey(tmpbuf, protkey);
443 if (rc == 0)
444 break;
445 /* if the CCA way also failed, let's try via EP11 */
446 rc = pkey_clr2ep11key(ckey.clrkey, t->len,
447 tmpbuf, &tmpbuflen);
448 if (rc == 0)
449 rc = pkey_ep11key2pkey(tmpbuf, protkey);
450 /* now we should really have an protected key */
451 DEBUG_ERR("%s unable to build protected key from clear",
452 __func__);
453 break;
454 }
455 case TOKVER_EP11_AES: {
456 /* check ep11 key for exportable as protected key */
457 rc = ep11_check_aes_key(debug_info, 3, key, keylen, 1);
458 if (rc)
459 goto out;
460 rc = pkey_ep11key2pkey(key, protkey);
461 break;
462 }
463 case TOKVER_EP11_AES_WITH_HEADER:
464 /* check ep11 key with header for exportable as protected key */
465 rc = ep11_check_aes_key_with_hdr(debug_info, 3, key, keylen, 1);
466 if (rc)
467 goto out;
468 rc = pkey_ep11key2pkey(key + sizeof(struct ep11kblob_header),
469 protkey);
470 break;
471 default:
472 DEBUG_ERR("%s unknown/unsupported non-CCA token version %d\n",
473 __func__, hdr->version);
474 rc = -EINVAL;
475 }
476
477 out:
478 kfree(tmpbuf);
479 return rc;
480 }
481
482 /*
483 * Transform a CCA internal key token into a protected key
484 */
pkey_ccainttok2pkey(const u8 * key,u32 keylen,struct pkey_protkey * protkey)485 static int pkey_ccainttok2pkey(const u8 *key, u32 keylen,
486 struct pkey_protkey *protkey)
487 {
488 struct keytoken_header *hdr = (struct keytoken_header *)key;
489
490 switch (hdr->version) {
491 case TOKVER_CCA_AES:
492 if (keylen != sizeof(struct secaeskeytoken))
493 return -EINVAL;
494 break;
495 case TOKVER_CCA_VLSC:
496 if (keylen < hdr->len || keylen > MAXCCAVLSCTOKENSIZE)
497 return -EINVAL;
498 break;
499 default:
500 DEBUG_ERR("%s unknown/unsupported CCA internal token version %d\n",
501 __func__, hdr->version);
502 return -EINVAL;
503 }
504
505 return pkey_skey2pkey(key, protkey);
506 }
507
508 /*
509 * Transform a key blob (of any type) into a protected key
510 */
pkey_keyblob2pkey(const u8 * key,u32 keylen,struct pkey_protkey * protkey)511 int pkey_keyblob2pkey(const u8 *key, u32 keylen,
512 struct pkey_protkey *protkey)
513 {
514 int rc;
515 struct keytoken_header *hdr = (struct keytoken_header *)key;
516
517 if (keylen < sizeof(struct keytoken_header)) {
518 DEBUG_ERR("%s invalid keylen %d\n", __func__, keylen);
519 return -EINVAL;
520 }
521
522 switch (hdr->type) {
523 case TOKTYPE_NON_CCA:
524 rc = pkey_nonccatok2pkey(key, keylen, protkey);
525 break;
526 case TOKTYPE_CCA_INTERNAL:
527 rc = pkey_ccainttok2pkey(key, keylen, protkey);
528 break;
529 default:
530 DEBUG_ERR("%s unknown/unsupported blob type %d\n",
531 __func__, hdr->type);
532 return -EINVAL;
533 }
534
535 DEBUG_DBG("%s rc=%d\n", __func__, rc);
536 return rc;
537
538 }
539 EXPORT_SYMBOL(pkey_keyblob2pkey);
540
pkey_genseckey2(const struct pkey_apqn * apqns,size_t nr_apqns,enum pkey_key_type ktype,enum pkey_key_size ksize,u32 kflags,u8 * keybuf,size_t * keybufsize)541 static int pkey_genseckey2(const struct pkey_apqn *apqns, size_t nr_apqns,
542 enum pkey_key_type ktype, enum pkey_key_size ksize,
543 u32 kflags, u8 *keybuf, size_t *keybufsize)
544 {
545 int i, card, dom, rc;
546
547 /* check for at least one apqn given */
548 if (!apqns || !nr_apqns)
549 return -EINVAL;
550
551 /* check key type and size */
552 switch (ktype) {
553 case PKEY_TYPE_CCA_DATA:
554 case PKEY_TYPE_CCA_CIPHER:
555 if (*keybufsize < SECKEYBLOBSIZE)
556 return -EINVAL;
557 break;
558 case PKEY_TYPE_EP11:
559 if (*keybufsize < MINEP11AESKEYBLOBSIZE)
560 return -EINVAL;
561 break;
562 default:
563 return -EINVAL;
564 }
565 switch (ksize) {
566 case PKEY_SIZE_AES_128:
567 case PKEY_SIZE_AES_192:
568 case PKEY_SIZE_AES_256:
569 break;
570 default:
571 return -EINVAL;
572 }
573
574 /* simple try all apqns from the list */
575 for (i = 0, rc = -ENODEV; i < nr_apqns; i++) {
576 card = apqns[i].card;
577 dom = apqns[i].domain;
578 if (ktype == PKEY_TYPE_EP11) {
579 rc = ep11_genaeskey(card, dom, ksize, kflags,
580 keybuf, keybufsize);
581 } else if (ktype == PKEY_TYPE_CCA_DATA) {
582 rc = cca_genseckey(card, dom, ksize, keybuf);
583 *keybufsize = (rc ? 0 : SECKEYBLOBSIZE);
584 } else /* TOKVER_CCA_VLSC */
585 rc = cca_gencipherkey(card, dom, ksize, kflags,
586 keybuf, keybufsize);
587 if (rc == 0)
588 break;
589 }
590
591 return rc;
592 }
593
pkey_clr2seckey2(const struct pkey_apqn * apqns,size_t nr_apqns,enum pkey_key_type ktype,enum pkey_key_size ksize,u32 kflags,const u8 * clrkey,u8 * keybuf,size_t * keybufsize)594 static int pkey_clr2seckey2(const struct pkey_apqn *apqns, size_t nr_apqns,
595 enum pkey_key_type ktype, enum pkey_key_size ksize,
596 u32 kflags, const u8 *clrkey,
597 u8 *keybuf, size_t *keybufsize)
598 {
599 int i, card, dom, rc;
600
601 /* check for at least one apqn given */
602 if (!apqns || !nr_apqns)
603 return -EINVAL;
604
605 /* check key type and size */
606 switch (ktype) {
607 case PKEY_TYPE_CCA_DATA:
608 case PKEY_TYPE_CCA_CIPHER:
609 if (*keybufsize < SECKEYBLOBSIZE)
610 return -EINVAL;
611 break;
612 case PKEY_TYPE_EP11:
613 if (*keybufsize < MINEP11AESKEYBLOBSIZE)
614 return -EINVAL;
615 break;
616 default:
617 return -EINVAL;
618 }
619 switch (ksize) {
620 case PKEY_SIZE_AES_128:
621 case PKEY_SIZE_AES_192:
622 case PKEY_SIZE_AES_256:
623 break;
624 default:
625 return -EINVAL;
626 }
627
628 /* simple try all apqns from the list */
629 for (i = 0, rc = -ENODEV; i < nr_apqns; i++) {
630 card = apqns[i].card;
631 dom = apqns[i].domain;
632 if (ktype == PKEY_TYPE_EP11) {
633 rc = ep11_clr2keyblob(card, dom, ksize, kflags,
634 clrkey, keybuf, keybufsize);
635 } else if (ktype == PKEY_TYPE_CCA_DATA) {
636 rc = cca_clr2seckey(card, dom, ksize,
637 clrkey, keybuf);
638 *keybufsize = (rc ? 0 : SECKEYBLOBSIZE);
639 } else /* TOKVER_CCA_VLSC */
640 rc = cca_clr2cipherkey(card, dom, ksize, kflags,
641 clrkey, keybuf, keybufsize);
642 if (rc == 0)
643 break;
644 }
645
646 return rc;
647 }
648
pkey_verifykey2(const u8 * key,size_t keylen,u16 * cardnr,u16 * domain,enum pkey_key_type * ktype,enum pkey_key_size * ksize,u32 * flags)649 static int pkey_verifykey2(const u8 *key, size_t keylen,
650 u16 *cardnr, u16 *domain,
651 enum pkey_key_type *ktype,
652 enum pkey_key_size *ksize, u32 *flags)
653 {
654 int rc;
655 u32 _nr_apqns, *_apqns = NULL;
656 struct keytoken_header *hdr = (struct keytoken_header *)key;
657
658 if (keylen < sizeof(struct keytoken_header))
659 return -EINVAL;
660
661 if (hdr->type == TOKTYPE_CCA_INTERNAL
662 && hdr->version == TOKVER_CCA_AES) {
663 struct secaeskeytoken *t = (struct secaeskeytoken *)key;
664
665 rc = cca_check_secaeskeytoken(debug_info, 3, key, 0);
666 if (rc)
667 goto out;
668 if (ktype)
669 *ktype = PKEY_TYPE_CCA_DATA;
670 if (ksize)
671 *ksize = (enum pkey_key_size) t->bitsize;
672
673 rc = cca_findcard2(&_apqns, &_nr_apqns, *cardnr, *domain,
674 ZCRYPT_CEX3C, AES_MK_SET, t->mkvp, 0, 1);
675 if (rc == 0 && flags)
676 *flags = PKEY_FLAGS_MATCH_CUR_MKVP;
677 if (rc == -ENODEV) {
678 rc = cca_findcard2(&_apqns, &_nr_apqns,
679 *cardnr, *domain,
680 ZCRYPT_CEX3C, AES_MK_SET,
681 0, t->mkvp, 1);
682 if (rc == 0 && flags)
683 *flags = PKEY_FLAGS_MATCH_ALT_MKVP;
684 }
685 if (rc)
686 goto out;
687
688 *cardnr = ((struct pkey_apqn *)_apqns)->card;
689 *domain = ((struct pkey_apqn *)_apqns)->domain;
690
691 } else if (hdr->type == TOKTYPE_CCA_INTERNAL
692 && hdr->version == TOKVER_CCA_VLSC) {
693 struct cipherkeytoken *t = (struct cipherkeytoken *)key;
694
695 rc = cca_check_secaescipherkey(debug_info, 3, key, 0, 1);
696 if (rc)
697 goto out;
698 if (ktype)
699 *ktype = PKEY_TYPE_CCA_CIPHER;
700 if (ksize) {
701 *ksize = PKEY_SIZE_UNKNOWN;
702 if (!t->plfver && t->wpllen == 512)
703 *ksize = PKEY_SIZE_AES_128;
704 else if (!t->plfver && t->wpllen == 576)
705 *ksize = PKEY_SIZE_AES_192;
706 else if (!t->plfver && t->wpllen == 640)
707 *ksize = PKEY_SIZE_AES_256;
708 }
709
710 rc = cca_findcard2(&_apqns, &_nr_apqns, *cardnr, *domain,
711 ZCRYPT_CEX6, AES_MK_SET, t->mkvp0, 0, 1);
712 if (rc == 0 && flags)
713 *flags = PKEY_FLAGS_MATCH_CUR_MKVP;
714 if (rc == -ENODEV) {
715 rc = cca_findcard2(&_apqns, &_nr_apqns,
716 *cardnr, *domain,
717 ZCRYPT_CEX6, AES_MK_SET,
718 0, t->mkvp0, 1);
719 if (rc == 0 && flags)
720 *flags = PKEY_FLAGS_MATCH_ALT_MKVP;
721 }
722 if (rc)
723 goto out;
724
725 *cardnr = ((struct pkey_apqn *)_apqns)->card;
726 *domain = ((struct pkey_apqn *)_apqns)->domain;
727
728 } else if (hdr->type == TOKTYPE_NON_CCA
729 && hdr->version == TOKVER_EP11_AES) {
730 struct ep11keyblob *kb = (struct ep11keyblob *)key;
731
732 rc = ep11_check_aes_key(debug_info, 3, key, keylen, 1);
733 if (rc)
734 goto out;
735 if (ktype)
736 *ktype = PKEY_TYPE_EP11;
737 if (ksize)
738 *ksize = kb->head.keybitlen;
739
740 rc = ep11_findcard2(&_apqns, &_nr_apqns, *cardnr, *domain,
741 ZCRYPT_CEX7, EP11_API_V, kb->wkvp);
742 if (rc)
743 goto out;
744
745 if (flags)
746 *flags = PKEY_FLAGS_MATCH_CUR_MKVP;
747
748 *cardnr = ((struct pkey_apqn *)_apqns)->card;
749 *domain = ((struct pkey_apqn *)_apqns)->domain;
750
751 } else
752 rc = -EINVAL;
753
754 out:
755 kfree(_apqns);
756 return rc;
757 }
758
pkey_keyblob2pkey2(const struct pkey_apqn * apqns,size_t nr_apqns,const u8 * key,size_t keylen,struct pkey_protkey * pkey)759 static int pkey_keyblob2pkey2(const struct pkey_apqn *apqns, size_t nr_apqns,
760 const u8 *key, size_t keylen,
761 struct pkey_protkey *pkey)
762 {
763 int i, card, dom, rc;
764 struct keytoken_header *hdr = (struct keytoken_header *)key;
765
766 /* check for at least one apqn given */
767 if (!apqns || !nr_apqns)
768 return -EINVAL;
769
770 if (keylen < sizeof(struct keytoken_header))
771 return -EINVAL;
772
773 if (hdr->type == TOKTYPE_CCA_INTERNAL) {
774 if (hdr->version == TOKVER_CCA_AES) {
775 if (keylen != sizeof(struct secaeskeytoken))
776 return -EINVAL;
777 if (cca_check_secaeskeytoken(debug_info, 3, key, 0))
778 return -EINVAL;
779 } else if (hdr->version == TOKVER_CCA_VLSC) {
780 if (keylen < hdr->len || keylen > MAXCCAVLSCTOKENSIZE)
781 return -EINVAL;
782 if (cca_check_secaescipherkey(debug_info, 3, key, 0, 1))
783 return -EINVAL;
784 } else {
785 DEBUG_ERR("%s unknown CCA internal token version %d\n",
786 __func__, hdr->version);
787 return -EINVAL;
788 }
789 } else if (hdr->type == TOKTYPE_NON_CCA) {
790 if (hdr->version == TOKVER_EP11_AES) {
791 if (keylen < sizeof(struct ep11keyblob))
792 return -EINVAL;
793 if (ep11_check_aes_key(debug_info, 3, key, keylen, 1))
794 return -EINVAL;
795 } else {
796 return pkey_nonccatok2pkey(key, keylen, pkey);
797 }
798 } else {
799 DEBUG_ERR("%s unknown/unsupported blob type %d\n",
800 __func__, hdr->type);
801 return -EINVAL;
802 }
803
804 /* simple try all apqns from the list */
805 for (i = 0, rc = -ENODEV; i < nr_apqns; i++) {
806 card = apqns[i].card;
807 dom = apqns[i].domain;
808 if (hdr->type == TOKTYPE_CCA_INTERNAL
809 && hdr->version == TOKVER_CCA_AES)
810 rc = cca_sec2protkey(card, dom, key, pkey->protkey,
811 &pkey->len, &pkey->type);
812 else if (hdr->type == TOKTYPE_CCA_INTERNAL
813 && hdr->version == TOKVER_CCA_VLSC)
814 rc = cca_cipher2protkey(card, dom, key, pkey->protkey,
815 &pkey->len, &pkey->type);
816 else { /* EP11 AES secure key blob */
817 struct ep11keyblob *kb = (struct ep11keyblob *) key;
818
819 pkey->len = sizeof(pkey->protkey);
820 rc = ep11_kblob2protkey(card, dom, key, kb->head.len,
821 pkey->protkey, &pkey->len,
822 &pkey->type);
823 }
824 if (rc == 0)
825 break;
826 }
827
828 return rc;
829 }
830
pkey_apqns4key(const u8 * key,size_t keylen,u32 flags,struct pkey_apqn * apqns,size_t * nr_apqns)831 static int pkey_apqns4key(const u8 *key, size_t keylen, u32 flags,
832 struct pkey_apqn *apqns, size_t *nr_apqns)
833 {
834 int rc;
835 u32 _nr_apqns, *_apqns = NULL;
836 struct keytoken_header *hdr = (struct keytoken_header *)key;
837
838 if (keylen < sizeof(struct keytoken_header) || flags == 0)
839 return -EINVAL;
840
841 if (hdr->type == TOKTYPE_NON_CCA
842 && (hdr->version == TOKVER_EP11_AES_WITH_HEADER
843 || hdr->version == TOKVER_EP11_ECC_WITH_HEADER)
844 && is_ep11_keyblob(key + sizeof(struct ep11kblob_header))) {
845 int minhwtype = 0, api = 0;
846 struct ep11keyblob *kb = (struct ep11keyblob *)
847 (key + sizeof(struct ep11kblob_header));
848
849 if (flags != PKEY_FLAGS_MATCH_CUR_MKVP)
850 return -EINVAL;
851 if (kb->attr & EP11_BLOB_PKEY_EXTRACTABLE) {
852 minhwtype = ZCRYPT_CEX7;
853 api = EP11_API_V;
854 }
855 rc = ep11_findcard2(&_apqns, &_nr_apqns, 0xFFFF, 0xFFFF,
856 minhwtype, api, kb->wkvp);
857 if (rc)
858 goto out;
859 } else if (hdr->type == TOKTYPE_NON_CCA
860 && hdr->version == TOKVER_EP11_AES
861 && is_ep11_keyblob(key)) {
862 int minhwtype = 0, api = 0;
863 struct ep11keyblob *kb = (struct ep11keyblob *) key;
864
865 if (flags != PKEY_FLAGS_MATCH_CUR_MKVP)
866 return -EINVAL;
867 if (kb->attr & EP11_BLOB_PKEY_EXTRACTABLE) {
868 minhwtype = ZCRYPT_CEX7;
869 api = EP11_API_V;
870 }
871 rc = ep11_findcard2(&_apqns, &_nr_apqns, 0xFFFF, 0xFFFF,
872 minhwtype, api, kb->wkvp);
873 if (rc)
874 goto out;
875 } else if (hdr->type == TOKTYPE_CCA_INTERNAL) {
876 int minhwtype = ZCRYPT_CEX3C;
877 u64 cur_mkvp = 0, old_mkvp = 0;
878
879 if (hdr->version == TOKVER_CCA_AES) {
880 struct secaeskeytoken *t = (struct secaeskeytoken *)key;
881
882 if (flags & PKEY_FLAGS_MATCH_CUR_MKVP)
883 cur_mkvp = t->mkvp;
884 if (flags & PKEY_FLAGS_MATCH_ALT_MKVP)
885 old_mkvp = t->mkvp;
886 } else if (hdr->version == TOKVER_CCA_VLSC) {
887 struct cipherkeytoken *t = (struct cipherkeytoken *)key;
888
889 minhwtype = ZCRYPT_CEX6;
890 if (flags & PKEY_FLAGS_MATCH_CUR_MKVP)
891 cur_mkvp = t->mkvp0;
892 if (flags & PKEY_FLAGS_MATCH_ALT_MKVP)
893 old_mkvp = t->mkvp0;
894 } else {
895 /* unknown cca internal token type */
896 return -EINVAL;
897 }
898 rc = cca_findcard2(&_apqns, &_nr_apqns, 0xFFFF, 0xFFFF,
899 minhwtype, AES_MK_SET,
900 cur_mkvp, old_mkvp, 1);
901 if (rc)
902 goto out;
903 } else if (hdr->type == TOKTYPE_CCA_INTERNAL_PKA) {
904 u64 cur_mkvp = 0, old_mkvp = 0;
905 struct eccprivkeytoken *t = (struct eccprivkeytoken *)key;
906
907 if (t->secid == 0x20) {
908 if (flags & PKEY_FLAGS_MATCH_CUR_MKVP)
909 cur_mkvp = t->mkvp;
910 if (flags & PKEY_FLAGS_MATCH_ALT_MKVP)
911 old_mkvp = t->mkvp;
912 } else {
913 /* unknown cca internal 2 token type */
914 return -EINVAL;
915 }
916 rc = cca_findcard2(&_apqns, &_nr_apqns, 0xFFFF, 0xFFFF,
917 ZCRYPT_CEX7, APKA_MK_SET,
918 cur_mkvp, old_mkvp, 1);
919 if (rc)
920 goto out;
921 } else
922 return -EINVAL;
923
924 if (apqns) {
925 if (*nr_apqns < _nr_apqns)
926 rc = -ENOSPC;
927 else
928 memcpy(apqns, _apqns, _nr_apqns * sizeof(u32));
929 }
930 *nr_apqns = _nr_apqns;
931
932 out:
933 kfree(_apqns);
934 return rc;
935 }
936
pkey_apqns4keytype(enum pkey_key_type ktype,u8 cur_mkvp[32],u8 alt_mkvp[32],u32 flags,struct pkey_apqn * apqns,size_t * nr_apqns)937 static int pkey_apqns4keytype(enum pkey_key_type ktype,
938 u8 cur_mkvp[32], u8 alt_mkvp[32], u32 flags,
939 struct pkey_apqn *apqns, size_t *nr_apqns)
940 {
941 int rc;
942 u32 _nr_apqns, *_apqns = NULL;
943
944 if (ktype == PKEY_TYPE_CCA_DATA || ktype == PKEY_TYPE_CCA_CIPHER) {
945 u64 cur_mkvp = 0, old_mkvp = 0;
946 int minhwtype = ZCRYPT_CEX3C;
947
948 if (flags & PKEY_FLAGS_MATCH_CUR_MKVP)
949 cur_mkvp = *((u64 *) cur_mkvp);
950 if (flags & PKEY_FLAGS_MATCH_ALT_MKVP)
951 old_mkvp = *((u64 *) alt_mkvp);
952 if (ktype == PKEY_TYPE_CCA_CIPHER)
953 minhwtype = ZCRYPT_CEX6;
954 rc = cca_findcard2(&_apqns, &_nr_apqns, 0xFFFF, 0xFFFF,
955 minhwtype, AES_MK_SET,
956 cur_mkvp, old_mkvp, 1);
957 if (rc)
958 goto out;
959 } else if (ktype == PKEY_TYPE_CCA_ECC) {
960 u64 cur_mkvp = 0, old_mkvp = 0;
961
962 if (flags & PKEY_FLAGS_MATCH_CUR_MKVP)
963 cur_mkvp = *((u64 *) cur_mkvp);
964 if (flags & PKEY_FLAGS_MATCH_ALT_MKVP)
965 old_mkvp = *((u64 *) alt_mkvp);
966 rc = cca_findcard2(&_apqns, &_nr_apqns, 0xFFFF, 0xFFFF,
967 ZCRYPT_CEX7, APKA_MK_SET,
968 cur_mkvp, old_mkvp, 1);
969 if (rc)
970 goto out;
971
972 } else if (ktype == PKEY_TYPE_EP11 ||
973 ktype == PKEY_TYPE_EP11_AES ||
974 ktype == PKEY_TYPE_EP11_ECC) {
975 u8 *wkvp = NULL;
976
977 if (flags & PKEY_FLAGS_MATCH_CUR_MKVP)
978 wkvp = cur_mkvp;
979 rc = ep11_findcard2(&_apqns, &_nr_apqns, 0xFFFF, 0xFFFF,
980 ZCRYPT_CEX7, EP11_API_V, wkvp);
981 if (rc)
982 goto out;
983
984 } else
985 return -EINVAL;
986
987 if (apqns) {
988 if (*nr_apqns < _nr_apqns)
989 rc = -ENOSPC;
990 else
991 memcpy(apqns, _apqns, _nr_apqns * sizeof(u32));
992 }
993 *nr_apqns = _nr_apqns;
994
995 out:
996 kfree(_apqns);
997 return rc;
998 }
999
pkey_keyblob2pkey3(const struct pkey_apqn * apqns,size_t nr_apqns,const u8 * key,size_t keylen,u32 * protkeytype,u8 * protkey,u32 * protkeylen)1000 static int pkey_keyblob2pkey3(const struct pkey_apqn *apqns, size_t nr_apqns,
1001 const u8 *key, size_t keylen, u32 *protkeytype,
1002 u8 *protkey, u32 *protkeylen)
1003 {
1004 int i, card, dom, rc;
1005 struct keytoken_header *hdr = (struct keytoken_header *)key;
1006
1007 /* check for at least one apqn given */
1008 if (!apqns || !nr_apqns)
1009 return -EINVAL;
1010
1011 if (keylen < sizeof(struct keytoken_header))
1012 return -EINVAL;
1013
1014 if (hdr->type == TOKTYPE_NON_CCA
1015 && hdr->version == TOKVER_EP11_AES_WITH_HEADER
1016 && is_ep11_keyblob(key + sizeof(struct ep11kblob_header))) {
1017 /* EP11 AES key blob with header */
1018 if (ep11_check_aes_key_with_hdr(debug_info, 3, key, keylen, 1))
1019 return -EINVAL;
1020 } else if (hdr->type == TOKTYPE_NON_CCA
1021 && hdr->version == TOKVER_EP11_ECC_WITH_HEADER
1022 && is_ep11_keyblob(key + sizeof(struct ep11kblob_header))) {
1023 /* EP11 ECC key blob with header */
1024 if (ep11_check_ecc_key_with_hdr(debug_info, 3, key, keylen, 1))
1025 return -EINVAL;
1026 } else if (hdr->type == TOKTYPE_NON_CCA
1027 && hdr->version == TOKVER_EP11_AES
1028 && is_ep11_keyblob(key)) {
1029 /* EP11 AES key blob with header in session field */
1030 if (ep11_check_aes_key(debug_info, 3, key, keylen, 1))
1031 return -EINVAL;
1032 } else if (hdr->type == TOKTYPE_CCA_INTERNAL) {
1033 if (hdr->version == TOKVER_CCA_AES) {
1034 /* CCA AES data key */
1035 if (keylen != sizeof(struct secaeskeytoken))
1036 return -EINVAL;
1037 if (cca_check_secaeskeytoken(debug_info, 3, key, 0))
1038 return -EINVAL;
1039 } else if (hdr->version == TOKVER_CCA_VLSC) {
1040 /* CCA AES cipher key */
1041 if (keylen < hdr->len || keylen > MAXCCAVLSCTOKENSIZE)
1042 return -EINVAL;
1043 if (cca_check_secaescipherkey(debug_info, 3, key, 0, 1))
1044 return -EINVAL;
1045 } else {
1046 DEBUG_ERR("%s unknown CCA internal token version %d\n",
1047 __func__, hdr->version);
1048 return -EINVAL;
1049 }
1050 } else if (hdr->type == TOKTYPE_CCA_INTERNAL_PKA) {
1051 /* CCA ECC (private) key */
1052 if (keylen < sizeof(struct eccprivkeytoken))
1053 return -EINVAL;
1054 if (cca_check_sececckeytoken(debug_info, 3, key, keylen, 1))
1055 return -EINVAL;
1056 } else if (hdr->type == TOKTYPE_NON_CCA) {
1057 struct pkey_protkey pkey;
1058
1059 rc = pkey_nonccatok2pkey(key, keylen, &pkey);
1060 if (rc)
1061 return rc;
1062 memcpy(protkey, pkey.protkey, pkey.len);
1063 *protkeylen = pkey.len;
1064 *protkeytype = pkey.type;
1065 return 0;
1066 } else {
1067 DEBUG_ERR("%s unknown/unsupported blob type %d\n",
1068 __func__, hdr->type);
1069 return -EINVAL;
1070 }
1071
1072 /* simple try all apqns from the list */
1073 for (rc = -ENODEV, i = 0; rc && i < nr_apqns; i++) {
1074 card = apqns[i].card;
1075 dom = apqns[i].domain;
1076 if (hdr->type == TOKTYPE_NON_CCA
1077 && (hdr->version == TOKVER_EP11_AES_WITH_HEADER
1078 || hdr->version == TOKVER_EP11_ECC_WITH_HEADER)
1079 && is_ep11_keyblob(key + sizeof(struct ep11kblob_header)))
1080 rc = ep11_kblob2protkey(card, dom, key, hdr->len,
1081 protkey, protkeylen, protkeytype);
1082 else if (hdr->type == TOKTYPE_NON_CCA
1083 && hdr->version == TOKVER_EP11_AES
1084 && is_ep11_keyblob(key))
1085 rc = ep11_kblob2protkey(card, dom, key, hdr->len,
1086 protkey, protkeylen, protkeytype);
1087 else if (hdr->type == TOKTYPE_CCA_INTERNAL &&
1088 hdr->version == TOKVER_CCA_AES)
1089 rc = cca_sec2protkey(card, dom, key, protkey,
1090 protkeylen, protkeytype);
1091 else if (hdr->type == TOKTYPE_CCA_INTERNAL &&
1092 hdr->version == TOKVER_CCA_VLSC)
1093 rc = cca_cipher2protkey(card, dom, key, protkey,
1094 protkeylen, protkeytype);
1095 else if (hdr->type == TOKTYPE_CCA_INTERNAL_PKA)
1096 rc = cca_ecc2protkey(card, dom, key, protkey,
1097 protkeylen, protkeytype);
1098 else
1099 return -EINVAL;
1100 }
1101
1102 return rc;
1103 }
1104
1105 /*
1106 * File io functions
1107 */
1108
_copy_key_from_user(void __user * ukey,size_t keylen)1109 static void *_copy_key_from_user(void __user *ukey, size_t keylen)
1110 {
1111 if (!ukey || keylen < MINKEYBLOBSIZE || keylen > KEYBLOBBUFSIZE)
1112 return ERR_PTR(-EINVAL);
1113
1114 return memdup_user(ukey, keylen);
1115 }
1116
_copy_apqns_from_user(void __user * uapqns,size_t nr_apqns)1117 static void *_copy_apqns_from_user(void __user *uapqns, size_t nr_apqns)
1118 {
1119 if (!uapqns || nr_apqns == 0)
1120 return NULL;
1121
1122 return memdup_user(uapqns, nr_apqns * sizeof(struct pkey_apqn));
1123 }
1124
pkey_unlocked_ioctl(struct file * filp,unsigned int cmd,unsigned long arg)1125 static long pkey_unlocked_ioctl(struct file *filp, unsigned int cmd,
1126 unsigned long arg)
1127 {
1128 int rc;
1129
1130 switch (cmd) {
1131 case PKEY_GENSECK: {
1132 struct pkey_genseck __user *ugs = (void __user *) arg;
1133 struct pkey_genseck kgs;
1134
1135 if (copy_from_user(&kgs, ugs, sizeof(kgs)))
1136 return -EFAULT;
1137 rc = cca_genseckey(kgs.cardnr, kgs.domain,
1138 kgs.keytype, kgs.seckey.seckey);
1139 DEBUG_DBG("%s cca_genseckey()=%d\n", __func__, rc);
1140 if (rc)
1141 break;
1142 if (copy_to_user(ugs, &kgs, sizeof(kgs)))
1143 return -EFAULT;
1144 break;
1145 }
1146 case PKEY_CLR2SECK: {
1147 struct pkey_clr2seck __user *ucs = (void __user *) arg;
1148 struct pkey_clr2seck kcs;
1149
1150 if (copy_from_user(&kcs, ucs, sizeof(kcs)))
1151 return -EFAULT;
1152 rc = cca_clr2seckey(kcs.cardnr, kcs.domain, kcs.keytype,
1153 kcs.clrkey.clrkey, kcs.seckey.seckey);
1154 DEBUG_DBG("%s cca_clr2seckey()=%d\n", __func__, rc);
1155 if (rc)
1156 break;
1157 if (copy_to_user(ucs, &kcs, sizeof(kcs)))
1158 return -EFAULT;
1159 memzero_explicit(&kcs, sizeof(kcs));
1160 break;
1161 }
1162 case PKEY_SEC2PROTK: {
1163 struct pkey_sec2protk __user *usp = (void __user *) arg;
1164 struct pkey_sec2protk ksp;
1165
1166 if (copy_from_user(&ksp, usp, sizeof(ksp)))
1167 return -EFAULT;
1168 rc = cca_sec2protkey(ksp.cardnr, ksp.domain,
1169 ksp.seckey.seckey, ksp.protkey.protkey,
1170 &ksp.protkey.len, &ksp.protkey.type);
1171 DEBUG_DBG("%s cca_sec2protkey()=%d\n", __func__, rc);
1172 if (rc)
1173 break;
1174 if (copy_to_user(usp, &ksp, sizeof(ksp)))
1175 return -EFAULT;
1176 break;
1177 }
1178 case PKEY_CLR2PROTK: {
1179 struct pkey_clr2protk __user *ucp = (void __user *) arg;
1180 struct pkey_clr2protk kcp;
1181
1182 if (copy_from_user(&kcp, ucp, sizeof(kcp)))
1183 return -EFAULT;
1184 rc = pkey_clr2protkey(kcp.keytype,
1185 &kcp.clrkey, &kcp.protkey);
1186 DEBUG_DBG("%s pkey_clr2protkey()=%d\n", __func__, rc);
1187 if (rc)
1188 break;
1189 if (copy_to_user(ucp, &kcp, sizeof(kcp)))
1190 return -EFAULT;
1191 memzero_explicit(&kcp, sizeof(kcp));
1192 break;
1193 }
1194 case PKEY_FINDCARD: {
1195 struct pkey_findcard __user *ufc = (void __user *) arg;
1196 struct pkey_findcard kfc;
1197
1198 if (copy_from_user(&kfc, ufc, sizeof(kfc)))
1199 return -EFAULT;
1200 rc = cca_findcard(kfc.seckey.seckey,
1201 &kfc.cardnr, &kfc.domain, 1);
1202 DEBUG_DBG("%s cca_findcard()=%d\n", __func__, rc);
1203 if (rc < 0)
1204 break;
1205 if (copy_to_user(ufc, &kfc, sizeof(kfc)))
1206 return -EFAULT;
1207 break;
1208 }
1209 case PKEY_SKEY2PKEY: {
1210 struct pkey_skey2pkey __user *usp = (void __user *) arg;
1211 struct pkey_skey2pkey ksp;
1212
1213 if (copy_from_user(&ksp, usp, sizeof(ksp)))
1214 return -EFAULT;
1215 rc = pkey_skey2pkey(ksp.seckey.seckey, &ksp.protkey);
1216 DEBUG_DBG("%s pkey_skey2pkey()=%d\n", __func__, rc);
1217 if (rc)
1218 break;
1219 if (copy_to_user(usp, &ksp, sizeof(ksp)))
1220 return -EFAULT;
1221 break;
1222 }
1223 case PKEY_VERIFYKEY: {
1224 struct pkey_verifykey __user *uvk = (void __user *) arg;
1225 struct pkey_verifykey kvk;
1226
1227 if (copy_from_user(&kvk, uvk, sizeof(kvk)))
1228 return -EFAULT;
1229 rc = pkey_verifykey(&kvk.seckey, &kvk.cardnr, &kvk.domain,
1230 &kvk.keysize, &kvk.attributes);
1231 DEBUG_DBG("%s pkey_verifykey()=%d\n", __func__, rc);
1232 if (rc)
1233 break;
1234 if (copy_to_user(uvk, &kvk, sizeof(kvk)))
1235 return -EFAULT;
1236 break;
1237 }
1238 case PKEY_GENPROTK: {
1239 struct pkey_genprotk __user *ugp = (void __user *) arg;
1240 struct pkey_genprotk kgp;
1241
1242 if (copy_from_user(&kgp, ugp, sizeof(kgp)))
1243 return -EFAULT;
1244 rc = pkey_genprotkey(kgp.keytype, &kgp.protkey);
1245 DEBUG_DBG("%s pkey_genprotkey()=%d\n", __func__, rc);
1246 if (rc)
1247 break;
1248 if (copy_to_user(ugp, &kgp, sizeof(kgp)))
1249 return -EFAULT;
1250 break;
1251 }
1252 case PKEY_VERIFYPROTK: {
1253 struct pkey_verifyprotk __user *uvp = (void __user *) arg;
1254 struct pkey_verifyprotk kvp;
1255
1256 if (copy_from_user(&kvp, uvp, sizeof(kvp)))
1257 return -EFAULT;
1258 rc = pkey_verifyprotkey(&kvp.protkey);
1259 DEBUG_DBG("%s pkey_verifyprotkey()=%d\n", __func__, rc);
1260 break;
1261 }
1262 case PKEY_KBLOB2PROTK: {
1263 struct pkey_kblob2pkey __user *utp = (void __user *) arg;
1264 struct pkey_kblob2pkey ktp;
1265 u8 *kkey;
1266
1267 if (copy_from_user(&ktp, utp, sizeof(ktp)))
1268 return -EFAULT;
1269 kkey = _copy_key_from_user(ktp.key, ktp.keylen);
1270 if (IS_ERR(kkey))
1271 return PTR_ERR(kkey);
1272 rc = pkey_keyblob2pkey(kkey, ktp.keylen, &ktp.protkey);
1273 DEBUG_DBG("%s pkey_keyblob2pkey()=%d\n", __func__, rc);
1274 kfree(kkey);
1275 if (rc)
1276 break;
1277 if (copy_to_user(utp, &ktp, sizeof(ktp)))
1278 return -EFAULT;
1279 break;
1280 }
1281 case PKEY_GENSECK2: {
1282 struct pkey_genseck2 __user *ugs = (void __user *) arg;
1283 struct pkey_genseck2 kgs;
1284 struct pkey_apqn *apqns;
1285 size_t klen = KEYBLOBBUFSIZE;
1286 u8 *kkey;
1287
1288 if (copy_from_user(&kgs, ugs, sizeof(kgs)))
1289 return -EFAULT;
1290 apqns = _copy_apqns_from_user(kgs.apqns, kgs.apqn_entries);
1291 if (IS_ERR(apqns))
1292 return PTR_ERR(apqns);
1293 kkey = kmalloc(klen, GFP_KERNEL);
1294 if (!kkey) {
1295 kfree(apqns);
1296 return -ENOMEM;
1297 }
1298 rc = pkey_genseckey2(apqns, kgs.apqn_entries,
1299 kgs.type, kgs.size, kgs.keygenflags,
1300 kkey, &klen);
1301 DEBUG_DBG("%s pkey_genseckey2()=%d\n", __func__, rc);
1302 kfree(apqns);
1303 if (rc) {
1304 kfree(kkey);
1305 break;
1306 }
1307 if (kgs.key) {
1308 if (kgs.keylen < klen) {
1309 kfree(kkey);
1310 return -EINVAL;
1311 }
1312 if (copy_to_user(kgs.key, kkey, klen)) {
1313 kfree(kkey);
1314 return -EFAULT;
1315 }
1316 }
1317 kgs.keylen = klen;
1318 if (copy_to_user(ugs, &kgs, sizeof(kgs)))
1319 rc = -EFAULT;
1320 kfree(kkey);
1321 break;
1322 }
1323 case PKEY_CLR2SECK2: {
1324 struct pkey_clr2seck2 __user *ucs = (void __user *) arg;
1325 struct pkey_clr2seck2 kcs;
1326 struct pkey_apqn *apqns;
1327 size_t klen = KEYBLOBBUFSIZE;
1328 u8 *kkey;
1329
1330 if (copy_from_user(&kcs, ucs, sizeof(kcs)))
1331 return -EFAULT;
1332 apqns = _copy_apqns_from_user(kcs.apqns, kcs.apqn_entries);
1333 if (IS_ERR(apqns))
1334 return PTR_ERR(apqns);
1335 kkey = kmalloc(klen, GFP_KERNEL);
1336 if (!kkey) {
1337 kfree(apqns);
1338 return -ENOMEM;
1339 }
1340 rc = pkey_clr2seckey2(apqns, kcs.apqn_entries,
1341 kcs.type, kcs.size, kcs.keygenflags,
1342 kcs.clrkey.clrkey, kkey, &klen);
1343 DEBUG_DBG("%s pkey_clr2seckey2()=%d\n", __func__, rc);
1344 kfree(apqns);
1345 if (rc) {
1346 kfree(kkey);
1347 break;
1348 }
1349 if (kcs.key) {
1350 if (kcs.keylen < klen) {
1351 kfree(kkey);
1352 return -EINVAL;
1353 }
1354 if (copy_to_user(kcs.key, kkey, klen)) {
1355 kfree(kkey);
1356 return -EFAULT;
1357 }
1358 }
1359 kcs.keylen = klen;
1360 if (copy_to_user(ucs, &kcs, sizeof(kcs)))
1361 rc = -EFAULT;
1362 memzero_explicit(&kcs, sizeof(kcs));
1363 kfree(kkey);
1364 break;
1365 }
1366 case PKEY_VERIFYKEY2: {
1367 struct pkey_verifykey2 __user *uvk = (void __user *) arg;
1368 struct pkey_verifykey2 kvk;
1369 u8 *kkey;
1370
1371 if (copy_from_user(&kvk, uvk, sizeof(kvk)))
1372 return -EFAULT;
1373 kkey = _copy_key_from_user(kvk.key, kvk.keylen);
1374 if (IS_ERR(kkey))
1375 return PTR_ERR(kkey);
1376 rc = pkey_verifykey2(kkey, kvk.keylen,
1377 &kvk.cardnr, &kvk.domain,
1378 &kvk.type, &kvk.size, &kvk.flags);
1379 DEBUG_DBG("%s pkey_verifykey2()=%d\n", __func__, rc);
1380 kfree(kkey);
1381 if (rc)
1382 break;
1383 if (copy_to_user(uvk, &kvk, sizeof(kvk)))
1384 return -EFAULT;
1385 break;
1386 }
1387 case PKEY_KBLOB2PROTK2: {
1388 struct pkey_kblob2pkey2 __user *utp = (void __user *) arg;
1389 struct pkey_kblob2pkey2 ktp;
1390 struct pkey_apqn *apqns = NULL;
1391 u8 *kkey;
1392
1393 if (copy_from_user(&ktp, utp, sizeof(ktp)))
1394 return -EFAULT;
1395 apqns = _copy_apqns_from_user(ktp.apqns, ktp.apqn_entries);
1396 if (IS_ERR(apqns))
1397 return PTR_ERR(apqns);
1398 kkey = _copy_key_from_user(ktp.key, ktp.keylen);
1399 if (IS_ERR(kkey)) {
1400 kfree(apqns);
1401 return PTR_ERR(kkey);
1402 }
1403 rc = pkey_keyblob2pkey2(apqns, ktp.apqn_entries,
1404 kkey, ktp.keylen, &ktp.protkey);
1405 DEBUG_DBG("%s pkey_keyblob2pkey2()=%d\n", __func__, rc);
1406 kfree(apqns);
1407 kfree(kkey);
1408 if (rc)
1409 break;
1410 if (copy_to_user(utp, &ktp, sizeof(ktp)))
1411 return -EFAULT;
1412 break;
1413 }
1414 case PKEY_APQNS4K: {
1415 struct pkey_apqns4key __user *uak = (void __user *) arg;
1416 struct pkey_apqns4key kak;
1417 struct pkey_apqn *apqns = NULL;
1418 size_t nr_apqns, len;
1419 u8 *kkey;
1420
1421 if (copy_from_user(&kak, uak, sizeof(kak)))
1422 return -EFAULT;
1423 nr_apqns = kak.apqn_entries;
1424 if (nr_apqns) {
1425 apqns = kmalloc_array(nr_apqns,
1426 sizeof(struct pkey_apqn),
1427 GFP_KERNEL);
1428 if (!apqns)
1429 return -ENOMEM;
1430 }
1431 kkey = _copy_key_from_user(kak.key, kak.keylen);
1432 if (IS_ERR(kkey)) {
1433 kfree(apqns);
1434 return PTR_ERR(kkey);
1435 }
1436 rc = pkey_apqns4key(kkey, kak.keylen, kak.flags,
1437 apqns, &nr_apqns);
1438 DEBUG_DBG("%s pkey_apqns4key()=%d\n", __func__, rc);
1439 kfree(kkey);
1440 if (rc && rc != -ENOSPC) {
1441 kfree(apqns);
1442 break;
1443 }
1444 if (!rc && kak.apqns) {
1445 if (nr_apqns > kak.apqn_entries) {
1446 kfree(apqns);
1447 return -EINVAL;
1448 }
1449 len = nr_apqns * sizeof(struct pkey_apqn);
1450 if (len) {
1451 if (copy_to_user(kak.apqns, apqns, len)) {
1452 kfree(apqns);
1453 return -EFAULT;
1454 }
1455 }
1456 }
1457 kak.apqn_entries = nr_apqns;
1458 if (copy_to_user(uak, &kak, sizeof(kak)))
1459 rc = -EFAULT;
1460 kfree(apqns);
1461 break;
1462 }
1463 case PKEY_APQNS4KT: {
1464 struct pkey_apqns4keytype __user *uat = (void __user *) arg;
1465 struct pkey_apqns4keytype kat;
1466 struct pkey_apqn *apqns = NULL;
1467 size_t nr_apqns, len;
1468
1469 if (copy_from_user(&kat, uat, sizeof(kat)))
1470 return -EFAULT;
1471 nr_apqns = kat.apqn_entries;
1472 if (nr_apqns) {
1473 apqns = kmalloc_array(nr_apqns,
1474 sizeof(struct pkey_apqn),
1475 GFP_KERNEL);
1476 if (!apqns)
1477 return -ENOMEM;
1478 }
1479 rc = pkey_apqns4keytype(kat.type, kat.cur_mkvp, kat.alt_mkvp,
1480 kat.flags, apqns, &nr_apqns);
1481 DEBUG_DBG("%s pkey_apqns4keytype()=%d\n", __func__, rc);
1482 if (rc && rc != -ENOSPC) {
1483 kfree(apqns);
1484 break;
1485 }
1486 if (!rc && kat.apqns) {
1487 if (nr_apqns > kat.apqn_entries) {
1488 kfree(apqns);
1489 return -EINVAL;
1490 }
1491 len = nr_apqns * sizeof(struct pkey_apqn);
1492 if (len) {
1493 if (copy_to_user(kat.apqns, apqns, len)) {
1494 kfree(apqns);
1495 return -EFAULT;
1496 }
1497 }
1498 }
1499 kat.apqn_entries = nr_apqns;
1500 if (copy_to_user(uat, &kat, sizeof(kat)))
1501 rc = -EFAULT;
1502 kfree(apqns);
1503 break;
1504 }
1505 case PKEY_KBLOB2PROTK3: {
1506 struct pkey_kblob2pkey3 __user *utp = (void __user *) arg;
1507 struct pkey_kblob2pkey3 ktp;
1508 struct pkey_apqn *apqns = NULL;
1509 u32 protkeylen = PROTKEYBLOBBUFSIZE;
1510 u8 *kkey, *protkey;
1511
1512 if (copy_from_user(&ktp, utp, sizeof(ktp)))
1513 return -EFAULT;
1514 apqns = _copy_apqns_from_user(ktp.apqns, ktp.apqn_entries);
1515 if (IS_ERR(apqns))
1516 return PTR_ERR(apqns);
1517 kkey = _copy_key_from_user(ktp.key, ktp.keylen);
1518 if (IS_ERR(kkey)) {
1519 kfree(apqns);
1520 return PTR_ERR(kkey);
1521 }
1522 protkey = kmalloc(protkeylen, GFP_KERNEL);
1523 if (!protkey) {
1524 kfree(apqns);
1525 kfree(kkey);
1526 return -ENOMEM;
1527 }
1528 rc = pkey_keyblob2pkey3(apqns, ktp.apqn_entries, kkey,
1529 ktp.keylen, &ktp.pkeytype,
1530 protkey, &protkeylen);
1531 DEBUG_DBG("%s pkey_keyblob2pkey3()=%d\n", __func__, rc);
1532 kfree(apqns);
1533 kfree(kkey);
1534 if (rc) {
1535 kfree(protkey);
1536 break;
1537 }
1538 if (ktp.pkey && ktp.pkeylen) {
1539 if (protkeylen > ktp.pkeylen) {
1540 kfree(protkey);
1541 return -EINVAL;
1542 }
1543 if (copy_to_user(ktp.pkey, protkey, protkeylen)) {
1544 kfree(protkey);
1545 return -EFAULT;
1546 }
1547 }
1548 kfree(protkey);
1549 ktp.pkeylen = protkeylen;
1550 if (copy_to_user(utp, &ktp, sizeof(ktp)))
1551 return -EFAULT;
1552 break;
1553 }
1554 default:
1555 /* unknown/unsupported ioctl cmd */
1556 return -ENOTTY;
1557 }
1558
1559 return rc;
1560 }
1561
1562 /*
1563 * Sysfs and file io operations
1564 */
1565
1566 /*
1567 * Sysfs attribute read function for all protected key binary attributes.
1568 * The implementation can not deal with partial reads, because a new random
1569 * protected key blob is generated with each read. In case of partial reads
1570 * (i.e. off != 0 or count < key blob size) -EINVAL is returned.
1571 */
pkey_protkey_aes_attr_read(u32 keytype,bool is_xts,char * buf,loff_t off,size_t count)1572 static ssize_t pkey_protkey_aes_attr_read(u32 keytype, bool is_xts, char *buf,
1573 loff_t off, size_t count)
1574 {
1575 struct protaeskeytoken protkeytoken;
1576 struct pkey_protkey protkey;
1577 int rc;
1578
1579 if (off != 0 || count < sizeof(protkeytoken))
1580 return -EINVAL;
1581 if (is_xts)
1582 if (count < 2 * sizeof(protkeytoken))
1583 return -EINVAL;
1584
1585 memset(&protkeytoken, 0, sizeof(protkeytoken));
1586 protkeytoken.type = TOKTYPE_NON_CCA;
1587 protkeytoken.version = TOKVER_PROTECTED_KEY;
1588 protkeytoken.keytype = keytype;
1589
1590 rc = pkey_genprotkey(protkeytoken.keytype, &protkey);
1591 if (rc)
1592 return rc;
1593
1594 protkeytoken.len = protkey.len;
1595 memcpy(&protkeytoken.protkey, &protkey.protkey, protkey.len);
1596
1597 memcpy(buf, &protkeytoken, sizeof(protkeytoken));
1598
1599 if (is_xts) {
1600 rc = pkey_genprotkey(protkeytoken.keytype, &protkey);
1601 if (rc)
1602 return rc;
1603
1604 protkeytoken.len = protkey.len;
1605 memcpy(&protkeytoken.protkey, &protkey.protkey, protkey.len);
1606
1607 memcpy(buf + sizeof(protkeytoken), &protkeytoken,
1608 sizeof(protkeytoken));
1609
1610 return 2 * sizeof(protkeytoken);
1611 }
1612
1613 return sizeof(protkeytoken);
1614 }
1615
protkey_aes_128_read(struct file * filp,struct kobject * kobj,struct bin_attribute * attr,char * buf,loff_t off,size_t count)1616 static ssize_t protkey_aes_128_read(struct file *filp,
1617 struct kobject *kobj,
1618 struct bin_attribute *attr,
1619 char *buf, loff_t off,
1620 size_t count)
1621 {
1622 return pkey_protkey_aes_attr_read(PKEY_KEYTYPE_AES_128, false, buf,
1623 off, count);
1624 }
1625
protkey_aes_192_read(struct file * filp,struct kobject * kobj,struct bin_attribute * attr,char * buf,loff_t off,size_t count)1626 static ssize_t protkey_aes_192_read(struct file *filp,
1627 struct kobject *kobj,
1628 struct bin_attribute *attr,
1629 char *buf, loff_t off,
1630 size_t count)
1631 {
1632 return pkey_protkey_aes_attr_read(PKEY_KEYTYPE_AES_192, false, buf,
1633 off, count);
1634 }
1635
protkey_aes_256_read(struct file * filp,struct kobject * kobj,struct bin_attribute * attr,char * buf,loff_t off,size_t count)1636 static ssize_t protkey_aes_256_read(struct file *filp,
1637 struct kobject *kobj,
1638 struct bin_attribute *attr,
1639 char *buf, loff_t off,
1640 size_t count)
1641 {
1642 return pkey_protkey_aes_attr_read(PKEY_KEYTYPE_AES_256, false, buf,
1643 off, count);
1644 }
1645
protkey_aes_128_xts_read(struct file * filp,struct kobject * kobj,struct bin_attribute * attr,char * buf,loff_t off,size_t count)1646 static ssize_t protkey_aes_128_xts_read(struct file *filp,
1647 struct kobject *kobj,
1648 struct bin_attribute *attr,
1649 char *buf, loff_t off,
1650 size_t count)
1651 {
1652 return pkey_protkey_aes_attr_read(PKEY_KEYTYPE_AES_128, true, buf,
1653 off, count);
1654 }
1655
protkey_aes_256_xts_read(struct file * filp,struct kobject * kobj,struct bin_attribute * attr,char * buf,loff_t off,size_t count)1656 static ssize_t protkey_aes_256_xts_read(struct file *filp,
1657 struct kobject *kobj,
1658 struct bin_attribute *attr,
1659 char *buf, loff_t off,
1660 size_t count)
1661 {
1662 return pkey_protkey_aes_attr_read(PKEY_KEYTYPE_AES_256, true, buf,
1663 off, count);
1664 }
1665
1666 static BIN_ATTR_RO(protkey_aes_128, sizeof(struct protaeskeytoken));
1667 static BIN_ATTR_RO(protkey_aes_192, sizeof(struct protaeskeytoken));
1668 static BIN_ATTR_RO(protkey_aes_256, sizeof(struct protaeskeytoken));
1669 static BIN_ATTR_RO(protkey_aes_128_xts, 2 * sizeof(struct protaeskeytoken));
1670 static BIN_ATTR_RO(protkey_aes_256_xts, 2 * sizeof(struct protaeskeytoken));
1671
1672 static struct bin_attribute *protkey_attrs[] = {
1673 &bin_attr_protkey_aes_128,
1674 &bin_attr_protkey_aes_192,
1675 &bin_attr_protkey_aes_256,
1676 &bin_attr_protkey_aes_128_xts,
1677 &bin_attr_protkey_aes_256_xts,
1678 NULL
1679 };
1680
1681 static struct attribute_group protkey_attr_group = {
1682 .name = "protkey",
1683 .bin_attrs = protkey_attrs,
1684 };
1685
1686 /*
1687 * Sysfs attribute read function for all secure key ccadata binary attributes.
1688 * The implementation can not deal with partial reads, because a new random
1689 * protected key blob is generated with each read. In case of partial reads
1690 * (i.e. off != 0 or count < key blob size) -EINVAL is returned.
1691 */
pkey_ccadata_aes_attr_read(u32 keytype,bool is_xts,char * buf,loff_t off,size_t count)1692 static ssize_t pkey_ccadata_aes_attr_read(u32 keytype, bool is_xts, char *buf,
1693 loff_t off, size_t count)
1694 {
1695 int rc;
1696 struct pkey_seckey *seckey = (struct pkey_seckey *) buf;
1697
1698 if (off != 0 || count < sizeof(struct secaeskeytoken))
1699 return -EINVAL;
1700 if (is_xts)
1701 if (count < 2 * sizeof(struct secaeskeytoken))
1702 return -EINVAL;
1703
1704 rc = cca_genseckey(-1, -1, keytype, seckey->seckey);
1705 if (rc)
1706 return rc;
1707
1708 if (is_xts) {
1709 seckey++;
1710 rc = cca_genseckey(-1, -1, keytype, seckey->seckey);
1711 if (rc)
1712 return rc;
1713
1714 return 2 * sizeof(struct secaeskeytoken);
1715 }
1716
1717 return sizeof(struct secaeskeytoken);
1718 }
1719
ccadata_aes_128_read(struct file * filp,struct kobject * kobj,struct bin_attribute * attr,char * buf,loff_t off,size_t count)1720 static ssize_t ccadata_aes_128_read(struct file *filp,
1721 struct kobject *kobj,
1722 struct bin_attribute *attr,
1723 char *buf, loff_t off,
1724 size_t count)
1725 {
1726 return pkey_ccadata_aes_attr_read(PKEY_KEYTYPE_AES_128, false, buf,
1727 off, count);
1728 }
1729
ccadata_aes_192_read(struct file * filp,struct kobject * kobj,struct bin_attribute * attr,char * buf,loff_t off,size_t count)1730 static ssize_t ccadata_aes_192_read(struct file *filp,
1731 struct kobject *kobj,
1732 struct bin_attribute *attr,
1733 char *buf, loff_t off,
1734 size_t count)
1735 {
1736 return pkey_ccadata_aes_attr_read(PKEY_KEYTYPE_AES_192, false, buf,
1737 off, count);
1738 }
1739
ccadata_aes_256_read(struct file * filp,struct kobject * kobj,struct bin_attribute * attr,char * buf,loff_t off,size_t count)1740 static ssize_t ccadata_aes_256_read(struct file *filp,
1741 struct kobject *kobj,
1742 struct bin_attribute *attr,
1743 char *buf, loff_t off,
1744 size_t count)
1745 {
1746 return pkey_ccadata_aes_attr_read(PKEY_KEYTYPE_AES_256, false, buf,
1747 off, count);
1748 }
1749
ccadata_aes_128_xts_read(struct file * filp,struct kobject * kobj,struct bin_attribute * attr,char * buf,loff_t off,size_t count)1750 static ssize_t ccadata_aes_128_xts_read(struct file *filp,
1751 struct kobject *kobj,
1752 struct bin_attribute *attr,
1753 char *buf, loff_t off,
1754 size_t count)
1755 {
1756 return pkey_ccadata_aes_attr_read(PKEY_KEYTYPE_AES_128, true, buf,
1757 off, count);
1758 }
1759
ccadata_aes_256_xts_read(struct file * filp,struct kobject * kobj,struct bin_attribute * attr,char * buf,loff_t off,size_t count)1760 static ssize_t ccadata_aes_256_xts_read(struct file *filp,
1761 struct kobject *kobj,
1762 struct bin_attribute *attr,
1763 char *buf, loff_t off,
1764 size_t count)
1765 {
1766 return pkey_ccadata_aes_attr_read(PKEY_KEYTYPE_AES_256, true, buf,
1767 off, count);
1768 }
1769
1770 static BIN_ATTR_RO(ccadata_aes_128, sizeof(struct secaeskeytoken));
1771 static BIN_ATTR_RO(ccadata_aes_192, sizeof(struct secaeskeytoken));
1772 static BIN_ATTR_RO(ccadata_aes_256, sizeof(struct secaeskeytoken));
1773 static BIN_ATTR_RO(ccadata_aes_128_xts, 2 * sizeof(struct secaeskeytoken));
1774 static BIN_ATTR_RO(ccadata_aes_256_xts, 2 * sizeof(struct secaeskeytoken));
1775
1776 static struct bin_attribute *ccadata_attrs[] = {
1777 &bin_attr_ccadata_aes_128,
1778 &bin_attr_ccadata_aes_192,
1779 &bin_attr_ccadata_aes_256,
1780 &bin_attr_ccadata_aes_128_xts,
1781 &bin_attr_ccadata_aes_256_xts,
1782 NULL
1783 };
1784
1785 static struct attribute_group ccadata_attr_group = {
1786 .name = "ccadata",
1787 .bin_attrs = ccadata_attrs,
1788 };
1789
1790 #define CCACIPHERTOKENSIZE (sizeof(struct cipherkeytoken) + 80)
1791
1792 /*
1793 * Sysfs attribute read function for all secure key ccacipher binary attributes.
1794 * The implementation can not deal with partial reads, because a new random
1795 * secure key blob is generated with each read. In case of partial reads
1796 * (i.e. off != 0 or count < key blob size) -EINVAL is returned.
1797 */
pkey_ccacipher_aes_attr_read(enum pkey_key_size keybits,bool is_xts,char * buf,loff_t off,size_t count)1798 static ssize_t pkey_ccacipher_aes_attr_read(enum pkey_key_size keybits,
1799 bool is_xts, char *buf, loff_t off,
1800 size_t count)
1801 {
1802 int i, rc, card, dom;
1803 u32 nr_apqns, *apqns = NULL;
1804 size_t keysize = CCACIPHERTOKENSIZE;
1805
1806 if (off != 0 || count < CCACIPHERTOKENSIZE)
1807 return -EINVAL;
1808 if (is_xts)
1809 if (count < 2 * CCACIPHERTOKENSIZE)
1810 return -EINVAL;
1811
1812 /* build a list of apqns able to generate an cipher key */
1813 rc = cca_findcard2(&apqns, &nr_apqns, 0xFFFF, 0xFFFF,
1814 ZCRYPT_CEX6, 0, 0, 0, 0);
1815 if (rc)
1816 return rc;
1817
1818 memset(buf, 0, is_xts ? 2 * keysize : keysize);
1819
1820 /* simple try all apqns from the list */
1821 for (i = 0, rc = -ENODEV; i < nr_apqns; i++) {
1822 card = apqns[i] >> 16;
1823 dom = apqns[i] & 0xFFFF;
1824 rc = cca_gencipherkey(card, dom, keybits, 0, buf, &keysize);
1825 if (rc == 0)
1826 break;
1827 }
1828 if (rc)
1829 return rc;
1830
1831 if (is_xts) {
1832 keysize = CCACIPHERTOKENSIZE;
1833 buf += CCACIPHERTOKENSIZE;
1834 rc = cca_gencipherkey(card, dom, keybits, 0, buf, &keysize);
1835 if (rc == 0)
1836 return 2 * CCACIPHERTOKENSIZE;
1837 }
1838
1839 return CCACIPHERTOKENSIZE;
1840 }
1841
ccacipher_aes_128_read(struct file * filp,struct kobject * kobj,struct bin_attribute * attr,char * buf,loff_t off,size_t count)1842 static ssize_t ccacipher_aes_128_read(struct file *filp,
1843 struct kobject *kobj,
1844 struct bin_attribute *attr,
1845 char *buf, loff_t off,
1846 size_t count)
1847 {
1848 return pkey_ccacipher_aes_attr_read(PKEY_SIZE_AES_128, false, buf,
1849 off, count);
1850 }
1851
ccacipher_aes_192_read(struct file * filp,struct kobject * kobj,struct bin_attribute * attr,char * buf,loff_t off,size_t count)1852 static ssize_t ccacipher_aes_192_read(struct file *filp,
1853 struct kobject *kobj,
1854 struct bin_attribute *attr,
1855 char *buf, loff_t off,
1856 size_t count)
1857 {
1858 return pkey_ccacipher_aes_attr_read(PKEY_SIZE_AES_192, false, buf,
1859 off, count);
1860 }
1861
ccacipher_aes_256_read(struct file * filp,struct kobject * kobj,struct bin_attribute * attr,char * buf,loff_t off,size_t count)1862 static ssize_t ccacipher_aes_256_read(struct file *filp,
1863 struct kobject *kobj,
1864 struct bin_attribute *attr,
1865 char *buf, loff_t off,
1866 size_t count)
1867 {
1868 return pkey_ccacipher_aes_attr_read(PKEY_SIZE_AES_256, false, buf,
1869 off, count);
1870 }
1871
ccacipher_aes_128_xts_read(struct file * filp,struct kobject * kobj,struct bin_attribute * attr,char * buf,loff_t off,size_t count)1872 static ssize_t ccacipher_aes_128_xts_read(struct file *filp,
1873 struct kobject *kobj,
1874 struct bin_attribute *attr,
1875 char *buf, loff_t off,
1876 size_t count)
1877 {
1878 return pkey_ccacipher_aes_attr_read(PKEY_SIZE_AES_128, true, buf,
1879 off, count);
1880 }
1881
ccacipher_aes_256_xts_read(struct file * filp,struct kobject * kobj,struct bin_attribute * attr,char * buf,loff_t off,size_t count)1882 static ssize_t ccacipher_aes_256_xts_read(struct file *filp,
1883 struct kobject *kobj,
1884 struct bin_attribute *attr,
1885 char *buf, loff_t off,
1886 size_t count)
1887 {
1888 return pkey_ccacipher_aes_attr_read(PKEY_SIZE_AES_256, true, buf,
1889 off, count);
1890 }
1891
1892 static BIN_ATTR_RO(ccacipher_aes_128, CCACIPHERTOKENSIZE);
1893 static BIN_ATTR_RO(ccacipher_aes_192, CCACIPHERTOKENSIZE);
1894 static BIN_ATTR_RO(ccacipher_aes_256, CCACIPHERTOKENSIZE);
1895 static BIN_ATTR_RO(ccacipher_aes_128_xts, 2 * CCACIPHERTOKENSIZE);
1896 static BIN_ATTR_RO(ccacipher_aes_256_xts, 2 * CCACIPHERTOKENSIZE);
1897
1898 static struct bin_attribute *ccacipher_attrs[] = {
1899 &bin_attr_ccacipher_aes_128,
1900 &bin_attr_ccacipher_aes_192,
1901 &bin_attr_ccacipher_aes_256,
1902 &bin_attr_ccacipher_aes_128_xts,
1903 &bin_attr_ccacipher_aes_256_xts,
1904 NULL
1905 };
1906
1907 static struct attribute_group ccacipher_attr_group = {
1908 .name = "ccacipher",
1909 .bin_attrs = ccacipher_attrs,
1910 };
1911
1912 /*
1913 * Sysfs attribute read function for all ep11 aes key binary attributes.
1914 * The implementation can not deal with partial reads, because a new random
1915 * secure key blob is generated with each read. In case of partial reads
1916 * (i.e. off != 0 or count < key blob size) -EINVAL is returned.
1917 * This function and the sysfs attributes using it provide EP11 key blobs
1918 * padded to the upper limit of MAXEP11AESKEYBLOBSIZE which is currently
1919 * 320 bytes.
1920 */
pkey_ep11_aes_attr_read(enum pkey_key_size keybits,bool is_xts,char * buf,loff_t off,size_t count)1921 static ssize_t pkey_ep11_aes_attr_read(enum pkey_key_size keybits,
1922 bool is_xts, char *buf, loff_t off,
1923 size_t count)
1924 {
1925 int i, rc, card, dom;
1926 u32 nr_apqns, *apqns = NULL;
1927 size_t keysize = MAXEP11AESKEYBLOBSIZE;
1928
1929 if (off != 0 || count < MAXEP11AESKEYBLOBSIZE)
1930 return -EINVAL;
1931 if (is_xts)
1932 if (count < 2 * MAXEP11AESKEYBLOBSIZE)
1933 return -EINVAL;
1934
1935 /* build a list of apqns able to generate an cipher key */
1936 rc = ep11_findcard2(&apqns, &nr_apqns, 0xFFFF, 0xFFFF,
1937 ZCRYPT_CEX7, EP11_API_V, NULL);
1938 if (rc)
1939 return rc;
1940
1941 memset(buf, 0, is_xts ? 2 * keysize : keysize);
1942
1943 /* simple try all apqns from the list */
1944 for (i = 0, rc = -ENODEV; i < nr_apqns; i++) {
1945 card = apqns[i] >> 16;
1946 dom = apqns[i] & 0xFFFF;
1947 rc = ep11_genaeskey(card, dom, keybits, 0, buf, &keysize);
1948 if (rc == 0)
1949 break;
1950 }
1951 if (rc)
1952 return rc;
1953
1954 if (is_xts) {
1955 keysize = MAXEP11AESKEYBLOBSIZE;
1956 buf += MAXEP11AESKEYBLOBSIZE;
1957 rc = ep11_genaeskey(card, dom, keybits, 0, buf, &keysize);
1958 if (rc == 0)
1959 return 2 * MAXEP11AESKEYBLOBSIZE;
1960 }
1961
1962 return MAXEP11AESKEYBLOBSIZE;
1963 }
1964
ep11_aes_128_read(struct file * filp,struct kobject * kobj,struct bin_attribute * attr,char * buf,loff_t off,size_t count)1965 static ssize_t ep11_aes_128_read(struct file *filp,
1966 struct kobject *kobj,
1967 struct bin_attribute *attr,
1968 char *buf, loff_t off,
1969 size_t count)
1970 {
1971 return pkey_ep11_aes_attr_read(PKEY_SIZE_AES_128, false, buf,
1972 off, count);
1973 }
1974
ep11_aes_192_read(struct file * filp,struct kobject * kobj,struct bin_attribute * attr,char * buf,loff_t off,size_t count)1975 static ssize_t ep11_aes_192_read(struct file *filp,
1976 struct kobject *kobj,
1977 struct bin_attribute *attr,
1978 char *buf, loff_t off,
1979 size_t count)
1980 {
1981 return pkey_ep11_aes_attr_read(PKEY_SIZE_AES_192, false, buf,
1982 off, count);
1983 }
1984
ep11_aes_256_read(struct file * filp,struct kobject * kobj,struct bin_attribute * attr,char * buf,loff_t off,size_t count)1985 static ssize_t ep11_aes_256_read(struct file *filp,
1986 struct kobject *kobj,
1987 struct bin_attribute *attr,
1988 char *buf, loff_t off,
1989 size_t count)
1990 {
1991 return pkey_ep11_aes_attr_read(PKEY_SIZE_AES_256, false, buf,
1992 off, count);
1993 }
1994
ep11_aes_128_xts_read(struct file * filp,struct kobject * kobj,struct bin_attribute * attr,char * buf,loff_t off,size_t count)1995 static ssize_t ep11_aes_128_xts_read(struct file *filp,
1996 struct kobject *kobj,
1997 struct bin_attribute *attr,
1998 char *buf, loff_t off,
1999 size_t count)
2000 {
2001 return pkey_ep11_aes_attr_read(PKEY_SIZE_AES_128, true, buf,
2002 off, count);
2003 }
2004
ep11_aes_256_xts_read(struct file * filp,struct kobject * kobj,struct bin_attribute * attr,char * buf,loff_t off,size_t count)2005 static ssize_t ep11_aes_256_xts_read(struct file *filp,
2006 struct kobject *kobj,
2007 struct bin_attribute *attr,
2008 char *buf, loff_t off,
2009 size_t count)
2010 {
2011 return pkey_ep11_aes_attr_read(PKEY_SIZE_AES_256, true, buf,
2012 off, count);
2013 }
2014
2015 static BIN_ATTR_RO(ep11_aes_128, MAXEP11AESKEYBLOBSIZE);
2016 static BIN_ATTR_RO(ep11_aes_192, MAXEP11AESKEYBLOBSIZE);
2017 static BIN_ATTR_RO(ep11_aes_256, MAXEP11AESKEYBLOBSIZE);
2018 static BIN_ATTR_RO(ep11_aes_128_xts, 2 * MAXEP11AESKEYBLOBSIZE);
2019 static BIN_ATTR_RO(ep11_aes_256_xts, 2 * MAXEP11AESKEYBLOBSIZE);
2020
2021 static struct bin_attribute *ep11_attrs[] = {
2022 &bin_attr_ep11_aes_128,
2023 &bin_attr_ep11_aes_192,
2024 &bin_attr_ep11_aes_256,
2025 &bin_attr_ep11_aes_128_xts,
2026 &bin_attr_ep11_aes_256_xts,
2027 NULL
2028 };
2029
2030 static struct attribute_group ep11_attr_group = {
2031 .name = "ep11",
2032 .bin_attrs = ep11_attrs,
2033 };
2034
2035 static const struct attribute_group *pkey_attr_groups[] = {
2036 &protkey_attr_group,
2037 &ccadata_attr_group,
2038 &ccacipher_attr_group,
2039 &ep11_attr_group,
2040 NULL,
2041 };
2042
2043 static const struct file_operations pkey_fops = {
2044 .owner = THIS_MODULE,
2045 .open = nonseekable_open,
2046 .llseek = no_llseek,
2047 .unlocked_ioctl = pkey_unlocked_ioctl,
2048 };
2049
2050 static struct miscdevice pkey_dev = {
2051 .name = "pkey",
2052 .minor = MISC_DYNAMIC_MINOR,
2053 .mode = 0666,
2054 .fops = &pkey_fops,
2055 .groups = pkey_attr_groups,
2056 };
2057
2058 /*
2059 * Module init
2060 */
pkey_init(void)2061 static int __init pkey_init(void)
2062 {
2063 cpacf_mask_t func_mask;
2064
2065 /*
2066 * The pckmo instruction should be available - even if we don't
2067 * actually invoke it. This instruction comes with MSA 3 which
2068 * is also the minimum level for the kmc instructions which
2069 * are able to work with protected keys.
2070 */
2071 if (!cpacf_query(CPACF_PCKMO, &func_mask))
2072 return -ENODEV;
2073
2074 /* check for kmc instructions available */
2075 if (!cpacf_query(CPACF_KMC, &func_mask))
2076 return -ENODEV;
2077 if (!cpacf_test_func(&func_mask, CPACF_KMC_PAES_128) ||
2078 !cpacf_test_func(&func_mask, CPACF_KMC_PAES_192) ||
2079 !cpacf_test_func(&func_mask, CPACF_KMC_PAES_256))
2080 return -ENODEV;
2081
2082 pkey_debug_init();
2083
2084 return misc_register(&pkey_dev);
2085 }
2086
2087 /*
2088 * Module exit
2089 */
pkey_exit(void)2090 static void __exit pkey_exit(void)
2091 {
2092 misc_deregister(&pkey_dev);
2093 pkey_debug_exit();
2094 }
2095
2096 module_cpu_feature_match(MSA, pkey_init);
2097 module_exit(pkey_exit);
2098