summaryrefslogtreecommitdiff
path: root/include/ica_api.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/ica_api.h')
-rw-r--r--include/ica_api.h2960
1 files changed, 2960 insertions, 0 deletions
diff --git a/include/ica_api.h b/include/ica_api.h
new file mode 100644
index 0000000..5f6c62c
--- /dev/null
+++ b/include/ica_api.h
@@ -0,0 +1,2960 @@
+/* This program is released under the Common Public License V1.0
+ *
+ * You should have received a copy of Common Public License V1.0 along with
+ * with this program.
+ */
+
+/*
+ * Authors(s): Ralph Wuerthner <rwuerthn@de.ibm.com>
+ * Holger Dengler <hd@linux.vnet.ibm.com>
+ * Ingo Tuchscherer <ingo.tuchscherer@linux.vnet.ibm.com>
+ *
+ * Copyright IBM Corp. 2001, 2005, 2009, 2010, 2011, 2013
+ */
+
+#ifndef __ICA_API_H__
+#define __ICA_API_H__
+
+/***************************************************************************
+*** ***
+*** LICENSED MATERIALS - PROPERTY OF IBM ***
+*** ***
+*** All Rights Reserved ***
+*** ***
+*** U.S. Government Users Restricted Rights - Use, ***
+*** duplication or disclosure restricted by GSA ADP ***
+*** Schedule Contract with IBM Corp. ***
+*** ***
+*** ***
+*** ORIGINS: IBM Charlotte, Department VM9A ***
+*** ***
+***************************************************************************/
+
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdint.h>
+
+#define ICA_EXPORT __attribute__((__visibility__("default")))
+#define ICA_DEPRECATED __attribute__((deprecated))
+
+#define ica_adapter_handle_t int
+typedef ica_adapter_handle_t ICA_ADAPTER_HANDLE;
+#define DRIVER_NOT_LOADED (-1)
+
+/**
+ * Definitions to determine the direction of the symmetric
+ * encryption/decryption functions.
+ */
+#define ICA_ENCRYPT 1
+#define ICA_DECRYPT 0
+
+/**
+ * Symetric encryption/decryption modes
+ */
+#define MODE_ECB 1
+#define MODE_CBC 2
+#define MODE_CFB 3
+#define MODE_OFB 4
+#define MODE_CTR 5
+#define MODE_XTS 6
+#define MODE_GCM 7
+#define MODE_CBCCS 8
+#define MODE_CCM 9
+
+/**
+ * CBC Ciphertext Stealing variants
+ */
+#define ICA_CBCCS_VARIANT1 1
+#define ICA_CBCCS_VARIANT2 2
+#define ICA_CBCCS_VARIANT3 3
+
+#define ICA_FLAG_SHW 4 /* static hardware support (symmetric ops - CPACF) */
+#define ICA_FLAG_DHW 2 /* dynamic hardware support (asymmetric ops - CEX) */
+#define ICA_FLAG_SW 1 /* software implementation (fallback / backup) */
+
+#define SHA1 1
+#define SHA224 2
+#define SHA256 3
+#define SHA384 4
+#define SHA512 5
+#define G_HASH 10
+#define DES_ECB 20
+#define DES_CBC 21
+#define DES_CBC_CS 22
+#define DES_OFB 23
+#define DES_CFB 24
+#define DES_CTR 25
+#define DES_CTRLST 26
+#define DES_CBC_MAC 27
+#define DES_CMAC 28
+#define DES3_ECB 41
+#define DES3_CBC 42
+#define DES3_CBC_CS 43
+#define DES3_OFB 44
+#define DES3_CFB 45
+#define DES3_CTR 46
+#define DES3_CTRLST 47
+#define DES3_CBC_MAC 48
+#define DES3_CMAC 49
+#define AES_ECB 60
+#define AES_CBC 61
+#define AES_CBC_CS 62
+#define AES_OFB 63
+#define AES_CFB 64
+#define AES_CTR 65
+#define AES_CTRLST 66
+#define AES_CBC_MAC 67
+#define AES_CMAC 68
+#define AES_CCM 69
+#define AES_GCM 70
+#define AES_XTS 71
+#define P_RNG 80
+#define RSA_ME 90
+#define RSA_CRT 91
+#define RSA_KEY_GEN_ME 92
+#define RSA_KEY_GEN_CRT 93
+#define SHA512_DRNG 94
+
+/*
+ * Key length for DES/3DES encryption/decryption
+ */
+#define DES_KEY_LENGTH (56/8)
+#define DES3_KEY_LENGTH (168/8)
+
+/**
+ * Key length for AES encryption/decryption
+ */
+#define AES_KEY_LEN128 (128/8)
+#define AES_KEY_LEN192 (192/8)
+#define AES_KEY_LEN256 (256/8)
+
+/**
+ * SHA Message parts
+ */
+#define SHA_MSG_PART_ONLY 0
+#define SHA_MSG_PART_FIRST 1
+#define SHA_MSG_PART_MIDDLE 2
+#define SHA_MSG_PART_FINAL 3
+
+/**
+ * SHA hash lengths
+ */
+#define SHA_HASH_LENGTH 20
+#define SHA1_HASH_LENGTH SHA_HASH_LENGTH
+#define SHA224_HASH_LENGTH 28
+#define SHA256_HASH_LENGTH 32
+#define SHA384_HASH_LENGTH 48
+#define SHA512_HASH_LENGTH 64
+
+/*
+ * ica_drbg
+ */
+#define ICA_DRBG_NEW_STATE_HANDLE NULL
+#define ICA_DRBG_HEALTH_TEST_FAIL (-1)
+#define ICA_DRBG_ENTROPY_SOURCE_FAIL (-2)
+
+/*
+ * The following status flags are used to examine the return value of the
+ * status output interface ica_fips_status().
+ */
+
+/*
+ * 'FIPS mode active'-flag
+ */
+#define ICA_FIPS_MODE 1
+
+/*
+ * 'Powerup test failed'-flags
+ */
+/* Cryptographic algorithm test (KAT or pair-wise consistency test) */
+#define ICA_FIPS_CRYPTOALG 2
+/* Software/Firmware integrity test (not implemented yet) */
+#define ICA_FIPS_INTEGRITY 4
+/* Critical functions test (N/A) */
+#define ICA_FIPS_CRITICALFUNC 8
+
+/*
+ * 'Conditional test failed'-flags
+ */
+/* Pair-wise consistency test for public & private keys (N/A) */
+#define ICA_FIPS_CONSISTENCY 16
+/* Software/Firmware load test (N/A) */
+#define ICA_FIPS_LOAD 32
+/* Manual key entry test (N/A) */
+#define ICA_FIPS_KEYENTRY 64
+/* Continuous random number generator test */
+#define ICA_FIPS_RNG 128
+/* Bypass test (N/A) */
+#define ICA_FIPS_BYPASS 256
+
+/**
+ * Context for SHA1 operations
+ */
+typedef struct {
+ uint64_t runningLength;
+ unsigned char shaHash[SHA_HASH_LENGTH];
+} sha_context_t;
+
+/**
+ * Context for SHA256 and SHA224 operations
+ */
+typedef struct {
+ uint64_t runningLength;
+ unsigned char sha256Hash[SHA256_HASH_LENGTH];
+} sha256_context_t;
+
+/**
+ * Context for SHA512 and SHA384 operations
+ */
+typedef struct {
+ uint64_t runningLengthHigh;
+ uint64_t runningLengthLow;
+ unsigned char sha512Hash[SHA512_HASH_LENGTH];
+} sha512_context_t;
+
+typedef enum {
+ DEA_ENCRYPT,
+ DEA_DECRYPT,
+ TDEA_192_ENCRYPT,
+ TDEA_192_DECRYPT,
+ AES_128_ENCRYPT,
+ AES_128_DECRYPT,
+ AES_192_ENCRYPT,
+ AES_192_DECRYPT,
+ AES_256_ENCRYPT,
+ AES_256_DECRYPT,
+/* XTS belongs to the KM family */
+ AES_128_XTS_ENCRYPT,
+ AES_128_XTS_DECRYPT,
+ AES_256_XTS_ENCRYPT,
+ AES_256_XTS_DECRYPT,
+/* PRNG only for KMC */
+ PRNG,
+} kmc_functions_t;
+
+typedef struct {
+ unsigned int key_length;
+ unsigned char* modulus;
+ unsigned char* exponent;
+} ica_rsa_key_mod_expo_t;
+
+typedef struct {
+ unsigned int key_length;
+ unsigned char* p;
+ unsigned char* q;
+ unsigned char* dp;
+ unsigned char* dq;
+ unsigned char* qInverse;
+} ica_rsa_key_crt_t;
+
+/**
+ * DES and AES defines and typedefs
+ */
+typedef unsigned char ica_des_vector_t[8];
+typedef unsigned char ica_des_key_single_t[8];
+typedef struct {
+ ica_des_key_single_t key1;
+ ica_des_key_single_t key2;
+ ica_des_key_single_t key3;
+} ica_des_key_triple_t;
+
+typedef unsigned char ica_key_t[8];
+
+/**
+ * AES defines and typedefs
+ */
+typedef unsigned char ica_aes_vector_t[16];
+typedef unsigned char ica_aes_key_single_t[8];
+typedef unsigned char ica_aes_key_len_128_t[16];
+typedef unsigned char ica_aes_key_len_192_t[24];
+typedef unsigned char ica_aes_key_len_256_t[32];
+
+/**
+ * Libica version information
+ */
+typedef struct {
+ unsigned int major_version;
+ unsigned int minor_version;
+ unsigned int fixpack_version;
+} libica_version_info;
+
+/**
+ * Definition of a mechanism type
+ **/
+typedef unsigned int libica_mechanism_type;
+
+/**
+ * Information for a particular crypto mechanism supported by libica.
+ * Key sizes are specified in bytes and do not apply to all supported
+ * mechanisms.
+ **/
+typedef struct {
+ unsigned int min_key_size;
+ unsigned int max_key_size;
+ unsigned int flags;
+} libica_mechanism_info;
+
+/**
+ * Definition for a particular crypto mechanism supported by libica.
+ **/
+typedef struct {
+ libica_mechanism_type mech_type;
+ libica_mechanism_info mech_info;
+} libica_mechanism_list_element;
+
+/*
+ * internal specification for a specific crypto mechanism supported by libica
+ **/
+typedef struct {
+ unsigned int mech_mode_id;
+ unsigned int type;
+ unsigned int id;
+ unsigned int flags;
+ unsigned int property;
+} libica_func_list_element_int;
+
+/*
+ * external specification for a specific crypto mechanism supported by libica
+ **/
+typedef struct {
+ unsigned int mech_mode_id;
+ unsigned int flags;
+ unsigned int property;
+} libica_func_list_element;
+
+typedef struct ica_drbg_mech ica_drbg_mech_t;
+typedef struct ica_drbg ica_drbg_t;
+
+/**
+ * Opens the specified adapter
+ * @param adapter_handle Pointer to the file descriptor for the adapter or
+ * to DRIVER_NOT_LOADED if opening the crypto adapter failed.
+ *
+ * @return 0 as long as a valid parameter is given.
+ * EINVAL for invalid parameter.
+ */
+ICA_EXPORT
+unsigned int ica_open_adapter(ica_adapter_handle_t *adapter_handle);
+
+/**
+ * Closes a device handle.
+ * @param adapter_handle Pointer to a previously opened device handle.
+ *
+ * @return 0 if successful.
+ * errno of close() if unsuccessful
+ */
+ICA_EXPORT
+unsigned int ica_close_adapter(ica_adapter_handle_t adapter_handle);
+
+/**
+ * Generate a random number.
+ *
+ * Required HW Support
+ * KMC-PRNG
+ *
+ * @param output_length
+ * Specifies the byte length of the output_data buffer and the desired length
+ * of the random number.
+ * @param output_data
+ * Pointer to the buffer to contain the resulting random number.
+ *
+ * @return 0 if successful.
+ * EINVAL if at least one invalid parameter is given
+ * ENODEV if neither /dev/hwrng nor /dev/urandom are available.
+ * EIO if the operation fails. This should never happen.
+ */
+ICA_EXPORT
+unsigned int ica_random_number_generate(unsigned int output_length,
+ unsigned char *output_data);
+
+/**
+ * Perform secure hash on input data using the SHA-1 algorithm.
+ *
+ * Required HW Support
+ * KIMD-SHA-1, or KLMD-SHA-1
+ *
+ * @param message_part
+ * The message chaining state. Must be one of the following:
+ * SHA_MSG_PART_ONLY - A single hash operation
+ * SHA_MSG_PART_FIRST - The first part
+ * SHA_MSG_PART_MIDDLE - The middle part
+ * SHA_MSG_PART_FINAL - The last part
+ * @param input_length
+ * The byte length of the input data to be SHA-1 hashed and must be greater
+ * than zero.
+ * @param input_data
+ * Pointer to the input data data.
+ * @param sha_context
+ * Pointer to the SHA-1 context structure used to store intermediate values
+ * needed when chaining is used. The contents are ignored for message part
+ * SHA_MSG_PART_ONLY and SHA_MSG_PART_FIRST. This structure must
+ * contain the returned value of the preceding call to ica_sha1 for message
+ * part SHA_MSG_PART_MIDDLE and SHA_MSG_PART_FINAL. For message part
+ * SHA_MSG_PART_FIRST and SHA_MSG_PART_FINAL, the returned value can
+ * be used for a chained call of ica_sha1. Therefore, the application must
+ * not modify the contents of this structure in between chained calls.
+ * @param output_data
+ * Pointer to the buffer to contain the resulting hash data. The resulting
+ * output data will have a length of SHA_HASH_LENGTH. Make sure buffer has
+ * at least this size.
+ *
+ * @return 0 if successful.
+ * EINVAL if at least one invalid parameter is given
+ * EIO if the operation fails. This should never happen.
+ */
+ICA_EXPORT
+unsigned int ica_sha1(unsigned int message_part,
+ unsigned int input_length,
+ unsigned char *input_data,
+ sha_context_t *sha_context,
+ unsigned char *output_data);
+
+/**
+ * Perform secure hash on input data using the SHA-224 algorithm.
+ *
+ * Required HW Support
+ * KIMD-SHA-256, or KLMD-SHA-256
+ *
+ * @param message_part
+ * The message chaining state. Must be one of the following:
+ * SHA_MSG_PART_ONLY - A single hash operation
+ * SHA_MSG_PART_FIRST - The first part
+ * SHA_MSG_PART_MIDDLE - The middle part
+ * SHA_MSG_PART_FINAL - The last part
+ * @param input_length
+ * The byte length of the input data to be SHA-224 hashed and must be greater
+ * than zero.
+ * @param input_data
+ * Pointer to the input data.
+ * @param sha256_context
+ * Pointer to the SHA-256 context structure used to store intermediate values
+ * needed when chaining is used. The contents are ignored for message part
+ * SHA_MSG_PART_ONLY and SHA_MSG_PART_FIRST. This structure must
+ * contain the returned value of the preceding call to ica_sha224 for message
+ * part SHA_MSG_PART_MIDDLE and SHA_MSG_PART_FINAL. For message part
+ * SHA_MSG_PART_FIRST and SHA_MSG_PART_FINAL, the returned value can
+ * be used for a chained call of ica_sha224. Therefore, the application must
+ * not modify the contents of this structure in between chained calls.
+ * Note: Due to the algorithm used by SHA-224, a SHA-256 context must be
+ * used.
+ * @param output_data
+ * Pointer to the buffer to contain the resulting hash data. The resulting
+ * output data will have a length of SHA224_HASH_LENGTH. Make sure buffer has
+ * at least this size.
+ *
+ * @return 0 if successful.
+ * EINVAL if at least one invalid parameter is given
+ * EIO if the operation fails. This should never happen.
+ */
+ICA_EXPORT
+unsigned int ica_sha224(unsigned int message_part,
+ unsigned int input_length,
+ unsigned char *input_data,
+ sha256_context_t *sha256_context,
+ unsigned char *output_data);
+
+/**
+ * Perform secure hash on input data using the SHA-256 algorithm.
+ *
+ * Required HW Support
+ * KIMD-SHA-256, or KLMD-SHA-256
+ *
+ * @param message_part
+ * The message chaining state. Must be one of the following:
+ * SHA_MSG_PART_ONLY - A single hash operation
+ * SHA_MSG_PART_FIRST - The first part
+ * SHA_MSG_PART_MIDDLE - The middle part
+ * SHA_MSG_PART_FINAL - The last part
+ * @param input_length
+ * The byte length of the input data to be SHA-256 hashed and must be greater
+ * than zero.
+ * @param input_data
+ * Pointer to the input data.
+ * @param sha256_context
+ * Pointer to the SHA-256 context structure used to store intermediate values
+ * needed when chaining is used. The contents are ignored for message part
+ * SHA_MSG_PART_ONLY and SHA_MSG_PART_FIRST. This structure must
+ * contain the returned value of the preceding call to ica_sha256 for message part
+ * SHA_MSG_PART_MIDDLE and SHA_MSG_PART_FINAL. For message part
+ * SHA_MSG_PART_FIRST and SHA_MSG_PART_FINAL, the returned value can
+ * be used for a chained call of ica_sha256. Therefore, the application must not
+ * modify the contents of this structure in between chained calls.
+ * @param output_data
+ * Pointer to the buffer to contain the resulting hash data. The resulting output
+ * data will have a length of SHA256_HASH_LENGTH. Make sure that the buffer
+ * has is at least this size.
+ *
+ * @return 0 if successful.
+ * EINVAL if at least one invalid parameter is given
+ * EIO if the operation fails. This should never happen.
+ */
+ICA_EXPORT
+unsigned int ica_sha256(unsigned int message_part,
+ unsigned int input_length,
+ unsigned char *input_data,
+ sha256_context_t *sha256_context,
+ unsigned char *output_data);
+
+/**
+ * Perform secure hash on input data using the SHA-384 algorithm.
+ *
+ * Required HW Support
+ * KIMD-SHA-512, or KLMD-SHA-512
+ *
+ * @param message_part
+ * The message chaining state. Must be one of the following:
+ * SHA_MSG_PART_ONLY - A single hash operation
+ * SHA_MSG_PART_FIRST - The first part
+ * SHA_MSG_PART_MIDDLE - The middle part
+ * SHA_MSG_PART_FINAL - The last part
+ * @param input_length
+ * The byte length of the input data to be SHA-384 hashed and must be greater
+ * than zero.
+ * @param input_data
+ * Pointer to the input data.
+ * @param sha512_context
+ * Pointer to the SHA-512 context structure used to store intermediate values
+ * needed when chaining is used. The contents are ignored for message part
+ * SHA_MSG_PART_ONLY and SHA_MSG_PART_FIRST. This structure must
+ * contain the returned value of the preceding call to ica_sha384 for message
+ * part SHA_MSG_PART_MIDDLE and SHA_MSG_PART_FINAL. For message part
+ * SHA_MSG_PART_FIRST and SHA_MSG_PART_FINAL, the returned value can
+ * be used for a chained call of ica_sha384. Therefore, the application must
+ * not modify the contents of this structure in between chained calls.
+ * Note: Due to the algorithm used by SHA-384, a SHA-512 context must be
+ * used.
+ * @param output_data
+ * Pointer to the buffer to contain the resulting hash data. The resulting
+ * output data will have a length of SHA384_HASH_LENGTH. Make sure buffer has
+ * at least this size.
+ *
+ * @return 0 if successful.
+ * EINVAL if at least one invalid parameter is given
+ * EIO if the operation fails. This should never happen.
+ */
+ICA_EXPORT
+unsigned int ica_sha384(unsigned int message_part,
+ uint64_t input_length,
+ unsigned char *input_data,
+ sha512_context_t *sha512_context,
+ unsigned char *output_data);
+
+/**
+ * Perform secure hash on input data using the SHA-512 algorithm.
+ *
+ * Required HW Support
+ * KIMD-SHA-512, or KLMD-SHA-512
+ *
+ * @param message_part
+ * The message chaining state. Must be one of the following:
+ * SHA_MSG_PART_ONLY - A single hash operation
+ * SHA_MSG_PART_FIRST - The first part
+ * SHA_MSG_PART_MIDDLE - The middle part
+ * SHA_MSG_PART_FINAL - The last part
+ * @param input_length
+ * The byte length of the input data to be SHA-512 hashed and must be greater
+ * than zero.
+ * @param input_data
+ * Pointer to the input data.
+ * @param sha512_context
+ * Pointer to the SHA-512 context structure used to store intermediate values
+ * needed when chaining is used. The contents are ignored for message part
+ * SHA_MSG_PART_ONLY and SHA_MSG_PART_FIRST. This structuremust
+ * contain the returned value of the preceding call to ica_sha512 for message
+ * part SHA_MSG_PART_MIDDLE and SHA_MSG_PART_FINAL. For message part
+ * SHA_MSG_PART_FIRST and SHA_MSG_PART_FINAL, the returned value can
+ * be used for a chained call of ica_sha512. Therefore, the application must
+ * not modify the contents of this structure in between chained calls.
+ * @param output_data
+ * Pointer to the buffer to contain the resulting hash data. The resulting
+ * output data will have a length of SHA512_HASH_LENGTH. Make sure buffer has
+ * at least this size.
+ *
+ * @return 0 if successful.
+ * EINVAL if at least one invalid parameter is given
+ * EIO if the operation fails. This should never happen.
+ */
+ICA_EXPORT
+unsigned int ica_sha512(unsigned int message_part,
+ uint64_t input_length,
+ unsigned char *input_data,
+ sha512_context_t *sha512_context,
+ unsigned char *output_data);
+
+/**
+ * Generate RSA keys in modulus/exponent format.
+ * @param adapter_handle
+ * Pointer to a previously opened device handle.
+ * @param modulus_bit_length
+ * Specifies the bit length of the modulus. This value should comply with
+ * length of the keys.
+ * @param public_key
+ * Pointer to where the generated public key is to be placed. If the exponent
+ * element in the public key is not set, it will be randomly generated. A not
+ * well chosen exponent may result in the program loooping endlessly. Common
+ * public exponents are 3 and 65537.
+ * @param private_key
+ * Pointer to where the generated private key in modulus/exponent format is to
+ * be placed. Length of both private and public key should be set in bytes.
+ * This value should comply with modulus bit length. Make sure that buffers in
+ * the keys fit to this length.
+ *
+ * @return 0 if successful.
+ * EINVAL if at least one invalid parameter is given.
+ * errno of OpenSSL key generation if it should fail.
+ */
+ICA_EXPORT
+unsigned int ica_rsa_key_generate_mod_expo(ica_adapter_handle_t adapter_handle,
+ unsigned int modulus_bit_length,
+ ica_rsa_key_mod_expo_t *public_key,
+ ica_rsa_key_mod_expo_t *private_key);
+
+/**
+ * Generate RSA keys in CRT format.
+ * @param adapter_handle
+ * Pointer to a previously opened device handle.
+ * @param modulus_bit_length
+ * Specifies the bit length of the modulus. This value should comply with
+ * length of the keys.
+ * @param public_key
+ * Pointer to where the generated public key is to be placed. If the exponent
+ * element in the public key is not set, it will be randomly generated. A not
+ * well chosen exponent may result in the program loooping endlessly. Common
+ * public exponents are 3 and 65537.
+ * @param private_key
+ * Pointer to where the generated private key in CRT format is to be placed.
+ * Length of both private and public key should be set in bytes. This value
+ * should comply with modulus bit length. Make sure that buffers in the keys
+ * fit to this length.
+ *
+ * @return 0 if successful.
+ * EINVAL if at least one invalid parameter is given.
+ * errno of OpenSSL key generation if it should fail.
+ */
+ICA_EXPORT
+unsigned int ica_rsa_key_generate_crt(ica_adapter_handle_t adapter_handle,
+ unsigned int modulus_bit_length,
+ ica_rsa_key_mod_expo_t *public_key,
+ ica_rsa_key_crt_t *private_key);
+
+/**
+ * @brief Perform a RSA encryption/decryption operation using a key in
+ * modulus/exponent form.
+ *
+ * Make sure your message is padded before using this function. Otherwise you
+ * will risk security!
+ * @param adapter_handle
+ * Pointer to a previously opened device handle.
+ * @param input_data
+ * Pointer to input data to be encrypted/decrypted and is in big endian format.
+ * Make sure input data is not longer than bit length of the key! Byte length
+ * has to be the same. Thus right justify input data inside the data block.
+ * @param rsa_key
+ * Pointer to the key to be used, in modulus/exponent format.
+ * @param output_data
+ * Pointer to where the output results are to be placed.
+ *
+ * @return 0 if successful.
+ * EINVAL if at least one invalid parameter is given.
+ * ENOMEM if memory allocation fails.
+ * EIO if the operation fails. This should never happen.
+ */
+ICA_EXPORT
+unsigned int ica_rsa_mod_expo(ica_adapter_handle_t adapter_handle,
+ unsigned char *input_data,
+ ica_rsa_key_mod_expo_t *rsa_key,
+ unsigned char *output_data);
+
+/**
+ * @brief Perform a RSA encryption/decryption operation using a key in CRT
+ * form.
+ *
+ * Make sure your message is padded before using this function. Otherwise you
+ * will risk security!
+ * @param adapter_handle
+ * Pointer to a previously opened device handle.
+ * @param input_data
+ * Pointer to input data to be encrypted/decrypted and is in big endian format.
+ * Make sure input data is not longer than bit length of the key! Byte length
+ * has to be the same. Thus right justify input data inside the data block.
+ * @param rsa_key
+ * Pointer to the key to be used, in CRT format.
+ * @param output_data
+ * Pointer to where the output results are to be placed. Buffer has to be as
+ * large as the input_data and length of the modulus specified in rsa_key.
+ *
+ * @return 0 if successful.
+ * EINVAL if at least one invalid parameter is given.
+ * ENOMEM if memory allocation fails.
+ * EIO if the operation fails. This should never happen.
+ */
+ICA_EXPORT
+unsigned int ica_rsa_crt(ica_adapter_handle_t adapter_handle,
+ unsigned char *input_data,
+ ica_rsa_key_crt_t *rsa_key,
+ unsigned char *output_data);
+
+/*
+ * Check if RSA key credentials in CRT format are presented in
+ * privileged form, respectively prime 'p' > prime 'q'.
+ *
+ * In case of 'p' < 'q', key credentials 'p' and 'q' as well as 'dp'
+ * and 'dq' will be swapped and qInverse will be recalculated.
+ *
+ * @return
+ * 0 if all key credentials are in the correct format.
+ * 1 if the key credentials were re-calculated.
+ * ENOMEM if memory allocation fails.
+ */
+ICA_EXPORT
+unsigned int ica_rsa_crt_key_check(ica_rsa_key_crt_t *rsa_key);
+
+/**
+ * @deprecated, use ica_des_ecb() or ica_des_cbc() instead.
+ *
+ * Encrypt data using a single length DES key.
+ * @param mode Specifies the operational mode and must be:
+ * MODE_ECB - Use Electronic Code Book mode
+ * MODE_CBC - Use Cipher Block Chaining mode
+ * @param data_length
+ * Specifies the byte length of the input data. It has to be a multiple of the
+ * cipher block which has a size of 8 byte.
+ * @param input_data
+ * Pointer to the input data data to be encrypted. Must be a multiple of the
+ * cipher to use hw acceleration.
+ * @param iv
+ * Pointer to a valid 8 byte initialization vector when using CBC mode.
+ * @param des_key
+ * Pointer to a single length DES key.
+ * @param output_data
+ * Pointer to the buffer to contain the resulting encrypted data. Must be a
+ * multiple of the cipher block and at least as big as the buffer for
+ * input_data.
+ *
+ * @return 0 if successful.
+ * EINVAL if at least one invalid parameter is given.
+ * EIO if the operation fails. This should never happen.
+ */
+ICA_EXPORT ICA_DEPRECATED
+unsigned int ica_des_encrypt(unsigned int mode,
+ unsigned int data_length,
+ unsigned char *input_data,
+ ica_des_vector_t *iv,
+ ica_des_key_single_t *des_key,
+ unsigned char *output_data);
+
+/**
+ * @deprecated, use ica_des_ecb() or ica_des_cbc() instead.
+ *
+ * Decrypt data using a single length DES key.
+ * @param mode
+ * Specifies the operational mode and must be:
+ * MODE_ECB - Use Electronic Code Book mode
+ * MODE_CBC - Use Cipher Block Chaining mode
+ * @param data_length
+ * Specifies the byte length of the input data. It has to be a multiple of the
+ * cipher block which has a size of 8 byte.
+ * @param input_data
+ * Pointer to the input data data to be decrypted. Must be a multiple of the
+ * cipher to use hw acceleration.
+ * @param iv
+ * Pointer to a valid 8 byte initialization vector when using CBC mode.
+ * @param des_key
+ * Pointer to a single length DES key.
+ * @param output_data
+ * Pointer to the buffer to contain the resulting decrypted data. Must be a
+ * multiple of the cipher block and at least as big as the buffer for
+ * input_data.
+ *
+ * @return 0 if successful.
+ * EINVAL if at least one invalid parameter is given.
+ * EIO if the operation fails. This should never happen.
+ */
+ICA_EXPORT ICA_DEPRECATED
+unsigned int ica_des_decrypt(unsigned int mode,
+ unsigned int data_length,
+ unsigned char *input_data,
+ ica_des_vector_t *iv,
+ ica_des_key_single_t *des_key,
+ unsigned char *output_data);
+
+/**
+ * @deprecated, use ica_3des_ecb() or ica_3des_cbc() instead.
+ *
+ * Encrypt data using a triple length DES key.
+ * @param mode
+ * Specifies the operational mode and must be:
+ * MODE_ECB - Use Electronic Code Book mode
+ * MODE_CBC - Use Cipher Block Chaining mode
+ * @param data_length
+ * Specifies the byte length of the input data. It has to be a multiple of the
+ * cipher block which has a size of 8 byte.
+ * @param input_data
+ * Pointer to the input data data to be encrypted. Must be a multiple of the
+ * cipher block to use hw acceleration.
+ * @param iv
+ * Pointer to a valid 8 byte initialization vector when using CBC mode.
+ * @param des_key
+ * Pointer to a triple length DES key.
+ * @param output_data
+ * Pointer to the buffer to contain the resulting encrypted data. Must be a
+ * multiple of the cipher block and at least as big as the buffer for
+ * input_data.
+ *
+ * @return 0 if successful.
+ * EINVAL if at least one invalid parameter is given.
+ * EIO if the operation fails. This should never happen.
+ */
+ICA_EXPORT ICA_DEPRECATED
+unsigned int ica_3des_encrypt(unsigned int mode,
+ unsigned int data_length,
+ unsigned char *input_data,
+ ica_des_vector_t *iv,
+ ica_des_key_triple_t *des_key,
+ unsigned char *output_data);
+
+/**
+ * @deprecated, use ica_3des_ecb() or ica_3des_cbc() instead.
+ *
+ * Decrypt data using a triple length DES key.
+ * @param mode
+ * Specifies the operational mode and must be:
+ * MODE_ECB - Use Electronic Code Book mode
+ * MODE_CBC - Use Cipher Block Chaining mode
+ * @param data_length
+ * Specifies the byte length of the input data. It has to be a multiple of the
+ * cipher block which has a size of 8 byte.
+ * @param input_data
+ * Pointer to the input data data to be decrypted. Must be a multiple of the
+ * cipher block to use hw acceleration.
+ * @param iv
+ * Pointer to a valid 8 byte initialization vector when using CBC mode.
+ * @param des_key
+ * Pointer to a triple length DES key.
+ * @param output_data
+ * Pointer to the buffer to contain the resulting decrypted data. Must be a
+ * multiple of the cipher block and at least as big as the buffer for
+ * input_data.
+ *
+ * @return 0 if successful.
+ * EINVAL if at least one invalid parameter is given.
+ * EIO if the operation fails. This should never happen.
+ */
+ICA_EXPORT ICA_DEPRECATED
+unsigned int ica_3des_decrypt(unsigned int mode,
+ unsigned int data_length,
+ unsigned char *input_data,
+ ica_des_vector_t *iv,
+ ica_des_key_triple_t *des_key,
+ unsigned char *output_data);
+
+/**
+ * @deprecated, use ica_aes_ecb() or ica_aes_cbc() instead.
+ *
+ * Encrypt data using AES (key_length is 16, 24, or 32)
+ * @param mode
+ * Specifies the operational mode and must be:
+ * MODE_ECB - Use Electronic Code Book mode
+ * MODE_CBC - Use Cipher Block Chaining mode
+ * @param data_length
+ * Specifies the byte length of the input data. Input data length has to be
+ * a multiple of the AES block length, which is 16 bytes.
+ * @param input_data
+ * Pointer to the input data data to be encrypted. Must be a multiple of the
+ * cipher block to use hw acceleration.
+ * @param iv
+ * Pointer to a valid 16 byte initialization vector when using CBC mode.
+ * @param key_length
+ * Length of the AES key being used.
+ * @param aes_key
+ * Pointer to an AES key.
+ * @param output_data
+ * Pointer to the buffer to contain the resulting encrypted data. Must be a
+ * multiple of the cipher block and at least as big as the buffer for
+ * input_data.
+ *
+ * @return 0 if successful.
+ * EINVAL if at least one invalid parameter is given.
+ * EIO if the operation fails. This should never happen.
+ */
+ICA_EXPORT ICA_DEPRECATED
+unsigned int ica_aes_encrypt(unsigned int mode,
+ unsigned int data_length,
+ unsigned char *input_data,
+ ica_aes_vector_t *iv,
+ unsigned int key_length,
+ unsigned char *aes_key,
+ unsigned char *output_data);
+
+/**
+ * @deprecated, use ica_aes_ecb() or ica_aes_cbc() instead.
+ *
+ * Decrypt data using AES (key_length is 16, 24, or 32)
+ * @param mode
+ * Specifies the operational mode and must be:
+ * MODE_ECB - Use Electronic Code Book mode
+ * MODE_CBC - Use Cipher Block Chaining mode
+ * @param data_length
+ * Specifies the byte length of the input data. Input data length has to be
+ * a multiple of the AES block length, which is 16 bytes.
+ * @param input_data
+ * Pointer to the input data to be decrypted. Must be a multiple of the
+ * cipher block to use hw acceleration.
+ * @param iv
+ * Pointer to a valid 16 byte initialization vector when using CBC mode.
+ * @param key_length
+ * Length of the AES key being used.
+ * @param aes_key
+ * Pointer to an AES key.
+ * @param output_data
+ * Pointer to the buffer to contain the resulting decrypted data. Must be a
+ * multiple of the cipher block and at least as big as the buffer for
+ * input_data.
+ *
+ * @return 0 if successful.
+ * EINVAL if at least one invalid parameter is given.
+ * EIO if the operation fails. This should never happen.
+ */
+ICA_EXPORT ICA_DEPRECATED
+unsigned int ica_aes_decrypt(unsigned int mode,
+ unsigned int data_length,
+ unsigned char *input_data,
+ ica_aes_vector_t *iv,
+ unsigned int key_length,
+ unsigned char *aes_key,
+ unsigned char *output_data);
+
+/**
+ * Encrypt or decrypt data with an DES key using Electronic Cook Book (ECB)
+ * mode as described in NIST Special Publication 800-38A Chapter 6.1.
+ *
+ * Required HW Support
+ * KM-DEA-192
+ *
+ * @param in_data
+ * Pointer to a readable buffer, that contains the message to be en/decrypted.
+ * The size of the message in bytes is data_length. The size of this buffer in
+ * bytes must be at least as big as data_length.
+ * @param out_data
+ * Pointer to a writeable buffer, that will contain the resulting en/decrypted
+ * message. The size of this buffer in bytes must be at least as big as
+ * data_length.
+ * @param data_length
+ * Length in bytes of the message to be en/decrypted, which resides at the
+ * beginning of in_data. data_length must be a multiple of the cipher block
+ * size (i.e. a multiple of 8 for DES).
+ * @param key
+ * Pointer to a valid DES key of 8 bytes length.
+ * @param direction
+ * 0 or 1:
+ * 0 Use the decrypt function.
+ * 1 Use the encrypt function.
+ *
+ * @return 0 on success
+ * EINVAL if at least one invalid parameter is given.
+ * EIO if the operation fails.
+ */
+ICA_EXPORT
+unsigned int ica_des_ecb(const unsigned char *in_data, unsigned char *out_data,
+ unsigned long data_length, unsigned char *key,
+ unsigned int direction);
+
+/**
+ * Encrypt or decrypt data with an DES key using Cipher Block Chaining (CBC)
+ * mode as described in NIST Special Publication 800-38A Chapter 6.2.
+ *
+ * Required HW Support
+ * KMC-DEA
+ *
+ * @param in_data
+ * Pointer to a readable buffer, that contains the message to be en/decrypted.
+ * The size of the message in bytes is data_length. The size of this buffer in
+ * bytes must be at least as big as data_length.
+ * @param out_data
+ * Pointer to a writable buffer, that will contain the resulting en/decrypted
+ * message. The size of this buffer in bytes must be at least as big as
+ * data_length.
+ * @param data_length
+ * Length in bytes of the message to be en/decrypted, which resides at the
+ * beginning of in_data. data_length must be a multiple of the cipher block
+ * size (i.e. a multiple of 8 for DES).
+ * @param key
+ * Pointer to a valid DES key of 8 bytes length.
+ * @param iv
+ * Pointer to a valid initialization vector of cipher block size bytes. This
+ * vector will be overwritten during the function. The result value in iv may
+ * be used as initialization vector for a chained ica_des_cbc call with the
+ * same key.
+ * @param direction
+ * 0 or 1:
+ * 0 Use the decrypt function.
+ * 1 Use the encrypt function.
+ *
+ * @return 0 on success
+ * EINVAL if at least one invalid parameter is given.
+ * EIO if the operation fails.
+ */
+ICA_EXPORT
+unsigned int ica_des_cbc(const unsigned char *in_data, unsigned char *out_data,
+ unsigned long data_length, unsigned char *key,
+ unsigned char *iv,
+ unsigned int direction);
+
+/**
+ * Encrypt or decrypt data with an DES key using Cipher Block Chaining with
+ * Ciphertext Stealing (CBC-CS) mode as described in NIST Special Publication
+ * 800-38A Chapter 6.2 and the Addendum to NIST Special Publication 800-38A on
+ * Recommendation for Block Cipher Modes of Operation: Three Variants of
+ * Ciphertext Stealing for CBC Moder:
+ * ica_des_cbc_cs may be used to encrypt or decrypt the last chunk of a
+ * message consisting of multiple chunks where all but the last chunk are
+ * encrypted or decrypted by chained calls to ica_des_cbc and the resulting
+ * iv of the last call to ica_des_cbc is fed into the iv of the ica_des_cbc_cs
+ * call provided the chunk is greater than cipher block size (greater than
+ * 8 bytes for DES).
+ *
+ * Required HW Support
+ * KMC-DEA
+ *
+ * @param in_data
+ * Pointer to a readable buffer, that contains the message to be en/decrypted.
+ * The size of the message in bytes is data_length. The size of this buffer
+ * in bytes must be at least as big as data_length.
+ * @param out_data
+ * Pointer to a writable buffer, that will contain the resulting en/decrypted
+ * message. The size of this buffer in bytes must be at least as big as
+ * data_length.
+ * @param data_length
+ * Length in bytes of the message to be en/decrypted, which resides at the
+ * beginning of in_data. data_length must be greater than or equal to the
+ * cipher block size (i.e. a multiple of 8 bytes for DES).
+ * @param key
+ * Pointer to a valid DES key of 8 bytes length.
+ * @param iv
+ * Pointer to a valid initialization vector of cipher block size bytes.
+ * This vector will be overwritten during the function. For variant equals 1
+ * or variant equals 2 the result value in iv may be used as initialization
+ * vector for a chained ica_des_cbc call with the same key if data_length is
+ * a multiple of the cipher block size.
+ * @param direction
+ * 0 or 1:
+ * 0 Use the decrypt function.
+ * 1 Use the encrypt function.
+ * @param variant
+ * 1 Use variant CBC-CS1 of the Addendum to NIST Special Publication 800-38A
+ * to encrypt or decrypt the message: keep last two blocks in order.
+ * 2 Use variant CBC-CS2 of the Addendum to NIST Special Publication 800-38A
+ * to encrypt or decrypt the message: switch order of the last two blocks
+ * if data_length is not a multiple of the cipher block size (i.e. a
+ * multiple of 8 for DES).
+ * 3 Use variant CBC-CS3 of the Addendum to NIST Special Publication 800-38A
+ * to encrypt or decrypt the message: always switch order of the last two
+ * blocks.
+ *
+ * @return 0 on success
+ * EINVAL if at least one invalid parameter is given.
+ * EPERM if required hardware support is not available.
+ * EIO if the operation fails.
+ */
+ICA_EXPORT
+unsigned int ica_des_cbc_cs(const unsigned char *in_data, unsigned char *out_data,
+ unsigned long data_length, unsigned char *key,
+ unsigned char *iv,
+ unsigned int direction,
+ unsigned int variant);
+
+/**
+ * Encrypt or decrypt data with an DES key using Cipher Feedback (CFB) mode as
+ * described in NIST Special Publication 800-38A Chapter 6.3.
+ *
+ * Required HW Support
+ * KMF-DEA
+ *
+ * @param in_data
+ * Pointer to a readable buffer, that contains the message to be en/decrypted.
+ * The size of the message in bytes is data_length. The size of this buffer in
+ * bytes must be at least as big as data_length.
+ * @param out_data
+ * Pointer to a writable buffer, that will contain the resulting en/decrypted
+ * message. The size of this buffer in bytes must be at least as big as
+ * data_length.
+ * @param data_length
+ * Length in bytes of the message to be en/decrypted, which resides at the
+ * beginning of in_data.
+ * @param key
+ * Pointer to a valid DES key of 8 bytes length.
+ * @param iv
+ * Pointer to a valid initialization vector of cipher block size bytes (8 bytes
+ * for DES). This vector will be overwritten during the function. The result
+ * value in iv may be used as initialization vector for a chained ica_des_cfb
+ * call with the same key if data_length in the preceding call is a multiple of
+ * lcfb.
+ * @param lcfb
+ * Length in bytes of the cipher feedback which is a value greater than or
+ * equal to 1 and less than or equal to the cipher block size (i.e. 8 for DES).
+ * @param direction
+ * 0 or 1:
+ * 0 Use the decrypt function.
+ * 1 Use the encrypt function.
+ *
+ * @return 0 on success
+ * EINVAL if at least one invalid parameter is given.
+ * EPERM if required hardware support is not available.
+ * EIO if the operation fails.
+ */
+ICA_EXPORT
+unsigned int ica_des_cfb(const unsigned char *in_data, unsigned char *out_data,
+ unsigned long data_length, unsigned char *key,
+ unsigned char *iv, unsigned int lcfb,
+ unsigned int direction);
+
+/**
+ * Encrypt or decrypt data with an DES key using Counter (CTR) mode as
+ * described in NIST Special Publication 800-38A Chapter 6.5. With the counter
+ * mode each message block of size cipher block size (i.e. 8 bytes for DES) is
+ * combined with a counter value of the same size during encryption and
+ * decryption. Starting with an initial counter value to be combined with the
+ * first message block subsequent counter values to be combined with subsequent
+ * message blocks will be derived from preceding counter values by an increment
+ * function. The increment function used in ica_des_ctr is s an arithmetic
+ * increment without carry on the U least significant bytes in the counter
+ * where M is a parameter to ica_des_ctr.
+ *
+ * Required HW Support
+ * KMCTR-DEA
+ *
+ * @param in_data
+ * Pointer to a readable buffer, that contains the message to be en/decrypted.
+ * The size of the message in bytes is data_length. The size of this buffer in
+ * bytes must be at least as big as data_length.
+ * @param out_data
+ * Pointer to a writable buffer, that will contain the resulting en/decrypted
+ * message. The size of this buffer in bytes must be at least as big as
+ * data_length.
+ * @param data_length
+ * Length in bytes of the message to be en/decrypted, which resides at the
+ * beginning of in_data.
+ * @param key
+ * Pointer to a valid DES key of 8 bytes length.
+ * @param ctr
+ * Pointer to a readable and writable buffer of size cipher block size bytes.
+ * ctr contains an initialization value for a counter function and it will be
+ * replaced by a new value. That new value can be used as an initialization
+ * value for a counter function in a chained ica_des_ctr call with the same key
+ * if data_length used in the preceding call is a multiple of the cipher block
+ * size.
+ * @param ctr_width
+ * A number U between 1 and cipher block size. The value is used by the counter
+ * increment function which increments a counter value by incrementing without
+ * carry the least significant U bytes of the counter value.
+ * @param direction
+ * 0 or 1:
+ * 0 Use the decrypt function.
+ * 1 Use the encrypt function.
+ *
+ * @return 0 on success
+ * EINVAL if at least one invalid parameter is given.
+ * EPERM if required hardware support is not available.
+ * EIO if the operation fails.
+ */
+ICA_EXPORT
+unsigned int ica_des_ctr(const unsigned char *in_data, unsigned char *out_data,
+ unsigned long data_length,
+ unsigned char *key,
+ unsigned char *ctr, unsigned int ctr_width,
+ unsigned int direction);
+
+/**
+ * Encrypt or decrypt data with an DES key using Counter (CTR) mode as
+ * described in NIST Special Publication 800-38A, Chapter 6.5. With the counter
+ * mode each message block of size cipher block size is combined with a counter
+ * value of the same size during encryption and decryption. The ica_des_ctrlist
+ * function assumes that a list n of precomputed counter values is provided
+ * where n is the smallest integer that is less or equal to the message size
+ * divided by the cipher block size. This function allows to optimally exploit
+ * System z HW support for non-standard counter functions.
+ *
+ * Required HW Support
+ * KMCTR-DEA
+ *
+ * @param in_data
+ * Pointer to a readable buffer, that contains the message to be en/decrypted.
+ * The size of the message in bytes is data_length. The size of this buffer in
+ * bytes must be at least as big as data_length.
+ * @param out_data
+ * Pointer to a writable buffer, that will contain the resulting en/decrypted
+ * message. The size of this buffer in bytes must be at least as big as
+ * data_length.
+ * @param data_length
+ * Length in bytes of the message to be en/decrypted, which resides at the
+ * beginning of in_data. If data_length is a multiple of the cipher block size
+ * then calls of ica_des_ctrlist with the same key can be chained if ctrlist
+ * argument of the chained call contains a list of counters that follows the
+ * counters used in the first call and data_length used in the preceding call
+ * is a multiple of the cipher block size.
+ * @param key
+ * Pointer to a valid DES key of 8 bytes length.
+ * @param ctrlist
+ * Pointer to a readable buffer of that is both of size greater than or equal
+ * to data_length and a multiple of the cipher block size (i.e. 8 bytes for
+ * DES). ctrlist should contain a list of precomputed counter values of size
+ * cipher block size each.
+ * @param direction
+ * 0 or 1:
+ * 0 Use the decrypt function.
+ * 1 Use the encrypt function.
+ *
+ * @return 0 on success
+ * EINVAL if at least one invalid parameter is given.
+ * EPERM if required hardware support is not available.
+ * EIO if the operation fails.
+ */
+ICA_EXPORT
+unsigned int ica_des_ctrlist(const unsigned char *in_data, unsigned char *out_data,
+ unsigned long data_length,
+ unsigned char *key,
+ const unsigned char *ctrlist,
+ unsigned int direction);
+
+/**
+ * Encrypt or decrypt data with an DES key using Output Feedback (OFB) mode as
+ * described in NIST Special Publication 800-38A Chapter 6.4.
+ *
+ * Required HW Support
+ * KMO-DEA
+ *
+ * @param in_data
+ * Pointer to a readable buffer, that contains the message to be en/decrypted.
+ * The size of the message in bytes is data_length. The size of this buffer in
+ * bytes must be at least as big as data_length.
+ * @param out_data
+ * Pointer to a writable buffer, that contains the resulting en/decrypted
+ * message. The size of this buffer in bytes must be at least as big as
+ * data_length.
+ * @param data_length
+ * Length in bytes of the message to be en/decrypted, which resides at the
+ * beginning of in_data.
+ * @param key
+ * Pointer to a valid DES key of 8 bytes length.
+ * @param iv
+ * Pointer to a valid initialization vector of cipher block size bytes (8 bytes
+ * for DES). This vector will be overwritten during the function. If
+ * data_length is a multiple of the cipher block size (i.e. a multiple of 8 for
+ * DES) the result value in iv may be used as initialization vector for a
+ * chained ica_des_ofb call with the same key.
+ * @param direction
+ * 0 or 1:
+ * 0 Use the decrypt function.
+ * 1 Use the encrypt function.
+ *
+ * @return 0 on success
+ * EINVAL if at least one invalid parameter is given.
+ * EPERM if required hardware support is not available.
+ * EIO if the operation fails.
+ */
+ICA_EXPORT
+unsigned int ica_des_ofb(const unsigned char *in_data, unsigned char *out_data,
+ unsigned long data_length, unsigned char *key,
+ unsigned char *iv, unsigned int direction);
+
+/**
+ * Authenticate data or verify the authenticity of data with an DES key using
+ * the Block Cipher Based Message Authetication Code (CMAC) mode as described
+ * in NIST Special Publication 800-38B. ica_des_cmac can be used to
+ * authenticate or verify the authenticity of a complete message.
+ *
+ * Required HW Support
+ * KMAC-DEA
+ * PCC-Compute-Last_block-CMAC-Using-DEA
+ *
+ * @param message
+ * Pointer to a readable buffer of size greater than or equal to message_length
+ * bytes. It contains a message to be authenticated or of which the
+ * authenticity shall be verified.
+ * @param message_length
+ * Length in bytes of the message to be authenticated or verified.
+ * @param mac
+ * Pointer to a buffer of size greater than or equal to mac_length bytes. If
+ * direction is 1 the buffer must be writable and a message authentication code
+ * for the message in message of size mac_length bytes will be written to the
+ * buffer. If direction is 0 the buffer must be readable and contain a message
+ * authentication code that will be verified against the message in message.
+ * @param mac_length
+ * Length in bytes of the message authentication code mac in bytes that is less
+ * than or equal to the cipher block size (i.e. 8 bytes for DES). It is
+ * recommended to use values greater than or equal to 8.
+ * @param key
+ * Pointer to a valid DES key of 8 bytes length.
+ * @param direction
+ * 0 or 1:
+ * 0 Verify message authentication code
+ * 1 Compute message authentication code for the message
+ *
+ * @return 0 on success
+ * EINVAL if at least one invalid parameter is given.
+ * EPERM if required hardware support is not available.
+ * EIO if the operation fails.
+ * EFAULT if direction is 0 and the verification of the message authentication
+ * code fails.
+ */
+ICA_EXPORT
+unsigned int ica_des_cmac(const unsigned char *message, unsigned long message_length,
+ unsigned char *mac, unsigned int mac_length,
+ unsigned char *key,
+ unsigned int direction);
+
+/**
+ * Authenticate data or verify the authenticity of data with an DES key using
+ * the Block Cipher Based Message Authentication Code (CMAC) mode as described
+ * in NIST Special Publication 800-38B.
+ * ica_des_cmc_intermediate and ica_des_cmac_last can be used when the message
+ * to be authenticated or to be verfied using CMAC is supplied in multiple
+ * chunks. ica_des_cmac_intermediate is used to process all but the last
+ * chunk. All message chunks to preprocessed by ica_des_cmac_intermediate
+ * must have a size that is a multiple of the cipher block size (i.e a
+ * multiple of 8 bytes for DES).
+ * Note: ica_des_cmac_intermediate has no direction argument it can be used
+ * during an authentication and during authenticity verification.
+ *
+ * Required HW Support
+ * KMAC-DEA
+ *
+ * @param message
+ * Pointer to a readable buffer of size greater than or equal to
+ * message_length bytes. It contains a non final part of a message which
+ * shall be authenticated or of which the authenticity shall be verified.
+ * @param message_length
+ * Length in bytes of the message part in message. It must be a multiple
+ * of the cipher block size.
+ * @param key
+ * Pointer to a valid DES key of 8 bytes length.
+ * @param iv
+ * Pointer to a valid initialization vector of size cipher block size (i.e.
+ * 8 bytes for DES). For the first message part it must be set to a string
+ * of zeros. For processing the n-th message part it must be the resulting iv
+ * value of the ica_des_cmac_intermediate applied to the (n-1)-th message
+ * part. This vector will be overwritten during the function. The result value
+ * in iv may be used as initialization vector for a chained call to
+ * ica_des_cmac_initermediate or to ica_des_cmac_last with the same key.
+ *
+ * @return 0 on success
+ * EINVAL if at least one invalid parameter is given.
+ * EPERM if required hardware support is not available.
+ * EIO if the operation fails.
+ */
+ICA_EXPORT
+unsigned int ica_des_cmac_intermediate(const unsigned char *message,
+ unsigned long message_length,
+ unsigned char *key,
+ unsigned char *iv);
+
+/**
+ * Authenticate data or verify the authenticity of data with an DES key using
+ * the Block Cipher Based Message Authentication Code (CMAC) mode as described
+ * in NIST Special Publication 800-38B.
+ * ica_des_cmac_last can be used to authenticate or verify the authenticity of
+ * a complete message or of the final part of a message for which all
+ * preceding parts were preprocessed with ica_des_cmac_intermediate.
+ *
+ * Required HW Support
+ * KMAC-DEA,
+ * PCC-Compute-Last_block-CMAC-Using-DEA
+ *
+ * @param message
+ * Pointer to a readable buffer of size greater than or equal to message_length
+ * bytes. It contains a message or the final part of a message to be
+ * authenticated or of which the authenticity shall be verified.
+ * @param message_length
+ * Length in bytes of the message to be authenticated or verified.
+ * @param mac
+ * Pointer to a buffer of size greater than or equal to mac_length bytes.
+ * If direction is 1 the buffer must be writable and a message authentication
+ * code for the message in message of size mac_length bytes will be written to
+ * the buffer.
+ * If direction is 0 the buffer must be readable and contain a message
+ * authentication code that will be verified against the message in message.
+ * @param mac_length
+ * Length in bytes of the message authentication code mac in bytes that is less
+ * than or equal to the cipher block size (i.e. 8 bytes for DES). It is
+ * recommended to use values greater than or equal to 8.
+ * @param key
+ * Pointer to a valid DES key of 8 bytes length.
+ * @param iv
+ * Pointer to a valid initialization vector of size cipher block size. If iv is
+ * NULL message is assumed to be the complete message to be processed.
+ * Otherwise message is the final part of a composite message to be processed
+ * and iv contains the output vector resulting from processing all previous
+ * parts with chained calls to ica_aes_cmac_intermediate, i.e. the value
+ * returned in iv of the ica_des_cmac_intermediate call applied to the
+ * penultimate message part.
+ * @param direction
+ * 0 or 1:
+ * 0 Verify message authentication code
+ * 1 Compute message authentication code for the message
+ *
+ * @return 0 on success
+ * EINVAL if at least one invalid parameter is given.
+ * EPERM if required hardware support is not available.
+ * EIO if the operation fails.
+ * EFAULT if direction is 0 and the verification of the message authentication
+ * code fails.
+ */
+ICA_EXPORT
+unsigned int ica_des_cmac_last(const unsigned char *message, unsigned long message_length,
+ unsigned char *mac, unsigned int mac_length,
+ unsigned char *key,
+ unsigned char *iv,
+ unsigned int direction);
+
+/**
+ * Encrypt or decrypt data with an 3DES key using Electronic Cook Book (ECB)
+ * mode as described in NIST Special Publication 800-38A Chapter 6.1.
+ *
+ * Required HW Support
+ * KM-DEA-192
+ *
+ * @param in_data
+ * Pointer to a readable buffer, that contains the message to be en/decrypted.
+ * The size of the message in bytes is data_length. The size of this buffer in
+ * bytes must be at least as big as data_length.
+ * @param out_data
+ * Pointer to a writeable buffer, that will contain the resulting en/decrypted
+ * message. The size of this buffer in bytes must be at least as big as
+ * data_length.
+ * @param data_length
+ * Length in bytes of the message to be en/decrypted, which resides at the
+ * beginning of in_data. data_length must be a multiple of the cipher block
+ * size (i.e. a multiple of 8 for 3DES).
+ * @param key
+ * Pointer to a valid 3DES key of 24 bytes length.
+ * @param direction
+ * 0 or 1:
+ * 0 Use the decrypt function.
+ * 1 Use the encrypt function.
+ *
+ * @return 0 on success
+ * EINVAL if at least one invalid parameter is given.
+ * EIO if the operation fails.
+ */
+ICA_EXPORT
+unsigned int ica_3des_ecb(const unsigned char *in_data, unsigned char *out_data,
+ unsigned long data_length, unsigned char *key,
+ unsigned int direction);
+
+/**
+ * Encrypt or decrypt data with an 3DES key using Cipher Block Chaining (CBC)
+ * mode as described in NIST Special Publication 800-38A Chapter 6.2.
+ *
+ * Required HW Support
+ * KMC-TDEA-192
+ *
+ * @param in_data
+ * Pointer to a readable buffer, that contains the message to be en/decrypted.
+ * The size of the message in bytes is data_length. The size of this buffer in
+ * bytes must be at least as big as data_length.
+ * @param out_data
+ * Pointer to a writable buffer, that will contain the resulting en/decrypted
+ * message. The size of this buffer in bytes must be at least as big as
+ * data_length.
+ * @param data_length
+ * Length in bytes of the message to be en/decrypted, which resides at the
+ * beginning of in_data. data_length must be a multiple of the cipher block
+ * size (i.e. a multiple of 8 for 3DES).
+ * @param key
+ * Pointer to a valid 3DES key of 24 bytes length.
+ * @param iv
+ * Pointer to a valid initialization vector of cipher block size bytes. This
+ * vector will be overwritten during the function. The result value in iv may
+ * be used as initialization vector for a chained ica_3des_cbc call with the
+ * same key.
+ * @param direction
+ * 0 or 1:
+ * 0 Use the decrypt function.
+ * 1 Use the encrypt function.
+ *
+ * @return 0 on success
+ * EINVAL if at least one invalid parameter is given.
+ * EIO if the operation fails.
+ */
+ICA_EXPORT
+unsigned int ica_3des_cbc(const unsigned char *in_data, unsigned char *out_data,
+ unsigned long data_length, unsigned char *key,
+ unsigned char *iv,
+ unsigned int direction);
+
+/**
+ * Encrypt or decrypt data with an 3DES key using Cipher Block Chaining with
+ * Ciphertext Stealing (CBC-CS) mode as described in NIST Special Publication
+ * 800-38A Chapter 6.2 and the Addendum to NIST Special Publication 800-38A on
+ * "Recommendation for Block Cipher Modes of Operation: Three Variants of
+ * Ciphertext Stealing for CBC Mode":
+ * ica_3des_cbc_cs may be used to encrypt o decrypt the last chunk of a
+ * message consisting of multiple chunks where all but the last chunk are
+ * encrypted or decrypted by chained calls to ica_3des_cbc and the resulting
+ * iv of the last call to ica_3des_cbc is fed into the iv of the
+ * ica_3des_cbc_cs call provided the chunc is greater than cipher block size
+ * (greater than 8 bytes for 3DES).
+ *
+ * Required HW Support
+ * KMC-TDEA-192
+ *
+ * @param in_data
+ * Pointer to a readable buffer, that contains the message to be en/decrypted.
+ * The size of the message in bytes is data_length. The size of this buffer
+ * in bytes must be at least as big as data_length.
+ * @param out_data
+ * Pointer to a writable buffer, that will contain the resulting en/decrypted
+ * message. The size of this buffer in bytes must be at least as big as
+ * data_length.
+ * @param data_length
+ * Length in bytes of the message to be en/decrypted, which resides at the
+ * beginning of in_data. data_length must be greater than or equal to the
+ * cipher block size (i.e. a multiple of 8 bytes for 3DES).
+ * @param key
+ * Pointer to a valid 3DES key of 24 bytes length.
+ * @param iv
+ * Pointer to a valid initialization vector of cipher block size bytes. This
+ * vector will be overwritten during the function. For variant equals 1 or
+ * variant equals 2 the result value in iv may be used as initialization vector
+ * for a chained ica_3des_cbc call with the same key if data_length is a
+ * multiple of the cipher block size.
+ * @param direction
+ * 0 or 1:
+ * 0 Use the decrypt function.
+ * 1 Use the encrypt function.
+ * @param variant
+ * 1 Use variant CBC-CS1 of the Addendum to NIST Special Publication 800-38A
+ * to encrypt or decrypt the message: keep last two blocks in order.
+ * 2 Use variant CBC-CS2 of the Addendum to NIST Special Publication 800-38A
+ * to encrypt or decrypt the message: switch order of the last two blocks
+ * if data_length is not a multiple of the cipher block size (i.e. a
+ * multiple of 8 for DES).
+ * 3 Use variant CBC-CS3 of the Addendum to NIST Special Publication 800-38A
+ * to encrypt or decrypt the message: always switch order of the last two
+ * blocks.
+ *
+ * @return 0 on success
+ * EINVAL if at least one invalid parameter is given.
+ * EPERM if required hardware support is not available.
+ * EIO if the operation fails.
+ */
+ICA_EXPORT
+unsigned int ica_3des_cbc_cs(const unsigned char *in_data, unsigned char *out_data,
+ unsigned long data_length,
+ unsigned char *key,
+ unsigned char *iv,
+ unsigned int direction, unsigned int variant);
+
+/**
+ * Encrypt or decrypt data with an 3DES key using Cipher Feedback (CFB) mode as
+ * described in NIST Special Publication 800-38A Chapter 6.3.
+ *
+ * Required HW Support
+ * KMF-TDEA-192
+ *
+ * @param in_data
+ * Pointer to a readable buffer, that contains the message to be en/decrypted.
+ * The size of the message in bytes is data_length. The size of this buffer in
+ * bytes must be at least as big as data_length.
+ * @param out_data
+ * Pointer to a writable buffer, that will contain the resulting en/decrypted
+ * message. The size of this buffer in bytes must be at least as big as
+ * data_length.
+ * @param data_length
+ * Length in bytes of the message to be en/decrypted, which resides at the
+ * beginning of in_data.
+ * @param key
+ * Pointer to a valid 3DES key of 24 bytes length.
+ * @param iv
+ * Pointer to a valid initialization vector of cipher block size bytes (8 bytes
+ * for 3DES). This vector will be overwritten during the function. The result
+ * value in iv may be used as initialization vector for a chained ica_3des_cfb
+ * call with the same key if data_length in the preceding call is a multiple of
+ * lcfb.
+ * @param lcfb
+ * Length in bytes of the cipher feedback which is a value greater than or
+ * equal to 1 and less than or equal to the cipher block size (i.e. 8 for
+ * 3DES).
+ * @param direction
+ * 0 or 1:
+ * 0 Use the decrypt function.
+ * 1 Use the encrypt function.
+ *
+ * @return 0 on success
+ * EINVAL if at least one invalid parameter is given.
+ * EPERM if required hardware support is not available.
+ * EIO if the operation fails.
+ */
+ICA_EXPORT
+unsigned int ica_3des_cfb(const unsigned char *in_data, unsigned char *out_data,
+ unsigned long data_length, unsigned char *key,
+ unsigned char *iv, unsigned int lcfb,
+ unsigned int direction);
+
+/**
+ * Encrypt or decrypt data with an 3DES key using Counter (CTR) mode as
+ * described in NIST Special Publication 800-38A Chapter 6.5. With the counter
+ * mode each message block of size cipher block size (i.e. 8 bytes for 3DES) is
+ * combined with a counter value of the same size during encryption and
+ * decryption. Starting with an initial counter value to be combined with the
+ * first message block subsequent counter values to be combined with subsequent
+ * message blocks will be derived from preceding counter values by an increment
+ * function. The increment function used in ica_3des_ctr is s an arithmetic
+ * increment without carry on the U least significant bytes in the counter
+ * where M is a parameter to ica_3des_ctr.
+ *
+ * Required HW Support
+ * KMCTR-TDEA-192
+ *
+ * @param in_data
+ * Pointer to a readable buffer, that contains the message to be en/decrypted.
+ * The size of the message in bytes is data_length. The size of this buffer in
+ * bytes must be at least as big as data_length.
+ * @param out_data
+ * Pointer to a writable buffer, that will contain the resulting en/decrypted
+ * message. The size of this buffer in bytes must be at least as big as
+ * data_length.
+ * @param data_length
+ * Length in bytes of the message to be en/decrypted, which resides at the
+ * beginning of in_data.
+ * @param key
+ * Pointer to a valid 3DES key of 24 bytes length.
+ * @param ctr
+ * Pointer to a readable and writable buffer of size cipher block size bytes.
+ * ctr contains an initialization value for a counter function and it will be
+ * replaced by a new value. That new value can be used as an initialization
+ * value for a counter function in a chained ica_3des_ctr call with the same
+ * key if data_length used in the preceding call is a multiple of the cipher
+ * block size.
+ * @param ctr_width
+ * A number U between 1 and cipher block size. The value is used by the counter
+ * increment function which increments a counter value by incrementing without
+ * carry the least significant U bytes of the counter value.
+ * @param direction
+ * 0 or 1:
+ * 0 Use the decrypt function.
+ * 1 Use the encrypt function.
+ *
+ * @return 0 on success
+ * EINVAL if at least one invalid parameter is given.
+ * EPERM if required hardware support is not available.
+ * EIO if the operation fails.
+ */
+ICA_EXPORT
+unsigned int ica_3des_ctr(const unsigned char *in_data, unsigned char *out_data,
+ unsigned long data_length,
+ unsigned char *key,
+ unsigned char *ctr, unsigned int ctr_width,
+ unsigned int direction);
+
+/**
+ * Encrypt or decrypt data with an 3DES key using Counter (CTR) mode as
+ * described in NIST Special Publication 800-38A ,Chapter 6.5. With the counter
+ * mode each message block of size cipher block size is combined with a counter
+ * value of the same size during encryption and decryption. The
+ * ica_3des_ctrlist function assumes that a list n of precomputed counter
+ * values is provided where n is the smallest integer that is less or equal to
+ * the message size divided by the cipher block size. This function allows to
+ * optimally exploit System z HW support for non-standard counter functions.
+ *
+ * Required HW Support
+ * KMCTR-TDEA-192
+ *
+ * @param in_data
+ * Pointer to a readable buffer, that contains the message to be en/decrypted.
+ * The size of the message in bytes is data_length. The size of this buffer in
+ * bytes must be at least as big as data_length.
+ * @param out_data
+ * Pointer to a writable buffer, that will contain the resulting en/decrypted
+ * message. The size of this buffer in bytes must be at least as big as
+ * data_length.
+ * @param data_length
+ * Length in bytes of the message to be en/decrypted, which resides at the
+ * beginning of in_data. If data_length is a multiple of the cipher block size
+ * then calls of ica_3des_ctrlist with the same key can be chained if ctrlist
+ * argument of the chained call contains a list of counters that follows the
+ * counters used in the first call and data_length used in the preceding call
+ * is a multiple of the cipher block size.
+ * @param key
+ * Pointer to an 3DES key of 24 bytes length.
+ * @param ctrlist
+ * Pointer to a readable buffer of that is both of size greater than or equal
+ * to data_length and a multiple of the cipher block size (i.e. 8 bytes for
+ * 3DES). ctrlist should contain a list of precomputed counter values of size
+ * cipher block size each.
+ * @param direction
+ * 0 or 1:
+ * 0 Use the decrypt function.
+ * 1 Use the encrypt function.
+ *
+ * @return 0 on success
+ * EINVAL if at least one invalid parameter is given.
+ * EPERM if required hardware support is not available.
+ * EIO if the operation fails.
+ */
+ICA_EXPORT
+unsigned int ica_3des_ctrlist(const unsigned char *in_data, unsigned char *out_data,
+ unsigned long data_length,
+ unsigned char *key,
+ const unsigned char *ctrlist,
+ unsigned int direction);
+
+/**
+ * Encrypt or decrypt data with an 3DES key using Output Feedback (OFB) mode as
+ * described in NIST Special Publication 800-38A Chapter 6.4.
+ *
+ * Required HW Support
+ * KMO-TDEA-192
+ *
+ * @param in_data
+ * Pointer to a readable buffer, that contains the message to be en/decrypted.
+ * The size of the message in bytes is data_length. The size of this buffer in
+ * bytes must be at least as big as data_length.
+ * @param out_data
+ * Pointer to a writable buffer, that contains the resulting en/decrypted
+ * message. The size of this buffer in bytes must be at least as big as
+ * data_length.
+ * @param data_length
+ * Length in bytes of the message to be en/decrypted, which resides at the
+ * beginning of in_data.
+ * @param key
+ * Pointer to a valid 3DES key of 24 bytes length.
+ * @param iv
+ * Pointer to a valid initialization vector of cipher block size bytes (8 bytes
+ * for DES). This vector will be overwritten during the function. If
+ * data_length is a multiple of the cipher block size (i.e. a multiple of 8 for
+ * 3DES) the result value in iv may be used as initialization vector for a
+ * chained ica_3DES_ofb call with the same key.
+ * @param direction
+ * 0 or 1:
+ * 0 Use the decrypt function.
+ * 1 Use the encrypt function.
+ *
+ * @return 0 on success
+ * EINVAL if at least one invalid parameter is given.
+ * EPERM if required hardware support is not available.
+ * EIO if the operation fails.
+ */
+ICA_EXPORT
+unsigned int ica_3des_ofb(const unsigned char *in_data, unsigned char *out_data,
+ unsigned long data_length, unsigned char *key,
+ unsigned char *iv, unsigned int direction);
+
+/**
+ * Authenticate data or verify the authenticity of data with an 3DES key
+ * using the Block Cipher Based Message Authetication Code (CMAC) mode as
+ * described in NIST Special Publication 800-38B.
+ * ica_3des_cmac can be used to authenticate or verify the authenticity of a
+ * complete message.
+ *
+ * Required HW Support
+ * KMAC-TDEA-192
+ * PCC-Compute-Last_block-CMAC-Using-TDEA-192
+ *
+ * @param message
+ * Pointer to a readable buffer of size greater than or equal to
+ * message_length bytes. It contains a message to be authenticated or of
+ * which the authenticity shall be verified.
+ * @param message_length
+ * Length in bytes of the message to be authenticated or verified.
+ * @param mac
+ * Pointer to a buffer of size greater than or equal to mac_length bytes.
+ * If direction is 1 the buffer must be writable and a message authentication
+ * code for the message in message of size mac_length bytes will be written to
+ * the buffer.
+ * If direction is 0 the buffer must be readable and contain a message
+ * authentication code that will be verified against the message in message.
+ * @param mac_length
+ * Length in bytes of the message authentication code mac in bytes that is less
+ * than or equal to the cipher block size (i.e. 8 bytes for TDES). It is
+ * recommended to use values greater than or equal to 8.
+ * @param key
+ * Pointer to a valid 3DES key of 24 bytes length.
+ * @param direction
+ * 0 or 1:
+ * 0 Verify message authentication code
+ * 1 Compute message authentication code for the message
+ *
+ * @return 0 on success
+ * EINVAL if at least one invalid parameter is given.
+ * EPERM if required hardware support is not available.
+ * EIO if the operation fails.
+ * EFAULT if direction is 0 and the verification of the message authentication
+ * code fails.
+ */
+ICA_EXPORT
+unsigned int ica_3des_cmac(const unsigned char *message, unsigned long message_length,
+ unsigned char *mac, unsigned int mac_length,
+ unsigned char *key,
+ unsigned int direction);
+
+/**
+ * Authenticate data or verify the authenticity of data with an 3DES key using
+ * the Block Cipher Based Message Authentication Code (CMAC) mode as described
+ * in NIST Special Publication 800-38B.
+ * ica_3des_cmc_intermediate and ica_3des_cmac_last can be used when the
+ * message to be authenticated or to be verfied using CMAC is supplied in
+ * multiple chunks. ica_3des_cmac_intermediate is used to process all but the
+ * last chunk. All message chunks to preprocessed by
+ * ica_3des_cmac_intermediate must have a size that is a multiple of the
+ * cipher block size (i.e a multiple of 8 bytes for 3DES).
+ * Note: ica_3des_cmac_intermediate has no direction argument it can be used
+ * during an authentication and during authenticity verification.
+ *
+ * Required HW Support
+ * KMAC-TDEA-192,
+ *
+ * @param message
+ * Pointer to a readable buffer of size greater than or equal to message_length
+ * bytes. It contains a non final part of a message which shall be
+ * authenticated or of which the authenticity shall be verified.
+ * @param message_length
+ * Length in bytes of the message part in message. It must be a multiple of the
+ * cipher block size.
+ * @param key
+ * Pointer to a valid 3DES key of 24 bytes length.
+ * @param iv
+ * Pointer to a valid initialization vector of size cipher block size
+ * (i.e. 8 bytes for 3DES). For the first message part it must be set to a
+ * string of zeros. For processing the n-th message part it must be the
+ * resulting iv value of the ica_3des_cmac_intermediate applied to the
+ * (n-1)-th message part. This vector will be overwritten during the function.
+ * The result value in iv may be used as initialization vector for a chained
+ * call to ica_3des_cmac_initermediate or to ica_3des_cmac_last with the same key.
+ *
+ * @return 0 on success
+ * EINVAL if at least one invalid parameter is given.
+ * EPERM if required hardware support is not available.
+ * EIO if the operation fails.
+ */
+ICA_EXPORT
+unsigned int ica_3des_cmac_intermediate(const unsigned char *message, unsigned long message_length,
+ unsigned char *key,
+ unsigned char *iv);
+
+/**
+ * Authenticate data or verify the authenticity of data with an 3DES key using
+ * the Block Cipher Based Message Authentication Code (CMAC) mode as described
+ * in NIST Special Publication 800-38B.
+ * ica_3des_cmac_last can be used to authenticate or verify the authenticity
+ * of a complete message or of the final part of a message for which all
+ * preceding parts were preprocessed with ica_3des_cmac_intermediate.
+ *
+ * Required HW Support
+ * KMAC-TDEA-192,
+ * PCC-Compute-Last_block-CMAC-Using-TDEA-192
+ *
+ * @param message
+ * Pointer to a readable buffer of size greater than or equal to message_length
+ * bytes. It contains a message or the final part of a message to be
+ * authenticated or of which the authenticity shall be verified.
+ * @param message_length
+ * Length in bytes of the message to be authenticated or verified.
+ * @param mac
+ * Pointer to a buffer of size greater than or equal to mac_length bytes.
+ * If direction is 1 the buffer must be writable and a message authentication
+ * code for the message in message of size mac_length bytes will be written to
+ * the buffer.
+ * If direction is 0 the buffer must be readable and contain a message
+ * authentication code that will be verified against the message in message.
+ * @param mac_length
+ * Length in bytes of the message authentication code mac in bytes that is
+ * less than or equal to the cipher block size (I.e. 8 bytes for DES). It is
+ * recommended to use values greater than or equal to 8.
+ * @param key
+ * Pointer to a valid 3DES key of 24 bytes length.
+ * @param iv
+ * Pointer to a valid initialization vector of size cipher block size. If iv
+ * is NULL message is assumed to be the complete message to be processed.
+ * Otherwise message is the final part of a composite message to be processed
+ * and iv contains the output vector resulting from processing all previous
+ * parts with chained calls to ica_3des_cmac_intermediate, i.e. the value
+ * returned in iv of the ica_3des_cmac_intermediate call applied to the
+ * penultimate message part.
+ * @param direction
+ * 0 or 1:
+ * 0 Verify message authentication code
+ * 1 Compute message authentication code for the message
+ *
+ * @return 0 on success
+ * EINVAL if at least one invalid parameter is given.
+ * EPERM if required hardware support is not available.
+ * EIO if the operation fails.
+ * EFAULT if direction is 0 and the verification of the message authentication
+ * code fails.
+ */
+ICA_EXPORT
+unsigned int ica_3des_cmac_last(const unsigned char *message, unsigned long message_length,
+ unsigned char *mac, unsigned int mac_length,
+ unsigned char *key, unsigned char *iv,
+ unsigned int direction);
+
+/**
+ * Encrypt or decrypt data with an AES key using Electronic Cook Book (ECB)
+ * mode as described in NIST Special Publication 800-38A Chapter 6.1.
+ *
+ * Required HW Support
+ * KM-AES-128, KM-AES-192 or KM-AES-256
+ *
+ * @param in_data
+ * Pointer to a readable buffer, that contains the message to be en/decrypted.
+ * The size of the message in bytes is data_length. The size of this buffer in
+ * bytes must be at least as big as data_length.
+ * @param out_data
+ * Pointer to a writable buffer, that will contain the resulting en/decrypted
+ * message. The size of this buffer in bytes must be at least as big as
+ * data_length.
+ * @param data_length
+ * Length in bytes of the message to be en/decrypted, which resides at the
+ * beginning of in_data. data_length must be a multiple of the cipher block
+ * size (i.e. a multiple of 16 for AES).
+ * @param key
+ * Pointer to a valid AES key.
+ * @param key_length
+ * Length in bytes of the AES key. Supported sizes are 16, 24, and 32 for
+ * AES-128, AES-192 and AES-256 respectively. Therefore, you can use the
+ * macros: AES_KEY_LEN128, AES_KEY_LEN192, and AES_KEY_LEN256.
+ * @param direction
+ * 0 or 1:
+ * 0 Use the decrypt function.
+ * 1 Use the encrypt function.
+ *
+ * @return 0 on success
+ * EINVAL if at least one invalid parameter is given.
+ * EIO if the operation fails.
+ */
+ICA_EXPORT
+unsigned int ica_aes_ecb(const unsigned char *in_data, unsigned char *out_data,
+ unsigned long data_length, unsigned char *key,
+ unsigned int key_length,
+ unsigned int direction);
+
+/**
+ * Encrypt or decrypt data with an AES key using Cipher Block Chaining (CBC)
+ * mode as described in NIST Special Publication 800-38A Chapter 6.2.
+ *
+ * Required HW Support
+ * KMC-AES-128, KMC-AES-192 or KMC-AES-256
+ *
+ * @param in_data
+ * Pointer to a readable buffer, that contains the message to be en/decrypted.
+ * The size of the message in bytes is data_length. The size of this buffer in
+ * bytes must be at least as big as data_length.
+ * @param out_data
+ * Pointer to a writable buffer, that will contain the resulting en/decrypted
+ * message. The size of this buffer in bytes must be at least as big as
+ * data_length.
+ * @param data_length
+ * Length in bytes of the message to be en/decrypted, which resides at the
+ * beginning of in_data. data_length must be a multiple of the cipher block
+ * size (i.e. a multiple of 16 for AES).
+ * @param key
+ * Pointer to a valid AES key.
+ * @param key_length
+ * Length in bytes of the AES key. Supported sizes are 16, 24, and 32 for
+ * AES-128, AES-192 and AES-256 respectively. Therefore, you can use the
+ * macros: AES_KEY_LEN128, AES_KEY_LEN192, and AES_KEY_LEN256.
+ * @param iv
+ * Pointer to a valid initialization vector of size chipher block size. This
+ * vector will be overwritten during the function. The result value in iv may
+ * be used as initialization vector for a chained ica_aes_cbc call with the
+ * same key.
+ * @param direction
+ * 0 or 1:
+ * 0 Use the decrypt function.
+ * 1 Use the encrypt function.
+ *
+ * @return 0 on success
+ * EINVAL if at least one invalid parameter is given.
+ * EIO if the operation fails.
+ */
+ICA_EXPORT
+unsigned int ica_aes_cbc(const unsigned char *in_data, unsigned char *out_data,
+ unsigned long data_length, unsigned char *key,
+ unsigned int key_length, unsigned char *iv,
+ unsigned int direction);
+
+/**
+ * Encrypt or decrypt data with an AES key using Cipher Block Chaining with
+ * Ciphertext Stealing (CBC-CS) mode as described in NIST Special Publication
+ * 800-38A Chapter 6.2 and the Addendum to NIST Special Publication 800-38A on
+ * "Recommendation for Block Cipher Modes of Operation: Three Variants of
+ * Ciphertext Stealing for CBC Mode":
+ * ica_aes_cbc_cs may be used to encrypt or decrypt the last chunk of a
+ * message consisting of multiple chunks where all but the last chunk are
+ * encrypted or decrypted by chained calls to ica_aes_cbc and the resulting
+ * iv of the last call to ica_aes_cbc is fed into the iv of the
+ * ica_aes_cbc_cs call provided the chunk is greater than cipher block size
+ * (greater than 16 bytes for AES).
+ *
+ * Required HW Support
+ * KMC-AES-128, KMC-AES-192 or KMC-AES-256
+ *
+ * @param in_data
+ * Pointer to a readable buffer, that contains the message to be en/decrypted.
+ * The size of the message in bytes is data_length. The size of this buffer
+ * in bytes must be at least as big as data_length.
+ * @param out_data
+ * Pointer to a writable buffer, that will contain the resulting en/decrypted
+ * message. The size of this buffer in bytes must be at least as big as
+ * data_length.
+ * @param data_length
+ * Length in bytes of the message to be en/decrypted, which resides at the
+ * beginning of in_data. data_length must be greater than or equal to the
+ * cipher block size (i.e. a multiple of 16 bytes for AES).
+ * @param key
+ * Pointer to a valid AES key.
+ * @param key_length
+ * Length in bytes of the AES key. Supported sizes are 16, 24, and 32 for
+ * AES-128, AES-192 and AES-256 respectively. Therefore, you can use the
+ * macros:
+ * AES_KEY_LEN128, AES_KEY_LEN192, and AES_KEY_LEN256.
+ * @param iv
+ * Pointer to a valid initialization vector of cipher block size bytes. This
+ * vector will be overwritten during the function. For variant equals 1 or
+ * variant equals 2 the result value in iv may be used as initialization vector
+ * for a chained ica_aes_cbc call with the same key if data_length is a
+ * multiple of the cipher block size.
+ * @param direction
+ * 0 or 1:
+ * 0 Use the decrypt function.
+ * 1 Use the encrypt function.
+ * @param variant
+ * 1 Use variant CBC-CS1 of the Addendum to NIST Special Publication 800-38A
+ * to encrypt or decrypt the message: keep last two blocks in order.
+ * 2 Use variant CBC-CS2 of the Addendum to NIST Special Publication 800-38A
+ * to encrypt or decrypt the message: switch order of the last two blocks
+ * if data_length is not a multiple of the cipher block size (i.e. a
+ * multiple of 8 for DES).
+ * 3 Use variant CBC-CS3 of the Addendum to NIST Special Publication 800-38A
+ * to encrypt or decrypt the message: always switch order of the last two
+ * blocks.
+ *
+ * @return 0 on success
+ * EINVAL if at least one invalid parameter is given.
+ * EPERM if required hardware support is not available.
+ * EIO if the operation fails.
+ */
+ICA_EXPORT
+unsigned int ica_aes_cbc_cs(const unsigned char *in_data, unsigned char *out_data,
+ unsigned long data_length,
+ unsigned char *key, unsigned int key_length,
+ unsigned char *iv,
+ unsigned int direction, unsigned int variant);
+
+/**
+ * Encrypt or decrypt data with an AES key using Cipher Feedback (CFB) mode as
+ * described in NIST Special Publication 800-38A Chapter 6.3.
+ *
+ * Required HW Support
+ * KMF-AES-128, KMF-AES-192 or KMF-AES-256
+ *
+ * @param in_data
+ * Pointer to a readable buffer, that contains the message to be en/decrypted.
+ * The size of the message in bytes is data_length. The size of this buffer in
+ * bytes must be at least as big as data_length.
+ * @param out_data
+ * Pointer to a writable buffer, that will contain the resulting en/decrypted
+ * message. The size of this buffer in bytes must be at least as big as
+ * data_length.
+ * @param data_length
+ * Length in bytes of the message to be en/decrypted, which resides at the
+ * beginning of in_data.
+ * @param key
+ * Pointer to a valid AES key.
+ * @param key_length
+ * Length in bytes of the AES key. Supported sizes are 16, 24, and 32 for
+ * AES-128, AES-192 and AES-256 respectively. Therefore, you can use the
+ * macros: AES_KEY_LEN128, AES_KEY_LEN192, and AES_KEY_LEN256.
+ * @param iv
+ * Pointer to a valid initialization vector of cipher block size bytes (16
+ * bytes for AES). This vector will be overwritten during the function. The
+ * result value in iv may be used as initialization vector for a chained
+ * ica_aes_cfb call with the same key if data_length in the preceding call is a
+ * multiple of lcfb.
+ * @param lcfb
+ * Length in bytes of the cipher feedback which is a value greater than or
+ * equal to 1 and less than or equal to the cipher block size (i.e. 16 for
+ * AES).
+ * @param direction
+ * 0 or 1:
+ * 0 Use the decrypt function.
+ * 1 Use the encrypt function.
+ *
+ * @return 0 on success
+ * EINVAL if at least one invalid parameter is given.
+ * EPERM if required hardware support is not available.
+ * EIO if the operation fails.
+ */
+ICA_EXPORT
+unsigned int ica_aes_cfb(const unsigned char *in_data, unsigned char *out_data,
+ unsigned long data_length, unsigned char *key,
+ unsigned int key_length, unsigned char *iv, unsigned int lcfb,
+ unsigned int direction);
+
+/**
+ * Encrypt or decrypt data with an AES key using Counter (CTR) mode as
+ * described in NIST Special Publication 800-38A Chapter 6.5. With the counter
+ * mode each message block of size cipher block size (i.e. 16 bytes for AES) is
+ * combined with a counter value of the same size during encryption and
+ * decryption. Starting with an initial counter value to be combined with the
+ * first message block subsequent counter values to be combined with subsequent
+ * message blocks will be derived from preceding counter values by an increment
+ * function. The increment function used in ica_aes_ctr is s an arithmetic
+ * increment without carry on the U least significant bytes in the counter
+ * where M is a parameter to ica_aes_ctr.
+ *
+ * Required HW Support
+ * KMCTR-AES-128, KMCTR-AES-192 or KMCTR-AES-256
+ *
+ * @param in_data
+ * Pointer to a readable buffer, that contains the message to be en/decrypted.
+ * The size of the message in bytes is data_length. The size of this buffer in
+ * bytes must be at least as big as data_length.
+ * @param out_data
+ * Pointer to a writable buffer, that will contain the resulting en/decrypted
+ * message. The size of this buffer in bytes must be at least as big as
+ * data_length.
+ * @param data_length
+ * Length in bytes of the message to be en/decrypted, which resides at the
+ * beginning of in_data.
+ * @param key
+ * Pointer to a valid AES key.
+ * @param key_length
+ * Length in bytes of the AES key. Supported sizes are 16, 24, and 32 for
+ * AES-128, AES-192 and AES-256 respectively. Therefore, you can use the
+ * macros: AES_KEY_LEN128, AES_KEY_LEN192, and AES_KEY_LEN256.
+ * @param ctr
+ * Pointer to a readable and writable buffer of size cipher block size bytes.
+ * ctr contains an initialization value for a counter function and it will be
+ * replaced by a new value. That new value can be used as an initialization
+ * value for a counter function in a chained ica_aes_ctr call with the same key
+ * if data_length used in the preceding call is a multiple of the cipher block
+ * size.
+ * @param ctr_width
+ * A number U between 1 and cipher block size. The value is used by the counter
+ * increment function which increments a counter value by incrementing without
+ * carry the least significant U bytes of the counter value.
+ * @param direction
+ * 0 or 1:
+ * 0 Use the decrypt function.
+ * 1 Use the encrypt function.
+ *
+ * @return 0 on success
+ * EINVAL if at least one invalid parameter is given.
+ * EPERM if required hardware support is not available.
+ * EIO if the operation fails.
+ */
+ICA_EXPORT
+unsigned int ica_aes_ctr(const unsigned char *in_data, unsigned char *out_data,
+ unsigned long data_length,
+ unsigned char *key, unsigned int key_length,
+ unsigned char *ctr, unsigned int ctr_width,
+ unsigned int direction);
+
+/**
+ * Encrypt or decrypt data with an AES key using Counter (CTR) mode as
+ * described in NIST Special Publication 800-38A ,Chapter 6.5. With the counter
+ * mode each message block of size cipher block size is combined with a counter
+ * value of the same size during encryption and decryption. The ica_aes_ctrlist
+ * function assumes that a list n of precomputed counter values is provided
+ * where n is the smallest integer that is less or equal to the message size
+ * divided by the cipher block size. This function allows to optimally exploit
+ * System z HW support for non-standard counter functions.
+ *
+ * Required HW Support
+ * KMCTR-AES-128, KMCTR-AES-192 or KMCTR-AES-256
+ *
+ * @param in_data
+ * Pointer to a readable buffer, that contains the message to be en/decrypted.
+ * The size of the message in bytes is data_length. The size of this buffer in
+ * bytes must be at least as big as data_length.
+ * @param out_data
+ * Pointer to a writable buffer, that will contain the resulting en/decrypted
+ * message. The size of this buffer in bytes must be at least as big as
+ * data_length.
+ * @param data_length
+ * Length in bytes of the message to be en/decrypted, which resides at the
+ * beginning of in_data. If data_length is a multiple of the cipher block size
+ * then calls of ica_aes_ctrlist with the same key can be chained if ctrlist
+ * argument of the chained call contains a list of counters that follows the
+ * counters used in the first call and data_length used in the preceding call
+ * is a multiple of the cipher block size.
+ * @param key
+ * Pointer to a valid AES key.
+ * @param key_length
+ * Length in bytes of the AES key. Supported sizes are 16, 24, and 32 for
+ * AES-128, AES-192 and AES-256 respectively. Therefore, you can use the
+ * macros: AES_KEY_LEN128, AES_KEY_LEN192, and AES_KEY_LEN256.
+ * @param ctrlist
+ * Pointer to a readable buffer of that is both of size greater than or equal
+ * to data_length and a multiple of the cipher block size (i.e. 16 bytes for
+ * AES). ctrlist should contain a list of precomputed counter values of size
+ * cipher block size each.
+ * @param direction
+ * 0 or 1:
+ * 0 Use the decrypt function.
+ * 1 Use the encrypt function.
+ *
+ * @return 0 on success
+ * EINVAL if at least one invalid parameter is given.
+ * EPERM if required hardware support is not available.
+ * EIO if the operation fails.
+ */
+ICA_EXPORT
+unsigned int ica_aes_ctrlist(const unsigned char *in_data, unsigned char *out_data,
+ unsigned long data_length,
+ unsigned char *key, unsigned int key_length,
+ const unsigned char *ctrlist,
+ unsigned int direction);
+
+/**
+ * Encrypt or decrypt data with an AES key using Output Feedback (OFB) mode as
+ * described in NIST Special Publication 800-38A Chapter 6.4.
+ *
+ * Required HW Support
+ * KMO-AES-128, KMO-AES-192 or KMO-AES-256
+ *
+ * @param in_data
+ * Pointer to a readable buffer, that contains the message to be en/decrypted.
+ * The size of the message in bytes is data_length. The size of this buffer in
+ * bytes must be at least as big as data_length.
+ * @param out_data
+ * Pointer to a writable buffer, that contains the resulting en/decrypted
+ * message. The size of this buffer in bytes must be at least as big as
+ * data_length.
+ * @param data_length
+ * Length in bytes of the message to be en/decrypted, which resides at the
+ * beginning of in_data.
+ * @param key
+ * Pointer to a valid AES key.
+ * @param key_length
+ * Length in bytes of the AES key. Supported sizes are 16, 24, and 32 for
+ * AES-128, AES-192 and AES-256 respectively. Therefore, you can use the
+ * macros: AES_KEY_LEN128, AES_KEY_LEN192, and AES_KEY_LEN256.
+ * @param iv
+ * Pointer to a valid 16 byte initialization vector. This vector will be
+ * overwritten during the function. If data_length is a multiple of the cipher
+ * block size (i.e. a multiple of 16 for AES) the result value in iv may be
+ * used as initialization vector for a chained ica_aes_ofb call with the same
+ * key.
+ * @param direction
+ * 0 or 1:
+ * 0 Use the decrypt function.
+ * 1 Use the encrypt function.
+ *
+ * @return 0 on success
+ * EINVAL if at least one invalid parameter is given.
+ * EPERM if required hardware support is not available.
+ * EIO if the operation fails.
+ */
+ICA_EXPORT
+unsigned int ica_aes_ofb(const unsigned char *in_data, unsigned char *out_data,
+ unsigned long data_length, unsigned char *key,
+ unsigned int key_length, unsigned char *iv,
+ unsigned int direction);
+
+/**
+ * Authenticate data or verify the authenticity of data with an AES key using
+ * the Block Cipher Based Message Authentication Code (CMAC) mode as described
+ * in NIST Special Publication 800-38B. ica_aes_cmac can be used to
+ * authenticate or verify the authenticity of a complete message.
+ *
+ * Required HW Support
+ * KMAC-AES-128, KMAC-AES-192 or KMAC-AES-256
+ * PCC-Compute-Last_block-CMAC-Using-AES-128,
+ * PCC-Compute-Last_block-CMAC-Using-AES-192 or
+ * PCC-Compute-Last_block-CMAC-Using-AES-256
+ *
+ * @param message
+ * Pointer to a readable buffer of size greater than or equal to message_length
+ * bytes. It contains a message to be authenticated or of which the
+ * authenticity shall be verified.
+ * @param message_length
+ * Length in bytes of the message to be authenticated or verified.
+ * @param mac
+ * Pointer to a buffer of size greater than or equal to mac_length bytes. If
+ * direction is 1 the buffer must be writable and a message authentication code
+ * for the message in message of size mac_length bytes will be written to the
+ * buffer. If direction is 0 the buffer must be readable and contain a message
+ * authentication code that will be verified against the message in message
+ * @param mac_length
+ * Length in bytes of the message authentication code mac in bytes that is less
+ * than or equal to the cipher block size (I.e. 16 bytes for AES). It is
+ * recommended to use values greater than or equal to 8.
+ * @param key
+ * Pointer to a valid AES key.
+ * @param key_length
+ * Length in bytes of the AES key. Supported sizes are 16, 24, and 32 for
+ * AES-128, AES-192 and AES-256 respectively. Therefore, you can use the
+ * macros: AES_KEY_LEN128, AES_KEY_LEN192, and AES_KEY_LEN256.
+ * @param direction
+ * 0 or 1:
+ * 0 Verify message authentication code
+ * 1 Compute message authentication code for the message
+ *
+ * @return 0 on success
+ * EINVAL if at least one invalid parameter is given.
+ * EPERM if required hardware support is not available.
+ * EIO if the operation fails.
+ * EFAULT if direction is 0 and the verification of the message authentication code fails.
+ */
+ICA_EXPORT
+unsigned int ica_aes_cmac(const unsigned char *message, unsigned long message_length,
+ unsigned char *mac, unsigned int mac_length,
+ unsigned char *key, unsigned int key_length,
+ unsigned int direction);
+
+/**
+ * Authenticate data or verify the authenticity of data with an AES key using
+ * the Block Cipher Based Message Authentication Code (CMAC) mode as described
+ * in NIST Special Publication 800-38B.
+ * ica_aes_cmc_intermediate and ica_aes_cmac_last can be used when the message
+ * to be authenticated or to be verfied using CMAC is supplied in multiple
+ * chunks. ica_aes_cmac_intermediate is used to process all but the last
+ * chunk. All message chunks to preprocessed by ica_aes_cmac_intermediate
+ * must have a size that is a multiple of the cipher block size (i.e. a
+ * multiple of 16 bytes for AES).
+ * Note: ica_aes_cmac_intermediate has no direction argument it can be used
+ * during an authentication and during authenticity verification.
+ *
+ * Required HW Support
+ * KMAC-AES-128, KMAC-AES-192 or KMAC-AES-256
+ *
+ * @param message
+ * Pointer to a readable buffer of size greater than or equal to message_length
+ * bytes. It contains a non final part of a message which shall be
+ * authenticated or of which the authenticity shall be verified.
+ * @param message_length
+ * Length in bytes of the message part in message. It must be a multiple of
+ * the cipher block size.
+ * @param key
+ * Pointer to a valid AES key.
+ * @param key_length
+ * Length in bytes of the AES key. Supported sizes are 16, 24, and 32 for
+ * AES-128, AES-192 and AES-256 respectively. Therefore, you can use the
+ * macros: AES_KEY_LEN128, AES_KEY_LEN192, and AES_KEY_LEN256.
+ * @param iv
+ * Pointer to a valid initialization vector of size cipher block size (i.e.
+ * 16 bytes for AES). For the first message part it must be set to a string
+ * of zeros. For processing the n-th message part it must be the resulting iv
+ * value of the ica_aes_cmac_intermediate applied to the (n-1)-th message
+ * part. This vector will be overwritten during the function.
+ * The result value in iv may be used as initialization vector for a chained
+ * call to ica_aes_cmac_initermediate or to ica_aes_cmac_last with the
+ * same key.
+ *
+ * @return 0 on success
+ * EINVAL if at least one invalid parameter is given.
+ * EPERM if required hardware support is not available.
+ * EIO if the operation fails.
+ */
+ICA_EXPORT
+unsigned int ica_aes_cmac_intermediate(const unsigned char *message,
+ unsigned long message_length,
+ unsigned char *key, unsigned int key_length,
+ unsigned char *iv);
+
+/**
+ * Authenticate data or verify the authenticity of data with an AES key using
+ * the Block Cipher Based Message Authentication Code (CMAC) mode as
+ * described in NIST Special Publication 800-38B.
+ * ica_aes_cmac_last can be used to authenticate or verify the authenticity of
+ * a complete message or of the final part of a message for which all
+ * preceding parts were preprocessed with ica_aes_cmac_intermediate.
+ *
+ * Required HW Support
+ * KMAC-AES-128, KMAC-AES-192 or KMAC-AES-256
+ * PCC-Compute-Last_block-CMAC-Using-AES-128,
+ * PCC-Compute-Last_block-CMAC-Using-AES-192 or
+ * PCC-Compute-Last_block-CMAC-Using-AES-256.
+ *
+ * @param message
+ * Pointer to a readable buffer of size greater than or equal to message_length
+ * bytes. It contains a message or the final part of a message to be
+ * authenticated or of which the authenticity shall be verified.
+ * @param message_length
+ * Length in bytes of the message to be authenticated or verified.
+ * @param mac
+ * Pointer to a buffer of size greater than or equal to mac_length bytes.
+ * If direction is 1 the buffer must be writable and a message authentication
+ * code for the message in message of size mac_length bytes will be written to
+ * the buffer.
+ * If direction is 0 the buffer must be readable and contain a message
+ * authentication code that will be verified against the message in message.
+ * @param mac_length
+ * Length in bytes of the message authentication code mac in bytes that is less
+ * than or equal to the cipher block size (I.e. 16 bytes for AES). It is
+ * recommended to use values greater than or equal to 8.
+ * @param key
+ * Pointer to a valid AES key.
+ * @param key_length
+ * Length in bytes of the AES key. Supported sizes are 16, 24, and 32 for
+ * AES-128, AES-192 and AES-256 respectively. Therefore, you can use the
+ * macros: AES_KEY_LEN128, AES_KEY_LEN192, and AES_KEY_LEN256.
+ * @param iv
+ * Pointer to a valid initialization vector of size cipher block size. If iv
+ * is NULL message is assumed to be the complete message to be processed.
+ * Otherwise message is the final part of a composite message to be processed
+ * and iv contains the output vector resulting from processing all previous
+ * parts with chained calls to ica_aes_cmac_intermediate, i.e. the value
+ * returned in iv of the ica_aes_cmac_intermediate call applied to the
+ * penultimate message part.
+ * @param direction
+ * 0 or 1:
+ * 0 Verify message authentication code
+ * 1 Compute message authentication code for the message
+ *
+ * @return 0 on success
+ * EINVAL if at least one invalid parameter is given.
+ * EPERM if required hardware support is not available.
+ * EIO if the operation fails.
+ * EFAULT if direction is 0 and the verification of the message authentication
+ * code fails.
+ */
+ICA_EXPORT
+unsigned int ica_aes_cmac_last(const unsigned char *message, unsigned long message_length,
+ unsigned char *mac, unsigned int mac_length,
+ unsigned char *key, unsigned int key_length,
+ unsigned char *iv,
+ unsigned int direction);
+
+/**
+ * Encrypt or decrypt data with an AES key using the XEX Tweakable Bloc Cipher
+ * with Ciphertext Stealing (XTS) mode as described in NIST Special Publication
+ * 800-38E and IEEE standard 1619-2007.
+ *
+ * Required HW Support
+ * KM-XTS-AES-128 or KM-XTS-AES-256
+ * PCC-Compute-XTS-Parameter-Using-AES-128 or
+ * PCC-Compute-XTS-Parameter-Using-AES-256
+ *
+ * @param in_data
+ * Pointer to a readable buffer, that contains the message to be en/decrypted.
+ * The size of the message in bytes is data_length. The size of this buffer in
+ * bytes must be at least as big as data_length.
+ * @param out_data
+ * Pointer to a writable buffer, that will contain the resulting en/decrypted
+ * message. The size of this buffer in bytes must be at least as big as
+ * data_length.
+ * @param data_length
+ * Length in bytes of the message to be en/decrypted, which resides at the
+ * beginning of in_data. The minimal value of data_length is cipher block size
+ * (i.e. a multiple of 16 for AES).
+ * @param key1
+ * Pointer to a buffer containing a valid AES key. key1 is used for the actual
+ * encryption of the message buffer combined some vector computed from the
+ * tweek value (Key1 in IEEE Std 1619-2007).
+ * @param key2
+ * Pointer to a buffer containing a valid AES key key2 is used to encrypt the
+ * tweak (Key2 in IEEE Std 1619-2007).
+ * @param key_length
+ * The length in bytes of the AES key. For XTS supported AES key sizes are 16
+ * and 32 for AES-128 and AES-256 respectively.
+ * @param tweak
+ * Pointer to a valid 16 byte tweak value (as in IEEE Std 1619-2007). This
+ * tweak will be overwritten during the function. If data_length is a multiple
+ * of the cipher block size the result value in tweak may be used as tweak
+ * value for a chained ica_aes_xts call with the same key pair.
+ * @param direction
+ * 0 or 1:
+ * 0 Use the decrypt function.
+ * 1 Use the encrypt function.
+ *
+ * @return 0 on success
+ * EINVAL if at least one invalid parameter is given.
+ * EPERM if required hardware support is not available.
+ * EIO if the operation fails.
+ */
+ICA_EXPORT
+unsigned int ica_aes_xts(const unsigned char *in_data, unsigned char *out_data,
+ unsigned long data_length,
+ unsigned char *key1, unsigned char *key2,
+ unsigned int key_length, unsigned char *tweak,
+ unsigned int direction);
+
+/**
+ * Encrypt and authenticate or decrypt data and check authenticity of data with
+ * an AES key using Counter with Cipher Block Chaining Message Authentication
+ * Code (CCM) mode as described in NIST Special Publication 800-38C.
+ * Formatting and counter functions are implemented according to
+ * NIST 800-38C Appendix A.
+ *
+ * Required HW Support
+ * KMCTR-AES-128, KMCTR-AES-192 or KMCTR-AES-256
+ * KMAC-AES-128, KMAC-AES-192 or KMAC-AES-256
+ *
+ * @param payload
+ * Pointer to a buffer of size greater than or equal to payload_length bytes.
+ * If direction equals 1 the payload buffer must be readable and contain a
+ * payload message of size payload_length that will be encrypted.
+ * If direction equals 0 the payload buffer must be writable. If the
+ * authentication verification succeeds the decrypted message in the most
+ * significant payload_length bytes of ciphertext_n_mac will be written to
+ * the buffer otherwise the contents of the buffer will be undefined.
+ * @param payload_length
+ * Length in bytes of the message to be en/decrypted, it may be 0 unless
+ * assoc_data_length is 0.
+ * @param ciphertext_n_mac
+ * Pointer to a buffer of size greater than or equal to payload_length plus
+ * mac_length bytes.
+ * If direction equals 1 then the buffer must be writable and the encrypted
+ * message from payload followed by the message authentication code for the
+ * nonce, the payload and associated data will be written to that buffer.
+ * If direction equals 0 then the buffer is readable and contains an encrypted
+ * message of length payload_length followed by a message authentication code
+ * of length mac_length.
+ * @param mac_length
+ * Length in bytes of the message authentication code in bytes.
+ * Valid values are 4, 6, 8, 10, 12, 16.
+ * @param assoc_data
+ * Pointer to a readable buffer of size greater than or equal to
+ * assoc_data_length bytes. The associated data in the most significant
+ * assoc_data_lenght bytes is subject to the authentication code computation
+ * but will not be encrypted.
+ * @param assoc_data_length
+ * Length of the associated data in assoc_data. It may be 0 unless
+ * payload_length is 0.
+ * @param nonce
+ * Pointer to readable buffer of size greater than or equal to nonce_length
+ * bytes that contains a nonce of size nonce_length bytes.
+ * @param nonce_length
+ * Length of the nonce in nonce in bytes. Valid values a greater than 6 and
+ * less than 14.
+ * @param key
+ * Pointer to a valid AES key.
+ * @param key_length
+ * Length in bytes of the AES key. Supported sizes are 16, 24, and 32 for
+ * AES-128, AES-192 and AES-256 respectively. Therefore, you can use the
+ * macros: AES_KEY_LEN128, AES_KEY_LEN192, and AES_KEY_LEN256.
+ * @param direction
+ * 0 or 1:
+ * 0 Verify message authentication code and decrypt encrypted payload.
+ * 1 Encrypt payload and compute message authentication code for the nonce,
+ * the associated data and the payload.
+ *
+ * @return 0 on success
+ * EINVAL if at least one invalid parameter is given.
+ * EPERM if required hardware support is not available.
+ * EIO if the operation fails.
+ * EFAULT if direction is 0 and the verification of the message authentication
+ * code fails.
+ */
+ICA_EXPORT
+unsigned int ica_aes_ccm(unsigned char *payload, unsigned long payload_length,
+ unsigned char *ciphertext_n_mac, unsigned int mac_length,
+ const unsigned char *assoc_data, unsigned long assoc_data_length,
+ const unsigned char *nonce, unsigned int nonce_length,
+ unsigned char *key, unsigned int key_length,
+ unsigned int direction);
+
+/**
+ * This parameter description applies to:
+ * ica_aes_gcm(), ica_aes_gcm_initialize(),
+ * ica_aes_gcm_intermediate() and ica_aes_gcm_last()
+ *
+ * Encrypt and authenticate or decrypt data and check authenticity data with
+ * an AES key using the Galois/Counter (GCM) mode as described in NIST Special
+ * Publication 800-38D.
+ * If no message needs to be encrypted or decrypted and only authentication or
+ * authentication checks are requested then this method implements the GMAC
+ * mode.
+ *
+ * Required HW Support
+ * KM-AES-128, KM-AES-192 or KM-AES-256
+ * KIMD-GHASH
+ * KMCTR-AES-128, KMCTR_AES-192 or KMCTR-AES-256
+ *
+ * @param plaintext
+ * Pointer to a buffer of size greater than or equal to plaintext_length bytes.
+ * If direction equals 1 the plaintext buffer must be readable and contain a
+ * payload message of size plaintext_length that will be encrypted.
+ * If direction equals 0 the plaintext buffer must be writable. If the
+ * authentication verification succeeds the decrypted message in the most
+ * significant plaintext_length bytes of ciphertext will be written to the
+ * buffer otherwise the contents of the buffer will be undefined.
+ * @param plaintext_length
+ * Length in bytes of the message to be en/decrypted. It must be equal or
+ * greater than 0 and less than (2^36)-32.
+ * In case of intermediate operations the length must not be multiple of
+ * blocksize. Padding will be done automatically. Be aware that this is only
+ * useful when this is the last block.
+ * @param ciphertext
+ * Pointer to a buffer of size greater than or equal to plaintext_length
+ * bytes.
+ * If direction equals 1 then the buffer must be writable and the encrypted
+ * message from plaintext will be written to that buffer.
+ * If direction equals 0 then the buffer is readable and contains an encrypted
+ * message of length plaintext_length.
+ * @param iv
+ * Pointer to a readable buffer of size greater than or equal to iv_length
+ * bytes, that contains an initialization vector of size iv_length.
+ * @param iv_length
+ * Length in bytes of the initialization vector in iv. It must be greater
+ * than 0 and less than 2^61. A length of 12 is recommended.
+ * @param aad
+ * Pointer to a readable buffer of size greater than or equal to aad_length
+ * bytes. The additional authenticated data in the most significant aad_length
+ * bytes is subject to the authentication code computation but will not be
+ * encrypted.
+ * @param aad_length
+ * Length in bytes of the additional authenticated data in aad. It must be
+ * equal or greater than 0 and less than 2^61.
+ * In case of ica_aes_gcm_last(), 'aad_length' contains the overall
+ * length of authentication data, cumulated over all intermediate operations.
+ * @param tag
+ * Pointer to a buffer of size greater than or equal to tag_length bytes.
+ * If direction is 1 the buffer must be writable and a message authentication
+ * code for the additional authenticated data in aad and the plain text in
+ * plaintext of size tag_length bytes will be written to the buffer.
+ * If direction is 0 the buffer must be readable and contain a message
+ * authentication code that will be verified against the additional
+ * authenticated data in aad and decrypted cipher text from ciphertext.
+ * In case of intermediate operations, ica_aes_gcm_intermediate() or
+ * ica_aes_gcm_last(), 'tag' contains the temporary hash/tag value.
+ * @param tag_length
+ * Length in bytes of the message authentication code tag in bytes.
+ * Valid values are 4, 8, 12, 13, 14, 15, 16.
+ * @param key
+ * Pointer to a valid AES key.
+ * @param key_length
+ * Length in bytes of the AES key. Supported sizes are 16, 24, and 32 for
+ * AES-128, AES-192 and AES-256 respectively. Therefore, you can use the
+ * macros: AES_KEY_LEN128, AES_KEY_LEN192, and AES_KEY_LEN256.
+ * @param icb
+ * initial counter block - Pointer to a writable buffer that will be created
+ * during ica_aes_gcm_initialize() and will be used in ica_aes_gcm_last() for
+ * the final tag computation.
+ * The length of this counter block is AES_BLOCK_SIZE (16 bytes).
+ * @param ucb
+ * usage counter block - Pointer to a writable buffer that will be created
+ * during ica_aes_gcm_initialize() and will be updated (increased) during the
+ * intermediate update operations.
+ * The length of this counter block is AES_BLOCK_SIZE (16 bytes).
+ * @param subkey
+ * Pointer to a writable buffer, generated in ica_aes_gcm_initialize() and used in
+ * ica_aes_gcm_intermediate() and ica_aes_gcm_last().
+ * The length of this buffer is AES_BLOCK_SIZE (16 bytes).
+ * @param ciph_length
+ * Length in bytes of the overall ciphertext, cumulated over all intermediate
+ * operations.
+ * @param final_tag
+ * Pointer to a readable buffer of size greater than or equal to
+ * final_tag_length bytes. If direction is 1 the buffer is not used.
+ * If direction is 0 this message authentication code (tag) will be verified
+ * with the computed message authentication code computed over the intermediate
+ * update operations.
+ * @param final_tag_length
+ * Length in bytes of the final message authentication code (tag).
+ * @param direction
+ * 0 or 1:
+ * 0 Verify message authentication code and decrypt encrypted payload.
+ * 1 Encrypt payload and compute message authentication code for the additional
+ * authenticated data and the payload.
+ *
+ * @return 0 on success
+ * EINVAL if at least one invalid parameter is given.
+ * EPERM if required hardware support is not available.
+ * EIO if the operation fails.
+ * EFAULT if direction is 0 and the verification of the message authentication
+ * code fails.
+ */
+ICA_EXPORT
+unsigned int ica_aes_gcm(unsigned char *plaintext, unsigned long plaintext_length,
+ unsigned char *ciphertext,
+ const unsigned char *iv, unsigned int iv_length,
+ const unsigned char *aad, unsigned long aad_length,
+ unsigned char *tag, unsigned int tag_length,
+ unsigned char *key, unsigned int key_length,
+ unsigned int direction);
+
+ICA_EXPORT
+unsigned int ica_aes_gcm_initialize(const unsigned char *iv,
+ unsigned int iv_length,
+ unsigned char *key, unsigned int key_length,
+ unsigned char *icb, unsigned char *ucb,
+ unsigned char *subkey, unsigned int direction);
+
+ICA_EXPORT
+unsigned int ica_aes_gcm_intermediate(unsigned char *plaintext,
+ unsigned long plaintext_length, unsigned char *ciphertext,
+ unsigned char *ucb,
+ unsigned char *aad, unsigned long aad_length,
+ unsigned char *tag, unsigned int tag_length,
+ unsigned char *key, unsigned int key_length,
+ unsigned char *subkey, unsigned int direction);
+
+ICA_EXPORT
+unsigned int ica_aes_gcm_last(unsigned char *icb, unsigned long aad_length,
+ unsigned long ciph_length, unsigned char *tag,
+ unsigned char *final_tag, unsigned int final_tag_length,
+ unsigned char *key, unsigned int key_length,
+ unsigned char *subkey, unsigned int direction);
+
+/**
+ * Return libica version information.
+ * @param version_info
+ * Pointer to a libica_version_info structure. The structure will be
+ * filled with the current libica version information.
+ *
+ * @return 0 if version could be determined successfully
+ * EIO if version could not be determined
+ * EINVAL if parameter version_info is NULL
+ */
+ICA_EXPORT
+unsigned int ica_get_version(libica_version_info *version_info);
+
+ICA_EXPORT
+int s390_initialize_functionlist(void);
+
+ICA_EXPORT
+int s390_get_functionlist(libica_func_list_element *pmech_list,
+ unsigned int *pmech_list_len);
+
+/**
+ * Function that returns a list of crypto mechanisms supported by libica.
+ * @param pmech_list
+ * Pointer to an array of libica_func_list_element
+ * If NULL, the API will return the number of elements to allocate
+ * in the @mech_list_len parameter.
+ * If not NULL, libica will assume @mech_list is an array that has
+ * @num elements.
+ * On success, @mech_list will be filled out with the supported libica
+ * crypto mechanisms.
+ * @param pmech_list_len
+ * number of list entries
+ * On input, pointer to the number of elements allocated in the
+ * @mech_list array.
+ * On output, @mech_list_len will contain the number of items copied to
+ * the @mech_list array, or the number of items libica would have returned
+ * in case the @mech_list parameter is set to NULL.
+ * @return
+ * 0 on success
+ * EINVAL if at least one invalid parameter is given
+ *
+ * A typical usage scenario would be that an exploiter makes a first call to
+ * ica_get_functionlist() with @mech_list set to NULL in order to determine
+ * the number of elements to allocate. This is followed by a second call to
+ * ica_get_functionlist() with a valid pointer @list to an array of
+ * libica_func_list_element structures with @mech_list_len elements.
+ */
+ICA_EXPORT
+unsigned int ica_get_functionlist(libica_func_list_element *pmech_list,
+ unsigned int *pmech_list_len);
+
+static inline unsigned int des_directed_fc(int direction)
+{
+ if (direction)
+ return DEA_ENCRYPT;
+ return DEA_DECRYPT;
+}
+
+static inline unsigned int tdes_directed_fc(int direction)
+{
+ if (direction)
+ return TDEA_192_ENCRYPT;
+ return TDEA_192_DECRYPT;
+}
+
+static inline unsigned int aes_directed_fc(unsigned int key_length, int direction)
+{
+ switch (key_length) {
+ case AES_KEY_LEN128:
+ return (direction == ICA_DECRYPT) ?
+ AES_128_DECRYPT : AES_128_ENCRYPT;
+ case AES_KEY_LEN192:
+ return (direction == ICA_DECRYPT) ?
+ AES_192_DECRYPT : AES_192_ENCRYPT;
+ case AES_KEY_LEN256:
+ return (direction == ICA_DECRYPT) ?
+ AES_256_DECRYPT : AES_256_ENCRYPT;
+ }
+ return 0;
+}
+
+/*
+ * ica_drbg: libica's Deterministic Random Bit Generator
+ * (conforming to NIST SP 800-90A)
+ *
+ * Table of currently supported DRBG mechanisms:
+ *
+ * DRBG mechanism supported security max. byte length
+ * strengths (bits) of pers / add
+ * -------------------------------------------------------------
+ * DRBG_SHA512 112, 128, 196, 256 256 / 256
+ *
+ * An ica_drbg_t object holds the internal state of a DRBG instantiation. A
+ * DRBG instantiation is identified by an associated ica_drbg_t * pointer
+ * (state handle).
+ * State handles that do not identify any DRBG instantiation SHALL be NULL
+ * (invalid). Therefore a new state handle SHALL be initialized to NULL.
+ *
+ * If a catastrophic error (<0) is detected, all existing DRBG instantiations
+ * of the corresponding mechanism are in error state making uninstantiation
+ * their only permitted operation. Creation of new DRBG instantiations of
+ * this mechanism are not permitted.
+ */
+ICA_EXPORT
+extern ica_drbg_mech_t *const ICA_DRBG_SHA512;
+
+
+/*
+ * Instantiate function
+ * (create a new DRBG instantiation)
+ *
+ * @sh: State Handle pointer. The (invalid) state handle is set to identify the
+ * new DRBG instantiation and thus becomes valid.
+ * @sec: requested instantiation SECurity strength (bits). The new DRBG
+ * instantiation's security strength is set to the lowest security strength
+ * supported by it's DRBG mechanism (see table) that is greater than or equal
+ * to @sec.
+ * @pr: Prediction Resistance flag. Indicates whether or not prediction
+ * resistance may be required by the consuming application during one or more
+ * requests for pseudorandom bytes.
+ * @mech: MECHanism. The new DRBG instantiation is of this mechanism type.
+ * @pers: PERSonalization string. An optional input that provides
+ * personalization information. The personalisation string SHALL be unique for
+ * all instantiations of the same mechanism type. NULL indicates that no
+ * personalization string is used (not recommended).
+ * @pers_len: Byte length of @pers.
+ *
+ * @return:
+ * 0 Success.
+ * ENOMEM Out of memory.
+ * EINVAL At least one argument is invalid.
+ * ENOTSUP Prediction resistance or the requested security
+ * strength is not supported.
+ * EPERM Failed to obtain a valid timestamp from clock.
+ * ICA_DRBG_HEALTH_TEST_FAIL Health test failed.
+ * ICA_DRBG_ENTROPY_SOURCE_FAIL Entropy source failed.
+ */
+ICA_EXPORT
+int ica_drbg_instantiate(ica_drbg_t **sh,
+ int sec,
+ bool pr,
+ ica_drbg_mech_t *mech,
+ const unsigned char *pers,
+ size_t pers_len);
+
+/*
+ * Reseed function
+ * (reseed a DRBG instantiation)
+ *
+ * @sh: State Handle. Identifies the DRBG instantiation to be reseeded.
+ * @pr: Prediciton Resistance request. Indicates whether or not prediction
+ * resistance is required.
+ * @add: ADDitional input: An optional input. NULL indicates that no additional
+ * input is used.
+ * @add_len: Byte length of @add.
+ *
+ * @return:
+ * 0 Success.
+ * ENOMEM Out of memory.
+ * EINVAL At least one argument is invalid.
+ * ENOTSUP Prediction resistance is not supported.
+ * ICA_DRBG_HEALTH_TEST_FAIL Health test failed.
+ * ICA_DRBG_ENTROPY_SOURCE_FAIL Entropy source failed.
+ */
+ICA_EXPORT
+int ica_drbg_reseed(ica_drbg_t *sh,
+ bool pr,
+ const unsigned char *add,
+ size_t add_len);
+/*
+ * Generate function
+ * (request pseudorandom bytes from a DRBG instantiation)
+ *
+ * @sh: State Handle. Identifies the DRBG instantiation from which pseudorandom
+ * bytes are requested.
+ * @sec: requested SECurity strength: Minimum bits of security that the
+ * generated pseudorandom bytes SHALL offer.
+ * @pr: Prediciton Resistance request. Indicates whether or not prediction
+ * resistance is required.
+ * @add: ADDitional input. An optional input. NULL indicates that no additional input
+ * is used.
+ * @add_len: Byte length of @add.
+ * @prnd: PseudoRaNDom bytes.
+ * @prnd_len: Byte length of @prnd. Requested number of pseudorandom bytes.
+ *
+ * @return:
+ * 0 Success.
+ * ENOMEM Out of memory.
+ * EINVAL At least one argument is invalid.
+ * ENOTSUP Prediction resistance or the requested security
+ * strength is not supported.
+ * EPERM Reseed required.
+ * ICA_DRBG_HEALTH_TEST_FAIL Health test failed.
+ * ICA_DRBG_ENTROPY_SOURCE_FAIL Entropy source failed.
+ */
+ICA_EXPORT
+int ica_drbg_generate(ica_drbg_t *sh,
+ int sec,
+ bool pr,
+ const unsigned char *add,
+ size_t add_len,
+ unsigned char *prnd,
+ size_t prnd_len);
+
+/*
+ * Uninstantiate function
+ * (destroy an existing DRBG instiantiation)
+ *
+ * @sh: State Handle pointer. The corresponding DRBG instantiation is destroyed
+ * and the state handle is set to NULL (invalid).
+ *
+ * @return:
+ * 0 Success.
+ * EINVAL At least one argument is invalid.
+ */
+ICA_EXPORT
+int ica_drbg_uninstantiate(ica_drbg_t **sh);
+
+/*
+ * Health test function
+ * (run health test for a DRBG mechanism function)
+ *
+ * @func: FUNCtion. Pointer indicating which function should be tested. Options
+ * are "ica_drbg_instantiate", "ica_drbg_reseed" and "ica_drbg_generate". The
+ * uninstantiate function is tested whenever other functions are tested.
+ * @sec: SECurity strength. Argument for the call to @func.
+ * @pr: PRediction resistance. Argument for the call to @func.
+ * @mech: MECHanism. The mechanism to be tested.
+ *
+ * @return:
+ * 0 Success.
+ * EINVAL At least one argument is invalid.
+ * ENOTSUP Prediction resistance or security strength is
+ * not supported (when testing instantiate).
+ * ICA_DRBG_HEALTH_TEST_FAIL Health test failed.
+ * ICA_DRBG_ENTROPY_SOURCE_FAIL Entropy source failed.
+ */
+ICA_EXPORT
+int ica_drbg_health_test(void *func,
+ int sec,
+ bool pr,
+ ica_drbg_mech_t *mech);
+
+#ifdef ICA_FIPS
+/*
+ * Additional FIPS interfaces are available for built-in FIPS mode.
+ */
+
+/*
+ * FIPS status output interface.
+ *
+ * @return:
+ * Returns flags indicating the module status. See the ICA_FIPS_* flags.
+ */
+ICA_EXPORT
+int ica_fips_status(void);
+
+/*
+ * FIPS powerups tests.
+ *
+ * The test results can be viewed via the ica_fips_status function.
+ */
+ICA_EXPORT
+void ica_fips_powerup_tests(void);
+#endif /* ICA_FIPS */
+
+#endif /* __ICA_API_H__ */