pkcs11_luna 0.2.7

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.
@@ -0,0 +1,112 @@
1
+ require "minitest/autorun"
2
+ require "pkcs11_luna"
3
+ require "test/luna_helper"
4
+
5
+ class TestPkcs11Luna < Minitest::Test
6
+ include PKCS11
7
+
8
+ RUBY = File.join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby_install_name'])
9
+ FILE = File.dirname(__FILE__)
10
+
11
+ @slot = LunaHelper.get_slot_password()
12
+
13
+ def get_password
14
+ STDIN.echo = false
15
+ while ((c = STDIN.getch) != '\n')
16
+ print c
17
+ end
18
+ STDIN.echo = true
19
+ end
20
+
21
+ def setup
22
+ @pk = Luna::Library.new
23
+ @slot, @password = LunaHelper.get_slot_password()
24
+ end
25
+
26
+ def teardown
27
+ @pk.close
28
+ end
29
+
30
+ =begin
31
+ def test_slots_are_luna
32
+ pkcs11 = @pk
33
+ pkcs11.slots.each do |slot|
34
+ assert_equal(slot.class.to_s, "PKCS11::Luna::Slot")
35
+ end
36
+ end
37
+
38
+
39
+ MAJOR = 10
40
+ MINOR = 10
41
+ def test_application_id
42
+ pkcs11 = @pk
43
+ pkcs11.set_application_id(MAJOR, MINOR)
44
+ slot = Luna::Slot.new(pkcs11, @slot)
45
+ begin
46
+ slot.open_application_id(MAJOR, MINOR)
47
+ rescue CKR_DATA_INVALID
48
+ slot.close_application_id(MAJOR, MINOR)
49
+ end
50
+ session = slot.open(CKF_RW_SESSION | CKF_SERIAL_SESSION)
51
+ session.login(:USER, @password)
52
+ file = File.join(FILE, 'app_id_helper.rb')
53
+ cmd = "#{RUBY} #{file} #{@slot}"
54
+ IO.popen(cmd, 'r') do |p|
55
+ p.read
56
+ end
57
+ assert $?.success?, "The subprocess did not return successfully."
58
+
59
+
60
+ session.logout
61
+ session.close
62
+ slot.close_application_id(MAJOR, MINOR)
63
+ end
64
+ =end
65
+
66
+ def test_mechanisms_list
67
+ pkcs11 = @pk
68
+ slot = Slot.new(pkcs11, @slot)
69
+ mechanisms = slot.mechanisms
70
+ mechanisms.each do |mech_id|
71
+ assert(Luna::MECHANISMS.key?(mech_id))
72
+ end
73
+ end
74
+
75
+ def test_init_token
76
+ pkcs11 = @pk
77
+ slot = Slot.new(pkcs11, @slot)
78
+
79
+ assert_raises(Luna::CKR_OPERATION_NOT_ALLOWED, CKR_USER_TYPE_INVALID) {
80
+ slot.init_token("anypin", "new_label")
81
+ }
82
+ end
83
+
84
+ def test_init_pin
85
+ pkcs11 = @pk
86
+ slot = Slot.new(pkcs11, @slot)
87
+ session = slot.open(CKF_RW_SESSION | CKF_SERIAL_SESSION)
88
+ session.login(:USER, @password)
89
+ assert_raises(Luna::CKR_OPERATION_NOT_ALLOWED, CKR_FUNCTION_NOT_SUPPORTED) {
90
+ session.init_pin("anypin")
91
+ }
92
+ session.logout
93
+ session.close
94
+ end
95
+
96
+ def test_set_pin
97
+ pkcs11 = @pk
98
+ slot = Slot.new(pkcs11, @slot)
99
+ session = slot.open(CKF_RW_SESSION | CKF_SERIAL_SESSION)
100
+ session.login(:USER, @password)
101
+ session.set_pin(@password, @password)
102
+ session.logout
103
+ session.close
104
+ end
105
+
106
+ def test_wait_for_slot_event
107
+ assert_raises(Luna::CKR_OPERATION_NOT_ALLOWED, CKR_FUNCTION_NOT_SUPPORTED) {
108
+ @pk.wait_for_slot_event
109
+ }
110
+ end
111
+
112
+ end
@@ -0,0 +1,260 @@
1
+ require "minitest/autorun"
2
+ require "pkcs11_luna"
3
+ require "test/luna_helper"
4
+
5
+ class TestPkcs11LunaCrypt < Minitest::Test
6
+ include PKCS11
7
+
8
+ def setup
9
+ @pk = Luna::Library.new
10
+ slot_id, password = LunaHelper.get_slot_password()
11
+ @slot = Slot.new(@pk, slot_id)
12
+ @session = @slot.open(PKCS11::CKF_RW_SESSION | PKCS11::CKF_SERIAL_SESSION)
13
+ @session.login(:USER, password)
14
+ end
15
+
16
+ def teardown
17
+ @session.logout
18
+ @session.close
19
+ @pk.close
20
+ end
21
+
22
+ def destroy_object(session, label)
23
+ session.find_objects(:LABEL=>label) do |obj|
24
+ obj.destroy
25
+ end
26
+ end
27
+
28
+
29
+ def test_ec_pair_gen_derive_aes
30
+ pub_label = "EC Public Key"
31
+ priv_label = "EC Private Key"
32
+ derived_label = "EC Derived Key "
33
+ destroy_object(@session, pub_label)
34
+ destroy_object(@session, priv_label)
35
+ destroy_object(@session, derived_label + '1')
36
+ destroy_object(@session, derived_label + '2')
37
+
38
+ #DER encoding of OID 1.3.132.0.10 secp256k1
39
+ curve_oid_der = [0x06, 0x05, 0x2B, 0x81, 0x04, 0x00, 0x0A].pack("C*")
40
+
41
+ attributes_public = {:TOKEN=>true, :ENCRYPT=>true, :VERIFY=>true, :WRAP=>true,
42
+ :EC_PARAMS=>curve_oid_der, :LABEL=>pub_label}
43
+ attributes_private = {:TOKEN=>true, :DECRYPT=>true, :SIGN=>true,
44
+ :DERIVE=>true, :UNWRAP=>true, :SENSITIVE=>true, :LABEL=>priv_label}
45
+
46
+ pub_key1, priv_key1 = @session.generate_key_pair(:EC_KEY_PAIR_GEN, attributes_public, attributes_private)
47
+ pub_key2, priv_key2 = @session.generate_key_pair(:EC_KEY_PAIR_GEN, attributes_public, attributes_private)
48
+
49
+ shared_data = "SHARED DATA"
50
+
51
+ ec_point1 = pub_key1.attributes(:EC_POINT)[0].value
52
+ ec_point2 = pub_key2.attributes(:EC_POINT)[0].value
53
+ mechanism = {:ECDH1_DERIVE=>{:kdf=>Luna::CKD_SHA512_KDF, :pSharedData=>shared_data}}
54
+
55
+ derive_attributes = {:CLASS=>CKO_SECRET_KEY, :KEY_TYPE=>CKK_AES, :TOKEN=>true, :SENSITIVE=>true, :PRIVATE=>true,
56
+ :ENCRYPT=>true, :DECRYPT=>true, :SIGN=>true, :VERIFY=>true, :VALUE_LEN=>32, :LABEL=>derived_label+'1'}
57
+
58
+ assert_raises(Luna::CKR_ECC_POINT_INVALID) do
59
+ @session.derive_key(mechanism, priv_key1, derive_attributes)
60
+ end
61
+
62
+ mechanism[:ECDH1_DERIVE][:pPublicData] = ec_point2
63
+ derived_key1 = @session.derive_key(mechanism, priv_key1, derive_attributes)
64
+ mechanism[:ECDH1_DERIVE][:pPublicData] = ec_point1
65
+ derive_attributes[:LABEL] = derived_label + '2'
66
+ derived_key2 = @session.derive_key(mechanism, priv_key2, derive_attributes)
67
+
68
+ iv = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16].pack('C*')
69
+ message = "Text to encrypt"
70
+ cipher_text = @session.encrypt({:AES_CBC_PAD=>iv}, derived_key1, message)
71
+ decrypted = @session.decrypt({:AES_CBC_PAD=>iv}, derived_key2, cipher_text)
72
+ assert_equal(decrypted, message)
73
+ end
74
+
75
+ def test_encrypt_decrypt_aes
76
+ label = "Test AES Key"
77
+ destroy_object(@session, label)
78
+ key = @session.generate_key(:AES_KEY_GEN,
79
+ :CLASS=>CKO_SECRET_KEY, :ENCRYPT=>true, :DECRYPT=>true, :SENSITIVE=>true,
80
+ :TOKEN=>true, :VALUE_LEN=>32, :LABEL=>label)
81
+
82
+ assert key[Luna::CKA_FINGERPRINT_SHA256].size == 32
83
+
84
+ message = "Text to encrypt"
85
+ iv = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16].pack('C*')
86
+ cipher_text = @session.encrypt({:AES_CBC_PAD=>iv}, key, message)
87
+ decrypted_text = @session.decrypt({:AES_CBC_PAD=>iv}, key, cipher_text)
88
+ assert_equal(message, decrypted_text)
89
+ end
90
+
91
+ def test_generate_rsa_key_pair
92
+ pub_label = "Test RSA public key"
93
+ priv_label = "Test RSA private key"
94
+ destroy_object(@session, pub_label)
95
+ destroy_object(@session, priv_label)
96
+
97
+ pub_attr = {:ENCRYPT=>true, :VERIFY=>true,
98
+ :MODULUS_BITS=>2048, :TOKEN=>true, :WRAP=>true, :LABEL=>pub_label}
99
+ priv_attr = {:DECRYPT=>true, :SIGN=>true, :SENSITIVE=>true, :PRIVATE=>true,
100
+ :TOKEN=>true, :UNWRAP=>true, :LABEL=>priv_label}
101
+
102
+ pub_key, priv_key = @session.generate_key_pair(:RSA_FIPS_186_3_AUX_PRIME_KEY_PAIR_GEN, pub_attr, priv_attr)
103
+ end
104
+
105
+ def test_encrypt_decrypt_rsa
106
+ pub_key, priv_key = test_generate_rsa_key_pair
107
+ message = "Text to encrypt using RSA keys"
108
+ encrypted = @session.encrypt(:RSA_PKCS, pub_key, message)
109
+ decrypted = @session.decrypt(:RSA_PKCS, priv_key, encrypted)
110
+ assert_equal(message, decrypted)
111
+ end
112
+
113
+ def test_sign_verify_rsa
114
+ pub_key, priv_key = test_generate_rsa_key_pair
115
+ data = "Text to sign/verify using RSA keys"
116
+ signature = @session.sign(:SHA512_RSA_PKCS, priv_key, data)
117
+ @session.verify(:SHA512_RSA_PKCS, pub_key, signature, data)
118
+ end
119
+
120
+ def generate_aes_key(label)
121
+ label = "Ruby AES Key"
122
+ destroy_object(@session, label)
123
+ key = @session.generate_key(:AES_KEY_GEN,
124
+ :CLASS=>CKO_SECRET_KEY, :ENCRYPT=>true, :DECRYPT=>true, :SENSITIVE=>true,
125
+ :TOKEN=>true, :EXTRACTABLE=>true, :VALUE_LEN=>32, :LABEL=>label)
126
+
127
+ return key
128
+ end
129
+
130
+ def test_wrap_unwrap
131
+ pub_key, priv_key = test_generate_rsa_key_pair
132
+
133
+ aes_key = generate_aes_key("Wrapped AES Key")
134
+
135
+ wrapped = @session.wrap_key(:RSA_PKCS, pub_key, aes_key)
136
+
137
+ label = "Unwrapped AES Key"
138
+ destroy_object(@session, label)
139
+
140
+ attributes = {:CLASS=>CKO_SECRET_KEY, :KEY_TYPE=>CKK_AES, :ENCRYPT=>true, :DECRYPT=>true, :SENSITIVE=>true,
141
+ :TOKEN=>true, :VALUE_LEN=>32, :LABEL=>label}
142
+
143
+ unwrapped_key = @session.unwrap_key(:RSA_PKCS, priv_key, wrapped, attributes)
144
+
145
+ message = "Encrypt/Decrypt with a wrapped and unwrapped key"
146
+ iv = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16].pack('C*')
147
+ cipher_text = @session.encrypt({:AES_CBC_PAD=>iv}, aes_key, message)
148
+ decrypted_text = @session.decrypt({:AES_CBC_PAD=>iv}, unwrapped_key, cipher_text)
149
+ assert_equal(message, decrypted_text)
150
+ end
151
+
152
+ def test_digest
153
+ data = "Data to digest."
154
+ digest = @session.digest(:SHA512, data)
155
+ hex = digest.bytes.map { |b| sprintf("%02X",b) }.join
156
+ assert_equal(hex, "B22A958E549B113FEC7FE2FBDE766A88D44E34FA47F3EED9DCBA9294AC46DA0CB2511F38943D1F1A533EB25C177F0FC38F2EFC87215D9043F67A103E849A2605")
157
+ end
158
+
159
+ def test_des3_cmac_general
160
+ label = "DES Key"
161
+ destroy_object(@session, label)
162
+ des_key = @session.generate_key(:DES3_KEY_GEN,
163
+ :CLASS=>CKO_SECRET_KEY, :SIGN=>true, :VERIFY=>true, :ENCRYPT=>true, :DECRYPT=>true, :SENSITIVE=>true,
164
+ :TOKEN=>true, :EXTRACTABLE=>true, :LABEL=>label)
165
+
166
+ data = "Data to be signed."
167
+ signature = @session.sign({:DES3_CMAC_GENERAL=>8}, des_key, data)
168
+ @session.verify({:DES3_CMAC_GENERAL=>8}, des_key, signature, data)
169
+ end
170
+
171
+ def get_data
172
+ plaintext = ""
173
+ (0..10000).each do |i|
174
+ plaintext << (i%26+65).chr
175
+ end
176
+ plaintext
177
+ end
178
+
179
+ def test_encrypt_decrypt_multipart
180
+ key = generate_aes_key("Ruby AES Key")
181
+
182
+ iv = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16].pack('C*')
183
+ mechanism = {:AES_CBC_PAD=>iv}
184
+
185
+ chunk_size = 1024
186
+ plaintext = get_data
187
+
188
+ encrypted = ""
189
+ index = 0
190
+ encrypted << @session.encrypt(mechanism, key) do |cipher|
191
+ while index < plaintext.size
192
+ s = plaintext.slice(index, chunk_size)
193
+ encrypted << cipher.update(s)
194
+ index += chunk_size
195
+ end
196
+ end
197
+
198
+ decrypted = ""
199
+ index = 0
200
+ decrypted << @session.decrypt(mechanism, key) do |cipher|
201
+ while index < encrypted.size
202
+ s = encrypted.slice(index, chunk_size)
203
+ decrypted << cipher.update(s)
204
+ index += chunk_size
205
+ end
206
+ end
207
+ assert plaintext == decrypted
208
+ end
209
+
210
+ def test_sign_verify
211
+ pub_key, priv_key = test_generate_rsa_key_pair
212
+
213
+ plaintext = get_data
214
+
215
+ signature = @session.sign(:SHA512_RSA_PKCS, priv_key) {|c|
216
+ index = 0
217
+ while index < plaintext.size
218
+ c.update(plaintext.slice(index, 256))
219
+ index += 256
220
+ end
221
+ }
222
+
223
+ @session.verify(:SHA512_RSA_PKCS, pub_key, signature) {|c|
224
+ index = 0
225
+ while index < plaintext.size
226
+ c.update(plaintext.slice(index, 256))
227
+ index += 256
228
+ end
229
+ }
230
+ end
231
+
232
+ def test_digest_encrypt_decrypt_update
233
+ assert_raises(CKR_FUNCTION_NOT_SUPPORTED) {
234
+ @session.C_DigestEncryptUpdate("Not supported")
235
+ }
236
+ assert_raises(CKR_FUNCTION_NOT_SUPPORTED) {
237
+ @session.C_DecryptDigestUpdate("Not supported")
238
+ }
239
+ end
240
+
241
+ def test_verify_recover
242
+ pub_key, priv_key = test_generate_rsa_key_pair
243
+ assert_raises(CKR_FUNCTION_NOT_SUPPORTED) {
244
+ @session.C_VerifyRecoverInit(:SHA512_RSA_PKCS, pub_key)
245
+ }
246
+ assert_raises(CKR_FUNCTION_NOT_SUPPORTED) {
247
+ @session.C_VerifyRecover("Not supported")
248
+ }
249
+ end
250
+
251
+ def test_sign_verify_encrypt_decrypt_update
252
+ assert_raises(CKR_FUNCTION_NOT_SUPPORTED) {
253
+ @session.C_SignEncryptUpdate("Not supported")
254
+ }
255
+ assert_raises(CKR_FUNCTION_NOT_SUPPORTED) {
256
+ @session.C_DecryptVerifyUpdate("Not supported")
257
+ }
258
+ end
259
+
260
+ end
data.tar.gz.sig ADDED
Binary file
metadata ADDED
@@ -0,0 +1,173 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pkcs11_luna
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.7
5
+ platform: ruby
6
+ authors:
7
+ - SafeNet
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIDPDCCAiSgAwIBAgIBAzANBgkqhkiG9w0BAQUFADBEMQ0wCwYDVQQDDARsYXJz
14
+ MR8wHQYKCZImiZPyLGQBGRYPZ3JlaXotcmVpbnNkb3JmMRIwEAYKCZImiZPyLGQB
15
+ GRYCZGUwHhcNMTcwNDA0MTgyNDE1WhcNMTgwNDA0MTgyNDE1WjBEMQ0wCwYDVQQD
16
+ DARsYXJzMR8wHQYKCZImiZPyLGQBGRYPZ3JlaXotcmVpbnNkb3JmMRIwEAYKCZIm
17
+ iZPyLGQBGRYCZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZb4Uv
18
+ RFJfRu/VEWiy3psh2jinETjiuBrL0NeRFGf8H7iU9+gx/DI/FFhfHGLrDeIskrJx
19
+ YIWDMmEjVO10UUdj7wu4ZhmU++0Cd7Kq9/TyP/shIP3IjqHjVLCnJ3P6f1cl5rxZ
20
+ gqo+d3BAoDrmPk0rtaf6QopwUw9RBiF8V4HqvpiY+ruJotP5UQDP4/lVOKvA8PI9
21
+ P0GmVbFBrbc7Zt5h78N3UyOK0u+nvOC23BvyHXzCtcFsXCoEkt+Wwh0RFqVZdnjM
22
+ LMO2vULHKKHDdX54K/sbVCj9pN9h1aotNzrEyo55zxn0G9PHg/G3P8nMvAXPkUTe
23
+ brhXrfCwWRvOXA4TAgMBAAGjOTA3MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0G
24
+ A1UdDgQWBBRAHK81igrXodaDj8a8/BIKsaZrETANBgkqhkiG9w0BAQUFAAOCAQEA
25
+ Wbp+grpaqUH+RiXNXmi/5xBfvSYLbxWj+DZpCSnQW+DMfx46RVVko3b7BtKDs2zs
26
+ EtKM6r6s7VbllPgcYUzaP92uzPqCw8FncvqG0+B+Nd4C2jKzPxAQyzYXv/3bQhv1
27
+ sXAzEqLQqKx5V63eBDh1TPvPTEMfJwmjcdcbvMwFSt5EcUkT63W13ZJXX23JYp1K
28
+ KRW+N1WIYz8RSBNaQIP2v5Inb9vUA+jPUOcdyLHoi205lyZ28hE4lcnh9Zs02aHs
29
+ Ao8FZozVJz8xVEuYNJsL2k70w0FiwXwoWyvKyekgPBvYNUj4JGDMtBBayJTOpDs7
30
+ 3EVmCm5IRuqZ1UcDFouQ9w==
31
+ -----END CERTIFICATE-----
32
+ date: 2018-01-05 00:00:00.000000000 Z
33
+ dependencies:
34
+ - !ruby/object:Gem::Dependency
35
+ name: pkcs11
36
+ requirement: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 0.2.7
41
+ type: :runtime
42
+ prerelease: false
43
+ version_requirements: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '='
46
+ - !ruby/object:Gem::Version
47
+ version: 0.2.7
48
+ - !ruby/object:Gem::Dependency
49
+ name: yard
50
+ requirement: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0.6'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0.6'
62
+ - !ruby/object:Gem::Dependency
63
+ name: rake-compiler
64
+ requirement: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0.7'
69
+ type: :development
70
+ prerelease: false
71
+ version_requirements: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0.7'
76
+ - !ruby/object:Gem::Dependency
77
+ name: rdoc
78
+ requirement: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '4.0'
83
+ type: :development
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '4.0'
90
+ - !ruby/object:Gem::Dependency
91
+ name: hoe
92
+ requirement: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.16'
97
+ type: :development
98
+ prerelease: false
99
+ version_requirements: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '3.16'
104
+ description: This module allows Ruby programs to use vendor extensions for SafeNet
105
+ Luna.
106
+ email:
107
+ - support@safenet-inc.com
108
+ executables: []
109
+ extensions:
110
+ - ext/extconf.rb
111
+ extra_rdoc_files:
112
+ - Manifest.txt
113
+ - README_LUNA.rdoc
114
+ - ext/pk11l.c
115
+ files:
116
+ - ".gemtest"
117
+ - ".yardopts"
118
+ - Manifest.txt
119
+ - README_LUNA.rdoc
120
+ - Rakefile
121
+ - examples/config.rb
122
+ - examples/derive_aes_ecdh_key.rb
123
+ - examples/encrypt_decrypt_aes.rb
124
+ - examples/encrypt_decrypt_rsa.rb
125
+ - examples/mechanism_list.rb
126
+ - examples/multithread.rb
127
+ - examples/objects_list.rb
128
+ - examples/sign_verify.rb
129
+ - examples/slot_info.rb
130
+ - ext/extconf.rb
131
+ - ext/generate_constants.rb
132
+ - ext/generate_structs.rb
133
+ - ext/pk11_const_macros.h
134
+ - ext/pk11_struct_macros.h
135
+ - ext/pk11_version.h
136
+ - ext/pk11l.c
137
+ - ext/pk11l_const_def.inc
138
+ - ext/pk11l_struct.doc
139
+ - ext/pk11l_struct_def.inc
140
+ - ext/pk11l_struct_impl.inc
141
+ - lib/pkcs11_luna.rb
142
+ - lib/pkcs11_luna/extensions.rb
143
+ - test/app_id_helper.rb
144
+ - test/luna_helper.rb
145
+ - test/test_pkcs11_luna.rb
146
+ - test/test_pkcs11_luna_crypt.rb
147
+ homepage: http://github.com/larskanis/pkcs11
148
+ licenses:
149
+ - MIT
150
+ metadata: {}
151
+ post_install_message:
152
+ rdoc_options:
153
+ - "--main"
154
+ - README_LUNA.rdoc
155
+ require_paths:
156
+ - lib
157
+ required_ruby_version: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - ">="
160
+ - !ruby/object:Gem::Version
161
+ version: '0'
162
+ required_rubygems_version: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ requirements: []
168
+ rubyforge_project:
169
+ rubygems_version: 2.7.3
170
+ signing_key:
171
+ specification_version: 4
172
+ summary: SafeNet-Luna extensions for PKCS#11-Ruby
173
+ test_files: []
metadata.gz.sig ADDED
@@ -0,0 +1 @@
1
+ ��V�5��J�d�0UH%�A!�yNQ��m�)�Vy�U2�Z�[.�l5��Iq��#“��� ���4�/6m��E�UD4��H����!���5�(�0\G&���43o �����Jmx�#m�R���d�n5ב�k�J; F6��7�� VR��e �^�Ʋ���"![��P�|.�K�'��x ��*O�{깡묹.���)X�Q�@�X�T�@,8?�7\?� � ����$����DɎf�� \�ĶF�g�E�