| |
| #ifndef __ICA_OPENSSL_API_H__ |
| #define __ICA_OPENSSL_API_H__ |
| |
| /** |
| ** abstract data types for API |
| **/ |
| |
| #define ICA_ADAPTER_HANDLE int |
| |
| #if defined(linux) || defined (_AIX) |
| #define ICA_CALL |
| #endif |
| |
| #if defined(WIN32) || defined(_WIN32) |
| #define ICA_CALL __stdcall |
| #endif |
| |
| /*------------------------------------------------* |
| | RSA defines and typedefs | |
| *------------------------------------------------*/ |
| /* |
| * All data elements of the RSA key are in big-endian format |
| * Modulus-Exponent form of key |
| * |
| */ |
| #define MAX_EXP_SIZE 256 |
| #define MAX_MODULUS_SIZE 256 |
| #define MAX_MODEXP_SIZE (MAX_EXP_SIZE + MAX_MODULUS_SIZE) |
| |
| #define MAX_OPERAND_SIZE MAX_EXP_SIZE |
| |
| typedef unsigned char ICA_KEY_RSA_MODEXPO_REC[MAX_MODEXP_SIZE]; |
| /* |
| * All data elements of the RSA key are in big-endian format |
| * Chinese Remainder Thereom(CRT) form of key |
| * Used only for Decrypt, the encrypt form is typically Modulus-Exponent |
| * |
| */ |
| #define MAX_BP_SIZE 136 |
| #define MAX_BQ_SIZE 128 |
| #define MAX_NP_SIZE 136 |
| #define MAX_NQ_SIZE 128 |
| #define MAX_QINV_SIZE 136 |
| #define MAX_RSACRT_SIZE (MAX_BP_SIZE+MAX_BQ_SIZE+MAX_NP_SIZE+MAX_NQ_SIZE+MAX_QINV_SIZE) |
| |
| #define RSA_GEN_OPERAND_MAX 256 /* bytes */ |
| |
| typedef unsigned char ICA_KEY_RSA_CRT_REC[MAX_RSACRT_SIZE]; |
| /*------------------------------------------------* |
| | RSA key token types | |
| *------------------------------------------------*/ |
| |
| #define RSA_PUBLIC_MODULUS_EXPONENT 3 |
| #define RSA_PKCS_PRIVATE_CHINESE_REMAINDER 6 |
| |
| #define KEYTYPE_MODEXPO 1 |
| #define KEYTYPE_PKCSCRT 2 |
| |
| |
| /*------------------------------------------------* |
| | RSA Key Token format | |
| *------------------------------------------------*/ |
| |
| /*- |
| * NOTE: All the fields in the ICA_KEY_RSA_MODEXPO structure |
| * (lengths, offsets, exponents, modulus, etc.) are |
| * stored in big-endian format |
| */ |
| |
| typedef struct _ICA_KEY_RSA_MODEXPO |
| { unsigned int keyType; /* RSA key type. */ |
| unsigned int keyLength; /* Total length of the token. */ |
| unsigned int modulusBitLength; /* Modulus n bit length. */ |
| /* -- Start of the data length.*/ |
| unsigned int nLength; /* Modulus n = p * q */ |
| unsigned int expLength; /* exponent (public or private)*/ |
| /* e = 1/d * mod(p-1)(q-1) */ |
| /* -- Start of the data offsets*/ |
| unsigned int nOffset; /* Modulus n . */ |
| unsigned int expOffset; /* exponent (public or private)*/ |
| unsigned char reserved[112]; /* reserved area */ |
| /* -- Start of the variable -- */ |
| /* -- length token data. -- */ |
| ICA_KEY_RSA_MODEXPO_REC keyRecord; |
| } ICA_KEY_RSA_MODEXPO; |
| #define SZ_HEADER_MODEXPO (sizeof(ICA_KEY_RSA_MODEXPO) - sizeof(ICA_KEY_RSA_MODEXPO_REC)) |
| |
| /*- |
| * NOTE: All the fields in the ICA_KEY_RSA_CRT structure |
| * (lengths, offsets, exponents, modulus, etc.) are |
| * stored in big-endian format |
| */ |
| |
| typedef struct _ICA_KEY_RSA_CRT |
| { unsigned int keyType; /* RSA key type. */ |
| unsigned int keyLength; /* Total length of the token. */ |
| unsigned int modulusBitLength; /* Modulus n bit length. */ |
| /* -- Start of the data length.*/ |
| #if _AIX |
| unsigned int nLength; /* Modulus n = p * q */ |
| #endif |
| unsigned int pLength; /* Prime number p . */ |
| unsigned int qLength; /* Prime number q . */ |
| unsigned int dpLength; /* dp = d * mod(p-1) . */ |
| unsigned int dqLength; /* dq = d * mod(q-1) . */ |
| unsigned int qInvLength; /* PKCS: qInv = Ap/q */ |
| /* -- Start of the data offsets*/ |
| #if _AIX |
| unsigned int nOffset; /* Modulus n . */ |
| #endif |
| unsigned int pOffset; /* Prime number p . */ |
| unsigned int qOffset; /* Prime number q . */ |
| unsigned int dpOffset; /* dp . */ |
| unsigned int dqOffset; /* dq . */ |
| unsigned int qInvOffset; /* qInv for PKCS */ |
| #if _AIX |
| unsigned char reserved[80]; /* reserved area */ |
| #else |
| unsigned char reserved[88]; /* reserved area */ |
| #endif |
| /* -- Start of the variable -- */ |
| /* -- length token data. -- */ |
| ICA_KEY_RSA_CRT_REC keyRecord; |
| } ICA_KEY_RSA_CRT; |
| #define SZ_HEADER_CRT (sizeof(ICA_KEY_RSA_CRT) - sizeof(ICA_KEY_RSA_CRT_REC)) |
| |
| unsigned int |
| icaOpenAdapter( unsigned int adapterId, |
| ICA_ADAPTER_HANDLE *pAdapterHandle ); |
| |
| unsigned int |
| icaCloseAdapter( ICA_ADAPTER_HANDLE adapterHandle ); |
| |
| unsigned int |
| icaRsaModExpo( ICA_ADAPTER_HANDLE hAdapterHandle, |
| unsigned int inputDataLength, |
| unsigned char *pInputData, |
| ICA_KEY_RSA_MODEXPO *pKeyModExpo, |
| unsigned int *pOutputDataLength, |
| unsigned char *pOutputData ); |
| |
| unsigned int |
| icaRsaCrt( ICA_ADAPTER_HANDLE hAdapterHandle, |
| unsigned int inputDataLength, |
| unsigned char *pInputData, |
| ICA_KEY_RSA_CRT *pKeyCrt, |
| unsigned int *pOutputDataLength, |
| unsigned char *pOutputData ); |
| |
| unsigned int |
| icaRandomNumberGenerate( ICA_ADAPTER_HANDLE hAdapterHandle, |
| unsigned int outputDataLength, |
| unsigned char *pOutputData ); |
| |
| /* Specific macros and definitions to not have IFDEF;s all over the |
| main code */ |
| |
| #if (_AIX) |
| static const char *IBMCA_LIBNAME = "/lib/libica.a(shr.o)"; |
| #elif (WIN32) |
| static const char *IBMCA_LIBNAME = "cryptica"; |
| #else |
| static const char *IBMCA_LIBNAME = "ica"; |
| #endif |
| |
| #if (WIN32) |
| /* |
| The ICA_KEY_RSA_MODEXPO & ICA_KEY_RSA_CRT lengths and |
| offsets must be in big-endian format. |
| |
| */ |
| #define CORRECT_ENDIANNESS(b) ( \ |
| (((unsigned long) (b) & 0x000000ff) << 24) | \ |
| (((unsigned long) (b) & 0x0000ff00) << 8) | \ |
| (((unsigned long) (b) & 0x00ff0000) >> 8) | \ |
| (((unsigned long) (b) & 0xff000000) >> 24) \ |
| ) |
| #define CRT_KEY_TYPE RSA_PKCS_PRIVATE_CHINESE_REMAINDER |
| #define ME_KEY_TYPE RSA_PUBLIC_MODULUS_EXPONENT |
| #else |
| #define CORRECT_ENDIANNESS(b) (b) |
| #define CRT_KEY_TYPE KEYTYPE_PKCSCRT |
| #define ME_KEY_TYPE KEYTYPE_MODEXPO |
| #endif |
| |
| |
| |
| #endif /* __ICA_OPENSSL_API_H__ */ |