pkcs11 0.3.4 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/ext/pk11.c CHANGED
@@ -39,10 +39,11 @@ static VALUE aCK_MECHANISM_members;
39
39
 
40
40
  VALUE pkcs11_return_value_to_class(CK_RV, VALUE);
41
41
 
42
+ NORETURN()
42
43
  static void
43
- pkcs11_raise(VALUE self, CK_RV rv)
44
+ pkcs11_raise(VALUE self, CK_RV rv, const char * const func)
44
45
  {
45
- rb_funcall(self, rb_intern("vendor_raise_on_return_value"), 1, ULONG2NUM(rv));
46
+ rb_funcall(self, rb_intern("vendor_raise_on_return_value"), 2, ULONG2NUM(rv), rb_str_new_cstr(func));
46
47
  rb_raise(ePKCS11Error, "method vendor_raise_on_return_value should never return");
47
48
  }
48
49
 
@@ -53,24 +54,6 @@ typedef struct {
53
54
  CK_FUNCTION_LIST_PTR functions;
54
55
  } pkcs11_ctx;
55
56
 
56
- #define GetFunction(obj, name, sval) \
57
- { \
58
- pkcs11_ctx *ctx; \
59
- Data_Get_Struct(obj, pkcs11_ctx, ctx); \
60
- if (!ctx->functions) rb_raise(ePKCS11Error, "no function list"); \
61
- sval = (CK_##name)ctx->functions->name; \
62
- if (!sval) rb_raise(ePKCS11Error, #name " is not supported."); \
63
- }
64
-
65
- #define CallFunction(name, func, rv, ...) \
66
- { \
67
- struct tbr_##name##_params params = { \
68
- func, {__VA_ARGS__}, CKR_FUNCTION_FAILED \
69
- }; \
70
- rb_thread_call_without_gvl(tbf_##name, &params, RUBY_UBF_PROCESS, NULL); \
71
- rv = params.retval; \
72
- }
73
-
74
57
  static void
75
58
  pkcs11_ctx_unload_library(pkcs11_ctx *ctx)
76
59
  {
@@ -84,13 +67,45 @@ pkcs11_ctx_unload_library(pkcs11_ctx *ctx)
84
67
  }
85
68
 
86
69
  static void
87
- pkcs11_ctx_free(pkcs11_ctx *ctx)
70
+ pkcs11_ctx_free(void *_ptr)
88
71
  {
72
+ pkcs11_ctx *ctx = (pkcs11_ctx *)_ptr;
89
73
  if(ctx->functions) ctx->functions->C_Finalize(NULL_PTR);
90
74
  pkcs11_ctx_unload_library(ctx);
91
75
  free(ctx);
92
76
  }
93
77
 
78
+ static size_t
79
+ pkcs11_ctx_memsize(const void *_ptr)
80
+ {
81
+ return sizeof(pkcs11_ctx);
82
+ }
83
+
84
+ const rb_data_type_t pkcs11_ctx_type = {
85
+ "PKCS11::Library",
86
+ {0, pkcs11_ctx_free, pkcs11_ctx_memsize,},
87
+ 0, 0,
88
+ RUBY_TYPED_FREE_IMMEDIATELY,
89
+ };
90
+
91
+ #define GetFunction(obj, name, sval) \
92
+ { \
93
+ pkcs11_ctx *ctx; \
94
+ TypedData_Get_Struct(obj, pkcs11_ctx, &pkcs11_ctx_type, ctx); \
95
+ if (!ctx->functions) rb_raise(ePKCS11Error, "no function list"); \
96
+ sval = (CK_##name)ctx->functions->name; \
97
+ if (!sval) rb_raise(ePKCS11Error, #name " is not supported."); \
98
+ }
99
+
100
+ #define CallFunction(name, func, rv, ...) \
101
+ { \
102
+ struct tbr_##name##_params params = { \
103
+ func, {__VA_ARGS__}, CKR_FUNCTION_FAILED \
104
+ }; \
105
+ rb_thread_call_without_gvl(tbf_##name, &params, RUBY_UBF_PROCESS, NULL); \
106
+ rv = params.retval; \
107
+ }
108
+
94
109
  /* rb_define_method(cPKCS11, "C_Finalize", pkcs11_C_Finalize, 0); */
95
110
  /*
96
111
  * Is called to indicate that an application is finished with the Cryptoki library.
@@ -104,7 +119,7 @@ pkcs11_C_Finalize(VALUE self)
104
119
 
105
120
  GetFunction(self, C_Finalize, func);
106
121
  CallFunction(C_Finalize, func, rv, NULL_PTR);
107
- if (rv != CKR_OK) pkcs11_raise(self,rv);
122
+ if (rv != CKR_OK) pkcs11_raise(self, rv, "C_Finalize");
108
123
 
109
124
  return self;
110
125
  }
@@ -119,7 +134,7 @@ pkcs11_unload_library(VALUE self)
119
134
  {
120
135
  pkcs11_ctx *ctx;
121
136
 
122
- Data_Get_Struct(self, pkcs11_ctx, ctx);
137
+ TypedData_Get_Struct(self, pkcs11_ctx, &pkcs11_ctx_type, ctx);
123
138
  pkcs11_ctx_unload_library(ctx);
124
139
 
125
140
  return self;
@@ -130,7 +145,7 @@ pkcs11_s_alloc(VALUE self)
130
145
  {
131
146
  VALUE obj;
132
147
  pkcs11_ctx *ctx;
133
- obj = Data_Make_Struct(self, pkcs11_ctx, 0, pkcs11_ctx_free, ctx);
148
+ obj = TypedData_Make_Struct(self, pkcs11_ctx, &pkcs11_ctx_type, ctx);
134
149
  return obj;
135
150
  }
136
151
 
@@ -152,18 +167,18 @@ pkcs11_load_library(VALUE self, VALUE path)
152
167
  pkcs11_ctx *ctx;
153
168
 
154
169
  so_path = StringValueCStr(path);
155
- Data_Get_Struct(self, pkcs11_ctx, ctx);
170
+ TypedData_Get_Struct(self, pkcs11_ctx, &pkcs11_ctx_type, ctx);
156
171
  #ifdef compile_for_windows
157
172
  if((ctx->module = LoadLibrary(so_path)) == NULL) {
158
- char error_text[999] = "LoadLibrary() error";
173
+ char error_text[999] = "";
159
174
  FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_MAX_WIDTH_MASK,
160
175
  NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
161
176
  (LPTSTR)&error_text, sizeof(error_text), NULL);
162
- rb_raise(ePKCS11Error, "%s", error_text);
177
+ rb_raise(ePKCS11Error, "LoadLibrary(): %s", error_text);
163
178
  }
164
179
  #else
165
180
  if((ctx->module = dlopen(so_path, RTLD_NOW)) == NULL) {
166
- rb_raise(ePKCS11Error, "%s", dlerror());
181
+ rb_raise(ePKCS11Error, "dlopen(): %s", dlerror());
167
182
  }
168
183
  #endif
169
184
 
@@ -184,22 +199,22 @@ pkcs11_C_GetFunctionList(VALUE self)
184
199
  CK_RV rv;
185
200
  CK_C_GetFunctionList func;
186
201
 
187
- Data_Get_Struct(self, pkcs11_ctx, ctx);
202
+ TypedData_Get_Struct(self, pkcs11_ctx, &pkcs11_ctx_type, ctx);
188
203
  #ifdef compile_for_windows
189
204
  func = (CK_C_GetFunctionList)GetProcAddress(ctx->module, "C_GetFunctionList");
190
205
  if(!func){
191
- char error_text[999] = "GetProcAddress() error";
206
+ char error_text[999] = "";
192
207
  FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_MAX_WIDTH_MASK,
193
208
  NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
194
209
  (LPTSTR)&error_text, sizeof(error_text), NULL);
195
- rb_raise(ePKCS11Error, "%s", error_text);
210
+ rb_raise(ePKCS11Error, "GetProcAddress(): %s", error_text);
196
211
  }
197
212
  #else
198
213
  func = (CK_C_GetFunctionList)dlsym(ctx->module, "C_GetFunctionList");
199
- if(!func) rb_raise(ePKCS11Error, "%s", dlerror());
214
+ if(!func) rb_raise(ePKCS11Error, "dlsym(): %s", dlerror());
200
215
  #endif
201
216
  CallFunction(C_GetFunctionList, func, rv, &(ctx->functions));
202
- if (rv != CKR_OK) pkcs11_raise(self,rv);
217
+ if (rv != CKR_OK) pkcs11_raise(self, rv, "C_GetFunctionList");
203
218
 
204
219
  return self;
205
220
  }
@@ -225,7 +240,7 @@ pkcs11_C_Initialize(int argc, VALUE *argv, VALUE self)
225
240
  }
226
241
  GetFunction(self, C_Initialize, func);
227
242
  CallFunction(C_Initialize, func, rv, args);
228
- if (rv != CKR_OK) pkcs11_raise(self,rv);
243
+ if (rv != CKR_OK) pkcs11_raise(self, rv, "C_Initialize");
229
244
 
230
245
  return self;
231
246
  }
@@ -255,7 +270,7 @@ pkcs11_C_GetInfo(VALUE self)
255
270
  GetFunction(self, C_GetInfo, func);
256
271
  info = pkcs11_new_struct(cCK_INFO);
257
272
  CallFunction(C_GetInfo, func, rv, (CK_INFO_PTR)DATA_PTR(info));
258
- if (rv != CKR_OK) pkcs11_raise(self,rv);
273
+ if (rv != CKR_OK) pkcs11_raise(self, rv, "C_GetInfo");
259
274
 
260
275
  return info;
261
276
  }
@@ -272,12 +287,12 @@ pkcs11_C_GetSlotList(VALUE self, VALUE presented)
272
287
 
273
288
  GetFunction(self, C_GetSlotList, func);
274
289
  CallFunction(C_GetSlotList, func, rv, CK_FALSE, NULL_PTR, &ulSlotCount);
275
- if (rv != CKR_OK) pkcs11_raise(self,rv);
290
+ if (rv != CKR_OK) pkcs11_raise(self, rv, "C_GetSlotList 1st call");
276
291
  pSlotList = (CK_SLOT_ID_PTR)malloc(ulSlotCount*sizeof(CK_SLOT_ID));
277
292
  CallFunction(C_GetSlotList, func, rv, RTEST(presented) ? CK_TRUE : CK_FALSE, pSlotList, &ulSlotCount);
278
293
  if (rv != CKR_OK) {
279
294
  free(pSlotList);
280
- pkcs11_raise(self,rv);
295
+ pkcs11_raise(self, rv, "C_GetSlotList 2nd call");
281
296
  }
282
297
  for (i = 0; i < ulSlotCount; i++)
283
298
  rb_ary_push(ary, HANDLE2NUM(pSlotList[i]));
@@ -296,7 +311,7 @@ pkcs11_C_GetSlotInfo(VALUE self, VALUE slot_id)
296
311
  GetFunction(self, C_GetSlotInfo, func);
297
312
  info = pkcs11_new_struct(cCK_SLOT_INFO);
298
313
  CallFunction(C_GetSlotInfo, func, rv, NUM2HANDLE(slot_id), DATA_PTR(info));
299
- if (rv != CKR_OK) pkcs11_raise(self,rv);
314
+ if (rv != CKR_OK) pkcs11_raise(self, rv, "C_GetSlotInfo");
300
315
 
301
316
  return info;
302
317
  }
@@ -311,7 +326,7 @@ pkcs11_C_GetTokenInfo(VALUE self, VALUE slot_id)
311
326
  GetFunction(self, C_GetTokenInfo, func);
312
327
  info = pkcs11_new_struct(cCK_TOKEN_INFO);
313
328
  CallFunction(C_GetTokenInfo, func, rv, NUM2HANDLE(slot_id), DATA_PTR(info));
314
- if (rv != CKR_OK) pkcs11_raise(self,rv);
329
+ if (rv != CKR_OK) pkcs11_raise(self, rv, "C_GetTokenInfo");
315
330
 
316
331
  return info;
317
332
  }
@@ -329,7 +344,7 @@ pkcs11_C_GetMechanismList(VALUE self, VALUE slot_id)
329
344
  ary = rb_ary_new();
330
345
  GetFunction(self, C_GetMechanismList, func);
331
346
  CallFunction(C_GetMechanismList, func, rv, NUM2HANDLE(slot_id), NULL_PTR, &count);
332
- if (rv != CKR_OK) pkcs11_raise(self,rv);
347
+ if (rv != CKR_OK) pkcs11_raise(self, rv, "C_GetMechanismList 1st call");
333
348
  if (count == 0) return ary;
334
349
 
335
350
  types = (CK_MECHANISM_TYPE_PTR)malloc(sizeof(CK_MECHANISM_TYPE)*count);
@@ -337,7 +352,7 @@ pkcs11_C_GetMechanismList(VALUE self, VALUE slot_id)
337
352
  CallFunction(C_GetMechanismList, func, rv, NUM2HANDLE(slot_id), types, &count);
338
353
  if (rv != CKR_OK){
339
354
  free(types);
340
- pkcs11_raise(self,rv);
355
+ pkcs11_raise(self, rv, "C_GetMechanismList 2nd call");
341
356
  }
342
357
  for (i = 0; i < count; i++)
343
358
  rb_ary_push(ary, HANDLE2NUM(*(types+i)));
@@ -356,7 +371,7 @@ pkcs11_C_GetMechanismInfo(VALUE self, VALUE slot_id, VALUE type)
356
371
  info = pkcs11_new_struct(cCK_MECHANISM_INFO);
357
372
  GetFunction(self, C_GetMechanismInfo, func);
358
373
  CallFunction(C_GetMechanismInfo, func, rv, NUM2HANDLE(slot_id), NUM2HANDLE(type), DATA_PTR(info));
359
- if (rv != CKR_OK) pkcs11_raise(self,rv);
374
+ if (rv != CKR_OK) pkcs11_raise(self, rv, "C_GetMechanismInfo");
360
375
 
361
376
  return info;
362
377
  }
@@ -373,7 +388,7 @@ pkcs11_C_InitToken(VALUE self, VALUE slot_id, VALUE pin, VALUE label)
373
388
  CallFunction(C_InitToken, func, rv, NUM2HANDLE(slot_id),
374
389
  (CK_UTF8CHAR_PTR)RSTRING_PTR(pin), RSTRING_LEN(pin),
375
390
  (CK_UTF8CHAR_PTR)RSTRING_PTR(label));
376
- if (rv != CKR_OK) pkcs11_raise(self,rv);
391
+ if (rv != CKR_OK) pkcs11_raise(self, rv, "C_InitToken");
377
392
 
378
393
  return self;
379
394
  }
@@ -388,7 +403,7 @@ pkcs11_C_InitPIN(VALUE self, VALUE session, VALUE pin)
388
403
  GetFunction(self, C_InitPIN, func);
389
404
  CallFunction(C_InitPIN, func, rv, NUM2HANDLE(session),
390
405
  (CK_UTF8CHAR_PTR)RSTRING_PTR(pin), RSTRING_LEN(pin));
391
- if (rv != CKR_OK) pkcs11_raise(self,rv);
406
+ if (rv != CKR_OK) pkcs11_raise(self, rv, "C_InitPIN");
392
407
 
393
408
  return self;
394
409
  }
@@ -402,7 +417,7 @@ pkcs11_C_OpenSession(VALUE self, VALUE slot_id, VALUE flags)
402
417
 
403
418
  GetFunction(self, C_OpenSession, func);
404
419
  CallFunction(C_OpenSession, func, rv, NUM2HANDLE(slot_id), NUM2ULONG(flags), 0, 0, &handle);
405
- if(rv != CKR_OK) pkcs11_raise(self,rv);
420
+ if(rv != CKR_OK) pkcs11_raise(self, rv, "C_OpenSession");
406
421
 
407
422
  return HANDLE2NUM(handle);
408
423
  }
@@ -417,7 +432,7 @@ pkcs11_C_Login(VALUE self, VALUE session, VALUE user_type, VALUE pin)
417
432
  GetFunction(self, C_Login, func);
418
433
  CallFunction(C_Login, func, rv, NUM2HANDLE(session), NUM2ULONG(user_type),
419
434
  (CK_UTF8CHAR_PTR)RSTRING_PTR(pin), RSTRING_LEN(pin));
420
- if(rv != CKR_OK) pkcs11_raise(self,rv);
435
+ if(rv != CKR_OK) pkcs11_raise(self, rv, "C_Login");
421
436
 
422
437
  return self;
423
438
  }
@@ -430,7 +445,7 @@ pkcs11_C_Logout(VALUE self, VALUE session)
430
445
 
431
446
  GetFunction(self, C_Logout, func);
432
447
  CallFunction(C_Logout, func, rv, NUM2HANDLE(session));
433
- if(rv != CKR_OK) pkcs11_raise(self,rv);
448
+ if(rv != CKR_OK) pkcs11_raise(self, rv, "C_Logout");
434
449
 
435
450
  return self;
436
451
  }
@@ -443,7 +458,7 @@ pkcs11_C_CloseSession(VALUE self, VALUE session)
443
458
 
444
459
  GetFunction(self, C_CloseSession, func);
445
460
  CallFunction(C_CloseSession, func, rv, NUM2HANDLE(session));
446
- if(rv != CKR_OK) pkcs11_raise(self,rv);
461
+ if(rv != CKR_OK) pkcs11_raise(self, rv, "C_CloseSession");
447
462
 
448
463
  return self;
449
464
  }
@@ -456,7 +471,7 @@ pkcs11_C_CloseAllSessions(VALUE self, VALUE slot_id)
456
471
 
457
472
  GetFunction(self, C_CloseAllSessions, func);
458
473
  CallFunction(C_CloseAllSessions, func, rv, NUM2HANDLE(slot_id));
459
- if(rv != CKR_OK) pkcs11_raise(self,rv);
474
+ if(rv != CKR_OK) pkcs11_raise(self, rv, "C_CloseAllSessions");
460
475
 
461
476
  return self;
462
477
  }
@@ -471,7 +486,7 @@ pkcs11_C_GetSessionInfo(VALUE self, VALUE session)
471
486
  info = pkcs11_new_struct(cCK_SESSION_INFO);
472
487
  GetFunction(self, C_GetSessionInfo, func);
473
488
  CallFunction(C_GetSessionInfo, func, rv, NUM2HANDLE(session), DATA_PTR(info));
474
- if (rv != CKR_OK) pkcs11_raise(self,rv);
489
+ if (rv != CKR_OK) pkcs11_raise(self, rv, "C_GetSessionInfo");
475
490
 
476
491
  return info;
477
492
  }
@@ -486,10 +501,10 @@ pkcs11_C_GetOperationState(VALUE self, VALUE session)
486
501
 
487
502
  GetFunction(self, C_GetOperationState, func);
488
503
  CallFunction(C_GetOperationState, func, rv, NUM2HANDLE(session), NULL_PTR, &size);
489
- if (rv != CKR_OK) pkcs11_raise(self,rv);
504
+ if (rv != CKR_OK) pkcs11_raise(self, rv, "C_GetOperationState 1st call");
490
505
  state = rb_str_new(0, size);
491
506
  CallFunction(C_GetOperationState, func, rv, NUM2HANDLE(session), (CK_BYTE_PTR)RSTRING_PTR(state), &size);
492
- if (rv != CKR_OK) pkcs11_raise(self,rv);
507
+ if (rv != CKR_OK) pkcs11_raise(self, rv, "C_GetOperationState 2nd call");
493
508
  rb_str_set_len(state, size);
494
509
 
495
510
  return state;
@@ -506,7 +521,7 @@ pkcs11_C_SetOperationState(VALUE self, VALUE session, VALUE state, VALUE enc_key
506
521
  CallFunction(C_SetOperationState, func, rv, NUM2HANDLE(session),
507
522
  (CK_BYTE_PTR)RSTRING_PTR(state), RSTRING_LEN(state),
508
523
  NUM2HANDLE(enc_key), NUM2HANDLE(auth_key));
509
- if (rv != CKR_OK) pkcs11_raise(self,rv);
524
+ if (rv != CKR_OK) pkcs11_raise(self, rv, "C_SetOperationState");
510
525
 
511
526
  return self;
512
527
  }
@@ -523,7 +538,7 @@ pkcs11_C_SetPIN(VALUE self, VALUE session, VALUE old_pin, VALUE new_pin)
523
538
  CallFunction(C_SetPIN, func, rv, NUM2HANDLE(session),
524
539
  (CK_UTF8CHAR_PTR)RSTRING_PTR(old_pin), RSTRING_LEN(old_pin),
525
540
  (CK_UTF8CHAR_PTR)RSTRING_PTR(new_pin), RSTRING_LEN(new_pin));
526
- if(rv != CKR_OK) pkcs11_raise(self,rv);
541
+ if(rv != CKR_OK) pkcs11_raise(self, rv, "C_SetPIN");
527
542
 
528
543
  return self;
529
544
  }
@@ -562,7 +577,7 @@ pkcs11_C_CreateObject(VALUE self, VALUE session, VALUE template)
562
577
  GetFunction(self, C_CreateObject, func);
563
578
  CallFunction(C_CreateObject, func, rv, NUM2HANDLE(session), tmp, RARRAY_LEN(template), &handle);
564
579
  free(tmp);
565
- if(rv != CKR_OK) pkcs11_raise(self,rv);
580
+ if(rv != CKR_OK) pkcs11_raise(self, rv, "C_CreateObject");
566
581
 
567
582
  return HANDLE2NUM(handle);
568
583
  }
@@ -579,7 +594,7 @@ pkcs11_C_CopyObject(VALUE self, VALUE session, VALUE object, VALUE template)
579
594
  GetFunction(self, C_CopyObject, func);
580
595
  CallFunction(C_CopyObject, func, rv, NUM2HANDLE(session), NUM2HANDLE(object), tmp, RARRAY_LEN(template), &handle);
581
596
  free(tmp);
582
- if(rv != CKR_OK) pkcs11_raise(self,rv);
597
+ if(rv != CKR_OK) pkcs11_raise(self, rv, "C_CopyObject");
583
598
 
584
599
  return HANDLE2NUM(handle);
585
600
  }
@@ -592,7 +607,7 @@ pkcs11_C_DestroyObject(VALUE self, VALUE session, VALUE handle)
592
607
 
593
608
  GetFunction(self, C_DestroyObject, func);
594
609
  CallFunction(C_DestroyObject, func, rv, NUM2HANDLE(session), NUM2HANDLE(handle));
595
- if(rv != CKR_OK) pkcs11_raise(self,rv);
610
+ if(rv != CKR_OK) pkcs11_raise(self, rv, "C_DestroyObject");
596
611
 
597
612
  return self;
598
613
  }
@@ -606,7 +621,7 @@ pkcs11_C_GetObjectSize(VALUE self, VALUE session, VALUE handle)
606
621
 
607
622
  GetFunction(self, C_GetObjectSize, func);
608
623
  CallFunction(C_GetObjectSize, func, rv, NUM2HANDLE(session), NUM2HANDLE(handle), &size);
609
- if(rv != CKR_OK) pkcs11_raise(self,rv);
624
+ if(rv != CKR_OK) pkcs11_raise(self, rv, "C_GetObjectSize");
610
625
 
611
626
  return ULONG2NUM(size);
612
627
  }
@@ -626,7 +641,7 @@ pkcs11_C_FindObjectsInit(VALUE self, VALUE session, VALUE template)
626
641
  GetFunction(self, C_FindObjectsInit, func);
627
642
  CallFunction(C_FindObjectsInit, func, rv, NUM2HANDLE(session), tmp, tmp_size);
628
643
  free(tmp);
629
- if(rv != CKR_OK) pkcs11_raise(self,rv);
644
+ if(rv != CKR_OK) pkcs11_raise(self, rv, "C_FindObjectsInit");
630
645
 
631
646
  return self;
632
647
  }
@@ -639,7 +654,7 @@ pkcs11_C_FindObjectsFinal(VALUE self, VALUE session)
639
654
 
640
655
  GetFunction(self, C_FindObjectsFinal, func);
641
656
  CallFunction(C_FindObjectsFinal, func, rv, NUM2HANDLE(session));
642
- if(rv != CKR_OK) pkcs11_raise(self,rv);
657
+ if(rv != CKR_OK) pkcs11_raise(self, rv, "C_FindObjectsFinal");
643
658
 
644
659
  return self;
645
660
  }
@@ -660,7 +675,7 @@ pkcs11_C_FindObjects(VALUE self, VALUE session, VALUE max_count)
660
675
  CallFunction(C_FindObjects, func, rv, NUM2HANDLE(session), handles, NUM2ULONG(max_count), &count);
661
676
  if(rv != CKR_OK){
662
677
  free(handles);
663
- pkcs11_raise(self,rv);
678
+ pkcs11_raise(self, rv, "C_FindObjects");
664
679
  }
665
680
  ary = rb_ary_new();
666
681
  for(i = 0; i < count; i++)
@@ -688,7 +703,7 @@ pkcs11_C_GetAttributeValue(VALUE self, VALUE session, VALUE handle, VALUE templa
688
703
  CallFunction(C_GetAttributeValue, func, rv, NUM2HANDLE(session), NUM2HANDLE(handle), tmp, template_size);
689
704
  if(rv != CKR_OK){
690
705
  free(tmp);
691
- pkcs11_raise(self,rv);
706
+ pkcs11_raise(self, rv, "C_GetAttributeValue 1st call");
692
707
  }
693
708
 
694
709
  for (i = 0; i < template_size; i++){
@@ -703,7 +718,7 @@ pkcs11_C_GetAttributeValue(VALUE self, VALUE session, VALUE handle, VALUE templa
703
718
  if (attr->pValue) free(attr->pValue);
704
719
  }
705
720
  free(tmp);
706
- pkcs11_raise(self,rv);
721
+ pkcs11_raise(self, rv, "C_GetAttributeValue 2nd call");
707
722
  }
708
723
  ary = rb_ary_new();
709
724
  for (i = 0; i < template_size; i++){
@@ -732,7 +747,7 @@ pkcs11_C_SetAttributeValue(VALUE self, VALUE session, VALUE handle, VALUE templa
732
747
  GetFunction(self, C_SetAttributeValue, func);
733
748
  CallFunction(C_SetAttributeValue, func, rv, NUM2HANDLE(session), NUM2HANDLE(handle), tmp, template_size);
734
749
  free(tmp);
735
- if(rv != CKR_OK) pkcs11_raise(self,rv);
750
+ if(rv != CKR_OK) pkcs11_raise(self, rv, "C_SetAttributeValue");
736
751
 
737
752
  return self;
738
753
  }
@@ -746,7 +761,7 @@ pkcs11_C_SeedRandom(VALUE self, VALUE session, VALUE seed)
746
761
  GetFunction(self, C_SeedRandom, func);
747
762
  CallFunction(C_SeedRandom, func, rv, NUM2HANDLE(session),
748
763
  (CK_BYTE_PTR)RSTRING_PTR(seed), RSTRING_LEN(seed));
749
- if(rv != CKR_OK) pkcs11_raise(self,rv);
764
+ if(rv != CKR_OK) pkcs11_raise(self, rv, "C_SeedRandom");
750
765
 
751
766
  return self;
752
767
  }
@@ -761,7 +776,7 @@ pkcs11_C_GenerateRandom(VALUE self, VALUE session, VALUE size)
761
776
 
762
777
  GetFunction(self, C_GenerateRandom, func);
763
778
  CallFunction(C_GenerateRandom, func, rv, NUM2HANDLE(session), (CK_BYTE_PTR)RSTRING_PTR(buf), sz);
764
- if(rv != CKR_OK) pkcs11_raise(self,rv);
779
+ if(rv != CKR_OK) pkcs11_raise(self, rv, "C_GenerateRandom");
765
780
 
766
781
  return buf;
767
782
  }
@@ -776,7 +791,7 @@ pkcs11_C_WaitForSlotEvent(VALUE self, VALUE flags)
776
791
  GetFunction(self, C_WaitForSlotEvent, func);
777
792
  CallFunction(C_WaitForSlotEvent, func, rv, NUM2ULONG(flags), &slot_id, NULL_PTR);
778
793
  if(rv == CKR_NO_EVENT) return Qnil;
779
- if(rv != CKR_OK) pkcs11_raise(self,rv);
794
+ if(rv != CKR_OK) pkcs11_raise(self, rv, "C_WaitForSlotEvent");
780
795
 
781
796
  return HANDLE2NUM(slot_id);
782
797
  }
@@ -811,7 +826,7 @@ common_init(VALUE self, VALUE session, VALUE mechanism, VALUE key, init_func fun
811
826
  m = DATA_PTR(mechanism);
812
827
  /* Use the function signature of any of the various C_*Init functions. */
813
828
  CallFunction(C_EncryptInit, func, rv, NUM2HANDLE(session), m, NUM2HANDLE(key));
814
- if(rv != CKR_OK) pkcs11_raise(self,rv);
829
+ if(rv != CKR_OK) pkcs11_raise(self, rv, "C_EncryptInit");
815
830
 
816
831
  return Qnil;
817
832
  }
@@ -828,16 +843,19 @@ common_crypt_update(VALUE self, VALUE session, VALUE data, VALUE size, crypt_upd
828
843
  CallFunction(C_EncryptUpdate, func, rv, NUM2HANDLE(session),
829
844
  (CK_BYTE_PTR)RSTRING_PTR(data), RSTRING_LEN(data),
830
845
  NULL_PTR, &sz);
831
- if(rv != CKR_OK) pkcs11_raise(self,rv);
846
+ if(rv != CKR_OK) pkcs11_raise(self, rv, "C_EncryptUpdate 1st call");
832
847
  }else{
833
848
  sz = NUM2ULONG(size);
834
849
  }
850
+
851
+ /* softokn3 with CKM_AES_GCM requests 16 bytes less then needed. */
852
+ sz += 16;
835
853
  buf = rb_str_new(0, sz);
836
854
 
837
855
  CallFunction(C_EncryptUpdate, func, rv, NUM2HANDLE(session),
838
856
  (CK_BYTE_PTR)RSTRING_PTR(data), RSTRING_LEN(data),
839
857
  (CK_BYTE_PTR)RSTRING_PTR(buf), &sz);
840
- if(rv != CKR_OK) pkcs11_raise(self,rv);
858
+ if(rv != CKR_OK) pkcs11_raise(self, rv, "C_EncryptUpdate 2nd call");
841
859
  rb_str_set_len(buf, sz);
842
860
 
843
861
  return buf;
@@ -852,14 +870,14 @@ common_crypt_final(VALUE self, VALUE session, VALUE size, crypt_final_func func)
852
870
 
853
871
  if (NIL_P(size)){
854
872
  CallFunction(C_EncryptFinal, func, rv, NUM2HANDLE(session), NULL_PTR, &sz);
855
- if(rv != CKR_OK) pkcs11_raise(self,rv);
873
+ if(rv != CKR_OK) pkcs11_raise(self, rv, "C_EncryptFinal 1st call");
856
874
  }else{
857
875
  sz = NUM2ULONG(size);
858
876
  }
859
877
  buf = rb_str_new(0, sz);
860
878
 
861
879
  CallFunction(C_EncryptFinal, func, rv, NUM2HANDLE(session), (CK_BYTE_PTR)RSTRING_PTR(buf), &sz);
862
- if(rv != CKR_OK) pkcs11_raise(self,rv);
880
+ if(rv != CKR_OK) pkcs11_raise(self, rv, "C_EncryptFinal 2nd call");
863
881
  rb_str_set_len(buf, sz);
864
882
 
865
883
  return buf;
@@ -873,7 +891,7 @@ common_sign_update(VALUE self, VALUE session, VALUE data, sign_update_func func)
873
891
  StringValue(data);
874
892
  CallFunction(C_SignUpdate, func, rv, NUM2HANDLE(session),
875
893
  (CK_BYTE_PTR)RSTRING_PTR(data), RSTRING_LEN(data));
876
- if(rv != CKR_OK) pkcs11_raise(self,rv);
894
+ if(rv != CKR_OK) pkcs11_raise(self, rv, "C_SignUpdate");
877
895
 
878
896
  return Qnil;
879
897
  }
@@ -889,7 +907,7 @@ common_verify(VALUE self, VALUE session, VALUE data, VALUE sig, verify_func func
889
907
  CallFunction(C_Verify, func, rv, NUM2HANDLE(session),
890
908
  (CK_BYTE_PTR)RSTRING_PTR(data), RSTRING_LEN(data),
891
909
  (CK_BYTE_PTR)RSTRING_PTR(sig), RSTRING_LEN(sig));
892
- if(rv != CKR_OK) pkcs11_raise(self,rv);
910
+ if(rv != CKR_OK) pkcs11_raise(self, rv, "C_Verify");
893
911
 
894
912
  return Qnil;
895
913
  }
@@ -1089,7 +1107,7 @@ pkcs11_C_DigestInit(VALUE self, VALUE session, VALUE mechanism)
1089
1107
  rb_raise(rb_eArgError, "2nd arg must be a PKCS11::CK_MECHANISM");
1090
1108
  m = DATA_PTR(mechanism);
1091
1109
  CallFunction(C_DigestInit, func, rv, NUM2HANDLE(session), m);
1092
- if(rv != CKR_OK) pkcs11_raise(self,rv);
1110
+ if(rv != CKR_OK) pkcs11_raise(self, rv, "C_DigestInit");
1093
1111
 
1094
1112
  return self;
1095
1113
  }
@@ -1119,7 +1137,7 @@ pkcs11_C_DigestKey(VALUE self, VALUE session, VALUE handle)
1119
1137
 
1120
1138
  GetFunction(self, C_DigestKey, func);
1121
1139
  CallFunction(C_DigestKey, func, rv, NUM2HANDLE(session), NUM2HANDLE(handle));
1122
- if(rv != CKR_OK) pkcs11_raise(self,rv);
1140
+ if(rv != CKR_OK) pkcs11_raise(self, rv, "C_DigestKey");
1123
1141
 
1124
1142
  return self;
1125
1143
  }
@@ -1179,7 +1197,7 @@ pkcs11_C_GenerateKey(VALUE self, VALUE session, VALUE mechanism, VALUE template)
1179
1197
  tmp = pkcs11_attr_ary2buf(template);
1180
1198
  CallFunction(C_GenerateKey, func, rv, NUM2HANDLE(session), m, tmp, RARRAY_LEN(template), &handle);
1181
1199
  free(tmp);
1182
- if(rv != CKR_OK) pkcs11_raise(self,rv);
1200
+ if(rv != CKR_OK) pkcs11_raise(self, rv, "C_GenerateKey");
1183
1201
 
1184
1202
  return HANDLE2NUM(handle);
1185
1203
  }
@@ -1207,7 +1225,7 @@ pkcs11_C_GenerateKeyPair(VALUE self, VALUE session, VALUE mechanism, VALUE pubke
1207
1225
  &pubkey_handle, &privkey_handle);
1208
1226
  free(pubkey_tmp);
1209
1227
  free(privkey_tmp);
1210
- if(rv != CKR_OK) pkcs11_raise(self,rv);
1228
+ if(rv != CKR_OK) pkcs11_raise(self, rv, "C_GenerateKeyPair");
1211
1229
  ary = rb_ary_new();
1212
1230
  rb_ary_push(ary, HANDLE2NUM(pubkey_handle));
1213
1231
  rb_ary_push(ary, HANDLE2NUM(privkey_handle));
@@ -1232,7 +1250,7 @@ pkcs11_C_WrapKey(VALUE self, VALUE session, VALUE mechanism, VALUE wrapping, VAL
1232
1250
  CallFunction(C_WrapKey, func, rv, NUM2HANDLE(session), m,
1233
1251
  NUM2HANDLE(wrapping), NUM2HANDLE(wrapped),
1234
1252
  (CK_BYTE_PTR)NULL_PTR, &sz);
1235
- if(rv != CKR_OK) pkcs11_raise(self,rv);
1253
+ if(rv != CKR_OK) pkcs11_raise(self, rv, "C_WrapKey 1st call");
1236
1254
  }else{
1237
1255
  sz = NUM2ULONG(size);
1238
1256
  }
@@ -1241,7 +1259,7 @@ pkcs11_C_WrapKey(VALUE self, VALUE session, VALUE mechanism, VALUE wrapping, VAL
1241
1259
  CallFunction(C_WrapKey, func, rv, NUM2HANDLE(session), m,
1242
1260
  NUM2HANDLE(wrapping), NUM2HANDLE(wrapped),
1243
1261
  (CK_BYTE_PTR)RSTRING_PTR(buf), &sz);
1244
- if(rv != CKR_OK) pkcs11_raise(self,rv);
1262
+ if(rv != CKR_OK) pkcs11_raise(self, rv, "C_WrapKey 2nd call");
1245
1263
  rb_str_set_len(buf, sz);
1246
1264
 
1247
1265
  return buf;
@@ -1265,7 +1283,7 @@ pkcs11_C_UnwrapKey(VALUE self, VALUE session, VALUE mechanism, VALUE wrapping, V
1265
1283
  (CK_BYTE_PTR)RSTRING_PTR(wrapped), RSTRING_LEN(wrapped),
1266
1284
  tmp, RARRAY_LEN(template), &h);
1267
1285
  free(tmp);
1268
- if(rv != CKR_OK) pkcs11_raise(self,rv);
1286
+ if(rv != CKR_OK) pkcs11_raise(self, rv, "C_UnwrapKey");
1269
1287
 
1270
1288
  return HANDLE2NUM(h);
1271
1289
  }
@@ -1287,7 +1305,7 @@ pkcs11_C_DeriveKey(VALUE self, VALUE session, VALUE mechanism, VALUE base, VALUE
1287
1305
  CallFunction(C_DeriveKey, func, rv, NUM2HANDLE(session), m, NUM2HANDLE(base),
1288
1306
  tmp, RARRAY_LEN(template), &h);
1289
1307
  free(tmp);
1290
- if(rv != CKR_OK) pkcs11_raise(self,rv);
1308
+ if(rv != CKR_OK) pkcs11_raise(self, rv, "C_DeriveKey");
1291
1309
 
1292
1310
  return HANDLE2NUM(h);
1293
1311
  }
@@ -1300,12 +1318,12 @@ pkcs11_C_DeriveKey(VALUE self, VALUE session, VALUE mechanism, VALUE base, VALUE
1300
1318
  * @param [Integer] rv return value of the latest operation
1301
1319
  */
1302
1320
  static VALUE
1303
- pkcs11_vendor_raise_on_return_value(VALUE self, VALUE rv_value)
1321
+ pkcs11_vendor_raise_on_return_value(VALUE self, VALUE rv_value, VALUE func)
1304
1322
  {
1305
1323
  VALUE class;
1306
1324
  CK_RV rv = NUM2ULONG(rv_value);
1307
1325
  class = pkcs11_return_value_to_class(rv, ePKCS11Error);
1308
- rb_raise(class, "%lu", rv);
1326
+ rb_raise(class, "%s returned %lu", StringValuePtr(func), rv);
1309
1327
 
1310
1328
  return Qnil;
1311
1329
  }
@@ -1327,18 +1345,32 @@ pkcs11_vendor_class_CK_ATTRIBUTE(VALUE self)
1327
1345
  ///////////////////////////////////////
1328
1346
 
1329
1347
  static void
1330
- ck_attr_free(CK_ATTRIBUTE *attr)
1348
+ ck_attr_free(void *_ptr)
1331
1349
  {
1350
+ CK_ATTRIBUTE *attr = (CK_ATTRIBUTE *)_ptr;
1332
1351
  if (attr->pValue) free(attr->pValue);
1333
1352
  free(attr);
1334
1353
  }
1335
1354
 
1355
+ static size_t
1356
+ ck_attr_memsize(const void *_ptr)
1357
+ {
1358
+ return sizeof(CK_ATTRIBUTE);
1359
+ }
1360
+
1361
+ static const rb_data_type_t ck_attr_obj_type = {
1362
+ "PKCS11::CK_ATTRIBUTE",
1363
+ {0, ck_attr_free, ck_attr_memsize,},
1364
+ 0, 0,
1365
+ RUBY_TYPED_FREE_IMMEDIATELY,
1366
+ };
1367
+
1336
1368
  static VALUE
1337
1369
  ck_attr_s_alloc(VALUE self)
1338
1370
  {
1339
1371
  VALUE obj;
1340
1372
  CK_ATTRIBUTE *attr;
1341
- obj = Data_Make_Struct(self, CK_ATTRIBUTE, 0, ck_attr_free, attr);
1373
+ obj = TypedData_Make_Struct(self, CK_ATTRIBUTE, &ck_attr_obj_type, attr);
1342
1374
  return obj;
1343
1375
  }
1344
1376
 
@@ -1349,7 +1381,8 @@ ck_attr_initialize(int argc, VALUE *argv, VALUE self)
1349
1381
  CK_ATTRIBUTE *attr;
1350
1382
 
1351
1383
  rb_scan_args(argc, argv, "02", &type, &value);
1352
- Data_Get_Struct(self, CK_ATTRIBUTE, attr);
1384
+ if(!RB_TYPE_P(self, RUBY_T_DATA)) rb_check_typeddata(self, &ck_attr_obj_type);
1385
+ attr = (CK_ATTRIBUTE*)DATA_PTR(self);
1353
1386
  if (argc == 0) return self;
1354
1387
  attr->type = NUM2HANDLE(type);
1355
1388
  attr->pValue = NULL;
@@ -1392,7 +1425,8 @@ static VALUE
1392
1425
  ck_attr_type(VALUE self)
1393
1426
  {
1394
1427
  CK_ATTRIBUTE *attr;
1395
- Data_Get_Struct(self, CK_ATTRIBUTE, attr);
1428
+ if(!RB_TYPE_P(self, RUBY_T_DATA)) rb_check_typeddata(self, &ck_attr_obj_type);
1429
+ attr = (CK_ATTRIBUTE*)DATA_PTR(self);
1396
1430
  return ULONG2NUM(attr->type);
1397
1431
  }
1398
1432
 
@@ -1405,7 +1439,8 @@ static VALUE
1405
1439
  ck_attr_value(VALUE self)
1406
1440
  {
1407
1441
  CK_ATTRIBUTE *attr;
1408
- Data_Get_Struct(self, CK_ATTRIBUTE, attr);
1442
+ if(!RB_TYPE_P(self, RUBY_T_DATA)) rb_check_typeddata(self, &ck_attr_obj_type);
1443
+ attr = (CK_ATTRIBUTE*)DATA_PTR(self);
1409
1444
  if (attr->ulValueLen == 0) return Qnil;
1410
1445
  switch(attr->type){
1411
1446
  case CKA_ALWAYS_AUTHENTICATE:
@@ -1559,6 +1594,10 @@ Init_pkcs11_ext(void)
1559
1594
  sNEW = rb_intern("new");
1560
1595
  cPKCS11 = rb_define_class_under(mPKCS11, "Library", rb_cObject);
1561
1596
 
1597
+ /* Expose the pointer of the pkcs11_ctx type struct.
1598
+ * Because on Windows it's not possible to link directly into pkcs11_ext.so from pkcs11_luna_ext.so */
1599
+ rb_define_const( cPKCS11, "PKCS11_CTX_TYPE", RB_ULL2NUM((unsigned long long)&pkcs11_ctx_type) );
1600
+
1562
1601
  /* Document-method: PKCS11.open
1563
1602
  *
1564
1603
  * Alias function for {PKCS11::Library#initialize}
@@ -1647,7 +1686,7 @@ Init_pkcs11_ext(void)
1647
1686
  PKCS11_DEFINE_METHOD(C_WaitForSlotEvent, 1);
1648
1687
  PKCS11_DEFINE_METHOD(C_Finalize, 0);
1649
1688
  PKCS11_DEFINE_METHOD(unload_library, 0);
1650
- PKCS11_DEFINE_METHOD(vendor_raise_on_return_value, 1);
1689
+ PKCS11_DEFINE_METHOD(vendor_raise_on_return_value, 2);
1651
1690
  PKCS11_DEFINE_METHOD(vendor_class_CK_ATTRIBUTE, 0);
1652
1691
 
1653
1692
  ///////////////////////////////////////