pkcs11 0.2.4-x64-mingw32
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.tar.gz.sig +0 -0
- data/.autotest +23 -0
- data/.gemtest +0 -0
- data/.yardopts +1 -0
- data/History.txt +57 -0
- data/MIT-LICENSE +22 -0
- data/Manifest.txt +57 -0
- data/README.rdoc +205 -0
- data/Rakefile +111 -0
- data/ext/extconf.rb +7 -0
- data/ext/generate_constants.rb +57 -0
- data/ext/generate_structs.rb +206 -0
- data/ext/generate_thread_funcs.rb +72 -0
- data/ext/include/cryptoki.h +66 -0
- data/ext/include/ct-kip.h +50 -0
- data/ext/include/otp-pkcs11.h +125 -0
- data/ext/include/pkcs-11v2-20a3.h +124 -0
- data/ext/include/pkcs11.h +299 -0
- data/ext/include/pkcs11f.h +912 -0
- data/ext/include/pkcs11t.h +1885 -0
- data/ext/pk11.c +1675 -0
- data/ext/pk11.h +81 -0
- data/ext/pk11_const.c +205 -0
- data/ext/pk11_const_def.inc +452 -0
- data/ext/pk11_const_macros.h +38 -0
- data/ext/pk11_struct.doc +792 -0
- data/ext/pk11_struct_def.inc +302 -0
- data/ext/pk11_struct_impl.inc +302 -0
- data/ext/pk11_struct_macros.h +435 -0
- data/ext/pk11_thread_funcs.c +411 -0
- data/ext/pk11_thread_funcs.h +482 -0
- data/ext/pk11_version.h +6 -0
- data/lib/2.0/pkcs11_ext.so +0 -0
- data/lib/pkcs11.rb +9 -0
- data/lib/pkcs11/extensions.rb +68 -0
- data/lib/pkcs11/helper.rb +144 -0
- data/lib/pkcs11/library.rb +140 -0
- data/lib/pkcs11/object.rb +171 -0
- data/lib/pkcs11/session.rb +765 -0
- data/lib/pkcs11/slot.rb +102 -0
- data/pkcs11_protect_server/Manifest.txt +14 -0
- data/pkcs11_protect_server/README_PROTECT_SERVER.rdoc +89 -0
- data/test/fixtures/softokn/cert8.db +0 -0
- data/test/fixtures/softokn/key3.db +0 -0
- data/test/fixtures/softokn/secmod.db +0 -0
- data/test/helper.rb +58 -0
- data/test/test_pkcs11.rb +71 -0
- data/test/test_pkcs11_crypt.rb +220 -0
- data/test/test_pkcs11_object.rb +122 -0
- data/test/test_pkcs11_session.rb +123 -0
- data/test/test_pkcs11_slot.rb +78 -0
- data/test/test_pkcs11_structs.rb +166 -0
- data/test/test_pkcs11_thread.rb +44 -0
- metadata +213 -0
- metadata.gz.sig +0 -0
data/ext/pk11.c
ADDED
@@ -0,0 +1,1675 @@
|
|
1
|
+
#include "pk11.h"
|
2
|
+
#include "pk11_struct_macros.h"
|
3
|
+
#include "pk11_version.h"
|
4
|
+
|
5
|
+
#if defined(compile_for_windows)
|
6
|
+
#include <winbase.h> /* for LoadLibrary() */
|
7
|
+
#else
|
8
|
+
#include <dlfcn.h>
|
9
|
+
#endif
|
10
|
+
|
11
|
+
static ID sNEW;
|
12
|
+
static VALUE mPKCS11;
|
13
|
+
static VALUE cPKCS11;
|
14
|
+
static VALUE ePKCS11Error;
|
15
|
+
|
16
|
+
static VALUE cCStruct;
|
17
|
+
static VALUE cCK_ATTRIBUTE;
|
18
|
+
static VALUE cCK_C_INITIALIZE_ARGS;
|
19
|
+
static VALUE aCK_C_INITIALIZE_ARGS_members;
|
20
|
+
static VALUE cCK_INFO;
|
21
|
+
static VALUE aCK_INFO_members;
|
22
|
+
static VALUE cCK_TOKEN_INFO;
|
23
|
+
static VALUE aCK_TOKEN_INFO_members;
|
24
|
+
static VALUE cCK_SLOT_INFO;
|
25
|
+
static VALUE aCK_SLOT_INFO_members;
|
26
|
+
static VALUE cCK_MECHANISM_INFO;
|
27
|
+
static VALUE aCK_MECHANISM_INFO_members;
|
28
|
+
static VALUE cCK_SESSION_INFO;
|
29
|
+
static VALUE aCK_SESSION_INFO_members;
|
30
|
+
static VALUE cCK_MECHANISM;
|
31
|
+
static VALUE aCK_MECHANISM_members;
|
32
|
+
|
33
|
+
#define MODULE_FOR_STRUCTS mPKCS11
|
34
|
+
#define BASECLASS_FOR_STRUCTS cCStruct
|
35
|
+
#define pkcs11_new_struct(klass) rb_funcall(klass, sNEW, 0)
|
36
|
+
|
37
|
+
#define PKCS11_DEFINE_METHOD(name, args) \
|
38
|
+
rb_define_method(cPKCS11, #name, pkcs11_##name, args);
|
39
|
+
|
40
|
+
VALUE pkcs11_return_value_to_class(CK_RV, VALUE);
|
41
|
+
|
42
|
+
static void
|
43
|
+
pkcs11_raise(VALUE self, CK_RV rv)
|
44
|
+
{
|
45
|
+
rb_funcall(self, rb_intern("vendor_raise_on_return_value"), 1, ULONG2NUM(rv));
|
46
|
+
rb_raise(ePKCS11Error, "method vendor_raise_on_return_value should never return");
|
47
|
+
}
|
48
|
+
|
49
|
+
///////////////////////////////////////
|
50
|
+
|
51
|
+
typedef struct {
|
52
|
+
void *module;
|
53
|
+
CK_FUNCTION_LIST_PTR functions;
|
54
|
+
} pkcs11_ctx;
|
55
|
+
|
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
|
+
#ifdef HAVE_RB_THREAD_BLOCKING_REGION
|
66
|
+
#define CallFunction(name, func, rv, ...) \
|
67
|
+
{ \
|
68
|
+
struct tbr_##name##_params params = { \
|
69
|
+
func, {__VA_ARGS__}, CKR_FUNCTION_FAILED \
|
70
|
+
}; \
|
71
|
+
rb_thread_blocking_region(tbf_##name, ¶ms, RUBY_UBF_PROCESS, 0); \
|
72
|
+
rv = params.retval; \
|
73
|
+
}
|
74
|
+
|
75
|
+
#else
|
76
|
+
#define CallFunction(name, func, rv, ...) \
|
77
|
+
rv = func(__VA_ARGS__)
|
78
|
+
|
79
|
+
#endif
|
80
|
+
|
81
|
+
static void
|
82
|
+
pkcs11_ctx_unload_library(pkcs11_ctx *ctx)
|
83
|
+
{
|
84
|
+
#ifdef compile_for_windows
|
85
|
+
if(ctx->module) FreeLibrary(ctx->module);
|
86
|
+
#else
|
87
|
+
if(ctx->module) dlclose(ctx->module);
|
88
|
+
#endif
|
89
|
+
ctx->module = NULL;
|
90
|
+
ctx->functions = NULL;
|
91
|
+
}
|
92
|
+
|
93
|
+
static void
|
94
|
+
pkcs11_ctx_free(pkcs11_ctx *ctx)
|
95
|
+
{
|
96
|
+
if(ctx->functions) ctx->functions->C_Finalize(NULL_PTR);
|
97
|
+
pkcs11_ctx_unload_library(ctx);
|
98
|
+
free(ctx);
|
99
|
+
}
|
100
|
+
|
101
|
+
/* rb_define_method(cPKCS11, "C_Finalize", pkcs11_C_Finalize, 0); */
|
102
|
+
/*
|
103
|
+
* Is called to indicate that an application is finished with the Cryptoki library.
|
104
|
+
* @see PKCS11::Library#close
|
105
|
+
*/
|
106
|
+
static VALUE
|
107
|
+
pkcs11_C_Finalize(VALUE self)
|
108
|
+
{
|
109
|
+
CK_C_Finalize func;
|
110
|
+
CK_RV rv;
|
111
|
+
|
112
|
+
GetFunction(self, C_Finalize, func);
|
113
|
+
CallFunction(C_Finalize, func, rv, NULL_PTR);
|
114
|
+
if (rv != CKR_OK) pkcs11_raise(self,rv);
|
115
|
+
|
116
|
+
return self;
|
117
|
+
}
|
118
|
+
|
119
|
+
/* rb_define_method(cPKCS11, "unload_library", pkcs11_unload_library, 0); */
|
120
|
+
/*
|
121
|
+
* Unloads the Cryptoki library from process memory.
|
122
|
+
* @see PKCS11::Library#close
|
123
|
+
*/
|
124
|
+
static VALUE
|
125
|
+
pkcs11_unload_library(VALUE self)
|
126
|
+
{
|
127
|
+
pkcs11_ctx *ctx;
|
128
|
+
|
129
|
+
Data_Get_Struct(self, pkcs11_ctx, ctx);
|
130
|
+
pkcs11_ctx_unload_library(ctx);
|
131
|
+
|
132
|
+
return self;
|
133
|
+
}
|
134
|
+
|
135
|
+
static VALUE
|
136
|
+
pkcs11_s_alloc(VALUE self)
|
137
|
+
{
|
138
|
+
VALUE obj;
|
139
|
+
pkcs11_ctx *ctx;
|
140
|
+
obj = Data_Make_Struct(self, pkcs11_ctx, 0, pkcs11_ctx_free, ctx);
|
141
|
+
return obj;
|
142
|
+
}
|
143
|
+
|
144
|
+
static VALUE
|
145
|
+
pkcs11_library_new(int argc, VALUE *argv, VALUE self)
|
146
|
+
{
|
147
|
+
return rb_funcall2(cPKCS11, sNEW, argc, argv);
|
148
|
+
}
|
149
|
+
|
150
|
+
/* rb_define_method(cPKCS11, "load_library", pkcs11_load_library, 0); */
|
151
|
+
/*
|
152
|
+
* Load a Cryptoki library into process memory.
|
153
|
+
* @see PKCS11::Library#initialize
|
154
|
+
*/
|
155
|
+
static VALUE
|
156
|
+
pkcs11_load_library(VALUE self, VALUE path)
|
157
|
+
{
|
158
|
+
const char *so_path;
|
159
|
+
pkcs11_ctx *ctx;
|
160
|
+
|
161
|
+
so_path = StringValuePtr(path);
|
162
|
+
Data_Get_Struct(self, pkcs11_ctx, ctx);
|
163
|
+
#ifdef compile_for_windows
|
164
|
+
if((ctx->module = LoadLibrary(so_path)) == NULL) {
|
165
|
+
char error_text[999] = "LoadLibrary() error";
|
166
|
+
FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_MAX_WIDTH_MASK,
|
167
|
+
NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
168
|
+
(LPTSTR)&error_text, sizeof(error_text), NULL);
|
169
|
+
rb_raise(ePKCS11Error, error_text);
|
170
|
+
}
|
171
|
+
#else
|
172
|
+
if((ctx->module = dlopen(so_path, RTLD_NOW)) == NULL) {
|
173
|
+
rb_raise(ePKCS11Error, "%s", dlerror());
|
174
|
+
}
|
175
|
+
#endif
|
176
|
+
|
177
|
+
return self;
|
178
|
+
}
|
179
|
+
|
180
|
+
/* rb_define_method(cPKCS11, "C_GetFunctionList", pkcs11_C_GetFunctionList, 0); */
|
181
|
+
/*
|
182
|
+
* Obtains a pointer to the Cryptoki library's list of function pointers. The pointer
|
183
|
+
* is stored in the {PKCS11::Library} object and used to call any Cryptoki functions.
|
184
|
+
*
|
185
|
+
* @see PKCS11::Library#initialize
|
186
|
+
*/
|
187
|
+
static VALUE
|
188
|
+
pkcs11_C_GetFunctionList(VALUE self)
|
189
|
+
{
|
190
|
+
pkcs11_ctx *ctx;
|
191
|
+
CK_RV rv;
|
192
|
+
CK_C_GetFunctionList func;
|
193
|
+
|
194
|
+
Data_Get_Struct(self, pkcs11_ctx, ctx);
|
195
|
+
#ifdef compile_for_windows
|
196
|
+
func = (CK_C_GetFunctionList)GetProcAddress(ctx->module, "C_GetFunctionList");
|
197
|
+
if(!func){
|
198
|
+
char error_text[999] = "GetProcAddress() error";
|
199
|
+
FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_MAX_WIDTH_MASK,
|
200
|
+
NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
201
|
+
(LPTSTR)&error_text, sizeof(error_text), NULL);
|
202
|
+
rb_raise(ePKCS11Error, error_text);
|
203
|
+
}
|
204
|
+
#else
|
205
|
+
func = (CK_C_GetFunctionList)dlsym(ctx->module, "C_GetFunctionList");
|
206
|
+
if(!func) rb_raise(ePKCS11Error, "%s", dlerror());
|
207
|
+
#endif
|
208
|
+
CallFunction(C_GetFunctionList, func, rv, &(ctx->functions));
|
209
|
+
if (rv != CKR_OK) pkcs11_raise(self,rv);
|
210
|
+
|
211
|
+
return self;
|
212
|
+
}
|
213
|
+
|
214
|
+
/* rb_define_method(cPKCS11, "C_Initialize", pkcs11_C_Initialize, 0); */
|
215
|
+
/*
|
216
|
+
* Initializes the Cryptoki library.
|
217
|
+
*/
|
218
|
+
static VALUE
|
219
|
+
pkcs11_C_Initialize(int argc, VALUE *argv, VALUE self)
|
220
|
+
{
|
221
|
+
VALUE init_args;
|
222
|
+
CK_C_Initialize func;
|
223
|
+
CK_C_INITIALIZE_ARGS *args;
|
224
|
+
CK_RV rv;
|
225
|
+
|
226
|
+
rb_scan_args(argc, argv, "01", &init_args);
|
227
|
+
if (NIL_P(init_args)) args = NULL_PTR;
|
228
|
+
else {
|
229
|
+
if (!rb_obj_is_kind_of(init_args, cCK_C_INITIALIZE_ARGS))
|
230
|
+
rb_raise(rb_eArgError, "2nd arg must be a PKCS11::CK_C_INITIALIZE_ARGS");
|
231
|
+
args = DATA_PTR(init_args);
|
232
|
+
}
|
233
|
+
GetFunction(self, C_Initialize, func);
|
234
|
+
CallFunction(C_Initialize, func, rv, args);
|
235
|
+
if (rv != CKR_OK) pkcs11_raise(self,rv);
|
236
|
+
|
237
|
+
return self;
|
238
|
+
}
|
239
|
+
|
240
|
+
static VALUE
|
241
|
+
pkcs11_initialize(int argc, VALUE *argv, VALUE self)
|
242
|
+
{
|
243
|
+
VALUE path, init_args;
|
244
|
+
|
245
|
+
rb_scan_args(argc, argv, "02", &path, &init_args);
|
246
|
+
if( !NIL_P(path) ){
|
247
|
+
rb_funcall(self, rb_intern("load_library"), 1, path);
|
248
|
+
rb_funcall(self, rb_intern("C_GetFunctionList"), 0);
|
249
|
+
rb_funcall2(self, rb_intern("C_Initialize"), 1, &init_args);
|
250
|
+
}
|
251
|
+
|
252
|
+
return self;
|
253
|
+
}
|
254
|
+
|
255
|
+
static VALUE
|
256
|
+
pkcs11_C_GetInfo(VALUE self)
|
257
|
+
{
|
258
|
+
CK_C_GetInfo func;
|
259
|
+
CK_RV rv;
|
260
|
+
VALUE info;
|
261
|
+
|
262
|
+
GetFunction(self, C_GetInfo, func);
|
263
|
+
info = pkcs11_new_struct(cCK_INFO);
|
264
|
+
CallFunction(C_GetInfo, func, rv, (CK_INFO_PTR)DATA_PTR(info));
|
265
|
+
if (rv != CKR_OK) pkcs11_raise(self,rv);
|
266
|
+
|
267
|
+
return info;
|
268
|
+
}
|
269
|
+
|
270
|
+
static VALUE
|
271
|
+
pkcs11_C_GetSlotList(VALUE self, VALUE presented)
|
272
|
+
{
|
273
|
+
CK_ULONG ulSlotCount;
|
274
|
+
CK_SLOT_ID_PTR pSlotList;
|
275
|
+
CK_RV rv;
|
276
|
+
CK_C_GetSlotList func;
|
277
|
+
CK_ULONG i;
|
278
|
+
VALUE ary = rb_ary_new();
|
279
|
+
|
280
|
+
GetFunction(self, C_GetSlotList, func);
|
281
|
+
CallFunction(C_GetSlotList, func, rv, CK_FALSE, NULL_PTR, &ulSlotCount);
|
282
|
+
if (rv != CKR_OK) pkcs11_raise(self,rv);
|
283
|
+
pSlotList = (CK_SLOT_ID_PTR)malloc(ulSlotCount*sizeof(CK_SLOT_ID));
|
284
|
+
CallFunction(C_GetSlotList, func, rv, RTEST(presented) ? CK_TRUE : CK_FALSE, pSlotList, &ulSlotCount);
|
285
|
+
if (rv != CKR_OK) {
|
286
|
+
free(pSlotList);
|
287
|
+
pkcs11_raise(self,rv);
|
288
|
+
}
|
289
|
+
for (i = 0; i < ulSlotCount; i++)
|
290
|
+
rb_ary_push(ary, HANDLE2NUM(pSlotList[i]));
|
291
|
+
free(pSlotList);
|
292
|
+
|
293
|
+
return ary;
|
294
|
+
}
|
295
|
+
|
296
|
+
static VALUE
|
297
|
+
pkcs11_C_GetSlotInfo(VALUE self, VALUE slot_id)
|
298
|
+
{
|
299
|
+
CK_RV rv;
|
300
|
+
CK_C_GetSlotInfo func;
|
301
|
+
VALUE info;
|
302
|
+
|
303
|
+
GetFunction(self, C_GetSlotInfo, func);
|
304
|
+
info = pkcs11_new_struct(cCK_SLOT_INFO);
|
305
|
+
CallFunction(C_GetSlotInfo, func, rv, NUM2HANDLE(slot_id), DATA_PTR(info));
|
306
|
+
if (rv != CKR_OK) pkcs11_raise(self,rv);
|
307
|
+
|
308
|
+
return info;
|
309
|
+
}
|
310
|
+
|
311
|
+
static VALUE
|
312
|
+
pkcs11_C_GetTokenInfo(VALUE self, VALUE slot_id)
|
313
|
+
{
|
314
|
+
CK_RV rv;
|
315
|
+
CK_C_GetTokenInfo func;
|
316
|
+
VALUE info;
|
317
|
+
|
318
|
+
GetFunction(self, C_GetTokenInfo, func);
|
319
|
+
info = pkcs11_new_struct(cCK_TOKEN_INFO);
|
320
|
+
CallFunction(C_GetTokenInfo, func, rv, NUM2HANDLE(slot_id), DATA_PTR(info));
|
321
|
+
if (rv != CKR_OK) pkcs11_raise(self,rv);
|
322
|
+
|
323
|
+
return info;
|
324
|
+
}
|
325
|
+
|
326
|
+
static VALUE
|
327
|
+
pkcs11_C_GetMechanismList(VALUE self, VALUE slot_id)
|
328
|
+
{
|
329
|
+
CK_RV rv;
|
330
|
+
CK_C_GetMechanismList func;
|
331
|
+
CK_MECHANISM_TYPE_PTR types;
|
332
|
+
CK_ULONG count;
|
333
|
+
VALUE ary;
|
334
|
+
CK_ULONG i;
|
335
|
+
|
336
|
+
ary = rb_ary_new();
|
337
|
+
GetFunction(self, C_GetMechanismList, func);
|
338
|
+
CallFunction(C_GetMechanismList, func, rv, NUM2HANDLE(slot_id), NULL_PTR, &count);
|
339
|
+
if (rv != CKR_OK) pkcs11_raise(self,rv);
|
340
|
+
if (count == 0) return ary;
|
341
|
+
|
342
|
+
types = (CK_MECHANISM_TYPE_PTR)malloc(sizeof(CK_MECHANISM_TYPE)*count);
|
343
|
+
if (!types) rb_sys_fail(0);
|
344
|
+
CallFunction(C_GetMechanismList, func, rv, NUM2HANDLE(slot_id), types, &count);
|
345
|
+
if (rv != CKR_OK){
|
346
|
+
free(types);
|
347
|
+
pkcs11_raise(self,rv);
|
348
|
+
}
|
349
|
+
for (i = 0; i < count; i++)
|
350
|
+
rb_ary_push(ary, HANDLE2NUM(*(types+i)));
|
351
|
+
free(types);
|
352
|
+
|
353
|
+
return ary;
|
354
|
+
}
|
355
|
+
|
356
|
+
static VALUE
|
357
|
+
pkcs11_C_GetMechanismInfo(VALUE self, VALUE slot_id, VALUE type)
|
358
|
+
{
|
359
|
+
CK_RV rv;
|
360
|
+
CK_C_GetMechanismInfo func;
|
361
|
+
VALUE info;
|
362
|
+
|
363
|
+
info = pkcs11_new_struct(cCK_MECHANISM_INFO);
|
364
|
+
GetFunction(self, C_GetMechanismInfo, func);
|
365
|
+
CallFunction(C_GetMechanismInfo, func, rv, NUM2HANDLE(slot_id), NUM2HANDLE(type), DATA_PTR(info));
|
366
|
+
if (rv != CKR_OK) pkcs11_raise(self,rv);
|
367
|
+
|
368
|
+
return info;
|
369
|
+
}
|
370
|
+
|
371
|
+
static VALUE
|
372
|
+
pkcs11_C_InitToken(VALUE self, VALUE slot_id, VALUE pin, VALUE label)
|
373
|
+
{
|
374
|
+
CK_RV rv;
|
375
|
+
CK_C_InitToken func;
|
376
|
+
|
377
|
+
StringValue(pin);
|
378
|
+
StringValue(label);
|
379
|
+
GetFunction(self, C_InitToken, func);
|
380
|
+
CallFunction(C_InitToken, func, rv, NUM2HANDLE(slot_id),
|
381
|
+
(CK_UTF8CHAR_PTR)RSTRING_PTR(pin), RSTRING_LEN(pin),
|
382
|
+
(CK_UTF8CHAR_PTR)RSTRING_PTR(label));
|
383
|
+
if (rv != CKR_OK) pkcs11_raise(self,rv);
|
384
|
+
|
385
|
+
return self;
|
386
|
+
}
|
387
|
+
|
388
|
+
static VALUE
|
389
|
+
pkcs11_C_InitPIN(VALUE self, VALUE session, VALUE pin)
|
390
|
+
{
|
391
|
+
CK_RV rv;
|
392
|
+
CK_C_InitPIN func;
|
393
|
+
|
394
|
+
StringValue(pin);
|
395
|
+
GetFunction(self, C_InitPIN, func);
|
396
|
+
CallFunction(C_InitPIN, func, rv, NUM2HANDLE(session),
|
397
|
+
(CK_UTF8CHAR_PTR)RSTRING_PTR(pin), RSTRING_LEN(pin));
|
398
|
+
if (rv != CKR_OK) pkcs11_raise(self,rv);
|
399
|
+
|
400
|
+
return self;
|
401
|
+
}
|
402
|
+
|
403
|
+
static VALUE
|
404
|
+
pkcs11_C_OpenSession(VALUE self, VALUE slot_id, VALUE flags)
|
405
|
+
{
|
406
|
+
CK_C_OpenSession func;
|
407
|
+
CK_RV rv;
|
408
|
+
CK_SESSION_HANDLE handle;
|
409
|
+
|
410
|
+
GetFunction(self, C_OpenSession, func);
|
411
|
+
CallFunction(C_OpenSession, func, rv, NUM2HANDLE(slot_id), NUM2ULONG(flags), 0, 0, &handle);
|
412
|
+
if(rv != CKR_OK) pkcs11_raise(self,rv);
|
413
|
+
|
414
|
+
return HANDLE2NUM(handle);
|
415
|
+
}
|
416
|
+
|
417
|
+
static VALUE
|
418
|
+
pkcs11_C_Login(VALUE self, VALUE session, VALUE user_type, VALUE pin)
|
419
|
+
{
|
420
|
+
CK_C_Login func;
|
421
|
+
CK_RV rv;
|
422
|
+
|
423
|
+
StringValue(pin);
|
424
|
+
GetFunction(self, C_Login, func);
|
425
|
+
CallFunction(C_Login, func, rv, NUM2HANDLE(session), NUM2ULONG(user_type),
|
426
|
+
(CK_UTF8CHAR_PTR)RSTRING_PTR(pin), RSTRING_LEN(pin));
|
427
|
+
if(rv != CKR_OK) pkcs11_raise(self,rv);
|
428
|
+
|
429
|
+
return self;
|
430
|
+
}
|
431
|
+
|
432
|
+
static VALUE
|
433
|
+
pkcs11_C_Logout(VALUE self, VALUE session)
|
434
|
+
{
|
435
|
+
CK_C_Logout func;
|
436
|
+
CK_RV rv;
|
437
|
+
|
438
|
+
GetFunction(self, C_Logout, func);
|
439
|
+
CallFunction(C_Logout, func, rv, NUM2HANDLE(session));
|
440
|
+
if(rv != CKR_OK) pkcs11_raise(self,rv);
|
441
|
+
|
442
|
+
return self;
|
443
|
+
}
|
444
|
+
|
445
|
+
static VALUE
|
446
|
+
pkcs11_C_CloseSession(VALUE self, VALUE session)
|
447
|
+
{
|
448
|
+
CK_C_CloseSession func;
|
449
|
+
CK_RV rv;
|
450
|
+
|
451
|
+
GetFunction(self, C_CloseSession, func);
|
452
|
+
CallFunction(C_CloseSession, func, rv, NUM2HANDLE(session));
|
453
|
+
if(rv != CKR_OK) pkcs11_raise(self,rv);
|
454
|
+
|
455
|
+
return self;
|
456
|
+
}
|
457
|
+
|
458
|
+
static VALUE
|
459
|
+
pkcs11_C_CloseAllSessions(VALUE self, VALUE slot_id)
|
460
|
+
{
|
461
|
+
CK_C_CloseAllSessions func;
|
462
|
+
CK_RV rv;
|
463
|
+
|
464
|
+
GetFunction(self, C_CloseAllSessions, func);
|
465
|
+
CallFunction(C_CloseAllSessions, func, rv, NUM2HANDLE(slot_id));
|
466
|
+
if(rv != CKR_OK) pkcs11_raise(self,rv);
|
467
|
+
|
468
|
+
return self;
|
469
|
+
}
|
470
|
+
|
471
|
+
static VALUE
|
472
|
+
pkcs11_C_GetSessionInfo(VALUE self, VALUE session)
|
473
|
+
{
|
474
|
+
CK_RV rv;
|
475
|
+
CK_C_GetSessionInfo func;
|
476
|
+
VALUE info;
|
477
|
+
|
478
|
+
info = pkcs11_new_struct(cCK_SESSION_INFO);
|
479
|
+
GetFunction(self, C_GetSessionInfo, func);
|
480
|
+
CallFunction(C_GetSessionInfo, func, rv, NUM2HANDLE(session), DATA_PTR(info));
|
481
|
+
if (rv != CKR_OK) pkcs11_raise(self,rv);
|
482
|
+
|
483
|
+
return info;
|
484
|
+
}
|
485
|
+
|
486
|
+
static VALUE
|
487
|
+
pkcs11_C_GetOperationState(VALUE self, VALUE session)
|
488
|
+
{
|
489
|
+
CK_RV rv;
|
490
|
+
CK_C_GetOperationState func;
|
491
|
+
VALUE state;
|
492
|
+
CK_ULONG size;
|
493
|
+
|
494
|
+
GetFunction(self, C_GetOperationState, func);
|
495
|
+
CallFunction(C_GetOperationState, func, rv, NUM2HANDLE(session), NULL_PTR, &size);
|
496
|
+
if (rv != CKR_OK) pkcs11_raise(self,rv);
|
497
|
+
state = rb_str_new(0, size);
|
498
|
+
CallFunction(C_GetOperationState, func, rv, NUM2HANDLE(session), (CK_BYTE_PTR)RSTRING_PTR(state), &size);
|
499
|
+
if (rv != CKR_OK) pkcs11_raise(self,rv);
|
500
|
+
rb_str_set_len(state, size);
|
501
|
+
|
502
|
+
return state;
|
503
|
+
}
|
504
|
+
|
505
|
+
static VALUE
|
506
|
+
pkcs11_C_SetOperationState(VALUE self, VALUE session, VALUE state, VALUE enc_key, VALUE auth_key)
|
507
|
+
{
|
508
|
+
CK_RV rv;
|
509
|
+
CK_C_SetOperationState func;
|
510
|
+
|
511
|
+
StringValue(state);
|
512
|
+
GetFunction(self, C_SetOperationState, func);
|
513
|
+
CallFunction(C_SetOperationState, func, rv, NUM2HANDLE(session),
|
514
|
+
(CK_BYTE_PTR)RSTRING_PTR(state), RSTRING_LEN(state),
|
515
|
+
NUM2HANDLE(enc_key), NUM2HANDLE(auth_key));
|
516
|
+
if (rv != CKR_OK) pkcs11_raise(self,rv);
|
517
|
+
|
518
|
+
return self;
|
519
|
+
}
|
520
|
+
|
521
|
+
static VALUE
|
522
|
+
pkcs11_C_SetPIN(VALUE self, VALUE session, VALUE old_pin, VALUE new_pin)
|
523
|
+
{
|
524
|
+
CK_C_SetPIN func;
|
525
|
+
CK_RV rv;
|
526
|
+
|
527
|
+
StringValue(old_pin);
|
528
|
+
StringValue(new_pin);
|
529
|
+
GetFunction(self, C_SetPIN, func);
|
530
|
+
CallFunction(C_SetPIN, func, rv, NUM2HANDLE(session),
|
531
|
+
(CK_UTF8CHAR_PTR)RSTRING_PTR(old_pin), RSTRING_LEN(old_pin),
|
532
|
+
(CK_UTF8CHAR_PTR)RSTRING_PTR(new_pin), RSTRING_LEN(new_pin));
|
533
|
+
if(rv != CKR_OK) pkcs11_raise(self,rv);
|
534
|
+
|
535
|
+
return self;
|
536
|
+
}
|
537
|
+
|
538
|
+
static CK_ATTRIBUTE*
|
539
|
+
pkcs11_attr_ary2buf(VALUE template)
|
540
|
+
{
|
541
|
+
int i;
|
542
|
+
CK_ATTRIBUTE *tmp;
|
543
|
+
|
544
|
+
Check_Type(template, T_ARRAY);
|
545
|
+
tmp = (CK_ATTRIBUTE*)
|
546
|
+
malloc(sizeof(CK_ATTRIBUTE)*RARRAY_LEN(template));
|
547
|
+
if (!tmp) rb_sys_fail(0);
|
548
|
+
for (i = 0; i < RARRAY_LEN(template); i++){
|
549
|
+
VALUE attr = rb_ary_entry(template, i);
|
550
|
+
if (!rb_obj_is_kind_of(attr, cCK_ATTRIBUTE)) {
|
551
|
+
free(tmp);
|
552
|
+
rb_raise(rb_eArgError, "templates must be an ary of PKCS11::CK_ATTRIBUTE");
|
553
|
+
}
|
554
|
+
memcpy(tmp+i, DATA_PTR(attr), sizeof(CK_ATTRIBUTE));
|
555
|
+
}
|
556
|
+
|
557
|
+
return tmp;
|
558
|
+
}
|
559
|
+
|
560
|
+
static VALUE
|
561
|
+
pkcs11_C_CreateObject(VALUE self, VALUE session, VALUE template)
|
562
|
+
{
|
563
|
+
CK_C_CreateObject func;
|
564
|
+
CK_RV rv;
|
565
|
+
CK_ATTRIBUTE *tmp;
|
566
|
+
CK_OBJECT_HANDLE handle;
|
567
|
+
|
568
|
+
tmp = pkcs11_attr_ary2buf(template);
|
569
|
+
GetFunction(self, C_CreateObject, func);
|
570
|
+
CallFunction(C_CreateObject, func, rv, NUM2HANDLE(session), tmp, RARRAY_LEN(template), &handle);
|
571
|
+
free(tmp);
|
572
|
+
if(rv != CKR_OK) pkcs11_raise(self,rv);
|
573
|
+
|
574
|
+
return HANDLE2NUM(handle);
|
575
|
+
}
|
576
|
+
|
577
|
+
static VALUE
|
578
|
+
pkcs11_C_CopyObject(VALUE self, VALUE session, VALUE object, VALUE template)
|
579
|
+
{
|
580
|
+
CK_C_CopyObject func;
|
581
|
+
CK_RV rv;
|
582
|
+
CK_ATTRIBUTE *tmp;
|
583
|
+
CK_OBJECT_HANDLE handle;
|
584
|
+
|
585
|
+
tmp = pkcs11_attr_ary2buf(template);
|
586
|
+
GetFunction(self, C_CopyObject, func);
|
587
|
+
CallFunction(C_CopyObject, func, rv, NUM2HANDLE(session), NUM2HANDLE(object), tmp, RARRAY_LEN(template), &handle);
|
588
|
+
free(tmp);
|
589
|
+
if(rv != CKR_OK) pkcs11_raise(self,rv);
|
590
|
+
|
591
|
+
return HANDLE2NUM(handle);
|
592
|
+
}
|
593
|
+
|
594
|
+
static VALUE
|
595
|
+
pkcs11_C_DestroyObject(VALUE self, VALUE session, VALUE handle)
|
596
|
+
{
|
597
|
+
CK_C_DestroyObject func;
|
598
|
+
CK_RV rv;
|
599
|
+
|
600
|
+
GetFunction(self, C_DestroyObject, func);
|
601
|
+
CallFunction(C_DestroyObject, func, rv, NUM2HANDLE(session), NUM2HANDLE(handle));
|
602
|
+
if(rv != CKR_OK) pkcs11_raise(self,rv);
|
603
|
+
|
604
|
+
return self;
|
605
|
+
}
|
606
|
+
|
607
|
+
static VALUE
|
608
|
+
pkcs11_C_GetObjectSize(VALUE self, VALUE session, VALUE handle)
|
609
|
+
{
|
610
|
+
CK_C_GetObjectSize func;
|
611
|
+
CK_RV rv;
|
612
|
+
CK_ULONG size;
|
613
|
+
|
614
|
+
GetFunction(self, C_GetObjectSize, func);
|
615
|
+
CallFunction(C_GetObjectSize, func, rv, NUM2HANDLE(session), NUM2HANDLE(handle), &size);
|
616
|
+
if(rv != CKR_OK) pkcs11_raise(self,rv);
|
617
|
+
|
618
|
+
return ULONG2NUM(size);
|
619
|
+
}
|
620
|
+
|
621
|
+
static VALUE
|
622
|
+
pkcs11_C_FindObjectsInit(VALUE self, VALUE session, VALUE template)
|
623
|
+
{
|
624
|
+
CK_C_FindObjectsInit func;
|
625
|
+
CK_RV rv;
|
626
|
+
CK_ATTRIBUTE_PTR tmp = NULL_PTR;
|
627
|
+
CK_ULONG tmp_size = 0;
|
628
|
+
|
629
|
+
if (!NIL_P(template)){
|
630
|
+
tmp = pkcs11_attr_ary2buf(template);
|
631
|
+
tmp_size = RARRAY_LEN(template);
|
632
|
+
}
|
633
|
+
GetFunction(self, C_FindObjectsInit, func);
|
634
|
+
CallFunction(C_FindObjectsInit, func, rv, NUM2HANDLE(session), tmp, tmp_size);
|
635
|
+
free(tmp);
|
636
|
+
if(rv != CKR_OK) pkcs11_raise(self,rv);
|
637
|
+
|
638
|
+
return self;
|
639
|
+
}
|
640
|
+
|
641
|
+
static VALUE
|
642
|
+
pkcs11_C_FindObjectsFinal(VALUE self, VALUE session)
|
643
|
+
{
|
644
|
+
CK_C_FindObjectsFinal func;
|
645
|
+
CK_RV rv;
|
646
|
+
|
647
|
+
GetFunction(self, C_FindObjectsFinal, func);
|
648
|
+
CallFunction(C_FindObjectsFinal, func, rv, NUM2HANDLE(session));
|
649
|
+
if(rv != CKR_OK) pkcs11_raise(self,rv);
|
650
|
+
|
651
|
+
return self;
|
652
|
+
}
|
653
|
+
|
654
|
+
static VALUE
|
655
|
+
pkcs11_C_FindObjects(VALUE self, VALUE session, VALUE max_count)
|
656
|
+
{
|
657
|
+
CK_C_FindObjects func;
|
658
|
+
CK_RV rv;
|
659
|
+
CK_OBJECT_HANDLE_PTR handles;
|
660
|
+
CK_ULONG count = 0;
|
661
|
+
VALUE ary;
|
662
|
+
CK_ULONG i;
|
663
|
+
|
664
|
+
handles = (CK_OBJECT_HANDLE_PTR)
|
665
|
+
malloc(sizeof(CK_OBJECT_HANDLE)*NUM2ULONG(max_count));
|
666
|
+
GetFunction(self, C_FindObjects, func);
|
667
|
+
CallFunction(C_FindObjects, func, rv, NUM2HANDLE(session), handles, NUM2ULONG(max_count), &count);
|
668
|
+
if(rv != CKR_OK){
|
669
|
+
free(handles);
|
670
|
+
pkcs11_raise(self,rv);
|
671
|
+
}
|
672
|
+
ary = rb_ary_new();
|
673
|
+
for(i = 0; i < count; i++)
|
674
|
+
rb_ary_push(ary, HANDLE2NUM(*(handles+i)));
|
675
|
+
free(handles);
|
676
|
+
|
677
|
+
return ary;
|
678
|
+
}
|
679
|
+
|
680
|
+
static VALUE ck_attr_s_alloc(VALUE);
|
681
|
+
|
682
|
+
static VALUE
|
683
|
+
pkcs11_C_GetAttributeValue(VALUE self, VALUE session, VALUE handle, VALUE template)
|
684
|
+
{
|
685
|
+
CK_C_GetAttributeValue func;
|
686
|
+
CK_RV rv;
|
687
|
+
CK_ULONG i, template_size;
|
688
|
+
CK_ATTRIBUTE_PTR tmp;
|
689
|
+
VALUE ary;
|
690
|
+
VALUE class_attr = rb_funcall(self, rb_intern("vendor_class_CK_ATTRIBUTE"), 0);
|
691
|
+
|
692
|
+
tmp = pkcs11_attr_ary2buf(template);
|
693
|
+
template_size = RARRAY_LEN(template);
|
694
|
+
GetFunction(self, C_GetAttributeValue, func);
|
695
|
+
CallFunction(C_GetAttributeValue, func, rv, NUM2HANDLE(session), NUM2HANDLE(handle), tmp, template_size);
|
696
|
+
if(rv != CKR_OK){
|
697
|
+
free(tmp);
|
698
|
+
pkcs11_raise(self,rv);
|
699
|
+
}
|
700
|
+
|
701
|
+
for (i = 0; i < template_size; i++){
|
702
|
+
CK_ATTRIBUTE_PTR attr = tmp + i;
|
703
|
+
if (attr->ulValueLen != (CK_ULONG)-1)
|
704
|
+
attr->pValue = (CK_BYTE_PTR)malloc(attr->ulValueLen);
|
705
|
+
}
|
706
|
+
CallFunction(C_GetAttributeValue, func, rv, NUM2HANDLE(session), NUM2HANDLE(handle), tmp, template_size);
|
707
|
+
if(rv != CKR_OK){
|
708
|
+
for (i = 0; i < template_size; i++){
|
709
|
+
CK_ATTRIBUTE_PTR attr = tmp + i;
|
710
|
+
if (attr->pValue) free(attr->pValue);
|
711
|
+
}
|
712
|
+
free(tmp);
|
713
|
+
pkcs11_raise(self,rv);
|
714
|
+
}
|
715
|
+
ary = rb_ary_new();
|
716
|
+
for (i = 0; i < template_size; i++){
|
717
|
+
CK_ATTRIBUTE_PTR attr = tmp + i;
|
718
|
+
if (attr->ulValueLen != (CK_ULONG)-1){
|
719
|
+
VALUE v = pkcs11_new_struct(class_attr);
|
720
|
+
memcpy(DATA_PTR(v), attr, sizeof(CK_ATTRIBUTE));
|
721
|
+
rb_ary_push(ary, v);
|
722
|
+
}
|
723
|
+
}
|
724
|
+
free(tmp);
|
725
|
+
|
726
|
+
return ary;
|
727
|
+
}
|
728
|
+
|
729
|
+
static VALUE
|
730
|
+
pkcs11_C_SetAttributeValue(VALUE self, VALUE session, VALUE handle, VALUE template)
|
731
|
+
{
|
732
|
+
CK_C_SetAttributeValue func;
|
733
|
+
CK_RV rv;
|
734
|
+
CK_ATTRIBUTE *tmp;
|
735
|
+
CK_ULONG template_size;
|
736
|
+
|
737
|
+
tmp = pkcs11_attr_ary2buf(template);
|
738
|
+
template_size = RARRAY_LEN(template);
|
739
|
+
GetFunction(self, C_SetAttributeValue, func);
|
740
|
+
CallFunction(C_SetAttributeValue, func, rv, NUM2HANDLE(session), NUM2HANDLE(handle), tmp, template_size);
|
741
|
+
free(tmp);
|
742
|
+
if(rv != CKR_OK) pkcs11_raise(self,rv);
|
743
|
+
|
744
|
+
return self;
|
745
|
+
}
|
746
|
+
|
747
|
+
static VALUE
|
748
|
+
pkcs11_C_SeedRandom(VALUE self, VALUE session, VALUE seed)
|
749
|
+
{
|
750
|
+
CK_C_SeedRandom func;
|
751
|
+
CK_RV rv;
|
752
|
+
|
753
|
+
GetFunction(self, C_SeedRandom, func);
|
754
|
+
CallFunction(C_SeedRandom, func, rv, NUM2HANDLE(session),
|
755
|
+
(CK_BYTE_PTR)RSTRING_PTR(seed), RSTRING_LEN(seed));
|
756
|
+
if(rv != CKR_OK) pkcs11_raise(self,rv);
|
757
|
+
|
758
|
+
return self;
|
759
|
+
}
|
760
|
+
|
761
|
+
static VALUE
|
762
|
+
pkcs11_C_GenerateRandom(VALUE self, VALUE session, VALUE size)
|
763
|
+
{
|
764
|
+
CK_C_GenerateRandom func;
|
765
|
+
CK_ULONG sz = NUM2ULONG(size);
|
766
|
+
VALUE buf = rb_str_new(0, sz);
|
767
|
+
CK_RV rv;
|
768
|
+
|
769
|
+
GetFunction(self, C_GenerateRandom, func);
|
770
|
+
CallFunction(C_GenerateRandom, func, rv, NUM2HANDLE(session), (CK_BYTE_PTR)RSTRING_PTR(buf), sz);
|
771
|
+
if(rv != CKR_OK) pkcs11_raise(self,rv);
|
772
|
+
|
773
|
+
return buf;
|
774
|
+
}
|
775
|
+
|
776
|
+
static VALUE
|
777
|
+
pkcs11_C_WaitForSlotEvent(VALUE self, VALUE flags)
|
778
|
+
{
|
779
|
+
CK_C_WaitForSlotEvent func;
|
780
|
+
CK_RV rv;
|
781
|
+
CK_SLOT_ID slot_id;
|
782
|
+
|
783
|
+
GetFunction(self, C_WaitForSlotEvent, func);
|
784
|
+
CallFunction(C_WaitForSlotEvent, func, rv, NUM2ULONG(flags), &slot_id, NULL_PTR);
|
785
|
+
if(rv == CKR_NO_EVENT) return Qnil;
|
786
|
+
if(rv != CKR_OK) pkcs11_raise(self,rv);
|
787
|
+
|
788
|
+
return HANDLE2NUM(slot_id);
|
789
|
+
}
|
790
|
+
|
791
|
+
///////////////////////////////////////
|
792
|
+
|
793
|
+
typedef VALUE (*init_func)
|
794
|
+
(CK_SESSION_HANDLE, CK_MECHANISM_PTR, CK_OBJECT_HANDLE);
|
795
|
+
typedef VALUE (*crypt_func)
|
796
|
+
(CK_SESSION_HANDLE, CK_BYTE_PTR, CK_ULONG, CK_BYTE_PTR, CK_ULONG_PTR);
|
797
|
+
typedef VALUE (*crypt_update_func)
|
798
|
+
(CK_SESSION_HANDLE, CK_BYTE_PTR, CK_ULONG, CK_BYTE_PTR, CK_ULONG_PTR);
|
799
|
+
typedef VALUE (*crypt_final_func)
|
800
|
+
(CK_SESSION_HANDLE, CK_BYTE_PTR, CK_ULONG_PTR);
|
801
|
+
typedef VALUE (*sign_update_func)
|
802
|
+
(CK_SESSION_HANDLE, CK_BYTE_PTR, CK_ULONG);
|
803
|
+
typedef VALUE (*verify_func)
|
804
|
+
(CK_SESSION_HANDLE, CK_BYTE_PTR, CK_ULONG, CK_BYTE_PTR, CK_ULONG);
|
805
|
+
typedef VALUE (*verify_final_func)
|
806
|
+
(CK_SESSION_HANDLE, CK_BYTE_PTR, CK_ULONG);
|
807
|
+
|
808
|
+
#define common_crypt(self, s, d, sz, f) common_crypt_update(self, s, d, sz, f)
|
809
|
+
|
810
|
+
static VALUE
|
811
|
+
common_init(VALUE self, VALUE session, VALUE mechanism, VALUE key, init_func func)
|
812
|
+
{
|
813
|
+
CK_RV rv;
|
814
|
+
CK_MECHANISM_PTR m;
|
815
|
+
|
816
|
+
if (!rb_obj_is_kind_of(mechanism, cCK_MECHANISM))
|
817
|
+
rb_raise(rb_eArgError, "2nd arg must be a PKCS11::CK_MECHANISM");
|
818
|
+
m = DATA_PTR(mechanism);
|
819
|
+
/* Use the function signature of any of the various C_*Init functions. */
|
820
|
+
CallFunction(C_EncryptInit, func, rv, NUM2HANDLE(session), m, NUM2HANDLE(key));
|
821
|
+
if(rv != CKR_OK) pkcs11_raise(self,rv);
|
822
|
+
|
823
|
+
return Qnil;
|
824
|
+
}
|
825
|
+
|
826
|
+
static VALUE
|
827
|
+
common_crypt_update(VALUE self, VALUE session, VALUE data, VALUE size, crypt_update_func func)
|
828
|
+
{
|
829
|
+
CK_RV rv;
|
830
|
+
CK_ULONG sz = 0;
|
831
|
+
VALUE buf;
|
832
|
+
|
833
|
+
StringValue(data);
|
834
|
+
if (NIL_P(size)){
|
835
|
+
CallFunction(C_EncryptUpdate, func, rv, NUM2HANDLE(session),
|
836
|
+
(CK_BYTE_PTR)RSTRING_PTR(data), RSTRING_LEN(data),
|
837
|
+
NULL_PTR, &sz);
|
838
|
+
if(rv != CKR_OK) pkcs11_raise(self,rv);
|
839
|
+
}else{
|
840
|
+
sz = NUM2ULONG(size);
|
841
|
+
}
|
842
|
+
buf = rb_str_new(0, sz);
|
843
|
+
|
844
|
+
CallFunction(C_EncryptUpdate, func, rv, NUM2HANDLE(session),
|
845
|
+
(CK_BYTE_PTR)RSTRING_PTR(data), RSTRING_LEN(data),
|
846
|
+
(CK_BYTE_PTR)RSTRING_PTR(buf), &sz);
|
847
|
+
if(rv != CKR_OK) pkcs11_raise(self,rv);
|
848
|
+
rb_str_set_len(buf, sz);
|
849
|
+
|
850
|
+
return buf;
|
851
|
+
}
|
852
|
+
|
853
|
+
static VALUE
|
854
|
+
common_crypt_final(VALUE self, VALUE session, VALUE size, crypt_final_func func)
|
855
|
+
{
|
856
|
+
CK_RV rv;
|
857
|
+
CK_ULONG sz = 0;
|
858
|
+
VALUE buf;
|
859
|
+
|
860
|
+
if (NIL_P(size)){
|
861
|
+
CallFunction(C_EncryptFinal, func, rv, NUM2HANDLE(session), NULL_PTR, &sz);
|
862
|
+
if(rv != CKR_OK) pkcs11_raise(self,rv);
|
863
|
+
}else{
|
864
|
+
sz = NUM2ULONG(size);
|
865
|
+
}
|
866
|
+
buf = rb_str_new(0, sz);
|
867
|
+
|
868
|
+
CallFunction(C_EncryptFinal, func, rv, NUM2HANDLE(session), (CK_BYTE_PTR)RSTRING_PTR(buf), &sz);
|
869
|
+
if(rv != CKR_OK) pkcs11_raise(self,rv);
|
870
|
+
rb_str_set_len(buf, sz);
|
871
|
+
|
872
|
+
return buf;
|
873
|
+
}
|
874
|
+
|
875
|
+
static VALUE
|
876
|
+
common_sign_update(VALUE self, VALUE session, VALUE data, sign_update_func func)
|
877
|
+
{
|
878
|
+
CK_RV rv;
|
879
|
+
|
880
|
+
StringValue(data);
|
881
|
+
CallFunction(C_SignUpdate, func, rv, NUM2HANDLE(session),
|
882
|
+
(CK_BYTE_PTR)RSTRING_PTR(data), RSTRING_LEN(data));
|
883
|
+
if(rv != CKR_OK) pkcs11_raise(self,rv);
|
884
|
+
|
885
|
+
return Qnil;
|
886
|
+
}
|
887
|
+
|
888
|
+
static VALUE
|
889
|
+
common_verify(VALUE self, VALUE session, VALUE data, VALUE sig, verify_func func)
|
890
|
+
{
|
891
|
+
CK_RV rv;
|
892
|
+
|
893
|
+
StringValue(data);
|
894
|
+
StringValue(sig);
|
895
|
+
/* Use the function signature of any of the various C_Verify* functions. */
|
896
|
+
CallFunction(C_Verify, func, rv, NUM2HANDLE(session),
|
897
|
+
(CK_BYTE_PTR)RSTRING_PTR(data), RSTRING_LEN(data),
|
898
|
+
(CK_BYTE_PTR)RSTRING_PTR(sig), RSTRING_LEN(sig));
|
899
|
+
if(rv != CKR_OK) pkcs11_raise(self,rv);
|
900
|
+
|
901
|
+
return Qnil;
|
902
|
+
}
|
903
|
+
|
904
|
+
////
|
905
|
+
|
906
|
+
static VALUE
|
907
|
+
pkcs11_C_EncryptInit(VALUE self, VALUE session, VALUE mechanism, VALUE key)
|
908
|
+
{
|
909
|
+
CK_C_EncryptInit func;
|
910
|
+
GetFunction(self, C_EncryptInit, func);
|
911
|
+
common_init(self, session, mechanism, key, func);
|
912
|
+
return self;
|
913
|
+
}
|
914
|
+
|
915
|
+
static VALUE
|
916
|
+
pkcs11_C_Encrypt(VALUE self, VALUE session, VALUE data, VALUE size)
|
917
|
+
{
|
918
|
+
CK_C_Encrypt func;
|
919
|
+
GetFunction(self, C_Encrypt, func);
|
920
|
+
return common_crypt(self, session, data, size, func);
|
921
|
+
}
|
922
|
+
|
923
|
+
static VALUE
|
924
|
+
pkcs11_C_EncryptUpdate(VALUE self, VALUE session, VALUE data, VALUE size)
|
925
|
+
{
|
926
|
+
CK_C_EncryptUpdate func;
|
927
|
+
GetFunction(self, C_EncryptUpdate, func);
|
928
|
+
return common_crypt_update(self, session, data, size, func);
|
929
|
+
}
|
930
|
+
|
931
|
+
static VALUE
|
932
|
+
pkcs11_C_EncryptFinal(VALUE self, VALUE session, VALUE size)
|
933
|
+
{
|
934
|
+
CK_C_EncryptFinal func;
|
935
|
+
GetFunction(self, C_EncryptFinal, func);
|
936
|
+
return common_crypt_final(self, session, size, func);
|
937
|
+
}
|
938
|
+
|
939
|
+
static VALUE
|
940
|
+
pkcs11_C_DecryptInit(VALUE self, VALUE session, VALUE mechanism, VALUE key)
|
941
|
+
{
|
942
|
+
CK_C_DecryptInit func;
|
943
|
+
GetFunction(self, C_DecryptInit, func);
|
944
|
+
common_init(self, session, mechanism, key, func);
|
945
|
+
return self;
|
946
|
+
}
|
947
|
+
|
948
|
+
static VALUE
|
949
|
+
pkcs11_C_Decrypt(VALUE self, VALUE session, VALUE data, VALUE size)
|
950
|
+
{
|
951
|
+
CK_C_Decrypt func;
|
952
|
+
GetFunction(self, C_Decrypt, func);
|
953
|
+
return common_crypt(self, session, data, size, func);
|
954
|
+
}
|
955
|
+
|
956
|
+
static VALUE
|
957
|
+
pkcs11_C_DecryptUpdate(VALUE self, VALUE session, VALUE data, VALUE size)
|
958
|
+
{
|
959
|
+
CK_C_DecryptUpdate func;
|
960
|
+
GetFunction(self, C_DecryptUpdate, func);
|
961
|
+
return common_crypt_update(self, session, data, size, func);
|
962
|
+
}
|
963
|
+
|
964
|
+
static VALUE
|
965
|
+
pkcs11_C_DecryptFinal(VALUE self, VALUE session, VALUE size)
|
966
|
+
{
|
967
|
+
CK_C_DecryptFinal func;
|
968
|
+
GetFunction(self, C_DecryptFinal, func);
|
969
|
+
return common_crypt_final(self, session, size, func);
|
970
|
+
}
|
971
|
+
|
972
|
+
#define common_sign(self, s, d, sz, f) common_crypt(self, s, d, sz, f)
|
973
|
+
#define common_sign_final(self, s, sz, f) common_crypt_final(self, s, sz, f)
|
974
|
+
#define common_verify_update(self, s, d, f) common_sign_update(self, s, d, f)
|
975
|
+
#define common_verify_final(self, s, d, f) common_sign_update(self, s, d, f)
|
976
|
+
#define common_verify_recover(self, s, d, sz, f) common_sign(self, s, d, sz, f)
|
977
|
+
|
978
|
+
static VALUE
|
979
|
+
pkcs11_C_SignInit(VALUE self, VALUE session, VALUE mechanism, VALUE key)
|
980
|
+
{
|
981
|
+
CK_C_SignInit func;
|
982
|
+
GetFunction(self, C_SignInit, func);
|
983
|
+
common_init(self, session, mechanism, key, func);
|
984
|
+
return self;
|
985
|
+
}
|
986
|
+
|
987
|
+
static VALUE
|
988
|
+
pkcs11_C_Sign(VALUE self, VALUE session, VALUE data, VALUE size)
|
989
|
+
{
|
990
|
+
CK_C_Sign func;
|
991
|
+
GetFunction(self, C_Sign, func);
|
992
|
+
return common_sign(self, session, data, size, func);
|
993
|
+
}
|
994
|
+
|
995
|
+
static VALUE
|
996
|
+
pkcs11_C_SignUpdate(VALUE self, VALUE session, VALUE data)
|
997
|
+
{
|
998
|
+
CK_C_SignUpdate func;
|
999
|
+
GetFunction(self, C_SignUpdate, func);
|
1000
|
+
common_sign_update(self, session, data, func);
|
1001
|
+
return self;
|
1002
|
+
}
|
1003
|
+
|
1004
|
+
static VALUE
|
1005
|
+
pkcs11_C_SignFinal(VALUE self, VALUE session, VALUE size)
|
1006
|
+
{
|
1007
|
+
CK_C_SignFinal func;
|
1008
|
+
GetFunction(self, C_SignFinal, func);
|
1009
|
+
return common_sign_final(self, session, size, func);
|
1010
|
+
}
|
1011
|
+
|
1012
|
+
static VALUE
|
1013
|
+
pkcs11_C_SignRecoverInit(VALUE self, VALUE session, VALUE mechanism, VALUE key)
|
1014
|
+
{
|
1015
|
+
CK_C_SignRecoverInit func;
|
1016
|
+
GetFunction(self, C_SignRecoverInit, func);
|
1017
|
+
common_init(self, session, mechanism, key, func);
|
1018
|
+
return self;
|
1019
|
+
}
|
1020
|
+
|
1021
|
+
static VALUE
|
1022
|
+
pkcs11_C_SignRecover(VALUE self, VALUE session, VALUE data, VALUE size)
|
1023
|
+
{
|
1024
|
+
CK_C_SignRecover func;
|
1025
|
+
GetFunction(self, C_SignRecover, func);
|
1026
|
+
return common_sign(self, session, data, size, func);
|
1027
|
+
}
|
1028
|
+
|
1029
|
+
static VALUE
|
1030
|
+
pkcs11_C_VerifyInit(VALUE self, VALUE session, VALUE mechanism, VALUE key)
|
1031
|
+
{
|
1032
|
+
CK_C_VerifyInit func;
|
1033
|
+
GetFunction(self, C_VerifyInit, func);
|
1034
|
+
common_init(self, session, mechanism, key, func);
|
1035
|
+
return self;
|
1036
|
+
}
|
1037
|
+
|
1038
|
+
static VALUE
|
1039
|
+
pkcs11_C_Verify(VALUE self, VALUE session, VALUE data, VALUE sig)
|
1040
|
+
{
|
1041
|
+
CK_C_Verify func;
|
1042
|
+
GetFunction(self, C_Verify, func);
|
1043
|
+
common_verify(self, session, data, sig, func);
|
1044
|
+
return Qtrue;
|
1045
|
+
}
|
1046
|
+
|
1047
|
+
static VALUE
|
1048
|
+
pkcs11_C_VerifyUpdate(VALUE self, VALUE session, VALUE data)
|
1049
|
+
{
|
1050
|
+
CK_C_VerifyUpdate func;
|
1051
|
+
GetFunction(self, C_VerifyUpdate, func);
|
1052
|
+
common_verify_update(self, session, data, func);
|
1053
|
+
return self;
|
1054
|
+
}
|
1055
|
+
|
1056
|
+
static VALUE
|
1057
|
+
pkcs11_C_VerifyFinal(VALUE self, VALUE session, VALUE sig)
|
1058
|
+
{
|
1059
|
+
CK_C_VerifyFinal func;
|
1060
|
+
GetFunction(self, C_VerifyFinal, func);
|
1061
|
+
common_verify_final(self, session, sig, func);
|
1062
|
+
return Qtrue;
|
1063
|
+
}
|
1064
|
+
|
1065
|
+
static VALUE
|
1066
|
+
pkcs11_C_VerifyRecoverInit(VALUE self, VALUE session, VALUE mechanism, VALUE key)
|
1067
|
+
{
|
1068
|
+
CK_C_VerifyRecoverInit func;
|
1069
|
+
GetFunction(self, C_VerifyRecoverInit, func);
|
1070
|
+
common_init(self, session, mechanism, key, func);
|
1071
|
+
return self;
|
1072
|
+
}
|
1073
|
+
|
1074
|
+
static VALUE
|
1075
|
+
pkcs11_C_VerifyRecover(VALUE self, VALUE session, VALUE sig, VALUE size)
|
1076
|
+
{
|
1077
|
+
CK_C_VerifyRecover func;
|
1078
|
+
GetFunction(self, C_VerifyRecover, func);
|
1079
|
+
common_verify_recover(self, session, sig, size, func);
|
1080
|
+
return Qtrue;
|
1081
|
+
}
|
1082
|
+
|
1083
|
+
#define common_digest(self, s, d, sz, f) common_crypt(self, s, d, sz, f)
|
1084
|
+
#define common_digest_update(self, s, d, f) common_sign_update(self, s, d, f)
|
1085
|
+
#define common_digest_final(self, s, sz, f) common_crypt_final(self, s, sz, f)
|
1086
|
+
|
1087
|
+
VALUE
|
1088
|
+
pkcs11_C_DigestInit(VALUE self, VALUE session, VALUE mechanism)
|
1089
|
+
{
|
1090
|
+
CK_C_DigestInit func;
|
1091
|
+
CK_MECHANISM_PTR m;
|
1092
|
+
CK_RV rv;
|
1093
|
+
|
1094
|
+
GetFunction(self, C_DigestInit, func);
|
1095
|
+
if (!rb_obj_is_kind_of(mechanism, cCK_MECHANISM))
|
1096
|
+
rb_raise(rb_eArgError, "2nd arg must be a PKCS11::CK_MECHANISM");
|
1097
|
+
m = DATA_PTR(mechanism);
|
1098
|
+
CallFunction(C_DigestInit, func, rv, NUM2HANDLE(session), m);
|
1099
|
+
if(rv != CKR_OK) pkcs11_raise(self,rv);
|
1100
|
+
|
1101
|
+
return self;
|
1102
|
+
}
|
1103
|
+
|
1104
|
+
VALUE
|
1105
|
+
pkcs11_C_Digest(VALUE self, VALUE session, VALUE data, VALUE size)
|
1106
|
+
{
|
1107
|
+
CK_C_Digest func;
|
1108
|
+
GetFunction(self, C_Digest, func);
|
1109
|
+
return common_digest(self, session, data, size, func);
|
1110
|
+
}
|
1111
|
+
|
1112
|
+
VALUE
|
1113
|
+
pkcs11_C_DigestUpdate(VALUE self, VALUE session, VALUE data)
|
1114
|
+
{
|
1115
|
+
CK_C_DigestUpdate func;
|
1116
|
+
GetFunction(self, C_DigestUpdate, func);
|
1117
|
+
common_digest_update(self, session, data, func);
|
1118
|
+
return self;
|
1119
|
+
}
|
1120
|
+
|
1121
|
+
VALUE
|
1122
|
+
pkcs11_C_DigestKey(VALUE self, VALUE session, VALUE handle)
|
1123
|
+
{
|
1124
|
+
CK_C_DigestKey func;
|
1125
|
+
CK_RV rv;
|
1126
|
+
|
1127
|
+
GetFunction(self, C_DigestKey, func);
|
1128
|
+
CallFunction(C_DigestKey, func, rv, NUM2HANDLE(session), NUM2HANDLE(handle));
|
1129
|
+
if(rv != CKR_OK) pkcs11_raise(self,rv);
|
1130
|
+
|
1131
|
+
return self;
|
1132
|
+
}
|
1133
|
+
|
1134
|
+
VALUE
|
1135
|
+
pkcs11_C_DigestFinal(VALUE self, VALUE session, VALUE size)
|
1136
|
+
{
|
1137
|
+
CK_C_DigestFinal func;
|
1138
|
+
GetFunction(self, C_DigestFinal, func);
|
1139
|
+
return common_digest_final(self, session, size, func);
|
1140
|
+
}
|
1141
|
+
|
1142
|
+
VALUE
|
1143
|
+
pkcs11_C_DigestEncryptUpdate(VALUE self, VALUE session, VALUE data, VALUE size)
|
1144
|
+
{
|
1145
|
+
CK_C_DigestEncryptUpdate func;
|
1146
|
+
GetFunction(self, C_DigestEncryptUpdate, func);
|
1147
|
+
return common_crypt_update(self, session, data, size, func);
|
1148
|
+
}
|
1149
|
+
|
1150
|
+
VALUE
|
1151
|
+
pkcs11_C_DecryptDigestUpdate(VALUE self, VALUE session, VALUE data, VALUE size)
|
1152
|
+
{
|
1153
|
+
CK_C_DecryptDigestUpdate func;
|
1154
|
+
GetFunction(self, C_DecryptDigestUpdate, func);
|
1155
|
+
return common_crypt_update(self, session, data, size, func);
|
1156
|
+
}
|
1157
|
+
|
1158
|
+
VALUE
|
1159
|
+
pkcs11_C_SignEncryptUpdate(VALUE self, VALUE session, VALUE data, VALUE size)
|
1160
|
+
{
|
1161
|
+
CK_C_SignEncryptUpdate func;
|
1162
|
+
GetFunction(self, C_SignEncryptUpdate, func);
|
1163
|
+
return common_crypt_update(self, session, data, size, func);
|
1164
|
+
}
|
1165
|
+
|
1166
|
+
VALUE
|
1167
|
+
pkcs11_C_DecryptVerifyUpdate(VALUE self, VALUE session, VALUE data, VALUE size)
|
1168
|
+
{
|
1169
|
+
CK_C_DecryptVerifyUpdate func;
|
1170
|
+
GetFunction(self, C_DecryptVerifyUpdate, func);
|
1171
|
+
return common_crypt_update(self, session, data, size, func);
|
1172
|
+
}
|
1173
|
+
|
1174
|
+
VALUE
|
1175
|
+
pkcs11_C_GenerateKey(VALUE self, VALUE session, VALUE mechanism, VALUE template){
|
1176
|
+
CK_C_GenerateKey func;
|
1177
|
+
CK_ATTRIBUTE_PTR tmp;
|
1178
|
+
CK_OBJECT_HANDLE handle;
|
1179
|
+
CK_MECHANISM_PTR m;
|
1180
|
+
CK_RV rv;
|
1181
|
+
|
1182
|
+
GetFunction(self, C_GenerateKey, func);
|
1183
|
+
if (!rb_obj_is_kind_of(mechanism, cCK_MECHANISM))
|
1184
|
+
rb_raise(rb_eArgError, "2nd arg must be a PKCS11::CK_MECHANISM");
|
1185
|
+
m = DATA_PTR(mechanism);
|
1186
|
+
tmp = pkcs11_attr_ary2buf(template);
|
1187
|
+
CallFunction(C_GenerateKey, func, rv, NUM2HANDLE(session), m, tmp, RARRAY_LEN(template), &handle);
|
1188
|
+
free(tmp);
|
1189
|
+
if(rv != CKR_OK) pkcs11_raise(self,rv);
|
1190
|
+
|
1191
|
+
return HANDLE2NUM(handle);
|
1192
|
+
}
|
1193
|
+
|
1194
|
+
VALUE
|
1195
|
+
pkcs11_C_GenerateKeyPair(VALUE self, VALUE session, VALUE mechanism, VALUE pubkey_template, VALUE privkey_template)
|
1196
|
+
{
|
1197
|
+
CK_C_GenerateKeyPair func;
|
1198
|
+
CK_ATTRIBUTE_PTR pubkey_tmp, privkey_tmp;
|
1199
|
+
CK_OBJECT_HANDLE pubkey_handle, privkey_handle;
|
1200
|
+
CK_MECHANISM_PTR m;
|
1201
|
+
CK_RV rv;
|
1202
|
+
VALUE ary;
|
1203
|
+
|
1204
|
+
GetFunction(self, C_GenerateKeyPair, func);
|
1205
|
+
if (!rb_obj_is_kind_of(mechanism, cCK_MECHANISM))
|
1206
|
+
rb_raise(rb_eArgError, "2nd arg must be a PKCS11::CK_MECHANISM");
|
1207
|
+
m = DATA_PTR(mechanism);
|
1208
|
+
pubkey_tmp = pkcs11_attr_ary2buf(pubkey_template);
|
1209
|
+
privkey_tmp = pkcs11_attr_ary2buf(privkey_template);
|
1210
|
+
|
1211
|
+
CallFunction(C_GenerateKeyPair, func, rv, NUM2HANDLE(session), m,
|
1212
|
+
pubkey_tmp, RARRAY_LEN(pubkey_template),
|
1213
|
+
privkey_tmp, RARRAY_LEN(privkey_template),
|
1214
|
+
&pubkey_handle, &privkey_handle);
|
1215
|
+
free(pubkey_tmp);
|
1216
|
+
free(privkey_tmp);
|
1217
|
+
if(rv != CKR_OK) pkcs11_raise(self,rv);
|
1218
|
+
ary = rb_ary_new();
|
1219
|
+
rb_ary_push(ary, HANDLE2NUM(pubkey_handle));
|
1220
|
+
rb_ary_push(ary, HANDLE2NUM(privkey_handle));
|
1221
|
+
|
1222
|
+
return ary;
|
1223
|
+
}
|
1224
|
+
|
1225
|
+
VALUE
|
1226
|
+
pkcs11_C_WrapKey(VALUE self, VALUE session, VALUE mechanism, VALUE wrapping, VALUE wrapped, VALUE size)
|
1227
|
+
{
|
1228
|
+
CK_C_WrapKey func;
|
1229
|
+
CK_MECHANISM_PTR m;
|
1230
|
+
CK_ULONG sz = 0;
|
1231
|
+
VALUE buf;
|
1232
|
+
CK_RV rv;
|
1233
|
+
|
1234
|
+
GetFunction(self, C_WrapKey, func);
|
1235
|
+
if (!rb_obj_is_kind_of(mechanism, cCK_MECHANISM))
|
1236
|
+
rb_raise(rb_eArgError, "2nd arg must be a PKCS11::CK_MECHANISM");
|
1237
|
+
m = DATA_PTR(mechanism);
|
1238
|
+
if (NIL_P(size)){
|
1239
|
+
CallFunction(C_WrapKey, func, rv, NUM2HANDLE(session), m,
|
1240
|
+
NUM2HANDLE(wrapping), NUM2HANDLE(wrapped),
|
1241
|
+
(CK_BYTE_PTR)NULL_PTR, &sz);
|
1242
|
+
if(rv != CKR_OK) pkcs11_raise(self,rv);
|
1243
|
+
}else{
|
1244
|
+
sz = NUM2ULONG(size);
|
1245
|
+
}
|
1246
|
+
buf = rb_str_new(0, sz);
|
1247
|
+
|
1248
|
+
CallFunction(C_WrapKey, func, rv, NUM2HANDLE(session), m,
|
1249
|
+
NUM2HANDLE(wrapping), NUM2HANDLE(wrapped),
|
1250
|
+
(CK_BYTE_PTR)RSTRING_PTR(buf), &sz);
|
1251
|
+
if(rv != CKR_OK) pkcs11_raise(self,rv);
|
1252
|
+
rb_str_set_len(buf, sz);
|
1253
|
+
|
1254
|
+
return buf;
|
1255
|
+
}
|
1256
|
+
|
1257
|
+
VALUE
|
1258
|
+
pkcs11_C_UnwrapKey(VALUE self, VALUE session, VALUE mechanism, VALUE wrapping, VALUE wrapped, VALUE template)
|
1259
|
+
{
|
1260
|
+
CK_C_UnwrapKey func;
|
1261
|
+
CK_MECHANISM_PTR m;
|
1262
|
+
CK_ATTRIBUTE_PTR tmp;
|
1263
|
+
CK_OBJECT_HANDLE h;
|
1264
|
+
CK_RV rv;
|
1265
|
+
|
1266
|
+
GetFunction(self, C_UnwrapKey, func);
|
1267
|
+
if (!rb_obj_is_kind_of(mechanism, cCK_MECHANISM))
|
1268
|
+
rb_raise(rb_eArgError, "2nd arg must be a PKCS11::CK_MECHANISM");
|
1269
|
+
m = DATA_PTR(mechanism);
|
1270
|
+
tmp = pkcs11_attr_ary2buf(template);
|
1271
|
+
CallFunction(C_UnwrapKey, func, rv, NUM2HANDLE(session), m, NUM2HANDLE(wrapping),
|
1272
|
+
(CK_BYTE_PTR)RSTRING_PTR(wrapped), RSTRING_LEN(wrapped),
|
1273
|
+
tmp, RARRAY_LEN(template), &h);
|
1274
|
+
free(tmp);
|
1275
|
+
if(rv != CKR_OK) pkcs11_raise(self,rv);
|
1276
|
+
|
1277
|
+
return HANDLE2NUM(h);
|
1278
|
+
}
|
1279
|
+
|
1280
|
+
VALUE
|
1281
|
+
pkcs11_C_DeriveKey(VALUE self, VALUE session, VALUE mechanism, VALUE base, VALUE template)
|
1282
|
+
{
|
1283
|
+
CK_C_DeriveKey func;
|
1284
|
+
CK_MECHANISM_PTR m;
|
1285
|
+
CK_ATTRIBUTE_PTR tmp;
|
1286
|
+
CK_OBJECT_HANDLE h;
|
1287
|
+
CK_RV rv;
|
1288
|
+
|
1289
|
+
GetFunction(self, C_DeriveKey, func);
|
1290
|
+
if (!rb_obj_is_kind_of(mechanism, cCK_MECHANISM))
|
1291
|
+
rb_raise(rb_eArgError, "2nd arg must be a PKCS11::CK_MECHANISM");
|
1292
|
+
m = DATA_PTR(mechanism);
|
1293
|
+
tmp = pkcs11_attr_ary2buf(template);
|
1294
|
+
CallFunction(C_DeriveKey, func, rv, NUM2HANDLE(session), m, NUM2HANDLE(base),
|
1295
|
+
tmp, RARRAY_LEN(template), &h);
|
1296
|
+
free(tmp);
|
1297
|
+
if(rv != CKR_OK) pkcs11_raise(self,rv);
|
1298
|
+
|
1299
|
+
return HANDLE2NUM(h);
|
1300
|
+
}
|
1301
|
+
|
1302
|
+
/* rb_define_method(cPKCS11, "vendor_raise_on_return_value", pkcs11_vendor_raise_on_return_value, 1); */
|
1303
|
+
/*
|
1304
|
+
* Raise an exception for the given PKCS#11 return value. This method can be overloaded
|
1305
|
+
* to raise vendor specific exceptions. It is only called for rv!=0 and it should never
|
1306
|
+
* return regulary, but always by an exception.
|
1307
|
+
* @param [Integer] rv return value of the latest operation
|
1308
|
+
*/
|
1309
|
+
static VALUE
|
1310
|
+
pkcs11_vendor_raise_on_return_value(VALUE self, VALUE rv_value)
|
1311
|
+
{
|
1312
|
+
VALUE class;
|
1313
|
+
CK_RV rv = NUM2ULONG(rv_value);
|
1314
|
+
class = pkcs11_return_value_to_class(rv, ePKCS11Error);
|
1315
|
+
rb_raise(class, "%lu", rv);
|
1316
|
+
|
1317
|
+
return Qnil;
|
1318
|
+
}
|
1319
|
+
|
1320
|
+
|
1321
|
+
/* rb_define_method(cPKCS11, "vendor_class_CK_ATTRIBUTE", pkcs11_vendor_class_CK_ATTRIBUTE, 0); */
|
1322
|
+
/*
|
1323
|
+
* Return class CK_ATTRIBUTE. This method can be overloaded
|
1324
|
+
* to return a derived class that appropriate converts vendor specific attributes.
|
1325
|
+
* @return [CK_ATTRIBUTE] some kind of CK_ATTRIBUTE
|
1326
|
+
*/
|
1327
|
+
static VALUE
|
1328
|
+
pkcs11_vendor_class_CK_ATTRIBUTE(VALUE self)
|
1329
|
+
{
|
1330
|
+
return cCK_ATTRIBUTE;
|
1331
|
+
}
|
1332
|
+
|
1333
|
+
|
1334
|
+
///////////////////////////////////////
|
1335
|
+
|
1336
|
+
static void
|
1337
|
+
ck_attr_free(CK_ATTRIBUTE *attr)
|
1338
|
+
{
|
1339
|
+
if (attr->pValue) free(attr->pValue);
|
1340
|
+
free(attr);
|
1341
|
+
}
|
1342
|
+
|
1343
|
+
static VALUE
|
1344
|
+
ck_attr_s_alloc(VALUE self)
|
1345
|
+
{
|
1346
|
+
VALUE obj;
|
1347
|
+
CK_ATTRIBUTE *attr;
|
1348
|
+
obj = Data_Make_Struct(self, CK_ATTRIBUTE, 0, ck_attr_free, attr);
|
1349
|
+
return obj;
|
1350
|
+
}
|
1351
|
+
|
1352
|
+
static VALUE
|
1353
|
+
ck_attr_initialize(int argc, VALUE *argv, VALUE self)
|
1354
|
+
{
|
1355
|
+
VALUE type, value;
|
1356
|
+
CK_ATTRIBUTE *attr;
|
1357
|
+
|
1358
|
+
rb_scan_args(argc, argv, "02", &type, &value);
|
1359
|
+
Data_Get_Struct(self, CK_ATTRIBUTE, attr);
|
1360
|
+
if (argc == 0) return self;
|
1361
|
+
attr->type = NUM2HANDLE(type);
|
1362
|
+
attr->pValue = NULL;
|
1363
|
+
switch(TYPE(value)){
|
1364
|
+
case T_TRUE:
|
1365
|
+
attr->pValue = (CK_BYTE_PTR)malloc(sizeof(CK_BBOOL));
|
1366
|
+
*((CK_BBOOL*)attr->pValue) = TRUE;
|
1367
|
+
attr->ulValueLen = sizeof(CK_BBOOL);
|
1368
|
+
break;
|
1369
|
+
case T_FALSE:
|
1370
|
+
attr->pValue = (CK_BYTE_PTR)malloc(sizeof(CK_BBOOL));
|
1371
|
+
*((CK_BBOOL*)attr->pValue) = FALSE;
|
1372
|
+
attr->ulValueLen = sizeof(CK_BBOOL);
|
1373
|
+
break;
|
1374
|
+
case T_NIL:
|
1375
|
+
attr->pValue = (CK_BYTE_PTR)NULL;
|
1376
|
+
attr->ulValueLen = 0;
|
1377
|
+
break;
|
1378
|
+
case T_FIXNUM:
|
1379
|
+
case T_BIGNUM:
|
1380
|
+
attr->pValue = (CK_BYTE_PTR)malloc(sizeof(CK_OBJECT_CLASS));
|
1381
|
+
*((CK_OBJECT_CLASS*)attr->pValue) = NUM2ULONG(value);
|
1382
|
+
attr->ulValueLen = sizeof(CK_OBJECT_CLASS);
|
1383
|
+
break;
|
1384
|
+
default:
|
1385
|
+
StringValue(value);
|
1386
|
+
attr->pValue = (CK_BYTE_PTR)malloc(RSTRING_LEN(value));
|
1387
|
+
memcpy(attr->pValue, RSTRING_PTR(value), RSTRING_LEN(value));
|
1388
|
+
attr->ulValueLen = RSTRING_LEN(value);
|
1389
|
+
break;
|
1390
|
+
}
|
1391
|
+
return self;
|
1392
|
+
}
|
1393
|
+
|
1394
|
+
/* rb_define_method(cCK_ATTRIBUTE, "type", ck_attr_type, 0); */
|
1395
|
+
/*
|
1396
|
+
* @return [Integer] attribute type PKCS11::CKA_*
|
1397
|
+
*/
|
1398
|
+
static VALUE
|
1399
|
+
ck_attr_type(VALUE self)
|
1400
|
+
{
|
1401
|
+
CK_ATTRIBUTE *attr;
|
1402
|
+
Data_Get_Struct(self, CK_ATTRIBUTE, attr);
|
1403
|
+
return ULONG2NUM(attr->type);
|
1404
|
+
}
|
1405
|
+
|
1406
|
+
/* rb_define_method(cCK_ATTRIBUTE, "value", ck_attr_value, 0); */
|
1407
|
+
/*
|
1408
|
+
* @return [String, Integer, Boolean] attribute value
|
1409
|
+
* @see PKCS11::Object#[]
|
1410
|
+
*/
|
1411
|
+
static VALUE
|
1412
|
+
ck_attr_value(VALUE self)
|
1413
|
+
{
|
1414
|
+
CK_ATTRIBUTE *attr;
|
1415
|
+
Data_Get_Struct(self, CK_ATTRIBUTE, attr);
|
1416
|
+
if (attr->ulValueLen == 0) return Qnil;
|
1417
|
+
switch(attr->type){
|
1418
|
+
case CKA_ALWAYS_AUTHENTICATE:
|
1419
|
+
case CKA_ALWAYS_SENSITIVE:
|
1420
|
+
case CKA_COLOR:
|
1421
|
+
/* case CKA_COPYABLE: v2.3 */
|
1422
|
+
case CKA_DECRYPT:
|
1423
|
+
case CKA_DERIVE:
|
1424
|
+
case CKA_ENCRYPT:
|
1425
|
+
case CKA_EXTRACTABLE:
|
1426
|
+
case CKA_HAS_RESET:
|
1427
|
+
case CKA_LOCAL:
|
1428
|
+
case CKA_MODIFIABLE:
|
1429
|
+
case CKA_NEVER_EXTRACTABLE:
|
1430
|
+
case CKA_OTP_USER_FRIENDLY_MODE:
|
1431
|
+
case CKA_PRIVATE:
|
1432
|
+
case CKA_SENSITIVE:
|
1433
|
+
case CKA_SIGN:
|
1434
|
+
case CKA_SIGN_RECOVER:
|
1435
|
+
case CKA_TOKEN:
|
1436
|
+
case CKA_TRUSTED:
|
1437
|
+
case CKA_UNWRAP:
|
1438
|
+
case CKA_VERIFY:
|
1439
|
+
case CKA_VERIFY_RECOVER:
|
1440
|
+
case CKA_WRAP:
|
1441
|
+
case CKA_WRAP_WITH_TRUSTED:
|
1442
|
+
if (attr->ulValueLen == sizeof(CK_BBOOL))
|
1443
|
+
return (*(CK_BBOOL*)(attr->pValue)) == CK_TRUE ? Qtrue : Qfalse;
|
1444
|
+
break;
|
1445
|
+
case CKA_BITS_PER_PIXEL:
|
1446
|
+
case CKA_CERTIFICATE_CATEGORY:
|
1447
|
+
case CKA_CERTIFICATE_TYPE:
|
1448
|
+
case CKA_CHAR_COLUMNS:
|
1449
|
+
case CKA_CHAR_ROWS:
|
1450
|
+
case CKA_CLASS:
|
1451
|
+
case CKA_HW_FEATURE_TYPE:
|
1452
|
+
case CKA_JAVA_MIDP_SECURITY_DOMAIN:
|
1453
|
+
case CKA_KEY_TYPE:
|
1454
|
+
case CKA_MECHANISM_TYPE:
|
1455
|
+
case CKA_MODULUS_BITS:
|
1456
|
+
case CKA_OTP_CHALLENGE_REQUIREMENT:
|
1457
|
+
case CKA_OTP_COUNTER_REQUIREMENT:
|
1458
|
+
case CKA_OTP_FORMAT:
|
1459
|
+
case CKA_OTP_LENGTH:
|
1460
|
+
case CKA_OTP_PIN_REQUIREMENT:
|
1461
|
+
case CKA_OTP_TIME_INTERVAL:
|
1462
|
+
case CKA_OTP_TIME_REQUIREMENT:
|
1463
|
+
case CKA_OTP_SERVICE_LOGO_TYPE:
|
1464
|
+
case CKA_PIXEL_X:
|
1465
|
+
case CKA_PIXEL_Y:
|
1466
|
+
case CKA_PRIME_BITS:
|
1467
|
+
case CKA_RESOLUTION:
|
1468
|
+
case CKA_SUBPRIME_BITS:
|
1469
|
+
case CKA_VALUE_BITS:
|
1470
|
+
case CKA_VALUE_LEN:
|
1471
|
+
if (attr->ulValueLen == sizeof(CK_ULONG))
|
1472
|
+
return ULONG2NUM(*(CK_ULONG_PTR)(attr->pValue));
|
1473
|
+
break;
|
1474
|
+
}
|
1475
|
+
return rb_str_new(attr->pValue, attr->ulValueLen);
|
1476
|
+
}
|
1477
|
+
|
1478
|
+
///////////////////////////////////////
|
1479
|
+
|
1480
|
+
#include "pk11_struct_impl.inc"
|
1481
|
+
|
1482
|
+
///////////////////////////////////////
|
1483
|
+
|
1484
|
+
PKCS11_IMPLEMENT_ALLOCATOR(CK_MECHANISM)
|
1485
|
+
|
1486
|
+
/*
|
1487
|
+
* Spezifies a particularly crypto mechanism.
|
1488
|
+
* @param [Integer, nil] mechanism The mechanism to use (PKCS11::CKM_*)
|
1489
|
+
* @param [String, Integer, PKCS11::CStruct, nil] pParameter optional parameter to the mechanism
|
1490
|
+
*/
|
1491
|
+
static VALUE
|
1492
|
+
cCK_MECHANISM_initialize(int argc, VALUE *argv, VALUE self)
|
1493
|
+
{
|
1494
|
+
VALUE type, param;
|
1495
|
+
|
1496
|
+
rb_scan_args(argc, argv, "02", &type, ¶m);
|
1497
|
+
rb_funcall(self, rb_intern("mechanism="), 1, type);
|
1498
|
+
rb_funcall(self, rb_intern("pParameter="), 1, param);
|
1499
|
+
|
1500
|
+
return self;
|
1501
|
+
}
|
1502
|
+
|
1503
|
+
/* rb_define_method(cCK_MECHANISM, "mechanism", cCK_MECHANISM_get_mechanism, 0); */
|
1504
|
+
/* rb_define_method(cCK_MECHANISM, "mechanism=", cCK_MECHANISM_set_mechanism, 0); */
|
1505
|
+
PKCS11_IMPLEMENT_ULONG_ACCESSOR(CK_MECHANISM, mechanism);
|
1506
|
+
|
1507
|
+
/* rb_define_method(cCK_MECHANISM, "pParameter", cCK_MECHANISM_get_pParameter, 0); */
|
1508
|
+
/* rb_define_method(cCK_MECHANISM, "pParameter=", cCK_MECHANISM_set_pParameter, 0); */
|
1509
|
+
/* @see PKCS11::CK_MECHANISM#initialize */
|
1510
|
+
static VALUE
|
1511
|
+
cCK_MECHANISM_get_pParameter(VALUE self)
|
1512
|
+
{
|
1513
|
+
CK_MECHANISM_PTR m = DATA_PTR(self);
|
1514
|
+
if (!m->pParameter) return Qnil;
|
1515
|
+
else return rb_str_new(m->pParameter, m->ulParameterLen);
|
1516
|
+
}
|
1517
|
+
|
1518
|
+
static VALUE
|
1519
|
+
cCK_MECHANISM_set_pParameter(VALUE self, VALUE value)
|
1520
|
+
{
|
1521
|
+
CK_MECHANISM_PTR m = DATA_PTR(self);
|
1522
|
+
CK_ULONG ulong_val;
|
1523
|
+
|
1524
|
+
switch(TYPE(value)){
|
1525
|
+
case T_NIL:
|
1526
|
+
m->pParameter = NULL_PTR;
|
1527
|
+
m->ulParameterLen = 0;
|
1528
|
+
break;
|
1529
|
+
case T_STRING:
|
1530
|
+
value = rb_obj_freeze(rb_str_dup(value));
|
1531
|
+
m->pParameter = RSTRING_PTR(value);
|
1532
|
+
m->ulParameterLen = RSTRING_LEN(value);
|
1533
|
+
break;
|
1534
|
+
case T_FIXNUM:
|
1535
|
+
case T_BIGNUM:
|
1536
|
+
ulong_val = NUM2ULONG(value);
|
1537
|
+
value = rb_obj_freeze(rb_str_new((char*)&ulong_val, sizeof(ulong_val)));
|
1538
|
+
m->pParameter = RSTRING_PTR(value);
|
1539
|
+
m->ulParameterLen = RSTRING_LEN(value);
|
1540
|
+
break;
|
1541
|
+
case T_DATA:
|
1542
|
+
m->pParameter = DATA_PTR(value);
|
1543
|
+
m->ulParameterLen = NUM2LONG(rb_const_get(rb_funcall(value, rb_intern("class"), 0), rb_intern("SIZEOF_STRUCT")));
|
1544
|
+
break;
|
1545
|
+
default:
|
1546
|
+
rb_raise(rb_eArgError, "invalid argument");
|
1547
|
+
}
|
1548
|
+
/* don't GC the value as long as this object is active */
|
1549
|
+
rb_iv_set(self, "pParameter", value);
|
1550
|
+
|
1551
|
+
return value;
|
1552
|
+
}
|
1553
|
+
|
1554
|
+
|
1555
|
+
void
|
1556
|
+
Init_pkcs11_ext()
|
1557
|
+
{
|
1558
|
+
mPKCS11 = rb_define_module("PKCS11");
|
1559
|
+
sNEW = rb_intern("new");
|
1560
|
+
cPKCS11 = rb_define_class_under(mPKCS11, "Library", rb_cObject);
|
1561
|
+
|
1562
|
+
/* Document-method: PKCS11.open
|
1563
|
+
*
|
1564
|
+
* Alias function for {PKCS11::Library#initialize}
|
1565
|
+
*/
|
1566
|
+
rb_define_module_function(mPKCS11, "open", pkcs11_library_new, -1);
|
1567
|
+
|
1568
|
+
/* Library version */
|
1569
|
+
rb_define_const( mPKCS11, "VERSION", rb_str_new2(VERSION) );
|
1570
|
+
|
1571
|
+
/* Document-class: PKCS11::Error
|
1572
|
+
*
|
1573
|
+
* Base class for all Cryptoki exceptions (CKR_*) */
|
1574
|
+
ePKCS11Error = rb_define_class_under(mPKCS11, "Error", rb_eStandardError);
|
1575
|
+
rb_define_alloc_func(cPKCS11, pkcs11_s_alloc);
|
1576
|
+
rb_define_method(cPKCS11, "initialize", pkcs11_initialize, -1);
|
1577
|
+
|
1578
|
+
PKCS11_DEFINE_METHOD(load_library, 1);
|
1579
|
+
PKCS11_DEFINE_METHOD(C_GetFunctionList, 0);
|
1580
|
+
PKCS11_DEFINE_METHOD(C_Initialize, -1);
|
1581
|
+
PKCS11_DEFINE_METHOD(C_GetInfo, 0);
|
1582
|
+
PKCS11_DEFINE_METHOD(C_GetSlotList, 1);
|
1583
|
+
PKCS11_DEFINE_METHOD(C_GetSlotInfo, 1);
|
1584
|
+
PKCS11_DEFINE_METHOD(C_GetTokenInfo, 1);
|
1585
|
+
PKCS11_DEFINE_METHOD(C_GetMechanismList, 1);
|
1586
|
+
PKCS11_DEFINE_METHOD(C_GetMechanismInfo, 2);
|
1587
|
+
PKCS11_DEFINE_METHOD(C_InitToken, 3);
|
1588
|
+
PKCS11_DEFINE_METHOD(C_InitPIN, 2);
|
1589
|
+
|
1590
|
+
PKCS11_DEFINE_METHOD(C_OpenSession, 2);
|
1591
|
+
PKCS11_DEFINE_METHOD(C_CloseSession, 1);
|
1592
|
+
PKCS11_DEFINE_METHOD(C_CloseAllSessions, 1);
|
1593
|
+
PKCS11_DEFINE_METHOD(C_GetSessionInfo, 1);
|
1594
|
+
PKCS11_DEFINE_METHOD(C_GetOperationState, 1);
|
1595
|
+
PKCS11_DEFINE_METHOD(C_SetOperationState, 4);
|
1596
|
+
PKCS11_DEFINE_METHOD(C_Login, 3);
|
1597
|
+
PKCS11_DEFINE_METHOD(C_Logout, 1);
|
1598
|
+
PKCS11_DEFINE_METHOD(C_SetPIN, 3);
|
1599
|
+
|
1600
|
+
PKCS11_DEFINE_METHOD(C_CreateObject, 2);
|
1601
|
+
PKCS11_DEFINE_METHOD(C_CopyObject, 3);
|
1602
|
+
PKCS11_DEFINE_METHOD(C_DestroyObject, 2);
|
1603
|
+
PKCS11_DEFINE_METHOD(C_GetObjectSize, 2);
|
1604
|
+
PKCS11_DEFINE_METHOD(C_FindObjectsInit, 2);
|
1605
|
+
PKCS11_DEFINE_METHOD(C_FindObjectsFinal, 1);
|
1606
|
+
PKCS11_DEFINE_METHOD(C_FindObjects, 2);
|
1607
|
+
PKCS11_DEFINE_METHOD(C_GetAttributeValue, 3);
|
1608
|
+
PKCS11_DEFINE_METHOD(C_SetAttributeValue, 3);
|
1609
|
+
|
1610
|
+
PKCS11_DEFINE_METHOD(C_EncryptInit, 3);
|
1611
|
+
PKCS11_DEFINE_METHOD(C_Encrypt, 3);
|
1612
|
+
PKCS11_DEFINE_METHOD(C_EncryptUpdate, 3);
|
1613
|
+
PKCS11_DEFINE_METHOD(C_EncryptFinal, 2);
|
1614
|
+
PKCS11_DEFINE_METHOD(C_DecryptInit, 3);
|
1615
|
+
PKCS11_DEFINE_METHOD(C_Decrypt, 3);
|
1616
|
+
PKCS11_DEFINE_METHOD(C_DecryptUpdate, 3);
|
1617
|
+
PKCS11_DEFINE_METHOD(C_DecryptFinal, 2);
|
1618
|
+
PKCS11_DEFINE_METHOD(C_DigestInit, 2);
|
1619
|
+
PKCS11_DEFINE_METHOD(C_Digest, 3);
|
1620
|
+
PKCS11_DEFINE_METHOD(C_DigestUpdate, 2);
|
1621
|
+
PKCS11_DEFINE_METHOD(C_DigestKey, 2);
|
1622
|
+
PKCS11_DEFINE_METHOD(C_DigestFinal, 2);
|
1623
|
+
PKCS11_DEFINE_METHOD(C_SignInit, 3);
|
1624
|
+
PKCS11_DEFINE_METHOD(C_Sign, 3);
|
1625
|
+
PKCS11_DEFINE_METHOD(C_SignUpdate, 2);
|
1626
|
+
PKCS11_DEFINE_METHOD(C_SignFinal, 2);
|
1627
|
+
PKCS11_DEFINE_METHOD(C_SignRecoverInit, 3);
|
1628
|
+
PKCS11_DEFINE_METHOD(C_SignRecover, 3);
|
1629
|
+
PKCS11_DEFINE_METHOD(C_VerifyInit, 3);
|
1630
|
+
PKCS11_DEFINE_METHOD(C_Verify, 3);
|
1631
|
+
PKCS11_DEFINE_METHOD(C_VerifyUpdate, 2);
|
1632
|
+
PKCS11_DEFINE_METHOD(C_VerifyFinal, 2);
|
1633
|
+
PKCS11_DEFINE_METHOD(C_VerifyRecoverInit, 3);
|
1634
|
+
PKCS11_DEFINE_METHOD(C_VerifyRecover, 3);
|
1635
|
+
PKCS11_DEFINE_METHOD(C_DigestEncryptUpdate, 3);
|
1636
|
+
PKCS11_DEFINE_METHOD(C_DecryptDigestUpdate, 3);
|
1637
|
+
PKCS11_DEFINE_METHOD(C_SignEncryptUpdate, 3);
|
1638
|
+
PKCS11_DEFINE_METHOD(C_DecryptVerifyUpdate, 3);
|
1639
|
+
PKCS11_DEFINE_METHOD(C_GenerateKey, 3);
|
1640
|
+
PKCS11_DEFINE_METHOD(C_GenerateKeyPair, 4);
|
1641
|
+
PKCS11_DEFINE_METHOD(C_WrapKey, 5);
|
1642
|
+
PKCS11_DEFINE_METHOD(C_UnwrapKey, 5);
|
1643
|
+
PKCS11_DEFINE_METHOD(C_DeriveKey, 4);
|
1644
|
+
PKCS11_DEFINE_METHOD(C_SeedRandom, 2);
|
1645
|
+
PKCS11_DEFINE_METHOD(C_GenerateRandom, 2);
|
1646
|
+
|
1647
|
+
PKCS11_DEFINE_METHOD(C_WaitForSlotEvent, 1);
|
1648
|
+
PKCS11_DEFINE_METHOD(C_Finalize, 0);
|
1649
|
+
PKCS11_DEFINE_METHOD(unload_library, 0);
|
1650
|
+
PKCS11_DEFINE_METHOD(vendor_raise_on_return_value, 1);
|
1651
|
+
PKCS11_DEFINE_METHOD(vendor_class_CK_ATTRIBUTE, 0);
|
1652
|
+
|
1653
|
+
///////////////////////////////////////
|
1654
|
+
|
1655
|
+
cCStruct = rb_define_class_under(mPKCS11, "CStruct", rb_cObject);
|
1656
|
+
|
1657
|
+
cCK_ATTRIBUTE = rb_define_class_under(mPKCS11, "CK_ATTRIBUTE", rb_cObject);
|
1658
|
+
rb_define_alloc_func(cCK_ATTRIBUTE, ck_attr_s_alloc);
|
1659
|
+
rb_define_method(cCK_ATTRIBUTE, "initialize", ck_attr_initialize, -1);
|
1660
|
+
rb_define_method(cCK_ATTRIBUTE, "type", ck_attr_type, 0);
|
1661
|
+
rb_define_method(cCK_ATTRIBUTE, "value", ck_attr_value, 0);
|
1662
|
+
|
1663
|
+
/* Document-class: PKCS11::CK_MECHANISM
|
1664
|
+
*
|
1665
|
+
* Describes a crypto mechanism CKM_* with optional parameters. */
|
1666
|
+
/* cCK_MECHANISM = rb_define_class_under(mPKCS11, "CK_MECHANISM", rb_cObject); */
|
1667
|
+
PKCS11_DEFINE_STRUCT(CK_MECHANISM);
|
1668
|
+
rb_define_method(cCK_MECHANISM, "initialize", cCK_MECHANISM_initialize, -1);
|
1669
|
+
PKCS11_DEFINE_MEMBER(CK_MECHANISM, mechanism);
|
1670
|
+
PKCS11_DEFINE_MEMBER(CK_MECHANISM, pParameter);
|
1671
|
+
|
1672
|
+
#include "pk11_struct_def.inc"
|
1673
|
+
|
1674
|
+
Init_pkcs11_const(mPKCS11, ePKCS11Error);
|
1675
|
+
}
|