package pkcs11-driver

  1. Overview
  2. Docs
Bindings to the PKCS#11 cryptographic API

Install

Dune Dependency

Authors

Maintainers

Sources

pkcs11-v1.0.0.tbz
sha256=eee2e67fff116d747d1d0f6229af9e952cbb4f9a56765c069c63c1e1bbbc67a3
sha512=3a1090b0cd53b09dffb4c2a2d591e290ff3fe9add1217797f9746a1a6af0d41239b217f1dd45354e3ee457ff007d68bb4d8d83f07001d6ad9870e7aaba4fd434

doc/src/pkcs11-driver/pkcs11_types.ml.html

Source file pkcs11_types.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
(** Types used in the API *)
open Ctypes

(** The bindings come in two flavours. The first one is the Direct
    mode, in which each function from the PKCS11.h header are binded
    directly. The second one is the Indirect mode, in which we use an
    indirection through the list of function returned by
    GetFunctionList. *)

(** CONVENTIONS.

    _t is a type variable used to constrain the [Ctypes] representation.  It
    appears in [Pkcs11.CK_VERSION], for instance. However, only [t] is exported,
    which is defined as [_t structure]. For some modules, it is quite easy to
    work with [t] seen as an abstract type.  For other modules, the higher-level
    type such as [P11.Version.t] is more practical.

    Where appropriate, we provide the following functions:

    - [create: unit -> Pkcs11.CK_x.t]: Allocate a new object of type t (possibly, not
      initialized).
    - [allocate: Pkcs11.CK_x.t -> unit]: Update the object in place by allocating memory for
      its various fields.
    - [view: Pkcs11.CK_x.t -> P11.X.t]: Build the high-level version of the data
      represented by the argument.
    - [make: P11.X.t -> Pkcs11.CK_x.t]: Build the Ctypes version of the data
      represented by [P11.X.t].

    N.B. The last two functions raise the question of why we are not using
    Ctypes views. The problem is that for some functions of the PKCS#11
    interface, we have to make several calls to the API to build a proper
    [Pkcs11.CK_x.t], that could then be used to build a [P11.X.t].
*)

module CK_ULONG = P11_ulong
module CK_BYTE = Pkcs11_CK_BYTE
module CK_BBOOL = Pkcs11_CK_BBOOL
module CK_UTF8CHAR = Pkcs11_CK_UTF8CHAR
module CK_VOID = Pkcs11_CK_VOID
module CK_FLAGS = Pkcs11_CK_FLAGS
module Data = Pkcs11_data
module CK_OBJECT_CLASS = Pkcs11_CK_OBJECT_CLASS
module CK_KEY_TYPE = Pkcs11_CK_KEY_TYPE
module CK_VERSION = Pkcs11_CK_VERSION
module CK_SESSION_HANDLE = Pkcs11_CK_SESSION_HANDLE
module CK_OBJECT_HANDLE = Pkcs11_CK_OBJECT_HANDLE
module CK_HW_FEATURE_TYPE = Pkcs11_CK_HW_FEATURE_TYPE
module CK_SLOT_ID = Pkcs11_CK_SLOT_ID
module CK_SLOT_INFO = Pkcs11_CK_SLOT_INFO
module Slot_list = Pkcs11_slot_list
module CK_MECHANISM_INFO = Pkcs11_CK_MECHANISM_INFO
module CK_SESSION_INFO = Pkcs11_CK_SESSION_INFO
module CK_BIGINT = P11_bigint
module CK_RV = Pkcs11_CK_RV
module CK_MECHANISM_TYPE = Pkcs11_CK_MECHANISM_TYPE
module Key_gen_mechanism = Pkcs11_key_gen_mechanism
module CK_RSA_PKCS_MGF_TYPE = Pkcs11_CK_RSA_PKCS_MGF_TYPE
module CK_RSA_PKCS_OAEP_PARAMS = Pkcs11_CK_RSA_PKCS_OAEP_PARAMS
module CK_RSA_PKCS_PSS_PARAMS = Pkcs11_CK_RSA_PKCS_PSS_PARAMS
module CK_KEY_DERIVATION_STRING_DATA = Pkcs11_CK_KEY_DERIVATION_STRING_DATA
module CK_DES_CBC_ENCRYPT_DATA_PARAMS = Pkcs11_CBC_ENCRYPT_DATA_PARAMS.CK_DES_CBC_ENCRYPT_DATA_PARAMS
module CK_AES_CBC_ENCRYPT_DATA_PARAMS = Pkcs11_CBC_ENCRYPT_DATA_PARAMS.CK_AES_CBC_ENCRYPT_DATA_PARAMS
module CK_PKCS5_PBKDF2_SALT_SOURCE_TYPE = Pkcs11_CK_PKCS5_PBKDF2_SALT_SOURCE_TYPE
module CK_PKCS5_PBKD2_PSEUDO_RANDOM_FUNCTION_TYPE = Pkcs11_CK_PKCS5_PBKD2_PSEUDO_RANDOM_FUNCTION_TYPE
module CK_PKCS5_PBKD2_PARAMS = Pkcs11_CK_PKCS5_PBKD2_PARAMS
module CK_EC_KDF_TYPE = Pkcs11_CK_EC_KDF_TYPE
module CK_ECDH1_DERIVE_PARAMS = Pkcs11_CK_ECDH1_DERIVE_PARAMS
module CK_ECMQV_DERIVE_PARAMS = Pkcs11_CK_ECMQV_DERIVE_PARAMS
module CK_MECHANISM = Pkcs11_CK_MECHANISM
module CK_USER_TYPE = Pkcs11_CK_USER_TYPE
module CK_INFO = Pkcs11_CK_INFO
module CK_TOKEN_INFO = Pkcs11_CK_TOKEN_INFO
module CK_ATTRIBUTE_TYPE = Pkcs11_CK_ATTRIBUTE_TYPE
module CK_ATTRIBUTE = Pkcs11_CK_ATTRIBUTE
module Template = Pkcs11_template
module Mechanism_list = Pkcs11_mechanism_list
module CK_ATTRIBUTE_SET = Pkcs11_CK_ATTRIBUTE_SET
module CK_AES_CTR_PARAMS = Pkcs11_CK_AES_CTR_PARAMS
module CK_GCM_PARAMS = Pkcs11_CK_GCM_PARAMS

let ck_byte = CK_BYTE.typ
let utf8char = ck_byte
let ck_utf8char = char
let ck_bbool = ck_byte
let ck_flags = CK_FLAGS.typ
let ck_object_class = CK_OBJECT_CLASS.typ
let ck_version = CK_VERSION.ck_version
let ck_session_handle = CK_SESSION_HANDLE.typ
let ck_object_handle = CK_OBJECT_HANDLE.typ
let ck_hw_feature_type = CK_HW_FEATURE_TYPE.typ
let ck_slot_id = CK_SLOT_ID.typ
let ck_slot_info = CK_SLOT_INFO.ck_slot_info
let ck_mechanism_info = CK_MECHANISM_INFO.ck_mechanism_info
let ck_session_info = CK_SESSION_INFO.ck_session_info
let ck_rv = CK_RV.typ
let ck_mechanism_type = CK_MECHANISM_TYPE.typ
let ck_rsa_pkcs_mgf_type = CK_RSA_PKCS_MGF_TYPE.typ
let ck_pkcs5_pbkdf2_salt_source_type = CK_PKCS5_PBKDF2_SALT_SOURCE_TYPE.typ
let ck_pkcs5_pbkd2_pseudo_random_function_type = CK_PKCS5_PBKD2_PSEUDO_RANDOM_FUNCTION_TYPE.typ
let ck_mechanism : CK_MECHANISM.t typ = CK_MECHANISM.ck_mechanism
let ck_user_type = CK_USER_TYPE.typ
let ck_info = CK_INFO.ck_info
let ck_token_info = CK_TOKEN_INFO.ck_token_info
let ck_attribute_type = CK_ATTRIBUTE_TYPE.typ
let ck_attribute = CK_ATTRIBUTE.ck_attribute

type template = Template.t

module Initialize_arg = struct
  let mutex = void
  type _ck_c_initialize_args
  type t = _ck_c_initialize_args structure
  let t : t typ = structure "CK_C_INITIALIZE_ARGS"
  let (-:) ty label = Ctypes_helpers.smart_field t label ty
  let f typ = Foreign.funptr (typ @-> returning ck_rv)
  let createMutex = f (ptr (ptr mutex)) -: "CreateMutex"
  let destroyMutex = f (ptr mutex) -: "DestroyMutex"
  let lockMutex = f (ptr mutex) -: "LockMutex"
  let unlockMutex = f (ptr mutex) -: "UnlockMutex"
  let flags = ck_flags -: "flags"
  let pReserved = ptr void -: "pReserved"
  let () = seal t
end

module Nss_initialize_arg = struct
  let mutex = void
  type _ck_nss_c_initialize_args
  type t = _ck_nss_c_initialize_args structure
  let t : t typ = structure "CK_NSS_C_INITIALIZE_ARGS"
  let (-:) ty label = Ctypes_helpers.smart_field t label ty
  let f typ = Foreign.funptr_opt (typ @-> returning ck_rv)
  let createMutex = f (ptr (ptr mutex)) -: "CreateMutex"
  let destroyMutex = f (ptr mutex) -: "DestroyMutex"
  let lockMutex = f (ptr mutex) -: "LockMutex"
  let unlockMutex = f (ptr mutex) -: "UnlockMutex"
  let flags = ck_flags -: "flags"
  let libraryParameters = Ctypes.string_opt -: "LibraryParameters"
  let pReserved = ptr void -: "pReserved"
  let () = seal t

  type u = string
  let make (params : u) =
    let t = Ctypes.make t in
    Ctypes.setf t createMutex None;
    Ctypes.setf t destroyMutex None;
    Ctypes.setf t lockMutex None;
    Ctypes.setf t unlockMutex None;
    Ctypes.setf t flags Pkcs11_CK_FLAGS._CKF_OS_LOCKING_OK;
    Ctypes.setf t libraryParameters (Some params);
    Ctypes.setf t pReserved Ctypes.null;
    t
end

(******************************************************************************)
(*                                  Functions                                 *)
(******************************************************************************)

type _ck_function_list
type ck_function_list = _ck_function_list structure
let ck_function_list : ck_function_list typ = structure "CK_FUNCTION_LIST"

module CK_NOTIFY : sig
  type u
  type t = u ptr
  val u : u typ
  val t : u ptr typ
end =
struct
  type u = unit
  type t = u Ctypes.ptr
  let u = void
  let t = Ctypes.typedef (ptr void) "CK_NOTIFY"
end

module CK =
struct

  let notify = CK_NOTIFY.t

  let session_info = ulong

  (** This module contains the type declarations for the API functions.  *)
  module TF(F : sig
      (** Subinterface of Ctypes.FOREIGN *)
      type 'a fn
      type 'a return
      val (@->) : 'a Ctypes.typ -> 'b fn -> ('a -> 'b) fn
      val returning : 'a Ctypes.typ -> 'a return fn
    end) = struct
    open F
    let c_Initialize =
      (* ptr_opt InitializeArg.t @-> returning ck_rv *)
      ptr void @-> returning ck_rv

    let c_Finalize =
      ptr void @-> returning ck_rv

    let c_GetInfo =
      ptr ck_info @-> returning ck_rv

    let c_GetFunctionList =
      ptr (ptr ck_function_list) @-> returning ck_rv

    let c_GetSlotList =
      ck_bbool @-> ptr ck_slot_id @-> ptr ulong @-> returning ck_rv

    let c_GetSlotInfo =
      ck_slot_id @-> ptr ck_slot_info @-> returning ck_rv

    let c_GetTokenInfo =
      ck_slot_id @-> ptr ck_token_info @-> returning ck_rv

    let c_GetMechanismList =
      ck_slot_id @-> ptr ck_mechanism_type @-> ptr ulong @-> returning ck_rv

    let c_GetMechanismInfo =
      ck_slot_id @-> ck_mechanism_type @-> ptr ck_mechanism_info @->
      returning ck_rv

    let c_InitToken =
      ck_slot_id @-> ptr utf8char @-> ulong @-> ptr utf8char @-> returning ck_rv

    let c_InitPIN =
      ck_session_handle @-> ptr utf8char @-> ulong @-> returning ck_rv

    let c_SetPIN =
      ck_session_handle @-> ptr utf8char @-> ulong @-> ptr utf8char @-> ulong @->
      returning ck_rv

    let c_OpenSession =
      ck_slot_id @-> ck_flags @-> ptr void @-> notify @->
      ptr ck_session_handle @-> returning ck_rv

    let c_CloseSession =
      ck_session_handle @-> returning ck_rv

    let c_CloseAllSessions =
      ck_slot_id @-> returning ck_rv

    let c_GetSessionInfo =
      ck_session_handle @-> ptr ck_session_info @-> returning ck_rv

    let c_GetOperationState =
      ck_session_handle @-> ptr ck_byte @-> ptr ulong @-> returning ck_rv

    let c_SetOperationState =
      ck_session_handle
      @-> ptr ck_byte
      @-> ulong
      @-> ck_object_handle
      @-> ck_object_handle
      @-> returning ck_rv

    let c_Login =
      ck_session_handle @-> ck_user_type @-> ptr utf8char @-> ulong @->
      returning ck_rv

    let c_Logout =
      ck_session_handle @-> returning ck_rv

    let c_CreateObject =
      ck_session_handle @-> ptr ck_attribute @-> ulong @->
      ptr ck_object_handle @-> returning ck_rv

    let c_CopyObject =
      ck_session_handle @-> ck_object_handle @-> ptr ck_attribute @->
      ulong @-> ptr ck_object_handle @-> returning ck_rv

    let c_DestroyObject =
      ck_session_handle @-> ck_object_handle @-> returning ck_rv

    let c_GetObjectSize =
      ck_session_handle @-> ck_object_handle @-> ptr ulong @-> returning ck_rv

    let c_GetAttributeValue =
      ck_session_handle @-> ck_object_handle @-> ptr ck_attribute @-> ulong @->
      returning ck_rv

    let c_SetAttributeValue =
      ck_session_handle @-> ck_object_handle @-> ptr ck_attribute @-> ulong @->
      returning ck_rv

    (* Find object *)

    let c_FindObjectsInit =
      ck_session_handle @-> ptr ck_attribute @-> ulong @-> returning ck_rv

    let c_FindObjects =
      ck_session_handle @-> ptr ck_object_handle @-> ulong @-> ptr ulong @->
      returning ck_rv

    let c_FindObjectsFinal =
      ck_session_handle @-> returning ck_rv


    (**************************************************************************)
    (*                          Encryption/decryption                         *)
    (**************************************************************************)

    let c_EncryptInit         =
      ck_session_handle @-> ptr ck_mechanism @-> ck_object_handle @->
      returning ck_rv

    let c_Encrypt             =
      ck_session_handle @-> ptr ck_byte @-> ulong @-> ptr ck_byte @-> ptr ulong @->
      returning ck_rv

    let c_EncryptUpdate       =
      ck_session_handle @-> ptr ck_byte @-> ulong @-> ptr ck_byte @-> ptr ulong @->
      returning ck_rv

    let c_EncryptFinal       =
      ck_session_handle @-> ptr ck_byte @-> ptr ulong @-> returning ck_rv

    let c_DecryptInit         =
      ck_session_handle @-> ptr ck_mechanism @-> ck_object_handle @->
      returning ck_rv

    let c_Decrypt             =
      ck_session_handle @-> ptr ck_byte @-> ulong @-> ptr ck_byte @-> ptr ulong @->
      returning ck_rv

    let c_DecryptUpdate       =
      ck_session_handle @-> ptr ck_byte @-> ulong @-> ptr ck_byte @-> ptr ulong @->
      returning ck_rv

    let c_DecryptFinal       =
      ck_session_handle @-> ptr ck_byte @-> ptr ulong @-> returning ck_rv

    (**************************************************************************)
    (*                            Message digesting                           *)
    (**************************************************************************)

    let c_DigestInit          =
      ck_session_handle @-> ptr ck_mechanism @-> returning ck_rv

    let c_Digest              =
      ck_session_handle @-> ptr ck_byte @-> ulong @-> ptr ck_byte @-> ptr ulong @->
      returning ck_rv

    let c_DigestUpdate        =
      ck_session_handle @-> ptr ck_byte @-> ulong @-> returning ck_rv

    let c_DigestKey           =
      ck_session_handle @-> ck_object_handle @-> returning ck_rv

    let c_DigestFinal         =
      ck_session_handle @-> ptr ck_byte @-> ptr ulong @-> returning ck_rv

    let c_SignInit            =
      ck_session_handle @-> ptr ck_mechanism @-> ck_object_handle @->
      returning ck_rv

    let c_Sign                =
      ck_session_handle @-> ptr ck_byte @-> ulong @-> ptr ck_byte @-> ptr ulong
      @-> returning ck_rv

    let c_SignUpdate          =
      ck_session_handle @-> ptr ck_byte @-> ulong @-> returning ck_rv

    let c_SignFinal          =
      ck_session_handle @-> ptr ck_byte @-> ptr ulong @-> returning ck_rv

    let c_SignRecoverInit     =
      ck_session_handle @-> ptr ck_mechanism @-> ck_object_handle @->
      returning ck_rv

    let c_SignRecover                =
      ck_session_handle @-> ptr ck_byte @-> ulong @-> ptr ck_byte @-> ptr ulong
      @-> returning ck_rv

    let c_VerifyInit            =
      ck_session_handle @-> ptr ck_mechanism @-> ck_object_handle @->
      returning ck_rv

    let c_Verify                =
      ck_session_handle @-> ptr ck_byte @-> ulong @-> ptr ck_byte @-> ulong
      @-> returning ck_rv

    let c_VerifyUpdate          =
      ck_session_handle @-> ptr ck_byte @-> ulong
      @-> returning ck_rv

    let c_VerifyFinal           =
      ck_session_handle @-> ptr ck_byte @-> ulong
      @-> returning ck_rv

    let c_VerifyRecoverInit            =
      ck_session_handle @-> ptr ck_mechanism @-> ck_object_handle @->
      returning ck_rv

    let c_VerifyRecover                =
      ck_session_handle @-> ptr ck_byte @-> ulong @-> ptr ck_byte @-> ptr ulong
      @-> returning ck_rv

    let c_DigestEncryptUpdate =
      ck_session_handle @-> ptr ck_byte @-> ulong @-> ptr ck_byte @-> ptr ulong
      @-> returning ck_rv
    let c_DecryptDigestUpdate =
      ck_session_handle @-> ptr ck_byte @-> ulong @-> ptr ck_byte @-> ptr ulong
      @-> returning ck_rv
    let c_SignEncryptUpdate   =
      ck_session_handle @-> ptr ck_byte @-> ulong @-> ptr ck_byte @-> ptr ulong
      @-> returning ck_rv
    let c_DecryptVerifyUpdate =
      ck_session_handle @-> ptr ck_byte @-> ulong @-> ptr ck_byte @-> ptr ulong
      @-> returning ck_rv

    let c_GenerateKey         =
      ck_session_handle @-> ptr ck_mechanism @-> ptr ck_attribute @-> ulong
      @-> ptr ck_object_handle @-> returning ck_rv

    let c_GenerateKeyPair     =
      ck_session_handle
      @-> ptr ck_mechanism
      @-> ptr ck_attribute           (* template for public key *)
      @-> ulong                   (* # elements for public key  template*)
      @-> ptr ck_attribute           (* template for private key *)
      @-> ulong                   (* # elements for private key template *)
      @-> ptr ck_object_handle       (* gets pub. key handle *)
      @-> ptr ck_object_handle       (* gets priv. key handle *)
      @-> returning ck_rv

    let c_WrapKey             =
      ck_session_handle
      @-> ptr ck_mechanism
      @-> ck_object_handle      (* wrapping key *)
      @-> ck_object_handle      (* key to be wrapped *)
      @-> ptr ck_byte           (* gets wrapped key *)
      @-> ptr ulong             (* gets wrapped key size *)
      @-> returning ck_rv

    let c_UnwrapKey =
      ck_session_handle
      @-> ptr ck_mechanism
      @-> ck_object_handle      (* unwrapping key *)
      @-> ptr ck_byte           (* wrapped key *)
      @-> ulong                 (* the wrapped key length *)
      @-> ptr ck_attribute      (* new key template *)
      @-> ulong                 (* template length *)
      @-> ptr ck_object_handle  (* gets new handle *)
      @-> returning ck_rv

    let c_DeriveKey           =
      ck_session_handle         (* session handle *)
      @-> ptr ck_mechanism      (* key deriv. mechanism *)
      @-> ck_object_handle      (* base key *)
      @-> ptr ck_attribute      (* new key template *)
      @-> ulong                 (* template length *)
      @-> ptr ck_object_handle  (* gets new handle *)
      @-> returning ck_rv

    let c_SeedRandom          =
      ck_session_handle
      @-> ptr ck_byte
      @-> ulong
      @-> returning ck_rv

    let c_GenerateRandom      =
      ck_session_handle
      @-> ptr ck_byte
      @-> ulong
      @-> returning ck_rv
    let c_GetFunctionStatus   = ck_session_handle @-> returning ck_rv
    let c_CancelFunction      = ck_session_handle @-> returning ck_rv
    let c_WaitForSlotEvent    = ck_flags @-> ptr ck_slot_id @-> ptr void @-> returning ck_rv
  end

  module T = TF(struct
      type 'a fn = 'a Ctypes.fn
      type 'a return = 'a
      let (@->) = Ctypes.(@->)
      let returning = Ctypes.returning
    end)

  module Function_list = struct

    type t = (_ck_function_list, [ `Struct ]) Ctypes.structured

    let (-:) ty label = Ctypes_helpers.smart_field ck_function_list label (Foreign.funptr ty)
    let version               = Ctypes_helpers.smart_field ck_function_list "version" ck_version
    let c_Initialize          = T.c_Initialize          -: "C_Initialize"
    let c_Finalize            = T.c_Finalize            -: "C_Finalize"
    let c_GetInfo             = T.c_GetInfo             -: "C_GetInfo"
    let c_GetFunction_list    = T.c_GetFunctionList     -: "C_GetFunctionList"
    let c_GetSlotList         = T.c_GetSlotList         -: "C_GetSlotList"
    let c_GetSlotInfo         = T.c_GetSlotInfo         -: "C_GetSlotInfo"
    let c_GetTokenInfo        = T.c_GetTokenInfo        -: "C_GetTokenInfo"
    let c_GetMechanismList    = T.c_GetMechanismList    -: "C_GetMechanismList"
    let c_GetMechanismInfo    = T.c_GetMechanismInfo    -: "C_GetMechanismInfo"
    let c_InitToken           = T.c_InitToken           -: "C_InitToken"
    let c_InitPIN             = T.c_InitPIN             -: "C_InitPIN"
    let c_SetPIN              = T.c_SetPIN              -: "C_SetPIN"
    let c_OpenSession         = T.c_OpenSession         -: "C_OpenSession"
    let c_CloseSession        = T.c_CloseSession        -: "C_CloseSession"
    let c_CloseAllSessions    = T.c_CloseAllSessions    -: "C_CloseAllSessions"
    let c_GetSessionInfo      = T.c_GetSessionInfo      -: "C_GetSessionInfo"
    let c_GetOperationState   = T.c_GetOperationState   -: "C_GetOperationState"
    let c_SetOperationState   = T.c_SetOperationState   -: "C_SetOperationState"
    let c_Login               = T.c_Login               -: "C_Login"
    let c_Logout              = T.c_Logout              -: "C_Logout"
    let c_CreateObject        = T.c_CreateObject        -: "C_CreateObject"
    let c_CopyObject          = T.c_CopyObject          -: "C_CopyObject"
    let c_DestroyObject       = T.c_DestroyObject       -: "C_DestroyObject"
    let c_GetObjectSize       = T.c_GetObjectSize       -: "C_GetObjectSize"
    let c_GetAttributeValue   = T.c_GetAttributeValue   -: "C_GetAttributeValue"
    let c_SetAttributeValue   = T.c_SetAttributeValue   -: "C_SetAttributeValue"
    let c_FindObjectsInit     = T.c_FindObjectsInit     -: "C_FindObjectsInit"
    let c_FindObjects         = T.c_FindObjects         -: "C_FindObjects"
    let c_FindObjectsFinal    = T.c_FindObjectsFinal    -: "C_FindObjectsFinal"
    let c_EncryptInit         = T.c_EncryptInit         -: "C_EncryptInit"
    let c_Encrypt             = T.c_Encrypt             -: "C_Encrypt"
    let c_EncryptUpdate       = T.c_EncryptUpdate       -: "C_EncryptUpdate"
    let c_EncryptFinal        = T.c_EncryptFinal        -: "C_EncryptFinal"
    let c_DecryptInit         = T.c_DecryptInit         -: "C_DecryptInit"
    let c_Decrypt             = T.c_Decrypt             -: "C_Decrypt"
    let c_DecryptUpdate       = T.c_DecryptUpdate       -: "C_DecryptUpdate"
    let c_DecryptFinal        = T.c_DecryptFinal        -: "C_DecryptFinal"
    let c_DigestInit          = T.c_DigestInit          -: "C_DigestInit"
    let c_Digest              = T.c_Digest              -: "C_Digest"
    let c_DigestUpdate        = T.c_DigestUpdate        -: "C_DigestUpdate"
    let c_DigestKey           = T.c_DigestKey           -: "C_DigestKey"
    let c_DigestFinal         = T.c_DigestFinal         -: "C_DigestFinal"
    let c_SignInit            = T.c_SignInit            -: "C_SignInit"
    let c_Sign                = T.c_Sign                -: "C_Sign"
    let c_SignUpdate          = T.c_SignUpdate          -: "C_SignUpdate"
    let c_SignFinal           = T.c_SignFinal           -: "C_SignFinal"
    let c_SignRecoverInit     = T.c_SignRecoverInit     -: "C_SignRecoverInit"
    let c_SignRecover         = T.c_SignRecover         -: "C_SignRecover"
    let c_VerifyInit          = T.c_VerifyInit          -: "C_VerifyInit"
    let c_Verify              = T.c_Verify              -: "C_Verify"
    let c_VerifyUpdate        = T.c_VerifyUpdate        -: "C_VerifyUpdate"
    let c_VerifyFinal         = T.c_VerifyFinal         -: "C_VerifyFinal"
    let c_VerifyRecoverInit   = T.c_VerifyRecoverInit   -: "C_VerifyRecoverInit"
    let c_VerifyRecover       = T.c_VerifyRecover       -: "C_VerifyRecover"
    let c_DigestEncryptUpdate = T.c_DigestEncryptUpdate -: "C_DigestEncryptUpdate"
    let c_DecryptDigestUpdate = T.c_DecryptDigestUpdate -: "C_DecryptDigestUpdate"
    let c_SignEncryptUpdate   = T.c_SignEncryptUpdate   -: "C_SignEncryptUpdate"
    let c_DecryptVerifyUpdate = T.c_DecryptVerifyUpdate -: "C_DecryptVerifyUpdate"
    let c_GenerateKey         = T.c_GenerateKey         -: "C_GenerateKey"
    let c_GenerateKeyPair     = T.c_GenerateKeyPair     -: "C_GenerateKeyPair"
    let c_WrapKey             = T.c_WrapKey             -: "C_WrapKey"
    let c_UnwrapKey           = T.c_UnwrapKey           -: "C_UnwrapKey"
    let c_DeriveKey           = T.c_DeriveKey           -: "C_DeriveKey"
    let c_SeedRandom          = T.c_SeedRandom          -: "C_SeedRandom"
    let c_GenerateRandom      = T.c_GenerateRandom      -: "C_GenerateRandom"
    let c_GetFunctionStatus   = T.c_GetFunctionStatus   -: "C_GetFunctionStatus"
    let c_CancelFunction      = T.c_CancelFunction      -: "C_CancelFunction"
    let c_WaitForSlotEvent    = T.c_WaitForSlotEvent    -: "C_WaitForSlotEvent"

    let () = seal ck_function_list
  end

end

module CK_FUNCTION_LIST = struct
  type t = ck_function_list
end
OCaml

Innovation. Community. Security.