1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright IBM Corp. 2017,2019
6 * Author(s): Harald Freudenberger
9 #define KMSG_COMPONENT "pkey"
10 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
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>
24 #include <crypto/aes.h>
26 #include "zcrypt_api.h"
27 #include "zcrypt_ccamisc.h"
28 #include "zcrypt_ep11misc.h"
30 MODULE_LICENSE("GPL");
31 MODULE_AUTHOR("IBM Corporation");
32 MODULE_DESCRIPTION("s390 protected key interface");
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 */
39 * debug feature data and functions
42 static debug_info_t
*debug_info
;
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__)
49 static void __init
pkey_debug_init(void)
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);
57 static void __exit
pkey_debug_exit(void)
59 debug_unregister(debug_info
);
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 */
66 u8 version
; /* should be 0x01 for protected AES key token */
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 */
73 /* inside view of a clear key token (type 0x00 version 0x02) */
74 struct clearaeskeytoken
{
75 u8 type
; /* 0x00 for PAES specific key tokens */
77 u8 version
; /* 0x02 for clear AES key token */
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 */
85 * Create a protected key from a clear key value.
87 static int pkey_clr2protkey(u32 keytype
,
88 const struct pkey_clrkey
*clrkey
,
89 struct pkey_protkey
*protkey
)
91 /* mask of available pckmo subfunctions */
92 static cpacf_mask_t pckmo_functions
;
99 case PKEY_KEYTYPE_AES_128
:
101 fc
= CPACF_PCKMO_ENC_AES_128_KEY
;
103 case PKEY_KEYTYPE_AES_192
:
105 fc
= CPACF_PCKMO_ENC_AES_192_KEY
;
107 case PKEY_KEYTYPE_AES_256
:
109 fc
= CPACF_PCKMO_ENC_AES_256_KEY
;
112 DEBUG_ERR("%s unknown/unsupported keytype %d\n",
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
))
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__
);
129 /* prepare param block */
130 memset(paramblock
, 0, sizeof(paramblock
));
131 memcpy(paramblock
, clrkey
->clrkey
, keysize
);
133 /* call the pckmo instruction */
134 cpacf_pckmo(fc
, paramblock
);
136 /* copy created protected key */
137 protkey
->type
= keytype
;
138 protkey
->len
= keysize
+ 32;
139 memcpy(protkey
->protkey
, paramblock
, keysize
+ 32);
145 * Find card and transform secure key into protected key.
147 static int pkey_skey2pkey(const u8
*key
, struct pkey_protkey
*pkey
)
151 struct keytoken_header
*hdr
= (struct keytoken_header
*)key
;
153 zcrypt_wait_api_operational();
156 * The cca_xxx2protkey call may fail when a card has been
157 * addressed where the master key was changed after last fetch
158 * of the mkvp into the cache. Try 3 times: First witout verify
159 * then with verify and last round with verify and old master
160 * key verification pattern match not ignored.
162 for (verify
= 0; verify
< 3; verify
++) {
163 rc
= cca_findcard(key
, &cardnr
, &domain
, verify
);
166 if (rc
> 0 && verify
< 2)
168 switch (hdr
->version
) {
170 rc
= cca_sec2protkey(cardnr
, domain
,
172 &pkey
->len
, &pkey
->type
);
174 case TOKVER_CCA_VLSC
:
175 rc
= cca_cipher2protkey(cardnr
, domain
,
177 &pkey
->len
, &pkey
->type
);
187 DEBUG_DBG("%s failed rc=%d\n", __func__
, rc
);
193 * Construct EP11 key with given clear key value.
195 static int pkey_clr2ep11key(const u8
*clrkey
, size_t clrkeylen
,
196 u8
*keybuf
, size_t *keybuflen
)
200 u32 nr_apqns
, *apqns
= NULL
;
202 zcrypt_wait_api_operational();
204 /* build a list of apqns suitable for ep11 keys with cpacf support */
205 rc
= ep11_findcard2(&apqns
, &nr_apqns
, 0xFFFF, 0xFFFF,
206 ZCRYPT_CEX7
, EP11_API_V
, NULL
);
210 /* go through the list of apqns and try to bild an ep11 key */
211 for (rc
= -ENODEV
, i
= 0; i
< nr_apqns
; i
++) {
212 card
= apqns
[i
] >> 16;
213 dom
= apqns
[i
] & 0xFFFF;
214 rc
= ep11_clr2keyblob(card
, dom
, clrkeylen
* 8,
215 0, clrkey
, keybuf
, keybuflen
);
223 DEBUG_DBG("%s failed rc=%d\n", __func__
, rc
);
228 * Find card and transform EP11 secure key into protected key.
230 static int pkey_ep11key2pkey(const u8
*key
, struct pkey_protkey
*pkey
)
234 u32 nr_apqns
, *apqns
= NULL
;
235 struct ep11keyblob
*kb
= (struct ep11keyblob
*) key
;
237 zcrypt_wait_api_operational();
239 /* build a list of apqns suitable for this key */
240 rc
= ep11_findcard2(&apqns
, &nr_apqns
, 0xFFFF, 0xFFFF,
241 ZCRYPT_CEX7
, EP11_API_V
, kb
->wkvp
);
245 /* go through the list of apqns and try to derive an pkey */
246 for (rc
= -ENODEV
, i
= 0; i
< nr_apqns
; i
++) {
247 card
= apqns
[i
] >> 16;
248 dom
= apqns
[i
] & 0xFFFF;
249 pkey
->len
= sizeof(pkey
->protkey
);
250 rc
= ep11_kblob2protkey(card
, dom
, key
, kb
->head
.len
,
251 pkey
->protkey
, &pkey
->len
, &pkey
->type
);
259 DEBUG_DBG("%s failed rc=%d\n", __func__
, rc
);
264 * Verify key and give back some info about the key.
266 static int pkey_verifykey(const struct pkey_seckey
*seckey
,
267 u16
*pcardnr
, u16
*pdomain
,
268 u16
*pkeysize
, u32
*pattributes
)
270 struct secaeskeytoken
*t
= (struct secaeskeytoken
*) seckey
;
274 /* check the secure key for valid AES secure key */
275 rc
= cca_check_secaeskeytoken(debug_info
, 3, (u8
*) seckey
, 0);
279 *pattributes
= PKEY_VERIFY_ATTR_AES
;
281 *pkeysize
= t
->bitsize
;
283 /* try to find a card which can handle this key */
284 rc
= cca_findcard(seckey
->seckey
, &cardnr
, &domain
, 1);
289 /* key mkvp matches to old master key mkvp */
290 DEBUG_DBG("%s secure key has old mkvp\n", __func__
);
292 *pattributes
|= PKEY_VERIFY_ATTR_OLD_MKVP
;
302 DEBUG_DBG("%s rc=%d\n", __func__
, rc
);
307 * Generate a random protected key
309 static int pkey_genprotkey(u32 keytype
, struct pkey_protkey
*protkey
)
311 struct pkey_clrkey clrkey
;
316 case PKEY_KEYTYPE_AES_128
:
319 case PKEY_KEYTYPE_AES_192
:
322 case PKEY_KEYTYPE_AES_256
:
326 DEBUG_ERR("%s unknown/unsupported keytype %d\n", __func__
,
331 /* generate a dummy random clear key */
332 get_random_bytes(clrkey
.clrkey
, keysize
);
334 /* convert it to a dummy protected key */
335 rc
= pkey_clr2protkey(keytype
, &clrkey
, protkey
);
339 /* replace the key part of the protected key with random bytes */
340 get_random_bytes(protkey
->protkey
, keysize
);
346 * Verify if a protected key is still valid
348 static int pkey_verifyprotkey(const struct pkey_protkey
*protkey
)
352 u8 iv
[AES_BLOCK_SIZE
];
353 u8 key
[MAXPROTKEYSIZE
];
355 u8 null_msg
[AES_BLOCK_SIZE
];
356 u8 dest_buf
[AES_BLOCK_SIZE
];
359 switch (protkey
->type
) {
360 case PKEY_KEYTYPE_AES_128
:
361 fc
= CPACF_KMC_PAES_128
;
363 case PKEY_KEYTYPE_AES_192
:
364 fc
= CPACF_KMC_PAES_192
;
366 case PKEY_KEYTYPE_AES_256
:
367 fc
= CPACF_KMC_PAES_256
;
370 DEBUG_ERR("%s unknown/unsupported keytype %d\n", __func__
,
375 memset(null_msg
, 0, sizeof(null_msg
));
377 memset(param
.iv
, 0, sizeof(param
.iv
));
378 memcpy(param
.key
, protkey
->protkey
, sizeof(param
.key
));
380 k
= cpacf_kmc(fc
| CPACF_ENCRYPT
, ¶m
, null_msg
, dest_buf
,
382 if (k
!= sizeof(null_msg
)) {
383 DEBUG_ERR("%s protected key is not valid\n", __func__
);
384 return -EKEYREJECTED
;
391 * Transform a non-CCA key token into a protected key
393 static int pkey_nonccatok2pkey(const u8
*key
, u32 keylen
,
394 struct pkey_protkey
*protkey
)
398 struct keytoken_header
*hdr
= (struct keytoken_header
*)key
;
400 switch (hdr
->version
) {
401 case TOKVER_PROTECTED_KEY
: {
402 struct protaeskeytoken
*t
;
404 if (keylen
!= sizeof(struct protaeskeytoken
))
406 t
= (struct protaeskeytoken
*)key
;
407 protkey
->len
= t
->len
;
408 protkey
->type
= t
->keytype
;
409 memcpy(protkey
->protkey
, t
->protkey
,
410 sizeof(protkey
->protkey
));
411 rc
= pkey_verifyprotkey(protkey
);
414 case TOKVER_CLEAR_KEY
: {
415 struct clearaeskeytoken
*t
;
416 struct pkey_clrkey ckey
;
418 u8 skey
[SECKEYBLOBSIZE
];
419 u8 ep11key
[MAXEP11AESKEYBLOBSIZE
];
421 size_t tmpbuflen
= sizeof(union u_tmpbuf
);
423 if (keylen
< sizeof(struct clearaeskeytoken
))
425 t
= (struct clearaeskeytoken
*)key
;
426 if (keylen
!= sizeof(*t
) + t
->len
)
428 if ((t
->keytype
== PKEY_KEYTYPE_AES_128
&& t
->len
== 16)
429 || (t
->keytype
== PKEY_KEYTYPE_AES_192
&& t
->len
== 24)
430 || (t
->keytype
== PKEY_KEYTYPE_AES_256
&& t
->len
== 32))
431 memcpy(ckey
.clrkey
, t
->clearkey
, t
->len
);
434 /* alloc temp key buffer space */
435 tmpbuf
= kmalloc(tmpbuflen
, GFP_ATOMIC
);
440 /* try direct way with the PCKMO instruction */
441 rc
= pkey_clr2protkey(t
->keytype
, &ckey
, protkey
);
444 /* PCKMO failed, so try the CCA secure key way */
445 zcrypt_wait_api_operational();
446 rc
= cca_clr2seckey(0xFFFF, 0xFFFF, t
->keytype
,
447 ckey
.clrkey
, tmpbuf
);
449 rc
= pkey_skey2pkey(tmpbuf
, protkey
);
452 /* if the CCA way also failed, let's try via EP11 */
453 rc
= pkey_clr2ep11key(ckey
.clrkey
, t
->len
,
456 rc
= pkey_ep11key2pkey(tmpbuf
, protkey
);
457 /* now we should really have an protected key */
458 DEBUG_ERR("%s unable to build protected key from clear",
462 case TOKVER_EP11_AES
: {
463 /* check ep11 key for exportable as protected key */
464 rc
= ep11_check_aes_key(debug_info
, 3, key
, keylen
, 1);
467 rc
= pkey_ep11key2pkey(key
, protkey
);
470 case TOKVER_EP11_AES_WITH_HEADER
:
471 /* check ep11 key with header for exportable as protected key */
472 rc
= ep11_check_aes_key_with_hdr(debug_info
, 3, key
, keylen
, 1);
475 rc
= pkey_ep11key2pkey(key
+ sizeof(struct ep11kblob_header
),
479 DEBUG_ERR("%s unknown/unsupported non-CCA token version %d\n",
480 __func__
, hdr
->version
);
490 * Transform a CCA internal key token into a protected key
492 static int pkey_ccainttok2pkey(const u8
*key
, u32 keylen
,
493 struct pkey_protkey
*protkey
)
495 struct keytoken_header
*hdr
= (struct keytoken_header
*)key
;
497 switch (hdr
->version
) {
499 if (keylen
!= sizeof(struct secaeskeytoken
))
502 case TOKVER_CCA_VLSC
:
503 if (keylen
< hdr
->len
|| keylen
> MAXCCAVLSCTOKENSIZE
)
507 DEBUG_ERR("%s unknown/unsupported CCA internal token version %d\n",
508 __func__
, hdr
->version
);
512 return pkey_skey2pkey(key
, protkey
);
516 * Transform a key blob (of any type) into a protected key
518 int pkey_keyblob2pkey(const u8
*key
, u32 keylen
,
519 struct pkey_protkey
*protkey
)
522 struct keytoken_header
*hdr
= (struct keytoken_header
*)key
;
524 if (keylen
< sizeof(struct keytoken_header
)) {
525 DEBUG_ERR("%s invalid keylen %d\n", __func__
, keylen
);
530 case TOKTYPE_NON_CCA
:
531 rc
= pkey_nonccatok2pkey(key
, keylen
, protkey
);
533 case TOKTYPE_CCA_INTERNAL
:
534 rc
= pkey_ccainttok2pkey(key
, keylen
, protkey
);
537 DEBUG_ERR("%s unknown/unsupported blob type %d\n",
538 __func__
, hdr
->type
);
542 DEBUG_DBG("%s rc=%d\n", __func__
, rc
);
546 EXPORT_SYMBOL(pkey_keyblob2pkey
);
548 static int pkey_genseckey2(const struct pkey_apqn
*apqns
, size_t nr_apqns
,
549 enum pkey_key_type ktype
, enum pkey_key_size ksize
,
550 u32 kflags
, u8
*keybuf
, size_t *keybufsize
)
552 int i
, card
, dom
, rc
;
554 /* check for at least one apqn given */
555 if (!apqns
|| !nr_apqns
)
558 /* check key type and size */
560 case PKEY_TYPE_CCA_DATA
:
561 case PKEY_TYPE_CCA_CIPHER
:
562 if (*keybufsize
< SECKEYBLOBSIZE
)
566 if (*keybufsize
< MINEP11AESKEYBLOBSIZE
)
573 case PKEY_SIZE_AES_128
:
574 case PKEY_SIZE_AES_192
:
575 case PKEY_SIZE_AES_256
:
581 /* simple try all apqns from the list */
582 for (i
= 0, rc
= -ENODEV
; i
< nr_apqns
; i
++) {
583 card
= apqns
[i
].card
;
584 dom
= apqns
[i
].domain
;
585 if (ktype
== PKEY_TYPE_EP11
) {
586 rc
= ep11_genaeskey(card
, dom
, ksize
, kflags
,
588 } else if (ktype
== PKEY_TYPE_CCA_DATA
) {
589 rc
= cca_genseckey(card
, dom
, ksize
, keybuf
);
590 *keybufsize
= (rc
? 0 : SECKEYBLOBSIZE
);
591 } else /* TOKVER_CCA_VLSC */
592 rc
= cca_gencipherkey(card
, dom
, ksize
, kflags
,
601 static int pkey_clr2seckey2(const struct pkey_apqn
*apqns
, size_t nr_apqns
,
602 enum pkey_key_type ktype
, enum pkey_key_size ksize
,
603 u32 kflags
, const u8
*clrkey
,
604 u8
*keybuf
, size_t *keybufsize
)
606 int i
, card
, dom
, rc
;
608 /* check for at least one apqn given */
609 if (!apqns
|| !nr_apqns
)
612 /* check key type and size */
614 case PKEY_TYPE_CCA_DATA
:
615 case PKEY_TYPE_CCA_CIPHER
:
616 if (*keybufsize
< SECKEYBLOBSIZE
)
620 if (*keybufsize
< MINEP11AESKEYBLOBSIZE
)
627 case PKEY_SIZE_AES_128
:
628 case PKEY_SIZE_AES_192
:
629 case PKEY_SIZE_AES_256
:
635 zcrypt_wait_api_operational();
637 /* simple try all apqns from the list */
638 for (i
= 0, rc
= -ENODEV
; i
< nr_apqns
; i
++) {
639 card
= apqns
[i
].card
;
640 dom
= apqns
[i
].domain
;
641 if (ktype
== PKEY_TYPE_EP11
) {
642 rc
= ep11_clr2keyblob(card
, dom
, ksize
, kflags
,
643 clrkey
, keybuf
, keybufsize
);
644 } else if (ktype
== PKEY_TYPE_CCA_DATA
) {
645 rc
= cca_clr2seckey(card
, dom
, ksize
,
647 *keybufsize
= (rc
? 0 : SECKEYBLOBSIZE
);
648 } else /* TOKVER_CCA_VLSC */
649 rc
= cca_clr2cipherkey(card
, dom
, ksize
, kflags
,
650 clrkey
, keybuf
, keybufsize
);
658 static int pkey_verifykey2(const u8
*key
, size_t keylen
,
659 u16
*cardnr
, u16
*domain
,
660 enum pkey_key_type
*ktype
,
661 enum pkey_key_size
*ksize
, u32
*flags
)
664 u32 _nr_apqns
, *_apqns
= NULL
;
665 struct keytoken_header
*hdr
= (struct keytoken_header
*)key
;
667 if (keylen
< sizeof(struct keytoken_header
))
670 if (hdr
->type
== TOKTYPE_CCA_INTERNAL
671 && hdr
->version
== TOKVER_CCA_AES
) {
672 struct secaeskeytoken
*t
= (struct secaeskeytoken
*)key
;
674 rc
= cca_check_secaeskeytoken(debug_info
, 3, key
, 0);
678 *ktype
= PKEY_TYPE_CCA_DATA
;
680 *ksize
= (enum pkey_key_size
) t
->bitsize
;
682 rc
= cca_findcard2(&_apqns
, &_nr_apqns
, *cardnr
, *domain
,
683 ZCRYPT_CEX3C
, AES_MK_SET
, t
->mkvp
, 0, 1);
684 if (rc
== 0 && flags
)
685 *flags
= PKEY_FLAGS_MATCH_CUR_MKVP
;
687 rc
= cca_findcard2(&_apqns
, &_nr_apqns
,
689 ZCRYPT_CEX3C
, AES_MK_SET
,
691 if (rc
== 0 && flags
)
692 *flags
= PKEY_FLAGS_MATCH_ALT_MKVP
;
697 *cardnr
= ((struct pkey_apqn
*)_apqns
)->card
;
698 *domain
= ((struct pkey_apqn
*)_apqns
)->domain
;
700 } else if (hdr
->type
== TOKTYPE_CCA_INTERNAL
701 && hdr
->version
== TOKVER_CCA_VLSC
) {
702 struct cipherkeytoken
*t
= (struct cipherkeytoken
*)key
;
704 rc
= cca_check_secaescipherkey(debug_info
, 3, key
, 0, 1);
708 *ktype
= PKEY_TYPE_CCA_CIPHER
;
710 *ksize
= PKEY_SIZE_UNKNOWN
;
711 if (!t
->plfver
&& t
->wpllen
== 512)
712 *ksize
= PKEY_SIZE_AES_128
;
713 else if (!t
->plfver
&& t
->wpllen
== 576)
714 *ksize
= PKEY_SIZE_AES_192
;
715 else if (!t
->plfver
&& t
->wpllen
== 640)
716 *ksize
= PKEY_SIZE_AES_256
;
719 rc
= cca_findcard2(&_apqns
, &_nr_apqns
, *cardnr
, *domain
,
720 ZCRYPT_CEX6
, AES_MK_SET
, t
->mkvp0
, 0, 1);
721 if (rc
== 0 && flags
)
722 *flags
= PKEY_FLAGS_MATCH_CUR_MKVP
;
724 rc
= cca_findcard2(&_apqns
, &_nr_apqns
,
726 ZCRYPT_CEX6
, AES_MK_SET
,
728 if (rc
== 0 && flags
)
729 *flags
= PKEY_FLAGS_MATCH_ALT_MKVP
;
734 *cardnr
= ((struct pkey_apqn
*)_apqns
)->card
;
735 *domain
= ((struct pkey_apqn
*)_apqns
)->domain
;
737 } else if (hdr
->type
== TOKTYPE_NON_CCA
738 && hdr
->version
== TOKVER_EP11_AES
) {
739 struct ep11keyblob
*kb
= (struct ep11keyblob
*)key
;
741 rc
= ep11_check_aes_key(debug_info
, 3, key
, keylen
, 1);
745 *ktype
= PKEY_TYPE_EP11
;
747 *ksize
= kb
->head
.keybitlen
;
749 rc
= ep11_findcard2(&_apqns
, &_nr_apqns
, *cardnr
, *domain
,
750 ZCRYPT_CEX7
, EP11_API_V
, kb
->wkvp
);
755 *flags
= PKEY_FLAGS_MATCH_CUR_MKVP
;
757 *cardnr
= ((struct pkey_apqn
*)_apqns
)->card
;
758 *domain
= ((struct pkey_apqn
*)_apqns
)->domain
;
768 static int pkey_keyblob2pkey2(const struct pkey_apqn
*apqns
, size_t nr_apqns
,
769 const u8
*key
, size_t keylen
,
770 struct pkey_protkey
*pkey
)
772 int i
, card
, dom
, rc
;
773 struct keytoken_header
*hdr
= (struct keytoken_header
*)key
;
775 /* check for at least one apqn given */
776 if (!apqns
|| !nr_apqns
)
779 if (keylen
< sizeof(struct keytoken_header
))
782 if (hdr
->type
== TOKTYPE_CCA_INTERNAL
) {
783 if (hdr
->version
== TOKVER_CCA_AES
) {
784 if (keylen
!= sizeof(struct secaeskeytoken
))
786 if (cca_check_secaeskeytoken(debug_info
, 3, key
, 0))
788 } else if (hdr
->version
== TOKVER_CCA_VLSC
) {
789 if (keylen
< hdr
->len
|| keylen
> MAXCCAVLSCTOKENSIZE
)
791 if (cca_check_secaescipherkey(debug_info
, 3, key
, 0, 1))
794 DEBUG_ERR("%s unknown CCA internal token version %d\n",
795 __func__
, hdr
->version
);
798 } else if (hdr
->type
== TOKTYPE_NON_CCA
) {
799 if (hdr
->version
== TOKVER_EP11_AES
) {
800 if (keylen
< sizeof(struct ep11keyblob
))
802 if (ep11_check_aes_key(debug_info
, 3, key
, keylen
, 1))
805 return pkey_nonccatok2pkey(key
, keylen
, pkey
);
808 DEBUG_ERR("%s unknown/unsupported blob type %d\n",
809 __func__
, hdr
->type
);
813 zcrypt_wait_api_operational();
815 /* simple try all apqns from the list */
816 for (i
= 0, rc
= -ENODEV
; i
< nr_apqns
; i
++) {
817 card
= apqns
[i
].card
;
818 dom
= apqns
[i
].domain
;
819 if (hdr
->type
== TOKTYPE_CCA_INTERNAL
820 && hdr
->version
== TOKVER_CCA_AES
)
821 rc
= cca_sec2protkey(card
, dom
, key
, pkey
->protkey
,
822 &pkey
->len
, &pkey
->type
);
823 else if (hdr
->type
== TOKTYPE_CCA_INTERNAL
824 && hdr
->version
== TOKVER_CCA_VLSC
)
825 rc
= cca_cipher2protkey(card
, dom
, key
, pkey
->protkey
,
826 &pkey
->len
, &pkey
->type
);
827 else { /* EP11 AES secure key blob */
828 struct ep11keyblob
*kb
= (struct ep11keyblob
*) key
;
830 pkey
->len
= sizeof(pkey
->protkey
);
831 rc
= ep11_kblob2protkey(card
, dom
, key
, kb
->head
.len
,
832 pkey
->protkey
, &pkey
->len
,
842 static int pkey_apqns4key(const u8
*key
, size_t keylen
, u32 flags
,
843 struct pkey_apqn
*apqns
, size_t *nr_apqns
)
846 u32 _nr_apqns
, *_apqns
= NULL
;
847 struct keytoken_header
*hdr
= (struct keytoken_header
*)key
;
849 if (keylen
< sizeof(struct keytoken_header
) || flags
== 0)
852 zcrypt_wait_api_operational();
854 if (hdr
->type
== TOKTYPE_NON_CCA
855 && (hdr
->version
== TOKVER_EP11_AES_WITH_HEADER
856 || hdr
->version
== TOKVER_EP11_ECC_WITH_HEADER
)
857 && is_ep11_keyblob(key
+ sizeof(struct ep11kblob_header
))) {
858 int minhwtype
= 0, api
= 0;
859 struct ep11keyblob
*kb
= (struct ep11keyblob
*)
860 (key
+ sizeof(struct ep11kblob_header
));
862 if (flags
!= PKEY_FLAGS_MATCH_CUR_MKVP
)
864 if (kb
->attr
& EP11_BLOB_PKEY_EXTRACTABLE
) {
865 minhwtype
= ZCRYPT_CEX7
;
868 rc
= ep11_findcard2(&_apqns
, &_nr_apqns
, 0xFFFF, 0xFFFF,
869 minhwtype
, api
, kb
->wkvp
);
872 } else if (hdr
->type
== TOKTYPE_NON_CCA
873 && hdr
->version
== TOKVER_EP11_AES
874 && is_ep11_keyblob(key
)) {
875 int minhwtype
= 0, api
= 0;
876 struct ep11keyblob
*kb
= (struct ep11keyblob
*) key
;
878 if (flags
!= PKEY_FLAGS_MATCH_CUR_MKVP
)
880 if (kb
->attr
& EP11_BLOB_PKEY_EXTRACTABLE
) {
881 minhwtype
= ZCRYPT_CEX7
;
884 rc
= ep11_findcard2(&_apqns
, &_nr_apqns
, 0xFFFF, 0xFFFF,
885 minhwtype
, api
, kb
->wkvp
);
888 } else if (hdr
->type
== TOKTYPE_CCA_INTERNAL
) {
889 int minhwtype
= ZCRYPT_CEX3C
;
890 u64 cur_mkvp
= 0, old_mkvp
= 0;
892 if (hdr
->version
== TOKVER_CCA_AES
) {
893 struct secaeskeytoken
*t
= (struct secaeskeytoken
*)key
;
895 if (flags
& PKEY_FLAGS_MATCH_CUR_MKVP
)
897 if (flags
& PKEY_FLAGS_MATCH_ALT_MKVP
)
899 } else if (hdr
->version
== TOKVER_CCA_VLSC
) {
900 struct cipherkeytoken
*t
= (struct cipherkeytoken
*)key
;
902 minhwtype
= ZCRYPT_CEX6
;
903 if (flags
& PKEY_FLAGS_MATCH_CUR_MKVP
)
905 if (flags
& PKEY_FLAGS_MATCH_ALT_MKVP
)
908 /* unknown cca internal token type */
911 rc
= cca_findcard2(&_apqns
, &_nr_apqns
, 0xFFFF, 0xFFFF,
912 minhwtype
, AES_MK_SET
,
913 cur_mkvp
, old_mkvp
, 1);
916 } else if (hdr
->type
== TOKTYPE_CCA_INTERNAL_PKA
) {
917 u64 cur_mkvp
= 0, old_mkvp
= 0;
918 struct eccprivkeytoken
*t
= (struct eccprivkeytoken
*)key
;
920 if (t
->secid
== 0x20) {
921 if (flags
& PKEY_FLAGS_MATCH_CUR_MKVP
)
923 if (flags
& PKEY_FLAGS_MATCH_ALT_MKVP
)
926 /* unknown cca internal 2 token type */
929 rc
= cca_findcard2(&_apqns
, &_nr_apqns
, 0xFFFF, 0xFFFF,
930 ZCRYPT_CEX7
, APKA_MK_SET
,
931 cur_mkvp
, old_mkvp
, 1);
938 if (*nr_apqns
< _nr_apqns
)
941 memcpy(apqns
, _apqns
, _nr_apqns
* sizeof(u32
));
943 *nr_apqns
= _nr_apqns
;
950 static int pkey_apqns4keytype(enum pkey_key_type ktype
,
951 u8 cur_mkvp
[32], u8 alt_mkvp
[32], u32 flags
,
952 struct pkey_apqn
*apqns
, size_t *nr_apqns
)
955 u32 _nr_apqns
, *_apqns
= NULL
;
957 zcrypt_wait_api_operational();
959 if (ktype
== PKEY_TYPE_CCA_DATA
|| ktype
== PKEY_TYPE_CCA_CIPHER
) {
960 u64 cur_mkvp
= 0, old_mkvp
= 0;
961 int minhwtype
= ZCRYPT_CEX3C
;
963 if (flags
& PKEY_FLAGS_MATCH_CUR_MKVP
)
964 cur_mkvp
= *((u64
*) cur_mkvp
);
965 if (flags
& PKEY_FLAGS_MATCH_ALT_MKVP
)
966 old_mkvp
= *((u64
*) alt_mkvp
);
967 if (ktype
== PKEY_TYPE_CCA_CIPHER
)
968 minhwtype
= ZCRYPT_CEX6
;
969 rc
= cca_findcard2(&_apqns
, &_nr_apqns
, 0xFFFF, 0xFFFF,
970 minhwtype
, AES_MK_SET
,
971 cur_mkvp
, old_mkvp
, 1);
974 } else if (ktype
== PKEY_TYPE_CCA_ECC
) {
975 u64 cur_mkvp
= 0, old_mkvp
= 0;
977 if (flags
& PKEY_FLAGS_MATCH_CUR_MKVP
)
978 cur_mkvp
= *((u64
*) cur_mkvp
);
979 if (flags
& PKEY_FLAGS_MATCH_ALT_MKVP
)
980 old_mkvp
= *((u64
*) alt_mkvp
);
981 rc
= cca_findcard2(&_apqns
, &_nr_apqns
, 0xFFFF, 0xFFFF,
982 ZCRYPT_CEX7
, APKA_MK_SET
,
983 cur_mkvp
, old_mkvp
, 1);
987 } else if (ktype
== PKEY_TYPE_EP11
||
988 ktype
== PKEY_TYPE_EP11_AES
||
989 ktype
== PKEY_TYPE_EP11_ECC
) {
992 if (flags
& PKEY_FLAGS_MATCH_CUR_MKVP
)
994 rc
= ep11_findcard2(&_apqns
, &_nr_apqns
, 0xFFFF, 0xFFFF,
995 ZCRYPT_CEX7
, EP11_API_V
, wkvp
);
1003 if (*nr_apqns
< _nr_apqns
)
1006 memcpy(apqns
, _apqns
, _nr_apqns
* sizeof(u32
));
1008 *nr_apqns
= _nr_apqns
;
1015 static int pkey_keyblob2pkey3(const struct pkey_apqn
*apqns
, size_t nr_apqns
,
1016 const u8
*key
, size_t keylen
, u32
*protkeytype
,
1017 u8
*protkey
, u32
*protkeylen
)
1019 int i
, card
, dom
, rc
;
1020 struct keytoken_header
*hdr
= (struct keytoken_header
*)key
;
1022 /* check for at least one apqn given */
1023 if (!apqns
|| !nr_apqns
)
1026 if (keylen
< sizeof(struct keytoken_header
))
1029 if (hdr
->type
== TOKTYPE_NON_CCA
1030 && hdr
->version
== TOKVER_EP11_AES_WITH_HEADER
1031 && is_ep11_keyblob(key
+ sizeof(struct ep11kblob_header
))) {
1032 /* EP11 AES key blob with header */
1033 if (ep11_check_aes_key_with_hdr(debug_info
, 3, key
, keylen
, 1))
1035 } else if (hdr
->type
== TOKTYPE_NON_CCA
1036 && hdr
->version
== TOKVER_EP11_ECC_WITH_HEADER
1037 && is_ep11_keyblob(key
+ sizeof(struct ep11kblob_header
))) {
1038 /* EP11 ECC key blob with header */
1039 if (ep11_check_ecc_key_with_hdr(debug_info
, 3, key
, keylen
, 1))
1041 } else if (hdr
->type
== TOKTYPE_NON_CCA
1042 && hdr
->version
== TOKVER_EP11_AES
1043 && is_ep11_keyblob(key
)) {
1044 /* EP11 AES key blob with header in session field */
1045 if (ep11_check_aes_key(debug_info
, 3, key
, keylen
, 1))
1047 } else if (hdr
->type
== TOKTYPE_CCA_INTERNAL
) {
1048 if (hdr
->version
== TOKVER_CCA_AES
) {
1049 /* CCA AES data key */
1050 if (keylen
!= sizeof(struct secaeskeytoken
))
1052 if (cca_check_secaeskeytoken(debug_info
, 3, key
, 0))
1054 } else if (hdr
->version
== TOKVER_CCA_VLSC
) {
1055 /* CCA AES cipher key */
1056 if (keylen
< hdr
->len
|| keylen
> MAXCCAVLSCTOKENSIZE
)
1058 if (cca_check_secaescipherkey(debug_info
, 3, key
, 0, 1))
1061 DEBUG_ERR("%s unknown CCA internal token version %d\n",
1062 __func__
, hdr
->version
);
1065 } else if (hdr
->type
== TOKTYPE_CCA_INTERNAL_PKA
) {
1066 /* CCA ECC (private) key */
1067 if (keylen
< sizeof(struct eccprivkeytoken
))
1069 if (cca_check_sececckeytoken(debug_info
, 3, key
, keylen
, 1))
1071 } else if (hdr
->type
== TOKTYPE_NON_CCA
) {
1072 struct pkey_protkey pkey
;
1074 rc
= pkey_nonccatok2pkey(key
, keylen
, &pkey
);
1077 memcpy(protkey
, pkey
.protkey
, pkey
.len
);
1078 *protkeylen
= pkey
.len
;
1079 *protkeytype
= pkey
.type
;
1082 DEBUG_ERR("%s unknown/unsupported blob type %d\n",
1083 __func__
, hdr
->type
);
1087 /* simple try all apqns from the list */
1088 for (rc
= -ENODEV
, i
= 0; rc
&& i
< nr_apqns
; i
++) {
1089 card
= apqns
[i
].card
;
1090 dom
= apqns
[i
].domain
;
1091 if (hdr
->type
== TOKTYPE_NON_CCA
1092 && (hdr
->version
== TOKVER_EP11_AES_WITH_HEADER
1093 || hdr
->version
== TOKVER_EP11_ECC_WITH_HEADER
)
1094 && is_ep11_keyblob(key
+ sizeof(struct ep11kblob_header
)))
1095 rc
= ep11_kblob2protkey(card
, dom
, key
, hdr
->len
,
1096 protkey
, protkeylen
, protkeytype
);
1097 else if (hdr
->type
== TOKTYPE_NON_CCA
1098 && hdr
->version
== TOKVER_EP11_AES
1099 && is_ep11_keyblob(key
))
1100 rc
= ep11_kblob2protkey(card
, dom
, key
, hdr
->len
,
1101 protkey
, protkeylen
, protkeytype
);
1102 else if (hdr
->type
== TOKTYPE_CCA_INTERNAL
&&
1103 hdr
->version
== TOKVER_CCA_AES
)
1104 rc
= cca_sec2protkey(card
, dom
, key
, protkey
,
1105 protkeylen
, protkeytype
);
1106 else if (hdr
->type
== TOKTYPE_CCA_INTERNAL
&&
1107 hdr
->version
== TOKVER_CCA_VLSC
)
1108 rc
= cca_cipher2protkey(card
, dom
, key
, protkey
,
1109 protkeylen
, protkeytype
);
1110 else if (hdr
->type
== TOKTYPE_CCA_INTERNAL_PKA
)
1111 rc
= cca_ecc2protkey(card
, dom
, key
, protkey
,
1112 protkeylen
, protkeytype
);
1124 static void *_copy_key_from_user(void __user
*ukey
, size_t keylen
)
1126 if (!ukey
|| keylen
< MINKEYBLOBSIZE
|| keylen
> KEYBLOBBUFSIZE
)
1127 return ERR_PTR(-EINVAL
);
1129 return memdup_user(ukey
, keylen
);
1132 static void *_copy_apqns_from_user(void __user
*uapqns
, size_t nr_apqns
)
1134 if (!uapqns
|| nr_apqns
== 0)
1137 return memdup_user(uapqns
, nr_apqns
* sizeof(struct pkey_apqn
));
1140 static long pkey_unlocked_ioctl(struct file
*filp
, unsigned int cmd
,
1146 case PKEY_GENSECK
: {
1147 struct pkey_genseck __user
*ugs
= (void __user
*) arg
;
1148 struct pkey_genseck kgs
;
1150 if (copy_from_user(&kgs
, ugs
, sizeof(kgs
)))
1152 rc
= cca_genseckey(kgs
.cardnr
, kgs
.domain
,
1153 kgs
.keytype
, kgs
.seckey
.seckey
);
1154 DEBUG_DBG("%s cca_genseckey()=%d\n", __func__
, rc
);
1157 if (copy_to_user(ugs
, &kgs
, sizeof(kgs
)))
1161 case PKEY_CLR2SECK
: {
1162 struct pkey_clr2seck __user
*ucs
= (void __user
*) arg
;
1163 struct pkey_clr2seck kcs
;
1165 if (copy_from_user(&kcs
, ucs
, sizeof(kcs
)))
1167 rc
= cca_clr2seckey(kcs
.cardnr
, kcs
.domain
, kcs
.keytype
,
1168 kcs
.clrkey
.clrkey
, kcs
.seckey
.seckey
);
1169 DEBUG_DBG("%s cca_clr2seckey()=%d\n", __func__
, rc
);
1172 if (copy_to_user(ucs
, &kcs
, sizeof(kcs
)))
1174 memzero_explicit(&kcs
, sizeof(kcs
));
1177 case PKEY_SEC2PROTK
: {
1178 struct pkey_sec2protk __user
*usp
= (void __user
*) arg
;
1179 struct pkey_sec2protk ksp
;
1181 if (copy_from_user(&ksp
, usp
, sizeof(ksp
)))
1183 rc
= cca_sec2protkey(ksp
.cardnr
, ksp
.domain
,
1184 ksp
.seckey
.seckey
, ksp
.protkey
.protkey
,
1185 &ksp
.protkey
.len
, &ksp
.protkey
.type
);
1186 DEBUG_DBG("%s cca_sec2protkey()=%d\n", __func__
, rc
);
1189 if (copy_to_user(usp
, &ksp
, sizeof(ksp
)))
1193 case PKEY_CLR2PROTK
: {
1194 struct pkey_clr2protk __user
*ucp
= (void __user
*) arg
;
1195 struct pkey_clr2protk kcp
;
1197 if (copy_from_user(&kcp
, ucp
, sizeof(kcp
)))
1199 rc
= pkey_clr2protkey(kcp
.keytype
,
1200 &kcp
.clrkey
, &kcp
.protkey
);
1201 DEBUG_DBG("%s pkey_clr2protkey()=%d\n", __func__
, rc
);
1204 if (copy_to_user(ucp
, &kcp
, sizeof(kcp
)))
1206 memzero_explicit(&kcp
, sizeof(kcp
));
1209 case PKEY_FINDCARD
: {
1210 struct pkey_findcard __user
*ufc
= (void __user
*) arg
;
1211 struct pkey_findcard kfc
;
1213 if (copy_from_user(&kfc
, ufc
, sizeof(kfc
)))
1215 rc
= cca_findcard(kfc
.seckey
.seckey
,
1216 &kfc
.cardnr
, &kfc
.domain
, 1);
1217 DEBUG_DBG("%s cca_findcard()=%d\n", __func__
, rc
);
1220 if (copy_to_user(ufc
, &kfc
, sizeof(kfc
)))
1224 case PKEY_SKEY2PKEY
: {
1225 struct pkey_skey2pkey __user
*usp
= (void __user
*) arg
;
1226 struct pkey_skey2pkey ksp
;
1228 if (copy_from_user(&ksp
, usp
, sizeof(ksp
)))
1230 rc
= pkey_skey2pkey(ksp
.seckey
.seckey
, &ksp
.protkey
);
1231 DEBUG_DBG("%s pkey_skey2pkey()=%d\n", __func__
, rc
);
1234 if (copy_to_user(usp
, &ksp
, sizeof(ksp
)))
1238 case PKEY_VERIFYKEY
: {
1239 struct pkey_verifykey __user
*uvk
= (void __user
*) arg
;
1240 struct pkey_verifykey kvk
;
1242 if (copy_from_user(&kvk
, uvk
, sizeof(kvk
)))
1244 rc
= pkey_verifykey(&kvk
.seckey
, &kvk
.cardnr
, &kvk
.domain
,
1245 &kvk
.keysize
, &kvk
.attributes
);
1246 DEBUG_DBG("%s pkey_verifykey()=%d\n", __func__
, rc
);
1249 if (copy_to_user(uvk
, &kvk
, sizeof(kvk
)))
1253 case PKEY_GENPROTK
: {
1254 struct pkey_genprotk __user
*ugp
= (void __user
*) arg
;
1255 struct pkey_genprotk kgp
;
1257 if (copy_from_user(&kgp
, ugp
, sizeof(kgp
)))
1259 rc
= pkey_genprotkey(kgp
.keytype
, &kgp
.protkey
);
1260 DEBUG_DBG("%s pkey_genprotkey()=%d\n", __func__
, rc
);
1263 if (copy_to_user(ugp
, &kgp
, sizeof(kgp
)))
1267 case PKEY_VERIFYPROTK
: {
1268 struct pkey_verifyprotk __user
*uvp
= (void __user
*) arg
;
1269 struct pkey_verifyprotk kvp
;
1271 if (copy_from_user(&kvp
, uvp
, sizeof(kvp
)))
1273 rc
= pkey_verifyprotkey(&kvp
.protkey
);
1274 DEBUG_DBG("%s pkey_verifyprotkey()=%d\n", __func__
, rc
);
1277 case PKEY_KBLOB2PROTK
: {
1278 struct pkey_kblob2pkey __user
*utp
= (void __user
*) arg
;
1279 struct pkey_kblob2pkey ktp
;
1282 if (copy_from_user(&ktp
, utp
, sizeof(ktp
)))
1284 kkey
= _copy_key_from_user(ktp
.key
, ktp
.keylen
);
1286 return PTR_ERR(kkey
);
1287 rc
= pkey_keyblob2pkey(kkey
, ktp
.keylen
, &ktp
.protkey
);
1288 DEBUG_DBG("%s pkey_keyblob2pkey()=%d\n", __func__
, rc
);
1292 if (copy_to_user(utp
, &ktp
, sizeof(ktp
)))
1296 case PKEY_GENSECK2
: {
1297 struct pkey_genseck2 __user
*ugs
= (void __user
*) arg
;
1298 struct pkey_genseck2 kgs
;
1299 struct pkey_apqn
*apqns
;
1300 size_t klen
= KEYBLOBBUFSIZE
;
1303 if (copy_from_user(&kgs
, ugs
, sizeof(kgs
)))
1305 apqns
= _copy_apqns_from_user(kgs
.apqns
, kgs
.apqn_entries
);
1307 return PTR_ERR(apqns
);
1308 kkey
= kmalloc(klen
, GFP_KERNEL
);
1313 rc
= pkey_genseckey2(apqns
, kgs
.apqn_entries
,
1314 kgs
.type
, kgs
.size
, kgs
.keygenflags
,
1316 DEBUG_DBG("%s pkey_genseckey2()=%d\n", __func__
, rc
);
1323 if (kgs
.keylen
< klen
) {
1327 if (copy_to_user(kgs
.key
, kkey
, klen
)) {
1333 if (copy_to_user(ugs
, &kgs
, sizeof(kgs
)))
1338 case PKEY_CLR2SECK2
: {
1339 struct pkey_clr2seck2 __user
*ucs
= (void __user
*) arg
;
1340 struct pkey_clr2seck2 kcs
;
1341 struct pkey_apqn
*apqns
;
1342 size_t klen
= KEYBLOBBUFSIZE
;
1345 if (copy_from_user(&kcs
, ucs
, sizeof(kcs
)))
1347 apqns
= _copy_apqns_from_user(kcs
.apqns
, kcs
.apqn_entries
);
1349 return PTR_ERR(apqns
);
1350 kkey
= kmalloc(klen
, GFP_KERNEL
);
1355 rc
= pkey_clr2seckey2(apqns
, kcs
.apqn_entries
,
1356 kcs
.type
, kcs
.size
, kcs
.keygenflags
,
1357 kcs
.clrkey
.clrkey
, kkey
, &klen
);
1358 DEBUG_DBG("%s pkey_clr2seckey2()=%d\n", __func__
, rc
);
1365 if (kcs
.keylen
< klen
) {
1369 if (copy_to_user(kcs
.key
, kkey
, klen
)) {
1375 if (copy_to_user(ucs
, &kcs
, sizeof(kcs
)))
1377 memzero_explicit(&kcs
, sizeof(kcs
));
1381 case PKEY_VERIFYKEY2
: {
1382 struct pkey_verifykey2 __user
*uvk
= (void __user
*) arg
;
1383 struct pkey_verifykey2 kvk
;
1386 if (copy_from_user(&kvk
, uvk
, sizeof(kvk
)))
1388 kkey
= _copy_key_from_user(kvk
.key
, kvk
.keylen
);
1390 return PTR_ERR(kkey
);
1391 rc
= pkey_verifykey2(kkey
, kvk
.keylen
,
1392 &kvk
.cardnr
, &kvk
.domain
,
1393 &kvk
.type
, &kvk
.size
, &kvk
.flags
);
1394 DEBUG_DBG("%s pkey_verifykey2()=%d\n", __func__
, rc
);
1398 if (copy_to_user(uvk
, &kvk
, sizeof(kvk
)))
1402 case PKEY_KBLOB2PROTK2
: {
1403 struct pkey_kblob2pkey2 __user
*utp
= (void __user
*) arg
;
1404 struct pkey_kblob2pkey2 ktp
;
1405 struct pkey_apqn
*apqns
= NULL
;
1408 if (copy_from_user(&ktp
, utp
, sizeof(ktp
)))
1410 apqns
= _copy_apqns_from_user(ktp
.apqns
, ktp
.apqn_entries
);
1412 return PTR_ERR(apqns
);
1413 kkey
= _copy_key_from_user(ktp
.key
, ktp
.keylen
);
1416 return PTR_ERR(kkey
);
1418 rc
= pkey_keyblob2pkey2(apqns
, ktp
.apqn_entries
,
1419 kkey
, ktp
.keylen
, &ktp
.protkey
);
1420 DEBUG_DBG("%s pkey_keyblob2pkey2()=%d\n", __func__
, rc
);
1425 if (copy_to_user(utp
, &ktp
, sizeof(ktp
)))
1429 case PKEY_APQNS4K
: {
1430 struct pkey_apqns4key __user
*uak
= (void __user
*) arg
;
1431 struct pkey_apqns4key kak
;
1432 struct pkey_apqn
*apqns
= NULL
;
1433 size_t nr_apqns
, len
;
1436 if (copy_from_user(&kak
, uak
, sizeof(kak
)))
1438 nr_apqns
= kak
.apqn_entries
;
1440 apqns
= kmalloc_array(nr_apqns
,
1441 sizeof(struct pkey_apqn
),
1446 kkey
= _copy_key_from_user(kak
.key
, kak
.keylen
);
1449 return PTR_ERR(kkey
);
1451 rc
= pkey_apqns4key(kkey
, kak
.keylen
, kak
.flags
,
1453 DEBUG_DBG("%s pkey_apqns4key()=%d\n", __func__
, rc
);
1455 if (rc
&& rc
!= -ENOSPC
) {
1459 if (!rc
&& kak
.apqns
) {
1460 if (nr_apqns
> kak
.apqn_entries
) {
1464 len
= nr_apqns
* sizeof(struct pkey_apqn
);
1466 if (copy_to_user(kak
.apqns
, apqns
, len
)) {
1472 kak
.apqn_entries
= nr_apqns
;
1473 if (copy_to_user(uak
, &kak
, sizeof(kak
)))
1478 case PKEY_APQNS4KT
: {
1479 struct pkey_apqns4keytype __user
*uat
= (void __user
*) arg
;
1480 struct pkey_apqns4keytype kat
;
1481 struct pkey_apqn
*apqns
= NULL
;
1482 size_t nr_apqns
, len
;
1484 if (copy_from_user(&kat
, uat
, sizeof(kat
)))
1486 nr_apqns
= kat
.apqn_entries
;
1488 apqns
= kmalloc_array(nr_apqns
,
1489 sizeof(struct pkey_apqn
),
1494 rc
= pkey_apqns4keytype(kat
.type
, kat
.cur_mkvp
, kat
.alt_mkvp
,
1495 kat
.flags
, apqns
, &nr_apqns
);
1496 DEBUG_DBG("%s pkey_apqns4keytype()=%d\n", __func__
, rc
);
1497 if (rc
&& rc
!= -ENOSPC
) {
1501 if (!rc
&& kat
.apqns
) {
1502 if (nr_apqns
> kat
.apqn_entries
) {
1506 len
= nr_apqns
* sizeof(struct pkey_apqn
);
1508 if (copy_to_user(kat
.apqns
, apqns
, len
)) {
1514 kat
.apqn_entries
= nr_apqns
;
1515 if (copy_to_user(uat
, &kat
, sizeof(kat
)))
1520 case PKEY_KBLOB2PROTK3
: {
1521 struct pkey_kblob2pkey3 __user
*utp
= (void __user
*) arg
;
1522 struct pkey_kblob2pkey3 ktp
;
1523 struct pkey_apqn
*apqns
= NULL
;
1524 u32 protkeylen
= PROTKEYBLOBBUFSIZE
;
1527 if (copy_from_user(&ktp
, utp
, sizeof(ktp
)))
1529 apqns
= _copy_apqns_from_user(ktp
.apqns
, ktp
.apqn_entries
);
1531 return PTR_ERR(apqns
);
1532 kkey
= _copy_key_from_user(ktp
.key
, ktp
.keylen
);
1535 return PTR_ERR(kkey
);
1537 protkey
= kmalloc(protkeylen
, GFP_KERNEL
);
1543 rc
= pkey_keyblob2pkey3(apqns
, ktp
.apqn_entries
, kkey
,
1544 ktp
.keylen
, &ktp
.pkeytype
,
1545 protkey
, &protkeylen
);
1546 DEBUG_DBG("%s pkey_keyblob2pkey3()=%d\n", __func__
, rc
);
1553 if (ktp
.pkey
&& ktp
.pkeylen
) {
1554 if (protkeylen
> ktp
.pkeylen
) {
1558 if (copy_to_user(ktp
.pkey
, protkey
, protkeylen
)) {
1564 ktp
.pkeylen
= protkeylen
;
1565 if (copy_to_user(utp
, &ktp
, sizeof(ktp
)))
1570 /* unknown/unsupported ioctl cmd */
1578 * Sysfs and file io operations
1582 * Sysfs attribute read function for all protected key binary attributes.
1583 * The implementation can not deal with partial reads, because a new random
1584 * protected key blob is generated with each read. In case of partial reads
1585 * (i.e. off != 0 or count < key blob size) -EINVAL is returned.
1587 static ssize_t
pkey_protkey_aes_attr_read(u32 keytype
, bool is_xts
, char *buf
,
1588 loff_t off
, size_t count
)
1590 struct protaeskeytoken protkeytoken
;
1591 struct pkey_protkey protkey
;
1594 if (off
!= 0 || count
< sizeof(protkeytoken
))
1597 if (count
< 2 * sizeof(protkeytoken
))
1600 memset(&protkeytoken
, 0, sizeof(protkeytoken
));
1601 protkeytoken
.type
= TOKTYPE_NON_CCA
;
1602 protkeytoken
.version
= TOKVER_PROTECTED_KEY
;
1603 protkeytoken
.keytype
= keytype
;
1605 rc
= pkey_genprotkey(protkeytoken
.keytype
, &protkey
);
1609 protkeytoken
.len
= protkey
.len
;
1610 memcpy(&protkeytoken
.protkey
, &protkey
.protkey
, protkey
.len
);
1612 memcpy(buf
, &protkeytoken
, sizeof(protkeytoken
));
1615 rc
= pkey_genprotkey(protkeytoken
.keytype
, &protkey
);
1619 protkeytoken
.len
= protkey
.len
;
1620 memcpy(&protkeytoken
.protkey
, &protkey
.protkey
, protkey
.len
);
1622 memcpy(buf
+ sizeof(protkeytoken
), &protkeytoken
,
1623 sizeof(protkeytoken
));
1625 return 2 * sizeof(protkeytoken
);
1628 return sizeof(protkeytoken
);
1631 static ssize_t
protkey_aes_128_read(struct file
*filp
,
1632 struct kobject
*kobj
,
1633 struct bin_attribute
*attr
,
1634 char *buf
, loff_t off
,
1637 return pkey_protkey_aes_attr_read(PKEY_KEYTYPE_AES_128
, false, buf
,
1641 static ssize_t
protkey_aes_192_read(struct file
*filp
,
1642 struct kobject
*kobj
,
1643 struct bin_attribute
*attr
,
1644 char *buf
, loff_t off
,
1647 return pkey_protkey_aes_attr_read(PKEY_KEYTYPE_AES_192
, false, buf
,
1651 static ssize_t
protkey_aes_256_read(struct file
*filp
,
1652 struct kobject
*kobj
,
1653 struct bin_attribute
*attr
,
1654 char *buf
, loff_t off
,
1657 return pkey_protkey_aes_attr_read(PKEY_KEYTYPE_AES_256
, false, buf
,
1661 static ssize_t
protkey_aes_128_xts_read(struct file
*filp
,
1662 struct kobject
*kobj
,
1663 struct bin_attribute
*attr
,
1664 char *buf
, loff_t off
,
1667 return pkey_protkey_aes_attr_read(PKEY_KEYTYPE_AES_128
, true, buf
,
1671 static ssize_t
protkey_aes_256_xts_read(struct file
*filp
,
1672 struct kobject
*kobj
,
1673 struct bin_attribute
*attr
,
1674 char *buf
, loff_t off
,
1677 return pkey_protkey_aes_attr_read(PKEY_KEYTYPE_AES_256
, true, buf
,
1681 static BIN_ATTR_RO(protkey_aes_128
, sizeof(struct protaeskeytoken
));
1682 static BIN_ATTR_RO(protkey_aes_192
, sizeof(struct protaeskeytoken
));
1683 static BIN_ATTR_RO(protkey_aes_256
, sizeof(struct protaeskeytoken
));
1684 static BIN_ATTR_RO(protkey_aes_128_xts
, 2 * sizeof(struct protaeskeytoken
));
1685 static BIN_ATTR_RO(protkey_aes_256_xts
, 2 * sizeof(struct protaeskeytoken
));
1687 static struct bin_attribute
*protkey_attrs
[] = {
1688 &bin_attr_protkey_aes_128
,
1689 &bin_attr_protkey_aes_192
,
1690 &bin_attr_protkey_aes_256
,
1691 &bin_attr_protkey_aes_128_xts
,
1692 &bin_attr_protkey_aes_256_xts
,
1696 static struct attribute_group protkey_attr_group
= {
1698 .bin_attrs
= protkey_attrs
,
1702 * Sysfs attribute read function for all secure key ccadata binary attributes.
1703 * The implementation can not deal with partial reads, because a new random
1704 * protected key blob is generated with each read. In case of partial reads
1705 * (i.e. off != 0 or count < key blob size) -EINVAL is returned.
1707 static ssize_t
pkey_ccadata_aes_attr_read(u32 keytype
, bool is_xts
, char *buf
,
1708 loff_t off
, size_t count
)
1711 struct pkey_seckey
*seckey
= (struct pkey_seckey
*) buf
;
1713 if (off
!= 0 || count
< sizeof(struct secaeskeytoken
))
1716 if (count
< 2 * sizeof(struct secaeskeytoken
))
1719 rc
= cca_genseckey(-1, -1, keytype
, seckey
->seckey
);
1725 rc
= cca_genseckey(-1, -1, keytype
, seckey
->seckey
);
1729 return 2 * sizeof(struct secaeskeytoken
);
1732 return sizeof(struct secaeskeytoken
);
1735 static ssize_t
ccadata_aes_128_read(struct file
*filp
,
1736 struct kobject
*kobj
,
1737 struct bin_attribute
*attr
,
1738 char *buf
, loff_t off
,
1741 return pkey_ccadata_aes_attr_read(PKEY_KEYTYPE_AES_128
, false, buf
,
1745 static ssize_t
ccadata_aes_192_read(struct file
*filp
,
1746 struct kobject
*kobj
,
1747 struct bin_attribute
*attr
,
1748 char *buf
, loff_t off
,
1751 return pkey_ccadata_aes_attr_read(PKEY_KEYTYPE_AES_192
, false, buf
,
1755 static ssize_t
ccadata_aes_256_read(struct file
*filp
,
1756 struct kobject
*kobj
,
1757 struct bin_attribute
*attr
,
1758 char *buf
, loff_t off
,
1761 return pkey_ccadata_aes_attr_read(PKEY_KEYTYPE_AES_256
, false, buf
,
1765 static ssize_t
ccadata_aes_128_xts_read(struct file
*filp
,
1766 struct kobject
*kobj
,
1767 struct bin_attribute
*attr
,
1768 char *buf
, loff_t off
,
1771 return pkey_ccadata_aes_attr_read(PKEY_KEYTYPE_AES_128
, true, buf
,
1775 static ssize_t
ccadata_aes_256_xts_read(struct file
*filp
,
1776 struct kobject
*kobj
,
1777 struct bin_attribute
*attr
,
1778 char *buf
, loff_t off
,
1781 return pkey_ccadata_aes_attr_read(PKEY_KEYTYPE_AES_256
, true, buf
,
1785 static BIN_ATTR_RO(ccadata_aes_128
, sizeof(struct secaeskeytoken
));
1786 static BIN_ATTR_RO(ccadata_aes_192
, sizeof(struct secaeskeytoken
));
1787 static BIN_ATTR_RO(ccadata_aes_256
, sizeof(struct secaeskeytoken
));
1788 static BIN_ATTR_RO(ccadata_aes_128_xts
, 2 * sizeof(struct secaeskeytoken
));
1789 static BIN_ATTR_RO(ccadata_aes_256_xts
, 2 * sizeof(struct secaeskeytoken
));
1791 static struct bin_attribute
*ccadata_attrs
[] = {
1792 &bin_attr_ccadata_aes_128
,
1793 &bin_attr_ccadata_aes_192
,
1794 &bin_attr_ccadata_aes_256
,
1795 &bin_attr_ccadata_aes_128_xts
,
1796 &bin_attr_ccadata_aes_256_xts
,
1800 static struct attribute_group ccadata_attr_group
= {
1802 .bin_attrs
= ccadata_attrs
,
1805 #define CCACIPHERTOKENSIZE (sizeof(struct cipherkeytoken) + 80)
1808 * Sysfs attribute read function for all secure key ccacipher binary attributes.
1809 * The implementation can not deal with partial reads, because a new random
1810 * secure key blob is generated with each read. In case of partial reads
1811 * (i.e. off != 0 or count < key blob size) -EINVAL is returned.
1813 static ssize_t
pkey_ccacipher_aes_attr_read(enum pkey_key_size keybits
,
1814 bool is_xts
, char *buf
, loff_t off
,
1817 int i
, rc
, card
, dom
;
1818 u32 nr_apqns
, *apqns
= NULL
;
1819 size_t keysize
= CCACIPHERTOKENSIZE
;
1821 if (off
!= 0 || count
< CCACIPHERTOKENSIZE
)
1824 if (count
< 2 * CCACIPHERTOKENSIZE
)
1827 /* build a list of apqns able to generate an cipher key */
1828 rc
= cca_findcard2(&apqns
, &nr_apqns
, 0xFFFF, 0xFFFF,
1829 ZCRYPT_CEX6
, 0, 0, 0, 0);
1833 memset(buf
, 0, is_xts
? 2 * keysize
: keysize
);
1835 /* simple try all apqns from the list */
1836 for (i
= 0, rc
= -ENODEV
; i
< nr_apqns
; i
++) {
1837 card
= apqns
[i
] >> 16;
1838 dom
= apqns
[i
] & 0xFFFF;
1839 rc
= cca_gencipherkey(card
, dom
, keybits
, 0, buf
, &keysize
);
1847 keysize
= CCACIPHERTOKENSIZE
;
1848 buf
+= CCACIPHERTOKENSIZE
;
1849 rc
= cca_gencipherkey(card
, dom
, keybits
, 0, buf
, &keysize
);
1851 return 2 * CCACIPHERTOKENSIZE
;
1854 return CCACIPHERTOKENSIZE
;
1857 static ssize_t
ccacipher_aes_128_read(struct file
*filp
,
1858 struct kobject
*kobj
,
1859 struct bin_attribute
*attr
,
1860 char *buf
, loff_t off
,
1863 return pkey_ccacipher_aes_attr_read(PKEY_SIZE_AES_128
, false, buf
,
1867 static ssize_t
ccacipher_aes_192_read(struct file
*filp
,
1868 struct kobject
*kobj
,
1869 struct bin_attribute
*attr
,
1870 char *buf
, loff_t off
,
1873 return pkey_ccacipher_aes_attr_read(PKEY_SIZE_AES_192
, false, buf
,
1877 static ssize_t
ccacipher_aes_256_read(struct file
*filp
,
1878 struct kobject
*kobj
,
1879 struct bin_attribute
*attr
,
1880 char *buf
, loff_t off
,
1883 return pkey_ccacipher_aes_attr_read(PKEY_SIZE_AES_256
, false, buf
,
1887 static ssize_t
ccacipher_aes_128_xts_read(struct file
*filp
,
1888 struct kobject
*kobj
,
1889 struct bin_attribute
*attr
,
1890 char *buf
, loff_t off
,
1893 return pkey_ccacipher_aes_attr_read(PKEY_SIZE_AES_128
, true, buf
,
1897 static ssize_t
ccacipher_aes_256_xts_read(struct file
*filp
,
1898 struct kobject
*kobj
,
1899 struct bin_attribute
*attr
,
1900 char *buf
, loff_t off
,
1903 return pkey_ccacipher_aes_attr_read(PKEY_SIZE_AES_256
, true, buf
,
1907 static BIN_ATTR_RO(ccacipher_aes_128
, CCACIPHERTOKENSIZE
);
1908 static BIN_ATTR_RO(ccacipher_aes_192
, CCACIPHERTOKENSIZE
);
1909 static BIN_ATTR_RO(ccacipher_aes_256
, CCACIPHERTOKENSIZE
);
1910 static BIN_ATTR_RO(ccacipher_aes_128_xts
, 2 * CCACIPHERTOKENSIZE
);
1911 static BIN_ATTR_RO(ccacipher_aes_256_xts
, 2 * CCACIPHERTOKENSIZE
);
1913 static struct bin_attribute
*ccacipher_attrs
[] = {
1914 &bin_attr_ccacipher_aes_128
,
1915 &bin_attr_ccacipher_aes_192
,
1916 &bin_attr_ccacipher_aes_256
,
1917 &bin_attr_ccacipher_aes_128_xts
,
1918 &bin_attr_ccacipher_aes_256_xts
,
1922 static struct attribute_group ccacipher_attr_group
= {
1923 .name
= "ccacipher",
1924 .bin_attrs
= ccacipher_attrs
,
1928 * Sysfs attribute read function for all ep11 aes key binary attributes.
1929 * The implementation can not deal with partial reads, because a new random
1930 * secure key blob is generated with each read. In case of partial reads
1931 * (i.e. off != 0 or count < key blob size) -EINVAL is returned.
1932 * This function and the sysfs attributes using it provide EP11 key blobs
1933 * padded to the upper limit of MAXEP11AESKEYBLOBSIZE which is currently
1936 static ssize_t
pkey_ep11_aes_attr_read(enum pkey_key_size keybits
,
1937 bool is_xts
, char *buf
, loff_t off
,
1940 int i
, rc
, card
, dom
;
1941 u32 nr_apqns
, *apqns
= NULL
;
1942 size_t keysize
= MAXEP11AESKEYBLOBSIZE
;
1944 if (off
!= 0 || count
< MAXEP11AESKEYBLOBSIZE
)
1947 if (count
< 2 * MAXEP11AESKEYBLOBSIZE
)
1950 /* build a list of apqns able to generate an cipher key */
1951 rc
= ep11_findcard2(&apqns
, &nr_apqns
, 0xFFFF, 0xFFFF,
1952 ZCRYPT_CEX7
, EP11_API_V
, NULL
);
1956 memset(buf
, 0, is_xts
? 2 * keysize
: keysize
);
1958 /* simple try all apqns from the list */
1959 for (i
= 0, rc
= -ENODEV
; i
< nr_apqns
; i
++) {
1960 card
= apqns
[i
] >> 16;
1961 dom
= apqns
[i
] & 0xFFFF;
1962 rc
= ep11_genaeskey(card
, dom
, keybits
, 0, buf
, &keysize
);
1970 keysize
= MAXEP11AESKEYBLOBSIZE
;
1971 buf
+= MAXEP11AESKEYBLOBSIZE
;
1972 rc
= ep11_genaeskey(card
, dom
, keybits
, 0, buf
, &keysize
);
1974 return 2 * MAXEP11AESKEYBLOBSIZE
;
1977 return MAXEP11AESKEYBLOBSIZE
;
1980 static ssize_t
ep11_aes_128_read(struct file
*filp
,
1981 struct kobject
*kobj
,
1982 struct bin_attribute
*attr
,
1983 char *buf
, loff_t off
,
1986 return pkey_ep11_aes_attr_read(PKEY_SIZE_AES_128
, false, buf
,
1990 static ssize_t
ep11_aes_192_read(struct file
*filp
,
1991 struct kobject
*kobj
,
1992 struct bin_attribute
*attr
,
1993 char *buf
, loff_t off
,
1996 return pkey_ep11_aes_attr_read(PKEY_SIZE_AES_192
, false, buf
,
2000 static ssize_t
ep11_aes_256_read(struct file
*filp
,
2001 struct kobject
*kobj
,
2002 struct bin_attribute
*attr
,
2003 char *buf
, loff_t off
,
2006 return pkey_ep11_aes_attr_read(PKEY_SIZE_AES_256
, false, buf
,
2010 static ssize_t
ep11_aes_128_xts_read(struct file
*filp
,
2011 struct kobject
*kobj
,
2012 struct bin_attribute
*attr
,
2013 char *buf
, loff_t off
,
2016 return pkey_ep11_aes_attr_read(PKEY_SIZE_AES_128
, true, buf
,
2020 static ssize_t
ep11_aes_256_xts_read(struct file
*filp
,
2021 struct kobject
*kobj
,
2022 struct bin_attribute
*attr
,
2023 char *buf
, loff_t off
,
2026 return pkey_ep11_aes_attr_read(PKEY_SIZE_AES_256
, true, buf
,
2030 static BIN_ATTR_RO(ep11_aes_128
, MAXEP11AESKEYBLOBSIZE
);
2031 static BIN_ATTR_RO(ep11_aes_192
, MAXEP11AESKEYBLOBSIZE
);
2032 static BIN_ATTR_RO(ep11_aes_256
, MAXEP11AESKEYBLOBSIZE
);
2033 static BIN_ATTR_RO(ep11_aes_128_xts
, 2 * MAXEP11AESKEYBLOBSIZE
);
2034 static BIN_ATTR_RO(ep11_aes_256_xts
, 2 * MAXEP11AESKEYBLOBSIZE
);
2036 static struct bin_attribute
*ep11_attrs
[] = {
2037 &bin_attr_ep11_aes_128
,
2038 &bin_attr_ep11_aes_192
,
2039 &bin_attr_ep11_aes_256
,
2040 &bin_attr_ep11_aes_128_xts
,
2041 &bin_attr_ep11_aes_256_xts
,
2045 static struct attribute_group ep11_attr_group
= {
2047 .bin_attrs
= ep11_attrs
,
2050 static const struct attribute_group
*pkey_attr_groups
[] = {
2051 &protkey_attr_group
,
2052 &ccadata_attr_group
,
2053 &ccacipher_attr_group
,
2058 static const struct file_operations pkey_fops
= {
2059 .owner
= THIS_MODULE
,
2060 .open
= nonseekable_open
,
2061 .llseek
= no_llseek
,
2062 .unlocked_ioctl
= pkey_unlocked_ioctl
,
2065 static struct miscdevice pkey_dev
= {
2067 .minor
= MISC_DYNAMIC_MINOR
,
2070 .groups
= pkey_attr_groups
,
2076 static int __init
pkey_init(void)
2078 cpacf_mask_t func_mask
;
2081 * The pckmo instruction should be available - even if we don't
2082 * actually invoke it. This instruction comes with MSA 3 which
2083 * is also the minimum level for the kmc instructions which
2084 * are able to work with protected keys.
2086 if (!cpacf_query(CPACF_PCKMO
, &func_mask
))
2089 /* check for kmc instructions available */
2090 if (!cpacf_query(CPACF_KMC
, &func_mask
))
2092 if (!cpacf_test_func(&func_mask
, CPACF_KMC_PAES_128
) ||
2093 !cpacf_test_func(&func_mask
, CPACF_KMC_PAES_192
) ||
2094 !cpacf_test_func(&func_mask
, CPACF_KMC_PAES_256
))
2099 return misc_register(&pkey_dev
);
2105 static void __exit
pkey_exit(void)
2107 misc_deregister(&pkey_dev
);
2111 module_cpu_feature_match(MSA
, pkey_init
);
2112 module_exit(pkey_exit
);