pkcs11_luna 0.2.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,57 @@
1
+ #!/usr/bin/env ruby
2
+ # Quick and dirty parser for PKCS#11 constants and
3
+ # generator for Ruby wrapper classes.
4
+
5
+ require File.expand_path(File.join(File.dirname(__FILE__), '../../ext/generate_constants'))
6
+
7
+ module PKCS11
8
+ module Luna
9
+ class ConstantParser < PKCS11::ConstantParser
10
+ ConstGroups = [
11
+ ConstTemplate.new(/#define\s+(CKM_[A-Z_0-9]+)\s+(.+)/, 'PKCS11_DEFINE_MECHANISM'),
12
+ ConstTemplate.new(/#define\s+(CKA_[A-Z_0-9]+)\s+(.+)/, 'PKCS11_DEFINE_ATTRIBUTE'),
13
+ ConstTemplate.new(/#define\s+(CKO_[A-Z_0-9]+)\s+(.+)/, 'PKCS11_DEFINE_OBJECT_CLASS'),
14
+ ConstTemplate.new(/#define\s+(CKR_[A-Z_0-9]+)\s+([A-Za-z0-9_\(\)+ ]+)/, 'PKCS11_DEFINE_RETURN_VALUE'),
15
+ ]
16
+
17
+ ['CKD', 'CKU', 'CKF', 'CKDHP', 'CKES', 'CKMS', 'CAF', 'CKCAO', 'CKHSC'].each do |prefix|
18
+ ConstGroups << ConstTemplate.new(/#define\s+(#{prefix}_[A-Z_0-9]+)\s+([A-Za-z0-9_]+)/, 'PKCS11_DEFINE_CONST')
19
+ end
20
+
21
+ IgnoreConstants = %w[]
22
+
23
+ def start!
24
+
25
+ constants_hash = {}
26
+ constants = []
27
+
28
+ options.files.each do |file_h|
29
+ c_src = IO.read(file_h)
30
+ ConstGroups.each do |const_group|
31
+ c_src.scan(const_group.regexp) do
32
+ const_name, const_value = $1, $2
33
+ next if IgnoreConstants.include?(const_name)
34
+ constants_hash[const_name] = [const_group.def, const_value]
35
+ constants.push(const_name)
36
+ end
37
+ end
38
+ end
39
+
40
+ File.open(options.const, "w") do |fd_const|
41
+ constants.each do |const_name|
42
+ next if constants_hash[const_name].nil?
43
+ const_group_def = constants_hash[const_name][0]
44
+ const_value = constants_hash[const_name][1]
45
+ fd_const.puts "#{const_group_def}(#{const_name}); /* #{const_value} */"
46
+ constants_hash[const_name] = nil
47
+ end
48
+ end
49
+ end
50
+ end
51
+
52
+ end
53
+ end
54
+
55
+ if $0==__FILE__
56
+ PKCS11::Luna::ConstantParser.run(ARGV)
57
+ end
@@ -0,0 +1,77 @@
1
+ #!/usr/bin/env ruby
2
+ # Quick and dirty parser for PKCS#11 structs and
3
+ # generator for Ruby wrapper classes.
4
+
5
+ require 'rubygems'
6
+ require 'pkcs11'
7
+ require File.expand_path(File.join(File.dirname(__FILE__), '../../ext/generate_structs'))
8
+
9
+ module PKCS11
10
+ module Luna
11
+ class StructParser < PKCS11::StructParser
12
+
13
+ SIZE_CONSTANTS = {
14
+ 'CK_MANUFACTURER_SIZE' => 32,
15
+ 'CK_SERIAL_NUMBER_SIZE' => 16,
16
+ 'CK_TIME_SIZE' => 16,
17
+ 'CK_LIB_DESC_SIZE' => 32,
18
+ 'CK_SLOT_DESCRIPTION_SIZE' => 64,
19
+ 'CK_SLOT_MANUFACTURER_SIZE' => 32,
20
+ 'CK_MAX_PIN_LEN' => 32,
21
+ 'CK_TOKEN_LABEL_SIZE' => 32,
22
+ 'CK_TOKEN_MANUFACTURER_SIZE' => 32,
23
+ 'CK_TOKEN_MODEL_SIZE' => 16,
24
+ 'CK_TOKEN_SERIAL_NUMBER_SIZE' => 16,
25
+ 'CK_TOKEN_TIME_SIZE' => 16,
26
+ 'CK_MAX_PBE_IV_SIZE' => 8,
27
+ 'CK_MAX_PAD_SIZE' => 16,
28
+ 'CK_HA_MAX_MEMBERS' => 32
29
+ }
30
+
31
+ ULONG_TYPES = %w[CK_EC_DH_PRIMITIVE CK_EC_ENC_SCHEME CK_EC_MAC_SCHEME CK_KDF_PRF_ENCODING_SCHEME CK_RV]
32
+ ULONG_PTR_TYPES = %w[]
33
+
34
+
35
+ def struct_module
36
+ 'PKCS11::Luna'
37
+ end
38
+
39
+ def array_attribute_names; %w[attributes mechanism certAttr hCert]; end
40
+
41
+ def parse_files(files)
42
+ structs = []
43
+ files.each do |file_h|
44
+ c_src = IO.read(file_h)
45
+ c_src.scan(/struct\s+([A-Z_0-9]+)\s*\{(.*?)\}\s*([A-Z_0-9]+)\s*;/m) do |struct|
46
+ struct_text = $2
47
+ struct = PKCS11::StructParser::CStruct.new( $3, [] )
48
+
49
+ struct_text.scan(/^\s+([A-Z_0-9]+)([\*\s]+)([\w_]+)\s*(\[\s*(\w+)\s*\])?/) do |elem|
50
+ type, name = $1, $3
51
+ qual = SIZE_CONSTANTS[$5] || $5
52
+ ptr = $2.include?('*')
53
+ type = "CK_ULONG" if ULONG_TYPES.include?(type)
54
+ type = "CK_ULONG_PTR" if ULONG_PTR_TYPES.include?(type)
55
+ struct.attrs << Attribute.new(ptr ? type+"_PTR" : type, name, qual)
56
+ end
57
+ structs << struct
58
+ end
59
+ end
60
+ return structs
61
+ end
62
+
63
+ def start!
64
+ @structs = parse_files(options.files)
65
+ @structs_by_name = @structs.inject({}){|sum, v| sum[v.name]=v; sum }
66
+ @std_structs_by_name = PKCS11.constants.select{|c| PKCS11.const_get(c).respond_to?(:ancestors) && !(PKCS11.const_get(c).ancestors & [PKCS11::CStruct, PKCS11::CK_ATTRIBUTE]).empty? }.inject({}){|sum, v| sum[v.to_s]=true; sum }
67
+
68
+ write_files
69
+ end
70
+ end
71
+ end
72
+ end
73
+
74
+
75
+ if $0==__FILE__
76
+ PKCS11::Luna::StructParser.run(ARGV)
77
+ end
@@ -0,0 +1,38 @@
1
+ #ifndef PK11_CONST_MACROS_INCLUDED
2
+ #define PK11_CONST_MACROS_INCLUDED
3
+
4
+ /**************************************************/
5
+ /* constant definition */
6
+ /**************************************************/
7
+
8
+ #define PKCS11_DEFINE_CONST(constant) \
9
+ rb_define_const(MODULE_FOR_CONSTS, #constant, INT2NUM(constant))
10
+
11
+ #define PKCS11_DEFINE_CONST_GROUP(group, name, value) \
12
+ do { \
13
+ VALUE rvalue, str, old; \
14
+ rvalue = ULONG2NUM(value); \
15
+ rb_define_const(MODULE_FOR_CONSTS, name, rvalue); \
16
+ str = rb_obj_freeze(rb_str_new2(name)); \
17
+ old = rb_hash_aref(group, rvalue); \
18
+ if (!NIL_P(old)) rb_warning("%s is equal to %s", RSTRING_PTR(old), name); \
19
+ rb_hash_aset(group, rvalue, str); \
20
+ } while(0)
21
+
22
+ #define PKCS11_DEFINE_OBJECT_CLASS(constant) \
23
+ PKCS11_DEFINE_CONST_GROUP(vOBJECT_CLASSES, #constant, constant)
24
+ #define PKCS11_DEFINE_ATTRIBUTE(constant) \
25
+ PKCS11_DEFINE_CONST_GROUP(vATTRIBUTES, #constant, constant)
26
+ #define PKCS11_DEFINE_MECHANISM(constant) \
27
+ PKCS11_DEFINE_CONST_GROUP(vMECHANISMS, #constant, constant)
28
+ #define PKCS11_DEFINE_RETURN_VALUE(constant) \
29
+ do { \
30
+ VALUE eError = rb_define_class_under(MODULE_FOR_CONSTS, #constant, BASECLASS_FOR_ERRORS); \
31
+ VALUE rvalue = ULONG2NUM(constant); \
32
+ VALUE old = rb_hash_aref(vRETURN_VALUES, rvalue); \
33
+ if (!NIL_P(old)) rb_warning("%s is equal to %s", RSTRING_PTR(old), #constant); \
34
+ rb_hash_aset(vRETURN_VALUES, rvalue, eError); \
35
+ } while(0)
36
+
37
+
38
+ #endif
@@ -0,0 +1,435 @@
1
+ #ifndef PK11_STRUCT_MACROS_INCLUDED
2
+ #define PK11_STRUCT_MACROS_INCLUDED
3
+
4
+ /**************************************************/
5
+ /* struct/attribute implementation */
6
+ /**************************************************/
7
+
8
+ #define HANDLE2NUM(n) ULONG2NUM(n)
9
+ #define NUM2HANDLE(n) PKNUM2ULONG(n)
10
+ #define PKNUM2ULONG(n) pkcs11_num2ulong(n)
11
+
12
+ static VALUE
13
+ pkcs11_num2ulong(VALUE val)
14
+ {
15
+ if (TYPE(val) == T_BIGNUM || TYPE(val) == T_FIXNUM) {
16
+ return NUM2ULONG(val);
17
+ }
18
+ return NUM2ULONG(rb_to_int(val));
19
+ }
20
+
21
+ static VALUE
22
+ get_string(VALUE obj, off_t offset, size_t size)
23
+ {
24
+ char *ptr = (char*)DATA_PTR(obj);
25
+ return rb_str_new(ptr+offset, size);
26
+ }
27
+
28
+ static VALUE
29
+ set_string(VALUE obj, VALUE value, off_t offset, size_t size)
30
+ {
31
+ char *ptr = (char*)DATA_PTR(obj);
32
+ int len = size;
33
+ StringValue(value);
34
+ if (RSTRING_LEN(value) < len) len = RSTRING_LEN(value);
35
+ memset(ptr+offset, 0, size);
36
+ memcpy(ptr+offset, RSTRING_PTR(value), len);
37
+ return value;
38
+ }
39
+
40
+ static VALUE
41
+ get_ulong(VALUE obj, off_t offset)
42
+ {
43
+ char *ptr = (char*)DATA_PTR(obj);
44
+ return ULONG2NUM(*(CK_ULONG_PTR)(ptr+offset));
45
+ }
46
+
47
+ static VALUE
48
+ set_ulong(VALUE obj, VALUE value, off_t offset)
49
+ {
50
+ char *ptr = (char*)DATA_PTR(obj);
51
+ *(CK_ULONG_PTR)(ptr+offset) = NUM2ULONG(value);
52
+ return value;
53
+ }
54
+
55
+ static VALUE
56
+ get_byte(VALUE obj, off_t offset)
57
+ {
58
+ char *ptr = (char*)DATA_PTR(obj);
59
+ return ULONG2NUM(*(CK_BYTE_PTR)(ptr+offset));
60
+ }
61
+
62
+ static VALUE
63
+ set_byte(VALUE obj, VALUE value, off_t offset)
64
+ {
65
+ char *ptr = (char*)DATA_PTR(obj);
66
+ *(CK_BYTE_PTR)(ptr+offset) = NUM2ULONG(value);
67
+ return value;
68
+ }
69
+
70
+ static VALUE
71
+ get_ulong_ptr(VALUE obj, off_t offset)
72
+ {
73
+ char *ptr = (char*)DATA_PTR(obj);
74
+ CK_ULONG_PTR p = *(CK_ULONG_PTR *)(ptr+offset);
75
+ if (!p) return Qnil;
76
+ return ULONG2NUM(*p);
77
+ }
78
+
79
+ static VALUE
80
+ set_ulong_ptr(VALUE obj, VALUE value, const char *name, off_t offset)
81
+ {
82
+ VALUE new_obj;
83
+ CK_ULONG_PTR *ptr = (CK_ULONG_PTR *)((char*)DATA_PTR(obj) + offset);
84
+ if (NIL_P(value)){
85
+ rb_iv_set(obj, name, value);
86
+ *ptr = NULL_PTR;
87
+ return value;
88
+ }
89
+ new_obj = Data_Make_Struct(rb_cInteger, CK_ULONG, 0, free, *ptr);
90
+ rb_iv_set(obj, name, new_obj);
91
+ **ptr = NUM2ULONG(value);
92
+ return value;
93
+ }
94
+
95
+ static VALUE
96
+ get_handle(VALUE obj, off_t offset)
97
+ {
98
+ char *ptr = (char*)DATA_PTR(obj);
99
+ return HANDLE2NUM(*(CK_OBJECT_HANDLE_PTR)(ptr+offset));
100
+ }
101
+
102
+ static VALUE
103
+ set_handle(VALUE obj, VALUE value, off_t offset)
104
+ {
105
+ char *ptr = (char*)DATA_PTR(obj);
106
+ *(CK_OBJECT_HANDLE_PTR)(ptr+offset) = NUM2HANDLE(value);
107
+ return value;
108
+ }
109
+
110
+ static VALUE
111
+ get_bool(VALUE obj, off_t offset)
112
+ {
113
+ char *ptr = (char*)DATA_PTR(obj);
114
+ if(*(CK_BBOOL*)(ptr+offset)) return Qtrue;
115
+ else return Qfalse;
116
+ }
117
+
118
+ static VALUE
119
+ set_bool(VALUE obj, VALUE value, off_t offset)
120
+ {
121
+ char *ptr = (char*)DATA_PTR(obj);
122
+ if(value == Qfalse) *(CK_BBOOL*)(ptr+offset) = 0;
123
+ else if(value == Qtrue) *(CK_BBOOL*)(ptr+offset) = 1;
124
+ else rb_raise(rb_eArgError, "arg must be true or false");
125
+ return value;
126
+ }
127
+
128
+ static VALUE
129
+ get_string_ptr(VALUE obj, const char *name, off_t offset)
130
+ {
131
+ char *ptr = (char*)DATA_PTR(obj);
132
+ char *p = *(char**)(ptr+offset);
133
+ if (!p) return Qnil;
134
+ return rb_str_new2(p);
135
+ }
136
+
137
+ static VALUE
138
+ set_string_ptr(VALUE obj, VALUE value, const char *name, off_t offset)
139
+ {
140
+ char *ptr = (char*)DATA_PTR(obj);
141
+ if (NIL_P(value)){
142
+ rb_iv_set(obj, name, value);
143
+ *(CK_VOID_PTR*)(ptr+offset) = NULL_PTR;
144
+ return value;
145
+ }
146
+ StringValue(value);
147
+ value = rb_obj_freeze(rb_str_dup(value));
148
+ rb_iv_set(obj, name, value);
149
+ *(CK_VOID_PTR*)(ptr+offset) = RSTRING_PTR(value);
150
+ return value;
151
+ }
152
+
153
+ static VALUE
154
+ get_string_ptr_len(VALUE obj, const char *name, off_t offset, off_t offset_len)
155
+ {
156
+ unsigned long l;
157
+ char *ptr = (char*)DATA_PTR(obj);
158
+ char *p = *(char**)(ptr+offset);
159
+ if (!p) return Qnil;
160
+ l = *(unsigned long*)(ptr+offset_len);
161
+ return rb_str_new(p, l);
162
+ }
163
+
164
+ static VALUE
165
+ set_string_ptr_len(VALUE obj, VALUE value, const char *name, off_t offset, off_t offset_len)
166
+ {
167
+ char *ptr = (char*)DATA_PTR(obj);
168
+ if (NIL_P(value)){
169
+ rb_iv_set(obj, name, value);
170
+ *(CK_VOID_PTR*)(ptr+offset) = NULL_PTR;
171
+ *(unsigned long*)(ptr+offset_len) = 0;
172
+ return value;
173
+ }
174
+ StringValue(value);
175
+ value = rb_obj_freeze(rb_str_dup(value));
176
+ rb_iv_set(obj, name, value);
177
+ *(CK_VOID_PTR*)(ptr+offset) = RSTRING_PTR(value);
178
+ *(unsigned long*)(ptr+offset_len) = RSTRING_LEN(value);
179
+ return value;
180
+ }
181
+
182
+ static VALUE
183
+ get_struct_inline(VALUE obj, VALUE klass, const char *name, off_t offset)
184
+ {
185
+ char *ptr = (char*)DATA_PTR(obj) + offset;
186
+ VALUE inline_obj = Data_Wrap_Struct(klass, 0, 0, ptr);
187
+ rb_iv_set(inline_obj, name, obj);
188
+ return inline_obj;
189
+ }
190
+
191
+ static VALUE
192
+ set_struct_inline(VALUE obj, VALUE klass, const char *struct_name, VALUE value, const char *name, off_t offset, int sizeofstruct)
193
+ {
194
+ char *ptr = (char*)DATA_PTR(obj) + offset;
195
+ if (!rb_obj_is_kind_of(value, klass))
196
+ rb_raise(rb_eArgError, "arg must be a PKCS11::%s", struct_name);
197
+ memcpy(ptr, DATA_PTR(value), sizeofstruct);
198
+ return value;
199
+ }
200
+
201
+ static VALUE
202
+ get_struct_ptr(VALUE obj, VALUE klass, const char *name, off_t offset, int sizeofstruct)
203
+ {
204
+ char *ptr = (char*)DATA_PTR(obj);
205
+ char *p = *(char**)(ptr+offset);
206
+ void *mem;
207
+ VALUE new_obj;
208
+ if (!p) return Qnil;
209
+ mem = xmalloc(sizeofstruct);
210
+ memcpy(mem, p, sizeofstruct);
211
+ new_obj = Data_Wrap_Struct(klass, 0, -1, mem);
212
+ return new_obj;
213
+ }
214
+
215
+ static VALUE
216
+ set_struct_ptr(VALUE obj, VALUE klass, const char *struct_name, VALUE value, const char *name, off_t offset)
217
+ {
218
+ char *ptr = (char*)DATA_PTR(obj) + offset;
219
+ if (NIL_P(value)){
220
+ rb_iv_set(obj, name, value);
221
+ *(CK_VOID_PTR*)ptr = NULL_PTR;
222
+ return value;
223
+ }
224
+ if (!rb_obj_is_kind_of(value, klass))
225
+ rb_raise(rb_eArgError, "arg must be a PKCS11::%s", struct_name);
226
+ *(CK_VOID_PTR*)ptr = DATA_PTR(value);
227
+ rb_iv_set(obj, name, value);
228
+ return value;
229
+ }
230
+
231
+ static VALUE
232
+ get_struct_ptr_array(VALUE obj, VALUE klass, off_t offset, off_t offset_len, int sizeofstruct)
233
+ {
234
+ unsigned long i;
235
+ char *ptr = DATA_PTR(obj);
236
+ char *p = *(char **)(ptr+offset);
237
+ unsigned long l = *(unsigned long*)(ptr+offset_len);
238
+ VALUE ary = rb_ary_new();
239
+ for (i = 0; i < l; i++){
240
+ VALUE new_obj;
241
+ void *mem = xmalloc(sizeofstruct);
242
+ memcpy(mem, p + sizeofstruct * i, sizeofstruct);
243
+ new_obj = Data_Wrap_Struct(klass, 0, -1, mem);
244
+ rb_ary_push(ary, new_obj);
245
+ }
246
+ return ary;
247
+ }
248
+
249
+ static VALUE
250
+ set_struct_ptr_array(VALUE obj, VALUE klass, const char *struct_name, VALUE value, const char *name, off_t offset, off_t offset_len, int sizeofstruct)
251
+ {
252
+ int i;
253
+ VALUE str_buf;
254
+ char *ptr = DATA_PTR(obj);
255
+ Check_Type(value, T_ARRAY);
256
+
257
+ str_buf = rb_str_buf_new(sizeofstruct * RARRAY_LEN(value));
258
+
259
+ for (i = 0; i < RARRAY_LEN(value); i++){
260
+ VALUE entry = rb_ary_entry(value, i);
261
+ if (!rb_obj_is_kind_of(entry, klass))
262
+ rb_raise(rb_eArgError, "arg must be array of PKCS11::%s", struct_name);
263
+ memcpy(RSTRING_PTR(str_buf) + sizeofstruct * i, DATA_PTR(entry), sizeofstruct);
264
+ }
265
+ *(CK_VOID_PTR*)(ptr+offset) = RSTRING_PTR(str_buf);
266
+ *(unsigned long*)(ptr+offset_len) = RARRAY_LEN(value);
267
+ rb_iv_set(obj, name, str_buf);
268
+ return value;
269
+ }
270
+
271
+
272
+ #define OFFSET_OF(s, f) ((off_t)((char*)&(((s*)0)->f) - (char*)0))
273
+ #define SIZE_OF(s, f) (sizeof(((s*)0)->f))
274
+
275
+ #define PKCS11_IMPLEMENT_ALLOCATOR(s) \
276
+ static VALUE s##_s_alloc(VALUE self){ \
277
+ s *info; \
278
+ VALUE obj = Data_Make_Struct(self, s, 0, -1, info); \
279
+ return obj; \
280
+ } \
281
+ static VALUE c##s##_to_s(VALUE self){ \
282
+ return rb_str_new(DATA_PTR(self), sizeof(s)); \
283
+ } \
284
+ static VALUE c##s##_members(VALUE self){ \
285
+ return a##s##_members; \
286
+ }
287
+
288
+ #define PKCS11_IMPLEMENT_STRUCT_WITH_ALLOCATOR(s) \
289
+ static VALUE c##s;\
290
+ static VALUE a##s##_members;\
291
+ PKCS11_IMPLEMENT_ALLOCATOR(s);
292
+
293
+ #define PKCS11_IMPLEMENT_STRING_ACCESSOR(s, f) \
294
+ static VALUE c##s##_get_##f(VALUE o){ \
295
+ return get_string(o, OFFSET_OF(s, f), SIZE_OF(s, f)); \
296
+ } \
297
+ static VALUE c##s##_set_##f(VALUE o, VALUE v){ \
298
+ return set_string(o, v, OFFSET_OF(s, f), SIZE_OF(s, f)); \
299
+ }
300
+
301
+ #define PKCS11_IMPLEMENT_ULONG_ACCESSOR(s, f) \
302
+ static VALUE c##s##_get_##f(VALUE o){ \
303
+ return get_ulong(o, OFFSET_OF(s, f)); \
304
+ } \
305
+ static VALUE c##s##_set_##f(VALUE o, VALUE v){ \
306
+ return set_ulong(o, v, OFFSET_OF(s, f)); \
307
+ }
308
+
309
+ #define PKCS11_IMPLEMENT_BYTE_ACCESSOR(s, f) \
310
+ static VALUE c##s##_get_##f(VALUE o){ \
311
+ return get_byte(o, OFFSET_OF(s, f)); \
312
+ } \
313
+ static VALUE c##s##_set_##f(VALUE o, VALUE v){ \
314
+ return set_byte(o, v, OFFSET_OF(s, f)); \
315
+ }
316
+
317
+ #define PKCS11_IMPLEMENT_ULONG_PTR_ACCESSOR(s, f) \
318
+ static VALUE c##s##_get_##f(VALUE o){ \
319
+ return get_ulong_ptr(o, OFFSET_OF(s, f)); \
320
+ } \
321
+ static VALUE c##s##_set_##f(VALUE o, VALUE v){ \
322
+ return set_ulong_ptr(o, v, #f, OFFSET_OF(s, f)); \
323
+ }
324
+
325
+ #define PKCS11_IMPLEMENT_HANDLE_ACCESSOR(s, f) \
326
+ static VALUE c##s##_get_##f(VALUE o){ \
327
+ return get_handle(o, OFFSET_OF(s, f)); \
328
+ } \
329
+ static VALUE c##s##_set_##f(VALUE o, VALUE v){ \
330
+ return set_handle(o, v, OFFSET_OF(s, f)); \
331
+ }
332
+
333
+ #define PKCS11_IMPLEMENT_BOOL_ACCESSOR(s, f) \
334
+ static VALUE c##s##_get_##f(VALUE o){ \
335
+ return get_bool(o, OFFSET_OF(s, f)); \
336
+ } \
337
+ static VALUE c##s##_set_##f(VALUE o, VALUE v){ \
338
+ return set_bool(o, v, OFFSET_OF(s, f)); \
339
+ }
340
+
341
+ #define PKCS11_IMPLEMENT_STRING_PTR_ACCESSOR(s, f) \
342
+ static VALUE c##s##_get_##f(VALUE o){ \
343
+ return get_string_ptr(o, #f, OFFSET_OF(s, f)); \
344
+ } \
345
+ static VALUE c##s##_set_##f(VALUE o, VALUE v){ \
346
+ return set_string_ptr(o, v, #f, OFFSET_OF(s, f)); \
347
+ }
348
+
349
+ #define PKCS11_IMPLEMENT_STRING_PTR_LEN_ACCESSOR(s, f, l) \
350
+ static VALUE c##s##_get_##f(VALUE o){ \
351
+ return get_string_ptr_len(o, #f, OFFSET_OF(s, f), OFFSET_OF(s, l)); \
352
+ } \
353
+ static VALUE c##s##_set_##f(VALUE o, VALUE v){ \
354
+ return set_string_ptr_len(o, v, #f, OFFSET_OF(s, f), OFFSET_OF(s, l)); \
355
+ }
356
+
357
+ #define PKCS11_IMPLEMENT_STRUCT_ACCESSOR(s, k, f) \
358
+ static VALUE c##s##_get_##f(VALUE o){ \
359
+ return get_struct_inline(o, c##k, #f, OFFSET_OF(s, f)); \
360
+ } \
361
+ static VALUE c##s##_set_##f(VALUE o, VALUE v){ \
362
+ return set_struct_inline(o, c##k, #k, v, #f, OFFSET_OF(s, f), sizeof(k)); \
363
+ }
364
+
365
+ #define PKCS11_IMPLEMENT_PKCS11_STRUCT_ACCESSOR(s, k, f) \
366
+ static VALUE c##s##_get_##f(VALUE o){ \
367
+ VALUE klass = rb_const_get(rb_const_get(rb_cObject, rb_intern("PKCS11")), rb_intern(#k)); \
368
+ return get_struct_inline(o, klass, #f, OFFSET_OF(s, f)); \
369
+ } \
370
+ static VALUE c##s##_set_##f(VALUE o, VALUE v){ \
371
+ VALUE klass = rb_const_get(rb_const_get(rb_cObject, rb_intern("PKCS11")), rb_intern(#k)); \
372
+ return set_struct_inline(o, klass, #k, v, #f, OFFSET_OF(s, f), sizeof(k)); \
373
+ }
374
+
375
+ #define PKCS11_IMPLEMENT_STRUCT_PTR_ACCESSOR(s, k, f) \
376
+ static VALUE c##s##_get_##f(VALUE o){ \
377
+ return get_struct_ptr(o, c##k, #f, OFFSET_OF(s, f), sizeof(k)); \
378
+ } \
379
+ static VALUE c##s##_set_##f(VALUE o, VALUE v){ \
380
+ return set_struct_ptr(o, c##k, #k, v, #f, OFFSET_OF(s, f)); \
381
+ }
382
+
383
+ #define PKCS11_IMPLEMENT_PKCS11_STRUCT_PTR_ACCESSOR(s, k, f) \
384
+ static VALUE c##s##_get_##f(VALUE o){ \
385
+ VALUE klass = rb_const_get(rb_const_get(rb_cObject, rb_intern("PKCS11")), rb_intern(#k)); \
386
+ return get_struct_ptr(o, klass, #f, OFFSET_OF(s, f), sizeof(k)); \
387
+ } \
388
+ static VALUE c##s##_set_##f(VALUE o, VALUE v){ \
389
+ VALUE klass = rb_const_get(rb_const_get(rb_cObject, rb_intern("PKCS11")), rb_intern(#k)); \
390
+ return set_struct_ptr(o, klass, #k, v, #f, OFFSET_OF(s, f)); \
391
+ }
392
+
393
+ #define PKCS11_IMPLEMENT_STRUCT_PTR_ARRAY_ACCESSOR(s, k, f, l) \
394
+ static VALUE c##s##_get_##f(VALUE o){ \
395
+ return get_struct_ptr_array(o, c##k, OFFSET_OF(s, f), OFFSET_OF(s, l), sizeof(k)); \
396
+ } \
397
+ static VALUE c##s##_set_##f(VALUE o, VALUE v){ \
398
+ return set_struct_ptr_array(o, c##k, #k, v, #f, OFFSET_OF(s, f), OFFSET_OF(s, l), sizeof(k)); \
399
+ }
400
+
401
+ #define PKCS11_IMPLEMENT_PKCS11_STRUCT_PTR_ARRAY_ACCESSOR(s, k, f, l) \
402
+ static VALUE c##s##_get_##f(VALUE o){ \
403
+ VALUE klass = rb_const_get(rb_const_get(rb_cObject, rb_intern("PKCS11")), rb_intern(#k)); \
404
+ return get_struct_ptr_array(o, klass, OFFSET_OF(s, f), OFFSET_OF(s, l), sizeof(k)); \
405
+ } \
406
+ static VALUE c##s##_set_##f(VALUE o, VALUE v){ \
407
+ VALUE klass = rb_const_get(rb_const_get(rb_cObject, rb_intern("PKCS11")), rb_intern(#k)); \
408
+ return set_struct_ptr_array(o, klass, #k, v, #f, OFFSET_OF(s, f), OFFSET_OF(s, l), sizeof(k)); \
409
+ }
410
+
411
+
412
+ /**************************************************/
413
+ /* struct/attribute definition */
414
+ /**************************************************/
415
+
416
+ #define PKCS11_DEFINE_STRUCT(s) \
417
+ do { \
418
+ c##s = rb_define_class_under(MODULE_FOR_STRUCTS, #s, BASECLASS_FOR_STRUCTS); \
419
+ a##s##_members = rb_ary_new(); \
420
+ rb_define_alloc_func(c##s, s##_s_alloc); \
421
+ rb_define_const(c##s, "SIZEOF_STRUCT", ULONG2NUM(sizeof(s))); \
422
+ rb_define_method(c##s, "to_s", c##s##_to_s, 0); \
423
+ rb_define_method(c##s, "members", c##s##_members, 0); \
424
+ rb_iv_set(c##s, "members", a##s##_members); \
425
+ } while(0)
426
+
427
+ #define PKCS11_DEFINE_MEMBER(s, f) \
428
+ do { \
429
+ rb_define_method(c##s, #f, c##s##_get_##f, 0); \
430
+ rb_define_method(c##s, #f "=", c##s##_set_##f, 1); \
431
+ rb_ary_push(a##s##_members, rb_str_new2(#f)); \
432
+ } while(0)
433
+
434
+
435
+ #endif
@@ -0,0 +1,6 @@
1
+ #ifndef RUBY_PK11_VERSION_H
2
+ #define RUBY_PK11_VERSION_H
3
+
4
+ static const char *VERSION = "0.2.7";
5
+
6
+ #endif