mirror of
https://github.com/ibm-s390-linux/s390-tools.git
synced 2026-08-05 02:14:52 +00:00
zkey: Separate and rework CCA host library loading
As preparation for future changes, rework the loading of the CCA host library so that the exported symbols are not passed individually to the functions that use it. Pass a structure that contains all entry points of all loaded CCA functions instead. This will make it easier to add further CCA functions at a later time. Also add a version query for the CCA host library since some future functions might be dependent on the library version. While at it, separate the CCA related functions and definitions, and move them into a separate source file (cca.h/cca.h). Signed-off-by: Ingo Franzki <ifranzki@linux.ibm.com> Reviewed-by: Harald Freudenberger <freude@linux.ibm.com> Signed-off-by: Jan Höppner <hoeppner@linux.ibm.com>
This commit is contained in:
committed by
Jan Höppner
parent
21de913a5e
commit
95c7258ea7
142
zkey/pkey.c
142
zkey/pkey.c
@@ -44,57 +44,7 @@
|
||||
|
||||
#define MAX_CIPHER_LEN 32
|
||||
|
||||
/*
|
||||
* Definitions for the CCA library
|
||||
*/
|
||||
#define CCA_LIBRARY_NAME "libcsulcca.so"
|
||||
#define CCA_WEB_PAGE "http://www.ibm.com/security/cryptocards"
|
||||
|
||||
#define DEFAULT_KEYBITS 256
|
||||
|
||||
/**
|
||||
* Loads the CCA library and provides the entry point of the CSNBKTC function.
|
||||
*
|
||||
* @param[out] lib_csulcca on return this contains the address of the CCA
|
||||
* library. dlclose() should be used to free this
|
||||
* when no longer needed.
|
||||
* @param[out] dll_CSNBKTC on return this contains the address of the
|
||||
* CSNBKTC function.
|
||||
* @param verbose if true, verbose messages are printed
|
||||
*
|
||||
* @returns 0 on success, -ELIBACC in case of library load errors
|
||||
*/
|
||||
int load_cca_library(void **lib_csulcca, t_CSNBKTC *dll_CSNBKTC, bool verbose)
|
||||
{
|
||||
util_assert(lib_csulcca != NULL, "Internal error: lib_csulcca is NULL");
|
||||
util_assert(dll_CSNBKTC != NULL, "Internal error: dll_CSNBKTC is NULL");
|
||||
|
||||
/* Load the CCA library */
|
||||
*lib_csulcca = dlopen(CCA_LIBRARY_NAME, RTLD_GLOBAL | RTLD_NOW);
|
||||
if (*lib_csulcca == NULL) {
|
||||
pr_verbose(verbose, "%s", dlerror());
|
||||
warnx("The command requires the IBM CCA Host Libraries and "
|
||||
"Tools.\nFor the supported environments and downloads, "
|
||||
"see:\n%s", CCA_WEB_PAGE);
|
||||
return -ELIBACC;
|
||||
}
|
||||
|
||||
/* Get the Key Token Change function */
|
||||
*dll_CSNBKTC = (t_CSNBKTC)dlsym(*lib_csulcca, "CSNBKTC");
|
||||
if (*dll_CSNBKTC == NULL) {
|
||||
pr_verbose(verbose, "%s", dlerror());
|
||||
warnx("The command requires the IBM CCA Host Libraries and "
|
||||
"Tools.\nFor the supported environments and downloads, "
|
||||
"see:\n%s", CCA_WEB_PAGE);
|
||||
dlclose(*lib_csulcca);
|
||||
*lib_csulcca = NULL;
|
||||
return -ELIBACC;
|
||||
}
|
||||
|
||||
pr_verbose(verbose, "CCA library '%s' has been loaded successfully",
|
||||
CCA_LIBRARY_NAME);
|
||||
return 0;
|
||||
}
|
||||
#define DEFAULT_KEYBITS 256
|
||||
|
||||
/**
|
||||
* Opens the pkey device and returns its file descriptor.
|
||||
@@ -522,96 +472,6 @@ out:
|
||||
return rc;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prints CCA return and reason code information for certain known CCA
|
||||
* error situations.
|
||||
*
|
||||
* @param return_code the CCA return code
|
||||
* @param reason_code the CCA reason code
|
||||
*/
|
||||
static void print_CCA_error(int return_code, int reason_code)
|
||||
{
|
||||
switch (return_code) {
|
||||
case 8:
|
||||
switch (reason_code) {
|
||||
case 48:
|
||||
warnx("The secure key has a CCA master key "
|
||||
"verification pattern that is not valid");
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 12:
|
||||
switch (reason_code) {
|
||||
case 764:
|
||||
warnx("The CCA master key is not loaded and "
|
||||
"therefore a secure key cannot be enciphered");
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Re-enciphers a secure key.
|
||||
*
|
||||
* @param[in] dll_CSNBKTC the address of the CCA CSNBKTC function
|
||||
* @param[in] secure_key a buffer containing the secure key
|
||||
* @param[in] secure_key_size the size of the secure key
|
||||
* @param[in] method the re-enciphering method. METHOD_OLD_TO_CURRENT
|
||||
* or METHOD_CURRENT_TO_NEW.
|
||||
* @param[in] verbose if true, verbose messages are printed
|
||||
*
|
||||
* @returns 0 on success, -EIO in case of an error
|
||||
*/
|
||||
int key_token_change(t_CSNBKTC dll_CSNBKTC,
|
||||
u8 *secure_key, unsigned int secure_key_size,
|
||||
char *method, bool verbose)
|
||||
{
|
||||
long exit_data_len = 0, rule_array_count;
|
||||
unsigned char rule_array[2 * 80] = { 0, };
|
||||
unsigned char exit_data[4] = { 0, };
|
||||
long return_code, reason_code;
|
||||
|
||||
util_assert(dll_CSNBKTC != NULL, "Internal error: dll_CSNBKTC is NULL");
|
||||
util_assert(secure_key != NULL, "Internal error: secure_key is NULL");
|
||||
util_assert(secure_key_size > 0,
|
||||
"Internal error: secure_key_size is 0");
|
||||
util_assert(method != NULL, "Internal error: method is NULL");
|
||||
|
||||
memcpy(rule_array, method, 8);
|
||||
memcpy(rule_array + 8, "AES ", 8);
|
||||
rule_array_count = 2;
|
||||
|
||||
dll_CSNBKTC(&return_code, &reason_code,
|
||||
&exit_data_len, exit_data,
|
||||
&rule_array_count, rule_array,
|
||||
secure_key);
|
||||
|
||||
pr_verbose(verbose, "CSNBKTC (Key Token Change) with '%s' returned: "
|
||||
"return_code: %ld, reason_code: %ld", method, return_code,
|
||||
reason_code);
|
||||
if (return_code != 0) {
|
||||
print_CCA_error(return_code, reason_code);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
if (secure_key_size == 2 * SECURE_KEY_SIZE) {
|
||||
dll_CSNBKTC(&return_code, &reason_code,
|
||||
&exit_data_len, exit_data,
|
||||
&rule_array_count, rule_array,
|
||||
secure_key + SECURE_KEY_SIZE);
|
||||
|
||||
pr_verbose(verbose, "CSNBKTC (Key Token Change) with '%s' "
|
||||
"returned: return_code: %ld, reason_code: %ld",
|
||||
method, return_code, reason_code);
|
||||
if (return_code != 0) {
|
||||
print_CCA_error(return_code, reason_code);
|
||||
return -EIO;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates an XTS secure key (the second part)
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user