pkcs11 0.2.6 → 0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/.appveyor.yml +44 -0
- data/.gitignore +25 -0
- data/.travis.yml +5 -4
- data/Gemfile +4 -4
- data/History.txt +32 -0
- data/README.rdoc +11 -14
- data/Rakefile +11 -6
- data/ext/extconf.rb +0 -2
- data/ext/generate_constants.rb +2 -2
- data/ext/generate_structs.rb +21 -10
- data/ext/generate_thread_funcs.rb +0 -6
- data/ext/pk11.c +18 -23
- data/ext/pk11.h +2 -17
- data/ext/pk11_const.c +9 -8
- data/ext/pk11_const_macros.h +2 -1
- data/ext/pk11_struct.doc +90 -90
- data/ext/pk11_struct_impl.inc +90 -90
- data/ext/pk11_struct_macros.h +14 -13
- data/ext/pk11_thread_funcs.c +0 -2
- data/ext/pk11_thread_funcs.h +0 -2
- data/ext/pk11_version.h +1 -1
- data/lib/pkcs11/helper.rb +1 -3
- data/lib/pkcs11/library.rb +4 -0
- data/lib/pkcs11/object.rb +2 -2
- data/lib/pkcs11/session.rb +13 -13
- data/pkcs11_luna/Manifest.txt +11 -11
- data/pkcs11_luna/README_LUNA.rdoc +3 -3
- data/pkcs11_protect_server/Manifest.txt +2 -2
- data/pkcs11_protect_server/README_PROTECT_SERVER.rdoc +3 -3
- data/test/helper.rb +1 -1
- data/test/test_pkcs11.rb +1 -1
- data/test/test_pkcs11_crypt.rb +36 -30
- data/test/test_pkcs11_object.rb +14 -11
- data/test/test_pkcs11_session.rb +22 -22
- data/test/test_pkcs11_slot.rb +8 -8
- data/test/test_pkcs11_structs.rb +35 -9
- data/test/test_pkcs11_thread.rb +2 -2
- metadata +44 -16
- metadata.gz.sig +3 -0
- data/appveyor.yml +0 -38
data/test/test_pkcs11_session.rb
CHANGED
@@ -32,11 +32,11 @@ class TestPkcs11Session < Minitest::Test
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def test_find_objects
|
35
|
-
obj = session.find_objects(:
|
35
|
+
obj = session.find_objects(CLASS: CKO_CERTIFICATE)
|
36
36
|
assert obj.length>2, 'There should be some certificates in the test database'
|
37
37
|
assert_equal PKCS11::Object, obj.first.class, 'Retuned objects should be class Object'
|
38
38
|
|
39
|
-
session.find_objects(:
|
39
|
+
session.find_objects(CLASS: CKO_CERTIFICATE) do |obj2|
|
40
40
|
assert obj2[:SUBJECT], 'A certificate should have a subject'
|
41
41
|
assert OpenSSL::X509::Name.new(obj2[:SUBJECT]).to_s =~ /\/CN=/i, 'Every certificate should have a CN in the subject'
|
42
42
|
end
|
@@ -57,25 +57,25 @@ class TestPkcs11Session < Minitest::Test
|
|
57
57
|
end
|
58
58
|
|
59
59
|
def test_create_data_object
|
60
|
-
|
61
|
-
:
|
62
|
-
:
|
63
|
-
:
|
64
|
-
:
|
60
|
+
_obj = session.create_object(
|
61
|
+
CLASS: CKO_DATA,
|
62
|
+
TOKEN: false,
|
63
|
+
APPLICATION: 'My Application',
|
64
|
+
VALUE: 'value')
|
65
65
|
end
|
66
66
|
|
67
67
|
def test_create_certificate_object
|
68
|
-
obj1 = session.find_objects(:
|
68
|
+
obj1 = session.find_objects(CLASS: CKO_CERTIFICATE, ID: TestCert_ID).first
|
69
69
|
|
70
70
|
obj = session.create_object(
|
71
|
-
:
|
72
|
-
:
|
73
|
-
:
|
74
|
-
:
|
75
|
-
:
|
76
|
-
:
|
77
|
-
:
|
78
|
-
:
|
71
|
+
CLASS: CKO_CERTIFICATE,
|
72
|
+
SUBJECT: obj1[:SUBJECT],
|
73
|
+
TOKEN: false,
|
74
|
+
LABEL: 'test_create_object',
|
75
|
+
CERTIFICATE_TYPE: CKC_X_509,
|
76
|
+
ISSUER: obj1[:ISSUER],
|
77
|
+
VALUE: obj1[:VALUE],
|
78
|
+
SERIAL_NUMBER: '12345'
|
79
79
|
)
|
80
80
|
|
81
81
|
assert_equal '12345', obj[:SERIAL_NUMBER], 'Value as created'
|
@@ -85,12 +85,12 @@ class TestPkcs11Session < Minitest::Test
|
|
85
85
|
rsa = OpenSSL::PKey::RSA.generate(512)
|
86
86
|
|
87
87
|
obj = session.create_object(
|
88
|
-
:
|
89
|
-
:
|
90
|
-
:
|
91
|
-
:
|
92
|
-
:
|
93
|
-
:
|
88
|
+
CLASS: CKO_PUBLIC_KEY,
|
89
|
+
KEY_TYPE: CKK_RSA,
|
90
|
+
TOKEN: false,
|
91
|
+
MODULUS: rsa.n.to_s(2),
|
92
|
+
PUBLIC_EXPONENT: rsa.e.to_s(2),
|
93
|
+
LABEL: 'test_create_public_key_object')
|
94
94
|
|
95
95
|
assert_equal 'test_create_public_key_object', obj[:LABEL], 'Value as created'
|
96
96
|
end
|
data/test/test_pkcs11_slot.rb
CHANGED
@@ -26,13 +26,13 @@ class TestPkcs11Slot < Minitest::Test
|
|
26
26
|
|
27
27
|
assert sinfo.inspect =~ /manufacturerID=/, 'Slot info should tell about manufacturerID'
|
28
28
|
|
29
|
-
|
29
|
+
assert_kind_of Integer, sinfo.flags
|
30
30
|
assert sinfo.manufacturerID =~ /Mozilla/i, "It's the mozilla libaray we test against"
|
31
31
|
assert sinfo.slotDescription =~ /Private Key/i, "It's the slot with users private keys"
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
32
|
+
assert_kind_of Integer, sinfo.hardwareVersion.major, "Version should be a number"
|
33
|
+
assert_kind_of Integer, sinfo.hardwareVersion.minor, "Version should be a number"
|
34
|
+
assert_kind_of Integer, sinfo.firmwareVersion.major, "Version should be a number"
|
35
|
+
assert_kind_of Integer, sinfo.firmwareVersion.minor, "Version should be a number"
|
36
36
|
end
|
37
37
|
|
38
38
|
def test_token_info
|
@@ -44,14 +44,14 @@ class TestPkcs11Slot < Minitest::Test
|
|
44
44
|
assert_equal false, slot.mechanisms.empty?, 'There should be some mechanisms'
|
45
45
|
slot.mechanisms.each do |m|
|
46
46
|
info = slot.mechanism_info(m)
|
47
|
-
|
47
|
+
assert_kind_of CK_MECHANISM_INFO, info, 'Mechanism info should get a CK_MECHANISM_INFO'
|
48
48
|
assert info.inspect =~ /ulMaxKeySize=/, 'Mechanism info should tell about max key size'
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
52
52
|
def test_mechanism_info
|
53
53
|
info1 = slot.mechanism_info(:DES3_CBC)
|
54
|
-
|
54
|
+
assert_kind_of CK_MECHANISM_INFO, info1, 'Mechanism info should get a CK_MECHANISM_INFO'
|
55
55
|
assert info1.inspect =~ /ulMinKeySize=/, 'Mechanism info should tell about min key size'
|
56
56
|
|
57
57
|
info2 = slot.mechanism_info(CKM_DES3_CBC)
|
@@ -71,7 +71,7 @@ class TestPkcs11Slot < Minitest::Test
|
|
71
71
|
|
72
72
|
def test_session2
|
73
73
|
flags = CKF_SERIAL_SESSION #| CKF_RW_SESSION
|
74
|
-
|
74
|
+
_session = slot.open(flags)
|
75
75
|
slot.close_all_sessions
|
76
76
|
end
|
77
77
|
end
|
data/test/test_pkcs11_structs.rb
CHANGED
@@ -11,9 +11,10 @@ class TestPkcs11Structs < Minitest::Test
|
|
11
11
|
def teardown
|
12
12
|
end
|
13
13
|
|
14
|
-
def
|
14
|
+
def test_STRING_ACCESSOR_ASCII
|
15
15
|
s = CK_DATE.new
|
16
16
|
assert_equal "\0\0", s.day
|
17
|
+
assert_equal Encoding::ASCII, s.day.encoding
|
17
18
|
assert_equal "\0\0\0\0", s.year
|
18
19
|
s.day = "12345"
|
19
20
|
assert_equal "12", s.day
|
@@ -22,6 +23,20 @@ class TestPkcs11Structs < Minitest::Test
|
|
22
23
|
assert_raises(TypeError){ s.day = nil }
|
23
24
|
end
|
24
25
|
|
26
|
+
def test_STRING_ACCESSOR_UTF8
|
27
|
+
s = CK_INFO.new
|
28
|
+
s.manufacturerID = 'Müller'
|
29
|
+
assert_equal "Müller", s.manufacturerID.split("\0",2).first
|
30
|
+
assert_equal Encoding::UTF_8, s.manufacturerID.encoding
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_STRING_ACCESSOR_BINARY
|
34
|
+
s = CK_DES_CBC_ENCRYPT_DATA_PARAMS.new
|
35
|
+
s.iv = "somedata"
|
36
|
+
assert_equal "somedata", s.iv
|
37
|
+
assert_equal Encoding::BINARY, s.iv.encoding
|
38
|
+
end
|
39
|
+
|
25
40
|
def test_ULONG_ACCESSOR
|
26
41
|
s = CK_SSL3_KEY_MAT_PARAMS.new
|
27
42
|
assert_equal 0, s.ulIVSizeInBits
|
@@ -42,13 +57,24 @@ class TestPkcs11Structs < Minitest::Test
|
|
42
57
|
assert_raises(ArgumentError){ s.bIsExport = nil }
|
43
58
|
end
|
44
59
|
|
45
|
-
def
|
46
|
-
s =
|
47
|
-
assert_nil s.
|
48
|
-
s.
|
49
|
-
assert_equal "
|
50
|
-
s.
|
51
|
-
|
60
|
+
def test_STRING_PTR_ACCESSOR_UTF8
|
61
|
+
s = CK_PBE_PARAMS.new
|
62
|
+
assert_nil s.pPassword
|
63
|
+
s.pPassword = "secret"
|
64
|
+
assert_equal "secret", s.pPassword
|
65
|
+
assert_equal Encoding::UTF_8, s.pPassword.encoding
|
66
|
+
s.pPassword = nil
|
67
|
+
assert_nil s.pPassword
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_STRING_PTR_ACCESSOR_BINARY
|
71
|
+
s = CK_DES_CBC_ENCRYPT_DATA_PARAMS.new
|
72
|
+
assert_nil s.pData
|
73
|
+
s.pData = "some data"
|
74
|
+
assert_equal "some data", s.pData
|
75
|
+
assert_equal Encoding::BINARY, s.pData.encoding
|
76
|
+
s.pData = nil
|
77
|
+
assert_nil s.pData
|
52
78
|
end
|
53
79
|
|
54
80
|
def test_STRUCT_ACCESSOR
|
@@ -148,7 +174,7 @@ class TestPkcs11Structs < Minitest::Test
|
|
148
174
|
assert s.inspect =~ /year="2010"/, 'There should be a year in CK_DATE'
|
149
175
|
assert_equal ["year", "month", "day"], s.members, 'CK_DATE should contain some attributes'
|
150
176
|
assert_equal ["2010", "12", "31"], s.values, 'values of CK_DATE'
|
151
|
-
assert_equal( {:
|
177
|
+
assert_equal( {day: "31", month: "12", year: "2010"}, s.to_hash, 'CK_DATE as hash' )
|
152
178
|
end
|
153
179
|
|
154
180
|
def test_bignum_attribute
|
data/test/test_pkcs11_thread.rb
CHANGED
@@ -33,8 +33,8 @@ class TestPkcs11Thread < Minitest::Test
|
|
33
33
|
end
|
34
34
|
}
|
35
35
|
# This should take some seconds:
|
36
|
-
|
37
|
-
{:
|
36
|
+
_pub_key, _priv_key = session.generate_key_pair(:RSA_PKCS_KEY_PAIR_GEN,
|
37
|
+
{MODULUS_BITS: 2048, PUBLIC_EXPONENT: [65537].pack("N"), TOKEN: false},
|
38
38
|
{})
|
39
39
|
th.kill
|
40
40
|
assert_operator count, :>, 100000, "The second thread should count further concurrent to the key generation"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pkcs11
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryosuke Kutsuna
|
@@ -9,21 +9,42 @@ authors:
|
|
9
9
|
- Lars Kanis
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
|
-
cert_chain:
|
13
|
-
|
12
|
+
cert_chain:
|
13
|
+
- |
|
14
|
+
-----BEGIN CERTIFICATE-----
|
15
|
+
MIIDPDCCAiSgAwIBAgIBATANBgkqhkiG9w0BAQsFADAkMSIwIAYDVQQDDBl0cmF2
|
16
|
+
aXMtY2kvREM9ZHVtbXkvREM9b3JnMB4XDTIwMDQwODExMDA0MFoXDTIxMDQwODEx
|
17
|
+
MDA0MFowJDEiMCAGA1UEAwwZdHJhdmlzLWNpL0RDPWR1bW15L0RDPW9yZzCCASIw
|
18
|
+
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK+5uh+zqCXKho0zXIaLmJD6YDpa
|
19
|
+
l07nJ+PQFcMBYgsKA2ip01THj3DVYwP/va6hYgqPmxEJB3tsEthKnHVHm0dgqqg/
|
20
|
+
gfyDFU0ZfbSYKeNlZQRIdddKPc6dNbmtY2gBWFt6YOZnBccsgJmSUAbh0a9xhVbm
|
21
|
+
qAStn/q7eq9iW9+12AB9HM+QCWrsCAXEHGGNENDAK9HtHwBs4KsneiIQY5rd/Mzs
|
22
|
+
Ii25XXnDUa1NjC4u/mMuJXBpWLw2rEAQkzEFQBZR0W0ehm9Mi4TokhLy/QH8GRaH
|
23
|
+
0KADzpk1cxuOrEBIhy6ISQs7g/tI6YTePAmDMTsodov02FZCcMpoxOifpFkCAwEA
|
24
|
+
AaN5MHcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFOTn5ek+QtcI
|
25
|
+
g+ZglIvRPAPGoXvLMB4GA1UdEQQXMBWBE3RyYXZpcy1jaUBkdW1teS5vcmcwHgYD
|
26
|
+
VR0SBBcwFYETdHJhdmlzLWNpQGR1bW15Lm9yZzANBgkqhkiG9w0BAQsFAAOCAQEA
|
27
|
+
Xuaj6r4QXrQwDdrmT2sPgWiS5/CRRiSwyWsE1jfM0q5spzuKRIy+vSfmj6isScGf
|
28
|
+
vT7nwXus+3IcISSdfUddGqf/L54z6U9dVc+V5SH+QuptDRPgQ+fPJFKn8uFARJDU
|
29
|
+
9qNNSKpyoXXHksouuRV4dXVYRChfhLiavXaR0jNmi6qgTsSSvyKD2aObyVdVUzxr
|
30
|
+
Umpavc3v5BbquwF9DlKeHZwU/qP0ynCZg/Z9CFa18e5JfyBSFXHXDA0YXE6+b4Dh
|
31
|
+
+QvsIa+rEKMYbn0IActnL2SCNlGcttHDcH0AkctmwmAN2r6LTInUBCJoahaIeIXU
|
32
|
+
RE1H1QyCW3SV93CTTKaR2A==
|
33
|
+
-----END CERTIFICATE-----
|
34
|
+
date: 2020-11-07 00:00:00.000000000 Z
|
14
35
|
dependencies:
|
15
36
|
- !ruby/object:Gem::Dependency
|
16
37
|
name: yard
|
17
38
|
requirement: !ruby/object:Gem::Requirement
|
18
39
|
requirements:
|
19
|
-
- - "
|
40
|
+
- - "~>"
|
20
41
|
- !ruby/object:Gem::Version
|
21
42
|
version: '0.6'
|
22
43
|
type: :development
|
23
44
|
prerelease: false
|
24
45
|
version_requirements: !ruby/object:Gem::Requirement
|
25
46
|
requirements:
|
26
|
-
- - "
|
47
|
+
- - "~>"
|
27
48
|
- !ruby/object:Gem::Version
|
28
49
|
version: '0.6'
|
29
50
|
- !ruby/object:Gem::Dependency
|
@@ -46,14 +67,14 @@ dependencies:
|
|
46
67
|
requirements:
|
47
68
|
- - "~>"
|
48
69
|
- !ruby/object:Gem::Version
|
49
|
-
version: 0.6.
|
70
|
+
version: 0.6.2
|
50
71
|
type: :development
|
51
72
|
prerelease: false
|
52
73
|
version_requirements: !ruby/object:Gem::Requirement
|
53
74
|
requirements:
|
54
75
|
- - "~>"
|
55
76
|
- !ruby/object:Gem::Version
|
56
|
-
version: 0.6.
|
77
|
+
version: 0.6.2
|
57
78
|
- !ruby/object:Gem::Dependency
|
58
79
|
name: minitest
|
59
80
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,30 +107,36 @@ dependencies:
|
|
86
107
|
name: rdoc
|
87
108
|
requirement: !ruby/object:Gem::Requirement
|
88
109
|
requirements:
|
89
|
-
- - "
|
110
|
+
- - ">="
|
90
111
|
- !ruby/object:Gem::Version
|
91
112
|
version: '4.0'
|
113
|
+
- - "<"
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
version: '7'
|
92
116
|
type: :development
|
93
117
|
prerelease: false
|
94
118
|
version_requirements: !ruby/object:Gem::Requirement
|
95
119
|
requirements:
|
96
|
-
- - "
|
120
|
+
- - ">="
|
97
121
|
- !ruby/object:Gem::Version
|
98
122
|
version: '4.0'
|
123
|
+
- - "<"
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '7'
|
99
126
|
- !ruby/object:Gem::Dependency
|
100
127
|
name: hoe
|
101
128
|
requirement: !ruby/object:Gem::Requirement
|
102
129
|
requirements:
|
103
130
|
- - "~>"
|
104
131
|
- !ruby/object:Gem::Version
|
105
|
-
version: '3.
|
132
|
+
version: '3.22'
|
106
133
|
type: :development
|
107
134
|
prerelease: false
|
108
135
|
version_requirements: !ruby/object:Gem::Requirement
|
109
136
|
requirements:
|
110
137
|
- - "~>"
|
111
138
|
- !ruby/object:Gem::Version
|
112
|
-
version: '3.
|
139
|
+
version: '3.22'
|
113
140
|
description: 'This module allows Ruby programs to interface with "RSA Security Inc.
|
114
141
|
PKCS #11 Cryptographic Token Interface (Cryptoki)".'
|
115
142
|
email:
|
@@ -128,8 +155,10 @@ extra_rdoc_files:
|
|
128
155
|
- pkcs11_protect_server/README_PROTECT_SERVER.rdoc
|
129
156
|
- ext/pk11.c
|
130
157
|
files:
|
158
|
+
- ".appveyor.yml"
|
131
159
|
- ".autotest"
|
132
160
|
- ".gemtest"
|
161
|
+
- ".gitignore"
|
133
162
|
- ".travis.yml"
|
134
163
|
- ".yardopts"
|
135
164
|
- Gemfile
|
@@ -137,7 +166,6 @@ files:
|
|
137
166
|
- MIT-LICENSE
|
138
167
|
- README.rdoc
|
139
168
|
- Rakefile
|
140
|
-
- appveyor.yml
|
141
169
|
- ext/extconf.rb
|
142
170
|
- ext/generate_constants.rb
|
143
171
|
- ext/generate_structs.rb
|
@@ -186,7 +214,8 @@ files:
|
|
186
214
|
homepage: http://github.com/larskanis/pkcs11
|
187
215
|
licenses:
|
188
216
|
- MIT
|
189
|
-
metadata:
|
217
|
+
metadata:
|
218
|
+
homepage_uri: http://github.com/larskanis/pkcs11
|
190
219
|
post_install_message:
|
191
220
|
rdoc_options:
|
192
221
|
- "--main"
|
@@ -197,15 +226,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
197
226
|
requirements:
|
198
227
|
- - ">="
|
199
228
|
- !ruby/object:Gem::Version
|
200
|
-
version:
|
229
|
+
version: 2.2.0
|
201
230
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
202
231
|
requirements:
|
203
232
|
- - ">="
|
204
233
|
- !ruby/object:Gem::Version
|
205
234
|
version: '0'
|
206
235
|
requirements: []
|
207
|
-
|
208
|
-
rubygems_version: 2.6.12
|
236
|
+
rubygems_version: 3.1.4
|
209
237
|
signing_key:
|
210
238
|
specification_version: 4
|
211
239
|
summary: PKCS#11 binding for Ruby
|
metadata.gz.sig
ADDED
data/appveyor.yml
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
install:
|
2
|
-
- SET PATH=C:\Ruby%ruby_version%\bin;%PATH%
|
3
|
-
- SET PATH=C:\MinGW\msys\1.0\bin;%PATH%
|
4
|
-
- SET RAKEOPT=-rdevkit
|
5
|
-
- ruby --version
|
6
|
-
- gem --version
|
7
|
-
- bundle install
|
8
|
-
|
9
|
-
# When running ruby-x86, we make use of the softokn3.dll that is part of the
|
10
|
-
# pre-installed firefox. The test helper will find it automatically.
|
11
|
-
# When running ruby-x64, we equally need a 64 bit softokn3.dll to test against.
|
12
|
-
# However it is not part of any installed software on appveyor, nor is it
|
13
|
-
# officially released as a windows binary, so we download and install a 64 bit
|
14
|
-
# firefox version and use it's softokn3.dll.
|
15
|
-
- ps: |
|
16
|
-
if ($env:isx64 -eq "1")
|
17
|
-
{
|
18
|
-
$(new-object net.webclient).DownloadFile('http://ftp.mozilla.org/pub/mozilla.org/firefox/releases/40.0b4/win64/en-US/Firefox%20Setup%2040.0b4.exe', 'C:\firefox-setup.exe')
|
19
|
-
cmd /c C:\firefox-setup.exe -ms
|
20
|
-
$env:SOFTOKN_PATH = 'C:\Program Files\Mozilla Firefox\softokn3.dll'
|
21
|
-
$env:PATH = 'C:\Program Files\Mozilla Firefox;' + $env:PATH
|
22
|
-
}
|
23
|
-
|
24
|
-
build: off
|
25
|
-
|
26
|
-
test_script:
|
27
|
-
- bundle exec rake compile test gem
|
28
|
-
|
29
|
-
environment:
|
30
|
-
matrix:
|
31
|
-
- ruby_version: "193"
|
32
|
-
#- ruby_version: "200"
|
33
|
-
#- ruby_version: "200-x64"
|
34
|
-
#- ruby_version: "21"
|
35
|
-
#- ruby_version: "21-x64"
|
36
|
-
- ruby_version: "22"
|
37
|
-
- ruby_version: "22-x64"
|
38
|
-
isx64: "1"
|