pkcs11 0.2.1-x86-mingw32 → 0.2.2-x86-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.
File without changes
@@ -1,3 +1,13 @@
1
+ === 0.2.2 / 2011-12-12
2
+
3
+ * add ability to change PKCS11 base methods in order to use vendor defined attributes, return codes and mechanisms
4
+ * restructured C code to avoid duplicated code in vendor extension gems
5
+ * add gem pkcs11_protect_server to cover many ProtectServer specific extensions
6
+ * update test/helper to find newer libsoftokn3
7
+ * add task for generating combined docs of PKCS11 and PKCS11::ProtectServer
8
+ * changed PKCS11#slots to return all slots of the device by default
9
+ * add ability to set/get multiple attributes with Object#[] and Object#[]=
10
+
1
11
  === 0.2.1 / 2011-04-21
2
12
 
3
13
  * add some more CK_ULONG and CK_BOOL attributes
@@ -1,4 +1,5 @@
1
1
  .autotest
2
+ .gemtest
2
3
  .yardopts
3
4
  History.txt
4
5
  MIT-LICENSE
@@ -21,6 +22,7 @@ ext/pk11.h
21
22
  ext/pk11_const.c
22
23
  ext/pk11_const_macros.h
23
24
  ext/pk11_struct_macros.h
25
+ ext/pk11_version.h
24
26
  lib/pkcs11.rb
25
27
  lib/pkcs11/extensions.rb
26
28
  lib/pkcs11/helper.rb
@@ -28,8 +30,20 @@ lib/pkcs11/library.rb
28
30
  lib/pkcs11/object.rb
29
31
  lib/pkcs11/session.rb
30
32
  lib/pkcs11/slot.rb
31
- sample/firefox_certs.rb
32
- sample/nssckbi.rb
33
+ pkcs11_protect_server/.gemtest
34
+ pkcs11_protect_server/.yardopts
35
+ pkcs11_protect_server/Manifest.txt
36
+ pkcs11_protect_server/README_PROTECT_SERVER.rdoc
37
+ pkcs11_protect_server/Rakefile
38
+ pkcs11_protect_server/ext/extconf.rb
39
+ pkcs11_protect_server/ext/generate_constants.rb
40
+ pkcs11_protect_server/ext/generate_structs.rb
41
+ pkcs11_protect_server/ext/pk11s.c
42
+ pkcs11_protect_server/lib/pkcs11_protect_server.rb
43
+ pkcs11_protect_server/lib/pkcs11_protect_server/extensions.rb
44
+ pkcs11_protect_server/test/helper.rb
45
+ pkcs11_protect_server/test/test_pkcs11_protect_server.rb
46
+ pkcs11_protect_server/test/test_pkcs11_protect_server_crypt.rb
33
47
  test/fixtures/softokn/cert8.db
34
48
  test/fixtures/softokn/key3.db
35
49
  test/fixtures/softokn/secmod.db
@@ -55,7 +55,7 @@ This opens a PKCS#11 library and prints it's information block.
55
55
  Then a {PKCS11::Session} to the first active slot of the device is opened and
56
56
  a login is done on the user account. Now, a 112 bit DES3 key is generated and
57
57
  some plaintext is encrypted with it. A 8-byte zero IV is used. In many cases method parameters
58
- can be Integer (like CKA_LABEL) or, as in the sample, Symbol (:LABEL) which is internally
58
+ can be Integer (like PKCS11::CKA_LABEL) or, as in the sample, Symbol (:LABEL) which is internally
59
59
  converted.
60
60
 
61
61
  Many more usage examples can be found in the unit tests of the <tt>test</tt>
@@ -65,8 +65,24 @@ Detail information for the API specification is provided by RSA Security Inc.
65
65
  Please refer the URL: http://www.rsa.com/rsalabs/node.asp?id=2133. Browsable HTML
66
66
  can be found at http://www.cryptsoft.com/pkcs11doc.
67
67
 
68
+ === Vendor extensions
69
+ Some vendors extend their libraries beyond the standard, in it's own way.
70
+ This can be used by vendor specific packages:
71
+ * Safenet ProtectServer: {file:pkcs11_protect_server/README_PROTECT_SERVER.rdoc}
68
72
 
69
- == Cross compiling for mswin32
73
+ === Threading
74
+
75
+ The pkcs11 binding fully supports native, background Ruby threads.
76
+ This of course only applies to Rubinius and Ruby 1.9.x or higher since
77
+ earlier versions of Ruby do not support native threads.
78
+
79
+ Calling the Cryptoki library from multiple threads simultaneously,
80
+ requires to open it with flag PKCS11::CKF_OS_LOCKING_OK.
81
+ Application-supplied synchronization primitives
82
+ (CreateMutex, DestroyMutex, LockMutex, UnlockMutex) are not supported.
83
+
84
+
85
+ == Cross compiling for Windows
70
86
 
71
87
  Using rake-compiler a cross compiled pkcs11-gem can be build on a linux host for
72
88
  the win32 platform. There are no runtime dependencies to any but the standard Windows DLLs.
@@ -85,20 +101,21 @@ Install the rake-compiler:
85
101
 
86
102
  Download and cross compile ruby for win32:
87
103
 
88
- rake-compiler cross-ruby VERSION=1.8.6-p287
104
+ rake-compiler cross-ruby VERSION=1.8.7-p352
105
+ rake-compiler cross-ruby VERSION=1.9.2-p290
89
106
 
90
- Download and cross compile pkcs11 for win32:
107
+ Download and cross compile pkcs11 for win32 (MRI 1.8+1.9 fat gem):
91
108
 
92
- rake cross native gem
109
+ rake cross native gem RUBY_CC_VERSION=1.8.7:1.9.2
93
110
 
94
- If everything works, there should be pkcs11-VERSION-x86-mswin32.gem in the pkg
111
+ If everything works, there should be pkcs11-VERSION-x86-mingw32.gem in the pkg
95
112
  directory.
96
113
 
97
114
 
98
115
  == ToDo
99
116
 
100
117
  * encoding support for Ruby 1.9
101
- * support for proprietary extensions of different vendors
118
+ * support for proprietary extensions of different vendors (done for Safenet-ProtectServer)
102
119
  * PKCS#11 v2.3
103
120
 
104
121
  == Development Status
data/Rakefile CHANGED
@@ -6,11 +6,16 @@ require 'hoe'
6
6
  require 'rake/extensiontask'
7
7
  require 'rbconfig'
8
8
 
9
- CLEAN.include 'ext/pk11_struct_def.inc'
10
- CLEAN.include 'ext/pk11_struct_impl.inc'
11
- CLEAN.include 'ext/pk11_const_def.inc'
12
- CLEAN.include 'ext/pk11_thread_funcs.h'
13
- CLEAN.include 'ext/pk11_thread_funcs.c'
9
+ GENERATED_FILES = [
10
+ 'ext/pk11_struct_impl.inc',
11
+ 'ext/pk11_struct_def.inc',
12
+ 'ext/pk11_const_def.inc',
13
+ 'ext/pk11_struct.doc',
14
+ 'ext/pk11_thread_funcs.h',
15
+ 'ext/pk11_thread_funcs.c',
16
+ ]
17
+
18
+ CLEAN.include GENERATED_FILES
14
19
  CLEAN.include 'lib/pkcs11_ext.so'
15
20
  CLEAN.include 'tmp'
16
21
 
@@ -28,43 +33,49 @@ hoe = Hoe.spec 'pkcs11' do
28
33
  self.readme_file = 'README.rdoc'
29
34
  self.extra_rdoc_files << self.readme_file << 'ext/pk11.c'
30
35
  spec_extras[:extensions] = 'ext/extconf.rb'
31
- spec_extras[:files] = File.read_utf("Manifest.txt").split(/\r?\n\r?/)
32
- spec_extras[:files] << 'ext/pk11_struct_impl.inc'
33
- spec_extras[:files] << 'ext/pk11_struct_def.inc'
34
- spec_extras[:files] << 'ext/pk11_const_def.inc'
35
- spec_extras[:files] << 'ext/pk11_thread_funcs.h'
36
- spec_extras[:files] << 'ext/pk11_thread_funcs.c'
36
+ spec_extras[:files] = File.read_utf("Manifest.txt").split(/\r?\n\r?/).reject{|f| f=~/^pkcs11_/ }
37
+ spec_extras[:files] += GENERATED_FILES
37
38
  spec_extras[:has_rdoc] = 'yard'
38
39
  end
39
40
 
40
- ENV['RUBY_CC_VERSION'] ||= '1.8.6:1.9.2'
41
+ ENV['RUBY_CC_VERSION'] ||= '1.8.7:1.9.2'
41
42
 
42
43
  Rake::ExtensionTask.new('pkcs11_ext', hoe.spec) do |ext|
43
44
  ext.ext_dir = 'ext'
44
45
  ext.cross_compile = true # enable cross compilation (requires cross compile toolchain)
45
- ext.cross_platform = ['i386-mswin32', 'i386-mingw32'] # forces the Windows platform instead of the default one
46
+ ext.cross_platform = ['i386-mingw32'] # forces the Windows platform instead of the default one
46
47
  end
47
48
 
48
49
  file 'ext/extconf.rb' => ['ext/pk11_struct_def.inc', 'ext/pk11_thread_funcs.c']
49
50
  file 'ext/pk11_struct_def.inc' => 'ext/generate_structs.rb' do
50
- sh "#{Config::CONFIG['ruby_install_name']} ext/generate_structs.rb --def ext/pk11_struct_def.inc --impl ext/pk11_struct_impl.inc --doc ext/pk11_struct.doc ext/include/pkcs11t.h"
51
+ sh "#{RbConfig::CONFIG['ruby_install_name']} ext/generate_structs.rb --def ext/pk11_struct_def.inc --impl ext/pk11_struct_impl.inc --doc ext/pk11_struct.doc ext/include/pkcs11t.h"
51
52
  end
52
53
  file 'ext/pk11_struct_impl.inc' => 'ext/pk11_struct_def.inc'
54
+ file 'ext/pk11_struct.doc' => 'ext/pk11_struct_def.inc'
55
+
53
56
  file 'ext/pk11_const_def.inc' => 'ext/generate_constants.rb' do
54
- sh "#{Config::CONFIG['ruby_install_name']} ext/generate_constants.rb --const ext/pk11_const_def.inc ext/include/pkcs11t.h"
57
+ sh "#{RbConfig::CONFIG['ruby_install_name']} ext/generate_constants.rb --const ext/pk11_const_def.inc ext/include/pkcs11t.h"
55
58
  end
56
59
  file 'ext/pk11.c' => ['ext/pk11_struct_def.inc', 'ext/pk11_struct_impl.inc', 'ext/pk11_struct_macros.h']
57
60
  file 'ext/pk11_const.c' => ['ext/pk11_const_def.inc', 'ext/pk11_const_macros.h']
58
61
 
59
62
  file 'ext/pk11_thread_funcs.h' => 'ext/generate_thread_funcs.rb' do
60
- sh "#{Config::CONFIG['ruby_install_name']} ext/generate_thread_funcs.rb --impl ext/pk11_thread_funcs.c --decl ext/pk11_thread_funcs.h ext/include/pkcs11f.h"
63
+ sh "#{RbConfig::CONFIG['ruby_install_name']} ext/generate_thread_funcs.rb --impl ext/pk11_thread_funcs.c --decl ext/pk11_thread_funcs.h ext/include/pkcs11f.h"
61
64
  end
62
65
  file 'ext/pk11_thread_funcs.c' => 'ext/pk11_thread_funcs.h'
63
66
  file 'ext/pk11.h' => 'ext/pk11_thread_funcs.h'
64
67
 
68
+ task :docs_of_vendor_extensions do
69
+ Dir['pkcs11_*'].each do |dir|
70
+ chdir(dir) do
71
+ sh "rake doc_files"
72
+ end
73
+ end
74
+ end
75
+
65
76
  desc "Generate static HTML documentation with YARD"
66
- task :yardoc do
67
- sh "yardoc"
77
+ task :yardoc=>['ext/pk11_struct.doc', :docs_of_vendor_extensions] do
78
+ sh "yardoc --title \"PKCS#11/Ruby Interface\" --no-private lib/**/*.rb ext/*.c ext/*.doc pkcs11_protect_server/lib/**/*.rb pkcs11_protect_server/ext/*.c pkcs11_protect_server/ext/*.doc - pkcs11_protect_server/README_PROTECT_SERVER.rdoc"
68
79
  end
69
80
 
70
81
  desc "Publish YARD to wherever you want."
@@ -36,7 +36,10 @@ class StructParser
36
36
  Attribute = Struct.new(:type, :name, :qual, :mark)
37
37
  IgnoreStructs = %w[CK_ATTRIBUTE CK_MECHANISM]
38
38
  OnlyAllocatorStructs = %w[CK_MECHANISM_INFO CK_C_INITIALIZE_ARGS CK_INFO CK_SLOT_INFO CK_TOKEN_INFO CK_SESSION_INFO]
39
- STRUCT_MODULE = 'PKCS11'
39
+
40
+ def struct_module
41
+ 'PKCS11'
42
+ end
40
43
 
41
44
  class CStruct
42
45
  def attr_by_sign(key)
@@ -44,6 +47,12 @@ class StructParser
44
47
  end
45
48
  end
46
49
 
50
+ class Attribute
51
+ def type_noptr
52
+ type.gsub(/_PTR$/,'')
53
+ end
54
+ end
55
+
47
56
  def parse_files(files)
48
57
  structs = []
49
58
  files.each do |file_h|
@@ -69,6 +78,8 @@ class StructParser
69
78
  write_files
70
79
  end
71
80
 
81
+ def array_attribute_names; ['pParams']; end
82
+
72
83
  def write_files
73
84
  File.open(options.def, "w") do |fd_def|
74
85
  File.open(options.impl, "w") do |fd_impl|
@@ -82,24 +93,25 @@ class StructParser
82
93
  fd_impl.puts "PKCS11_IMPLEMENT_STRUCT_WITH_ALLOCATOR(#{struct.name});"
83
94
  end
84
95
  fd_def.puts "PKCS11_DEFINE_STRUCT(#{struct.name});"
85
- fd_doc.puts"class #{STRUCT_MODULE}::#{struct.name} < #{STRUCT_MODULE}::CStruct"
96
+ fd_doc.puts"class #{struct_module}::#{struct.name} < #{struct_module}::CStruct"
86
97
  fd_doc.puts"# Size of corresponding C struct in bytes\nSIZEOF_STRUCT=Integer"
87
98
  fd_doc.puts"# @return [String] Binary copy of the C struct\ndef to_s; end"
88
99
  fd_doc.puts"# @return [Array<String>] Attributes of this struct\ndef members; end"
89
100
 
90
101
  # find attributes belonging together for array of struct
91
- struct.attrs.select{|attr| structs_by_name[attr.type.gsub(/_PTR$/,'')] }.each do |attr|
92
- if attr.name=='pParams' && (len_attr = struct.attr_by_sign("CK_ULONG ulCount"))
93
- fd_impl.puts "PKCS11_IMPLEMENT_STRUCT_PTR_ARRAY_ACCESSOR(#{struct.name}, #{attr.type.gsub(/_PTR$/,'')}, #{attr.name}, #{len_attr.name});"
102
+ struct.attrs.select{|attr| structs_by_name[attr.type_noptr] || std_structs_by_name[attr.type_noptr] }.each do |attr|
103
+ if array_attribute_names.include?(attr.name) && (len_attr = struct.attr_by_sign("CK_ULONG ulCount") || struct.attr_by_sign("CK_ULONG count") || struct.attr_by_sign("CK_ULONG #{attr.name}Count"))
104
+ std_struct = "PKCS11_" if std_structs_by_name[attr.type_noptr]
105
+ fd_impl.puts "PKCS11_IMPLEMENT_#{std_struct}STRUCT_PTR_ARRAY_ACCESSOR(#{struct.name}, #{attr.type_noptr}, #{attr.name}, #{len_attr.name});"
94
106
  fd_def.puts "PKCS11_DEFINE_MEMBER(#{struct.name}, #{attr.name});"
95
- fd_doc.puts"# @return [Array<PKCS11::#{attr.type.gsub(/_PTR$/,'')}>] accessor for #{attr.name} and #{len_attr.name}\nattr_accessor :#{attr.name}"
107
+ fd_doc.puts"# @return [Array<PKCS11::#{attr.type_noptr}>] accessor for #{attr.name} and #{len_attr.name}\nattr_accessor :#{attr.name}"
96
108
  len_attr.mark = true
97
109
  attr.mark = true
98
110
  end
99
111
  end
100
112
  # find string attributes belonging together
101
113
  struct.attrs.select{|attr| ['CK_BYTE_PTR', 'CK_VOID_PTR', 'CK_UTF8CHAR_PTR', 'CK_CHAR_PTR'].include?(attr.type) }.each do |attr|
102
- if len_attr=struct.attr_by_sign("CK_ULONG #{attr.name.gsub(/^p/, "ul")}Len")
114
+ if len_attr=struct.attr_by_sign("CK_ULONG #{attr.name.gsub(/^p([A-Z])/){ "ul"+$1 }}Len")
103
115
  fd_impl.puts "PKCS11_IMPLEMENT_STRING_PTR_LEN_ACCESSOR(#{struct.name}, #{attr.name}, #{len_attr.name});"
104
116
  fd_def.puts "PKCS11_DEFINE_MEMBER(#{struct.name}, #{attr.name});"
105
117
  fd_doc.puts"# @return [String, nil] accessor for #{attr.name} and #{len_attr.name}\nattr_accessor :#{attr.name}"
@@ -136,7 +148,7 @@ class StructParser
136
148
  fd_impl.puts "PKCS11_IMPLEMENT_BYTE_ACCESSOR(#{struct.name}, #{attr.name});"
137
149
  fd_def.puts "PKCS11_DEFINE_MEMBER(#{struct.name}, #{attr.name});"
138
150
  fd_doc.puts"# @return [Integer] accessor for #{attr.name} (CK_BYTE)\nattr_accessor :#{attr.name}"
139
- when 'CK_ULONG', 'CK_FLAGS', 'CK_SLOT_ID', 'CK_STATE', 'CK_COUNT', 'CK_SIZE', /CK_[A-Z_0-9]+_TYPE/
151
+ when 'CK_ULONG', 'CK_FLAGS', 'CK_SLOT_ID', 'CK_STATE', /CK_[A-Z_0-9]+_TYPE/
140
152
  fd_impl.puts "PKCS11_IMPLEMENT_ULONG_ACCESSOR(#{struct.name}, #{attr.name});"
141
153
  fd_def.puts "PKCS11_DEFINE_MEMBER(#{struct.name}, #{attr.name});"
142
154
  fd_doc.puts"# @return [Integer] accessor for #{attr.name} (CK_ULONG)\nattr_accessor :#{attr.name}"
@@ -148,7 +160,7 @@ class StructParser
148
160
  fd_impl.puts "PKCS11_IMPLEMENT_BOOL_ACCESSOR(#{struct.name}, #{attr.name});"
149
161
  fd_def.puts "PKCS11_DEFINE_MEMBER(#{struct.name}, #{attr.name});"
150
162
  fd_doc.puts"# @return [Boolean] Bool value\nattr_accessor :#{attr.name}"
151
- when 'CK_ULONG_PTR', 'CK_COUNT_PTR'
163
+ when 'CK_ULONG_PTR'
152
164
  fd_impl.puts "PKCS11_IMPLEMENT_ULONG_PTR_ACCESSOR(#{struct.name}, #{attr.name});"
153
165
  fd_def.puts "PKCS11_DEFINE_MEMBER(#{struct.name}, #{attr.name});"
154
166
  fd_doc.puts"# @return [Integer, nil] accessor for #{attr.name} (CK_ULONG_PTR)\nattr_accessor :#{attr.name}"
@@ -157,19 +169,19 @@ class StructParser
157
169
  if structs_by_name[attr.type]
158
170
  fd_impl.puts "PKCS11_IMPLEMENT_STRUCT_ACCESSOR(#{struct.name}, #{attr.type}, #{attr.name});"
159
171
  fd_def.puts "PKCS11_DEFINE_MEMBER(#{struct.name}, #{attr.name});"
160
- fd_doc.puts"# @return [#{STRUCT_MODULE}::#{attr.type}] inline struct\nattr_accessor :#{attr.name}"
161
- elsif (attr_noptr=attr.type.gsub(/_PTR$/,'')) && structs_by_name[attr_noptr]
162
- fd_impl.puts "PKCS11_IMPLEMENT_STRUCT_PTR_ACCESSOR(#{struct.name}, #{attr_noptr}, #{attr.name});"
172
+ fd_doc.puts"# @return [#{struct_module}::#{attr.type}] inline struct\nattr_accessor :#{attr.name}"
173
+ elsif structs_by_name[attr.type_noptr]
174
+ fd_impl.puts "PKCS11_IMPLEMENT_STRUCT_PTR_ACCESSOR(#{struct.name}, #{attr.type_noptr}, #{attr.name});"
163
175
  fd_def.puts "PKCS11_DEFINE_MEMBER(#{struct.name}, #{attr.name});"
164
- fd_doc.puts"# @return [#{STRUCT_MODULE}::#{attr_noptr}, nil] pointer to struct\nattr_accessor :#{attr.name}"
176
+ fd_doc.puts"# @return [#{struct_module}::#{attr.type_noptr}, nil] pointer to struct\nattr_accessor :#{attr.name}"
165
177
  elsif std_structs_by_name[attr.type]
166
178
  fd_impl.puts "PKCS11_IMPLEMENT_PKCS11_STRUCT_ACCESSOR(#{struct.name}, #{attr.type}, #{attr.name});"
167
179
  fd_def.puts "PKCS11_DEFINE_MEMBER(#{struct.name}, #{attr.name});"
168
180
  fd_doc.puts"# @return [PKCS11::#{attr.type}] inline struct (see pkcs11.gem)\nattr_accessor :#{attr.name}"
169
- elsif (attr_noptr=attr.type.gsub(/_PTR$/,'')) && std_structs_by_name[attr_noptr]
170
- fd_impl.puts "PKCS11_IMPLEMENT_PKCS11_STRUCT_PTR_ACCESSOR(#{struct.name}, #{attr_noptr}, #{attr.name});"
181
+ elsif std_structs_by_name[attr.type_noptr]
182
+ fd_impl.puts "PKCS11_IMPLEMENT_PKCS11_STRUCT_PTR_ACCESSOR(#{struct.name}, #{attr.type_noptr}, #{attr.name});"
171
183
  fd_def.puts "PKCS11_DEFINE_MEMBER(#{struct.name}, #{attr.name});"
172
- fd_doc.puts"# @return [PKCS11::#{attr_noptr}, nil] pointer to struct (see pkcs11.gem)\nattr_accessor :#{attr.name}"
184
+ fd_doc.puts"# @return [PKCS11::#{attr.type_noptr}, nil] pointer to struct (see pkcs11.gem)\nattr_accessor :#{attr.name}"
173
185
  else
174
186
  fd_impl.puts "/* unimplemented attr #{attr.type} #{attr.name} #{attr.qual} */"
175
187
  fd_def.puts "/* unimplemented attr #{attr.type} #{attr.name} #{attr.qual} */"
data/ext/pk11.c CHANGED
@@ -1,5 +1,6 @@
1
1
  #include "pk11.h"
2
2
  #include "pk11_struct_macros.h"
3
+ #include "pk11_version.h"
3
4
 
4
5
  #if defined(compile_for_windows)
5
6
  #include <winbase.h> /* for LoadLibrary() */
@@ -7,8 +8,6 @@
7
8
  #include <dlfcn.h>
8
9
  #endif
9
10
 
10
- static const char *VERSION = "0.2.1";
11
-
12
11
  static ID sNEW;
13
12
  static VALUE mPKCS11;
14
13
  static VALUE cPKCS11;
@@ -41,11 +40,10 @@ static VALUE aCK_MECHANISM_members;
41
40
  VALUE pkcs11_return_value_to_class(CK_RV, VALUE);
42
41
 
43
42
  static void
44
- pkcs11_raise(CK_RV rv)
43
+ pkcs11_raise(VALUE self, CK_RV rv)
45
44
  {
46
- VALUE class;
47
- class = pkcs11_return_value_to_class(rv, ePKCS11Error);
48
- rb_raise(class, "%lu", rv);
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");
49
47
  }
50
48
 
51
49
  ///////////////////////////////////////
@@ -113,7 +111,7 @@ pkcs11_C_Finalize(VALUE self)
113
111
 
114
112
  GetFunction(self, C_Finalize, func);
115
113
  CallFunction(C_Finalize, func, rv, NULL_PTR);
116
- if (rv != CKR_OK) pkcs11_raise(rv);
114
+ if (rv != CKR_OK) pkcs11_raise(self,rv);
117
115
 
118
116
  return self;
119
117
  }
@@ -208,7 +206,7 @@ pkcs11_C_GetFunctionList(VALUE self)
208
206
  if(!func) rb_raise(ePKCS11Error, "%s", dlerror());
209
207
  #endif
210
208
  CallFunction(C_GetFunctionList, func, rv, &(ctx->functions));
211
- if (rv != CKR_OK) pkcs11_raise(rv);
209
+ if (rv != CKR_OK) pkcs11_raise(self,rv);
212
210
 
213
211
  return self;
214
212
  }
@@ -234,7 +232,7 @@ pkcs11_C_Initialize(int argc, VALUE *argv, VALUE self)
234
232
  }
235
233
  GetFunction(self, C_Initialize, func);
236
234
  CallFunction(C_Initialize, func, rv, args);
237
- if (rv != CKR_OK) pkcs11_raise(rv);
235
+ if (rv != CKR_OK) pkcs11_raise(self,rv);
238
236
 
239
237
  return self;
240
238
  }
@@ -264,7 +262,7 @@ pkcs11_C_GetInfo(VALUE self)
264
262
  GetFunction(self, C_GetInfo, func);
265
263
  info = pkcs11_new_struct(cCK_INFO);
266
264
  CallFunction(C_GetInfo, func, rv, (CK_INFO_PTR)DATA_PTR(info));
267
- if (rv != CKR_OK) pkcs11_raise(rv);
265
+ if (rv != CKR_OK) pkcs11_raise(self,rv);
268
266
 
269
267
  return info;
270
268
  }
@@ -281,12 +279,12 @@ pkcs11_C_GetSlotList(VALUE self, VALUE presented)
281
279
 
282
280
  GetFunction(self, C_GetSlotList, func);
283
281
  CallFunction(C_GetSlotList, func, rv, CK_FALSE, NULL_PTR, &ulSlotCount);
284
- if (rv != CKR_OK) pkcs11_raise(rv);
282
+ if (rv != CKR_OK) pkcs11_raise(self,rv);
285
283
  pSlotList = (CK_SLOT_ID_PTR)malloc(ulSlotCount*sizeof(CK_SLOT_ID));
286
284
  CallFunction(C_GetSlotList, func, rv, RTEST(presented) ? CK_TRUE : CK_FALSE, pSlotList, &ulSlotCount);
287
285
  if (rv != CKR_OK) {
288
286
  free(pSlotList);
289
- pkcs11_raise(rv);
287
+ pkcs11_raise(self,rv);
290
288
  }
291
289
  for (i = 0; i < ulSlotCount; i++)
292
290
  rb_ary_push(ary, HANDLE2NUM(pSlotList[i]));
@@ -305,7 +303,7 @@ pkcs11_C_GetSlotInfo(VALUE self, VALUE slot_id)
305
303
  GetFunction(self, C_GetSlotInfo, func);
306
304
  info = pkcs11_new_struct(cCK_SLOT_INFO);
307
305
  CallFunction(C_GetSlotInfo, func, rv, NUM2HANDLE(slot_id), DATA_PTR(info));
308
- if (rv != CKR_OK) pkcs11_raise(rv);
306
+ if (rv != CKR_OK) pkcs11_raise(self,rv);
309
307
 
310
308
  return info;
311
309
  }
@@ -320,7 +318,7 @@ pkcs11_C_GetTokenInfo(VALUE self, VALUE slot_id)
320
318
  GetFunction(self, C_GetTokenInfo, func);
321
319
  info = pkcs11_new_struct(cCK_TOKEN_INFO);
322
320
  CallFunction(C_GetTokenInfo, func, rv, NUM2HANDLE(slot_id), DATA_PTR(info));
323
- if (rv != CKR_OK) pkcs11_raise(rv);
321
+ if (rv != CKR_OK) pkcs11_raise(self,rv);
324
322
 
325
323
  return info;
326
324
  }
@@ -338,7 +336,7 @@ pkcs11_C_GetMechanismList(VALUE self, VALUE slot_id)
338
336
  ary = rb_ary_new();
339
337
  GetFunction(self, C_GetMechanismList, func);
340
338
  CallFunction(C_GetMechanismList, func, rv, NUM2HANDLE(slot_id), NULL_PTR, &count);
341
- if (rv != CKR_OK) pkcs11_raise(rv);
339
+ if (rv != CKR_OK) pkcs11_raise(self,rv);
342
340
  if (count == 0) return ary;
343
341
 
344
342
  types = (CK_MECHANISM_TYPE_PTR)malloc(sizeof(CK_MECHANISM_TYPE)*count);
@@ -346,7 +344,7 @@ pkcs11_C_GetMechanismList(VALUE self, VALUE slot_id)
346
344
  CallFunction(C_GetMechanismList, func, rv, NUM2HANDLE(slot_id), types, &count);
347
345
  if (rv != CKR_OK){
348
346
  free(types);
349
- pkcs11_raise(rv);
347
+ pkcs11_raise(self,rv);
350
348
  }
351
349
  for (i = 0; i < count; i++)
352
350
  rb_ary_push(ary, HANDLE2NUM(*(types+i)));
@@ -365,7 +363,7 @@ pkcs11_C_GetMechanismInfo(VALUE self, VALUE slot_id, VALUE type)
365
363
  info = pkcs11_new_struct(cCK_MECHANISM_INFO);
366
364
  GetFunction(self, C_GetMechanismInfo, func);
367
365
  CallFunction(C_GetMechanismInfo, func, rv, NUM2HANDLE(slot_id), NUM2HANDLE(type), DATA_PTR(info));
368
- if (rv != CKR_OK) pkcs11_raise(rv);
366
+ if (rv != CKR_OK) pkcs11_raise(self,rv);
369
367
 
370
368
  return info;
371
369
  }
@@ -382,7 +380,7 @@ pkcs11_C_InitToken(VALUE self, VALUE slot_id, VALUE pin, VALUE label)
382
380
  CallFunction(C_InitToken, func, rv, NUM2HANDLE(slot_id),
383
381
  (CK_UTF8CHAR_PTR)RSTRING_PTR(pin), RSTRING_LEN(pin),
384
382
  (CK_UTF8CHAR_PTR)RSTRING_PTR(label));
385
- if (rv != CKR_OK) pkcs11_raise(rv);
383
+ if (rv != CKR_OK) pkcs11_raise(self,rv);
386
384
 
387
385
  return self;
388
386
  }
@@ -397,7 +395,7 @@ pkcs11_C_InitPIN(VALUE self, VALUE session, VALUE pin)
397
395
  GetFunction(self, C_InitPIN, func);
398
396
  CallFunction(C_InitPIN, func, rv, NUM2HANDLE(session),
399
397
  (CK_UTF8CHAR_PTR)RSTRING_PTR(pin), RSTRING_LEN(pin));
400
- if (rv != CKR_OK) pkcs11_raise(rv);
398
+ if (rv != CKR_OK) pkcs11_raise(self,rv);
401
399
 
402
400
  return self;
403
401
  }
@@ -411,7 +409,7 @@ pkcs11_C_OpenSession(VALUE self, VALUE slot_id, VALUE flags)
411
409
 
412
410
  GetFunction(self, C_OpenSession, func);
413
411
  CallFunction(C_OpenSession, func, rv, NUM2HANDLE(slot_id), NUM2ULONG(flags), 0, 0, &handle);
414
- if(rv != CKR_OK) pkcs11_raise(rv);
412
+ if(rv != CKR_OK) pkcs11_raise(self,rv);
415
413
 
416
414
  return HANDLE2NUM(handle);
417
415
  }
@@ -426,7 +424,7 @@ pkcs11_C_Login(VALUE self, VALUE session, VALUE user_type, VALUE pin)
426
424
  GetFunction(self, C_Login, func);
427
425
  CallFunction(C_Login, func, rv, NUM2HANDLE(session), NUM2ULONG(user_type),
428
426
  (CK_UTF8CHAR_PTR)RSTRING_PTR(pin), RSTRING_LEN(pin));
429
- if(rv != CKR_OK) pkcs11_raise(rv);
427
+ if(rv != CKR_OK) pkcs11_raise(self,rv);
430
428
 
431
429
  return self;
432
430
  }
@@ -439,7 +437,7 @@ pkcs11_C_Logout(VALUE self, VALUE session)
439
437
 
440
438
  GetFunction(self, C_Logout, func);
441
439
  CallFunction(C_Logout, func, rv, NUM2HANDLE(session));
442
- if(rv != CKR_OK) pkcs11_raise(rv);
440
+ if(rv != CKR_OK) pkcs11_raise(self,rv);
443
441
 
444
442
  return self;
445
443
  }
@@ -452,7 +450,7 @@ pkcs11_C_CloseSession(VALUE self, VALUE session)
452
450
 
453
451
  GetFunction(self, C_CloseSession, func);
454
452
  CallFunction(C_CloseSession, func, rv, NUM2HANDLE(session));
455
- if(rv != CKR_OK) pkcs11_raise(rv);
453
+ if(rv != CKR_OK) pkcs11_raise(self,rv);
456
454
 
457
455
  return self;
458
456
  }
@@ -465,7 +463,7 @@ pkcs11_C_CloseAllSessions(VALUE self, VALUE slot_id)
465
463
 
466
464
  GetFunction(self, C_CloseAllSessions, func);
467
465
  CallFunction(C_CloseAllSessions, func, rv, NUM2HANDLE(slot_id));
468
- if(rv != CKR_OK) pkcs11_raise(rv);
466
+ if(rv != CKR_OK) pkcs11_raise(self,rv);
469
467
 
470
468
  return self;
471
469
  }
@@ -480,7 +478,7 @@ pkcs11_C_GetSessionInfo(VALUE self, VALUE session)
480
478
  info = pkcs11_new_struct(cCK_SESSION_INFO);
481
479
  GetFunction(self, C_GetSessionInfo, func);
482
480
  CallFunction(C_GetSessionInfo, func, rv, NUM2HANDLE(session), DATA_PTR(info));
483
- if (rv != CKR_OK) pkcs11_raise(rv);
481
+ if (rv != CKR_OK) pkcs11_raise(self,rv);
484
482
 
485
483
  return info;
486
484
  }
@@ -495,10 +493,10 @@ pkcs11_C_GetOperationState(VALUE self, VALUE session)
495
493
 
496
494
  GetFunction(self, C_GetOperationState, func);
497
495
  CallFunction(C_GetOperationState, func, rv, NUM2HANDLE(session), NULL_PTR, &size);
498
- if (rv != CKR_OK) pkcs11_raise(rv);
496
+ if (rv != CKR_OK) pkcs11_raise(self,rv);
499
497
  state = rb_str_new(0, size);
500
498
  CallFunction(C_GetOperationState, func, rv, NUM2HANDLE(session), (CK_BYTE_PTR)RSTRING_PTR(state), &size);
501
- if (rv != CKR_OK) pkcs11_raise(rv);
499
+ if (rv != CKR_OK) pkcs11_raise(self,rv);
502
500
  rb_str_set_len(state, size);
503
501
 
504
502
  return state;
@@ -515,7 +513,7 @@ pkcs11_C_SetOperationState(VALUE self, VALUE session, VALUE state, VALUE enc_key
515
513
  CallFunction(C_SetOperationState, func, rv, NUM2HANDLE(session),
516
514
  (CK_BYTE_PTR)RSTRING_PTR(state), RSTRING_LEN(state),
517
515
  NUM2HANDLE(enc_key), NUM2HANDLE(auth_key));
518
- if (rv != CKR_OK) pkcs11_raise(rv);
516
+ if (rv != CKR_OK) pkcs11_raise(self,rv);
519
517
 
520
518
  return self;
521
519
  }
@@ -532,7 +530,7 @@ pkcs11_C_SetPIN(VALUE self, VALUE session, VALUE old_pin, VALUE new_pin)
532
530
  CallFunction(C_SetPIN, func, rv, NUM2HANDLE(session),
533
531
  (CK_UTF8CHAR_PTR)RSTRING_PTR(old_pin), RSTRING_LEN(old_pin),
534
532
  (CK_UTF8CHAR_PTR)RSTRING_PTR(new_pin), RSTRING_LEN(new_pin));
535
- if(rv != CKR_OK) pkcs11_raise(rv);
533
+ if(rv != CKR_OK) pkcs11_raise(self,rv);
536
534
 
537
535
  return self;
538
536
  }
@@ -571,7 +569,7 @@ pkcs11_C_CreateObject(VALUE self, VALUE session, VALUE template)
571
569
  GetFunction(self, C_CreateObject, func);
572
570
  CallFunction(C_CreateObject, func, rv, NUM2HANDLE(session), tmp, RARRAY_LEN(template), &handle);
573
571
  free(tmp);
574
- if(rv != CKR_OK) pkcs11_raise(rv);
572
+ if(rv != CKR_OK) pkcs11_raise(self,rv);
575
573
 
576
574
  return HANDLE2NUM(handle);
577
575
  }
@@ -588,7 +586,7 @@ pkcs11_C_CopyObject(VALUE self, VALUE session, VALUE object, VALUE template)
588
586
  GetFunction(self, C_CopyObject, func);
589
587
  CallFunction(C_CopyObject, func, rv, NUM2HANDLE(session), NUM2HANDLE(object), tmp, RARRAY_LEN(template), &handle);
590
588
  free(tmp);
591
- if(rv != CKR_OK) pkcs11_raise(rv);
589
+ if(rv != CKR_OK) pkcs11_raise(self,rv);
592
590
 
593
591
  return HANDLE2NUM(handle);
594
592
  }
@@ -601,7 +599,7 @@ pkcs11_C_DestroyObject(VALUE self, VALUE session, VALUE handle)
601
599
 
602
600
  GetFunction(self, C_DestroyObject, func);
603
601
  CallFunction(C_DestroyObject, func, rv, NUM2HANDLE(session), NUM2HANDLE(handle));
604
- if(rv != CKR_OK) pkcs11_raise(rv);
602
+ if(rv != CKR_OK) pkcs11_raise(self,rv);
605
603
 
606
604
  return self;
607
605
  }
@@ -615,7 +613,7 @@ pkcs11_C_GetObjectSize(VALUE self, VALUE session, VALUE handle)
615
613
 
616
614
  GetFunction(self, C_GetObjectSize, func);
617
615
  CallFunction(C_GetObjectSize, func, rv, NUM2HANDLE(session), NUM2HANDLE(handle), &size);
618
- if(rv != CKR_OK) pkcs11_raise(rv);
616
+ if(rv != CKR_OK) pkcs11_raise(self,rv);
619
617
 
620
618
  return ULONG2NUM(size);
621
619
  }
@@ -635,7 +633,7 @@ pkcs11_C_FindObjectsInit(VALUE self, VALUE session, VALUE template)
635
633
  GetFunction(self, C_FindObjectsInit, func);
636
634
  CallFunction(C_FindObjectsInit, func, rv, NUM2HANDLE(session), tmp, tmp_size);
637
635
  free(tmp);
638
- if(rv != CKR_OK) pkcs11_raise(rv);
636
+ if(rv != CKR_OK) pkcs11_raise(self,rv);
639
637
 
640
638
  return self;
641
639
  }
@@ -648,7 +646,7 @@ pkcs11_C_FindObjectsFinal(VALUE self, VALUE session)
648
646
 
649
647
  GetFunction(self, C_FindObjectsFinal, func);
650
648
  CallFunction(C_FindObjectsFinal, func, rv, NUM2HANDLE(session));
651
- if(rv != CKR_OK) pkcs11_raise(rv);
649
+ if(rv != CKR_OK) pkcs11_raise(self,rv);
652
650
 
653
651
  return self;
654
652
  }
@@ -669,7 +667,7 @@ pkcs11_C_FindObjects(VALUE self, VALUE session, VALUE max_count)
669
667
  CallFunction(C_FindObjects, func, rv, NUM2HANDLE(session), handles, NUM2ULONG(max_count), &count);
670
668
  if(rv != CKR_OK){
671
669
  free(handles);
672
- pkcs11_raise(rv);
670
+ pkcs11_raise(self,rv);
673
671
  }
674
672
  ary = rb_ary_new();
675
673
  for(i = 0; i < count; i++)
@@ -689,6 +687,7 @@ pkcs11_C_GetAttributeValue(VALUE self, VALUE session, VALUE handle, VALUE templa
689
687
  CK_ULONG i, template_size;
690
688
  CK_ATTRIBUTE_PTR tmp;
691
689
  VALUE ary;
690
+ VALUE class_attr = rb_funcall(self, rb_intern("vendor_class_CK_ATTRIBUTE"), 0);
692
691
 
693
692
  tmp = pkcs11_attr_ary2buf(template);
694
693
  template_size = RARRAY_LEN(template);
@@ -696,7 +695,7 @@ pkcs11_C_GetAttributeValue(VALUE self, VALUE session, VALUE handle, VALUE templa
696
695
  CallFunction(C_GetAttributeValue, func, rv, NUM2HANDLE(session), NUM2HANDLE(handle), tmp, template_size);
697
696
  if(rv != CKR_OK){
698
697
  free(tmp);
699
- pkcs11_raise(rv);
698
+ pkcs11_raise(self,rv);
700
699
  }
701
700
 
702
701
  for (i = 0; i < template_size; i++){
@@ -711,13 +710,13 @@ pkcs11_C_GetAttributeValue(VALUE self, VALUE session, VALUE handle, VALUE templa
711
710
  if (attr->pValue) free(attr->pValue);
712
711
  }
713
712
  free(tmp);
714
- pkcs11_raise(rv);
713
+ pkcs11_raise(self,rv);
715
714
  }
716
715
  ary = rb_ary_new();
717
716
  for (i = 0; i < template_size; i++){
718
717
  CK_ATTRIBUTE_PTR attr = tmp + i;
719
718
  if (attr->ulValueLen != (CK_ULONG)-1){
720
- VALUE v = pkcs11_new_struct(cCK_ATTRIBUTE);
719
+ VALUE v = pkcs11_new_struct(class_attr);
721
720
  memcpy(DATA_PTR(v), attr, sizeof(CK_ATTRIBUTE));
722
721
  rb_ary_push(ary, v);
723
722
  }
@@ -740,7 +739,7 @@ pkcs11_C_SetAttributeValue(VALUE self, VALUE session, VALUE handle, VALUE templa
740
739
  GetFunction(self, C_SetAttributeValue, func);
741
740
  CallFunction(C_SetAttributeValue, func, rv, NUM2HANDLE(session), NUM2HANDLE(handle), tmp, template_size);
742
741
  free(tmp);
743
- if(rv != CKR_OK) pkcs11_raise(rv);
742
+ if(rv != CKR_OK) pkcs11_raise(self,rv);
744
743
 
745
744
  return self;
746
745
  }
@@ -754,7 +753,7 @@ pkcs11_C_SeedRandom(VALUE self, VALUE session, VALUE seed)
754
753
  GetFunction(self, C_SeedRandom, func);
755
754
  CallFunction(C_SeedRandom, func, rv, NUM2HANDLE(session),
756
755
  (CK_BYTE_PTR)RSTRING_PTR(seed), RSTRING_LEN(seed));
757
- if(rv != CKR_OK) pkcs11_raise(rv);
756
+ if(rv != CKR_OK) pkcs11_raise(self,rv);
758
757
 
759
758
  return self;
760
759
  }
@@ -769,7 +768,7 @@ pkcs11_C_GenerateRandom(VALUE self, VALUE session, VALUE size)
769
768
 
770
769
  GetFunction(self, C_GenerateRandom, func);
771
770
  CallFunction(C_GenerateRandom, func, rv, NUM2HANDLE(session), (CK_BYTE_PTR)RSTRING_PTR(buf), sz);
772
- if(rv != CKR_OK) pkcs11_raise(rv);
771
+ if(rv != CKR_OK) pkcs11_raise(self,rv);
773
772
 
774
773
  return buf;
775
774
  }
@@ -784,7 +783,7 @@ pkcs11_C_WaitForSlotEvent(VALUE self, VALUE flags)
784
783
  GetFunction(self, C_WaitForSlotEvent, func);
785
784
  CallFunction(C_WaitForSlotEvent, func, rv, NUM2ULONG(flags), &slot_id, NULL_PTR);
786
785
  if(rv == CKR_NO_EVENT) return Qnil;
787
- if(rv != CKR_OK) pkcs11_raise(rv);
786
+ if(rv != CKR_OK) pkcs11_raise(self,rv);
788
787
 
789
788
  return HANDLE2NUM(slot_id);
790
789
  }
@@ -806,10 +805,10 @@ typedef VALUE (*verify_func)
806
805
  typedef VALUE (*verify_final_func)
807
806
  (CK_SESSION_HANDLE, CK_BYTE_PTR, CK_ULONG);
808
807
 
809
- #define common_crypt(s, d, sz, f) common_crypt_update(s, d, sz, f)
808
+ #define common_crypt(self, s, d, sz, f) common_crypt_update(self, s, d, sz, f)
810
809
 
811
810
  static VALUE
812
- common_init(VALUE session, VALUE mechanism, VALUE key, init_func func)
811
+ common_init(VALUE self, VALUE session, VALUE mechanism, VALUE key, init_func func)
813
812
  {
814
813
  CK_RV rv;
815
814
  CK_MECHANISM_PTR m;
@@ -819,13 +818,13 @@ common_init(VALUE session, VALUE mechanism, VALUE key, init_func func)
819
818
  m = DATA_PTR(mechanism);
820
819
  /* Use the function signature of any of the various C_*Init functions. */
821
820
  CallFunction(C_EncryptInit, func, rv, NUM2HANDLE(session), m, NUM2HANDLE(key));
822
- if(rv != CKR_OK) pkcs11_raise(rv);
821
+ if(rv != CKR_OK) pkcs11_raise(self,rv);
823
822
 
824
823
  return Qnil;
825
824
  }
826
825
 
827
826
  static VALUE
828
- common_crypt_update(VALUE session, VALUE data, VALUE size, crypt_update_func func)
827
+ common_crypt_update(VALUE self, VALUE session, VALUE data, VALUE size, crypt_update_func func)
829
828
  {
830
829
  CK_RV rv;
831
830
  CK_ULONG sz = 0;
@@ -836,7 +835,7 @@ common_crypt_update(VALUE session, VALUE data, VALUE size, crypt_update_func fun
836
835
  CallFunction(C_EncryptUpdate, func, rv, NUM2HANDLE(session),
837
836
  (CK_BYTE_PTR)RSTRING_PTR(data), RSTRING_LEN(data),
838
837
  NULL_PTR, &sz);
839
- if(rv != CKR_OK) pkcs11_raise(rv);
838
+ if(rv != CKR_OK) pkcs11_raise(self,rv);
840
839
  }else{
841
840
  sz = NUM2ULONG(size);
842
841
  }
@@ -845,14 +844,14 @@ common_crypt_update(VALUE session, VALUE data, VALUE size, crypt_update_func fun
845
844
  CallFunction(C_EncryptUpdate, func, rv, NUM2HANDLE(session),
846
845
  (CK_BYTE_PTR)RSTRING_PTR(data), RSTRING_LEN(data),
847
846
  (CK_BYTE_PTR)RSTRING_PTR(buf), &sz);
848
- if(rv != CKR_OK) pkcs11_raise(rv);
847
+ if(rv != CKR_OK) pkcs11_raise(self,rv);
849
848
  rb_str_set_len(buf, sz);
850
849
 
851
850
  return buf;
852
851
  }
853
852
 
854
853
  static VALUE
855
- common_crypt_final(VALUE session, VALUE size, crypt_final_func func)
854
+ common_crypt_final(VALUE self, VALUE session, VALUE size, crypt_final_func func)
856
855
  {
857
856
  CK_RV rv;
858
857
  CK_ULONG sz = 0;
@@ -860,34 +859,34 @@ common_crypt_final(VALUE session, VALUE size, crypt_final_func func)
860
859
 
861
860
  if (NIL_P(size)){
862
861
  CallFunction(C_EncryptFinal, func, rv, NUM2HANDLE(session), NULL_PTR, &sz);
863
- if(rv != CKR_OK) pkcs11_raise(rv);
862
+ if(rv != CKR_OK) pkcs11_raise(self,rv);
864
863
  }else{
865
864
  sz = NUM2ULONG(size);
866
865
  }
867
866
  buf = rb_str_new(0, sz);
868
867
 
869
868
  CallFunction(C_EncryptFinal, func, rv, NUM2HANDLE(session), (CK_BYTE_PTR)RSTRING_PTR(buf), &sz);
870
- if(rv != CKR_OK) pkcs11_raise(rv);
869
+ if(rv != CKR_OK) pkcs11_raise(self,rv);
871
870
  rb_str_set_len(buf, sz);
872
871
 
873
872
  return buf;
874
873
  }
875
874
 
876
875
  static VALUE
877
- common_sign_update(VALUE session, VALUE data, sign_update_func func)
876
+ common_sign_update(VALUE self, VALUE session, VALUE data, sign_update_func func)
878
877
  {
879
878
  CK_RV rv;
880
879
 
881
880
  StringValue(data);
882
881
  CallFunction(C_SignUpdate, func, rv, NUM2HANDLE(session),
883
882
  (CK_BYTE_PTR)RSTRING_PTR(data), RSTRING_LEN(data));
884
- if(rv != CKR_OK) pkcs11_raise(rv);
883
+ if(rv != CKR_OK) pkcs11_raise(self,rv);
885
884
 
886
885
  return Qnil;
887
886
  }
888
887
 
889
888
  static VALUE
890
- common_verify(VALUE session, VALUE data, VALUE sig, verify_func func)
889
+ common_verify(VALUE self, VALUE session, VALUE data, VALUE sig, verify_func func)
891
890
  {
892
891
  CK_RV rv;
893
892
 
@@ -897,7 +896,7 @@ common_verify(VALUE session, VALUE data, VALUE sig, verify_func func)
897
896
  CallFunction(C_Verify, func, rv, NUM2HANDLE(session),
898
897
  (CK_BYTE_PTR)RSTRING_PTR(data), RSTRING_LEN(data),
899
898
  (CK_BYTE_PTR)RSTRING_PTR(sig), RSTRING_LEN(sig));
900
- if(rv != CKR_OK) pkcs11_raise(rv);
899
+ if(rv != CKR_OK) pkcs11_raise(self,rv);
901
900
 
902
901
  return Qnil;
903
902
  }
@@ -909,7 +908,7 @@ pkcs11_C_EncryptInit(VALUE self, VALUE session, VALUE mechanism, VALUE key)
909
908
  {
910
909
  CK_C_EncryptInit func;
911
910
  GetFunction(self, C_EncryptInit, func);
912
- common_init(session, mechanism, key, func);
911
+ common_init(self, session, mechanism, key, func);
913
912
  return self;
914
913
  }
915
914
 
@@ -918,7 +917,7 @@ pkcs11_C_Encrypt(VALUE self, VALUE session, VALUE data, VALUE size)
918
917
  {
919
918
  CK_C_Encrypt func;
920
919
  GetFunction(self, C_Encrypt, func);
921
- return common_crypt(session, data, size, func);
920
+ return common_crypt(self, session, data, size, func);
922
921
  }
923
922
 
924
923
  static VALUE
@@ -926,7 +925,7 @@ pkcs11_C_EncryptUpdate(VALUE self, VALUE session, VALUE data, VALUE size)
926
925
  {
927
926
  CK_C_EncryptUpdate func;
928
927
  GetFunction(self, C_EncryptUpdate, func);
929
- return common_crypt_update(session, data, size, func);
928
+ return common_crypt_update(self, session, data, size, func);
930
929
  }
931
930
 
932
931
  static VALUE
@@ -934,7 +933,7 @@ pkcs11_C_EncryptFinal(VALUE self, VALUE session, VALUE size)
934
933
  {
935
934
  CK_C_EncryptFinal func;
936
935
  GetFunction(self, C_EncryptFinal, func);
937
- return common_crypt_final(session, size, func);
936
+ return common_crypt_final(self, session, size, func);
938
937
  }
939
938
 
940
939
  static VALUE
@@ -942,7 +941,7 @@ pkcs11_C_DecryptInit(VALUE self, VALUE session, VALUE mechanism, VALUE key)
942
941
  {
943
942
  CK_C_DecryptInit func;
944
943
  GetFunction(self, C_DecryptInit, func);
945
- common_init(session, mechanism, key, func);
944
+ common_init(self, session, mechanism, key, func);
946
945
  return self;
947
946
  }
948
947
 
@@ -951,7 +950,7 @@ pkcs11_C_Decrypt(VALUE self, VALUE session, VALUE data, VALUE size)
951
950
  {
952
951
  CK_C_Decrypt func;
953
952
  GetFunction(self, C_Decrypt, func);
954
- return common_crypt(session, data, size, func);
953
+ return common_crypt(self, session, data, size, func);
955
954
  }
956
955
 
957
956
  static VALUE
@@ -959,7 +958,7 @@ pkcs11_C_DecryptUpdate(VALUE self, VALUE session, VALUE data, VALUE size)
959
958
  {
960
959
  CK_C_DecryptUpdate func;
961
960
  GetFunction(self, C_DecryptUpdate, func);
962
- return common_crypt_update(session, data, size, func);
961
+ return common_crypt_update(self, session, data, size, func);
963
962
  }
964
963
 
965
964
  static VALUE
@@ -967,21 +966,21 @@ pkcs11_C_DecryptFinal(VALUE self, VALUE session, VALUE size)
967
966
  {
968
967
  CK_C_DecryptFinal func;
969
968
  GetFunction(self, C_DecryptFinal, func);
970
- return common_crypt_final(session, size, func);
969
+ return common_crypt_final(self, session, size, func);
971
970
  }
972
971
 
973
- #define common_sign(s, d, sz, f) common_crypt(s, d, sz, f)
974
- #define common_sign_final(s, sz, f) common_crypt_final(s, sz, f)
975
- #define common_verify_update(s, d, f) common_sign_update(s, d, f)
976
- #define common_verify_final(s, d, f) common_sign_update(s, d, f)
977
- #define common_verify_recover(s, d, sz, f) common_sign(s, d, sz, f)
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)
978
977
 
979
978
  static VALUE
980
979
  pkcs11_C_SignInit(VALUE self, VALUE session, VALUE mechanism, VALUE key)
981
980
  {
982
981
  CK_C_SignInit func;
983
982
  GetFunction(self, C_SignInit, func);
984
- common_init(session, mechanism, key, func);
983
+ common_init(self, session, mechanism, key, func);
985
984
  return self;
986
985
  }
987
986
 
@@ -990,7 +989,7 @@ pkcs11_C_Sign(VALUE self, VALUE session, VALUE data, VALUE size)
990
989
  {
991
990
  CK_C_Sign func;
992
991
  GetFunction(self, C_Sign, func);
993
- return common_sign(session, data, size, func);
992
+ return common_sign(self, session, data, size, func);
994
993
  }
995
994
 
996
995
  static VALUE
@@ -998,7 +997,7 @@ pkcs11_C_SignUpdate(VALUE self, VALUE session, VALUE data)
998
997
  {
999
998
  CK_C_SignUpdate func;
1000
999
  GetFunction(self, C_SignUpdate, func);
1001
- common_sign_update(session, data, func);
1000
+ common_sign_update(self, session, data, func);
1002
1001
  return self;
1003
1002
  }
1004
1003
 
@@ -1007,7 +1006,7 @@ pkcs11_C_SignFinal(VALUE self, VALUE session, VALUE size)
1007
1006
  {
1008
1007
  CK_C_SignFinal func;
1009
1008
  GetFunction(self, C_SignFinal, func);
1010
- return common_sign_final(session, size, func);
1009
+ return common_sign_final(self, session, size, func);
1011
1010
  }
1012
1011
 
1013
1012
  static VALUE
@@ -1015,7 +1014,7 @@ pkcs11_C_SignRecoverInit(VALUE self, VALUE session, VALUE mechanism, VALUE key)
1015
1014
  {
1016
1015
  CK_C_SignRecoverInit func;
1017
1016
  GetFunction(self, C_SignRecoverInit, func);
1018
- common_init(session, mechanism, key, func);
1017
+ common_init(self, session, mechanism, key, func);
1019
1018
  return self;
1020
1019
  }
1021
1020
 
@@ -1024,7 +1023,7 @@ pkcs11_C_SignRecover(VALUE self, VALUE session, VALUE data, VALUE size)
1024
1023
  {
1025
1024
  CK_C_SignRecover func;
1026
1025
  GetFunction(self, C_SignRecover, func);
1027
- return common_sign(session, data, size, func);
1026
+ return common_sign(self, session, data, size, func);
1028
1027
  }
1029
1028
 
1030
1029
  static VALUE
@@ -1032,7 +1031,7 @@ pkcs11_C_VerifyInit(VALUE self, VALUE session, VALUE mechanism, VALUE key)
1032
1031
  {
1033
1032
  CK_C_VerifyInit func;
1034
1033
  GetFunction(self, C_VerifyInit, func);
1035
- common_init(session, mechanism, key, func);
1034
+ common_init(self, session, mechanism, key, func);
1036
1035
  return self;
1037
1036
  }
1038
1037
 
@@ -1041,7 +1040,7 @@ pkcs11_C_Verify(VALUE self, VALUE session, VALUE data, VALUE sig)
1041
1040
  {
1042
1041
  CK_C_Verify func;
1043
1042
  GetFunction(self, C_Verify, func);
1044
- common_verify(session, data, sig, func);
1043
+ common_verify(self, session, data, sig, func);
1045
1044
  return Qtrue;
1046
1045
  }
1047
1046
 
@@ -1050,7 +1049,7 @@ pkcs11_C_VerifyUpdate(VALUE self, VALUE session, VALUE data)
1050
1049
  {
1051
1050
  CK_C_VerifyUpdate func;
1052
1051
  GetFunction(self, C_VerifyUpdate, func);
1053
- common_verify_update(session, data, func);
1052
+ common_verify_update(self, session, data, func);
1054
1053
  return self;
1055
1054
  }
1056
1055
 
@@ -1059,7 +1058,7 @@ pkcs11_C_VerifyFinal(VALUE self, VALUE session, VALUE sig)
1059
1058
  {
1060
1059
  CK_C_VerifyFinal func;
1061
1060
  GetFunction(self, C_VerifyFinal, func);
1062
- common_verify_final(session, sig, func);
1061
+ common_verify_final(self, session, sig, func);
1063
1062
  return Qtrue;
1064
1063
  }
1065
1064
 
@@ -1068,7 +1067,7 @@ pkcs11_C_VerifyRecoverInit(VALUE self, VALUE session, VALUE mechanism, VALUE key
1068
1067
  {
1069
1068
  CK_C_VerifyRecoverInit func;
1070
1069
  GetFunction(self, C_VerifyRecoverInit, func);
1071
- common_init(session, mechanism, key, func);
1070
+ common_init(self, session, mechanism, key, func);
1072
1071
  return self;
1073
1072
  }
1074
1073
 
@@ -1077,13 +1076,13 @@ pkcs11_C_VerifyRecover(VALUE self, VALUE session, VALUE sig, VALUE size)
1077
1076
  {
1078
1077
  CK_C_VerifyRecover func;
1079
1078
  GetFunction(self, C_VerifyRecover, func);
1080
- common_verify_recover(session, sig, size, func);
1079
+ common_verify_recover(self, session, sig, size, func);
1081
1080
  return Qtrue;
1082
1081
  }
1083
1082
 
1084
- #define common_digest(s, d, sz, f) common_crypt(s, d, sz, f)
1085
- #define common_digest_update(s, d, f) common_sign_update(s, d, f)
1086
- #define common_digest_final(s, sz, f) common_crypt_final(s, sz, f)
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)
1087
1086
 
1088
1087
  VALUE
1089
1088
  pkcs11_C_DigestInit(VALUE self, VALUE session, VALUE mechanism)
@@ -1097,7 +1096,7 @@ pkcs11_C_DigestInit(VALUE self, VALUE session, VALUE mechanism)
1097
1096
  rb_raise(rb_eArgError, "2nd arg must be a PKCS11::CK_MECHANISM");
1098
1097
  m = DATA_PTR(mechanism);
1099
1098
  CallFunction(C_DigestInit, func, rv, NUM2HANDLE(session), m);
1100
- if(rv != CKR_OK) pkcs11_raise(rv);
1099
+ if(rv != CKR_OK) pkcs11_raise(self,rv);
1101
1100
 
1102
1101
  return self;
1103
1102
  }
@@ -1107,7 +1106,7 @@ pkcs11_C_Digest(VALUE self, VALUE session, VALUE data, VALUE size)
1107
1106
  {
1108
1107
  CK_C_Digest func;
1109
1108
  GetFunction(self, C_Digest, func);
1110
- return common_digest(session, data, size, func);
1109
+ return common_digest(self, session, data, size, func);
1111
1110
  }
1112
1111
 
1113
1112
  VALUE
@@ -1115,7 +1114,7 @@ pkcs11_C_DigestUpdate(VALUE self, VALUE session, VALUE data)
1115
1114
  {
1116
1115
  CK_C_DigestUpdate func;
1117
1116
  GetFunction(self, C_DigestUpdate, func);
1118
- common_digest_update(session, data, func);
1117
+ common_digest_update(self, session, data, func);
1119
1118
  return self;
1120
1119
  }
1121
1120
 
@@ -1127,7 +1126,7 @@ pkcs11_C_DigestKey(VALUE self, VALUE session, VALUE handle)
1127
1126
 
1128
1127
  GetFunction(self, C_DigestKey, func);
1129
1128
  CallFunction(C_DigestKey, func, rv, NUM2HANDLE(session), NUM2HANDLE(handle));
1130
- if(rv != CKR_OK) pkcs11_raise(rv);
1129
+ if(rv != CKR_OK) pkcs11_raise(self,rv);
1131
1130
 
1132
1131
  return self;
1133
1132
  }
@@ -1137,7 +1136,7 @@ pkcs11_C_DigestFinal(VALUE self, VALUE session, VALUE size)
1137
1136
  {
1138
1137
  CK_C_DigestFinal func;
1139
1138
  GetFunction(self, C_DigestFinal, func);
1140
- return common_digest_final(session, size, func);
1139
+ return common_digest_final(self, session, size, func);
1141
1140
  }
1142
1141
 
1143
1142
  VALUE
@@ -1145,7 +1144,7 @@ pkcs11_C_DigestEncryptUpdate(VALUE self, VALUE session, VALUE data, VALUE size)
1145
1144
  {
1146
1145
  CK_C_DigestEncryptUpdate func;
1147
1146
  GetFunction(self, C_DigestEncryptUpdate, func);
1148
- return common_crypt_update(session, data, size, func);
1147
+ return common_crypt_update(self, session, data, size, func);
1149
1148
  }
1150
1149
 
1151
1150
  VALUE
@@ -1153,7 +1152,7 @@ pkcs11_C_DecryptDigestUpdate(VALUE self, VALUE session, VALUE data, VALUE size)
1153
1152
  {
1154
1153
  CK_C_DecryptDigestUpdate func;
1155
1154
  GetFunction(self, C_DecryptDigestUpdate, func);
1156
- return common_crypt_update(session, data, size, func);
1155
+ return common_crypt_update(self, session, data, size, func);
1157
1156
  }
1158
1157
 
1159
1158
  VALUE
@@ -1161,7 +1160,7 @@ pkcs11_C_SignEncryptUpdate(VALUE self, VALUE session, VALUE data, VALUE size)
1161
1160
  {
1162
1161
  CK_C_SignEncryptUpdate func;
1163
1162
  GetFunction(self, C_SignEncryptUpdate, func);
1164
- return common_crypt_update(session, data, size, func);
1163
+ return common_crypt_update(self, session, data, size, func);
1165
1164
  }
1166
1165
 
1167
1166
  VALUE
@@ -1169,7 +1168,7 @@ pkcs11_C_DecryptVerifyUpdate(VALUE self, VALUE session, VALUE data, VALUE size)
1169
1168
  {
1170
1169
  CK_C_DecryptVerifyUpdate func;
1171
1170
  GetFunction(self, C_DecryptVerifyUpdate, func);
1172
- return common_crypt_update(session, data, size, func);
1171
+ return common_crypt_update(self, session, data, size, func);
1173
1172
  }
1174
1173
 
1175
1174
  VALUE
@@ -1187,7 +1186,7 @@ pkcs11_C_GenerateKey(VALUE self, VALUE session, VALUE mechanism, VALUE template)
1187
1186
  tmp = pkcs11_attr_ary2buf(template);
1188
1187
  CallFunction(C_GenerateKey, func, rv, NUM2HANDLE(session), m, tmp, RARRAY_LEN(template), &handle);
1189
1188
  free(tmp);
1190
- if(rv != CKR_OK) pkcs11_raise(rv);
1189
+ if(rv != CKR_OK) pkcs11_raise(self,rv);
1191
1190
 
1192
1191
  return HANDLE2NUM(handle);
1193
1192
  }
@@ -1215,7 +1214,7 @@ pkcs11_C_GenerateKeyPair(VALUE self, VALUE session, VALUE mechanism, VALUE pubke
1215
1214
  &pubkey_handle, &privkey_handle);
1216
1215
  free(pubkey_tmp);
1217
1216
  free(privkey_tmp);
1218
- if(rv != CKR_OK) pkcs11_raise(rv);
1217
+ if(rv != CKR_OK) pkcs11_raise(self,rv);
1219
1218
  ary = rb_ary_new();
1220
1219
  rb_ary_push(ary, HANDLE2NUM(pubkey_handle));
1221
1220
  rb_ary_push(ary, HANDLE2NUM(privkey_handle));
@@ -1240,7 +1239,7 @@ pkcs11_C_WrapKey(VALUE self, VALUE session, VALUE mechanism, VALUE wrapping, VAL
1240
1239
  CallFunction(C_WrapKey, func, rv, NUM2HANDLE(session), m,
1241
1240
  NUM2HANDLE(wrapping), NUM2HANDLE(wrapped),
1242
1241
  (CK_BYTE_PTR)NULL_PTR, &sz);
1243
- if(rv != CKR_OK) pkcs11_raise(rv);
1242
+ if(rv != CKR_OK) pkcs11_raise(self,rv);
1244
1243
  }else{
1245
1244
  sz = NUM2ULONG(size);
1246
1245
  }
@@ -1249,7 +1248,7 @@ pkcs11_C_WrapKey(VALUE self, VALUE session, VALUE mechanism, VALUE wrapping, VAL
1249
1248
  CallFunction(C_WrapKey, func, rv, NUM2HANDLE(session), m,
1250
1249
  NUM2HANDLE(wrapping), NUM2HANDLE(wrapped),
1251
1250
  (CK_BYTE_PTR)RSTRING_PTR(buf), &sz);
1252
- if(rv != CKR_OK) pkcs11_raise(rv);
1251
+ if(rv != CKR_OK) pkcs11_raise(self,rv);
1253
1252
  rb_str_set_len(buf, sz);
1254
1253
 
1255
1254
  return buf;
@@ -1273,7 +1272,7 @@ pkcs11_C_UnwrapKey(VALUE self, VALUE session, VALUE mechanism, VALUE wrapping, V
1273
1272
  (CK_BYTE_PTR)RSTRING_PTR(wrapped), RSTRING_LEN(wrapped),
1274
1273
  tmp, RARRAY_LEN(template), &h);
1275
1274
  free(tmp);
1276
- if(rv != CKR_OK) pkcs11_raise(rv);
1275
+ if(rv != CKR_OK) pkcs11_raise(self,rv);
1277
1276
 
1278
1277
  return HANDLE2NUM(h);
1279
1278
  }
@@ -1295,11 +1294,43 @@ pkcs11_C_DeriveKey(VALUE self, VALUE session, VALUE mechanism, VALUE base, VALUE
1295
1294
  CallFunction(C_DeriveKey, func, rv, NUM2HANDLE(session), m, NUM2HANDLE(base),
1296
1295
  tmp, RARRAY_LEN(template), &h);
1297
1296
  free(tmp);
1298
- if(rv != CKR_OK) pkcs11_raise(rv);
1297
+ if(rv != CKR_OK) pkcs11_raise(self,rv);
1299
1298
 
1300
1299
  return HANDLE2NUM(h);
1301
1300
  }
1302
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
+
1303
1334
  ///////////////////////////////////////
1304
1335
 
1305
1336
  static void
@@ -1614,6 +1645,8 @@ Init_pkcs11_ext()
1614
1645
  PKCS11_DEFINE_METHOD(C_WaitForSlotEvent, 1);
1615
1646
  PKCS11_DEFINE_METHOD(C_Finalize, 0);
1616
1647
  PKCS11_DEFINE_METHOD(unload_library, 0);
1648
+ PKCS11_DEFINE_METHOD(vendor_raise_on_return_value, 1);
1649
+ PKCS11_DEFINE_METHOD(vendor_class_CK_ATTRIBUTE, 0);
1617
1650
 
1618
1651
  ///////////////////////////////////////
1619
1652