openssl 3.1.1 → 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/History.md +36 -27
- data/README.md +36 -19
- data/ext/openssl/extconf.rb +35 -8
- data/ext/openssl/ossl.c +73 -195
- data/ext/openssl/ossl.h +5 -6
- data/ext/openssl/ossl_asn1.c +24 -19
- data/ext/openssl/ossl_bn.c +1 -1
- data/ext/openssl/ossl_cipher.c +5 -20
- data/ext/openssl/ossl_config.c +1 -1
- data/ext/openssl/ossl_digest.c +1 -2
- data/ext/openssl/ossl_engine.c +1 -1
- data/ext/openssl/ossl_hmac.c +1 -1
- data/ext/openssl/ossl_kdf.c +1 -1
- data/ext/openssl/ossl_ns_spki.c +1 -1
- data/ext/openssl/ossl_ocsp.c +6 -6
- data/ext/openssl/ossl_pkcs12.c +1 -1
- data/ext/openssl/ossl_pkcs7.c +4 -14
- data/ext/openssl/ossl_pkey.c +217 -44
- data/ext/openssl/ossl_pkey_dh.c +22 -7
- data/ext/openssl/ossl_pkey_dsa.c +57 -8
- data/ext/openssl/ossl_pkey_ec.c +65 -9
- data/ext/openssl/ossl_pkey_rsa.c +68 -13
- data/ext/openssl/ossl_provider.c +211 -0
- data/ext/openssl/ossl_provider.h +5 -0
- data/ext/openssl/ossl_ssl.c +83 -65
- data/ext/openssl/ossl_ssl_session.c +1 -1
- data/ext/openssl/ossl_ts.c +3 -3
- data/ext/openssl/ossl_x509attr.c +1 -1
- data/ext/openssl/ossl_x509cert.c +1 -1
- data/ext/openssl/ossl_x509crl.c +1 -1
- data/ext/openssl/ossl_x509ext.c +13 -7
- data/ext/openssl/ossl_x509name.c +1 -1
- data/ext/openssl/ossl_x509req.c +1 -1
- data/ext/openssl/ossl_x509revoked.c +1 -1
- data/ext/openssl/ossl_x509store.c +12 -5
- data/lib/openssl/buffering.rb +8 -16
- data/lib/openssl/digest.rb +1 -5
- data/lib/openssl/ssl.rb +10 -10
- data/lib/openssl/version.rb +1 -1
- data/lib/openssl/x509.rb +5 -5
- metadata +12 -7
data/ext/openssl/ossl_ssl.c
CHANGED
@@ -77,7 +77,7 @@ static const rb_data_type_t ossl_sslctx_type = {
|
|
77
77
|
{
|
78
78
|
ossl_sslctx_mark, ossl_sslctx_free,
|
79
79
|
},
|
80
|
-
0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
|
80
|
+
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
|
81
81
|
};
|
82
82
|
|
83
83
|
static VALUE
|
@@ -885,9 +885,9 @@ ossl_sslctx_setup(VALUE self)
|
|
885
885
|
if (ca_path && !SSL_CTX_load_verify_dir(ctx, ca_path))
|
886
886
|
ossl_raise(eSSLError, "SSL_CTX_load_verify_dir");
|
887
887
|
#else
|
888
|
-
if(ca_file || ca_path){
|
889
|
-
|
890
|
-
|
888
|
+
if (ca_file || ca_path) {
|
889
|
+
if (!SSL_CTX_load_verify_locations(ctx, ca_file, ca_path))
|
890
|
+
ossl_raise(eSSLError, "SSL_CTX_load_verify_locations");
|
891
891
|
}
|
892
892
|
#endif
|
893
893
|
|
@@ -1553,6 +1553,10 @@ ossl_ssl_mark(void *ptr)
|
|
1553
1553
|
{
|
1554
1554
|
SSL *ssl = ptr;
|
1555
1555
|
rb_gc_mark((VALUE)SSL_get_ex_data(ssl, ossl_ssl_ex_ptr_idx));
|
1556
|
+
|
1557
|
+
// Note: this reference is stored as @verify_callback so we don't need to mark it.
|
1558
|
+
// However we do need to ensure GC compaction won't move it, hence why
|
1559
|
+
// we call rb_gc_mark here.
|
1556
1560
|
rb_gc_mark((VALUE)SSL_get_ex_data(ssl, ossl_ssl_ex_vcb_idx));
|
1557
1561
|
}
|
1558
1562
|
|
@@ -1567,7 +1571,7 @@ const rb_data_type_t ossl_ssl_type = {
|
|
1567
1571
|
{
|
1568
1572
|
ossl_ssl_mark, ossl_ssl_free,
|
1569
1573
|
},
|
1570
|
-
0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
|
1574
|
+
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
|
1571
1575
|
};
|
1572
1576
|
|
1573
1577
|
static VALUE
|
@@ -1646,6 +1650,8 @@ ossl_ssl_initialize(int argc, VALUE *argv, VALUE self)
|
|
1646
1650
|
SSL_set_ex_data(ssl, ossl_ssl_ex_ptr_idx, (void *)self);
|
1647
1651
|
SSL_set_info_callback(ssl, ssl_info_cb);
|
1648
1652
|
verify_cb = rb_attr_get(v_ctx, id_i_verify_callback);
|
1653
|
+
// We don't need to trigger a write barrier because it's already
|
1654
|
+
// an instance variable of this object.
|
1649
1655
|
SSL_set_ex_data(ssl, ossl_ssl_ex_vcb_idx, (void *)verify_cb);
|
1650
1656
|
|
1651
1657
|
rb_call_super(0, NULL);
|
@@ -1653,6 +1659,17 @@ ossl_ssl_initialize(int argc, VALUE *argv, VALUE self)
|
|
1653
1659
|
return self;
|
1654
1660
|
}
|
1655
1661
|
|
1662
|
+
#ifndef HAVE_RB_IO_DESCRIPTOR
|
1663
|
+
static int
|
1664
|
+
io_descriptor_fallback(VALUE io)
|
1665
|
+
{
|
1666
|
+
rb_io_t *fptr;
|
1667
|
+
GetOpenFile(io, fptr);
|
1668
|
+
return fptr->fd;
|
1669
|
+
}
|
1670
|
+
#define rb_io_descriptor io_descriptor_fallback
|
1671
|
+
#endif
|
1672
|
+
|
1656
1673
|
static VALUE
|
1657
1674
|
ossl_ssl_setup(VALUE self)
|
1658
1675
|
{
|
@@ -1668,8 +1685,8 @@ ossl_ssl_setup(VALUE self)
|
|
1668
1685
|
GetOpenFile(io, fptr);
|
1669
1686
|
rb_io_check_readable(fptr);
|
1670
1687
|
rb_io_check_writable(fptr);
|
1671
|
-
if (!SSL_set_fd(ssl, TO_SOCKET(
|
1672
|
-
|
1688
|
+
if (!SSL_set_fd(ssl, TO_SOCKET(rb_io_descriptor(io))))
|
1689
|
+
ossl_raise(eSSLError, "SSL_set_fd");
|
1673
1690
|
|
1674
1691
|
return Qtrue;
|
1675
1692
|
}
|
@@ -1709,21 +1726,25 @@ no_exception_p(VALUE opts)
|
|
1709
1726
|
#endif
|
1710
1727
|
|
1711
1728
|
static void
|
1712
|
-
io_wait_writable(
|
1729
|
+
io_wait_writable(VALUE io)
|
1713
1730
|
{
|
1714
1731
|
#ifdef HAVE_RB_IO_MAYBE_WAIT
|
1715
|
-
rb_io_maybe_wait_writable(errno,
|
1732
|
+
rb_io_maybe_wait_writable(errno, io, RUBY_IO_TIMEOUT_DEFAULT);
|
1716
1733
|
#else
|
1734
|
+
rb_io_t *fptr;
|
1735
|
+
GetOpenFile(io, fptr);
|
1717
1736
|
rb_io_wait_writable(fptr->fd);
|
1718
1737
|
#endif
|
1719
1738
|
}
|
1720
1739
|
|
1721
1740
|
static void
|
1722
|
-
io_wait_readable(
|
1741
|
+
io_wait_readable(VALUE io)
|
1723
1742
|
{
|
1724
1743
|
#ifdef HAVE_RB_IO_MAYBE_WAIT
|
1725
|
-
rb_io_maybe_wait_readable(errno,
|
1744
|
+
rb_io_maybe_wait_readable(errno, io, RUBY_IO_TIMEOUT_DEFAULT);
|
1726
1745
|
#else
|
1746
|
+
rb_io_t *fptr;
|
1747
|
+
GetOpenFile(io, fptr);
|
1727
1748
|
rb_io_wait_readable(fptr->fd);
|
1728
1749
|
#endif
|
1729
1750
|
}
|
@@ -1732,75 +1753,74 @@ static VALUE
|
|
1732
1753
|
ossl_start_ssl(VALUE self, int (*func)(SSL *), const char *funcname, VALUE opts)
|
1733
1754
|
{
|
1734
1755
|
SSL *ssl;
|
1735
|
-
rb_io_t *fptr;
|
1736
1756
|
int ret, ret2;
|
1737
1757
|
VALUE cb_state;
|
1738
1758
|
int nonblock = opts != Qfalse;
|
1739
|
-
#if defined(SSL_R_CERTIFICATE_VERIFY_FAILED)
|
1740
|
-
unsigned long err;
|
1741
|
-
#endif
|
1742
1759
|
|
1743
1760
|
rb_ivar_set(self, ID_callback_state, Qnil);
|
1744
1761
|
|
1745
1762
|
GetSSL(self, ssl);
|
1746
1763
|
|
1747
|
-
|
1748
|
-
for(;;){
|
1749
|
-
|
1764
|
+
VALUE io = rb_attr_get(self, id_i_io);
|
1765
|
+
for (;;) {
|
1766
|
+
ret = func(ssl);
|
1750
1767
|
|
1751
|
-
|
1768
|
+
cb_state = rb_attr_get(self, ID_callback_state);
|
1752
1769
|
if (!NIL_P(cb_state)) {
|
1753
|
-
|
1754
|
-
|
1755
|
-
|
1756
|
-
|
1770
|
+
/* must cleanup OpenSSL error stack before re-raising */
|
1771
|
+
ossl_clear_error();
|
1772
|
+
rb_jump_tag(NUM2INT(cb_state));
|
1773
|
+
}
|
1757
1774
|
|
1758
|
-
|
1759
|
-
|
1775
|
+
if (ret > 0)
|
1776
|
+
break;
|
1760
1777
|
|
1761
|
-
|
1762
|
-
|
1778
|
+
switch ((ret2 = ssl_get_error(ssl, ret))) {
|
1779
|
+
case SSL_ERROR_WANT_WRITE:
|
1763
1780
|
if (no_exception_p(opts)) { return sym_wait_writable; }
|
1764
1781
|
write_would_block(nonblock);
|
1765
|
-
io_wait_writable(
|
1782
|
+
io_wait_writable(io);
|
1766
1783
|
continue;
|
1767
|
-
|
1784
|
+
case SSL_ERROR_WANT_READ:
|
1768
1785
|
if (no_exception_p(opts)) { return sym_wait_readable; }
|
1769
1786
|
read_would_block(nonblock);
|
1770
|
-
io_wait_readable(
|
1787
|
+
io_wait_readable(io);
|
1771
1788
|
continue;
|
1772
|
-
|
1789
|
+
case SSL_ERROR_SYSCALL:
|
1773
1790
|
#ifdef __APPLE__
|
1774
1791
|
/* See ossl_ssl_write_internal() */
|
1775
1792
|
if (errno == EPROTOTYPE)
|
1776
1793
|
continue;
|
1777
1794
|
#endif
|
1778
|
-
|
1779
|
-
|
1780
|
-
|
1781
|
-
|
1795
|
+
if (errno) rb_sys_fail(funcname);
|
1796
|
+
/* fallthrough */
|
1797
|
+
default: {
|
1798
|
+
VALUE error_append = Qnil;
|
1782
1799
|
#if defined(SSL_R_CERTIFICATE_VERIFY_FAILED)
|
1783
|
-
|
1784
|
-
|
1785
|
-
|
1786
|
-
|
1787
|
-
|
1788
|
-
|
1789
|
-
|
1790
|
-
|
1791
|
-
|
1792
|
-
|
1793
|
-
|
1794
|
-
|
1795
|
-
funcname, ret2, errno, peeraddr_ip_str(self), SSL_state_string_long(ssl),
|
1796
|
-
err_msg, verify_msg);
|
1797
|
-
}
|
1800
|
+
unsigned long err = ERR_peek_last_error();
|
1801
|
+
if (ERR_GET_LIB(err) == ERR_LIB_SSL &&
|
1802
|
+
ERR_GET_REASON(err) == SSL_R_CERTIFICATE_VERIFY_FAILED) {
|
1803
|
+
const char *err_msg = ERR_reason_error_string(err),
|
1804
|
+
*verify_msg = X509_verify_cert_error_string(SSL_get_verify_result(ssl));
|
1805
|
+
if (!err_msg)
|
1806
|
+
err_msg = "(null)";
|
1807
|
+
if (!verify_msg)
|
1808
|
+
verify_msg = "(null)";
|
1809
|
+
ossl_clear_error(); /* let ossl_raise() not append message */
|
1810
|
+
error_append = rb_sprintf(": %s (%s)", err_msg, verify_msg);
|
1811
|
+
}
|
1798
1812
|
#endif
|
1799
|
-
|
1800
|
-
|
1801
|
-
|
1802
|
-
|
1803
|
-
|
1813
|
+
ossl_raise(eSSLError,
|
1814
|
+
"%s%s returned=%d errno=%d peeraddr=%"PRIsVALUE" state=%s%"PRIsVALUE,
|
1815
|
+
funcname,
|
1816
|
+
ret2 == SSL_ERROR_SYSCALL ? " SYSCALL" : "",
|
1817
|
+
ret2,
|
1818
|
+
errno,
|
1819
|
+
peeraddr_ip_str(self),
|
1820
|
+
SSL_state_string_long(ssl),
|
1821
|
+
error_append);
|
1822
|
+
}
|
1823
|
+
}
|
1804
1824
|
}
|
1805
1825
|
|
1806
1826
|
return self;
|
@@ -1906,8 +1926,7 @@ ossl_ssl_read_internal(int argc, VALUE *argv, VALUE self, int nonblock)
|
|
1906
1926
|
SSL *ssl;
|
1907
1927
|
int ilen;
|
1908
1928
|
VALUE len, str;
|
1909
|
-
|
1910
|
-
VALUE io, opts = Qnil;
|
1929
|
+
VALUE opts = Qnil;
|
1911
1930
|
|
1912
1931
|
if (nonblock) {
|
1913
1932
|
rb_scan_args(argc, argv, "11:", &len, &str, &opts);
|
@@ -1932,8 +1951,7 @@ ossl_ssl_read_internal(int argc, VALUE *argv, VALUE self, int nonblock)
|
|
1932
1951
|
if (ilen == 0)
|
1933
1952
|
return str;
|
1934
1953
|
|
1935
|
-
io = rb_attr_get(self, id_i_io);
|
1936
|
-
GetOpenFile(io, fptr);
|
1954
|
+
VALUE io = rb_attr_get(self, id_i_io);
|
1937
1955
|
|
1938
1956
|
rb_str_locktmp(str);
|
1939
1957
|
for (;;) {
|
@@ -1953,7 +1971,7 @@ ossl_ssl_read_internal(int argc, VALUE *argv, VALUE self, int nonblock)
|
|
1953
1971
|
if (no_exception_p(opts)) { return sym_wait_writable; }
|
1954
1972
|
write_would_block(nonblock);
|
1955
1973
|
}
|
1956
|
-
io_wait_writable(
|
1974
|
+
io_wait_writable(io);
|
1957
1975
|
continue;
|
1958
1976
|
case SSL_ERROR_WANT_READ:
|
1959
1977
|
if (nonblock) {
|
@@ -1961,7 +1979,7 @@ ossl_ssl_read_internal(int argc, VALUE *argv, VALUE self, int nonblock)
|
|
1961
1979
|
if (no_exception_p(opts)) { return sym_wait_readable; }
|
1962
1980
|
read_would_block(nonblock);
|
1963
1981
|
}
|
1964
|
-
io_wait_readable(
|
1982
|
+
io_wait_readable(io);
|
1965
1983
|
continue;
|
1966
1984
|
case SSL_ERROR_SYSCALL:
|
1967
1985
|
if (!ERR_peek_error()) {
|
@@ -2027,14 +2045,14 @@ ossl_ssl_write_internal(VALUE self, VALUE str, VALUE opts)
|
|
2027
2045
|
SSL *ssl;
|
2028
2046
|
rb_io_t *fptr;
|
2029
2047
|
int num, nonblock = opts != Qfalse;
|
2030
|
-
VALUE tmp
|
2048
|
+
VALUE tmp;
|
2031
2049
|
|
2032
2050
|
GetSSL(self, ssl);
|
2033
2051
|
if (!ssl_started(ssl))
|
2034
2052
|
rb_raise(eSSLError, "SSL session is not started yet");
|
2035
2053
|
|
2036
2054
|
tmp = rb_str_new_frozen(StringValue(str));
|
2037
|
-
io = rb_attr_get(self, id_i_io);
|
2055
|
+
VALUE io = rb_attr_get(self, id_i_io);
|
2038
2056
|
GetOpenFile(io, fptr);
|
2039
2057
|
|
2040
2058
|
/* SSL_write(3ssl) manpage states num == 0 is undefined */
|
@@ -2050,12 +2068,12 @@ ossl_ssl_write_internal(VALUE self, VALUE str, VALUE opts)
|
|
2050
2068
|
case SSL_ERROR_WANT_WRITE:
|
2051
2069
|
if (no_exception_p(opts)) { return sym_wait_writable; }
|
2052
2070
|
write_would_block(nonblock);
|
2053
|
-
io_wait_writable(
|
2071
|
+
io_wait_writable(io);
|
2054
2072
|
continue;
|
2055
2073
|
case SSL_ERROR_WANT_READ:
|
2056
2074
|
if (no_exception_p(opts)) { return sym_wait_readable; }
|
2057
2075
|
read_would_block(nonblock);
|
2058
|
-
io_wait_readable(
|
2076
|
+
io_wait_readable(io);
|
2059
2077
|
continue;
|
2060
2078
|
case SSL_ERROR_SYSCALL:
|
2061
2079
|
#ifdef __APPLE__
|
data/ext/openssl/ossl_ts.c
CHANGED
@@ -83,7 +83,7 @@ static const rb_data_type_t ossl_ts_req_type = {
|
|
83
83
|
{
|
84
84
|
0, ossl_ts_req_free,
|
85
85
|
},
|
86
|
-
0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
|
86
|
+
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
|
87
87
|
};
|
88
88
|
|
89
89
|
static void
|
@@ -97,7 +97,7 @@ static const rb_data_type_t ossl_ts_resp_type = {
|
|
97
97
|
{
|
98
98
|
0, ossl_ts_resp_free,
|
99
99
|
},
|
100
|
-
0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
|
100
|
+
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
|
101
101
|
};
|
102
102
|
|
103
103
|
static void
|
@@ -111,7 +111,7 @@ static const rb_data_type_t ossl_ts_token_info_type = {
|
|
111
111
|
{
|
112
112
|
0, ossl_ts_token_info_free,
|
113
113
|
},
|
114
|
-
0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
|
114
|
+
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
|
115
115
|
};
|
116
116
|
|
117
117
|
static VALUE
|
data/ext/openssl/ossl_x509attr.c
CHANGED
data/ext/openssl/ossl_x509cert.c
CHANGED
data/ext/openssl/ossl_x509crl.c
CHANGED
data/ext/openssl/ossl_x509ext.c
CHANGED
@@ -55,7 +55,7 @@ static const rb_data_type_t ossl_x509ext_type = {
|
|
55
55
|
{
|
56
56
|
0, ossl_x509ext_free,
|
57
57
|
},
|
58
|
-
0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
|
58
|
+
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
|
59
59
|
};
|
60
60
|
|
61
61
|
/*
|
@@ -108,7 +108,7 @@ static const rb_data_type_t ossl_x509extfactory_type = {
|
|
108
108
|
{
|
109
109
|
0, ossl_x509extfactory_free,
|
110
110
|
},
|
111
|
-
0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
|
111
|
+
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
|
112
112
|
};
|
113
113
|
|
114
114
|
static VALUE
|
@@ -209,15 +209,16 @@ ossl_x509extfactory_create_ext(int argc, VALUE *argv, VALUE self)
|
|
209
209
|
int nid;
|
210
210
|
VALUE rconf;
|
211
211
|
CONF *conf;
|
212
|
+
const char *oid_cstr = NULL;
|
212
213
|
|
213
214
|
rb_scan_args(argc, argv, "21", &oid, &value, &critical);
|
214
|
-
StringValueCStr(oid);
|
215
215
|
StringValue(value);
|
216
216
|
if(NIL_P(critical)) critical = Qfalse;
|
217
217
|
|
218
|
-
|
219
|
-
|
220
|
-
if(
|
218
|
+
oid_cstr = StringValueCStr(oid);
|
219
|
+
nid = OBJ_ln2nid(oid_cstr);
|
220
|
+
if (nid != NID_undef)
|
221
|
+
oid_cstr = OBJ_nid2sn(nid);
|
221
222
|
|
222
223
|
valstr = rb_str_new2(RTEST(critical) ? "critical," : "");
|
223
224
|
rb_str_append(valstr, value);
|
@@ -228,7 +229,12 @@ ossl_x509extfactory_create_ext(int argc, VALUE *argv, VALUE self)
|
|
228
229
|
rconf = rb_iv_get(self, "@config");
|
229
230
|
conf = NIL_P(rconf) ? NULL : GetConfig(rconf);
|
230
231
|
X509V3_set_nconf(ctx, conf);
|
231
|
-
|
232
|
+
|
233
|
+
#if OSSL_OPENSSL_PREREQ(1, 1, 0) || OSSL_IS_LIBRESSL
|
234
|
+
ext = X509V3_EXT_nconf(conf, ctx, oid_cstr, RSTRING_PTR(valstr));
|
235
|
+
#else
|
236
|
+
ext = X509V3_EXT_nconf(conf, ctx, (char *)oid_cstr, RSTRING_PTR(valstr));
|
237
|
+
#endif
|
232
238
|
X509V3_set_ctx_nodb(ctx);
|
233
239
|
if (!ext){
|
234
240
|
ossl_raise(eX509ExtError, "%"PRIsVALUE" = %"PRIsVALUE, oid, valstr);
|
data/ext/openssl/ossl_x509name.c
CHANGED
data/ext/openssl/ossl_x509req.c
CHANGED
@@ -116,6 +116,9 @@ static void
|
|
116
116
|
ossl_x509store_mark(void *ptr)
|
117
117
|
{
|
118
118
|
X509_STORE *store = ptr;
|
119
|
+
// Note: this reference is stored as @verify_callback so we don't need to mark it.
|
120
|
+
// However we do need to ensure GC compaction won't move it, hence why
|
121
|
+
// we call rb_gc_mark here.
|
119
122
|
rb_gc_mark((VALUE)X509_STORE_get_ex_data(store, store_ex_verify_cb_idx));
|
120
123
|
}
|
121
124
|
|
@@ -130,7 +133,7 @@ static const rb_data_type_t ossl_x509store_type = {
|
|
130
133
|
{
|
131
134
|
ossl_x509store_mark, ossl_x509store_free,
|
132
135
|
},
|
133
|
-
0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
|
136
|
+
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
|
134
137
|
};
|
135
138
|
|
136
139
|
/*
|
@@ -187,8 +190,9 @@ ossl_x509store_set_vfy_cb(VALUE self, VALUE cb)
|
|
187
190
|
X509_STORE *store;
|
188
191
|
|
189
192
|
GetX509Store(self, store);
|
190
|
-
X509_STORE_set_ex_data(store, store_ex_verify_cb_idx, (void *)cb);
|
191
193
|
rb_iv_set(self, "@verify_callback", cb);
|
194
|
+
// We don't need to trigger a write barrier because `rb_iv_set` did it.
|
195
|
+
X509_STORE_set_ex_data(store, store_ex_verify_cb_idx, (void *)cb);
|
192
196
|
|
193
197
|
return cb;
|
194
198
|
}
|
@@ -507,6 +511,9 @@ static void
|
|
507
511
|
ossl_x509stctx_mark(void *ptr)
|
508
512
|
{
|
509
513
|
X509_STORE_CTX *ctx = ptr;
|
514
|
+
// Note: this reference is stored as @verify_callback so we don't need to mark it.
|
515
|
+
// However we do need to ensure GC compaction won't move it, hence why
|
516
|
+
// we call rb_gc_mark here.
|
510
517
|
rb_gc_mark((VALUE)X509_STORE_CTX_get_ex_data(ctx, stctx_ex_verify_cb_idx));
|
511
518
|
}
|
512
519
|
|
@@ -526,7 +533,7 @@ static const rb_data_type_t ossl_x509stctx_type = {
|
|
526
533
|
{
|
527
534
|
ossl_x509stctx_mark, ossl_x509stctx_free,
|
528
535
|
},
|
529
|
-
0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
|
536
|
+
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
|
530
537
|
};
|
531
538
|
|
532
539
|
static VALUE
|
@@ -614,8 +621,8 @@ ossl_x509stctx_verify(VALUE self)
|
|
614
621
|
X509_STORE_CTX *ctx;
|
615
622
|
|
616
623
|
GetX509StCtx(self, ctx);
|
617
|
-
|
618
|
-
|
624
|
+
VALUE cb = rb_iv_get(self, "@verify_callback");
|
625
|
+
X509_STORE_CTX_set_ex_data(ctx, stctx_ex_verify_cb_idx, (void *)cb);
|
619
626
|
|
620
627
|
switch (X509_verify_cert(ctx)) {
|
621
628
|
case 1:
|
data/lib/openssl/buffering.rb
CHANGED
@@ -93,9 +93,7 @@ module OpenSSL::Buffering
|
|
93
93
|
nil
|
94
94
|
else
|
95
95
|
size = @rbuffer.size unless size
|
96
|
-
|
97
|
-
@rbuffer[0, size] = ""
|
98
|
-
ret
|
96
|
+
@rbuffer.slice!(0, size)
|
99
97
|
end
|
100
98
|
end
|
101
99
|
|
@@ -106,8 +104,7 @@ module OpenSSL::Buffering
|
|
106
104
|
#
|
107
105
|
# Get the next 8bit byte from `ssl`. Returns `nil` on EOF
|
108
106
|
def getbyte
|
109
|
-
|
110
|
-
byte && byte.unpack1("C")
|
107
|
+
read(1)&.ord
|
111
108
|
end
|
112
109
|
|
113
110
|
##
|
@@ -348,18 +345,13 @@ module OpenSSL::Buffering
|
|
348
345
|
@wbuffer << s
|
349
346
|
@wbuffer.force_encoding(Encoding::BINARY)
|
350
347
|
@sync ||= false
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
nwrote += syswrite(@wbuffer[nwrote, buffer_size - nwrote])
|
358
|
-
rescue Errno::EAGAIN
|
359
|
-
retry
|
360
|
-
end
|
348
|
+
if @sync or @wbuffer.size > BLOCK_SIZE
|
349
|
+
until @wbuffer.empty?
|
350
|
+
begin
|
351
|
+
nwrote = syswrite(@wbuffer)
|
352
|
+
rescue Errno::EAGAIN
|
353
|
+
retry
|
361
354
|
end
|
362
|
-
ensure
|
363
355
|
@wbuffer[0, nwrote] = ""
|
364
356
|
end
|
365
357
|
end
|
data/lib/openssl/digest.rb
CHANGED
@@ -18,13 +18,9 @@ module OpenSSL
|
|
18
18
|
# Return the hash value computed with _name_ Digest. _name_ is either the
|
19
19
|
# long name or short name of a supported digest algorithm.
|
20
20
|
#
|
21
|
-
# ===
|
21
|
+
# === Example
|
22
22
|
#
|
23
23
|
# OpenSSL::Digest.digest("SHA256", "abc")
|
24
|
-
#
|
25
|
-
# which is equivalent to:
|
26
|
-
#
|
27
|
-
# OpenSSL::Digest.digest('SHA256', "abc")
|
28
24
|
|
29
25
|
def self.digest(name, data)
|
30
26
|
super(data, name)
|
data/lib/openssl/ssl.rb
CHANGED
@@ -34,21 +34,21 @@ module OpenSSL
|
|
34
34
|
}
|
35
35
|
|
36
36
|
if defined?(OpenSSL::PKey::DH)
|
37
|
-
|
37
|
+
DH_ffdhe2048 = OpenSSL::PKey::DH.new <<-_end_of_pem_
|
38
38
|
-----BEGIN DH PARAMETERS-----
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
39
|
+
MIIBCAKCAQEA//////////+t+FRYortKmq/cViAnPTzx2LnFg84tNpWp4TZBFGQz
|
40
|
+
+8yTnc4kmz75fS/jY2MMddj2gbICrsRhetPfHtXV/WVhJDP1H18GbtCFY2VVPe0a
|
41
|
+
87VXE15/V8k1mE8McODmi3fipona8+/och3xWKE2rec1MKzKT0g6eXq8CrGCsyT7
|
42
|
+
YdEIqUuyyOP7uWrat2DX9GgdT0Kj3jlN9K5W7edjcrsZCwenyO4KbXCeAvzhzffi
|
43
|
+
7MA0BM0oNC9hkXL+nOmFg/+OTxIy7vKBg8P+OxtMb61zO7X8vC7CIAXFjvGDfRaD
|
44
|
+
ssbzSibBsu/6iGtCOGEoXJf//////////wIBAg==
|
45
45
|
-----END DH PARAMETERS-----
|
46
46
|
_end_of_pem_
|
47
|
-
private_constant :
|
47
|
+
private_constant :DH_ffdhe2048
|
48
48
|
|
49
49
|
DEFAULT_TMP_DH_CALLBACK = lambda { |ctx, is_export, keylen| # :nodoc:
|
50
50
|
warn "using default DH parameters." if $VERBOSE
|
51
|
-
|
51
|
+
DH_ffdhe2048
|
52
52
|
}
|
53
53
|
end
|
54
54
|
|
@@ -494,7 +494,7 @@ YoaOffgTf5qxiwkjnlVZQc3whgnEt9FpVMvQ9eknyeGB5KHfayAc3+hUAvI3/Cr3
|
|
494
494
|
unless ctx.session_id_context
|
495
495
|
# see #6137 - session id may not exceed 32 bytes
|
496
496
|
prng = ::Random.new($0.hash)
|
497
|
-
session_id = prng.bytes(16).
|
497
|
+
session_id = prng.bytes(16).unpack1('H*')
|
498
498
|
@ctx.session_id_context = session_id
|
499
499
|
end
|
500
500
|
@start_immediately = true
|
data/lib/openssl/version.rb
CHANGED
data/lib/openssl/x509.rb
CHANGED
@@ -122,8 +122,8 @@ module OpenSSL
|
|
122
122
|
include Helpers
|
123
123
|
|
124
124
|
# Get the distributionPoint fullName URI from the certificate's CRL
|
125
|
-
# distribution points extension, as described in
|
126
|
-
# 4.2.1.13
|
125
|
+
# distribution points extension, as described in RFC5280 Section
|
126
|
+
# 4.2.1.13
|
127
127
|
#
|
128
128
|
# Returns an array of strings or nil or raises ASN1::ASN1Error.
|
129
129
|
def crl_uris
|
@@ -135,19 +135,19 @@ module OpenSSL
|
|
135
135
|
raise ASN1::ASN1Error, "invalid extension"
|
136
136
|
end
|
137
137
|
|
138
|
-
crl_uris = cdp_asn1.
|
138
|
+
crl_uris = cdp_asn1.map do |crl_distribution_point|
|
139
139
|
distribution_point = crl_distribution_point.value.find do |v|
|
140
140
|
v.tag_class == :CONTEXT_SPECIFIC && v.tag == 0
|
141
141
|
end
|
142
142
|
full_name = distribution_point&.value&.find do |v|
|
143
143
|
v.tag_class == :CONTEXT_SPECIFIC && v.tag == 0
|
144
144
|
end
|
145
|
-
full_name&.value&.
|
145
|
+
full_name&.value&.find do |v|
|
146
146
|
v.tag_class == :CONTEXT_SPECIFIC && v.tag == 6 # uniformResourceIdentifier
|
147
147
|
end
|
148
148
|
end
|
149
149
|
|
150
|
-
crl_uris
|
150
|
+
crl_uris&.map(&:value)
|
151
151
|
end
|
152
152
|
end
|
153
153
|
|