1109998Smarkm 2109998Smarkm#ifndef __ICA_OPENSSL_API_H__ 3296465Sdelphij# define __ICA_OPENSSL_API_H__ 4109998Smarkm 5109998Smarkm/** 6109998Smarkm ** abstract data types for API 7109998Smarkm **/ 8109998Smarkm 9296465Sdelphij# define ICA_ADAPTER_HANDLE int 10109998Smarkm 11296465Sdelphij# if defined(linux) || defined (_AIX) 12296465Sdelphij# define ICA_CALL 13296465Sdelphij# endif 14109998Smarkm 15296465Sdelphij# if defined(WIN32) || defined(_WIN32) 16296465Sdelphij# define ICA_CALL __stdcall 17296465Sdelphij# endif 18109998Smarkm 19296465Sdelphij/* -----------------------------------------------* 20109998Smarkm | RSA defines and typedefs | 21109998Smarkm *------------------------------------------------*/ 22109998Smarkm /* 23296465Sdelphij * All data elements of the RSA key are in big-endian format 24296465Sdelphij * Modulus-Exponent form of key 25296465Sdelphij * 26296465Sdelphij */ 27296465Sdelphij# define MAX_EXP_SIZE 256 28296465Sdelphij# define MAX_MODULUS_SIZE 256 29296465Sdelphij# define MAX_MODEXP_SIZE (MAX_EXP_SIZE + MAX_MODULUS_SIZE) 30109998Smarkm 31296465Sdelphij# define MAX_OPERAND_SIZE MAX_EXP_SIZE 32109998Smarkm 33296465Sdelphijtypedef unsigned char ICA_KEY_RSA_MODEXPO_REC[MAX_MODEXP_SIZE]; 34109998Smarkm /* 35296465Sdelphij * All data elements of the RSA key are in big-endian format 36296465Sdelphij * Chinese Remainder Thereom(CRT) form of key 37296465Sdelphij * Used only for Decrypt, the encrypt form is typically Modulus-Exponent 38296465Sdelphij * 39296465Sdelphij */ 40296465Sdelphij# define MAX_BP_SIZE 136 41296465Sdelphij# define MAX_BQ_SIZE 128 42296465Sdelphij# define MAX_NP_SIZE 136 43296465Sdelphij# define MAX_NQ_SIZE 128 44296465Sdelphij# define MAX_QINV_SIZE 136 45296465Sdelphij# define MAX_RSACRT_SIZE (MAX_BP_SIZE+MAX_BQ_SIZE+MAX_NP_SIZE+MAX_NQ_SIZE+MAX_QINV_SIZE) 46109998Smarkm 47296465Sdelphij# define RSA_GEN_OPERAND_MAX 256/* bytes */ 48109998Smarkm 49109998Smarkmtypedef unsigned char ICA_KEY_RSA_CRT_REC[MAX_RSACRT_SIZE]; 50296465Sdelphij/* -----------------------------------------------* 51109998Smarkm | RSA key token types | 52109998Smarkm *------------------------------------------------*/ 53109998Smarkm 54296465Sdelphij# define RSA_PUBLIC_MODULUS_EXPONENT 3 55296465Sdelphij# define RSA_PKCS_PRIVATE_CHINESE_REMAINDER 6 56109998Smarkm 57296465Sdelphij# define KEYTYPE_MODEXPO 1 58296465Sdelphij# define KEYTYPE_PKCSCRT 2 59109998Smarkm 60296465Sdelphij/* -----------------------------------------------* 61109998Smarkm | RSA Key Token format | 62109998Smarkm *------------------------------------------------*/ 63109998Smarkm 64296465Sdelphij/*- 65109998Smarkm * NOTE: All the fields in the ICA_KEY_RSA_MODEXPO structure 66109998Smarkm * (lengths, offsets, exponents, modulus, etc.) are 67109998Smarkm * stored in big-endian format 68109998Smarkm */ 69109998Smarkm 70296465Sdelphijtypedef struct _ICA_KEY_RSA_MODEXPO { 71296465Sdelphij unsigned int keyType; /* RSA key type. */ 72296465Sdelphij unsigned int keyLength; /* Total length of the token. */ 73296465Sdelphij unsigned int modulusBitLength; /* Modulus n bit length. */ 74296465Sdelphij /* -- Start of the data length. */ 75296465Sdelphij unsigned int nLength; /* Modulus n = p * q */ 76296465Sdelphij unsigned int expLength; /* exponent (public or private) */ 77296465Sdelphij /* e = 1/d * mod(p-1)(q-1) */ 78296465Sdelphij /* -- Start of the data offsets */ 79296465Sdelphij unsigned int nOffset; /* Modulus n . */ 80296465Sdelphij unsigned int expOffset; /* exponent (public or private) */ 81296465Sdelphij unsigned char reserved[112]; /* reserved area */ 82296465Sdelphij /* -- Start of the variable -- */ 83296465Sdelphij /* -- length token data. -- */ 84109998Smarkm ICA_KEY_RSA_MODEXPO_REC keyRecord; 85109998Smarkm} ICA_KEY_RSA_MODEXPO; 86296465Sdelphij# define SZ_HEADER_MODEXPO (sizeof(ICA_KEY_RSA_MODEXPO) - sizeof(ICA_KEY_RSA_MODEXPO_REC)) 87109998Smarkm 88296465Sdelphij/*- 89109998Smarkm * NOTE: All the fields in the ICA_KEY_RSA_CRT structure 90109998Smarkm * (lengths, offsets, exponents, modulus, etc.) are 91109998Smarkm * stored in big-endian format 92109998Smarkm */ 93109998Smarkm 94296465Sdelphijtypedef struct _ICA_KEY_RSA_CRT { 95296465Sdelphij unsigned int keyType; /* RSA key type. */ 96296465Sdelphij unsigned int keyLength; /* Total length of the token. */ 97296465Sdelphij unsigned int modulusBitLength; /* Modulus n bit length. */ 98296465Sdelphij /* -- Start of the data length. */ 99296465Sdelphij# if _AIX 100296465Sdelphij unsigned int nLength; /* Modulus n = p * q */ 101296465Sdelphij# endif 102296465Sdelphij unsigned int pLength; /* Prime number p . */ 103296465Sdelphij unsigned int qLength; /* Prime number q . */ 104296465Sdelphij unsigned int dpLength; /* dp = d * mod(p-1) . */ 105296465Sdelphij unsigned int dqLength; /* dq = d * mod(q-1) . */ 106296465Sdelphij unsigned int qInvLength; /* PKCS: qInv = Ap/q */ 107296465Sdelphij /* -- Start of the data offsets */ 108296465Sdelphij# if _AIX 109296465Sdelphij unsigned int nOffset; /* Modulus n . */ 110296465Sdelphij# endif 111296465Sdelphij unsigned int pOffset; /* Prime number p . */ 112296465Sdelphij unsigned int qOffset; /* Prime number q . */ 113296465Sdelphij unsigned int dpOffset; /* dp . */ 114296465Sdelphij unsigned int dqOffset; /* dq . */ 115296465Sdelphij unsigned int qInvOffset; /* qInv for PKCS */ 116296465Sdelphij# if _AIX 117296465Sdelphij unsigned char reserved[80]; /* reserved area */ 118296465Sdelphij# else 119296465Sdelphij unsigned char reserved[88]; /* reserved area */ 120296465Sdelphij# endif 121296465Sdelphij /* -- Start of the variable -- */ 122296465Sdelphij /* -- length token data. -- */ 123109998Smarkm ICA_KEY_RSA_CRT_REC keyRecord; 124109998Smarkm} ICA_KEY_RSA_CRT; 125296465Sdelphij# define SZ_HEADER_CRT (sizeof(ICA_KEY_RSA_CRT) - sizeof(ICA_KEY_RSA_CRT_REC)) 126109998Smarkm 127109998Smarkmunsigned int 128296465SdelphijicaOpenAdapter(unsigned int adapterId, ICA_ADAPTER_HANDLE * pAdapterHandle); 129109998Smarkm 130296465Sdelphijunsigned int icaCloseAdapter(ICA_ADAPTER_HANDLE adapterHandle); 131109998Smarkm 132109998Smarkmunsigned int 133296465SdelphijicaRsaModExpo(ICA_ADAPTER_HANDLE hAdapterHandle, 134296465Sdelphij unsigned int inputDataLength, 135296465Sdelphij unsigned char *pInputData, 136296465Sdelphij ICA_KEY_RSA_MODEXPO *pKeyModExpo, 137296465Sdelphij unsigned int *pOutputDataLength, unsigned char *pOutputData); 138109998Smarkm 139109998Smarkmunsigned int 140296465SdelphijicaRsaCrt(ICA_ADAPTER_HANDLE hAdapterHandle, 141296465Sdelphij unsigned int inputDataLength, 142296465Sdelphij unsigned char *pInputData, 143296465Sdelphij ICA_KEY_RSA_CRT *pKeyCrt, 144296465Sdelphij unsigned int *pOutputDataLength, unsigned char *pOutputData); 145109998Smarkm 146109998Smarkmunsigned int 147296465SdelphijicaRandomNumberGenerate(ICA_ADAPTER_HANDLE hAdapterHandle, 148296465Sdelphij unsigned int outputDataLength, 149296465Sdelphij unsigned char *pOutputData); 150109998Smarkm 151296465Sdelphij/* 152296465Sdelphij * Specific macros and definitions to not have IFDEF;s all over the main code 153296465Sdelphij */ 154109998Smarkm 155296465Sdelphij# if (_AIX) 156109998Smarkmstatic const char *IBMCA_LIBNAME = "/lib/libica.a(shr.o)"; 157296465Sdelphij# elif (WIN32) 158109998Smarkmstatic const char *IBMCA_LIBNAME = "cryptica"; 159296465Sdelphij# else 160109998Smarkmstatic const char *IBMCA_LIBNAME = "ica"; 161296465Sdelphij# endif 162109998Smarkm 163296465Sdelphij# if (WIN32) 164109998Smarkm/* 165296465Sdelphij * The ICA_KEY_RSA_MODEXPO & ICA_KEY_RSA_CRT lengths and offsets must be in 166296465Sdelphij * big-endian format. 167296465Sdelphij * 168296465Sdelphij */ 169296465Sdelphij# define CORRECT_ENDIANNESS(b) ( \ 170109998Smarkm (((unsigned long) (b) & 0x000000ff) << 24) | \ 171109998Smarkm (((unsigned long) (b) & 0x0000ff00) << 8) | \ 172109998Smarkm (((unsigned long) (b) & 0x00ff0000) >> 8) | \ 173109998Smarkm (((unsigned long) (b) & 0xff000000) >> 24) \ 174109998Smarkm ) 175296465Sdelphij# define CRT_KEY_TYPE RSA_PKCS_PRIVATE_CHINESE_REMAINDER 176296465Sdelphij# define ME_KEY_TYPE RSA_PUBLIC_MODULUS_EXPONENT 177296465Sdelphij# else 178296465Sdelphij# define CORRECT_ENDIANNESS(b) (b) 179296465Sdelphij# define CRT_KEY_TYPE KEYTYPE_PKCSCRT 180296465Sdelphij# define ME_KEY_TYPE KEYTYPE_MODEXPO 181296465Sdelphij# endif 182109998Smarkm 183296465Sdelphij#endif /* __ICA_OPENSSL_API_H__ */ 184