|  | 
 | #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__ */ |