1
2#ifndef __ICA_OPENSSL_API_H__
3#define __ICA_OPENSSL_API_H__
4
5/**
6 ** abstract data types for API
7 **/
8
9#define ICA_ADAPTER_HANDLE int
10
11#if defined(linux) || defined (_AIX)
12#define ICA_CALL
13#endif
14
15#if defined(WIN32) || defined(_WIN32)
16#define ICA_CALL  __stdcall
17#endif
18
19/*------------------------------------------------*
20 | RSA defines and typedefs                       |
21 *------------------------------------------------*/
22 /*
23 * All data elements of the RSA key are in big-endian format
24 * Modulus-Exponent form of key
25 *
26 */
27 #define MAX_EXP_SIZE 256
28 #define MAX_MODULUS_SIZE 256
29 #define MAX_MODEXP_SIZE  (MAX_EXP_SIZE + MAX_MODULUS_SIZE)
30
31 #define MAX_OPERAND_SIZE  MAX_EXP_SIZE
32
33 typedef unsigned char ICA_KEY_RSA_MODEXPO_REC[MAX_MODEXP_SIZE];
34 /*
35 * All data elements of the RSA key are in big-endian format
36 * Chinese Remainder Thereom(CRT) form of key
37 * Used only for Decrypt, the encrypt form is typically Modulus-Exponent
38 *
39 */
40 #define MAX_BP_SIZE 136
41 #define MAX_BQ_SIZE 128
42 #define MAX_NP_SIZE 136
43 #define MAX_NQ_SIZE 128
44 #define MAX_QINV_SIZE 136
45 #define MAX_RSACRT_SIZE (MAX_BP_SIZE+MAX_BQ_SIZE+MAX_NP_SIZE+MAX_NQ_SIZE+MAX_QINV_SIZE)
46
47#define RSA_GEN_OPERAND_MAX   256 /* bytes */
48
49typedef unsigned char ICA_KEY_RSA_CRT_REC[MAX_RSACRT_SIZE];
50/*------------------------------------------------*
51 | RSA key token types                            |
52 *------------------------------------------------*/
53
54#define  RSA_PUBLIC_MODULUS_EXPONENT        3
55#define  RSA_PKCS_PRIVATE_CHINESE_REMAINDER 6
56
57#define KEYTYPE_MODEXPO         1
58#define KEYTYPE_PKCSCRT         2
59
60
61/*------------------------------------------------*
62 | RSA Key Token format                           |
63 *------------------------------------------------*/
64
65/*
66 * NOTE:  All the fields in the ICA_KEY_RSA_MODEXPO structure
67 *        (lengths, offsets, exponents, modulus, etc.) are
68 *        stored in big-endian format
69 */
70
71typedef struct _ICA_KEY_RSA_MODEXPO
72{   unsigned int  keyType;             /* RSA key type.               */
73    unsigned int  keyLength;           /* Total length of the token.  */
74    unsigned int  modulusBitLength;    /* Modulus n bit length.       */
75                                       /* -- Start of the data length.*/
76    unsigned int  nLength;             /* Modulus n = p * q           */
77    unsigned int  expLength;           /* exponent (public or private)*/
78                                       /*   e = 1/d * mod(p-1)(q-1)   */
79                                       /* -- Start of the data offsets*/
80    unsigned int  nOffset;             /* Modulus n .                 */
81    unsigned int  expOffset;           /* exponent (public or private)*/
82    unsigned char reserved[112];       /* reserved area               */
83                                       /* -- Start of the variable -- */
84                                       /* -- length token data.    -- */
85    ICA_KEY_RSA_MODEXPO_REC keyRecord;
86} ICA_KEY_RSA_MODEXPO;
87#define SZ_HEADER_MODEXPO (sizeof(ICA_KEY_RSA_MODEXPO) - sizeof(ICA_KEY_RSA_MODEXPO_REC))
88
89/*
90 * NOTE:  All the fields in the ICA_KEY_RSA_CRT structure
91 *        (lengths, offsets, exponents, modulus, etc.) are
92 *        stored in big-endian format
93 */
94
95typedef struct _ICA_KEY_RSA_CRT
96{   unsigned int  keyType;             /* RSA key type.               */
97    unsigned int  keyLength;           /* Total length of the token.  */
98    unsigned int  modulusBitLength;    /* Modulus n bit length.       */
99                                       /* -- Start of the data length.*/
100#if _AIX
101    unsigned int  nLength;             /* Modulus n = p * q           */
102#endif
103    unsigned int  pLength;             /* Prime number p .            */
104    unsigned int  qLength;             /* Prime number q .            */
105    unsigned int  dpLength;            /* dp = d * mod(p-1) .         */
106    unsigned int  dqLength;            /* dq = d * mod(q-1) .         */
107    unsigned int  qInvLength;          /* PKCS: qInv = Ap/q           */
108                                       /* -- Start of the data offsets*/
109#if _AIX
110    unsigned int  nOffset;             /* Modulus n .                 */
111#endif
112    unsigned int  pOffset;             /* Prime number p .            */
113    unsigned int  qOffset;             /* Prime number q .            */
114    unsigned int  dpOffset;            /* dp .                        */
115    unsigned int  dqOffset;            /* dq .                        */
116    unsigned int  qInvOffset;          /* qInv for PKCS               */
117#if _AIX
118    unsigned char reserved[80];        /* reserved area               */
119#else
120    unsigned char reserved[88];        /* reserved area               */
121#endif
122                                       /* -- Start of the variable -- */
123                                       /* -- length token data.    -- */
124    ICA_KEY_RSA_CRT_REC keyRecord;
125} ICA_KEY_RSA_CRT;
126#define SZ_HEADER_CRT (sizeof(ICA_KEY_RSA_CRT) - sizeof(ICA_KEY_RSA_CRT_REC))
127
128unsigned int
129icaOpenAdapter( unsigned int        adapterId,
130	        ICA_ADAPTER_HANDLE *pAdapterHandle );
131
132unsigned int
133icaCloseAdapter( ICA_ADAPTER_HANDLE adapterHandle );
134
135unsigned int
136icaRsaModExpo( ICA_ADAPTER_HANDLE    hAdapterHandle,
137	       unsigned int          inputDataLength,
138	       unsigned char        *pInputData,
139	       ICA_KEY_RSA_MODEXPO  *pKeyModExpo,
140	       unsigned int         *pOutputDataLength,
141	       unsigned char        *pOutputData );
142
143unsigned int
144icaRsaCrt( ICA_ADAPTER_HANDLE     hAdapterHandle,
145	   unsigned int           inputDataLength,
146	   unsigned char         *pInputData,
147	   ICA_KEY_RSA_CRT       *pKeyCrt,
148	   unsigned int          *pOutputDataLength,
149	   unsigned char         *pOutputData );
150
151unsigned int
152icaRandomNumberGenerate( ICA_ADAPTER_HANDLE  hAdapterHandle,
153			 unsigned int        outputDataLength,
154			 unsigned char      *pOutputData );
155
156/* Specific macros and definitions to not have IFDEF;s all over the
157   main code */
158
159#if (_AIX)
160static const char *IBMCA_LIBNAME = "/lib/libica.a(shr.o)";
161#elif (WIN32)
162static const char *IBMCA_LIBNAME = "cryptica";
163#else
164static const char *IBMCA_LIBNAME = "ica";
165#endif
166
167#if (WIN32)
168/*
169 The ICA_KEY_RSA_MODEXPO & ICA_KEY_RSA_CRT lengths and
170 offsets must be in big-endian format.
171
172*/
173#define CORRECT_ENDIANNESS(b) (  \
174                             (((unsigned long) (b) & 0x000000ff) << 24) |  \
175                             (((unsigned long) (b) & 0x0000ff00) <<  8) |  \
176                             (((unsigned long) (b) & 0x00ff0000) >>  8) |  \
177                             (((unsigned long) (b) & 0xff000000) >> 24)    \
178                             )
179#define CRT_KEY_TYPE   RSA_PKCS_PRIVATE_CHINESE_REMAINDER
180#define ME_KEY_TYPE    RSA_PUBLIC_MODULUS_EXPONENT
181#else
182#define CORRECT_ENDIANNESS(b) (b)
183#define CRT_KEY_TYPE       KEYTYPE_PKCSCRT
184#define ME_KEY_TYPE        KEYTYPE_MODEXPO
185#endif
186
187
188
189#endif   /* __ICA_OPENSSL_API_H__ */
190