#ifndef __ICA_OPENSSL_API_H__
#define __ICA_OPENSSL_API_H__
#define ICA_ADAPTER_HANDLE int
#if defined(linux) || defined (_AIX)
#define ICA_CALL
#endif
#if defined(WIN32) || defined(_WIN32)
#define ICA_CALL __stdcall
#endif
#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];
#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
typedef unsigned char ICA_KEY_RSA_CRT_REC[MAX_RSACRT_SIZE];
#define RSA_PUBLIC_MODULUS_EXPONENT 3
#define RSA_PKCS_PRIVATE_CHINESE_REMAINDER 6
#define KEYTYPE_MODEXPO 1
#define KEYTYPE_PKCSCRT 2
typedef struct _ICA_KEY_RSA_MODEXPO
{ unsigned int keyType;
unsigned int keyLength;
unsigned int modulusBitLength;
unsigned int nLength;
unsigned int expLength;
unsigned int nOffset;
unsigned int expOffset;
unsigned char reserved[112];
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))
typedef struct _ICA_KEY_RSA_CRT
{ unsigned int keyType;
unsigned int keyLength;
unsigned int modulusBitLength;
#if _AIX
unsigned int nLength;
#endif
unsigned int pLength;
unsigned int qLength;
unsigned int dpLength;
unsigned int dqLength;
unsigned int qInvLength;
#if _AIX
unsigned int nOffset;
#endif
unsigned int pOffset;
unsigned int qOffset;
unsigned int dpOffset;
unsigned int dqOffset;
unsigned int qInvOffset;
#if _AIX
unsigned char reserved[80];
#else
unsigned char reserved[88];
#endif
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 );
#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)
#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