rubysl-openssl 2.2.1 → 2.3.0
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.
- checksums.yaml +4 -4
- data/.travis.yml +4 -4
- data/MRI_LICENSE +56 -0
- data/ext/rubysl/openssl/openssl_missing.c +1 -1
- data/ext/rubysl/openssl/openssl_missing.h +1 -1
- data/ext/rubysl/openssl/ossl.c +17 -16
- data/ext/rubysl/openssl/ossl.h +7 -7
- data/ext/rubysl/openssl/ossl_asn1.c +5 -5
- data/ext/rubysl/openssl/ossl_asn1.h +1 -1
- data/ext/rubysl/openssl/ossl_bio.c +2 -2
- data/ext/rubysl/openssl/ossl_bio.h +1 -1
- data/ext/rubysl/openssl/ossl_bn.c +37 -13
- data/ext/rubysl/openssl/ossl_bn.h +1 -1
- data/ext/rubysl/openssl/ossl_cipher.c +64 -17
- data/ext/rubysl/openssl/ossl_cipher.h +1 -1
- data/ext/rubysl/openssl/ossl_config.c +3 -3
- data/ext/rubysl/openssl/ossl_config.h +1 -1
- data/ext/rubysl/openssl/ossl_digest.c +19 -7
- data/ext/rubysl/openssl/ossl_digest.h +1 -1
- data/ext/rubysl/openssl/ossl_engine.c +24 -17
- data/ext/rubysl/openssl/ossl_engine.h +1 -1
- data/ext/rubysl/openssl/ossl_hmac.c +15 -7
- data/ext/rubysl/openssl/ossl_hmac.h +1 -1
- data/ext/rubysl/openssl/ossl_ns_spki.c +19 -4
- data/ext/rubysl/openssl/ossl_ns_spki.h +1 -1
- data/ext/rubysl/openssl/ossl_ocsp.c +518 -60
- data/ext/rubysl/openssl/ossl_ocsp.h +1 -1
- data/ext/rubysl/openssl/ossl_pkcs12.c +18 -4
- data/ext/rubysl/openssl/ossl_pkcs12.h +1 -1
- data/ext/rubysl/openssl/ossl_pkcs5.c +1 -1
- data/ext/rubysl/openssl/ossl_pkcs7.c +59 -15
- data/ext/rubysl/openssl/ossl_pkcs7.h +1 -1
- data/ext/rubysl/openssl/ossl_pkey.c +16 -2
- data/ext/rubysl/openssl/ossl_pkey.h +4 -3
- data/ext/rubysl/openssl/ossl_pkey_dh.c +3 -3
- data/ext/rubysl/openssl/ossl_pkey_dsa.c +3 -3
- data/ext/rubysl/openssl/ossl_pkey_ec.c +32 -12
- data/ext/rubysl/openssl/ossl_pkey_rsa.c +3 -3
- data/ext/rubysl/openssl/ossl_rand.c +58 -34
- data/ext/rubysl/openssl/ossl_rand.h +1 -1
- data/ext/rubysl/openssl/ossl_ssl.c +75 -46
- data/ext/rubysl/openssl/ossl_ssl.h +8 -2
- data/ext/rubysl/openssl/ossl_ssl_session.c +16 -15
- data/ext/rubysl/openssl/ossl_version.h +1 -1
- data/ext/rubysl/openssl/ossl_x509.c +2 -2
- data/ext/rubysl/openssl/ossl_x509.h +1 -1
- data/ext/rubysl/openssl/ossl_x509attr.c +18 -4
- data/ext/rubysl/openssl/ossl_x509cert.c +27 -33
- data/ext/rubysl/openssl/ossl_x509crl.c +18 -4
- data/ext/rubysl/openssl/ossl_x509ext.c +29 -7
- data/ext/rubysl/openssl/ossl_x509name.c +22 -7
- data/ext/rubysl/openssl/ossl_x509req.c +18 -4
- data/ext/rubysl/openssl/ossl_x509revoked.c +18 -4
- data/ext/rubysl/openssl/ossl_x509store.c +33 -8
- data/ext/rubysl/openssl/ruby_missing.h +1 -1
- data/lib/openssl/bn.rb +8 -1
- data/lib/openssl/buffering.rb +1 -1
- data/lib/openssl/cipher.rb +1 -1
- data/lib/openssl/digest.rb +1 -1
- data/lib/openssl/ssl.rb +65 -7
- data/lib/openssl/x509.rb +22 -2
- data/lib/rubysl/openssl.rb +1 -1
- data/lib/rubysl/openssl/version.rb +1 -1
- metadata +4 -3
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
* $Id$
|
2
|
+
* $Id: ossl_x509req.c 48815 2014-12-12 23:59:28Z nobu $
|
3
3
|
* 'OpenSSL for Ruby' project
|
4
4
|
* Copyright (C) 2001-2002 Michal Rokos <m.rokos@sh.cvut.cz>
|
5
5
|
* All rights reserved.
|
@@ -14,10 +14,10 @@
|
|
14
14
|
if (!(req)) { \
|
15
15
|
ossl_raise(rb_eRuntimeError, "Req wasn't initialized!"); \
|
16
16
|
} \
|
17
|
-
(obj) =
|
17
|
+
(obj) = TypedData_Wrap_Struct((klass), &ossl_x509req_type, (req)); \
|
18
18
|
} while (0)
|
19
19
|
#define GetX509Req(obj, req) do { \
|
20
|
-
|
20
|
+
TypedData_Get_Struct((obj), X509_REQ, &ossl_x509req_type, (req)); \
|
21
21
|
if (!(req)) { \
|
22
22
|
ossl_raise(rb_eRuntimeError, "Req wasn't initialized!"); \
|
23
23
|
} \
|
@@ -33,6 +33,20 @@
|
|
33
33
|
VALUE cX509Req;
|
34
34
|
VALUE eX509ReqError;
|
35
35
|
|
36
|
+
static void
|
37
|
+
ossl_x509req_free(void *ptr)
|
38
|
+
{
|
39
|
+
X509_REQ_free(ptr);
|
40
|
+
}
|
41
|
+
|
42
|
+
static const rb_data_type_t ossl_x509req_type = {
|
43
|
+
"OpenSSL/X509/REQ",
|
44
|
+
{
|
45
|
+
0, ossl_x509req_free,
|
46
|
+
},
|
47
|
+
0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
|
48
|
+
};
|
49
|
+
|
36
50
|
/*
|
37
51
|
* Public functions
|
38
52
|
*/
|
@@ -438,7 +452,7 @@ ossl_x509req_add_attribute(VALUE self, VALUE attr)
|
|
438
452
|
* X509_REQUEST init
|
439
453
|
*/
|
440
454
|
void
|
441
|
-
Init_ossl_x509req()
|
455
|
+
Init_ossl_x509req(void)
|
442
456
|
{
|
443
457
|
eX509ReqError = rb_define_class_under(mX509, "RequestError", eOSSLError);
|
444
458
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
* $Id$
|
2
|
+
* $Id: ossl_x509revoked.c 48816 2014-12-12 23:59:36Z nobu $
|
3
3
|
* 'OpenSSL for Ruby' project
|
4
4
|
* Copyright (C) 2001-2002 Michal Rokos <m.rokos@sh.cvut.cz>
|
5
5
|
* All rights reserved.
|
@@ -14,10 +14,10 @@
|
|
14
14
|
if (!(rev)) { \
|
15
15
|
ossl_raise(rb_eRuntimeError, "REV wasn't initialized!"); \
|
16
16
|
} \
|
17
|
-
(obj) =
|
17
|
+
(obj) = TypedData_Wrap_Struct((klass), &ossl_x509rev_type, (rev)); \
|
18
18
|
} while (0)
|
19
19
|
#define GetX509Rev(obj, rev) do { \
|
20
|
-
|
20
|
+
TypedData_Get_Struct((obj), X509_REVOKED, &ossl_x509rev_type, (rev)); \
|
21
21
|
if (!(rev)) { \
|
22
22
|
ossl_raise(rb_eRuntimeError, "REV wasn't initialized!"); \
|
23
23
|
} \
|
@@ -33,6 +33,20 @@
|
|
33
33
|
VALUE cX509Rev;
|
34
34
|
VALUE eX509RevError;
|
35
35
|
|
36
|
+
static void
|
37
|
+
ossl_x509rev_free(void *ptr)
|
38
|
+
{
|
39
|
+
X509_REVOKED_free(ptr);
|
40
|
+
}
|
41
|
+
|
42
|
+
static const rb_data_type_t ossl_x509rev_type = {
|
43
|
+
"OpenSSL/X509/REV",
|
44
|
+
{
|
45
|
+
0, ossl_x509rev_free,
|
46
|
+
},
|
47
|
+
0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
|
48
|
+
};
|
49
|
+
|
36
50
|
/*
|
37
51
|
* PUBLIC
|
38
52
|
*/
|
@@ -209,7 +223,7 @@ ossl_x509revoked_add_extension(VALUE self, VALUE ext)
|
|
209
223
|
* INIT
|
210
224
|
*/
|
211
225
|
void
|
212
|
-
Init_ossl_x509revoked()
|
226
|
+
Init_ossl_x509revoked(void)
|
213
227
|
{
|
214
228
|
eX509RevError = rb_define_class_under(mX509, "RevokedError", eOSSLError);
|
215
229
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
* $Id$
|
2
|
+
* $Id: ossl_x509store.c 48818 2014-12-13 00:06:54Z nobu $
|
3
3
|
* 'OpenSSL for Ruby' project
|
4
4
|
* Copyright (C) 2001-2002 Michal Rokos <m.rokos@sh.cvut.cz>
|
5
5
|
* All rights reserved.
|
@@ -14,10 +14,10 @@
|
|
14
14
|
if (!(st)) { \
|
15
15
|
ossl_raise(rb_eRuntimeError, "STORE wasn't initialized!"); \
|
16
16
|
} \
|
17
|
-
(obj) =
|
17
|
+
(obj) = TypedData_Wrap_Struct((klass), &ossl_x509store_type, (st)); \
|
18
18
|
} while (0)
|
19
19
|
#define GetX509Store(obj, st) do { \
|
20
|
-
|
20
|
+
TypedData_Get_Struct((obj), X509_STORE, &ossl_x509store_type, (st)); \
|
21
21
|
if (!(st)) { \
|
22
22
|
ossl_raise(rb_eRuntimeError, "STORE wasn't initialized!"); \
|
23
23
|
} \
|
@@ -31,10 +31,10 @@
|
|
31
31
|
if (!(ctx)) { \
|
32
32
|
ossl_raise(rb_eRuntimeError, "STORE_CTX wasn't initialized!"); \
|
33
33
|
} \
|
34
|
-
(obj) =
|
34
|
+
(obj) = TypedData_Wrap_Struct((klass), &ossl_x509stctx_type, (ctx)); \
|
35
35
|
} while (0)
|
36
36
|
#define GetX509StCtx(obj, ctx) do { \
|
37
|
-
|
37
|
+
TypedData_Get_Struct((obj), X509_STORE_CTX, &ossl_x509stctx_type, (ctx)); \
|
38
38
|
if (!(ctx)) { \
|
39
39
|
ossl_raise(rb_eRuntimeError, "STORE_CTX is out of scope!"); \
|
40
40
|
} \
|
@@ -51,6 +51,20 @@ VALUE cX509Store;
|
|
51
51
|
VALUE cX509StoreContext;
|
52
52
|
VALUE eX509StoreError;
|
53
53
|
|
54
|
+
static void
|
55
|
+
ossl_x509store_free(void *ptr)
|
56
|
+
{
|
57
|
+
X509_STORE_free(ptr);
|
58
|
+
}
|
59
|
+
|
60
|
+
static const rb_data_type_t ossl_x509store_type = {
|
61
|
+
"OpenSSL/X509/STORE",
|
62
|
+
{
|
63
|
+
0, ossl_x509store_free,
|
64
|
+
},
|
65
|
+
0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
|
66
|
+
};
|
67
|
+
|
54
68
|
/*
|
55
69
|
* Public functions
|
56
70
|
*/
|
@@ -342,7 +356,17 @@ ossl_x509store_verify(int argc, VALUE *argv, VALUE self)
|
|
342
356
|
/*
|
343
357
|
* Public Functions
|
344
358
|
*/
|
345
|
-
static void ossl_x509stctx_free(
|
359
|
+
static void ossl_x509stctx_free(void*);
|
360
|
+
|
361
|
+
|
362
|
+
static const rb_data_type_t ossl_x509stctx_type = {
|
363
|
+
"OpenSSL/X509/STORE_CTX",
|
364
|
+
{
|
365
|
+
0, ossl_x509stctx_free,
|
366
|
+
},
|
367
|
+
0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
|
368
|
+
};
|
369
|
+
|
346
370
|
|
347
371
|
VALUE
|
348
372
|
ossl_x509stctx_new(X509_STORE_CTX *ctx)
|
@@ -367,8 +391,9 @@ ossl_x509stctx_clear_ptr(VALUE obj)
|
|
367
391
|
* Private functions
|
368
392
|
*/
|
369
393
|
static void
|
370
|
-
ossl_x509stctx_free(
|
394
|
+
ossl_x509stctx_free(void *ptr)
|
371
395
|
{
|
396
|
+
X509_STORE_CTX *ctx = ptr;
|
372
397
|
if(ctx->untrusted)
|
373
398
|
sk_X509_pop_free(ctx->untrusted, X509_free);
|
374
399
|
if(ctx->cert)
|
@@ -593,7 +618,7 @@ ossl_x509stctx_set_time(VALUE self, VALUE time)
|
|
593
618
|
* INIT
|
594
619
|
*/
|
595
620
|
void
|
596
|
-
Init_ossl_x509store()
|
621
|
+
Init_ossl_x509store(void)
|
597
622
|
{
|
598
623
|
VALUE x509stctx;
|
599
624
|
|
data/lib/openssl/bn.rb
CHANGED
@@ -14,13 +14,20 @@
|
|
14
14
|
# (See the file 'LICENCE'.)
|
15
15
|
#
|
16
16
|
# = Version
|
17
|
-
# $Id$
|
17
|
+
# $Id: bn.rb 47647 2014-09-20 01:17:05Z akr $
|
18
18
|
#
|
19
19
|
#++
|
20
20
|
|
21
21
|
module OpenSSL
|
22
22
|
class BN
|
23
23
|
include Comparable
|
24
|
+
|
25
|
+
def pretty_print(q)
|
26
|
+
q.object_group(self) {
|
27
|
+
q.text ' '
|
28
|
+
q.text to_i.to_s
|
29
|
+
}
|
30
|
+
end
|
24
31
|
end # BN
|
25
32
|
end # OpenSSL
|
26
33
|
|
data/lib/openssl/buffering.rb
CHANGED
data/lib/openssl/cipher.rb
CHANGED
data/lib/openssl/digest.rb
CHANGED
data/lib/openssl/ssl.rb
CHANGED
@@ -11,7 +11,7 @@
|
|
11
11
|
(See the file 'LICENCE'.)
|
12
12
|
|
13
13
|
= Version
|
14
|
-
$Id$
|
14
|
+
$Id: ssl.rb 50293 2015-04-13 13:13:01Z nagachika $
|
15
15
|
=end
|
16
16
|
|
17
17
|
require "openssl/buffering"
|
@@ -143,8 +143,7 @@ module OpenSSL
|
|
143
143
|
case san.tag
|
144
144
|
when 2 # dNSName in GeneralName (RFC5280)
|
145
145
|
should_verify_common_name = false
|
146
|
-
|
147
|
-
return true if /\A#{reg}\z/i =~ hostname
|
146
|
+
return true if verify_hostname(hostname, san.value)
|
148
147
|
when 7 # iPAddress in GeneralName (RFC5280)
|
149
148
|
should_verify_common_name = false
|
150
149
|
# follows GENERAL_NAME_print() in x509v3/v3_alt.c
|
@@ -159,8 +158,7 @@ module OpenSSL
|
|
159
158
|
if should_verify_common_name
|
160
159
|
cert.subject.to_a.each{|oid, value|
|
161
160
|
if oid == "CN"
|
162
|
-
|
163
|
-
return true if /\A#{reg}\z/i =~ hostname
|
161
|
+
return true if verify_hostname(hostname, value)
|
164
162
|
end
|
165
163
|
}
|
166
164
|
end
|
@@ -168,11 +166,67 @@ module OpenSSL
|
|
168
166
|
end
|
169
167
|
module_function :verify_certificate_identity
|
170
168
|
|
169
|
+
def verify_hostname(hostname, san) # :nodoc:
|
170
|
+
# RFC 5280, IA5String is limited to the set of ASCII characters
|
171
|
+
return false unless san.ascii_only?
|
172
|
+
return false unless hostname.ascii_only?
|
173
|
+
|
174
|
+
# See RFC 6125, section 6.4.1
|
175
|
+
# Matching is case-insensitive.
|
176
|
+
san_parts = san.downcase.split(".")
|
177
|
+
|
178
|
+
# TODO: this behavior should probably be more strict
|
179
|
+
return san == hostname if san_parts.size < 2
|
180
|
+
|
181
|
+
# Matching is case-insensitive.
|
182
|
+
host_parts = hostname.downcase.split(".")
|
183
|
+
|
184
|
+
# RFC 6125, section 6.4.3, subitem 2.
|
185
|
+
# If the wildcard character is the only character of the left-most
|
186
|
+
# label in the presented identifier, the client SHOULD NOT compare
|
187
|
+
# against anything but the left-most label of the reference
|
188
|
+
# identifier (e.g., *.example.com would match foo.example.com but
|
189
|
+
# not bar.foo.example.com or example.com).
|
190
|
+
return false unless san_parts.size == host_parts.size
|
191
|
+
|
192
|
+
# RFC 6125, section 6.4.3, subitem 1.
|
193
|
+
# The client SHOULD NOT attempt to match a presented identifier in
|
194
|
+
# which the wildcard character comprises a label other than the
|
195
|
+
# left-most label (e.g., do not match bar.*.example.net).
|
196
|
+
return false unless verify_wildcard(host_parts.shift, san_parts.shift)
|
197
|
+
|
198
|
+
san_parts.join(".") == host_parts.join(".")
|
199
|
+
end
|
200
|
+
module_function :verify_hostname
|
201
|
+
|
202
|
+
def verify_wildcard(domain_component, san_component) # :nodoc:
|
203
|
+
parts = san_component.split("*", -1)
|
204
|
+
|
205
|
+
return false if parts.size > 2
|
206
|
+
return san_component == domain_component if parts.size == 1
|
207
|
+
|
208
|
+
# RFC 6125, section 6.4.3, subitem 3.
|
209
|
+
# The client SHOULD NOT attempt to match a presented identifier
|
210
|
+
# where the wildcard character is embedded within an A-label or
|
211
|
+
# U-label of an internationalized domain name.
|
212
|
+
return false if domain_component.start_with?("xn--") && san_component != "*"
|
213
|
+
|
214
|
+
parts[0].length + parts[1].length < domain_component.length &&
|
215
|
+
domain_component.start_with?(parts[0]) &&
|
216
|
+
domain_component.end_with?(parts[1])
|
217
|
+
end
|
218
|
+
module_function :verify_wildcard
|
219
|
+
|
171
220
|
class SSLSocket
|
172
221
|
include Buffering
|
173
222
|
include SocketForwarder
|
174
223
|
include Nonblock
|
175
224
|
|
225
|
+
##
|
226
|
+
# Perform hostname verification after an SSL connection is established
|
227
|
+
#
|
228
|
+
# This method MUST be called after calling #connect to ensure that the
|
229
|
+
# hostname of a remote peer has been verified.
|
176
230
|
def post_connection_check(hostname)
|
177
231
|
unless OpenSSL::SSL.verify_certificate_identity(peer_cert, hostname)
|
178
232
|
raise SSLError, "hostname \"#{hostname}\" does not match the server certificate"
|
@@ -235,8 +289,12 @@ module OpenSSL
|
|
235
289
|
ssl.sync_close = true
|
236
290
|
ssl.accept if @start_immediately
|
237
291
|
ssl
|
238
|
-
rescue
|
239
|
-
|
292
|
+
rescue Exception => ex
|
293
|
+
if ssl
|
294
|
+
ssl.close
|
295
|
+
else
|
296
|
+
sock.close
|
297
|
+
end
|
240
298
|
raise ex
|
241
299
|
end
|
242
300
|
end
|
data/lib/openssl/x509.rb
CHANGED
@@ -14,7 +14,7 @@
|
|
14
14
|
# (See the file 'LICENCE'.)
|
15
15
|
#
|
16
16
|
# = Version
|
17
|
-
# $Id$
|
17
|
+
# $Id: x509.rb 48521 2014-11-20 15:39:03Z usa $
|
18
18
|
#
|
19
19
|
#++
|
20
20
|
|
@@ -70,7 +70,7 @@ module OpenSSL
|
|
70
70
|
HexPair = /#{HexChar}#{HexChar}/
|
71
71
|
HexString = /#{HexPair}+/
|
72
72
|
Pair = /\\(?:[#{Special}]|\\|"|#{HexPair})/
|
73
|
-
StringChar = /[
|
73
|
+
StringChar = /[^\\"#{Special}]/
|
74
74
|
QuoteChar = /[^\\"]/
|
75
75
|
AttributeType = /[a-zA-Z][0-9a-zA-Z]*|[0-9]+(?:\.[0-9]+)*/
|
76
76
|
AttributeValue = /
|
@@ -151,6 +151,13 @@ module OpenSSL
|
|
151
151
|
|
152
152
|
alias parse parse_openssl
|
153
153
|
end
|
154
|
+
|
155
|
+
def pretty_print(q)
|
156
|
+
q.object_group(self) {
|
157
|
+
q.text ' '
|
158
|
+
q.text to_s(OpenSSL::X509::Name::RFC2253)
|
159
|
+
}
|
160
|
+
end
|
154
161
|
end
|
155
162
|
|
156
163
|
class StoreContext
|
@@ -158,5 +165,18 @@ module OpenSSL
|
|
158
165
|
warn "(#{caller.first}) OpenSSL::X509::StoreContext#cleanup is deprecated with no replacement" if $VERBOSE
|
159
166
|
end
|
160
167
|
end
|
168
|
+
|
169
|
+
class Certificate
|
170
|
+
def pretty_print(q)
|
171
|
+
q.object_group(self) {
|
172
|
+
q.breakable
|
173
|
+
q.text 'subject='; q.pp self.subject; q.text ','; q.breakable
|
174
|
+
q.text 'issuer='; q.pp self.issuer; q.text ','; q.breakable
|
175
|
+
q.text 'serial='; q.pp self.serial; q.text ','; q.breakable
|
176
|
+
q.text 'not_before='; q.pp self.not_before; q.text ','; q.breakable
|
177
|
+
q.text 'not_after='; q.pp self.not_after
|
178
|
+
}
|
179
|
+
end
|
180
|
+
end
|
161
181
|
end
|
162
182
|
end
|
data/lib/rubysl/openssl.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubysl-openssl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian Shirai
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-05-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -78,6 +78,7 @@ files:
|
|
78
78
|
- ".travis.yml"
|
79
79
|
- Gemfile
|
80
80
|
- LICENSE
|
81
|
+
- MRI_LICENSE
|
81
82
|
- README.md
|
82
83
|
- Rakefile
|
83
84
|
- ext/rubysl/openssl/.gitignore
|
@@ -176,7 +177,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
176
177
|
version: '0'
|
177
178
|
requirements: []
|
178
179
|
rubyforge_project:
|
179
|
-
rubygems_version: 2.
|
180
|
+
rubygems_version: 2.4.5
|
180
181
|
signing_key:
|
181
182
|
specification_version: 4
|
182
183
|
summary: Ruby standard library OpenSSL.
|