pkcs11 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/ext/pk11.c CHANGED
@@ -6,28 +6,36 @@
6
6
  #include <dlfcn.h>
7
7
  #endif
8
8
 
9
- static const char *VERSION = "0.1.0";
9
+ static const char *VERSION = "0.2.0";
10
10
 
11
11
  static ID sNEW;
12
12
  static VALUE mPKCS11;
13
13
  static VALUE cPKCS11;
14
14
  static VALUE ePKCS11Error;
15
15
 
16
+ static VALUE cCStruct;
16
17
  static VALUE cCK_ATTRIBUTE;
17
18
  static VALUE cCK_C_INITIALIZE_ARGS;
19
+ static VALUE aCK_C_INITIALIZE_ARGS_members;
18
20
  static VALUE cCK_INFO;
21
+ static VALUE aCK_INFO_members;
19
22
  static VALUE cCK_TOKEN_INFO;
23
+ static VALUE aCK_TOKEN_INFO_members;
20
24
  static VALUE cCK_SLOT_INFO;
25
+ static VALUE aCK_SLOT_INFO_members;
21
26
  static VALUE cCK_MECHANISM_INFO;
27
+ static VALUE aCK_MECHANISM_INFO_members;
22
28
  static VALUE cCK_SESSION_INFO;
29
+ static VALUE aCK_SESSION_INFO_members;
23
30
  static VALUE cCK_MECHANISM;
31
+ static VALUE aCK_MECHANISM_members;
24
32
 
25
33
  #define HANDLE2NUM(n) ULONG2NUM(n)
26
34
  #define NUM2HANDLE(n) PKNUM2ULONG(n)
27
35
  #define PKNUM2ULONG(n) pkcs11_num2ulong(n)
28
36
  #define pkcs11_new_struct(klass) rb_funcall(klass, sNEW, 0)
29
37
 
30
- VALUE pkcs11_return_value_to_name(CK_RV);
38
+ VALUE pkcs11_return_value_to_class(CK_RV, VALUE);
31
39
 
32
40
  static VALUE
33
41
  pkcs11_num2ulong(VALUE val)
@@ -41,9 +49,9 @@ pkcs11_num2ulong(VALUE val)
41
49
  static void
42
50
  pkcs11_raise(CK_RV rv)
43
51
  {
44
- VALUE message;
45
- message = pkcs11_return_value_to_name(rv);
46
- rb_raise(ePKCS11Error, "%s", RSTRING_PTR(message));
52
+ VALUE class;
53
+ class = pkcs11_return_value_to_class(rv, ePKCS11Error);
54
+ rb_raise(class, "%li", rv);
47
55
  }
48
56
 
49
57
  ///////////////////////////////////////
@@ -56,16 +64,31 @@ typedef struct {
56
64
  #define GetFunction(obj, name, sval) \
57
65
  { \
58
66
  pkcs11_ctx *ctx; \
59
- Data_Get_Struct(self, pkcs11_ctx, ctx); \
60
- if (!ctx->functions) rb_raise(ePKCS11Error, "library already closed"); \
67
+ Data_Get_Struct(obj, pkcs11_ctx, ctx); \
68
+ if (!ctx->functions) rb_raise(ePKCS11Error, "no function list"); \
61
69
  sval = (CK_##name)ctx->functions->name; \
62
70
  if (!sval) rb_raise(ePKCS11Error, #name " is not supported."); \
63
- } while(0)
71
+ }
72
+
73
+ #ifdef HAVE_RB_THREAD_BLOCKING_REGION
74
+ #define CallFunction(name, func, rv, ...) \
75
+ { \
76
+ struct tbr_##name##_params params = { \
77
+ func, {__VA_ARGS__}, CKR_FUNCTION_FAILED \
78
+ }; \
79
+ rb_thread_blocking_region(tbf_##name, &params, RUBY_UBF_PROCESS, 0); \
80
+ rv = params.retval; \
81
+ }
82
+
83
+ #else
84
+ #define CallFunction(name, func, rv, ...) \
85
+ rv = func(__VA_ARGS__)
86
+
87
+ #endif
64
88
 
65
89
  static void
66
90
  pkcs11_ctx_unload_library(pkcs11_ctx *ctx)
67
91
  {
68
- if(ctx->functions) ctx->functions->C_Finalize(NULL_PTR);
69
92
  #ifdef compile_for_windows
70
93
  if(ctx->module) FreeLibrary(ctx->module);
71
94
  #else
@@ -78,18 +101,43 @@ pkcs11_ctx_unload_library(pkcs11_ctx *ctx)
78
101
  static void
79
102
  pkcs11_ctx_free(pkcs11_ctx *ctx)
80
103
  {
104
+ if(ctx->functions) ctx->functions->C_Finalize(NULL_PTR);
81
105
  pkcs11_ctx_unload_library(ctx);
82
106
  free(ctx);
83
107
  }
84
108
 
109
+ /* rb_define_method(cPKCS11, "C_Finalize", pkcs11_C_Finalize, 0); */
110
+ /*
111
+ * Is called to indicate that an application is finished with the Cryptoki library.
112
+ * @see PKCS11::Library#close
113
+ */
85
114
  static VALUE
86
115
  pkcs11_C_Finalize(VALUE self)
116
+ {
117
+ CK_C_Finalize func;
118
+ CK_RV rv;
119
+
120
+ GetFunction(self, C_Finalize, func);
121
+ CallFunction(C_Finalize, func, rv, NULL_PTR);
122
+ if (rv != CKR_OK) pkcs11_raise(rv);
123
+
124
+ return self;
125
+ }
126
+
127
+ /* rb_define_method(cPKCS11, "unload_library", pkcs11_unload_library, 0); */
128
+ /*
129
+ * Unloads the Cryptoki library from process memory.
130
+ * @see PKCS11::Library#close
131
+ */
132
+ static VALUE
133
+ pkcs11_unload_library(VALUE self)
87
134
  {
88
135
  pkcs11_ctx *ctx;
89
-
136
+
90
137
  Data_Get_Struct(self, pkcs11_ctx, ctx);
91
138
  pkcs11_ctx_unload_library(ctx);
92
- return Qnil;
139
+
140
+ return self;
93
141
  }
94
142
 
95
143
  static VALUE
@@ -107,26 +155,18 @@ pkcs11_library_new(int argc, VALUE *argv, VALUE self)
107
155
  return rb_funcall2(cPKCS11, sNEW, argc, argv);
108
156
  }
109
157
 
110
- static VALUE
111
- pkcs11_initialize(int argc, VALUE *argv, VALUE self)
158
+ /* rb_define_method(cPKCS11, "load_library", pkcs11_load_library, 0); */
159
+ /*
160
+ * Load a Cryptoki library into process memory.
161
+ * @see PKCS11::Library#initialize
162
+ */
163
+ static VALUE
164
+ pkcs11_load_library(VALUE self, VALUE path)
112
165
  {
113
- VALUE path, init_args;
114
- pkcs11_ctx *ctx;
115
166
  const char *so_path;
116
- CK_C_GetFunctionList func;
117
- CK_C_INITIALIZE_ARGS *args;
118
- CK_RV rv;
167
+ pkcs11_ctx *ctx;
119
168
 
120
- rb_scan_args(argc, argv, "11", &path, &init_args);
121
169
  so_path = StringValuePtr(path);
122
- if (NIL_P(init_args)) args = NULL_PTR;
123
- else {
124
- if (!rb_obj_is_kind_of(init_args, cCK_C_INITIALIZE_ARGS))
125
- rb_raise(rb_eArgError, "2nd arg must be a PKCS11::CK_C_INITIALIZE_ARGS");
126
- args = DATA_PTR(init_args);
127
- }
128
- args = NIL_P(init_args) ? NULL_PTR : DATA_PTR(init_args);
129
-
130
170
  Data_Get_Struct(self, pkcs11_ctx, ctx);
131
171
  #ifdef compile_for_windows
132
172
  if((ctx->module = LoadLibrary(so_path)) == NULL) {
@@ -136,6 +176,31 @@ pkcs11_initialize(int argc, VALUE *argv, VALUE self)
136
176
  (LPTSTR)&error_text, sizeof(error_text), NULL);
137
177
  rb_raise(ePKCS11Error, error_text);
138
178
  }
179
+ #else
180
+ if((ctx->module = dlopen(so_path, RTLD_NOW)) == NULL) {
181
+ rb_raise(ePKCS11Error, "%s", dlerror());
182
+ }
183
+ #endif
184
+
185
+ return self;
186
+ }
187
+
188
+ /* rb_define_method(cPKCS11, "C_GetFunctionList", pkcs11_C_GetFunctionList, 0); */
189
+ /*
190
+ * Obtains a pointer to the Cryptoki library's list of function pointers. The pointer
191
+ * is stored in the {PKCS11::Library} object and used to call any Cryptoki functions.
192
+ *
193
+ * @see PKCS11::Library#initialize
194
+ */
195
+ static VALUE
196
+ pkcs11_C_GetFunctionList(VALUE self)
197
+ {
198
+ pkcs11_ctx *ctx;
199
+ CK_RV rv;
200
+ CK_C_GetFunctionList func;
201
+
202
+ Data_Get_Struct(self, pkcs11_ctx, ctx);
203
+ #ifdef compile_for_windows
139
204
  func = (CK_C_GetFunctionList)GetProcAddress(ctx->module, "C_GetFunctionList");
140
205
  if(!func){
141
206
  char error_text[999] = "GetProcAddress() error";
@@ -145,14 +210,52 @@ pkcs11_initialize(int argc, VALUE *argv, VALUE self)
145
210
  rb_raise(ePKCS11Error, error_text);
146
211
  }
147
212
  #else
148
- if((ctx->module = dlopen(so_path, RTLD_NOW)) == NULL) {
149
- rb_raise(ePKCS11Error, "%s", dlerror());
150
- }
151
213
  func = (CK_C_GetFunctionList)dlsym(ctx->module, "C_GetFunctionList");
152
214
  if(!func) rb_raise(ePKCS11Error, "%s", dlerror());
153
215
  #endif
154
- if((rv = func(&(ctx->functions))) != CKR_OK) pkcs11_raise(rv);
155
- if ((rv = ctx->functions->C_Initialize(args)) != CKR_OK) pkcs11_raise(rv);
216
+ CallFunction(C_GetFunctionList, func, rv, &(ctx->functions));
217
+ if (rv != CKR_OK) pkcs11_raise(rv);
218
+
219
+ return self;
220
+ }
221
+
222
+ /* rb_define_method(cPKCS11, "C_Initialize", pkcs11_C_Initialize, 0); */
223
+ /*
224
+ * Initializes the Cryptoki library.
225
+ */
226
+ static VALUE
227
+ pkcs11_C_Initialize(int argc, VALUE *argv, VALUE self)
228
+ {
229
+ VALUE init_args;
230
+ CK_C_Initialize func;
231
+ CK_C_INITIALIZE_ARGS *args;
232
+ CK_RV rv;
233
+
234
+ rb_scan_args(argc, argv, "01", &init_args);
235
+ if (NIL_P(init_args)) args = NULL_PTR;
236
+ else {
237
+ if (!rb_obj_is_kind_of(init_args, cCK_C_INITIALIZE_ARGS))
238
+ rb_raise(rb_eArgError, "2nd arg must be a PKCS11::CK_C_INITIALIZE_ARGS");
239
+ args = DATA_PTR(init_args);
240
+ }
241
+ GetFunction(self, C_Initialize, func);
242
+ CallFunction(C_Initialize, func, rv, args);
243
+ if (rv != CKR_OK) pkcs11_raise(rv);
244
+
245
+ return self;
246
+ }
247
+
248
+ static VALUE
249
+ pkcs11_initialize(int argc, VALUE *argv, VALUE self)
250
+ {
251
+ VALUE path, init_args;
252
+
253
+ rb_scan_args(argc, argv, "02", &path, &init_args);
254
+ if( !NIL_P(path) ){
255
+ pkcs11_load_library(self, path);
256
+ pkcs11_C_GetFunctionList(self);
257
+ pkcs11_C_Initialize(1, &init_args, self);
258
+ }
156
259
 
157
260
  return self;
158
261
  }
@@ -166,7 +269,7 @@ pkcs11_C_GetInfo(VALUE self)
166
269
 
167
270
  GetFunction(self, C_GetInfo, func);
168
271
  info = pkcs11_new_struct(cCK_INFO);
169
- rv = func((CK_INFO_PTR)DATA_PTR(info));
272
+ CallFunction(C_GetInfo, func, rv, (CK_INFO_PTR)DATA_PTR(info));
170
273
  if (rv != CKR_OK) pkcs11_raise(rv);
171
274
 
172
275
  return info;
@@ -179,14 +282,14 @@ pkcs11_C_GetSlotList(VALUE self, VALUE presented)
179
282
  CK_SLOT_ID_PTR pSlotList;
180
283
  CK_RV rv;
181
284
  CK_C_GetSlotList func;
182
- int i;
285
+ CK_ULONG i;
183
286
  VALUE ary = rb_ary_new();
184
287
 
185
288
  GetFunction(self, C_GetSlotList, func);
186
- rv = func(CK_FALSE, NULL_PTR, &ulSlotCount);
289
+ CallFunction(C_GetSlotList, func, rv, CK_FALSE, NULL_PTR, &ulSlotCount);
187
290
  if (rv != CKR_OK) pkcs11_raise(rv);
188
291
  pSlotList = (CK_SLOT_ID_PTR)malloc(ulSlotCount*sizeof(CK_SLOT_ID));
189
- rv = func(RTEST(presented) ? CK_TRUE : CK_FALSE, pSlotList, &ulSlotCount);
292
+ CallFunction(C_GetSlotList, func, rv, RTEST(presented) ? CK_TRUE : CK_FALSE, pSlotList, &ulSlotCount);
190
293
  if (rv != CKR_OK) {
191
294
  free(pSlotList);
192
295
  pkcs11_raise(rv);
@@ -207,7 +310,7 @@ pkcs11_C_GetSlotInfo(VALUE self, VALUE slot_id)
207
310
 
208
311
  GetFunction(self, C_GetSlotInfo, func);
209
312
  info = pkcs11_new_struct(cCK_SLOT_INFO);
210
- rv = func(NUM2HANDLE(slot_id), DATA_PTR(info));
313
+ CallFunction(C_GetSlotInfo, func, rv, NUM2HANDLE(slot_id), DATA_PTR(info));
211
314
  if (rv != CKR_OK) pkcs11_raise(rv);
212
315
 
213
316
  return info;
@@ -222,7 +325,7 @@ pkcs11_C_GetTokenInfo(VALUE self, VALUE slot_id)
222
325
 
223
326
  GetFunction(self, C_GetTokenInfo, func);
224
327
  info = pkcs11_new_struct(cCK_TOKEN_INFO);
225
- rv = func(NUM2HANDLE(slot_id), DATA_PTR(info));
328
+ CallFunction(C_GetTokenInfo, func, rv, NUM2HANDLE(slot_id), DATA_PTR(info));
226
329
  if (rv != CKR_OK) pkcs11_raise(rv);
227
330
 
228
331
  return info;
@@ -236,17 +339,17 @@ pkcs11_C_GetMechanismList(VALUE self, VALUE slot_id)
236
339
  CK_MECHANISM_TYPE_PTR types;
237
340
  CK_ULONG count;
238
341
  VALUE ary;
239
- int i;
342
+ CK_ULONG i;
240
343
 
241
344
  ary = rb_ary_new();
242
345
  GetFunction(self, C_GetMechanismList, func);
243
- rv = func(NUM2HANDLE(slot_id), NULL_PTR, &count);
346
+ CallFunction(C_GetMechanismList, func, rv, NUM2HANDLE(slot_id), NULL_PTR, &count);
244
347
  if (rv != CKR_OK) pkcs11_raise(rv);
245
348
  if (count == 0) return ary;
246
349
 
247
350
  types = (CK_MECHANISM_TYPE_PTR)malloc(sizeof(CK_MECHANISM_TYPE)*count);
248
351
  if (!types) rb_sys_fail(0);
249
- rv = func(NUM2HANDLE(slot_id), types, &count);
352
+ CallFunction(C_GetMechanismList, func, rv, NUM2HANDLE(slot_id), types, &count);
250
353
  if (rv != CKR_OK){
251
354
  free(types);
252
355
  pkcs11_raise(rv);
@@ -267,7 +370,7 @@ pkcs11_C_GetMechanismInfo(VALUE self, VALUE slot_id, VALUE type)
267
370
 
268
371
  info = pkcs11_new_struct(cCK_MECHANISM_INFO);
269
372
  GetFunction(self, C_GetMechanismInfo, func);
270
- rv = func(NUM2HANDLE(slot_id), NUM2HANDLE(type), DATA_PTR(info));
373
+ CallFunction(C_GetMechanismInfo, func, rv, NUM2HANDLE(slot_id), NUM2HANDLE(type), DATA_PTR(info));
271
374
  if (rv != CKR_OK) pkcs11_raise(rv);
272
375
 
273
376
  return info;
@@ -282,7 +385,7 @@ pkcs11_C_InitToken(VALUE self, VALUE slot_id, VALUE pin, VALUE label)
282
385
  StringValue(pin);
283
386
  StringValue(label);
284
387
  GetFunction(self, C_InitToken, func);
285
- rv = func(NUM2HANDLE(slot_id),
388
+ CallFunction(C_InitToken, func, rv, NUM2HANDLE(slot_id),
286
389
  (CK_UTF8CHAR_PTR)RSTRING_PTR(pin), RSTRING_LEN(pin),
287
390
  (CK_UTF8CHAR_PTR)RSTRING_PTR(label));
288
391
  if (rv != CKR_OK) pkcs11_raise(rv);
@@ -298,7 +401,7 @@ pkcs11_C_InitPIN(VALUE self, VALUE session, VALUE pin)
298
401
 
299
402
  StringValue(pin);
300
403
  GetFunction(self, C_InitPIN, func);
301
- rv = func(NUM2HANDLE(session),
404
+ CallFunction(C_InitPIN, func, rv, NUM2HANDLE(session),
302
405
  (CK_UTF8CHAR_PTR)RSTRING_PTR(pin), RSTRING_LEN(pin));
303
406
  if (rv != CKR_OK) pkcs11_raise(rv);
304
407
 
@@ -306,14 +409,14 @@ pkcs11_C_InitPIN(VALUE self, VALUE session, VALUE pin)
306
409
  }
307
410
 
308
411
  static VALUE
309
- pkcs11_C_OpenSession(VALUE self, VALUE slot_id, VALUE flags)
412
+ pkcs11_C_OpenSession(VALUE self, VALUE slot_id, VALUE flags)
310
413
  {
311
414
  CK_C_OpenSession func;
312
415
  CK_RV rv;
313
416
  CK_SESSION_HANDLE handle;
314
417
 
315
418
  GetFunction(self, C_OpenSession, func);
316
- rv = func(NUM2HANDLE(slot_id), NUM2ULONG(flags), 0, 0, &handle);
419
+ CallFunction(C_OpenSession, func, rv, NUM2HANDLE(slot_id), NUM2ULONG(flags), 0, 0, &handle);
317
420
  if(rv != CKR_OK) pkcs11_raise(rv);
318
421
 
319
422
  return HANDLE2NUM(handle);
@@ -327,7 +430,7 @@ pkcs11_C_Login(VALUE self, VALUE session, VALUE user_type, VALUE pin)
327
430
 
328
431
  StringValue(pin);
329
432
  GetFunction(self, C_Login, func);
330
- rv = func(NUM2HANDLE(session), NUM2ULONG(user_type),
433
+ CallFunction(C_Login, func, rv, NUM2HANDLE(session), NUM2ULONG(user_type),
331
434
  (CK_UTF8CHAR_PTR)RSTRING_PTR(pin), RSTRING_LEN(pin));
332
435
  if(rv != CKR_OK) pkcs11_raise(rv);
333
436
 
@@ -341,7 +444,7 @@ pkcs11_C_Logout(VALUE self, VALUE session)
341
444
  CK_RV rv;
342
445
 
343
446
  GetFunction(self, C_Logout, func);
344
- rv = func(NUM2HANDLE(session));
447
+ CallFunction(C_Logout, func, rv, NUM2HANDLE(session));
345
448
  if(rv != CKR_OK) pkcs11_raise(rv);
346
449
 
347
450
  return self;
@@ -354,7 +457,7 @@ pkcs11_C_CloseSession(VALUE self, VALUE session)
354
457
  CK_RV rv;
355
458
 
356
459
  GetFunction(self, C_CloseSession, func);
357
- rv = func(NUM2HANDLE(session));
460
+ CallFunction(C_CloseSession, func, rv, NUM2HANDLE(session));
358
461
  if(rv != CKR_OK) pkcs11_raise(rv);
359
462
 
360
463
  return self;
@@ -367,7 +470,7 @@ pkcs11_C_CloseAllSessions(VALUE self, VALUE slot_id)
367
470
  CK_RV rv;
368
471
 
369
472
  GetFunction(self, C_CloseAllSessions, func);
370
- rv = func(NUM2HANDLE(slot_id));
473
+ CallFunction(C_CloseAllSessions, func, rv, NUM2HANDLE(slot_id));
371
474
  if(rv != CKR_OK) pkcs11_raise(rv);
372
475
 
373
476
  return self;
@@ -382,7 +485,7 @@ pkcs11_C_GetSessionInfo(VALUE self, VALUE session)
382
485
 
383
486
  info = pkcs11_new_struct(cCK_SESSION_INFO);
384
487
  GetFunction(self, C_GetSessionInfo, func);
385
- rv = func(NUM2HANDLE(session), DATA_PTR(info));
488
+ CallFunction(C_GetSessionInfo, func, rv, NUM2HANDLE(session), DATA_PTR(info));
386
489
  if (rv != CKR_OK) pkcs11_raise(rv);
387
490
 
388
491
  return info;
@@ -397,11 +500,12 @@ pkcs11_C_GetOperationState(VALUE self, VALUE session)
397
500
  CK_ULONG size;
398
501
 
399
502
  GetFunction(self, C_GetOperationState, func);
400
- rv = func(NUM2HANDLE(session), NULL_PTR, &size);
503
+ CallFunction(C_GetOperationState, func, rv, NUM2HANDLE(session), NULL_PTR, &size);
401
504
  if (rv != CKR_OK) pkcs11_raise(rv);
402
505
  state = rb_str_new(0, size);
403
- rv = func(NUM2HANDLE(session), (CK_BYTE_PTR)RSTRING_PTR(state), &size);
506
+ CallFunction(C_GetOperationState, func, rv, NUM2HANDLE(session), (CK_BYTE_PTR)RSTRING_PTR(state), &size);
404
507
  if (rv != CKR_OK) pkcs11_raise(rv);
508
+ rb_str_set_len(state, size);
405
509
 
406
510
  return state;
407
511
  }
@@ -414,9 +518,9 @@ pkcs11_C_SetOperationState(VALUE self, VALUE session, VALUE state, VALUE enc_key
414
518
 
415
519
  StringValue(state);
416
520
  GetFunction(self, C_SetOperationState, func);
417
- rv = func(NUM2HANDLE(session),
521
+ CallFunction(C_SetOperationState, func, rv, NUM2HANDLE(session),
418
522
  (CK_BYTE_PTR)RSTRING_PTR(state), RSTRING_LEN(state),
419
- NUM2HANDLE(state), NUM2HANDLE(auth_key));
523
+ NUM2HANDLE(enc_key), NUM2HANDLE(auth_key));
420
524
  if (rv != CKR_OK) pkcs11_raise(rv);
421
525
 
422
526
  return self;
@@ -431,7 +535,7 @@ pkcs11_C_SetPIN(VALUE self, VALUE session, VALUE old_pin, VALUE new_pin)
431
535
  StringValue(old_pin);
432
536
  StringValue(new_pin);
433
537
  GetFunction(self, C_SetPIN, func);
434
- rv = func(NUM2HANDLE(session),
538
+ CallFunction(C_SetPIN, func, rv, NUM2HANDLE(session),
435
539
  (CK_UTF8CHAR_PTR)RSTRING_PTR(old_pin), RSTRING_LEN(old_pin),
436
540
  (CK_UTF8CHAR_PTR)RSTRING_PTR(new_pin), RSTRING_LEN(new_pin));
437
541
  if(rv != CKR_OK) pkcs11_raise(rv);
@@ -468,10 +572,27 @@ pkcs11_C_CreateObject(VALUE self, VALUE session, VALUE template)
468
572
  CK_RV rv;
469
573
  CK_ATTRIBUTE *tmp;
470
574
  CK_OBJECT_HANDLE handle;
471
-
575
+
472
576
  tmp = pkcs11_attr_ary2buf(template);
473
577
  GetFunction(self, C_CreateObject, func);
474
- rv = func(NUM2HANDLE(session), tmp, RARRAY_LEN(template), &handle);
578
+ CallFunction(C_CreateObject, func, rv, NUM2HANDLE(session), tmp, RARRAY_LEN(template), &handle);
579
+ free(tmp);
580
+ if(rv != CKR_OK) pkcs11_raise(rv);
581
+
582
+ return HANDLE2NUM(handle);
583
+ }
584
+
585
+ static VALUE
586
+ pkcs11_C_CopyObject(VALUE self, VALUE session, VALUE object, VALUE template)
587
+ {
588
+ CK_C_CopyObject func;
589
+ CK_RV rv;
590
+ CK_ATTRIBUTE *tmp;
591
+ CK_OBJECT_HANDLE handle;
592
+
593
+ tmp = pkcs11_attr_ary2buf(template);
594
+ GetFunction(self, C_CopyObject, func);
595
+ CallFunction(C_CopyObject, func, rv, NUM2HANDLE(session), NUM2HANDLE(object), tmp, RARRAY_LEN(template), &handle);
475
596
  free(tmp);
476
597
  if(rv != CKR_OK) pkcs11_raise(rv);
477
598
 
@@ -485,7 +606,7 @@ pkcs11_C_DestroyObject(VALUE self, VALUE session, VALUE handle)
485
606
  CK_RV rv;
486
607
 
487
608
  GetFunction(self, C_DestroyObject, func);
488
- rv = func(NUM2HANDLE(session), NUM2HANDLE(handle));
609
+ CallFunction(C_DestroyObject, func, rv, NUM2HANDLE(session), NUM2HANDLE(handle));
489
610
  if(rv != CKR_OK) pkcs11_raise(rv);
490
611
 
491
612
  return self;
@@ -499,7 +620,7 @@ pkcs11_C_GetObjectSize(VALUE self, VALUE session, VALUE handle)
499
620
  CK_ULONG size;
500
621
 
501
622
  GetFunction(self, C_GetObjectSize, func);
502
- rv = func(NUM2HANDLE(session), NUM2HANDLE(handle), &size);
623
+ CallFunction(C_GetObjectSize, func, rv, NUM2HANDLE(session), NUM2HANDLE(handle), &size);
503
624
  if(rv != CKR_OK) pkcs11_raise(rv);
504
625
 
505
626
  return ULONG2NUM(size);
@@ -518,7 +639,7 @@ pkcs11_C_FindObjectsInit(VALUE self, VALUE session, VALUE template)
518
639
  tmp_size = RARRAY_LEN(template);
519
640
  }
520
641
  GetFunction(self, C_FindObjectsInit, func);
521
- rv = func(NUM2HANDLE(session), tmp, tmp_size);
642
+ CallFunction(C_FindObjectsInit, func, rv, NUM2HANDLE(session), tmp, tmp_size);
522
643
  free(tmp);
523
644
  if(rv != CKR_OK) pkcs11_raise(rv);
524
645
 
@@ -532,7 +653,7 @@ pkcs11_C_FindObjectsFinal(VALUE self, VALUE session)
532
653
  CK_RV rv;
533
654
 
534
655
  GetFunction(self, C_FindObjectsFinal, func);
535
- rv = func(NUM2HANDLE(session));
656
+ CallFunction(C_FindObjectsFinal, func, rv, NUM2HANDLE(session));
536
657
  if(rv != CKR_OK) pkcs11_raise(rv);
537
658
 
538
659
  return self;
@@ -546,12 +667,12 @@ pkcs11_C_FindObjects(VALUE self, VALUE session, VALUE max_count)
546
667
  CK_OBJECT_HANDLE_PTR handles;
547
668
  CK_ULONG count = 0;
548
669
  VALUE ary;
549
- int i;
670
+ CK_ULONG i;
550
671
 
551
672
  handles = (CK_OBJECT_HANDLE_PTR)
552
673
  malloc(sizeof(CK_OBJECT_HANDLE)*NUM2ULONG(max_count));
553
674
  GetFunction(self, C_FindObjects, func);
554
- rv = func(NUM2HANDLE(session), handles, NUM2ULONG(max_count), &count);
675
+ CallFunction(C_FindObjects, func, rv, NUM2HANDLE(session), handles, NUM2ULONG(max_count), &count);
555
676
  if(rv != CKR_OK){
556
677
  free(handles);
557
678
  pkcs11_raise(rv);
@@ -578,7 +699,7 @@ pkcs11_C_GetAttributeValue(VALUE self, VALUE session, VALUE handle, VALUE templa
578
699
  tmp = pkcs11_attr_ary2buf(template);
579
700
  template_size = RARRAY_LEN(template);
580
701
  GetFunction(self, C_GetAttributeValue, func);
581
- rv = func(NUM2HANDLE(session), NUM2HANDLE(handle), tmp, template_size);
702
+ CallFunction(C_GetAttributeValue, func, rv, NUM2HANDLE(session), NUM2HANDLE(handle), tmp, template_size);
582
703
  if(rv != CKR_OK){
583
704
  free(tmp);
584
705
  pkcs11_raise(rv);
@@ -586,10 +707,10 @@ pkcs11_C_GetAttributeValue(VALUE self, VALUE session, VALUE handle, VALUE templa
586
707
 
587
708
  for (i = 0; i < template_size; i++){
588
709
  CK_ATTRIBUTE_PTR attr = tmp + i;
589
- if (attr->ulValueLen != -1)
710
+ if (attr->ulValueLen != (CK_ULONG)-1)
590
711
  attr->pValue = (CK_BYTE_PTR)malloc(attr->ulValueLen);
591
712
  }
592
- rv = func(NUM2HANDLE(session), NUM2HANDLE(handle), tmp, template_size);
713
+ CallFunction(C_GetAttributeValue, func, rv, NUM2HANDLE(session), NUM2HANDLE(handle), tmp, template_size);
593
714
  if(rv != CKR_OK){
594
715
  for (i = 0; i < template_size; i++){
595
716
  CK_ATTRIBUTE_PTR attr = tmp + i;
@@ -601,7 +722,7 @@ pkcs11_C_GetAttributeValue(VALUE self, VALUE session, VALUE handle, VALUE templa
601
722
  ary = rb_ary_new();
602
723
  for (i = 0; i < template_size; i++){
603
724
  CK_ATTRIBUTE_PTR attr = tmp + i;
604
- if (attr->ulValueLen != -1){
725
+ if (attr->ulValueLen != (CK_ULONG)-1){
605
726
  VALUE v = pkcs11_new_struct(cCK_ATTRIBUTE);
606
727
  memcpy(DATA_PTR(v), attr, sizeof(CK_ATTRIBUTE));
607
728
  rb_ary_push(ary, v);
@@ -623,7 +744,7 @@ pkcs11_C_SetAttributeValue(VALUE self, VALUE session, VALUE handle, VALUE templa
623
744
  tmp = pkcs11_attr_ary2buf(template);
624
745
  template_size = RARRAY_LEN(template);
625
746
  GetFunction(self, C_SetAttributeValue, func);
626
- rv = func(NUM2HANDLE(session), NUM2HANDLE(handle), tmp, template_size);
747
+ CallFunction(C_SetAttributeValue, func, rv, NUM2HANDLE(session), NUM2HANDLE(handle), tmp, template_size);
627
748
  free(tmp);
628
749
  if(rv != CKR_OK) pkcs11_raise(rv);
629
750
 
@@ -637,7 +758,7 @@ pkcs11_C_SeedRandom(VALUE self, VALUE session, VALUE seed)
637
758
  CK_RV rv;
638
759
 
639
760
  GetFunction(self, C_SeedRandom, func);
640
- rv = func(NUM2HANDLE(session),
761
+ CallFunction(C_SeedRandom, func, rv, NUM2HANDLE(session),
641
762
  (CK_BYTE_PTR)RSTRING_PTR(seed), RSTRING_LEN(seed));
642
763
  if(rv != CKR_OK) pkcs11_raise(rv);
643
764
 
@@ -653,7 +774,7 @@ pkcs11_C_GenerateRandom(VALUE self, VALUE session, VALUE size)
653
774
  CK_RV rv;
654
775
 
655
776
  GetFunction(self, C_GenerateRandom, func);
656
- rv = func(NUM2HANDLE(session), (CK_BYTE_PTR)RSTRING_PTR(buf), sz);
777
+ CallFunction(C_GenerateRandom, func, rv, NUM2HANDLE(session), (CK_BYTE_PTR)RSTRING_PTR(buf), sz);
657
778
  if(rv != CKR_OK) pkcs11_raise(rv);
658
779
 
659
780
  return buf;
@@ -667,7 +788,7 @@ pkcs11_C_WaitForSlotEvent(VALUE self, VALUE flags)
667
788
  CK_SLOT_ID slot_id;
668
789
 
669
790
  GetFunction(self, C_WaitForSlotEvent, func);
670
- rv = func(NUM2ULONG(flags), &slot_id, NULL_PTR);
791
+ CallFunction(C_WaitForSlotEvent, func, rv, NUM2ULONG(flags), &slot_id, NULL_PTR);
671
792
  if(rv == CKR_NO_EVENT) return Qnil;
672
793
  if(rv != CKR_OK) pkcs11_raise(rv);
673
794
 
@@ -702,7 +823,8 @@ common_init(VALUE session, VALUE mechanism, VALUE key, init_func func)
702
823
  if (!rb_obj_is_kind_of(mechanism, cCK_MECHANISM))
703
824
  rb_raise(rb_eArgError, "2nd arg must be a PKCS11::CK_MECHANISM");
704
825
  m = DATA_PTR(mechanism);
705
- rv = func(NUM2HANDLE(session), m, NUM2HANDLE(key));
826
+ /* Use the function signature of any of the various C_*Init functions. */
827
+ CallFunction(C_EncryptInit, func, rv, NUM2HANDLE(session), m, NUM2HANDLE(key));
706
828
  if(rv != CKR_OK) pkcs11_raise(rv);
707
829
 
708
830
  return Qnil;
@@ -717,7 +839,7 @@ common_crypt_update(VALUE session, VALUE data, VALUE size, crypt_update_func fun
717
839
 
718
840
  StringValue(data);
719
841
  if (NIL_P(size)){
720
- rv = func(NUM2HANDLE(session),
842
+ CallFunction(C_EncryptUpdate, func, rv, NUM2HANDLE(session),
721
843
  (CK_BYTE_PTR)RSTRING_PTR(data), RSTRING_LEN(data),
722
844
  NULL_PTR, &sz);
723
845
  if(rv != CKR_OK) pkcs11_raise(rv);
@@ -726,7 +848,7 @@ common_crypt_update(VALUE session, VALUE data, VALUE size, crypt_update_func fun
726
848
  }
727
849
  buf = rb_str_new(0, sz);
728
850
 
729
- rv = func(NUM2HANDLE(session),
851
+ CallFunction(C_EncryptUpdate, func, rv, NUM2HANDLE(session),
730
852
  (CK_BYTE_PTR)RSTRING_PTR(data), RSTRING_LEN(data),
731
853
  (CK_BYTE_PTR)RSTRING_PTR(buf), &sz);
732
854
  if(rv != CKR_OK) pkcs11_raise(rv);
@@ -743,14 +865,14 @@ common_crypt_final(VALUE session, VALUE size, crypt_final_func func)
743
865
  VALUE buf;
744
866
 
745
867
  if (NIL_P(size)){
746
- rv = func(NUM2HANDLE(session), NULL_PTR, &sz);
868
+ CallFunction(C_EncryptFinal, func, rv, NUM2HANDLE(session), NULL_PTR, &sz);
747
869
  if(rv != CKR_OK) pkcs11_raise(rv);
748
870
  }else{
749
871
  sz = NUM2ULONG(size);
750
872
  }
751
873
  buf = rb_str_new(0, sz);
752
874
 
753
- rv = func(NUM2HANDLE(session), (CK_BYTE_PTR)RSTRING_PTR(buf), &sz);
875
+ CallFunction(C_EncryptFinal, func, rv, NUM2HANDLE(session), (CK_BYTE_PTR)RSTRING_PTR(buf), &sz);
754
876
  if(rv != CKR_OK) pkcs11_raise(rv);
755
877
  rb_str_set_len(buf, sz);
756
878
 
@@ -763,7 +885,7 @@ common_sign_update(VALUE session, VALUE data, sign_update_func func)
763
885
  CK_RV rv;
764
886
 
765
887
  StringValue(data);
766
- rv = func(NUM2HANDLE(session),
888
+ CallFunction(C_SignUpdate, func, rv, NUM2HANDLE(session),
767
889
  (CK_BYTE_PTR)RSTRING_PTR(data), RSTRING_LEN(data));
768
890
  if(rv != CKR_OK) pkcs11_raise(rv);
769
891
 
@@ -777,7 +899,8 @@ common_verify(VALUE session, VALUE data, VALUE sig, verify_func func)
777
899
 
778
900
  StringValue(data);
779
901
  StringValue(sig);
780
- rv = func(NUM2HANDLE(session),
902
+ /* Use the function signature of any of the various C_Verify* functions. */
903
+ CallFunction(C_Verify, func, rv, NUM2HANDLE(session),
781
904
  (CK_BYTE_PTR)RSTRING_PTR(data), RSTRING_LEN(data),
782
905
  (CK_BYTE_PTR)RSTRING_PTR(sig), RSTRING_LEN(sig));
783
906
  if(rv != CKR_OK) pkcs11_raise(rv);
@@ -979,7 +1102,7 @@ pkcs11_C_DigestInit(VALUE self, VALUE session, VALUE mechanism)
979
1102
  if (!rb_obj_is_kind_of(mechanism, cCK_MECHANISM))
980
1103
  rb_raise(rb_eArgError, "2nd arg must be a PKCS11::CK_MECHANISM");
981
1104
  m = DATA_PTR(mechanism);
982
- rv = func(NUM2HANDLE(session), m);
1105
+ CallFunction(C_DigestInit, func, rv, NUM2HANDLE(session), m);
983
1106
  if(rv != CKR_OK) pkcs11_raise(rv);
984
1107
 
985
1108
  return self;
@@ -1009,7 +1132,7 @@ pkcs11_C_DigestKey(VALUE self, VALUE session, VALUE handle)
1009
1132
  CK_RV rv;
1010
1133
 
1011
1134
  GetFunction(self, C_DigestKey, func);
1012
- rv = func(NUM2HANDLE(session), NUM2HANDLE(handle));
1135
+ CallFunction(C_DigestKey, func, rv, NUM2HANDLE(session), NUM2HANDLE(handle));
1013
1136
  if(rv != CKR_OK) pkcs11_raise(rv);
1014
1137
 
1015
1138
  return self;
@@ -1068,7 +1191,7 @@ pkcs11_C_GenerateKey(VALUE self, VALUE session, VALUE mechanism, VALUE template)
1068
1191
  rb_raise(rb_eArgError, "2nd arg must be a PKCS11::CK_MECHANISM");
1069
1192
  m = DATA_PTR(mechanism);
1070
1193
  tmp = pkcs11_attr_ary2buf(template);
1071
- rv = func(NUM2HANDLE(session), m, tmp, RARRAY_LEN(template), &handle);
1194
+ CallFunction(C_GenerateKey, func, rv, NUM2HANDLE(session), m, tmp, RARRAY_LEN(template), &handle);
1072
1195
  free(tmp);
1073
1196
  if(rv != CKR_OK) pkcs11_raise(rv);
1074
1197
 
@@ -1091,7 +1214,8 @@ pkcs11_C_GenerateKeyPair(VALUE self, VALUE session, VALUE mechanism, VALUE pubke
1091
1214
  m = DATA_PTR(mechanism);
1092
1215
  pubkey_tmp = pkcs11_attr_ary2buf(pubkey_template);
1093
1216
  privkey_tmp = pkcs11_attr_ary2buf(privkey_template);
1094
- rv = func(NUM2HANDLE(session), m,
1217
+
1218
+ CallFunction(C_GenerateKeyPair, func, rv, NUM2HANDLE(session), m,
1095
1219
  pubkey_tmp, RARRAY_LEN(pubkey_template),
1096
1220
  privkey_tmp, RARRAY_LEN(privkey_template),
1097
1221
  &pubkey_handle, &privkey_handle);
@@ -1119,7 +1243,7 @@ pkcs11_C_WrapKey(VALUE self, VALUE session, VALUE mechanism, VALUE wrapping, VAL
1119
1243
  rb_raise(rb_eArgError, "2nd arg must be a PKCS11::CK_MECHANISM");
1120
1244
  m = DATA_PTR(mechanism);
1121
1245
  if (NIL_P(size)){
1122
- rv = func(NUM2HANDLE(session), m,
1246
+ CallFunction(C_WrapKey, func, rv, NUM2HANDLE(session), m,
1123
1247
  NUM2HANDLE(wrapping), NUM2HANDLE(wrapped),
1124
1248
  (CK_BYTE_PTR)NULL_PTR, &sz);
1125
1249
  if(rv != CKR_OK) pkcs11_raise(rv);
@@ -1128,7 +1252,7 @@ pkcs11_C_WrapKey(VALUE self, VALUE session, VALUE mechanism, VALUE wrapping, VAL
1128
1252
  }
1129
1253
  buf = rb_str_new(0, sz);
1130
1254
 
1131
- rv = func(NUM2HANDLE(session), m,
1255
+ CallFunction(C_WrapKey, func, rv, NUM2HANDLE(session), m,
1132
1256
  NUM2HANDLE(wrapping), NUM2HANDLE(wrapped),
1133
1257
  (CK_BYTE_PTR)RSTRING_PTR(buf), &sz);
1134
1258
  if(rv != CKR_OK) pkcs11_raise(rv);
@@ -1151,7 +1275,7 @@ pkcs11_C_UnwrapKey(VALUE self, VALUE session, VALUE mechanism, VALUE wrapping, V
1151
1275
  rb_raise(rb_eArgError, "2nd arg must be a PKCS11::CK_MECHANISM");
1152
1276
  m = DATA_PTR(mechanism);
1153
1277
  tmp = pkcs11_attr_ary2buf(template);
1154
- rv = func(NUM2HANDLE(session), m, NUM2HANDLE(wrapping),
1278
+ CallFunction(C_UnwrapKey, func, rv, NUM2HANDLE(session), m, NUM2HANDLE(wrapping),
1155
1279
  (CK_BYTE_PTR)RSTRING_PTR(wrapped), RSTRING_LEN(wrapped),
1156
1280
  tmp, RARRAY_LEN(template), &h);
1157
1281
  free(tmp);
@@ -1174,7 +1298,7 @@ pkcs11_C_DeriveKey(VALUE self, VALUE session, VALUE mechanism, VALUE base, VALUE
1174
1298
  rb_raise(rb_eArgError, "2nd arg must be a PKCS11::CK_MECHANISM");
1175
1299
  m = DATA_PTR(mechanism);
1176
1300
  tmp = pkcs11_attr_ary2buf(template);
1177
- rv = func(NUM2HANDLE(session), m, NUM2HANDLE(base),
1301
+ CallFunction(C_DeriveKey, func, rv, NUM2HANDLE(session), m, NUM2HANDLE(base),
1178
1302
  tmp, RARRAY_LEN(template), &h);
1179
1303
  free(tmp);
1180
1304
  if(rv != CKR_OK) pkcs11_raise(rv);
@@ -1241,6 +1365,10 @@ ck_attr_initialize(int argc, VALUE *argv, VALUE self)
1241
1365
  return self;
1242
1366
  }
1243
1367
 
1368
+ /* rb_define_method(cCK_ATTRIBUTE, "type", ck_attr_type, 0); */
1369
+ /*
1370
+ * @return [Integer] attribute type PKCS11::CKA_*
1371
+ */
1244
1372
  static VALUE
1245
1373
  ck_attr_type(VALUE self)
1246
1374
  {
@@ -1249,6 +1377,11 @@ ck_attr_type(VALUE self)
1249
1377
  return ULONG2NUM(attr->type);
1250
1378
  }
1251
1379
 
1380
+ /* rb_define_method(cCK_ATTRIBUTE, "value", ck_attr_value, 0); */
1381
+ /*
1382
+ * @return [String, Integer, Boolean] attribute value
1383
+ * @see PKCS11::Object#[]
1384
+ */
1252
1385
  static VALUE
1253
1386
  ck_attr_value(VALUE self)
1254
1387
  {
@@ -1296,6 +1429,11 @@ ck_attr_value(VALUE self)
1296
1429
  case CKA_PIXEL_X:
1297
1430
  case CKA_PIXEL_Y:
1298
1431
  case CKA_RESOLUTION:
1432
+ case CKA_VALUE_LEN:
1433
+ case CKA_MODULUS_BITS:
1434
+ case CKA_PRIME_BITS:
1435
+ case CKA_SUBPRIME_BITS:
1436
+ case CKA_VALUE_BITS:
1299
1437
  if (attr->ulValueLen == sizeof(CK_ULONG))
1300
1438
  return ULONG2NUM(*(CK_ULONG_PTR)(attr->pValue));
1301
1439
  break;
@@ -1340,25 +1478,79 @@ set_ulong(VALUE obj, VALUE value, off_t offset)
1340
1478
  }
1341
1479
 
1342
1480
  static VALUE
1343
- get_version(VALUE obj, off_t offset)
1481
+ get_byte(VALUE obj, off_t offset)
1344
1482
  {
1345
1483
  char *ptr = (char*)DATA_PTR(obj);
1346
- CK_VERSION_PTR v;
1347
- char buf[64];
1348
- v = (CK_VERSION_PTR)(ptr+offset);
1349
- snprintf(buf, sizeof(buf), "%d.%d", v->major, v->minor);
1350
- return rb_str_new2(buf);
1484
+ return ULONG2NUM(*(CK_BYTE_PTR)(ptr+offset));
1351
1485
  }
1352
1486
 
1353
1487
  static VALUE
1354
- set_version(VALUE obj, VALUE value, off_t offset)
1488
+ set_byte(VALUE obj, VALUE value, off_t offset)
1355
1489
  {
1356
- rb_notimplement();
1357
- return Qnil;
1490
+ char *ptr = (char*)DATA_PTR(obj);
1491
+ *(CK_BYTE_PTR)(ptr+offset) = NUM2ULONG(value);
1492
+ return value;
1493
+ }
1494
+
1495
+ static VALUE
1496
+ get_ulong_ptr(VALUE obj, off_t offset)
1497
+ {
1498
+ char *ptr = (char*)DATA_PTR(obj);
1499
+ CK_ULONG_PTR p = *(CK_ULONG_PTR *)(ptr+offset);
1500
+ if (!p) return Qnil;
1501
+ return ULONG2NUM(*p);
1502
+ }
1503
+
1504
+ static VALUE
1505
+ set_ulong_ptr(VALUE obj, VALUE value, const char *name, off_t offset)
1506
+ {
1507
+ CK_ULONG_PTR *ptr = (CK_ULONG_PTR *)((char*)DATA_PTR(obj) + offset);
1508
+ if (NIL_P(value)){
1509
+ rb_iv_set(obj, name, value);
1510
+ *ptr = NULL_PTR;
1511
+ return value;
1512
+ }
1513
+ VALUE new_obj = Data_Make_Struct(rb_cInteger, CK_ULONG, 0, free, *ptr);
1514
+ rb_iv_set(obj, name, new_obj);
1515
+ **ptr = NUM2ULONG(value);
1516
+ return value;
1517
+ }
1518
+
1519
+ static VALUE
1520
+ get_handle(VALUE obj, off_t offset)
1521
+ {
1522
+ char *ptr = (char*)DATA_PTR(obj);
1523
+ return HANDLE2NUM(*(CK_OBJECT_HANDLE_PTR)(ptr+offset));
1358
1524
  }
1359
1525
 
1360
1526
  static VALUE
1361
- get_string_ptr(VALUE obj, char *name, off_t offset)
1527
+ set_handle(VALUE obj, VALUE value, off_t offset)
1528
+ {
1529
+ char *ptr = (char*)DATA_PTR(obj);
1530
+ *(CK_OBJECT_HANDLE_PTR)(ptr+offset) = NUM2HANDLE(value);
1531
+ return value;
1532
+ }
1533
+
1534
+ static VALUE
1535
+ get_bool(VALUE obj, off_t offset)
1536
+ {
1537
+ char *ptr = (char*)DATA_PTR(obj);
1538
+ if(*(CK_BBOOL*)(ptr+offset)) return Qtrue;
1539
+ else return Qfalse;
1540
+ }
1541
+
1542
+ static VALUE
1543
+ set_bool(VALUE obj, VALUE value, off_t offset)
1544
+ {
1545
+ char *ptr = (char*)DATA_PTR(obj);
1546
+ if(value == Qfalse) *(CK_BBOOL*)(ptr+offset) = 0;
1547
+ else if(value == Qtrue) *(CK_BBOOL*)(ptr+offset) = 1;
1548
+ else rb_raise(rb_eArgError, "arg must be true or false");
1549
+ return value;
1550
+ }
1551
+
1552
+ static VALUE
1553
+ get_string_ptr(VALUE obj, const char *name, off_t offset)
1362
1554
  {
1363
1555
  char *ptr = (char*)DATA_PTR(obj);
1364
1556
  char *p = *(char**)(ptr+offset);
@@ -1367,17 +1559,91 @@ get_string_ptr(VALUE obj, char *name, off_t offset)
1367
1559
  }
1368
1560
 
1369
1561
  static VALUE
1370
- set_string_ptr(VALUE obj, VALUE value, char *name, off_t offset)
1562
+ set_string_ptr(VALUE obj, VALUE value, const char *name, off_t offset)
1371
1563
  {
1372
1564
  char *ptr = (char*)DATA_PTR(obj);
1565
+ if (NIL_P(value)){
1566
+ rb_iv_set(obj, name, value);
1567
+ *(CK_VOID_PTR*)(ptr+offset) = NULL_PTR;
1568
+ return value;
1569
+ }
1570
+ StringValue(value);
1571
+ value = rb_obj_freeze(rb_str_dup(value));
1373
1572
  rb_iv_set(obj, name, value);
1573
+ *(CK_VOID_PTR*)(ptr+offset) = RSTRING_PTR(value);
1574
+ return value;
1575
+ }
1576
+
1577
+ static VALUE
1578
+ get_string_ptr_len(VALUE obj, const char *name, off_t offset, off_t offset_len)
1579
+ {
1580
+ unsigned long l;
1581
+ char *ptr = (char*)DATA_PTR(obj);
1582
+ char *p = *(char**)(ptr+offset);
1583
+ if (!p) return Qnil;
1584
+ l = *(unsigned long*)(ptr+offset_len);
1585
+ return rb_str_new(p, l);
1586
+ }
1587
+
1588
+ static VALUE
1589
+ set_string_ptr_len(VALUE obj, VALUE value, const char *name, off_t offset, off_t offset_len)
1590
+ {
1591
+ char *ptr = (char*)DATA_PTR(obj);
1374
1592
  if (NIL_P(value)){
1593
+ rb_iv_set(obj, name, value);
1375
1594
  *(CK_VOID_PTR*)(ptr+offset) = NULL_PTR;
1595
+ *(unsigned long*)(ptr+offset_len) = 0;
1376
1596
  return value;
1377
1597
  }
1378
1598
  StringValue(value);
1379
1599
  value = rb_obj_freeze(rb_str_dup(value));
1600
+ rb_iv_set(obj, name, value);
1380
1601
  *(CK_VOID_PTR*)(ptr+offset) = RSTRING_PTR(value);
1602
+ *(unsigned long*)(ptr+offset_len) = RSTRING_LEN(value);
1603
+ return value;
1604
+ }
1605
+
1606
+ static VALUE
1607
+ get_struct_inline(VALUE obj, VALUE klass, const char *name, off_t offset)
1608
+ {
1609
+ char *ptr = (char*)DATA_PTR(obj) + offset;
1610
+ VALUE inline_obj = Data_Wrap_Struct(klass, 0, 0, ptr);
1611
+ rb_iv_set(inline_obj, name, obj);
1612
+ return inline_obj;
1613
+ }
1614
+
1615
+ static VALUE
1616
+ set_struct_inline(VALUE obj, VALUE klass, const char *struct_name, VALUE value, const char *name, off_t offset, int sizeofstruct)
1617
+ {
1618
+ char *ptr = (char*)DATA_PTR(obj) + offset;
1619
+ if (!rb_obj_is_kind_of(value, klass))
1620
+ rb_raise(rb_eArgError, "arg must be a PKCS11::%s", struct_name);
1621
+ memcpy(ptr, DATA_PTR(value), sizeofstruct);
1622
+ return value;
1623
+ }
1624
+
1625
+ static VALUE
1626
+ get_struct_ptr(VALUE obj, VALUE klass, const char *name, off_t offset)
1627
+ {
1628
+ char *ptr = (char*)DATA_PTR(obj);
1629
+ char *p = *(char**)(ptr+offset);
1630
+ if (!p) return Qnil;
1631
+ return rb_iv_get(obj, name);
1632
+ }
1633
+
1634
+ static VALUE
1635
+ set_struct_ptr(VALUE obj, VALUE klass, const char *struct_name, VALUE value, const char *name, off_t offset)
1636
+ {
1637
+ char *ptr = (char*)DATA_PTR(obj) + offset;
1638
+ if (NIL_P(value)){
1639
+ rb_iv_set(obj, name, value);
1640
+ *(CK_VOID_PTR*)ptr = NULL_PTR;
1641
+ return value;
1642
+ }
1643
+ if (!rb_obj_is_kind_of(value, klass))
1644
+ rb_raise(rb_eArgError, "arg must be a PKCS11::%s", struct_name);
1645
+ *(CK_VOID_PTR*)ptr = DATA_PTR(value);
1646
+ rb_iv_set(obj, name, value);
1381
1647
  return value;
1382
1648
  }
1383
1649
 
@@ -1388,10 +1654,20 @@ set_string_ptr(VALUE obj, VALUE value, char *name, off_t offset)
1388
1654
  static VALUE s##_s_alloc(VALUE self){ \
1389
1655
  s *info; \
1390
1656
  VALUE obj = Data_Make_Struct(self, s, 0, -1, info); \
1391
- memset(info, 0, sizeof(s)); \
1392
1657
  return obj; \
1658
+ } \
1659
+ static VALUE c##s##_to_s(VALUE self){ \
1660
+ return rb_str_new(DATA_PTR(self), sizeof(s)); \
1661
+ } \
1662
+ static VALUE c##s##_members(VALUE self){ \
1663
+ return a##s##_members; \
1393
1664
  }
1394
1665
 
1666
+ #define PKCS11_IMPLEMENT_STRUCT_WITH_ALLOCATOR(s) \
1667
+ static VALUE c##s;\
1668
+ static VALUE a##s##_members;\
1669
+ PKCS11_IMPLEMENT_ALLOCATOR(s);
1670
+
1395
1671
  #define PKCS11_IMPLEMENT_STRING_ACCESSOR(s, f) \
1396
1672
  static VALUE c##s##_get_##f(VALUE o){ \
1397
1673
  return get_string(o, OFFSET_OF(s, f), SIZE_OF(s, f)); \
@@ -1408,12 +1684,36 @@ static VALUE c##s##_set_##f(VALUE o, VALUE v){ \
1408
1684
  return set_ulong(o, v, OFFSET_OF(s, f)); \
1409
1685
  }
1410
1686
 
1411
- #define PKCS11_IMPLEMENT_VERSION_ACCESSOR(s, f) \
1687
+ #define PKCS11_IMPLEMENT_BYTE_ACCESSOR(s, f) \
1412
1688
  static VALUE c##s##_get_##f(VALUE o){ \
1413
- return get_version(o, OFFSET_OF(s, f)); \
1689
+ return get_byte(o, OFFSET_OF(s, f)); \
1414
1690
  } \
1415
1691
  static VALUE c##s##_set_##f(VALUE o, VALUE v){ \
1416
- return set_version(o, v, OFFSET_OF(s, f)); \
1692
+ return set_byte(o, v, OFFSET_OF(s, f)); \
1693
+ }
1694
+
1695
+ #define PKCS11_IMPLEMENT_ULONG_PTR_ACCESSOR(s, f) \
1696
+ static VALUE c##s##_get_##f(VALUE o){ \
1697
+ return get_ulong_ptr(o, OFFSET_OF(s, f)); \
1698
+ } \
1699
+ static VALUE c##s##_set_##f(VALUE o, VALUE v){ \
1700
+ return set_ulong_ptr(o, v, #f, OFFSET_OF(s, f)); \
1701
+ }
1702
+
1703
+ #define PKCS11_IMPLEMENT_HANDLE_ACCESSOR(s, f) \
1704
+ static VALUE c##s##_get_##f(VALUE o){ \
1705
+ return get_handle(o, OFFSET_OF(s, f)); \
1706
+ } \
1707
+ static VALUE c##s##_set_##f(VALUE o, VALUE v){ \
1708
+ return set_handle(o, v, OFFSET_OF(s, f)); \
1709
+ }
1710
+
1711
+ #define PKCS11_IMPLEMENT_BOOL_ACCESSOR(s, f) \
1712
+ static VALUE c##s##_get_##f(VALUE o){ \
1713
+ return get_bool(o, OFFSET_OF(s, f)); \
1714
+ } \
1715
+ static VALUE c##s##_set_##f(VALUE o, VALUE v){ \
1716
+ return set_bool(o, v, OFFSET_OF(s, f)); \
1417
1717
  }
1418
1718
 
1419
1719
  #define PKCS11_IMPLEMENT_STRING_PTR_ACCESSOR(s, f) \
@@ -1424,61 +1724,43 @@ static VALUE c##s##_set_##f(VALUE o, VALUE v){ \
1424
1724
  return set_string_ptr(o, v, #f, OFFSET_OF(s, f)); \
1425
1725
  }
1426
1726
 
1727
+ #define PKCS11_IMPLEMENT_STRING_PTR_LEN_ACCESSOR(s, f, l) \
1728
+ static VALUE c##s##_get_##f(VALUE o){ \
1729
+ return get_string_ptr_len(o, #f, OFFSET_OF(s, f), OFFSET_OF(s, l)); \
1730
+ } \
1731
+ static VALUE c##s##_set_##f(VALUE o, VALUE v){ \
1732
+ return set_string_ptr_len(o, v, #f, OFFSET_OF(s, f), OFFSET_OF(s, l)); \
1733
+ }
1734
+
1735
+ #define PKCS11_IMPLEMENT_STRUCT_ACCESSOR(s, k, f) \
1736
+ static VALUE c##s##_get_##f(VALUE o){ \
1737
+ return get_struct_inline(o, c##k, #f, OFFSET_OF(s, f)); \
1738
+ } \
1739
+ static VALUE c##s##_set_##f(VALUE o, VALUE v){ \
1740
+ return set_struct_inline(o, c##k, #k, v, #f, OFFSET_OF(s, f), sizeof(k)); \
1741
+ }
1742
+
1743
+ #define PKCS11_IMPLEMENT_STRUCT_PTR_ACCESSOR(s, k, f) \
1744
+ static VALUE c##s##_get_##f(VALUE o){ \
1745
+ return get_struct_ptr(o, c##k, #f, OFFSET_OF(s, f)); \
1746
+ } \
1747
+ static VALUE c##s##_set_##f(VALUE o, VALUE v){ \
1748
+ return set_struct_ptr(o, c##k, #k, v, #f, OFFSET_OF(s, f)); \
1749
+ }
1750
+
1427
1751
  ///////////////////////////////////////
1428
1752
 
1429
- PKCS11_IMPLEMENT_ALLOCATOR(CK_C_INITIALIZE_ARGS)
1430
- PKCS11_IMPLEMENT_ULONG_ACCESSOR(CK_C_INITIALIZE_ARGS, flags)
1431
- PKCS11_IMPLEMENT_STRING_PTR_ACCESSOR(CK_C_INITIALIZE_ARGS, pReserved)
1432
-
1433
- PKCS11_IMPLEMENT_ALLOCATOR(CK_INFO)
1434
- PKCS11_IMPLEMENT_VERSION_ACCESSOR(CK_INFO, cryptokiVersion)
1435
- PKCS11_IMPLEMENT_STRING_ACCESSOR(CK_INFO, manufacturerID)
1436
- PKCS11_IMPLEMENT_ULONG_ACCESSOR(CK_INFO, flags)
1437
- PKCS11_IMPLEMENT_STRING_ACCESSOR(CK_INFO, libraryDescription)
1438
- PKCS11_IMPLEMENT_VERSION_ACCESSOR(CK_INFO, libraryVersion)
1439
-
1440
- PKCS11_IMPLEMENT_ALLOCATOR(CK_SLOT_INFO)
1441
- PKCS11_IMPLEMENT_STRING_ACCESSOR(CK_SLOT_INFO, slotDescription)
1442
- PKCS11_IMPLEMENT_STRING_ACCESSOR(CK_SLOT_INFO, manufacturerID)
1443
- PKCS11_IMPLEMENT_ULONG_ACCESSOR(CK_SLOT_INFO, flags)
1444
- PKCS11_IMPLEMENT_VERSION_ACCESSOR(CK_SLOT_INFO, hardwareVersion)
1445
- PKCS11_IMPLEMENT_VERSION_ACCESSOR(CK_SLOT_INFO, firmwareVersion)
1446
-
1447
- PKCS11_IMPLEMENT_ALLOCATOR(CK_TOKEN_INFO);
1448
- PKCS11_IMPLEMENT_STRING_ACCESSOR(CK_TOKEN_INFO, label);
1449
- PKCS11_IMPLEMENT_STRING_ACCESSOR(CK_TOKEN_INFO, manufacturerID);
1450
- PKCS11_IMPLEMENT_STRING_ACCESSOR(CK_TOKEN_INFO, model);
1451
- PKCS11_IMPLEMENT_STRING_ACCESSOR(CK_TOKEN_INFO, serialNumber);
1452
- PKCS11_IMPLEMENT_ULONG_ACCESSOR(CK_TOKEN_INFO, flags);
1453
- PKCS11_IMPLEMENT_ULONG_ACCESSOR(CK_TOKEN_INFO, ulMaxSessionCount);
1454
- PKCS11_IMPLEMENT_ULONG_ACCESSOR(CK_TOKEN_INFO, ulSessionCount);
1455
- PKCS11_IMPLEMENT_ULONG_ACCESSOR(CK_TOKEN_INFO, ulMaxRwSessionCount);
1456
- PKCS11_IMPLEMENT_ULONG_ACCESSOR(CK_TOKEN_INFO, ulRwSessionCount);
1457
- PKCS11_IMPLEMENT_ULONG_ACCESSOR(CK_TOKEN_INFO, ulMaxPinLen);
1458
- PKCS11_IMPLEMENT_ULONG_ACCESSOR(CK_TOKEN_INFO, ulMinPinLen);
1459
- PKCS11_IMPLEMENT_ULONG_ACCESSOR(CK_TOKEN_INFO, ulTotalPublicMemory);
1460
- PKCS11_IMPLEMENT_ULONG_ACCESSOR(CK_TOKEN_INFO, ulFreePublicMemory);
1461
- PKCS11_IMPLEMENT_ULONG_ACCESSOR(CK_TOKEN_INFO, ulTotalPrivateMemory);
1462
- PKCS11_IMPLEMENT_ULONG_ACCESSOR(CK_TOKEN_INFO, ulFreePrivateMemory);
1463
- PKCS11_IMPLEMENT_VERSION_ACCESSOR(CK_TOKEN_INFO, hardwareVersion);
1464
- PKCS11_IMPLEMENT_VERSION_ACCESSOR(CK_TOKEN_INFO, firmwareVersion);
1465
- PKCS11_IMPLEMENT_STRING_ACCESSOR(CK_TOKEN_INFO, utcTime);
1466
-
1467
- PKCS11_IMPLEMENT_ALLOCATOR(CK_MECHANISM_INFO);
1468
- PKCS11_IMPLEMENT_ULONG_ACCESSOR(CK_MECHANISM_INFO, ulMinKeySize);
1469
- PKCS11_IMPLEMENT_ULONG_ACCESSOR(CK_MECHANISM_INFO, ulMaxKeySize);
1470
- PKCS11_IMPLEMENT_ULONG_ACCESSOR(CK_MECHANISM_INFO, flags);
1471
-
1472
- PKCS11_IMPLEMENT_ALLOCATOR(CK_SESSION_INFO);
1473
- PKCS11_IMPLEMENT_ULONG_ACCESSOR(CK_SESSION_INFO, slotID);
1474
- PKCS11_IMPLEMENT_ULONG_ACCESSOR(CK_SESSION_INFO, state);
1475
- PKCS11_IMPLEMENT_ULONG_ACCESSOR(CK_SESSION_INFO, flags);
1476
- PKCS11_IMPLEMENT_ULONG_ACCESSOR(CK_SESSION_INFO, ulDeviceError);
1753
+ #include "pk11_struct_impl.inc"
1477
1754
 
1478
1755
  ///////////////////////////////////////
1479
1756
 
1480
1757
  PKCS11_IMPLEMENT_ALLOCATOR(CK_MECHANISM)
1481
1758
 
1759
+ /*
1760
+ * Spezifies a particularly crypto mechanism.
1761
+ * @param [Integer, nil] mechanism The mechanism to use (PKCS11::CKM_*)
1762
+ * @param [String, Integer, PKCS11::CStruct, nil] pParameter optional parameter to the mechanism
1763
+ */
1482
1764
  static VALUE
1483
1765
  cCK_MECHANISM_initialize(int argc, VALUE *argv, VALUE self)
1484
1766
  {
@@ -1491,8 +1773,13 @@ cCK_MECHANISM_initialize(int argc, VALUE *argv, VALUE self)
1491
1773
  return self;
1492
1774
  }
1493
1775
 
1776
+ /* rb_define_method(cCK_MECHANISM, "mechanism", cCK_MECHANISM_get_mechanism, 0); */
1777
+ /* rb_define_method(cCK_MECHANISM, "mechanism=", cCK_MECHANISM_set_mechanism, 0); */
1494
1778
  PKCS11_IMPLEMENT_ULONG_ACCESSOR(CK_MECHANISM, mechanism);
1495
1779
 
1780
+ /* rb_define_method(cCK_MECHANISM, "pParameter", cCK_MECHANISM_get_pParameter, 0); */
1781
+ /* rb_define_method(cCK_MECHANISM, "pParameter=", cCK_MECHANISM_set_pParameter, 0); */
1782
+ /* @see PKCS11::CK_MECHANISM#initialize */
1496
1783
  static VALUE
1497
1784
  cCK_MECHANISM_get_pParameter(VALUE self)
1498
1785
  {
@@ -1505,17 +1792,32 @@ static VALUE
1505
1792
  cCK_MECHANISM_set_pParameter(VALUE self, VALUE value)
1506
1793
  {
1507
1794
  CK_MECHANISM_PTR m = DATA_PTR(self);
1795
+ CK_ULONG ulong_val;
1508
1796
 
1509
- if (NIL_P(value)){
1797
+ switch(TYPE(value)){
1798
+ case T_NIL:
1510
1799
  m->pParameter = NULL_PTR;
1511
1800
  m->ulParameterLen = 0;
1512
- }
1513
- else{
1514
- StringValue(value);
1801
+ break;
1802
+ case T_STRING:
1515
1803
  value = rb_obj_freeze(rb_str_dup(value));
1516
1804
  m->pParameter = RSTRING_PTR(value);
1517
1805
  m->ulParameterLen = RSTRING_LEN(value);
1806
+ break;
1807
+ case T_FIXNUM:
1808
+ ulong_val = NUM2ULONG(value);
1809
+ value = rb_obj_freeze(rb_str_new((char*)&ulong_val, sizeof(ulong_val)));
1810
+ m->pParameter = RSTRING_PTR(value);
1811
+ m->ulParameterLen = RSTRING_LEN(value);
1812
+ break;
1813
+ case T_DATA:
1814
+ m->pParameter = DATA_PTR(value);
1815
+ m->ulParameterLen = NUM2LONG(rb_const_get(rb_funcall(value, rb_intern("class"), 0), rb_intern("SIZEOF_STRUCT")));
1816
+ break;
1817
+ default:
1818
+ rb_raise(rb_eArgError, "invalid argument");
1518
1819
  }
1820
+ /* don't GC the value as long as this object is active */
1519
1821
  rb_iv_set(self, "pParameter", value);
1520
1822
 
1521
1823
  return value;
@@ -1528,16 +1830,22 @@ cCK_MECHANISM_set_pParameter(VALUE self, VALUE value)
1528
1830
 
1529
1831
  #define PKCS11_DEFINE_STRUCT(s) \
1530
1832
  do { \
1531
- c##s = rb_define_class_under(mPKCS11, #s, rb_cObject); \
1833
+ c##s = rb_define_class_under(mPKCS11, #s, cCStruct); \
1834
+ a##s##_members = rb_ary_new(); \
1532
1835
  rb_define_alloc_func(c##s, s##_s_alloc); \
1836
+ rb_define_const(c##s, "SIZEOF_STRUCT", ULONG2NUM(sizeof(s))); \
1837
+ rb_define_method(c##s, "to_s", c##s##_to_s, 0); \
1838
+ rb_define_method(c##s, "members", c##s##_members, 0); \
1839
+ rb_iv_set(c##s, "members", a##s##_members); \
1533
1840
  } while(0)
1534
1841
 
1535
1842
  #define PKCS11_DEFINE_MEMBER(s, f) \
1536
1843
  do { \
1537
1844
  rb_define_method(c##s, #f, c##s##_get_##f, 0); \
1538
1845
  rb_define_method(c##s, #f "=", c##s##_set_##f, 1); \
1846
+ rb_ary_push(a##s##_members, rb_str_new2(#f)); \
1539
1847
  } while(0)
1540
-
1848
+
1541
1849
  void
1542
1850
  Init_pkcs11_ext()
1543
1851
  {
@@ -1547,17 +1855,23 @@ Init_pkcs11_ext()
1547
1855
 
1548
1856
  /* Document-method: PKCS11.open
1549
1857
  *
1550
- * Alias function for PKCS11::Library.new
1858
+ * Alias function for {PKCS11::Library#initialize}
1551
1859
  */
1552
1860
  rb_define_module_function(mPKCS11, "open", pkcs11_library_new, -1);
1553
-
1861
+
1554
1862
  /* Library version */
1555
1863
  rb_define_const( mPKCS11, "VERSION", rb_str_new2(VERSION) );
1556
-
1864
+
1865
+ /* Document-class: PKCS11::Error
1866
+ *
1867
+ * Base class for all Cryptoki exceptions (CKR_*) */
1557
1868
  ePKCS11Error = rb_define_class_under(mPKCS11, "Error", rb_eStandardError);
1558
1869
  rb_define_alloc_func(cPKCS11, pkcs11_s_alloc);
1559
1870
  rb_define_method(cPKCS11, "initialize", pkcs11_initialize, -1);
1560
1871
 
1872
+ PKCS11_DEFINE_METHOD(load_library, 1);
1873
+ PKCS11_DEFINE_METHOD(C_GetFunctionList, 0);
1874
+ PKCS11_DEFINE_METHOD(C_Initialize, -1);
1561
1875
  PKCS11_DEFINE_METHOD(C_GetInfo, 0);
1562
1876
  PKCS11_DEFINE_METHOD(C_GetSlotList, 1);
1563
1877
  PKCS11_DEFINE_METHOD(C_GetSlotInfo, 1);
@@ -1578,6 +1892,7 @@ Init_pkcs11_ext()
1578
1892
  PKCS11_DEFINE_METHOD(C_SetPIN, 3);
1579
1893
 
1580
1894
  PKCS11_DEFINE_METHOD(C_CreateObject, 2);
1895
+ PKCS11_DEFINE_METHOD(C_CopyObject, 3);
1581
1896
  PKCS11_DEFINE_METHOD(C_DestroyObject, 2);
1582
1897
  PKCS11_DEFINE_METHOD(C_GetObjectSize, 2);
1583
1898
  PKCS11_DEFINE_METHOD(C_FindObjectsInit, 2);
@@ -1625,12 +1940,11 @@ Init_pkcs11_ext()
1625
1940
 
1626
1941
  PKCS11_DEFINE_METHOD(C_WaitForSlotEvent, 1);
1627
1942
  PKCS11_DEFINE_METHOD(C_Finalize, 0);
1943
+ PKCS11_DEFINE_METHOD(unload_library, 0);
1628
1944
 
1629
1945
  ///////////////////////////////////////
1630
1946
 
1631
- PKCS11_DEFINE_STRUCT(CK_C_INITIALIZE_ARGS);
1632
- PKCS11_DEFINE_MEMBER(CK_C_INITIALIZE_ARGS, flags);
1633
- PKCS11_DEFINE_MEMBER(CK_C_INITIALIZE_ARGS, pReserved);
1947
+ cCStruct = rb_define_class_under(mPKCS11, "CStruct", rb_cObject);
1634
1948
 
1635
1949
  cCK_ATTRIBUTE = rb_define_class_under(mPKCS11, "CK_ATTRIBUTE", rb_cObject);
1636
1950
  rb_define_alloc_func(cCK_ATTRIBUTE, ck_attr_s_alloc);
@@ -1638,100 +1952,16 @@ Init_pkcs11_ext()
1638
1952
  rb_define_method(cCK_ATTRIBUTE, "type", ck_attr_type, 0);
1639
1953
  rb_define_method(cCK_ATTRIBUTE, "value", ck_attr_value, 0);
1640
1954
 
1641
- PKCS11_DEFINE_STRUCT(CK_INFO);
1642
- PKCS11_DEFINE_MEMBER(CK_INFO, cryptokiVersion);
1643
- PKCS11_DEFINE_MEMBER(CK_INFO, manufacturerID);
1644
- PKCS11_DEFINE_MEMBER(CK_INFO, flags);
1645
- PKCS11_DEFINE_MEMBER(CK_INFO, libraryDescription);
1646
- PKCS11_DEFINE_MEMBER(CK_INFO, libraryVersion);
1647
-
1648
- PKCS11_DEFINE_STRUCT(CK_SLOT_INFO);
1649
- PKCS11_DEFINE_MEMBER(CK_SLOT_INFO, slotDescription);
1650
- PKCS11_DEFINE_MEMBER(CK_SLOT_INFO, manufacturerID);
1651
- PKCS11_DEFINE_MEMBER(CK_SLOT_INFO, flags);
1652
- PKCS11_DEFINE_MEMBER(CK_SLOT_INFO, hardwareVersion);
1653
- PKCS11_DEFINE_MEMBER(CK_SLOT_INFO, firmwareVersion);
1654
-
1655
- PKCS11_DEFINE_STRUCT(CK_TOKEN_INFO);
1656
- PKCS11_DEFINE_MEMBER(CK_TOKEN_INFO, label);
1657
- PKCS11_DEFINE_MEMBER(CK_TOKEN_INFO, manufacturerID);
1658
- PKCS11_DEFINE_MEMBER(CK_TOKEN_INFO, model);
1659
- PKCS11_DEFINE_MEMBER(CK_TOKEN_INFO, serialNumber);
1660
- PKCS11_DEFINE_MEMBER(CK_TOKEN_INFO, flags);
1661
- PKCS11_DEFINE_MEMBER(CK_TOKEN_INFO, ulMaxSessionCount);
1662
- PKCS11_DEFINE_MEMBER(CK_TOKEN_INFO, ulSessionCount);
1663
- PKCS11_DEFINE_MEMBER(CK_TOKEN_INFO, ulMaxRwSessionCount);
1664
- PKCS11_DEFINE_MEMBER(CK_TOKEN_INFO, ulRwSessionCount);
1665
- PKCS11_DEFINE_MEMBER(CK_TOKEN_INFO, ulMaxPinLen);
1666
- PKCS11_DEFINE_MEMBER(CK_TOKEN_INFO, ulMinPinLen);
1667
- PKCS11_DEFINE_MEMBER(CK_TOKEN_INFO, ulTotalPublicMemory);
1668
- PKCS11_DEFINE_MEMBER(CK_TOKEN_INFO, ulFreePublicMemory);
1669
- PKCS11_DEFINE_MEMBER(CK_TOKEN_INFO, ulTotalPrivateMemory);
1670
- PKCS11_DEFINE_MEMBER(CK_TOKEN_INFO, ulFreePrivateMemory);
1671
- PKCS11_DEFINE_MEMBER(CK_TOKEN_INFO, hardwareVersion);
1672
- PKCS11_DEFINE_MEMBER(CK_TOKEN_INFO, firmwareVersion);
1673
- PKCS11_DEFINE_MEMBER(CK_TOKEN_INFO, utcTime);
1674
-
1675
- PKCS11_DEFINE_STRUCT(CK_MECHANISM_INFO);
1676
- PKCS11_DEFINE_MEMBER(CK_MECHANISM_INFO, ulMinKeySize);
1677
- PKCS11_DEFINE_MEMBER(CK_MECHANISM_INFO, ulMaxKeySize);
1678
- PKCS11_DEFINE_MEMBER(CK_MECHANISM_INFO, flags);
1679
-
1680
- PKCS11_DEFINE_STRUCT(CK_SESSION_INFO);
1681
- PKCS11_DEFINE_MEMBER(CK_SESSION_INFO, slotID);
1682
- PKCS11_DEFINE_MEMBER(CK_SESSION_INFO, state);
1683
- PKCS11_DEFINE_MEMBER(CK_SESSION_INFO, flags);
1684
- PKCS11_DEFINE_MEMBER(CK_SESSION_INFO, ulDeviceError);
1685
-
1955
+ /* Document-class: PKCS11::CK_MECHANISM
1956
+ *
1957
+ * Describes a crypto mechanism CKM_* with optional parameters. */
1958
+ /* cCK_MECHANISM = rb_define_class_under(mPKCS11, "CK_MECHANISM", rb_cObject); */
1686
1959
  PKCS11_DEFINE_STRUCT(CK_MECHANISM);
1687
1960
  rb_define_method(cCK_MECHANISM, "initialize", cCK_MECHANISM_initialize, -1);
1688
1961
  PKCS11_DEFINE_MEMBER(CK_MECHANISM, mechanism);
1689
1962
  PKCS11_DEFINE_MEMBER(CK_MECHANISM, pParameter);
1690
1963
 
1691
- //CK_RSA_PKCS_OAEP_PARAMS
1692
- //CK_RSA_PKCS_PSS_PARAMS
1693
- //CK_AES_CBC_ENCRYPT_DATA_PARAMS
1694
- //CK_AES_CTR_PARAMS
1695
- //CK_ARIA_CBC_ENCRYPT_DATA_PARAMS
1696
- //CK_CAMELLIA_CBC_ENCRYPT_DATA_PARAMS
1697
- //CK_CAMELLIA_CTR_PARAMS
1698
- //CK_CMS_SIG_PARAMS
1699
- //CK_DES_CBC_ENCRYPT_DATA_PARAMS
1700
- //CK_ECDH1_DERIVE_PARAMS
1701
- //CK_ECDH2_DERIVE_PARAMS
1702
- //CK_ECMQV_DERIVE_PARAMS
1703
- //CK_FUNCTION_LIST
1704
- //CK_KEA_DERIVE_PARAMS
1705
- //CK_KEY_DERIVATION_STRING_DATA
1706
- //CK_KEY_WRAP_SET_OAEP_PARAMS
1707
- //CK_KIP_PARAMS
1708
- //CK_OTP_PARAM
1709
- //CK_OTP_PARAMS
1710
- //CK_OTP_SIGNATURE_INFO
1711
- //CK_PBE_PARAMS
1712
- //CK_PKCS5_PBKD2_PARAMS
1713
- //CK_RC2_CBC_PARAMS
1714
- //CK_RC2_MAC_GENERAL_PARAMS
1715
- //CK_RC5_CBC_PARAMS
1716
- //CK_RC5_MAC_GENERAL_PARAMS
1717
- //CK_RC5_PARAMS
1718
- //CK_SKIPJACK_PRIVATE_WRAP_PARAMS
1719
- //CK_SKIPJACK_RELAYX_PARAMS
1720
- //CK_SSL3_KEY_MAT_OUT
1721
- //CK_SSL3_KEY_MAT_PARAMS
1722
- //CK_SSL3_MASTER_KEY_DERIVE_PARAMS
1723
- //CK_SSL3_RANDOM_DATA
1724
- //CK_TLS_PRF_PARAMS
1725
- //CK_WTLS_KEY_MAT_OUT
1726
- //CK_WTLS_KEY_MAT_PARAMS
1727
- //CK_WTLS_MASTER_KEY_DERIVE_PARAMS
1728
- //CK_WTLS_PRF_PARAMS
1729
- //CK_WTLS_RANDOM_DATA
1730
- //CK_X9_42_DH1_DERIVE_PARAMS
1731
- //CK_X9_42_DH2_DERIVE_PARAMS
1732
- //CK_X9_42_MQV_DERIVE_PARAMS
1733
-
1734
- ///////////////////////////////////////
1964
+ #include "pk11_struct_def.inc"
1735
1965
 
1736
- Init_pkcs11_const(mPKCS11);
1966
+ Init_pkcs11_const(mPKCS11, ePKCS11Error);
1737
1967
  }