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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/.appveyor.yml +6 -7
- data/.github/workflows/ci.yml +80 -0
- data/Gemfile +5 -4
- data/Rakefile +5 -3
- data/ext/generate_constants.rb +3 -3
- data/ext/generate_structs.rb +1 -1
- data/ext/generate_thread_funcs.rb +1 -1
- data/ext/pk11.c +129 -90
- data/ext/pk11_struct_macros.h +65 -16
- data/ext/pk11_version.h +1 -1
- data/test/helper.rb +8 -2
- data/test/test_pkcs11_crypt.rb +32 -10
- data.tar.gz.sig +0 -0
- metadata +60 -39
- metadata.gz.sig +0 -0
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"),
|
|
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, ¶ms, 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(
|
|
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, ¶ms, 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
|
-
|
|
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 =
|
|
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
|
-
|
|
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] = "
|
|
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
|
-
|
|
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] = "
|
|
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(
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
1689
|
+
PKCS11_DEFINE_METHOD(vendor_raise_on_return_value, 2);
|
|
1651
1690
|
PKCS11_DEFINE_METHOD(vendor_class_CK_ATTRIBUTE, 0);
|
|
1652
1691
|
|
|
1653
1692
|
///////////////////////////////////////
|