diff options
-rw-r--r-- | drivers/s390/crypto/pkey_api.c | 49 | ||||
-rw-r--r-- | drivers/s390/crypto/pkey_base.h | 29 | ||||
-rw-r--r-- | drivers/s390/crypto/pkey_cca.c | 4 | ||||
-rw-r--r-- | drivers/s390/crypto/pkey_ep11.c | 13 | ||||
-rw-r--r-- | drivers/s390/crypto/pkey_pckmo.c | 91 | ||||
-rw-r--r-- | drivers/s390/crypto/pkey_sysfs.c | 125 |
6 files changed, 213 insertions, 98 deletions
diff --git a/drivers/s390/crypto/pkey_api.c b/drivers/s390/crypto/pkey_api.c index 732437bf3823..31382c23ec14 100644 --- a/drivers/s390/crypto/pkey_api.c +++ b/drivers/s390/crypto/pkey_api.c @@ -109,7 +109,7 @@ static int genseck2(const struct pkey_apqn *apqns, size_t nr_apqns, rc = pkey_cca_gen_key(apqns[i].card, apqns[i].domain, u, keytype, keybitsize, flags, - keybuf, keybuflen); + keybuf, keybuflen, NULL); } } else if (pkey_is_ep11_keytype(keytype)) { /* As of now only EP11 AES key generation is supported */ @@ -123,7 +123,7 @@ static int genseck2(const struct pkey_apqn *apqns, size_t nr_apqns, rc = pkey_ep11_gen_key(apqns[i].card, apqns[i].domain, u, keytype, keybitsize, flags, - keybuf, keybuflen); + keybuf, keybuflen, NULL); } } else { PKEY_DBF_ERR("%s unknown/unsupported keytype %d\n", @@ -154,7 +154,7 @@ static int clr2seckey2(const struct pkey_apqn *apqns, size_t nr_apqns, apqns[i].domain, u, keytype, kbitsize, flags, clrkey, kbitsize / 8, - keybuf, keybuflen); + keybuf, keybuflen, NULL); } } else if (pkey_is_ep11_keytype(keytype)) { /* As of now only EP11 AES key generation is supported */ @@ -169,7 +169,7 @@ static int clr2seckey2(const struct pkey_apqn *apqns, size_t nr_apqns, apqns[i].domain, u, keytype, kbitsize, flags, clrkey, kbitsize / 8, - keybuf, keybuflen); + keybuf, keybuflen, NULL); } } else { PKEY_DBF_ERR("%s unknown/unsupported keytype %d\n", @@ -308,6 +308,7 @@ static int pckmokey2protkey_fallback(const struct clearkeytoken *t, nr_apqns = MAXAPQNSINLIST; rc = pkey_cca_apqns4type(PKEY_TYPE_CCA_DATA, NULL, NULL, 0, apqns, &nr_apqns); + pr_debug("pkey_cca_apqns4type(CCA_DATA)=%d\n", rc); if (rc) goto try_via_ep11; for (j = 0, rc = -ENODEV; j < nr_apqns && rc; j++) { @@ -316,7 +317,8 @@ static int pckmokey2protkey_fallback(const struct clearkeytoken *t, t->keytype, PKEY_TYPE_CCA_DATA, 8 * keysize, 0, t->clearkey, t->len, - tmpbuf, &tmplen); + tmpbuf, &tmplen, NULL); + pr_debug("pkey_cca_clr2key()=%d\n", rc); } if (rc) goto try_via_ep11; @@ -326,6 +328,7 @@ static int pckmokey2protkey_fallback(const struct clearkeytoken *t, tmpbuf, tmplen, protkey, protkeylen, protkeytype); + pr_debug("pkey_cca_key2protkey()=%d\n", rc); } if (!rc) break; @@ -335,6 +338,7 @@ try_via_ep11: nr_apqns = MAXAPQNSINLIST; rc = pkey_ep11_apqns4type(PKEY_TYPE_EP11_AES, NULL, NULL, 0, apqns, &nr_apqns); + pr_debug("pkey_ep11_apqns4type(EP11_AES)=%d\n", rc); if (rc) continue; for (j = 0, rc = -ENODEV; j < nr_apqns && rc; j++) { @@ -343,7 +347,8 @@ try_via_ep11: t->keytype, PKEY_TYPE_EP11_AES, 8 * keysize, 0, t->clearkey, t->len, - tmpbuf, &tmplen); + tmpbuf, &tmplen, NULL); + pr_debug("pkey_ep11_clr2key()=%d\n", rc); } if (rc) continue; @@ -353,6 +358,7 @@ try_via_ep11: tmpbuf, tmplen, protkey, protkeylen, protkeytype); + pr_debug("pkey_ep11_key2protkey()=%d\n", rc); } } @@ -367,9 +373,8 @@ static int pckmokey2protkey(const u8 *key, size_t keylen, { int rc; - rc = pkey_pckmo_key2protkey(key, keylen, - protkey, protkeylen, - protkeytype); + rc = pkey_pckmo_key2protkey(0, 0, key, keylen, + protkey, protkeylen, protkeytype); if (rc == -ENODEV) { struct keytoken_header *hdr = (struct keytoken_header *)key; struct clearkeytoken *t = (struct clearkeytoken *)key; @@ -456,7 +461,7 @@ static int pkey_ioctl_genseck(struct pkey_genseck __user *ugs) keybuflen = sizeof(kgs.seckey.seckey); rc = pkey_cca_gen_key(kgs.cardnr, kgs.domain, kgs.keytype, PKEY_TYPE_CCA_DATA, 0, 0, - kgs.seckey.seckey, &keybuflen); + kgs.seckey.seckey, &keybuflen, NULL); pr_debug("pkey_cca_gen_key()=%d\n", rc); if (!rc && copy_to_user(ugs, &kgs, sizeof(kgs))) rc = -EFAULT; @@ -478,7 +483,7 @@ static int pkey_ioctl_clr2seck(struct pkey_clr2seck __user *ucs) kcs.keytype, PKEY_TYPE_CCA_DATA, 0, 0, kcs.clrkey.clrkey, pkey_keytype_aes_to_size(kcs.keytype), - kcs.seckey.seckey, &keybuflen); + kcs.seckey.seckey, &keybuflen, NULL); pr_debug("pkey_cca_clr2key()=%d\n", rc); if (!rc && copy_to_user(ucs, &kcs, sizeof(kcs))) rc = -EFAULT; @@ -515,10 +520,11 @@ static int pkey_ioctl_clr2protk(struct pkey_clr2protk __user *ucp) if (copy_from_user(&kcp, ucp, sizeof(kcp))) return -EFAULT; kcp.protkey.len = sizeof(kcp.protkey.protkey); - rc = pkey_pckmo_clr2protkey(kcp.keytype, kcp.clrkey.clrkey, - kcp.protkey.protkey, - &kcp.protkey.len, &kcp.protkey.type); - pr_debug("pkey_pckmo_clr2protkey()=%d\n", rc); + rc = pkey_pckmo_clr2key(0, 0, kcp.keytype, 0, 0, 0, + kcp.clrkey.clrkey, 0, + kcp.protkey.protkey, + &kcp.protkey.len, &kcp.protkey.type); + pr_debug("pkey_pckmo_clr2key()=%d\n", rc); if (!rc && copy_to_user(ucp, &kcp, sizeof(kcp))) rc = -EFAULT; memzero_explicit(&kcp, sizeof(kcp)); @@ -643,9 +649,10 @@ static int pkey_ioctl_genprotk(struct pkey_genprotk __user *ugp) if (copy_from_user(&kgp, ugp, sizeof(kgp))) return -EFAULT; kgp.protkey.len = sizeof(kgp.protkey.protkey); - rc = pkey_pckmo_gen_protkey(kgp.keytype, kgp.protkey.protkey, - &kgp.protkey.len, &kgp.protkey.type); - pr_debug("pkey_gen_protkey()=%d\n", rc); + rc = pkey_pckmo_gen_key(0, 0, kgp.keytype, 0, 0, 0, + kgp.protkey.protkey, + &kgp.protkey.len, &kgp.protkey.type); + pr_debug("pkey_pckmo_gen_key()=%d\n", rc); if (!rc && copy_to_user(ugp, &kgp, sizeof(kgp))) rc = -EFAULT; memzero_explicit(&kgp, sizeof(kgp)); @@ -660,9 +667,9 @@ static int pkey_ioctl_verifyprotk(struct pkey_verifyprotk __user *uvp) if (copy_from_user(&kvp, uvp, sizeof(kvp))) return -EFAULT; - rc = pkey_pckmo_verify_protkey(kvp.protkey.protkey, - kvp.protkey.len, kvp.protkey.type); - pr_debug("pkey_verify_protkey()=%d\n", rc); + rc = pkey_pckmo_verifykey(kvp.protkey.protkey, kvp.protkey.len, + 0, 0, &kvp.protkey.type, 0, 0); + pr_debug("pkey_pckmo_verifykey()=%d\n", rc); memzero_explicit(&kvp, sizeof(kvp)); return rc; diff --git a/drivers/s390/crypto/pkey_base.h b/drivers/s390/crypto/pkey_base.h index f714d42969b6..560106cbd450 100644 --- a/drivers/s390/crypto/pkey_base.h +++ b/drivers/s390/crypto/pkey_base.h @@ -97,12 +97,12 @@ int pkey_cca_key2protkey(u16 card, u16 dom, int pkey_cca_gen_key(u16 card, u16 dom, u32 keytype, u32 keysubtype, u32 keybitsize, u32 flags, - u8 *keybuf, u32 *keybuflen); + u8 *keybuf, u32 *keybuflen, u32 *_keyinfo); int pkey_cca_clr2key(u16 card, u16 dom, u32 keytype, u32 keysubtype, u32 keybitsize, u32 flags, const u8 *clrkey, u32 clrkeylen, - u8 *keybuf, u32 *keybuflen); + u8 *keybuf, u32 *keybuflen, u32 *_keyinfo); int pkey_cca_verifykey(const u8 *key, u32 keylen, u16 *card, u16 *dom, u32 *keytype, u32 *keybitsize, u32 *flags); @@ -124,12 +124,12 @@ int pkey_ep11_key2protkey(u16 card, u16 dom, int pkey_ep11_gen_key(u16 card, u16 dom, u32 keytype, u32 keysubtype, u32 keybitsize, u32 flags, - u8 *keybuf, u32 *keybuflen); + u8 *keybuf, u32 *keybuflen, u32 *_keyinfo); int pkey_ep11_clr2key(u16 card, u16 dom, u32 keytype, u32 keysubtype, u32 keybitsize, u32 flags, const u8 *clrkey, u32 clrkeylen, - u8 *keybuf, u32 *keybuflen); + u8 *keybuf, u32 *keybuflen, u32 *_keyinfo); int pkey_ep11_verifykey(const u8 *key, u32 keylen, u16 *card, u16 *dom, u32 *keytype, u32 *keybitsize, u32 *flags); @@ -144,14 +144,21 @@ int pkey_ep11_apqns4type(enum pkey_key_type ktype, */ bool pkey_is_pckmo_key(const u8 *key, u32 keylen); -int pkey_pckmo_key2protkey(const u8 *key, u32 keylen, +int pkey_pckmo_key2protkey(u16 _card, u16 _dom, + const u8 *key, u32 keylen, u8 *protkey, u32 *protkeylen, u32 *protkeytype); -int pkey_pckmo_gen_protkey(u32 keytype, - u8 *protkey, u32 *protkeylen, u32 *protkeytype); -int pkey_pckmo_clr2protkey(u32 keytype, const u8 *clrkey, - u8 *protkey, u32 *protkeylen, u32 *protkeytype); -int pkey_pckmo_verify_protkey(const u8 *protkey, u32 protkeylen, - u32 protkeytype); +int pkey_pckmo_gen_key(u16 _card, u16 _dom, + u32 keytype, u32 _keysubtype, + u32 _keybitsize, u32 _flags, + u8 *keybuf, u32 *keybuflen, u32 *keyinfo); +int pkey_pckmo_clr2key(u16 _card, u16 _dom, + u32 keytype, u32 _keysubtype, + u32 _keybitsize, u32 _flags, + const u8 *clrkey, u32 clrkeylen, + u8 *keybuf, u32 *keybuflen, u32 *keyinfo); +int pkey_pckmo_verifykey(const u8 *key, u32 keylen, + u16 *_card, u16 *_dom, + u32 *keytype, u32 *_keybitsize, u32 *_flags); /* * pkey_sysfs.c: diff --git a/drivers/s390/crypto/pkey_cca.c b/drivers/s390/crypto/pkey_cca.c index 65e520d7a864..1bf9019ec561 100644 --- a/drivers/s390/crypto/pkey_cca.c +++ b/drivers/s390/crypto/pkey_cca.c @@ -112,7 +112,7 @@ int pkey_cca_key2protkey(u16 card, u16 dom, int pkey_cca_gen_key(u16 card, u16 dom, u32 keytype, u32 subtype, u32 keybitsize, u32 flags, - u8 *keybuf, u32 *keybuflen) + u8 *keybuf, u32 *keybuflen, u32 *_keyinfo) { int len, rc; @@ -173,7 +173,7 @@ int pkey_cca_clr2key(u16 card, u16 dom, u32 keytype, u32 subtype, u32 keybitsize, u32 flags, const u8 *clrkey, u32 clrkeylen, - u8 *keybuf, u32 *keybuflen) + u8 *keybuf, u32 *keybuflen, u32 *_keyinfo) { int len, rc; diff --git a/drivers/s390/crypto/pkey_ep11.c b/drivers/s390/crypto/pkey_ep11.c index fdc9de43a6c1..4c49e07ece74 100644 --- a/drivers/s390/crypto/pkey_ep11.c +++ b/drivers/s390/crypto/pkey_ep11.c @@ -71,8 +71,7 @@ int pkey_ep11_key2protkey(u16 card, u16 dom, 3, key, keylen, 1)) return -EINVAL; rc = ep11_kblob2protkey(card, dom, key, hdr->len, - protkey, protkeylen, - protkeytype); + protkey, protkeylen, protkeytype); } else if (hdr->type == TOKTYPE_NON_CCA && hdr->version == TOKVER_EP11_ECC_WITH_HEADER && is_ep11_keyblob(key + sizeof(struct ep11kblob_header))) { @@ -81,8 +80,7 @@ int pkey_ep11_key2protkey(u16 card, u16 dom, 3, key, keylen, 1)) return -EINVAL; rc = ep11_kblob2protkey(card, dom, key, hdr->len, - protkey, protkeylen, - protkeytype); + protkey, protkeylen, protkeytype); } else if (hdr->type == TOKTYPE_NON_CCA && hdr->version == TOKVER_EP11_AES && is_ep11_keyblob(key)) { @@ -90,8 +88,7 @@ int pkey_ep11_key2protkey(u16 card, u16 dom, if (ep11_check_aes_key(pkey_dbf_info, 3, key, keylen, 1)) return -EINVAL; rc = ep11_kblob2protkey(card, dom, key, hdr->len, - protkey, protkeylen, - protkeytype); + protkey, protkeylen, protkeytype); } else { PKEY_DBF_ERR("%s unknown/unsupported blob type %d version %d\n", __func__, hdr->type, hdr->version); @@ -114,7 +111,7 @@ int pkey_ep11_key2protkey(u16 card, u16 dom, int pkey_ep11_gen_key(u16 card, u16 dom, u32 keytype, u32 subtype, u32 keybitsize, u32 flags, - u8 *keybuf, u32 *keybuflen) + u8 *keybuf, u32 *keybuflen, u32 *_keyinfo) { int len, rc; @@ -171,7 +168,7 @@ int pkey_ep11_clr2key(u16 card, u16 dom, u32 keytype, u32 subtype, u32 keybitsize, u32 flags, const u8 *clrkey, u32 clrkeylen, - u8 *keybuf, u32 *keybuflen) + u8 *keybuf, u32 *keybuflen, u32 *_keyinfo) { int len, rc; diff --git a/drivers/s390/crypto/pkey_pckmo.c b/drivers/s390/crypto/pkey_pckmo.c index 30a9d2f64853..d2c2c61f449b 100644 --- a/drivers/s390/crypto/pkey_pckmo.c +++ b/drivers/s390/crypto/pkey_pckmo.c @@ -18,10 +18,67 @@ #include "pkey_base.h" /* - * Check key blob for known and supported here. + * Prototypes */ + +static bool is_pckmo_key(const u8 *key, u32 keylen); +static int pckmo_key2protkey(const u8 *key, u32 keylen, + u8 *protkey, u32 *protkeylen, u32 *protkeytype); +static int pckmo_gen_protkey(u32 keytype, + u8 *protkey, u32 *protkeylen, u32 *protkeytype); +static int pckmo_clr2protkey(u32 keytype, const u8 *clrkey, u32 clrkeylen, + u8 *protkey, u32 *protkeylen, u32 *protkeytype); +static int pckmo_verify_protkey(const u8 *protkey, u32 protkeylen, + u32 protkeytype); + +/* + * Wrapper functions + */ + bool pkey_is_pckmo_key(const u8 *key, u32 keylen) { + return is_pckmo_key(key, keylen); +} + +int pkey_pckmo_key2protkey(u16 _card, u16 _dom, + const u8 *key, u32 keylen, + u8 *protkey, u32 *protkeylen, u32 *keyinfo) +{ + return pckmo_key2protkey(key, keylen, + protkey, protkeylen, keyinfo); +} + +int pkey_pckmo_gen_key(u16 _card, u16 _dom, + u32 keytype, u32 _keysubtype, + u32 _keybitsize, u32 _flags, + u8 *keybuf, u32 *keybuflen, u32 *keyinfo) +{ + return pckmo_gen_protkey(keytype, + keybuf, keybuflen, keyinfo); +} + +int pkey_pckmo_clr2key(u16 _card, u16 _dom, + u32 keytype, u32 _keysubtype, + u32 _keybitsize, u32 _flags, + const u8 *clrkey, u32 clrkeylen, + u8 *keybuf, u32 *keybuflen, u32 *keyinfo) +{ + return pckmo_clr2protkey(keytype, clrkey, clrkeylen, + keybuf, keybuflen, keyinfo); +} + +int pkey_pckmo_verifykey(const u8 *key, u32 keylen, + u16 *_card, u16 *_dom, + u32 *keytype, u32 *_keybitsize, u32 *_flags) +{ + return pckmo_verify_protkey(key, keylen, *keytype); +} + +/* + * Check key blob for known and supported here. + */ +static bool is_pckmo_key(const u8 *key, u32 keylen) +{ struct keytoken_header *hdr = (struct keytoken_header *)key; struct clearkeytoken *t = (struct clearkeytoken *)key; @@ -55,8 +112,8 @@ bool pkey_is_pckmo_key(const u8 *key, u32 keylen) } } -int pkey_pckmo_key2protkey(const u8 *key, u32 keylen, - u8 *protkey, u32 *protkeylen, u32 *protkeytype) +static int pckmo_key2protkey(const u8 *key, u32 keylen, + u8 *protkey, u32 *protkeylen, u32 *protkeytype) { struct keytoken_header *hdr = (struct keytoken_header *)key; int rc = -EINVAL; @@ -73,8 +130,7 @@ int pkey_pckmo_key2protkey(const u8 *key, u32 keylen, if (keylen != sizeof(struct protaeskeytoken)) goto out; t = (struct protaeskeytoken *)key; - rc = pkey_pckmo_verify_protkey(t->protkey, t->len, - t->keytype); + rc = pckmo_verify_protkey(t->protkey, t->len, t->keytype); if (rc) goto out; memcpy(protkey, t->protkey, t->len); @@ -123,8 +179,8 @@ int pkey_pckmo_key2protkey(const u8 *key, u32 keylen, __func__, t->len); goto out; } - rc = pkey_pckmo_clr2protkey(t->keytype, t->clearkey, - protkey, protkeylen, protkeytype); + rc = pckmo_clr2protkey(t->keytype, t->clearkey, t->len, + protkey, protkeylen, protkeytype); break; } default: @@ -143,8 +199,8 @@ out: * Currently only the generation of AES protected keys * is supported. */ -int pkey_pckmo_gen_protkey(u32 keytype, u8 *protkey, - u32 *protkeylen, u32 *protkeytype) +static int pckmo_gen_protkey(u32 keytype, u8 *protkey, + u32 *protkeylen, u32 *protkeytype) { u8 clrkey[32]; int keysize; @@ -161,8 +217,8 @@ int pkey_pckmo_gen_protkey(u32 keytype, u8 *protkey, get_random_bytes(clrkey, keysize); /* convert it to a dummy protected key */ - rc = pkey_pckmo_clr2protkey(keytype, clrkey, - protkey, protkeylen, protkeytype); + rc = pckmo_clr2protkey(keytype, clrkey, keysize, + protkey, protkeylen, protkeytype); if (rc) goto out; @@ -177,8 +233,8 @@ out: /* * Create a protected key from a clear key value via PCKMO instruction. */ -int pkey_pckmo_clr2protkey(u32 keytype, const u8 *clrkey, - u8 *protkey, u32 *protkeylen, u32 *protkeytype) +static int pckmo_clr2protkey(u32 keytype, const u8 *clrkey, u32 clrkeylen, + u8 *protkey, u32 *protkeylen, u32 *protkeytype) { /* mask of available pckmo subfunctions */ static cpacf_mask_t pckmo_functions; @@ -243,6 +299,11 @@ int pkey_pckmo_clr2protkey(u32 keytype, const u8 *clrkey, goto out; } + if (clrkeylen && clrkeylen < keysize) { + PKEY_DBF_ERR("%s clear key size too small: %u < %d\n", + __func__, clrkeylen, keysize); + goto out; + } if (*protkeylen < keysize + AES_WK_VP_SIZE) { PKEY_DBF_ERR("%s prot key buffer size too small: %u < %d\n", __func__, *protkeylen, keysize + AES_WK_VP_SIZE); @@ -288,8 +349,8 @@ out: * Verify a protected key blob. * Currently only AES protected keys are supported. */ -int pkey_pckmo_verify_protkey(const u8 *protkey, u32 protkeylen, - u32 protkeytype) +static int pckmo_verify_protkey(const u8 *protkey, u32 protkeylen, + u32 protkeytype) { struct { u8 iv[AES_BLOCK_SIZE]; diff --git a/drivers/s390/crypto/pkey_sysfs.c b/drivers/s390/crypto/pkey_sysfs.c index 727293fbf331..684f87d6e9f1 100644 --- a/drivers/s390/crypto/pkey_sysfs.c +++ b/drivers/s390/crypto/pkey_sysfs.c @@ -42,9 +42,10 @@ static ssize_t pkey_protkey_aes_attr_read(u32 keytype, bool is_xts, char *buf, protkeytoken.keytype = keytype; protkey.len = sizeof(protkey.protkey); - rc = pkey_pckmo_gen_protkey(protkeytoken.keytype, - protkey.protkey, &protkey.len, - &protkey.type); + rc = pkey_pckmo_gen_key(0, 0, + protkeytoken.keytype, 0, 0, 0, + protkey.protkey, &protkey.len, + &protkey.type); if (rc) return rc; @@ -56,9 +57,10 @@ static ssize_t pkey_protkey_aes_attr_read(u32 keytype, bool is_xts, char *buf, if (is_xts) { /* xts needs a second protected key, reuse protkey struct */ protkey.len = sizeof(protkey.protkey); - rc = pkey_pckmo_gen_protkey(protkeytoken.keytype, - protkey.protkey, &protkey.len, - &protkey.type); + rc = pkey_pckmo_gen_key(0, 0, + protkeytoken.keytype, 0, 0, 0, + protkey.protkey, &protkey.len, + &protkey.type); if (rc) return rc; @@ -154,6 +156,7 @@ static ssize_t pkey_ccadata_aes_attr_read(u32 keytype, bool is_xts, char *buf, loff_t off, size_t count) { struct pkey_seckey *seckey = (struct pkey_seckey *)buf; + u32 buflen; int rc; if (off != 0 || count < sizeof(struct secaeskeytoken)) @@ -162,13 +165,19 @@ static ssize_t pkey_ccadata_aes_attr_read(u32 keytype, bool is_xts, char *buf, if (count < 2 * sizeof(struct secaeskeytoken)) return -EINVAL; - rc = cca_genseckey(-1, -1, keytype, seckey->seckey); + buflen = sizeof(seckey->seckey); + rc = pkey_cca_gen_key(-1, -1, keytype, + PKEY_TYPE_CCA_DATA, 0, 0, + seckey->seckey, &buflen, NULL); if (rc) return rc; if (is_xts) { seckey++; - rc = cca_genseckey(-1, -1, keytype, seckey->seckey); + buflen = sizeof(seckey->seckey); + rc = pkey_cca_gen_key(-1, -1, keytype, + PKEY_TYPE_CCA_DATA, 0, 0, + seckey->seckey, &buflen, NULL); if (rc) return rc; @@ -261,8 +270,9 @@ static ssize_t pkey_ccacipher_aes_attr_read(enum pkey_key_size keybits, size_t count) { u32 keysize = CCACIPHERTOKENSIZE; - u32 nr_apqns, *apqns = NULL; + struct pkey_apqn *apqns = NULL; int i, rc, card, dom; + size_t nr_apqns; if (off != 0 || count < CCACIPHERTOKENSIZE) return -EINVAL; @@ -270,33 +280,51 @@ static ssize_t pkey_ccacipher_aes_attr_read(enum pkey_key_size keybits, if (count < 2 * CCACIPHERTOKENSIZE) return -EINVAL; + nr_apqns = MAXAPQNSINLIST; + apqns = kmalloc_array(nr_apqns, sizeof(struct pkey_apqn), GFP_KERNEL); + if (!apqns) + return -ENOMEM; + /* build a list of apqns able to generate an cipher key */ - rc = cca_findcard2(&apqns, &nr_apqns, 0xFFFF, 0xFFFF, - ZCRYPT_CEX6, 0, 0, 0, 0); - if (rc) + rc = pkey_cca_apqns4type(PKEY_TYPE_CCA_CIPHER, + NULL, NULL, 0, + apqns, &nr_apqns); + if (rc) { + kfree(apqns); return rc; + } memset(buf, 0, is_xts ? 2 * keysize : keysize); /* simple try all apqns from the list */ - for (i = 0, rc = -ENODEV; i < nr_apqns; i++) { - card = apqns[i] >> 16; - dom = apqns[i] & 0xFFFF; - rc = cca_gencipherkey(card, dom, keybits, 0, buf, &keysize); - if (rc == 0) - break; + for (i = 0, rc = -ENODEV; rc && i < nr_apqns; i++) { + card = apqns[i].card; + dom = apqns[i].domain; + rc = pkey_cca_gen_key(card, dom, + pkey_aes_bitsize_to_keytype(keybits), + PKEY_TYPE_CCA_CIPHER, keybits, 0, + buf, &keysize, NULL); } - if (rc) + if (rc) { + kfree(apqns); return rc; + } if (is_xts) { keysize = CCACIPHERTOKENSIZE; buf += CCACIPHERTOKENSIZE; - rc = cca_gencipherkey(card, dom, keybits, 0, buf, &keysize); - if (rc == 0) - return 2 * CCACIPHERTOKENSIZE; + rc = pkey_cca_gen_key(card, dom, + pkey_aes_bitsize_to_keytype(keybits), + PKEY_TYPE_CCA_CIPHER, keybits, 0, + buf, &keysize, NULL); + kfree(apqns); + if (rc) + return rc; + return 2 * CCACIPHERTOKENSIZE; } + kfree(apqns); + return CCACIPHERTOKENSIZE; } @@ -384,8 +412,9 @@ static ssize_t pkey_ep11_aes_attr_read(enum pkey_key_size keybits, size_t count) { u32 keysize = MAXEP11AESKEYBLOBSIZE; - u32 nr_apqns, *apqns = NULL; + struct pkey_apqn *apqns = NULL; int i, rc, card, dom; + size_t nr_apqns; if (off != 0 || count < MAXEP11AESKEYBLOBSIZE) return -EINVAL; @@ -393,37 +422,51 @@ static ssize_t pkey_ep11_aes_attr_read(enum pkey_key_size keybits, if (count < 2 * MAXEP11AESKEYBLOBSIZE) return -EINVAL; - /* build a list of apqns able to generate an cipher key */ - rc = ep11_findcard2(&apqns, &nr_apqns, 0xFFFF, 0xFFFF, - ZCRYPT_CEX7, - ap_is_se_guest() ? EP11_API_V6 : EP11_API_V4, - NULL); - if (rc) + nr_apqns = MAXAPQNSINLIST; + apqns = kmalloc_array(nr_apqns, sizeof(struct pkey_apqn), GFP_KERNEL); + if (!apqns) + return -ENOMEM; + + /* build a list of apqns able to generate an EP11 AES key */ + rc = pkey_ep11_apqns4type(PKEY_TYPE_EP11_AES, + NULL, NULL, 0, + apqns, &nr_apqns); + if (rc) { + kfree(apqns); return rc; + } memset(buf, 0, is_xts ? 2 * keysize : keysize); /* simple try all apqns from the list */ - for (i = 0, rc = -ENODEV; i < nr_apqns; i++) { - card = apqns[i] >> 16; - dom = apqns[i] & 0xFFFF; - rc = ep11_genaeskey(card, dom, keybits, 0, buf, &keysize, - PKEY_TYPE_EP11_AES); - if (rc == 0) - break; + for (i = 0, rc = -ENODEV; rc && i < nr_apqns; i++) { + card = apqns[i].card; + dom = apqns[i].domain; + rc = pkey_ep11_gen_key(card, dom, + pkey_aes_bitsize_to_keytype(keybits), + PKEY_TYPE_EP11_AES, keybits, 0, + buf, &keysize, NULL); } - if (rc) + if (rc) { + kfree(apqns); return rc; + } if (is_xts) { keysize = MAXEP11AESKEYBLOBSIZE; buf += MAXEP11AESKEYBLOBSIZE; - rc = ep11_genaeskey(card, dom, keybits, 0, buf, &keysize, - PKEY_TYPE_EP11_AES); - if (rc == 0) - return 2 * MAXEP11AESKEYBLOBSIZE; + rc = pkey_ep11_gen_key(card, dom, + pkey_aes_bitsize_to_keytype(keybits), + PKEY_TYPE_EP11_AES, keybits, 0, + buf, &keysize, NULL); + kfree(apqns); + if (rc) + return rc; + return 2 * MAXEP11AESKEYBLOBSIZE; } + kfree(apqns); + return MAXEP11AESKEYBLOBSIZE; } |