pkcs11 0.2.1-x86-mingw32 → 0.2.2-x86-mingw32
Sign up to get free protection for your applications and to get access to all the features.
- data/.gemtest +0 -0
- data/History.txt +10 -0
- data/Manifest.txt +16 -2
- data/README.rdoc +24 -7
- data/Rakefile +29 -18
- data/ext/generate_structs.rb +28 -16
- data/ext/pk11.c +132 -99
- data/ext/pk11.h +3 -3
- data/ext/pk11_const_macros.h +4 -3
- data/ext/pk11_struct.doc +792 -0
- data/ext/pk11_struct_impl.inc +2 -2
- data/ext/pk11_struct_macros.h +14 -2
- data/ext/pk11_version.h +6 -0
- data/lib/1.8/pkcs11_ext.so +0 -0
- data/lib/1.9/pkcs11_ext.so +0 -0
- data/lib/pkcs11/helper.rb +7 -7
- data/lib/pkcs11/library.rb +28 -4
- data/lib/pkcs11/object.rb +29 -18
- data/pkcs11_protect_server/Manifest.txt +14 -0
- data/test/helper.rb +17 -9
- data/test/test_pkcs11.rb +4 -4
- data/test/test_pkcs11_object.rb +22 -8
- data/test/test_pkcs11_thread.rb +0 -1
- metadata +31 -32
- data/sample/firefox_certs.rb +0 -90
- data/sample/nssckbi.rb +0 -51
data/.gemtest
ADDED
File without changes
|
data/History.txt
CHANGED
@@ -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
|
data/Manifest.txt
CHANGED
@@ -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
|
-
|
32
|
-
|
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
|
data/README.rdoc
CHANGED
@@ -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
|
-
|
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.
|
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-
|
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
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
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]
|
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.
|
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-
|
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 "#{
|
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 "#{
|
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 "#{
|
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."
|
data/ext/generate_structs.rb
CHANGED
@@ -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
|
-
|
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 #{
|
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.
|
92
|
-
if attr.name
|
93
|
-
|
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.
|
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
|
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',
|
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'
|
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 [#{
|
161
|
-
elsif
|
162
|
-
fd_impl.puts "PKCS11_IMPLEMENT_STRUCT_PTR_ACCESSOR(#{struct.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 [#{
|
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
|
170
|
-
fd_impl.puts "PKCS11_IMPLEMENT_PKCS11_STRUCT_PTR_ACCESSOR(#{struct.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::#{
|
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
|
-
|
47
|
-
|
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(
|
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
|
|