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