ica_openssl_api.h 6.1 KB

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