switch (keytype) { case PKEY_KEYTYPE_AES_128:
fc = CPACF_PCKMO_ENC_AES_128_KEY; break; case PKEY_KEYTYPE_AES_192:
fc = CPACF_PCKMO_ENC_AES_192_KEY; break; case PKEY_KEYTYPE_AES_256:
fc = CPACF_PCKMO_ENC_AES_256_KEY; break; case PKEY_KEYTYPE_ECC_P256:
pkeytype = PKEY_KEYTYPE_ECC;
fc = CPACF_PCKMO_ENC_ECC_P256_KEY; break; case PKEY_KEYTYPE_ECC_P384:
pkeytype = PKEY_KEYTYPE_ECC;
fc = CPACF_PCKMO_ENC_ECC_P384_KEY; break; case PKEY_KEYTYPE_ECC_P521:
pkeytype = PKEY_KEYTYPE_ECC;
fc = CPACF_PCKMO_ENC_ECC_P521_KEY; break; case PKEY_KEYTYPE_ECC_ED25519:
pkeytype = PKEY_KEYTYPE_ECC;
fc = CPACF_PCKMO_ENC_ECC_ED25519_KEY; break; case PKEY_KEYTYPE_ECC_ED448:
pkeytype = PKEY_KEYTYPE_ECC;
fc = CPACF_PCKMO_ENC_ECC_ED448_KEY; break; case PKEY_KEYTYPE_AES_XTS_128:
fc = CPACF_PCKMO_ENC_AES_XTS_128_DOUBLE_KEY; break; case PKEY_KEYTYPE_AES_XTS_256:
fc = CPACF_PCKMO_ENC_AES_XTS_256_DOUBLE_KEY; break; case PKEY_KEYTYPE_HMAC_512:
fc = CPACF_PCKMO_ENC_HMAC_512_KEY; break; case PKEY_KEYTYPE_HMAC_1024:
fc = CPACF_PCKMO_ENC_HMAC_1024_KEY; break; default:
PKEY_DBF_ERR("%s unknown/unsupported keytype %u\n",
__func__, keytype); goto out;
}
/* Did we already check for PCKMO ? */ if (!pckmo_functions.bytes[0]) { /* no, so check now */ if (!cpacf_query(CPACF_PCKMO, &pckmo_functions)) {
PKEY_DBF_ERR("%s cpacf_query() failed\n", __func__);
rc = -ENODEV; goto out;
}
} /* check for the pckmo subfunction we need now */ if (!cpacf_test_func(&pckmo_functions, fc)) {
PKEY_DBF_ERR("%s pckmo fc 0x%02x not available\n",
__func__, fc);
rc = -ENODEV; goto out;
}
/* compare WK VP from the temp key with that of the given prot key */ if (memcmp(wkvp, protkey + keysize, AES_WK_VP_SIZE)) {
PKEY_DBF_ERR("%s protected key WK VP mismatch\n", __func__);
rc = -EKEYREJECTED; goto out;
}
switch (keytype) { case PKEY_KEYTYPE_AES_128: case PKEY_KEYTYPE_AES_192: case PKEY_KEYTYPE_AES_256: case PKEY_KEYTYPE_AES_XTS_128: case PKEY_KEYTYPE_AES_XTS_256: case PKEY_KEYTYPE_HMAC_512: case PKEY_KEYTYPE_HMAC_1024: break; default:
PKEY_DBF_ERR("%s unsupported keytype %d\n",
__func__, keytype); return -EINVAL;
}
/* generate a dummy random clear key */
get_random_bytes(clrkey, keysize);
/* convert it to a dummy protected key */
rc = pckmo_clr2protkey(keytype, clrkey, keysize,
protkey, protkeylen, protkeytype); if (rc) goto out;
/* replace the key part of the protected key with random bytes */
get_random_bytes(protkey, keysize);
/* * The pckmo instruction should be available - even if we don't * actually invoke it. This instruction comes with MSA 3 which * is also the minimum level for the kmc instructions which * are able to work with protected keys.
*/ if (!cpacf_query(CPACF_PCKMO, &func_mask)) return -ENODEV;
/* register this module as pkey handler for all the pckmo stuff */ return pkey_handler_register(&pckmo_handler);
}
/* * Module exit
*/ staticvoid __exit pkey_pckmo_exit(void)
{ /* unregister this module as pkey handler */
pkey_handler_unregister(&pckmo_handler);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.