1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright IBM Corp. 2017
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 <asm/zcrypt.h>
20 #include <asm/cpacf.h>
23 #include "zcrypt_api.h"
25 MODULE_LICENSE("GPL");
26 MODULE_AUTHOR("IBM Corporation");
27 MODULE_DESCRIPTION("s390 protected key interface");
29 /* Size of parameter block used for all cca requests/replies */
32 /* Size of vardata block used for some of the cca requests/replies */
33 #define VARDATASIZE 4096
36 * debug feature data and functions
39 static debug_info_t
*debug_info
;
41 #define DEBUG_DBG(...) debug_sprintf_event(debug_info, 6, ##__VA_ARGS__)
42 #define DEBUG_INFO(...) debug_sprintf_event(debug_info, 5, ##__VA_ARGS__)
43 #define DEBUG_WARN(...) debug_sprintf_event(debug_info, 4, ##__VA_ARGS__)
44 #define DEBUG_ERR(...) debug_sprintf_event(debug_info, 3, ##__VA_ARGS__)
46 static void __init
pkey_debug_init(void)
48 debug_info
= debug_register("pkey", 1, 1, 4 * sizeof(long));
49 debug_register_view(debug_info
, &debug_sprintf_view
);
50 debug_set_level(debug_info
, 3);
53 static void __exit
pkey_debug_exit(void)
55 debug_unregister(debug_info
);
58 /* inside view of a secure key token (only type 0x01 version 0x04) */
59 struct secaeskeytoken
{
60 u8 type
; /* 0x01 for internal key token */
62 u8 version
; /* should be 0x04 */
64 u8 flag
; /* key flags */
66 u64 mkvp
; /* master key verification pattern */
67 u8 key
[32]; /* key value (encrypted) */
68 u8 cv
[8]; /* control vector */
69 u16 bitsize
; /* key bit size */
70 u16 keysize
; /* key byte size */
71 u8 tvv
[4]; /* token validation value */
75 * Simple check if the token is a valid CCA secure AES key
76 * token. If keybitsize is given, the bitsize of the key is
77 * also checked. Returns 0 on success or errno value on failure.
79 static int check_secaeskeytoken(const u8
*token
, int keybitsize
)
81 struct secaeskeytoken
*t
= (struct secaeskeytoken
*) token
;
83 if (t
->type
!= 0x01) {
85 "%s secure token check failed, type mismatch 0x%02x != 0x01\n",
86 __func__
, (int) t
->type
);
89 if (t
->version
!= 0x04) {
91 "%s secure token check failed, version mismatch 0x%02x != 0x04\n",
92 __func__
, (int) t
->version
);
95 if (keybitsize
> 0 && t
->bitsize
!= keybitsize
) {
97 "%s secure token check failed, bitsize mismatch %d != %d\n",
98 __func__
, (int) t
->bitsize
, keybitsize
);
106 * Allocate consecutive memory for request CPRB, request param
107 * block, reply CPRB and reply param block and fill in values
108 * for the common fields. Returns 0 on success or errno value
111 static int alloc_and_prep_cprbmem(size_t paramblen
,
113 struct CPRBX
**preqCPRB
,
114 struct CPRBX
**prepCPRB
)
117 size_t cprbplusparamblen
= sizeof(struct CPRBX
) + paramblen
;
118 struct CPRBX
*preqcblk
, *prepcblk
;
121 * allocate consecutive memory for request CPRB, request param
122 * block, reply CPRB and reply param block
124 cprbmem
= kcalloc(2, cprbplusparamblen
, GFP_KERNEL
);
128 preqcblk
= (struct CPRBX
*) cprbmem
;
129 prepcblk
= (struct CPRBX
*) (cprbmem
+ cprbplusparamblen
);
131 /* fill request cprb struct */
132 preqcblk
->cprb_len
= sizeof(struct CPRBX
);
133 preqcblk
->cprb_ver_id
= 0x02;
134 memcpy(preqcblk
->func_id
, "T2", 2);
135 preqcblk
->rpl_msgbl
= cprbplusparamblen
;
137 preqcblk
->req_parmb
=
138 ((u8
*) preqcblk
) + sizeof(struct CPRBX
);
139 preqcblk
->rpl_parmb
=
140 ((u8
*) prepcblk
) + sizeof(struct CPRBX
);
144 *preqCPRB
= preqcblk
;
145 *prepCPRB
= prepcblk
;
151 * Free the cprb memory allocated with the function above.
152 * If the scrub value is not zero, the memory is filled
153 * with zeros before freeing (useful if there was some
154 * clear key material in there).
156 static void free_cprbmem(void *mem
, size_t paramblen
, int scrub
)
159 memzero_explicit(mem
, 2 * (sizeof(struct CPRBX
) + paramblen
));
164 * Helper function to prepare the xcrb struct
166 static inline void prep_xcrb(struct ica_xcRB
*pxcrb
,
168 struct CPRBX
*preqcblk
,
169 struct CPRBX
*prepcblk
)
171 memset(pxcrb
, 0, sizeof(*pxcrb
));
172 pxcrb
->agent_ID
= 0x4341; /* 'CA' */
173 pxcrb
->user_defined
= (cardnr
== 0xFFFF ? AUTOSELECT
: cardnr
);
174 pxcrb
->request_control_blk_length
=
175 preqcblk
->cprb_len
+ preqcblk
->req_parml
;
176 pxcrb
->request_control_blk_addr
= (void __user
*) preqcblk
;
177 pxcrb
->reply_control_blk_length
= preqcblk
->rpl_msgbl
;
178 pxcrb
->reply_control_blk_addr
= (void __user
*) prepcblk
;
182 * Helper function which calls zcrypt_send_cprb with
183 * memory management segment adjusted to kernel space
184 * so that the copy_from_user called within this
185 * function do in fact copy from kernel space.
187 static inline int _zcrypt_send_cprb(struct ica_xcRB
*xcrb
)
190 mm_segment_t old_fs
= get_fs();
193 rc
= zcrypt_send_cprb(xcrb
);
200 * Generate (random) AES secure key.
202 int pkey_genseckey(u16 cardnr
, u16 domain
,
203 u32 keytype
, struct pkey_seckey
*seckey
)
208 struct CPRBX
*preqcblk
, *prepcblk
;
209 struct ica_xcRB xcrb
;
225 u8 data
[SECKEYBLOBSIZE
];
239 /* ... some more data ... */
244 /* get already prepared memory for 2 cprbs with param block each */
245 rc
= alloc_and_prep_cprbmem(PARMBSIZE
, &mem
, &preqcblk
, &prepcblk
);
249 /* fill request cprb struct */
250 preqcblk
->domain
= domain
;
252 /* fill request cprb param block with KG request */
253 preqparm
= (struct kgreqparm
*) preqcblk
->req_parmb
;
254 memcpy(preqparm
->subfunc_code
, "KG", 2);
255 preqparm
->rule_array_len
= sizeof(preqparm
->rule_array_len
);
256 preqparm
->lv1
.len
= sizeof(struct lv1
);
257 memcpy(preqparm
->lv1
.key_form
, "OP ", 8);
259 case PKEY_KEYTYPE_AES_128
:
261 memcpy(preqparm
->lv1
.key_length
, "KEYLN16 ", 8);
263 case PKEY_KEYTYPE_AES_192
:
265 memcpy(preqparm
->lv1
.key_length
, "KEYLN24 ", 8);
267 case PKEY_KEYTYPE_AES_256
:
269 memcpy(preqparm
->lv1
.key_length
, "KEYLN32 ", 8);
273 "%s unknown/unsupported keytype %d\n",
278 memcpy(preqparm
->lv1
.key_type1
, "AESDATA ", 8);
279 preqparm
->lv2
.len
= sizeof(struct lv2
);
280 for (i
= 0; i
< 6; i
++) {
281 preqparm
->lv2
.keyid
[i
].len
= sizeof(struct keyid
);
282 preqparm
->lv2
.keyid
[i
].attr
= (i
== 2 ? 0x30 : 0x10);
284 preqcblk
->req_parml
= sizeof(struct kgreqparm
);
286 /* fill xcrb struct */
287 prep_xcrb(&xcrb
, cardnr
, preqcblk
, prepcblk
);
289 /* forward xcrb with request CPRB and reply CPRB to zcrypt dd */
290 rc
= _zcrypt_send_cprb(&xcrb
);
293 "%s zcrypt_send_cprb (cardnr=%d domain=%d) failed with errno %d\n",
294 __func__
, (int) cardnr
, (int) domain
, rc
);
298 /* check response returncode and reasoncode */
299 if (prepcblk
->ccp_rtcode
!= 0) {
301 "%s secure key generate failure, card response %d/%d\n",
303 (int) prepcblk
->ccp_rtcode
,
304 (int) prepcblk
->ccp_rscode
);
309 /* process response cprb param block */
310 prepcblk
->rpl_parmb
= ((u8
*) prepcblk
) + sizeof(struct CPRBX
);
311 prepparm
= (struct kgrepparm
*) prepcblk
->rpl_parmb
;
313 /* check length of the returned secure key token */
314 seckeysize
= prepparm
->lv3
.keyblock
.toklen
315 - sizeof(prepparm
->lv3
.keyblock
.toklen
)
316 - sizeof(prepparm
->lv3
.keyblock
.tokattr
);
317 if (seckeysize
!= SECKEYBLOBSIZE
) {
319 "%s secure token size mismatch %d != %d bytes\n",
320 __func__
, seckeysize
, SECKEYBLOBSIZE
);
325 /* check secure key token */
326 rc
= check_secaeskeytoken(prepparm
->lv3
.keyblock
.tok
, 8*keysize
);
332 /* copy the generated secure key token */
333 memcpy(seckey
->seckey
, prepparm
->lv3
.keyblock
.tok
, SECKEYBLOBSIZE
);
336 free_cprbmem(mem
, PARMBSIZE
, 0);
339 EXPORT_SYMBOL(pkey_genseckey
);
342 * Generate an AES secure key with given key value.
344 int pkey_clr2seckey(u16 cardnr
, u16 domain
, u32 keytype
,
345 const struct pkey_clrkey
*clrkey
,
346 struct pkey_seckey
*seckey
)
348 int rc
, keysize
, seckeysize
;
350 struct CPRBX
*preqcblk
, *prepcblk
;
351 struct ica_xcRB xcrb
;
365 u8 data
[SECKEYBLOBSIZE
];
380 /* ... some more data ... */
385 /* get already prepared memory for 2 cprbs with param block each */
386 rc
= alloc_and_prep_cprbmem(PARMBSIZE
, &mem
, &preqcblk
, &prepcblk
);
390 /* fill request cprb struct */
391 preqcblk
->domain
= domain
;
393 /* fill request cprb param block with CM request */
394 preqparm
= (struct cmreqparm
*) preqcblk
->req_parmb
;
395 memcpy(preqparm
->subfunc_code
, "CM", 2);
396 memcpy(preqparm
->rule_array
, "AES ", 8);
397 preqparm
->rule_array_len
=
398 sizeof(preqparm
->rule_array_len
) + sizeof(preqparm
->rule_array
);
400 case PKEY_KEYTYPE_AES_128
:
403 case PKEY_KEYTYPE_AES_192
:
406 case PKEY_KEYTYPE_AES_256
:
411 "%s unknown/unsupported keytype %d\n",
416 preqparm
->lv1
.len
= sizeof(struct lv1
) + keysize
;
417 memcpy(preqparm
->lv1
.clrkey
, clrkey
->clrkey
, keysize
);
418 plv2
= (struct lv2
*) (((u8
*) &preqparm
->lv2
) + keysize
);
419 plv2
->len
= sizeof(struct lv2
);
420 plv2
->keyid
.len
= sizeof(struct keyid
);
421 plv2
->keyid
.attr
= 0x30;
422 preqcblk
->req_parml
= sizeof(struct cmreqparm
) + keysize
;
424 /* fill xcrb struct */
425 prep_xcrb(&xcrb
, cardnr
, preqcblk
, prepcblk
);
427 /* forward xcrb with request CPRB and reply CPRB to zcrypt dd */
428 rc
= _zcrypt_send_cprb(&xcrb
);
431 "%s zcrypt_send_cprb (cardnr=%d domain=%d) failed with errno %d\n",
432 __func__
, (int) cardnr
, (int) domain
, rc
);
436 /* check response returncode and reasoncode */
437 if (prepcblk
->ccp_rtcode
!= 0) {
439 "%s clear key import failure, card response %d/%d\n",
441 (int) prepcblk
->ccp_rtcode
,
442 (int) prepcblk
->ccp_rscode
);
447 /* process response cprb param block */
448 prepcblk
->rpl_parmb
= ((u8
*) prepcblk
) + sizeof(struct CPRBX
);
449 prepparm
= (struct cmrepparm
*) prepcblk
->rpl_parmb
;
451 /* check length of the returned secure key token */
452 seckeysize
= prepparm
->lv3
.keyblock
.toklen
453 - sizeof(prepparm
->lv3
.keyblock
.toklen
)
454 - sizeof(prepparm
->lv3
.keyblock
.tokattr
);
455 if (seckeysize
!= SECKEYBLOBSIZE
) {
457 "%s secure token size mismatch %d != %d bytes\n",
458 __func__
, seckeysize
, SECKEYBLOBSIZE
);
463 /* check secure key token */
464 rc
= check_secaeskeytoken(prepparm
->lv3
.keyblock
.tok
, 8*keysize
);
470 /* copy the generated secure key token */
471 memcpy(seckey
->seckey
, prepparm
->lv3
.keyblock
.tok
, SECKEYBLOBSIZE
);
474 free_cprbmem(mem
, PARMBSIZE
, 1);
477 EXPORT_SYMBOL(pkey_clr2seckey
);
480 * Derive a proteced key from the secure key blob.
482 int pkey_sec2protkey(u16 cardnr
, u16 domain
,
483 const struct pkey_seckey
*seckey
,
484 struct pkey_protkey
*protkey
)
488 struct CPRBX
*preqcblk
, *prepcblk
;
489 struct ica_xcRB xcrb
;
502 u8 token
[0]; /* cca secure key token */
512 struct cpacfkeyblock
{
513 u8 version
; /* version of this struct */
519 u8 key
[64]; /* the key (keylen bytes) */
524 u8 vp
[32]; /* verification pattern */
529 /* get already prepared memory for 2 cprbs with param block each */
530 rc
= alloc_and_prep_cprbmem(PARMBSIZE
, &mem
, &preqcblk
, &prepcblk
);
534 /* fill request cprb struct */
535 preqcblk
->domain
= domain
;
537 /* fill request cprb param block with USK request */
538 preqparm
= (struct uskreqparm
*) preqcblk
->req_parmb
;
539 memcpy(preqparm
->subfunc_code
, "US", 2);
540 preqparm
->rule_array_len
= sizeof(preqparm
->rule_array_len
);
541 preqparm
->lv1
.len
= sizeof(struct lv1
);
542 preqparm
->lv1
.attr_len
= sizeof(struct lv1
) - sizeof(preqparm
->lv1
.len
);
543 preqparm
->lv1
.attr_flags
= 0x0001;
544 preqparm
->lv2
.len
= sizeof(struct lv2
) + SECKEYBLOBSIZE
;
545 preqparm
->lv2
.attr_len
= sizeof(struct lv2
)
546 - sizeof(preqparm
->lv2
.len
) + SECKEYBLOBSIZE
;
547 preqparm
->lv2
.attr_flags
= 0x0000;
548 memcpy(preqparm
->lv2
.token
, seckey
->seckey
, SECKEYBLOBSIZE
);
549 preqcblk
->req_parml
= sizeof(struct uskreqparm
) + SECKEYBLOBSIZE
;
551 /* fill xcrb struct */
552 prep_xcrb(&xcrb
, cardnr
, preqcblk
, prepcblk
);
554 /* forward xcrb with request CPRB and reply CPRB to zcrypt dd */
555 rc
= _zcrypt_send_cprb(&xcrb
);
558 "%s zcrypt_send_cprb (cardnr=%d domain=%d) failed with errno %d\n",
559 __func__
, (int) cardnr
, (int) domain
, rc
);
563 /* check response returncode and reasoncode */
564 if (prepcblk
->ccp_rtcode
!= 0) {
566 "%s unwrap secure key failure, card response %d/%d\n",
568 (int) prepcblk
->ccp_rtcode
,
569 (int) prepcblk
->ccp_rscode
);
573 if (prepcblk
->ccp_rscode
!= 0) {
575 "%s unwrap secure key warning, card response %d/%d\n",
577 (int) prepcblk
->ccp_rtcode
,
578 (int) prepcblk
->ccp_rscode
);
581 /* process response cprb param block */
582 prepcblk
->rpl_parmb
= ((u8
*) prepcblk
) + sizeof(struct CPRBX
);
583 prepparm
= (struct uskrepparm
*) prepcblk
->rpl_parmb
;
585 /* check the returned keyblock */
586 if (prepparm
->lv3
.keyblock
.version
!= 0x01) {
588 "%s reply param keyblock version mismatch 0x%02x != 0x01\n",
589 __func__
, (int) prepparm
->lv3
.keyblock
.version
);
594 /* copy the tanslated protected key */
595 switch (prepparm
->lv3
.keyblock
.keylen
) {
597 protkey
->type
= PKEY_KEYTYPE_AES_128
;
600 protkey
->type
= PKEY_KEYTYPE_AES_192
;
603 protkey
->type
= PKEY_KEYTYPE_AES_256
;
606 DEBUG_ERR("%s unknown/unsupported keytype %d\n",
607 __func__
, prepparm
->lv3
.keyblock
.keylen
);
611 protkey
->len
= prepparm
->lv3
.keyblock
.keylen
;
612 memcpy(protkey
->protkey
, prepparm
->lv3
.keyblock
.key
, protkey
->len
);
615 free_cprbmem(mem
, PARMBSIZE
, 0);
618 EXPORT_SYMBOL(pkey_sec2protkey
);
621 * Create a protected key from a clear key value.
623 int pkey_clr2protkey(u32 keytype
,
624 const struct pkey_clrkey
*clrkey
,
625 struct pkey_protkey
*protkey
)
632 case PKEY_KEYTYPE_AES_128
:
634 fc
= CPACF_PCKMO_ENC_AES_128_KEY
;
636 case PKEY_KEYTYPE_AES_192
:
638 fc
= CPACF_PCKMO_ENC_AES_192_KEY
;
640 case PKEY_KEYTYPE_AES_256
:
642 fc
= CPACF_PCKMO_ENC_AES_256_KEY
;
645 DEBUG_ERR("%s unknown/unsupported keytype %d\n",
650 /* prepare param block */
651 memset(paramblock
, 0, sizeof(paramblock
));
652 memcpy(paramblock
, clrkey
->clrkey
, keysize
);
654 /* call the pckmo instruction */
655 cpacf_pckmo(fc
, paramblock
);
657 /* copy created protected key */
658 protkey
->type
= keytype
;
659 protkey
->len
= keysize
+ 32;
660 memcpy(protkey
->protkey
, paramblock
, keysize
+ 32);
664 EXPORT_SYMBOL(pkey_clr2protkey
);
667 * query cryptographic facility from adapter
669 static int query_crypto_facility(u16 cardnr
, u16 domain
,
671 u8
*rarray
, size_t *rarraylen
,
672 u8
*varray
, size_t *varraylen
)
677 struct CPRBX
*preqcblk
, *prepcblk
;
678 struct ica_xcRB xcrb
;
685 u8 data
[VARDATASIZE
];
689 size_t parmbsize
= sizeof(struct fqreqparm
);
695 /* get already prepared memory for 2 cprbs with param block each */
696 rc
= alloc_and_prep_cprbmem(parmbsize
, &mem
, &preqcblk
, &prepcblk
);
700 /* fill request cprb struct */
701 preqcblk
->domain
= domain
;
703 /* fill request cprb param block with FQ request */
704 preqparm
= (struct fqreqparm
*) preqcblk
->req_parmb
;
705 memcpy(preqparm
->subfunc_code
, "FQ", 2);
706 memcpy(preqparm
->rule_array
, keyword
, sizeof(preqparm
->rule_array
));
707 preqparm
->rule_array_len
=
708 sizeof(preqparm
->rule_array_len
) + sizeof(preqparm
->rule_array
);
709 preqparm
->lv1
.len
= sizeof(preqparm
->lv1
);
710 preqparm
->dummylen
= sizeof(preqparm
->dummylen
);
711 preqcblk
->req_parml
= parmbsize
;
713 /* fill xcrb struct */
714 prep_xcrb(&xcrb
, cardnr
, preqcblk
, prepcblk
);
716 /* forward xcrb with request CPRB and reply CPRB to zcrypt dd */
717 rc
= _zcrypt_send_cprb(&xcrb
);
720 "%s zcrypt_send_cprb (cardnr=%d domain=%d) failed with errno %d\n",
721 __func__
, (int) cardnr
, (int) domain
, rc
);
725 /* check response returncode and reasoncode */
726 if (prepcblk
->ccp_rtcode
!= 0) {
728 "%s unwrap secure key failure, card response %d/%d\n",
730 (int) prepcblk
->ccp_rtcode
,
731 (int) prepcblk
->ccp_rscode
);
736 /* process response cprb param block */
737 prepcblk
->rpl_parmb
= ((u8
*) prepcblk
) + sizeof(struct CPRBX
);
738 prepparm
= (struct fqrepparm
*) prepcblk
->rpl_parmb
;
739 ptr
= prepparm
->lvdata
;
741 /* check and possibly copy reply rule array */
742 len
= *((u16
*) ptr
);
743 if (len
> sizeof(u16
)) {
746 if (rarray
&& rarraylen
&& *rarraylen
> 0) {
747 *rarraylen
= (len
> *rarraylen
? *rarraylen
: len
);
748 memcpy(rarray
, ptr
, *rarraylen
);
752 /* check and possible copy reply var array */
753 len
= *((u16
*) ptr
);
754 if (len
> sizeof(u16
)) {
757 if (varray
&& varraylen
&& *varraylen
> 0) {
758 *varraylen
= (len
> *varraylen
? *varraylen
: len
);
759 memcpy(varray
, ptr
, *varraylen
);
765 free_cprbmem(mem
, parmbsize
, 0);
770 * Fetch the current and old mkvp values via
771 * query_crypto_facility from adapter.
773 static int fetch_mkvp(u16 cardnr
, u16 domain
, u64 mkvp
[2])
777 u8
*rarray
, *varray
, *pg
;
779 pg
= (u8
*) __get_free_page(GFP_KERNEL
);
783 varray
= pg
+ PAGE_SIZE
/2;
784 rlen
= vlen
= PAGE_SIZE
/2;
786 rc
= query_crypto_facility(cardnr
, domain
, "STATICSA",
787 rarray
, &rlen
, varray
, &vlen
);
788 if (rc
== 0 && rlen
> 8*8 && vlen
> 184+8) {
789 if (rarray
[8*8] == '2') {
790 /* current master key state is valid */
791 mkvp
[0] = *((u64
*)(varray
+ 184));
792 mkvp
[1] = *((u64
*)(varray
+ 172));
797 free_page((unsigned long) pg
);
799 return found
? 0 : -ENOENT
;
802 /* struct to hold cached mkvp info for each card/domain */
804 struct list_head list
;
810 /* a list with mkvp_info entries */
811 static LIST_HEAD(mkvp_list
);
812 static DEFINE_SPINLOCK(mkvp_list_lock
);
814 static int mkvp_cache_fetch(u16 cardnr
, u16 domain
, u64 mkvp
[2])
817 struct mkvp_info
*ptr
;
819 spin_lock_bh(&mkvp_list_lock
);
820 list_for_each_entry(ptr
, &mkvp_list
, list
) {
821 if (ptr
->cardnr
== cardnr
&&
822 ptr
->domain
== domain
) {
823 memcpy(mkvp
, ptr
->mkvp
, 2 * sizeof(u64
));
828 spin_unlock_bh(&mkvp_list_lock
);
833 static void mkvp_cache_update(u16 cardnr
, u16 domain
, u64 mkvp
[2])
836 struct mkvp_info
*ptr
;
838 spin_lock_bh(&mkvp_list_lock
);
839 list_for_each_entry(ptr
, &mkvp_list
, list
) {
840 if (ptr
->cardnr
== cardnr
&&
841 ptr
->domain
== domain
) {
842 memcpy(ptr
->mkvp
, mkvp
, 2 * sizeof(u64
));
848 ptr
= kmalloc(sizeof(*ptr
), GFP_ATOMIC
);
850 spin_unlock_bh(&mkvp_list_lock
);
853 ptr
->cardnr
= cardnr
;
854 ptr
->domain
= domain
;
855 memcpy(ptr
->mkvp
, mkvp
, 2 * sizeof(u64
));
856 list_add(&ptr
->list
, &mkvp_list
);
858 spin_unlock_bh(&mkvp_list_lock
);
861 static void mkvp_cache_scrub(u16 cardnr
, u16 domain
)
863 struct mkvp_info
*ptr
;
865 spin_lock_bh(&mkvp_list_lock
);
866 list_for_each_entry(ptr
, &mkvp_list
, list
) {
867 if (ptr
->cardnr
== cardnr
&&
868 ptr
->domain
== domain
) {
869 list_del(&ptr
->list
);
874 spin_unlock_bh(&mkvp_list_lock
);
877 static void __exit
mkvp_cache_free(void)
879 struct mkvp_info
*ptr
, *pnext
;
881 spin_lock_bh(&mkvp_list_lock
);
882 list_for_each_entry_safe(ptr
, pnext
, &mkvp_list
, list
) {
883 list_del(&ptr
->list
);
886 spin_unlock_bh(&mkvp_list_lock
);
890 * Search for a matching crypto card based on the Master Key
891 * Verification Pattern provided inside a secure key.
893 int pkey_findcard(const struct pkey_seckey
*seckey
,
894 u16
*pcardnr
, u16
*pdomain
, int verify
)
896 struct secaeskeytoken
*t
= (struct secaeskeytoken
*) seckey
;
897 struct zcrypt_device_status_ext
*device_status
;
902 /* mkvp must not be zero */
906 /* fetch status of all crypto cards */
907 device_status
= kmalloc_array(MAX_ZDEV_ENTRIES_EXT
,
908 sizeof(struct zcrypt_device_status_ext
),
912 zcrypt_device_status_mask_ext(device_status
);
914 /* walk through all crypto cards */
915 for (i
= 0; i
< MAX_ZDEV_ENTRIES_EXT
; i
++) {
916 card
= AP_QID_CARD(device_status
[i
].qid
);
917 dom
= AP_QID_QUEUE(device_status
[i
].qid
);
918 if (device_status
[i
].online
&&
919 device_status
[i
].functions
& 0x04) {
920 /* an enabled CCA Coprocessor card */
921 /* try cached mkvp */
922 if (mkvp_cache_fetch(card
, dom
, mkvp
) == 0 &&
923 t
->mkvp
== mkvp
[0]) {
926 /* verify: fetch mkvp from adapter */
927 if (fetch_mkvp(card
, dom
, mkvp
) == 0) {
928 mkvp_cache_update(card
, dom
, mkvp
);
929 if (t
->mkvp
== mkvp
[0])
934 /* Card is offline and/or not a CCA card. */
935 /* del mkvp entry from cache if it exists */
936 mkvp_cache_scrub(card
, dom
);
939 if (i
>= MAX_ZDEV_ENTRIES_EXT
) {
940 /* nothing found, so this time without cache */
941 for (i
= 0; i
< MAX_ZDEV_ENTRIES_EXT
; i
++) {
942 if (!(device_status
[i
].online
&&
943 device_status
[i
].functions
& 0x04))
945 card
= AP_QID_CARD(device_status
[i
].qid
);
946 dom
= AP_QID_QUEUE(device_status
[i
].qid
);
947 /* fresh fetch mkvp from adapter */
948 if (fetch_mkvp(card
, dom
, mkvp
) == 0) {
949 mkvp_cache_update(card
, dom
, mkvp
);
950 if (t
->mkvp
== mkvp
[0])
952 if (t
->mkvp
== mkvp
[1] && oi
< 0)
956 if (i
>= MAX_ZDEV_ENTRIES_EXT
&& oi
>= 0) {
957 /* old mkvp matched, use this card then */
958 card
= AP_QID_CARD(device_status
[oi
].qid
);
959 dom
= AP_QID_QUEUE(device_status
[oi
].qid
);
962 if (i
< MAX_ZDEV_ENTRIES_EXT
|| oi
>= 0) {
971 kfree(device_status
);
974 EXPORT_SYMBOL(pkey_findcard
);
977 * Find card and transform secure key into protected key.
979 int pkey_skey2pkey(const struct pkey_seckey
*seckey
,
980 struct pkey_protkey
*protkey
)
986 * The pkey_sec2protkey call may fail when a card has been
987 * addressed where the master key was changed after last fetch
988 * of the mkvp into the cache. So first try without verify then
989 * with verify enabled (thus refreshing the mkvp for each card).
991 for (verify
= 0; verify
< 2; verify
++) {
992 rc
= pkey_findcard(seckey
, &cardnr
, &domain
, verify
);
995 rc
= pkey_sec2protkey(cardnr
, domain
, seckey
, protkey
);
1001 DEBUG_DBG("%s failed rc=%d\n", __func__
, rc
);
1005 EXPORT_SYMBOL(pkey_skey2pkey
);
1008 * Verify key and give back some info about the key.
1010 int pkey_verifykey(const struct pkey_seckey
*seckey
,
1011 u16
*pcardnr
, u16
*pdomain
,
1012 u16
*pkeysize
, u32
*pattributes
)
1014 struct secaeskeytoken
*t
= (struct secaeskeytoken
*) seckey
;
1019 /* check the secure key for valid AES secure key */
1020 rc
= check_secaeskeytoken((u8
*) seckey
, 0);
1024 *pattributes
= PKEY_VERIFY_ATTR_AES
;
1026 *pkeysize
= t
->bitsize
;
1028 /* try to find a card which can handle this key */
1029 rc
= pkey_findcard(seckey
, &cardnr
, &domain
, 1);
1033 /* check mkvp for old mkvp match */
1034 rc
= mkvp_cache_fetch(cardnr
, domain
, mkvp
);
1037 if (t
->mkvp
== mkvp
[1]) {
1038 DEBUG_DBG("%s secure key has old mkvp\n", __func__
);
1040 *pattributes
|= PKEY_VERIFY_ATTR_OLD_MKVP
;
1049 DEBUG_DBG("%s rc=%d\n", __func__
, rc
);
1052 EXPORT_SYMBOL(pkey_verifykey
);
1058 static long pkey_unlocked_ioctl(struct file
*filp
, unsigned int cmd
,
1064 case PKEY_GENSECK
: {
1065 struct pkey_genseck __user
*ugs
= (void __user
*) arg
;
1066 struct pkey_genseck kgs
;
1068 if (copy_from_user(&kgs
, ugs
, sizeof(kgs
)))
1070 rc
= pkey_genseckey(kgs
.cardnr
, kgs
.domain
,
1071 kgs
.keytype
, &kgs
.seckey
);
1072 DEBUG_DBG("%s pkey_genseckey()=%d\n", __func__
, rc
);
1075 if (copy_to_user(ugs
, &kgs
, sizeof(kgs
)))
1079 case PKEY_CLR2SECK
: {
1080 struct pkey_clr2seck __user
*ucs
= (void __user
*) arg
;
1081 struct pkey_clr2seck kcs
;
1083 if (copy_from_user(&kcs
, ucs
, sizeof(kcs
)))
1085 rc
= pkey_clr2seckey(kcs
.cardnr
, kcs
.domain
, kcs
.keytype
,
1086 &kcs
.clrkey
, &kcs
.seckey
);
1087 DEBUG_DBG("%s pkey_clr2seckey()=%d\n", __func__
, rc
);
1090 if (copy_to_user(ucs
, &kcs
, sizeof(kcs
)))
1092 memzero_explicit(&kcs
, sizeof(kcs
));
1095 case PKEY_SEC2PROTK
: {
1096 struct pkey_sec2protk __user
*usp
= (void __user
*) arg
;
1097 struct pkey_sec2protk ksp
;
1099 if (copy_from_user(&ksp
, usp
, sizeof(ksp
)))
1101 rc
= pkey_sec2protkey(ksp
.cardnr
, ksp
.domain
,
1102 &ksp
.seckey
, &ksp
.protkey
);
1103 DEBUG_DBG("%s pkey_sec2protkey()=%d\n", __func__
, rc
);
1106 if (copy_to_user(usp
, &ksp
, sizeof(ksp
)))
1110 case PKEY_CLR2PROTK
: {
1111 struct pkey_clr2protk __user
*ucp
= (void __user
*) arg
;
1112 struct pkey_clr2protk kcp
;
1114 if (copy_from_user(&kcp
, ucp
, sizeof(kcp
)))
1116 rc
= pkey_clr2protkey(kcp
.keytype
,
1117 &kcp
.clrkey
, &kcp
.protkey
);
1118 DEBUG_DBG("%s pkey_clr2protkey()=%d\n", __func__
, rc
);
1121 if (copy_to_user(ucp
, &kcp
, sizeof(kcp
)))
1123 memzero_explicit(&kcp
, sizeof(kcp
));
1126 case PKEY_FINDCARD
: {
1127 struct pkey_findcard __user
*ufc
= (void __user
*) arg
;
1128 struct pkey_findcard kfc
;
1130 if (copy_from_user(&kfc
, ufc
, sizeof(kfc
)))
1132 rc
= pkey_findcard(&kfc
.seckey
,
1133 &kfc
.cardnr
, &kfc
.domain
, 1);
1134 DEBUG_DBG("%s pkey_findcard()=%d\n", __func__
, rc
);
1137 if (copy_to_user(ufc
, &kfc
, sizeof(kfc
)))
1141 case PKEY_SKEY2PKEY
: {
1142 struct pkey_skey2pkey __user
*usp
= (void __user
*) arg
;
1143 struct pkey_skey2pkey ksp
;
1145 if (copy_from_user(&ksp
, usp
, sizeof(ksp
)))
1147 rc
= pkey_skey2pkey(&ksp
.seckey
, &ksp
.protkey
);
1148 DEBUG_DBG("%s pkey_skey2pkey()=%d\n", __func__
, rc
);
1151 if (copy_to_user(usp
, &ksp
, sizeof(ksp
)))
1155 case PKEY_VERIFYKEY
: {
1156 struct pkey_verifykey __user
*uvk
= (void __user
*) arg
;
1157 struct pkey_verifykey kvk
;
1159 if (copy_from_user(&kvk
, uvk
, sizeof(kvk
)))
1161 rc
= pkey_verifykey(&kvk
.seckey
, &kvk
.cardnr
, &kvk
.domain
,
1162 &kvk
.keysize
, &kvk
.attributes
);
1163 DEBUG_DBG("%s pkey_verifykey()=%d\n", __func__
, rc
);
1166 if (copy_to_user(uvk
, &kvk
, sizeof(kvk
)))
1171 /* unknown/unsupported ioctl cmd */
1179 * Sysfs and file io operations
1181 static const struct file_operations pkey_fops
= {
1182 .owner
= THIS_MODULE
,
1183 .open
= nonseekable_open
,
1184 .llseek
= no_llseek
,
1185 .unlocked_ioctl
= pkey_unlocked_ioctl
,
1188 static struct miscdevice pkey_dev
= {
1190 .minor
= MISC_DYNAMIC_MINOR
,
1198 static int __init
pkey_init(void)
1200 cpacf_mask_t pckmo_functions
;
1202 /* check for pckmo instructions available */
1203 if (!cpacf_query(CPACF_PCKMO
, &pckmo_functions
))
1205 if (!cpacf_test_func(&pckmo_functions
, CPACF_PCKMO_ENC_AES_128_KEY
) ||
1206 !cpacf_test_func(&pckmo_functions
, CPACF_PCKMO_ENC_AES_192_KEY
) ||
1207 !cpacf_test_func(&pckmo_functions
, CPACF_PCKMO_ENC_AES_256_KEY
))
1212 return misc_register(&pkey_dev
);
1218 static void __exit
pkey_exit(void)
1220 misc_deregister(&pkey_dev
);
1225 module_init(pkey_init
);
1226 module_exit(pkey_exit
);