diff --git a/zkey/cca.c b/zkey/cca.c index cb4502ed..e0120d55 100644 --- a/zkey/cca.c +++ b/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, diff --git a/zkey/cca.h b/zkey/cca.h index daebb2ab..6919aba8 100644 --- a/zkey/cca.h +++ b/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;