189 lines
6.7 KiB
C
189 lines
6.7 KiB
C
|
|
#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__ */
|