openssl 2.1.0 → 3.2.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/CONTRIBUTING.md +35 -45
- data/History.md +426 -0
- data/README.md +38 -21
- data/ext/openssl/extconf.rb +132 -72
- data/ext/openssl/openssl_missing.c +0 -66
- data/ext/openssl/openssl_missing.h +62 -46
- data/ext/openssl/ossl.c +177 -252
- data/ext/openssl/ossl.h +39 -17
- data/ext/openssl/ossl_asn1.c +53 -14
- data/ext/openssl/ossl_bn.c +288 -146
- data/ext/openssl/ossl_bn.h +2 -1
- data/ext/openssl/ossl_cipher.c +42 -32
- data/ext/openssl/ossl_config.c +412 -41
- data/ext/openssl/ossl_config.h +4 -7
- data/ext/openssl/ossl_digest.c +32 -63
- data/ext/openssl/ossl_engine.c +19 -28
- data/ext/openssl/ossl_hmac.c +61 -146
- data/ext/openssl/ossl_kdf.c +15 -23
- data/ext/openssl/ossl_ns_spki.c +2 -2
- data/ext/openssl/ossl_ocsp.c +17 -70
- data/ext/openssl/ossl_ocsp.h +3 -3
- data/ext/openssl/ossl_pkcs12.c +23 -4
- data/ext/openssl/ossl_pkcs7.c +49 -81
- data/ext/openssl/ossl_pkcs7.h +16 -0
- data/ext/openssl/ossl_pkey.c +1508 -195
- data/ext/openssl/ossl_pkey.h +41 -78
- data/ext/openssl/ossl_pkey_dh.c +153 -348
- data/ext/openssl/ossl_pkey_dsa.c +157 -413
- data/ext/openssl/ossl_pkey_ec.c +257 -343
- data/ext/openssl/ossl_pkey_rsa.c +166 -490
- data/ext/openssl/ossl_provider.c +211 -0
- data/ext/openssl/ossl_provider.h +5 -0
- data/ext/openssl/ossl_rand.c +2 -40
- data/ext/openssl/ossl_ssl.c +666 -456
- data/ext/openssl/ossl_ssl_session.c +29 -30
- data/ext/openssl/ossl_ts.c +1539 -0
- data/ext/openssl/ossl_ts.h +16 -0
- data/ext/openssl/ossl_x509.c +86 -1
- data/ext/openssl/ossl_x509attr.c +1 -1
- data/ext/openssl/ossl_x509cert.c +170 -14
- data/ext/openssl/ossl_x509crl.c +14 -11
- data/ext/openssl/ossl_x509ext.c +29 -9
- data/ext/openssl/ossl_x509name.c +24 -12
- data/ext/openssl/ossl_x509req.c +14 -11
- data/ext/openssl/ossl_x509revoked.c +4 -4
- data/ext/openssl/ossl_x509store.c +205 -96
- data/lib/openssl/bn.rb +1 -1
- data/lib/openssl/buffering.rb +42 -20
- data/lib/openssl/cipher.rb +1 -1
- data/lib/openssl/digest.rb +10 -16
- data/lib/openssl/hmac.rb +78 -0
- data/lib/openssl/marshal.rb +30 -0
- data/lib/openssl/pkcs5.rb +1 -1
- data/lib/openssl/pkey.rb +447 -1
- data/lib/openssl/ssl.rb +68 -24
- data/lib/openssl/version.rb +5 -0
- data/lib/openssl/x509.rb +177 -1
- data/lib/openssl.rb +24 -9
- metadata +18 -71
- data/ext/openssl/deprecation.rb +0 -23
- data/ext/openssl/ossl_version.h +0 -15
- data/ext/openssl/ruby_missing.h +0 -24
- data/lib/openssl/config.rb +0 -474
data/lib/openssl/buffering.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# coding: binary
|
2
|
-
# frozen_string_literal:
|
2
|
+
# frozen_string_literal: true
|
3
3
|
#--
|
4
4
|
#= Info
|
5
5
|
# 'OpenSSL for Ruby 2' project
|
@@ -22,6 +22,29 @@
|
|
22
22
|
module OpenSSL::Buffering
|
23
23
|
include Enumerable
|
24
24
|
|
25
|
+
# A buffer which will retain binary encoding.
|
26
|
+
class Buffer < String
|
27
|
+
BINARY = Encoding::BINARY
|
28
|
+
|
29
|
+
def initialize
|
30
|
+
super
|
31
|
+
|
32
|
+
force_encoding(BINARY)
|
33
|
+
end
|
34
|
+
|
35
|
+
def << string
|
36
|
+
if string.encoding == BINARY
|
37
|
+
super(string)
|
38
|
+
else
|
39
|
+
super(string.b)
|
40
|
+
end
|
41
|
+
|
42
|
+
return self
|
43
|
+
end
|
44
|
+
|
45
|
+
alias concat <<
|
46
|
+
end
|
47
|
+
|
25
48
|
##
|
26
49
|
# The "sync mode" of the SSLSocket.
|
27
50
|
#
|
@@ -40,7 +63,7 @@ module OpenSSL::Buffering
|
|
40
63
|
def initialize(*)
|
41
64
|
super
|
42
65
|
@eof = false
|
43
|
-
@rbuffer =
|
66
|
+
@rbuffer = Buffer.new
|
44
67
|
@sync = @io.sync
|
45
68
|
end
|
46
69
|
|
@@ -70,14 +93,20 @@ module OpenSSL::Buffering
|
|
70
93
|
nil
|
71
94
|
else
|
72
95
|
size = @rbuffer.size unless size
|
73
|
-
|
74
|
-
@rbuffer[0, size] = ""
|
75
|
-
ret
|
96
|
+
@rbuffer.slice!(0, size)
|
76
97
|
end
|
77
98
|
end
|
78
99
|
|
79
100
|
public
|
80
101
|
|
102
|
+
# call-seq:
|
103
|
+
# ssl.getbyte => 81
|
104
|
+
#
|
105
|
+
# Get the next 8bit byte from `ssl`. Returns `nil` on EOF
|
106
|
+
def getbyte
|
107
|
+
read(1)&.ord
|
108
|
+
end
|
109
|
+
|
81
110
|
##
|
82
111
|
# Reads _size_ bytes from the stream. If _buf_ is provided it must
|
83
112
|
# reference a string which will receive the data.
|
@@ -312,24 +341,19 @@ module OpenSSL::Buffering
|
|
312
341
|
# buffer is flushed to the underlying socket.
|
313
342
|
|
314
343
|
def do_write(s)
|
315
|
-
@wbuffer =
|
344
|
+
@wbuffer = Buffer.new unless defined? @wbuffer
|
316
345
|
@wbuffer << s
|
317
346
|
@wbuffer.force_encoding(Encoding::BINARY)
|
318
347
|
@sync ||= false
|
319
|
-
if @sync or @wbuffer.size > BLOCK_SIZE
|
320
|
-
|
321
|
-
nwritten = 0
|
322
|
-
while remain > 0
|
323
|
-
str = @wbuffer[nwritten,remain]
|
348
|
+
if @sync or @wbuffer.size > BLOCK_SIZE
|
349
|
+
until @wbuffer.empty?
|
324
350
|
begin
|
325
|
-
nwrote = syswrite(
|
351
|
+
nwrote = syswrite(@wbuffer)
|
326
352
|
rescue Errno::EAGAIN
|
327
353
|
retry
|
328
354
|
end
|
329
|
-
|
330
|
-
nwritten += nwrote
|
355
|
+
@wbuffer[0, nwrote] = ""
|
331
356
|
end
|
332
|
-
@wbuffer[0,nwritten] = ""
|
333
357
|
end
|
334
358
|
end
|
335
359
|
|
@@ -403,15 +427,13 @@ module OpenSSL::Buffering
|
|
403
427
|
# See IO#puts for full details.
|
404
428
|
|
405
429
|
def puts(*args)
|
406
|
-
s =
|
430
|
+
s = Buffer.new
|
407
431
|
if args.empty?
|
408
432
|
s << "\n"
|
409
433
|
end
|
410
434
|
args.each{|arg|
|
411
435
|
s << arg.to_s
|
412
|
-
|
413
|
-
s << "\n"
|
414
|
-
end
|
436
|
+
s.sub!(/(?<!\n)\z/, "\n")
|
415
437
|
}
|
416
438
|
do_write(s)
|
417
439
|
nil
|
@@ -423,7 +445,7 @@ module OpenSSL::Buffering
|
|
423
445
|
# See IO#print for full details.
|
424
446
|
|
425
447
|
def print(*args)
|
426
|
-
s =
|
448
|
+
s = Buffer.new
|
427
449
|
args.each{ |arg| s << arg.to_s }
|
428
450
|
do_write(s)
|
429
451
|
nil
|
data/lib/openssl/cipher.rb
CHANGED
data/lib/openssl/digest.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# frozen_string_literal:
|
1
|
+
# frozen_string_literal: true
|
2
2
|
#--
|
3
3
|
# = Ruby-space predefined Digest subclasses
|
4
4
|
#
|
@@ -15,37 +15,31 @@
|
|
15
15
|
module OpenSSL
|
16
16
|
class Digest
|
17
17
|
|
18
|
-
alg = %w(MD2 MD4 MD5 MDC2 RIPEMD160 SHA1 SHA224 SHA256 SHA384 SHA512)
|
19
|
-
if OPENSSL_VERSION_NUMBER < 0x10100000
|
20
|
-
alg += %w(DSS DSS1 SHA)
|
21
|
-
end
|
22
|
-
|
23
18
|
# Return the hash value computed with _name_ Digest. _name_ is either the
|
24
19
|
# long name or short name of a supported digest algorithm.
|
25
20
|
#
|
26
|
-
# ===
|
21
|
+
# === Example
|
27
22
|
#
|
28
23
|
# OpenSSL::Digest.digest("SHA256", "abc")
|
29
|
-
#
|
30
|
-
# which is equivalent to:
|
31
|
-
#
|
32
|
-
# OpenSSL::Digest::SHA256.digest("abc")
|
33
24
|
|
34
25
|
def self.digest(name, data)
|
35
26
|
super(data, name)
|
36
27
|
end
|
37
28
|
|
38
|
-
|
29
|
+
%w(MD4 MD5 RIPEMD160 SHA1 SHA224 SHA256 SHA384 SHA512).each do |name|
|
39
30
|
klass = Class.new(self) {
|
40
31
|
define_method(:initialize, ->(data = nil) {super(name, data)})
|
41
32
|
}
|
33
|
+
|
42
34
|
singleton = (class << klass; self; end)
|
35
|
+
|
43
36
|
singleton.class_eval{
|
44
|
-
define_method(:digest){|data| new.digest(data)
|
45
|
-
define_method(:hexdigest){|data| new.hexdigest(data)
|
37
|
+
define_method(:digest) {|data| new.digest(data)}
|
38
|
+
define_method(:hexdigest) {|data| new.hexdigest(data)}
|
46
39
|
}
|
47
|
-
|
48
|
-
|
40
|
+
|
41
|
+
const_set(name.tr('-', '_'), klass)
|
42
|
+
end
|
49
43
|
|
50
44
|
# Deprecated.
|
51
45
|
#
|
data/lib/openssl/hmac.rb
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module OpenSSL
|
4
|
+
class HMAC
|
5
|
+
# Securely compare with another HMAC instance in constant time.
|
6
|
+
def ==(other)
|
7
|
+
return false unless HMAC === other
|
8
|
+
return false unless self.digest.bytesize == other.digest.bytesize
|
9
|
+
|
10
|
+
OpenSSL.fixed_length_secure_compare(self.digest, other.digest)
|
11
|
+
end
|
12
|
+
|
13
|
+
# :call-seq:
|
14
|
+
# hmac.base64digest -> string
|
15
|
+
#
|
16
|
+
# Returns the authentication code an a Base64-encoded string.
|
17
|
+
def base64digest
|
18
|
+
[digest].pack("m0")
|
19
|
+
end
|
20
|
+
|
21
|
+
class << self
|
22
|
+
# :call-seq:
|
23
|
+
# HMAC.digest(digest, key, data) -> aString
|
24
|
+
#
|
25
|
+
# Returns the authentication code as a binary string. The _digest_ parameter
|
26
|
+
# specifies the digest algorithm to use. This may be a String representing
|
27
|
+
# the algorithm name or an instance of OpenSSL::Digest.
|
28
|
+
#
|
29
|
+
# === Example
|
30
|
+
# key = 'key'
|
31
|
+
# data = 'The quick brown fox jumps over the lazy dog'
|
32
|
+
#
|
33
|
+
# hmac = OpenSSL::HMAC.digest('SHA1', key, data)
|
34
|
+
# #=> "\xDE|\x9B\x85\xB8\xB7\x8A\xA6\xBC\x8Az6\xF7\n\x90p\x1C\x9D\xB4\xD9"
|
35
|
+
def digest(digest, key, data)
|
36
|
+
hmac = new(key, digest)
|
37
|
+
hmac << data
|
38
|
+
hmac.digest
|
39
|
+
end
|
40
|
+
|
41
|
+
# :call-seq:
|
42
|
+
# HMAC.hexdigest(digest, key, data) -> aString
|
43
|
+
#
|
44
|
+
# Returns the authentication code as a hex-encoded string. The _digest_
|
45
|
+
# parameter specifies the digest algorithm to use. This may be a String
|
46
|
+
# representing the algorithm name or an instance of OpenSSL::Digest.
|
47
|
+
#
|
48
|
+
# === Example
|
49
|
+
# key = 'key'
|
50
|
+
# data = 'The quick brown fox jumps over the lazy dog'
|
51
|
+
#
|
52
|
+
# hmac = OpenSSL::HMAC.hexdigest('SHA1', key, data)
|
53
|
+
# #=> "de7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9"
|
54
|
+
def hexdigest(digest, key, data)
|
55
|
+
hmac = new(key, digest)
|
56
|
+
hmac << data
|
57
|
+
hmac.hexdigest
|
58
|
+
end
|
59
|
+
|
60
|
+
# :call-seq:
|
61
|
+
# HMAC.base64digest(digest, key, data) -> aString
|
62
|
+
#
|
63
|
+
# Returns the authentication code as a Base64-encoded string. The _digest_
|
64
|
+
# parameter specifies the digest algorithm to use. This may be a String
|
65
|
+
# representing the algorithm name or an instance of OpenSSL::Digest.
|
66
|
+
#
|
67
|
+
# === Example
|
68
|
+
# key = 'key'
|
69
|
+
# data = 'The quick brown fox jumps over the lazy dog'
|
70
|
+
#
|
71
|
+
# hmac = OpenSSL::HMAC.base64digest('SHA1', key, data)
|
72
|
+
# #=> "3nybhbi3iqa8ino29wqQcBydtNk="
|
73
|
+
def base64digest(digest, key, data)
|
74
|
+
[digest(digest, key, data)].pack("m0")
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
#--
|
3
|
+
# = Ruby-space definitions to add DER (de)serialization to classes
|
4
|
+
#
|
5
|
+
# = Info
|
6
|
+
# 'OpenSSL for Ruby 2' project
|
7
|
+
# Copyright (C) 2002 Michal Rokos <m.rokos@sh.cvut.cz>
|
8
|
+
# All rights reserved.
|
9
|
+
#
|
10
|
+
# = Licence
|
11
|
+
# This program is licensed under the same licence as Ruby.
|
12
|
+
# (See the file 'LICENCE'.)
|
13
|
+
#++
|
14
|
+
module OpenSSL
|
15
|
+
module Marshal
|
16
|
+
def self.included(base)
|
17
|
+
base.extend(ClassMethods)
|
18
|
+
end
|
19
|
+
|
20
|
+
module ClassMethods
|
21
|
+
def _load(string)
|
22
|
+
new(string)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def _dump(_level)
|
27
|
+
to_der
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/openssl/pkcs5.rb
CHANGED