1 /* pkcs11.h include file for PKCS #11. */
   2 /* $Revision: 1.4 $ */
   3 
   4 /* License to copy and use this software is granted provided that it is
   5  * identified as "RSA Security Inc. PKCS #11 Cryptographic Token Interface
   6  * (Cryptoki)" in all material mentioning or referencing this software.
   7 
   8  * License is also granted to make and use derivative works provided that
   9  * such works are identified as "derived from the RSA Security Inc. PKCS #11
  10  * Cryptographic Token Interface (Cryptoki)" in all material mentioning or
  11  * referencing the derived work.
  12 
  13  * RSA Security Inc. makes no representations concerning either the
  14  * merchantability of this software or the suitability of this software for
  15  * any particular purpose. It is provided "as is" without express or implied
  16  * warranty of any kind.
  17  */
  18 
  19 #ifndef _PKCS11_H_
  20 #define _PKCS11_H_ 1
  21 
  22 #ifdef __cplusplus
  23 extern "C" {
  24 #endif
  25 
  26 /* Before including this file (pkcs11.h) (or pkcs11t.h by
  27  * itself), 6 platform-specific macros must be defined.  These
  28  * macros are described below, and typical definitions for them
  29  * are also given.  Be advised that these definitions can depend
  30  * on both the platform and the compiler used (and possibly also
  31  * on whether a Cryptoki library is linked statically or
  32  * dynamically).
  33  *
  34  * In addition to defining these 6 macros, the packing convention
  35  * for Cryptoki structures should be set.  The Cryptoki
  36  * convention on packing is that structures should be 1-byte
  37  * aligned.
  38  *
  39  * If you're using Microsoft Developer Studio 5.0 to produce
  40  * Win32 stuff, this might be done by using the following
  41  * preprocessor directive before including pkcs11.h or pkcs11t.h:
  42  *
  43  * #pragma pack(push, cryptoki, 1)
  44  *
  45  * and using the following preprocessor directive after including
  46  * pkcs11.h or pkcs11t.h:
  47  *
  48  * #pragma pack(pop, cryptoki)
  49  *
  50  * If you're using an earlier version of Microsoft Developer
  51  * Studio to produce Win16 stuff, this might be done by using
  52  * the following preprocessor directive before including
  53  * pkcs11.h or pkcs11t.h:
  54  *
  55  * #pragma pack(1)
  56  *
  57  * In a UNIX environment, you're on your own for this.  You might
  58  * not need to do (or be able to do!) anything.
  59  *
  60  *
  61  * Now for the macros:
  62  *
  63  *
  64  * 1. CK_PTR: The indirection string for making a pointer to an
  65  * object.  It can be used like this:
  66  *
  67  * typedef CK_BYTE CK_PTR CK_BYTE_PTR;
  68  *
  69  * If you're using Microsoft Developer Studio 5.0 to produce
  70  * Win32 stuff, it might be defined by:
  71  *
  72  * #define CK_PTR *
  73  *
  74  * If you're using an earlier version of Microsoft Developer
  75  * Studio to produce Win16 stuff, it might be defined by:
  76  *
  77  * #define CK_PTR far *
  78  *
  79  * In a typical UNIX environment, it might be defined by:
  80  *
  81  * #define CK_PTR *
  82  *
  83  *
  84  * 2. CK_DEFINE_FUNCTION(returnType, name): A macro which makes
  85  * an exportable Cryptoki library function definition out of a
  86  * return type and a function name.  It should be used in the
  87  * following fashion to define the exposed Cryptoki functions in
  88  * a Cryptoki library:
  89  *
  90  * CK_DEFINE_FUNCTION(CK_RV, C_Initialize)(
  91  *   CK_VOID_PTR pReserved
  92  * )
  93  * {
  94  *   ...
  95  * }
  96  *
  97  * If you're using Microsoft Developer Studio 5.0 to define a
  98  * function in a Win32 Cryptoki .dll, it might be defined by:
  99  *
 100  * #define CK_DEFINE_FUNCTION(returnType, name) \
 101  *   returnType __declspec(dllexport) name
 102  *
 103  * If you're using an earlier version of Microsoft Developer
 104  * Studio to define a function in a Win16 Cryptoki .dll, it
 105  * might be defined by:
 106  *
 107  * #define CK_DEFINE_FUNCTION(returnType, name) \
 108  *   returnType __export _far _pascal name
 109  *
 110  * In a UNIX environment, it might be defined by:
 111  *
 112  * #define CK_DEFINE_FUNCTION(returnType, name) \
 113  *   returnType name
 114  *
 115  *
 116  * 3. CK_DECLARE_FUNCTION(returnType, name): A macro which makes
 117  * an importable Cryptoki library function declaration out of a
 118  * return type and a function name.  It should be used in the
 119  * following fashion:
 120  *
 121  * extern CK_DECLARE_FUNCTION(CK_RV, C_Initialize)(
 122  *   CK_VOID_PTR pReserved
 123  * );
 124  *
 125  * If you're using Microsoft Developer Studio 5.0 to declare a
 126  * function in a Win32 Cryptoki .dll, it might be defined by:
 127  *
 128  * #define CK_DECLARE_FUNCTION(returnType, name) \
 129  *   returnType __declspec(dllimport) name
 130  *
 131  * If you're using an earlier version of Microsoft Developer
 132  * Studio to declare a function in a Win16 Cryptoki .dll, it
 133  * might be defined by:
 134  *
 135  * #define CK_DECLARE_FUNCTION(returnType, name) \
 136  *   returnType __export _far _pascal name
 137  *
 138  * In a UNIX environment, it might be defined by:
 139  *
 140  * #define CK_DECLARE_FUNCTION(returnType, name) \
 141  *   returnType name
 142  *
 143  *
 144  * 4. CK_DECLARE_FUNCTION_POINTER(returnType, name): A macro
 145  * which makes a Cryptoki API function pointer declaration or
 146  * function pointer type declaration out of a return type and a
 147  * function name.  It should be used in the following fashion:
 148  *
 149  * // Define funcPtr to be a pointer to a Cryptoki API function
 150  * // taking arguments args and returning CK_RV.
 151  * CK_DECLARE_FUNCTION_POINTER(CK_RV, funcPtr)(args);
 152  *
 153  * or
 154  *
 155  * // Define funcPtrType to be the type of a pointer to a
 156  * // Cryptoki API function taking arguments args and returning
 157  * // CK_RV, and then define funcPtr to be a variable of type
 158  * // funcPtrType.
 159  * typedef CK_DECLARE_FUNCTION_POINTER(CK_RV, funcPtrType)(args);
 160  * funcPtrType funcPtr;
 161  *
 162  * If you're using Microsoft Developer Studio 5.0 to access
 163  * functions in a Win32 Cryptoki .dll, in might be defined by:
 164  *
 165  * #define CK_DECLARE_FUNCTION_POINTER(returnType, name) \
 166  *   returnType __declspec(dllimport) (* name)
 167  *
 168  * If you're using an earlier version of Microsoft Developer
 169  * Studio to access functions in a Win16 Cryptoki .dll, it might
 170  * be defined by:
 171  *
 172  * #define CK_DECLARE_FUNCTION_POINTER(returnType, name) \
 173  *   returnType __export _far _pascal (* name)
 174  *
 175  * In a UNIX environment, it might be defined by:
 176  *
 177  * #define CK_DECLARE_FUNCTION_POINTER(returnType, name) \
 178  *   returnType (* name)
 179  *
 180  *
 181  * 5. CK_CALLBACK_FUNCTION(returnType, name): A macro which makes
 182  * a function pointer type for an application callback out of
 183  * a return type for the callback and a name for the callback.
 184  * It should be used in the following fashion:
 185  *
 186  * CK_CALLBACK_FUNCTION(CK_RV, myCallback)(args);
 187  *
 188  * to declare a function pointer, myCallback, to a callback
 189  * which takes arguments args and returns a CK_RV.  It can also
 190  * be used like this:
 191  *
 192  * typedef CK_CALLBACK_FUNCTION(CK_RV, myCallbackType)(args);
 193  * myCallbackType myCallback;
 194  *
 195  * If you're using Microsoft Developer Studio 5.0 to do Win32
 196  * Cryptoki development, it might be defined by:
 197  *
 198  * #define CK_CALLBACK_FUNCTION(returnType, name) \
 199  *   returnType (* name)
 200  *
 201  * If you're using an earlier version of Microsoft Developer
 202  * Studio to do Win16 development, it might be defined by:
 203  *
 204  * #define CK_CALLBACK_FUNCTION(returnType, name) \
 205  *   returnType _far _pascal (* name)
 206  *
 207  * In a UNIX environment, it might be defined by:
 208  *
 209  * #define CK_CALLBACK_FUNCTION(returnType, name) \
 210  *   returnType (* name)
 211  *
 212  *
 213  * 6. NULL_PTR: This macro is the value of a NULL pointer.
 214  *
 215  * In any ANSI/ISO C environment (and in many others as well),
 216  * this should best be defined by
 217  *
 218  * #ifndef NULL_PTR
 219  * #define NULL_PTR 0
 220  * #endif
 221  */
 222 
 223 
 224 /* All the various Cryptoki types and #define'd values are in the
 225  * file pkcs11t.h. */
 226 #include "pkcs11t.h"
 227 
 228 #define __PASTE(x,y)      x##y
 229 
 230 
 231 /* ==============================================================
 232  * Define the "extern" form of all the entry points.
 233  * ==============================================================
 234  */
 235 
 236 #define CK_NEED_ARG_LIST  1
 237 #define CK_PKCS11_FUNCTION_INFO(name) \
 238   extern CK_DECLARE_FUNCTION(CK_RV, name)
 239 
 240 /* pkcs11f.h has all the information about the Cryptoki
 241  * function prototypes. */
 242 #include "pkcs11f.h"
 243 
 244 #undef CK_NEED_ARG_LIST
 245 #undef CK_PKCS11_FUNCTION_INFO
 246 
 247 
 248 /* ==============================================================
 249  * Define the typedef form of all the entry points.  That is, for
 250  * each Cryptoki function C_XXX, define a type CK_C_XXX which is
 251  * a pointer to that kind of function.
 252  * ==============================================================
 253  */
 254 
 255 #define CK_NEED_ARG_LIST  1
 256 #define CK_PKCS11_FUNCTION_INFO(name) \
 257   typedef CK_DECLARE_FUNCTION_POINTER(CK_RV, __PASTE(CK_,name))
 258 
 259 /* pkcs11f.h has all the information about the Cryptoki
 260  * function prototypes. */
 261 #include "pkcs11f.h"
 262 
 263 #undef CK_NEED_ARG_LIST
 264 #undef CK_PKCS11_FUNCTION_INFO
 265 
 266 
 267 /* ==============================================================
 268  * Define structed vector of entry points.  A CK_FUNCTION_LIST
 269  * contains a CK_VERSION indicating a library's Cryptoki version
 270  * and then a whole slew of function pointers to the routines in
 271  * the library.  This type was declared, but not defined, in
 272  * pkcs11t.h.
 273  * ==============================================================
 274  */
 275 
 276 #define CK_PKCS11_FUNCTION_INFO(name) \
 277   __PASTE(CK_,name) name;
 278 
 279 struct CK_FUNCTION_LIST {
 280 
 281   CK_VERSION    version;  /* Cryptoki version */
 282 
 283 /* Pile all the function pointers into the CK_FUNCTION_LIST. */
 284 /* pkcs11f.h has all the information about the Cryptoki
 285  * function prototypes. */
 286 #include "pkcs11f.h"
 287 
 288 };
 289 
 290 #undef CK_PKCS11_FUNCTION_INFO
 291 
 292 
 293 #undef __PASTE
 294 
 295 #ifdef __cplusplus
 296 }
 297 #endif
 298 
 299 #endif