mirror of
https://github.com/ibm-s390-linux/s390-tools.git
synced 2026-08-05 02:14:52 +00:00
zkey: Fix conversion of CCA DATA keys to CCA CIPHER keys
The CCA Key Translate2 verb needs a pre-built AES CIPHER key token skeleton with XPRTCPAC set in the output buffer, to produce an AES CIPHER key that can be exported to CAPCF. 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
9696b4c9b5
commit
ce8383e5ac
58
zkey/cca.c
58
zkey/cca.c
@@ -162,6 +162,9 @@ int load_cca_library(struct cca_lib *cca, bool verbose)
|
||||
/* Cryptographic Resource Deallocate function */
|
||||
cca->dll_CSUACRD = (t_CSUACRD)dlsym(cca->lib_csulcca, "CSUACRD");
|
||||
|
||||
/* Get the Key Token Build 2 function */
|
||||
cca->dll_CSNBKTB2 = (t_CSNBKTB2)dlsym(cca->lib_csulcca, "CSNBKTB2");
|
||||
|
||||
/* Get the Key Translate 2 function */
|
||||
cca->dll_CSNBKTR2 = (t_CSNBKTR2)dlsym(cca->lib_csulcca, "CSNBKTR2");
|
||||
|
||||
@@ -174,6 +177,7 @@ int load_cca_library(struct cca_lib *cca, bool verbose)
|
||||
cca->dll_CSUACFQ == NULL ||
|
||||
cca->dll_CSUACRA == NULL ||
|
||||
cca->dll_CSUACRD == NULL ||
|
||||
cca->dll_CSNBKTB2 == NULL ||
|
||||
cca->dll_CSNBKTR2 == NULL ||
|
||||
cca->dll_CSNBRKA == NULL) {
|
||||
pr_verbose(verbose, "%s", dlerror());
|
||||
@@ -772,7 +776,7 @@ int convert_aes_data_to_cipher_key(struct cca_lib *cca,
|
||||
long input_token_size, output_token_size, zero = 0;
|
||||
long exit_data_len = 0, rule_array_count = 0;
|
||||
unsigned char *input_token, *output_token;
|
||||
unsigned char rule_array[8 * 2] = { 0, };
|
||||
unsigned char rule_array[8 * 4] = { 0 };
|
||||
unsigned char null_token[64] = { 0, };
|
||||
long null_token_len = sizeof(null_token);
|
||||
unsigned char exit_data[4] = { 0, };
|
||||
@@ -822,10 +826,34 @@ int convert_aes_data_to_cipher_key(struct cca_lib *cca,
|
||||
output_token_size = sizeof(buffer);
|
||||
memset(buffer, 0, sizeof(buffer));
|
||||
|
||||
memcpy(rule_array, "INTERNAL", 8);
|
||||
memcpy(rule_array + 8, "AES ", 8);
|
||||
memcpy(rule_array + 16, "XPRTCPAC", 8);
|
||||
memcpy(rule_array + 24, "CIPHER ", 8);
|
||||
rule_array_count = 4;
|
||||
|
||||
cca->dll_CSNBKTB2(&return_code, &reason_code,
|
||||
&exit_data_len, exit_data,
|
||||
&rule_array_count, rule_array,
|
||||
&zero, NULL, &zero, NULL,
|
||||
&zero, NULL, &zero, NULL,
|
||||
&zero, NULL,
|
||||
&output_token_size, output_token);
|
||||
|
||||
pr_verbose(verbose, "CSNBKTB2 (Key Token Build2) "
|
||||
"returned: return_code: %ld, reason_code: %ld", return_code,
|
||||
reason_code);
|
||||
if (return_code != 0) {
|
||||
print_CCA_error(return_code, reason_code);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
memcpy(rule_array, "AES ", 8);
|
||||
memcpy(rule_array + 8, "REFORMAT", 8);
|
||||
rule_array_count = 2;
|
||||
|
||||
output_token_size = sizeof(buffer);
|
||||
|
||||
cca->dll_CSNBKTR2(&return_code, &reason_code,
|
||||
&exit_data_len, exit_data,
|
||||
&rule_array_count, rule_array,
|
||||
@@ -874,6 +902,34 @@ int convert_aes_data_to_cipher_key(struct cca_lib *cca,
|
||||
output_token_size = sizeof(buffer);
|
||||
memset(buffer, 0, sizeof(buffer));
|
||||
|
||||
memcpy(rule_array, "INTERNAL", 8);
|
||||
memcpy(rule_array + 8, "AES ", 8);
|
||||
memcpy(rule_array + 16, "XPRTCPAC", 8);
|
||||
memcpy(rule_array + 24, "CIPHER ", 8);
|
||||
rule_array_count = 4;
|
||||
|
||||
cca->dll_CSNBKTB2(&return_code, &reason_code,
|
||||
&exit_data_len, exit_data,
|
||||
&rule_array_count, rule_array,
|
||||
&zero, NULL, &zero, NULL,
|
||||
&zero, NULL, &zero, NULL,
|
||||
&zero, NULL,
|
||||
&output_token_size, output_token);
|
||||
|
||||
pr_verbose(verbose, "CSNBKTB2 (Key Token Build2) "
|
||||
"returned: return_code: %ld, reason_code: %ld",
|
||||
return_code, reason_code);
|
||||
if (return_code != 0) {
|
||||
print_CCA_error(return_code, reason_code);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
memcpy(rule_array, "AES ", 8);
|
||||
memcpy(rule_array + 8, "REFORMAT", 8);
|
||||
rule_array_count = 2;
|
||||
|
||||
output_token_size = sizeof(buffer);
|
||||
|
||||
cca->dll_CSNBKTR2(&return_code, &reason_code,
|
||||
&exit_data_len, exit_data,
|
||||
&rule_array_count, rule_array,
|
||||
|
||||
20
zkey/cca.h
20
zkey/cca.h
@@ -68,6 +68,25 @@ typedef void (*t_CSUACRD)(long *return_code,
|
||||
long *ressource_name_length,
|
||||
unsigned char *ressource_name);
|
||||
|
||||
typedef void (*t_CSNBKTB2)(long *return_code,
|
||||
long *reason_code,
|
||||
long *exit_data_length,
|
||||
unsigned char *exit_data,
|
||||
long *rule_array_count,
|
||||
unsigned char *rule_array,
|
||||
long *clear_key_bit_length,
|
||||
unsigned char *clear_key_value,
|
||||
long *key_name_length,
|
||||
unsigned char *key_name,
|
||||
long *user_associated_data_length,
|
||||
unsigned char *user_associated_data,
|
||||
long *token_data_length,
|
||||
unsigned char *token_data,
|
||||
long *verb_data_length,
|
||||
unsigned char *verb_data,
|
||||
long *target_key_token_length,
|
||||
unsigned char *target_key_token);
|
||||
|
||||
typedef void (*t_CSNBKTR2)(long *return_code,
|
||||
long *reason_code,
|
||||
long *exit_data_length,
|
||||
@@ -112,6 +131,7 @@ struct cca_lib {
|
||||
t_CSUACFQ dll_CSUACFQ;
|
||||
t_CSUACRA dll_CSUACRA;
|
||||
t_CSUACRD dll_CSUACRD;
|
||||
t_CSNBKTB2 dll_CSNBKTB2;
|
||||
t_CSNBKTR2 dll_CSNBKTR2;
|
||||
t_CSNBRKA dll_CSNBRKA;
|
||||
struct cca_version version;
|
||||
|
||||
Reference in New Issue
Block a user