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.
- 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
|
|