openssl/demos/engines/ibmca/ica_openssl_api.h
Richard Levitte 04ed3994e2 OK, I've amused myself with making sure the engines that have been
contributed TO WORK WITH 0.9.7 can be built as dynamically loadable
libraries.

For now, they're not included in crypto/engine/ since 0.9.7 is in
feature freeze.  Further discussion might change that, but don't hold
your breath.
2002-08-13 12:26:41 +00:00

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