openssl 2.1.1 → 2.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.md +81 -0
- data/ext/openssl/deprecation.rb +5 -1
- data/ext/openssl/extconf.rb +31 -16
- data/ext/openssl/openssl_missing.h +3 -3
- data/ext/openssl/ossl.c +3 -2
- data/ext/openssl/ossl.h +1 -1
- data/ext/openssl/ossl_asn1.c +2 -1
- data/ext/openssl/ossl_bn.c +27 -14
- data/ext/openssl/ossl_digest.c +6 -2
- data/ext/openssl/ossl_pkcs12.c +1 -0
- data/ext/openssl/ossl_pkcs7.c +1 -0
- data/ext/openssl/ossl_pkey.c +26 -3
- data/ext/openssl/ossl_pkey.h +6 -6
- data/ext/openssl/ossl_pkey_dh.c +1 -1
- data/ext/openssl/ossl_pkey_ec.c +9 -8
- data/ext/openssl/ossl_rand.c +0 -8
- data/ext/openssl/ossl_ssl.c +111 -33
- data/ext/openssl/ossl_version.h +1 -1
- data/ext/openssl/ossl_x509.c +91 -0
- data/ext/openssl/ossl_x509ext.c +1 -0
- data/ext/openssl/ossl_x509name.c +8 -7
- data/ext/openssl/ossl_x509store.c +40 -22
- data/lib/openssl/buffering.rb +5 -12
- data/lib/openssl/config.rb +36 -18
- data/lib/openssl/ssl.rb +6 -5
- metadata +22 -9
data/ext/openssl/ossl_ssl.c
CHANGED
@@ -13,6 +13,12 @@
|
|
13
13
|
|
14
14
|
#define numberof(ary) (int)(sizeof(ary)/sizeof((ary)[0]))
|
15
15
|
|
16
|
+
#if !defined(TLS1_3_VERSION) && \
|
17
|
+
defined(LIBRESSL_VERSION_NUMBER) && \
|
18
|
+
LIBRESSL_VERSION_NUMBER >= 0x3020000fL
|
19
|
+
# define TLS1_3_VERSION 0x0304
|
20
|
+
#endif
|
21
|
+
|
16
22
|
#ifdef _WIN32
|
17
23
|
# define TO_SOCKET(s) _get_osfhandle(s)
|
18
24
|
#else
|
@@ -33,7 +39,7 @@ static VALUE eSSLErrorWaitReadable;
|
|
33
39
|
static VALUE eSSLErrorWaitWritable;
|
34
40
|
|
35
41
|
static ID id_call, ID_callback_state, id_tmp_dh_callback, id_tmp_ecdh_callback,
|
36
|
-
id_npn_protocols_encoded;
|
42
|
+
id_npn_protocols_encoded, id_each;
|
37
43
|
static VALUE sym_exception, sym_wait_readable, sym_wait_writable;
|
38
44
|
|
39
45
|
static ID id_i_cert_store, id_i_ca_file, id_i_ca_path, id_i_verify_mode,
|
@@ -53,6 +59,13 @@ static int ossl_sslctx_ex_ptr_idx;
|
|
53
59
|
static int ossl_sslctx_ex_store_p;
|
54
60
|
#endif
|
55
61
|
|
62
|
+
static void
|
63
|
+
ossl_sslctx_mark(void *ptr)
|
64
|
+
{
|
65
|
+
SSL_CTX *ctx = ptr;
|
66
|
+
rb_gc_mark((VALUE)SSL_CTX_get_ex_data(ctx, ossl_sslctx_ex_ptr_idx));
|
67
|
+
}
|
68
|
+
|
56
69
|
static void
|
57
70
|
ossl_sslctx_free(void *ptr)
|
58
71
|
{
|
@@ -67,7 +80,7 @@ ossl_sslctx_free(void *ptr)
|
|
67
80
|
static const rb_data_type_t ossl_sslctx_type = {
|
68
81
|
"OpenSSL/SSL/CTX",
|
69
82
|
{
|
70
|
-
|
83
|
+
ossl_sslctx_mark, ossl_sslctx_free,
|
71
84
|
},
|
72
85
|
0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
|
73
86
|
};
|
@@ -184,8 +197,10 @@ ossl_sslctx_set_minmax_proto_version(VALUE self, VALUE min_v, VALUE max_v)
|
|
184
197
|
|
185
198
|
for (i = 0; i < numberof(options_map); i++) {
|
186
199
|
sum |= options_map[i].opts;
|
187
|
-
|
200
|
+
if ((min && min > options_map[i].ver) ||
|
201
|
+
(max && max < options_map[i].ver)) {
|
188
202
|
opts |= options_map[i].opts;
|
203
|
+
}
|
189
204
|
}
|
190
205
|
SSL_CTX_clear_options(ctx, sum);
|
191
206
|
SSL_CTX_set_options(ctx, opts);
|
@@ -357,7 +372,14 @@ ossl_ssl_verify_callback(int preverify_ok, X509_STORE_CTX *ctx)
|
|
357
372
|
rb_ivar_set(ssl_obj, ID_callback_state, INT2NUM(status));
|
358
373
|
return 0;
|
359
374
|
}
|
360
|
-
|
375
|
+
if (ret != Qtrue) {
|
376
|
+
preverify_ok = 0;
|
377
|
+
#if defined(X509_V_ERR_HOSTNAME_MISMATCH)
|
378
|
+
X509_STORE_CTX_set_error(ctx, X509_V_ERR_HOSTNAME_MISMATCH);
|
379
|
+
#else
|
380
|
+
X509_STORE_CTX_set_error(ctx, X509_V_ERR_CERT_REJECTED);
|
381
|
+
#endif
|
382
|
+
}
|
361
383
|
}
|
362
384
|
|
363
385
|
return ossl_verify_cb_call(cb, preverify_ok, ctx);
|
@@ -378,7 +400,7 @@ ossl_call_session_get_cb(VALUE ary)
|
|
378
400
|
}
|
379
401
|
|
380
402
|
static SSL_SESSION *
|
381
|
-
#if OPENSSL_VERSION_NUMBER >= 0x10100000
|
403
|
+
#if (!defined(LIBRESSL_VERSION_NUMBER) ? OPENSSL_VERSION_NUMBER >= 0x10100000 : LIBRESSL_VERSION_NUMBER >= 0x2080000f)
|
382
404
|
ossl_sslctx_session_get_cb(SSL *ssl, const unsigned char *buf, int len, int *copy)
|
383
405
|
#else
|
384
406
|
ossl_sslctx_session_get_cb(SSL *ssl, unsigned char *buf, int len, int *copy)
|
@@ -590,7 +612,7 @@ ssl_renegotiation_cb(const SSL *ssl)
|
|
590
612
|
#if !defined(OPENSSL_NO_NEXTPROTONEG) || \
|
591
613
|
defined(HAVE_SSL_CTX_SET_ALPN_SELECT_CB)
|
592
614
|
static VALUE
|
593
|
-
ssl_npn_encode_protocol_i(
|
615
|
+
ssl_npn_encode_protocol_i(RB_BLOCK_CALL_FUNC_ARGLIST(cur, encoded))
|
594
616
|
{
|
595
617
|
int len = RSTRING_LENINT(cur);
|
596
618
|
char len_byte;
|
@@ -607,7 +629,7 @@ static VALUE
|
|
607
629
|
ssl_encode_npn_protocols(VALUE protocols)
|
608
630
|
{
|
609
631
|
VALUE encoded = rb_str_new(NULL, 0);
|
610
|
-
|
632
|
+
rb_block_call(protocols, id_each, 0, 0, ssl_npn_encode_protocol_i, encoded);
|
611
633
|
return encoded;
|
612
634
|
}
|
613
635
|
|
@@ -677,7 +699,7 @@ static int
|
|
677
699
|
ssl_npn_advertise_cb(SSL *ssl, const unsigned char **out, unsigned int *outlen,
|
678
700
|
void *arg)
|
679
701
|
{
|
680
|
-
VALUE protocols = (VALUE)arg;
|
702
|
+
VALUE protocols = rb_attr_get((VALUE)arg, id_npn_protocols_encoded);
|
681
703
|
|
682
704
|
*out = (const unsigned char *) RSTRING_PTR(protocols);
|
683
705
|
*outlen = RSTRING_LENINT(protocols);
|
@@ -895,7 +917,7 @@ ossl_sslctx_setup(VALUE self)
|
|
895
917
|
if (!NIL_P(val)) {
|
896
918
|
VALUE encoded = ssl_encode_npn_protocols(val);
|
897
919
|
rb_ivar_set(self, id_npn_protocols_encoded, encoded);
|
898
|
-
SSL_CTX_set_next_protos_advertised_cb(ctx, ssl_npn_advertise_cb, (void *)
|
920
|
+
SSL_CTX_set_next_protos_advertised_cb(ctx, ssl_npn_advertise_cb, (void *)self);
|
899
921
|
OSSL_Debug("SSL NPN advertise callback added");
|
900
922
|
}
|
901
923
|
if (RTEST(rb_attr_get(self, id_i_npn_select_cb))) {
|
@@ -1513,6 +1535,14 @@ ssl_started(SSL *ssl)
|
|
1513
1535
|
return SSL_get_fd(ssl) >= 0;
|
1514
1536
|
}
|
1515
1537
|
|
1538
|
+
static void
|
1539
|
+
ossl_ssl_mark(void *ptr)
|
1540
|
+
{
|
1541
|
+
SSL *ssl = ptr;
|
1542
|
+
rb_gc_mark((VALUE)SSL_get_ex_data(ssl, ossl_ssl_ex_ptr_idx));
|
1543
|
+
rb_gc_mark((VALUE)SSL_get_ex_data(ssl, ossl_ssl_ex_vcb_idx));
|
1544
|
+
}
|
1545
|
+
|
1516
1546
|
static void
|
1517
1547
|
ossl_ssl_free(void *ssl)
|
1518
1548
|
{
|
@@ -1522,7 +1552,7 @@ ossl_ssl_free(void *ssl)
|
|
1522
1552
|
const rb_data_type_t ossl_ssl_type = {
|
1523
1553
|
"OpenSSL/SSL",
|
1524
1554
|
{
|
1525
|
-
|
1555
|
+
ossl_ssl_mark, ossl_ssl_free,
|
1526
1556
|
},
|
1527
1557
|
0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
|
1528
1558
|
};
|
@@ -1678,6 +1708,11 @@ ossl_start_ssl(VALUE self, int (*func)(), const char *funcname, VALUE opts)
|
|
1678
1708
|
rb_io_wait_readable(fptr->fd);
|
1679
1709
|
continue;
|
1680
1710
|
case SSL_ERROR_SYSCALL:
|
1711
|
+
#ifdef __APPLE__
|
1712
|
+
/* See ossl_ssl_write_internal() */
|
1713
|
+
if (errno == EPROTOTYPE)
|
1714
|
+
continue;
|
1715
|
+
#endif
|
1681
1716
|
if (errno) rb_sys_fail(funcname);
|
1682
1717
|
ossl_raise(eSSLError, "%s SYSCALL returned=%d errno=%d state=%s", funcname, ret2, errno, SSL_state_string_long(ssl));
|
1683
1718
|
#if defined(SSL_R_CERTIFICATE_VERIFY_FAILED)
|
@@ -1826,7 +1861,6 @@ ossl_ssl_read_internal(int argc, VALUE *argv, VALUE self, int nonblock)
|
|
1826
1861
|
else
|
1827
1862
|
rb_str_modify_expand(str, ilen - RSTRING_LEN(str));
|
1828
1863
|
}
|
1829
|
-
OBJ_TAINT(str);
|
1830
1864
|
rb_str_set_len(str, 0);
|
1831
1865
|
if (ilen == 0)
|
1832
1866
|
return str;
|
@@ -1835,26 +1869,36 @@ ossl_ssl_read_internal(int argc, VALUE *argv, VALUE self, int nonblock)
|
|
1835
1869
|
io = rb_attr_get(self, id_i_io);
|
1836
1870
|
GetOpenFile(io, fptr);
|
1837
1871
|
if (ssl_started(ssl)) {
|
1838
|
-
|
1872
|
+
rb_str_locktmp(str);
|
1873
|
+
for (;;) {
|
1839
1874
|
nread = SSL_read(ssl, RSTRING_PTR(str), ilen);
|
1840
1875
|
switch(ssl_get_error(ssl, nread)){
|
1841
1876
|
case SSL_ERROR_NONE:
|
1877
|
+
rb_str_unlocktmp(str);
|
1842
1878
|
goto end;
|
1843
1879
|
case SSL_ERROR_ZERO_RETURN:
|
1880
|
+
rb_str_unlocktmp(str);
|
1844
1881
|
if (no_exception_p(opts)) { return Qnil; }
|
1845
1882
|
rb_eof_error();
|
1846
1883
|
case SSL_ERROR_WANT_WRITE:
|
1847
|
-
|
1848
|
-
|
1884
|
+
if (nonblock) {
|
1885
|
+
rb_str_unlocktmp(str);
|
1886
|
+
if (no_exception_p(opts)) { return sym_wait_writable; }
|
1887
|
+
write_would_block(nonblock);
|
1888
|
+
}
|
1849
1889
|
rb_io_wait_writable(fptr->fd);
|
1850
1890
|
continue;
|
1851
1891
|
case SSL_ERROR_WANT_READ:
|
1852
|
-
|
1853
|
-
|
1892
|
+
if (nonblock) {
|
1893
|
+
rb_str_unlocktmp(str);
|
1894
|
+
if (no_exception_p(opts)) { return sym_wait_readable; }
|
1895
|
+
read_would_block(nonblock);
|
1896
|
+
}
|
1854
1897
|
rb_io_wait_readable(fptr->fd);
|
1855
1898
|
continue;
|
1856
1899
|
case SSL_ERROR_SYSCALL:
|
1857
1900
|
if (!ERR_peek_error()) {
|
1901
|
+
rb_str_unlocktmp(str);
|
1858
1902
|
if (errno)
|
1859
1903
|
rb_sys_fail(0);
|
1860
1904
|
else {
|
@@ -1869,19 +1913,32 @@ ossl_ssl_read_internal(int argc, VALUE *argv, VALUE self, int nonblock)
|
|
1869
1913
|
rb_eof_error();
|
1870
1914
|
}
|
1871
1915
|
}
|
1916
|
+
/* fall through */
|
1872
1917
|
default:
|
1918
|
+
rb_str_unlocktmp(str);
|
1873
1919
|
ossl_raise(eSSLError, "SSL_read");
|
1874
1920
|
}
|
1875
1921
|
}
|
1876
1922
|
}
|
1877
1923
|
else {
|
1878
|
-
|
1879
|
-
|
1880
|
-
|
1881
|
-
|
1882
|
-
|
1883
|
-
|
1884
|
-
|
1924
|
+
ID meth = nonblock ? rb_intern("read_nonblock") : rb_intern("sysread");
|
1925
|
+
|
1926
|
+
rb_warning("SSL session is not started yet.");
|
1927
|
+
#if defined(RB_PASS_KEYWORDS)
|
1928
|
+
if (nonblock) {
|
1929
|
+
VALUE argv[3];
|
1930
|
+
argv[0] = len;
|
1931
|
+
argv[1] = str;
|
1932
|
+
argv[2] = opts;
|
1933
|
+
return rb_funcallv_kw(io, meth, 3, argv, RB_PASS_KEYWORDS);
|
1934
|
+
}
|
1935
|
+
#else
|
1936
|
+
if (nonblock) {
|
1937
|
+
return rb_funcall(io, meth, 3, len, str, opts);
|
1938
|
+
}
|
1939
|
+
#endif
|
1940
|
+
else
|
1941
|
+
return rb_funcall(io, meth, 2, len, str);
|
1885
1942
|
}
|
1886
1943
|
|
1887
1944
|
end:
|
@@ -1929,21 +1986,21 @@ ossl_ssl_write_internal(VALUE self, VALUE str, VALUE opts)
|
|
1929
1986
|
int nwrite = 0;
|
1930
1987
|
rb_io_t *fptr;
|
1931
1988
|
int nonblock = opts != Qfalse;
|
1932
|
-
VALUE io;
|
1989
|
+
VALUE tmp, io;
|
1933
1990
|
|
1934
|
-
StringValue(str);
|
1991
|
+
tmp = rb_str_new_frozen(StringValue(str));
|
1935
1992
|
GetSSL(self, ssl);
|
1936
1993
|
io = rb_attr_get(self, id_i_io);
|
1937
1994
|
GetOpenFile(io, fptr);
|
1938
1995
|
if (ssl_started(ssl)) {
|
1939
|
-
for (;;){
|
1940
|
-
int num = RSTRING_LENINT(
|
1996
|
+
for (;;) {
|
1997
|
+
int num = RSTRING_LENINT(tmp);
|
1941
1998
|
|
1942
1999
|
/* SSL_write(3ssl) manpage states num == 0 is undefined */
|
1943
2000
|
if (num == 0)
|
1944
2001
|
goto end;
|
1945
2002
|
|
1946
|
-
nwrite = SSL_write(ssl, RSTRING_PTR(
|
2003
|
+
nwrite = SSL_write(ssl, RSTRING_PTR(tmp), num);
|
1947
2004
|
switch(ssl_get_error(ssl, nwrite)){
|
1948
2005
|
case SSL_ERROR_NONE:
|
1949
2006
|
goto end;
|
@@ -1958,6 +2015,16 @@ ossl_ssl_write_internal(VALUE self, VALUE str, VALUE opts)
|
|
1958
2015
|
rb_io_wait_readable(fptr->fd);
|
1959
2016
|
continue;
|
1960
2017
|
case SSL_ERROR_SYSCALL:
|
2018
|
+
#ifdef __APPLE__
|
2019
|
+
/*
|
2020
|
+
* It appears that send syscall can return EPROTOTYPE if the
|
2021
|
+
* socket is being torn down. Retry to get a proper errno to
|
2022
|
+
* make the error handling in line with the socket library.
|
2023
|
+
* [Bug #14713] https://bugs.ruby-lang.org/issues/14713
|
2024
|
+
*/
|
2025
|
+
if (errno == EPROTOTYPE)
|
2026
|
+
continue;
|
2027
|
+
#endif
|
1961
2028
|
if (errno) rb_sys_fail(0);
|
1962
2029
|
default:
|
1963
2030
|
ossl_raise(eSSLError, "SSL_write");
|
@@ -1968,11 +2035,21 @@ ossl_ssl_write_internal(VALUE self, VALUE str, VALUE opts)
|
|
1968
2035
|
ID meth = nonblock ?
|
1969
2036
|
rb_intern("write_nonblock") : rb_intern("syswrite");
|
1970
2037
|
|
1971
|
-
|
1972
|
-
|
1973
|
-
|
1974
|
-
|
1975
|
-
|
2038
|
+
rb_warning("SSL session is not started yet.");
|
2039
|
+
#if defined(RB_PASS_KEYWORDS)
|
2040
|
+
if (nonblock) {
|
2041
|
+
VALUE argv[2];
|
2042
|
+
argv[0] = str;
|
2043
|
+
argv[1] = opts;
|
2044
|
+
return rb_funcallv_kw(io, meth, 2, argv, RB_PASS_KEYWORDS);
|
2045
|
+
}
|
2046
|
+
#else
|
2047
|
+
if (nonblock) {
|
2048
|
+
return rb_funcall(io, meth, 2, str, opts);
|
2049
|
+
}
|
2050
|
+
#endif
|
2051
|
+
else
|
2052
|
+
return rb_funcall(io, meth, 1, str);
|
1976
2053
|
}
|
1977
2054
|
|
1978
2055
|
end:
|
@@ -2915,6 +2992,7 @@ Init_ossl_ssl(void)
|
|
2915
2992
|
id_tmp_dh_callback = rb_intern("tmp_dh_callback");
|
2916
2993
|
id_tmp_ecdh_callback = rb_intern("tmp_ecdh_callback");
|
2917
2994
|
id_npn_protocols_encoded = rb_intern("npn_protocols_encoded");
|
2995
|
+
id_each = rb_intern_const("each");
|
2918
2996
|
|
2919
2997
|
#define DefIVarID(name) do \
|
2920
2998
|
id_i_##name = rb_intern("@"#name); while (0)
|
data/ext/openssl/ossl_version.h
CHANGED
data/ext/openssl/ossl_x509.c
CHANGED
@@ -44,7 +44,13 @@ Init_ossl_x509(void)
|
|
44
44
|
Init_ossl_x509revoked();
|
45
45
|
Init_ossl_x509store();
|
46
46
|
|
47
|
+
/* Constants are up-to-date with 1.1.1. */
|
48
|
+
|
49
|
+
/* Certificate verification error code */
|
47
50
|
DefX509Const(V_OK);
|
51
|
+
#if defined(X509_V_ERR_UNSPECIFIED) /* 1.0.1r, 1.0.2f, 1.1.0 */
|
52
|
+
DefX509Const(V_ERR_UNSPECIFIED);
|
53
|
+
#endif
|
48
54
|
DefX509Const(V_ERR_UNABLE_TO_GET_ISSUER_CERT);
|
49
55
|
DefX509Const(V_ERR_UNABLE_TO_GET_CRL);
|
50
56
|
DefX509Const(V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE);
|
@@ -76,8 +82,73 @@ Init_ossl_x509(void)
|
|
76
82
|
DefX509Const(V_ERR_AKID_SKID_MISMATCH);
|
77
83
|
DefX509Const(V_ERR_AKID_ISSUER_SERIAL_MISMATCH);
|
78
84
|
DefX509Const(V_ERR_KEYUSAGE_NO_CERTSIGN);
|
85
|
+
DefX509Const(V_ERR_UNABLE_TO_GET_CRL_ISSUER);
|
86
|
+
DefX509Const(V_ERR_UNHANDLED_CRITICAL_EXTENSION);
|
87
|
+
DefX509Const(V_ERR_KEYUSAGE_NO_CRL_SIGN);
|
88
|
+
DefX509Const(V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION);
|
89
|
+
DefX509Const(V_ERR_INVALID_NON_CA);
|
90
|
+
DefX509Const(V_ERR_PROXY_PATH_LENGTH_EXCEEDED);
|
91
|
+
DefX509Const(V_ERR_KEYUSAGE_NO_DIGITAL_SIGNATURE);
|
92
|
+
DefX509Const(V_ERR_PROXY_CERTIFICATES_NOT_ALLOWED);
|
93
|
+
DefX509Const(V_ERR_INVALID_EXTENSION);
|
94
|
+
DefX509Const(V_ERR_INVALID_POLICY_EXTENSION);
|
95
|
+
DefX509Const(V_ERR_NO_EXPLICIT_POLICY);
|
96
|
+
DefX509Const(V_ERR_DIFFERENT_CRL_SCOPE);
|
97
|
+
DefX509Const(V_ERR_UNSUPPORTED_EXTENSION_FEATURE);
|
98
|
+
DefX509Const(V_ERR_UNNESTED_RESOURCE);
|
99
|
+
DefX509Const(V_ERR_PERMITTED_VIOLATION);
|
100
|
+
DefX509Const(V_ERR_EXCLUDED_VIOLATION);
|
101
|
+
DefX509Const(V_ERR_SUBTREE_MINMAX);
|
79
102
|
DefX509Const(V_ERR_APPLICATION_VERIFICATION);
|
103
|
+
DefX509Const(V_ERR_UNSUPPORTED_CONSTRAINT_TYPE);
|
104
|
+
DefX509Const(V_ERR_UNSUPPORTED_CONSTRAINT_SYNTAX);
|
105
|
+
DefX509Const(V_ERR_UNSUPPORTED_NAME_SYNTAX);
|
106
|
+
DefX509Const(V_ERR_CRL_PATH_VALIDATION_ERROR);
|
107
|
+
#if defined(X509_V_ERR_PATH_LOOP)
|
108
|
+
DefX509Const(V_ERR_PATH_LOOP);
|
109
|
+
#endif
|
110
|
+
#if defined(X509_V_ERR_SUITE_B_INVALID_VERSION)
|
111
|
+
DefX509Const(V_ERR_SUITE_B_INVALID_VERSION);
|
112
|
+
DefX509Const(V_ERR_SUITE_B_INVALID_ALGORITHM);
|
113
|
+
DefX509Const(V_ERR_SUITE_B_INVALID_CURVE);
|
114
|
+
DefX509Const(V_ERR_SUITE_B_INVALID_SIGNATURE_ALGORITHM);
|
115
|
+
DefX509Const(V_ERR_SUITE_B_LOS_NOT_ALLOWED);
|
116
|
+
DefX509Const(V_ERR_SUITE_B_CANNOT_SIGN_P_384_WITH_P_256);
|
117
|
+
#endif
|
118
|
+
#if defined(X509_V_ERR_HOSTNAME_MISMATCH)
|
119
|
+
DefX509Const(V_ERR_HOSTNAME_MISMATCH);
|
120
|
+
DefX509Const(V_ERR_EMAIL_MISMATCH);
|
121
|
+
DefX509Const(V_ERR_IP_ADDRESS_MISMATCH);
|
122
|
+
#endif
|
123
|
+
#if defined(X509_V_ERR_DANE_NO_MATCH)
|
124
|
+
DefX509Const(V_ERR_DANE_NO_MATCH);
|
125
|
+
#endif
|
126
|
+
#if defined(X509_V_ERR_EE_KEY_TOO_SMALL)
|
127
|
+
DefX509Const(V_ERR_EE_KEY_TOO_SMALL);
|
128
|
+
DefX509Const(V_ERR_CA_KEY_TOO_SMALL);
|
129
|
+
DefX509Const(V_ERR_CA_MD_TOO_WEAK);
|
130
|
+
#endif
|
131
|
+
#if defined(X509_V_ERR_INVALID_CALL)
|
132
|
+
DefX509Const(V_ERR_INVALID_CALL);
|
133
|
+
#endif
|
134
|
+
#if defined(X509_V_ERR_STORE_LOOKUP)
|
135
|
+
DefX509Const(V_ERR_STORE_LOOKUP);
|
136
|
+
#endif
|
137
|
+
#if defined(X509_V_ERR_NO_VALID_SCTS)
|
138
|
+
DefX509Const(V_ERR_NO_VALID_SCTS);
|
139
|
+
#endif
|
140
|
+
#if defined(X509_V_ERR_PROXY_SUBJECT_NAME_VIOLATION)
|
141
|
+
DefX509Const(V_ERR_PROXY_SUBJECT_NAME_VIOLATION);
|
142
|
+
#endif
|
143
|
+
#if defined(X509_V_ERR_OCSP_VERIFY_NEEDED)
|
144
|
+
DefX509Const(V_ERR_OCSP_VERIFY_NEEDED);
|
145
|
+
DefX509Const(V_ERR_OCSP_VERIFY_FAILED);
|
146
|
+
DefX509Const(V_ERR_OCSP_CERT_UNKNOWN);
|
147
|
+
#endif
|
80
148
|
|
149
|
+
/* Certificate verify flags */
|
150
|
+
/* Set by Store#flags= and StoreContext#flags=. */
|
151
|
+
DefX509Const(V_FLAG_USE_CHECK_TIME);
|
81
152
|
/* Set by Store#flags= and StoreContext#flags=. Enables CRL checking for the
|
82
153
|
* certificate chain leaf. */
|
83
154
|
DefX509Const(V_FLAG_CRL_CHECK);
|
@@ -122,6 +193,26 @@ Init_ossl_x509(void)
|
|
122
193
|
* Enabled by default in OpenSSL >= 1.1.0. */
|
123
194
|
DefX509Const(V_FLAG_TRUSTED_FIRST);
|
124
195
|
#endif
|
196
|
+
#if defined(X509_V_FLAG_SUITEB_128_LOS_ONLY)
|
197
|
+
/* Set by Store#flags= and StoreContext#flags=.
|
198
|
+
* Enables Suite B 128 bit only mode. */
|
199
|
+
DefX509Const(V_FLAG_SUITEB_128_LOS_ONLY);
|
200
|
+
#endif
|
201
|
+
#if defined(X509_V_FLAG_SUITEB_192_LOS)
|
202
|
+
/* Set by Store#flags= and StoreContext#flags=.
|
203
|
+
* Enables Suite B 192 bit only mode. */
|
204
|
+
DefX509Const(V_FLAG_SUITEB_192_LOS);
|
205
|
+
#endif
|
206
|
+
#if defined(X509_V_FLAG_SUITEB_128_LOS)
|
207
|
+
/* Set by Store#flags= and StoreContext#flags=.
|
208
|
+
* Enables Suite B 128 bit mode allowing 192 bit algorithms. */
|
209
|
+
DefX509Const(V_FLAG_SUITEB_128_LOS);
|
210
|
+
#endif
|
211
|
+
#if defined(X509_V_FLAG_PARTIAL_CHAIN)
|
212
|
+
/* Set by Store#flags= and StoreContext#flags=.
|
213
|
+
* Allows partial chains if at least one certificate is in trusted store. */
|
214
|
+
DefX509Const(V_FLAG_PARTIAL_CHAIN);
|
215
|
+
#endif
|
125
216
|
#if defined(X509_V_FLAG_NO_ALT_CHAINS)
|
126
217
|
/* Set by Store#flags= and StoreContext#flags=. Suppresses searching for
|
127
218
|
* a alternative chain. No effect in OpenSSL >= 1.1.0. */
|
data/ext/openssl/ossl_x509ext.c
CHANGED
data/ext/openssl/ossl_x509name.c
CHANGED
@@ -250,14 +250,12 @@ ossl_x509name_to_s_old(VALUE self)
|
|
250
250
|
{
|
251
251
|
X509_NAME *name;
|
252
252
|
char *buf;
|
253
|
-
VALUE str;
|
254
253
|
|
255
254
|
GetX509Name(self, name);
|
256
255
|
buf = X509_NAME_oneline(name, NULL, 0);
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
return str;
|
256
|
+
if (!buf)
|
257
|
+
ossl_raise(eX509NameError, "X509_NAME_oneline");
|
258
|
+
return ossl_buf2str(buf, rb_long2int(strlen(buf)));
|
261
259
|
}
|
262
260
|
|
263
261
|
static VALUE
|
@@ -265,12 +263,14 @@ x509name_print(VALUE self, unsigned long iflag)
|
|
265
263
|
{
|
266
264
|
X509_NAME *name;
|
267
265
|
BIO *out;
|
266
|
+
int ret;
|
268
267
|
|
269
268
|
GetX509Name(self, name);
|
270
269
|
out = BIO_new(BIO_s_mem());
|
271
270
|
if (!out)
|
272
271
|
ossl_raise(eX509NameError, NULL);
|
273
|
-
|
272
|
+
ret = X509_NAME_print_ex(out, name, 0, iflag);
|
273
|
+
if (ret < 0 || (iflag == XN_FLAG_COMPAT && ret == 0)) {
|
274
274
|
BIO_free(out);
|
275
275
|
ossl_raise(eX509NameError, "X509_NAME_print_ex");
|
276
276
|
}
|
@@ -400,7 +400,7 @@ ossl_x509name_cmp(VALUE self, VALUE other)
|
|
400
400
|
|
401
401
|
result = ossl_x509name_cmp0(self, other);
|
402
402
|
if (result < 0) return INT2FIX(-1);
|
403
|
-
if (result >
|
403
|
+
if (result > 0) return INT2FIX(1);
|
404
404
|
|
405
405
|
return INT2FIX(0);
|
406
406
|
}
|
@@ -502,6 +502,7 @@ ossl_x509name_to_der(VALUE self)
|
|
502
502
|
void
|
503
503
|
Init_ossl_x509name(void)
|
504
504
|
{
|
505
|
+
#undef rb_intern
|
505
506
|
VALUE utf8str, ptrstr, ia5str, hash;
|
506
507
|
|
507
508
|
#if 0
|
@@ -105,6 +105,13 @@ VALUE cX509Store;
|
|
105
105
|
VALUE cX509StoreContext;
|
106
106
|
VALUE eX509StoreError;
|
107
107
|
|
108
|
+
static void
|
109
|
+
ossl_x509store_mark(void *ptr)
|
110
|
+
{
|
111
|
+
X509_STORE *store = ptr;
|
112
|
+
rb_gc_mark((VALUE)X509_STORE_get_ex_data(store, store_ex_verify_cb_idx));
|
113
|
+
}
|
114
|
+
|
108
115
|
static void
|
109
116
|
ossl_x509store_free(void *ptr)
|
110
117
|
{
|
@@ -114,7 +121,7 @@ ossl_x509store_free(void *ptr)
|
|
114
121
|
static const rb_data_type_t ossl_x509store_type = {
|
115
122
|
"OpenSSL/X509/STORE",
|
116
123
|
{
|
117
|
-
|
124
|
+
ossl_x509store_mark, ossl_x509store_free,
|
118
125
|
},
|
119
126
|
0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
|
120
127
|
};
|
@@ -304,7 +311,6 @@ ossl_x509store_add_file(VALUE self, VALUE file)
|
|
304
311
|
char *path = NULL;
|
305
312
|
|
306
313
|
if(file != Qnil){
|
307
|
-
rb_check_safe_obj(file);
|
308
314
|
path = StringValueCStr(file);
|
309
315
|
}
|
310
316
|
GetX509Store(self, store);
|
@@ -340,7 +346,6 @@ ossl_x509store_add_path(VALUE self, VALUE dir)
|
|
340
346
|
char *path = NULL;
|
341
347
|
|
342
348
|
if(dir != Qnil){
|
343
|
-
rb_check_safe_obj(dir);
|
344
349
|
path = StringValueCStr(dir);
|
345
350
|
}
|
346
351
|
GetX509Store(self, store);
|
@@ -458,23 +463,16 @@ ossl_x509store_verify(int argc, VALUE *argv, VALUE self)
|
|
458
463
|
return result;
|
459
464
|
}
|
460
465
|
|
461
|
-
/*
|
462
|
-
* Public Functions
|
463
|
-
*/
|
464
|
-
static void ossl_x509stctx_free(void*);
|
465
|
-
|
466
|
-
|
467
|
-
static const rb_data_type_t ossl_x509stctx_type = {
|
468
|
-
"OpenSSL/X509/STORE_CTX",
|
469
|
-
{
|
470
|
-
0, ossl_x509stctx_free,
|
471
|
-
},
|
472
|
-
0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
|
473
|
-
};
|
474
|
-
|
475
466
|
/*
|
476
467
|
* Private functions
|
477
468
|
*/
|
469
|
+
static void
|
470
|
+
ossl_x509stctx_mark(void *ptr)
|
471
|
+
{
|
472
|
+
X509_STORE_CTX *ctx = ptr;
|
473
|
+
rb_gc_mark((VALUE)X509_STORE_CTX_get_ex_data(ctx, stctx_ex_verify_cb_idx));
|
474
|
+
}
|
475
|
+
|
478
476
|
static void
|
479
477
|
ossl_x509stctx_free(void *ptr)
|
480
478
|
{
|
@@ -486,6 +484,14 @@ ossl_x509stctx_free(void *ptr)
|
|
486
484
|
X509_STORE_CTX_free(ctx);
|
487
485
|
}
|
488
486
|
|
487
|
+
static const rb_data_type_t ossl_x509stctx_type = {
|
488
|
+
"OpenSSL/X509/STORE_CTX",
|
489
|
+
{
|
490
|
+
ossl_x509stctx_mark, ossl_x509stctx_free,
|
491
|
+
},
|
492
|
+
0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
|
493
|
+
};
|
494
|
+
|
489
495
|
static VALUE
|
490
496
|
ossl_x509stctx_alloc(VALUE klass)
|
491
497
|
{
|
@@ -519,7 +525,9 @@ static VALUE ossl_x509stctx_set_time(VALUE, VALUE);
|
|
519
525
|
|
520
526
|
/*
|
521
527
|
* call-seq:
|
522
|
-
* StoreContext.new(store, cert = nil,
|
528
|
+
* StoreContext.new(store, cert = nil, untrusted = nil)
|
529
|
+
*
|
530
|
+
* Sets up a StoreContext for a verification of the X.509 certificate _cert_.
|
523
531
|
*/
|
524
532
|
static VALUE
|
525
533
|
ossl_x509stctx_initialize(int argc, VALUE *argv, VALUE self)
|
@@ -529,15 +537,24 @@ ossl_x509stctx_initialize(int argc, VALUE *argv, VALUE self)
|
|
529
537
|
X509_STORE *x509st;
|
530
538
|
X509 *x509 = NULL;
|
531
539
|
STACK_OF(X509) *x509s = NULL;
|
540
|
+
int state;
|
532
541
|
|
533
542
|
rb_scan_args(argc, argv, "12", &store, &cert, &chain);
|
534
543
|
GetX509StCtx(self, ctx);
|
535
544
|
GetX509Store(store, x509st);
|
536
|
-
if(!NIL_P(cert))
|
537
|
-
|
538
|
-
if(
|
545
|
+
if (!NIL_P(cert))
|
546
|
+
x509 = DupX509CertPtr(cert); /* NEED TO DUP */
|
547
|
+
if (!NIL_P(chain)) {
|
548
|
+
x509s = ossl_protect_x509_ary2sk(chain, &state);
|
549
|
+
if (state) {
|
550
|
+
X509_free(x509);
|
551
|
+
rb_jump_tag(state);
|
552
|
+
}
|
553
|
+
}
|
554
|
+
if (X509_STORE_CTX_init(ctx, x509st, x509, x509s) != 1){
|
555
|
+
X509_free(x509);
|
539
556
|
sk_X509_pop_free(x509s, X509_free);
|
540
|
-
ossl_raise(eX509StoreError,
|
557
|
+
ossl_raise(eX509StoreError, "X509_STORE_CTX_init");
|
541
558
|
}
|
542
559
|
if (!NIL_P(t = rb_iv_get(store, "@time")))
|
543
560
|
ossl_x509stctx_set_time(self, t);
|
@@ -771,6 +788,7 @@ ossl_x509stctx_set_time(VALUE self, VALUE time)
|
|
771
788
|
void
|
772
789
|
Init_ossl_x509store(void)
|
773
790
|
{
|
791
|
+
#undef rb_intern
|
774
792
|
#if 0
|
775
793
|
mOSSL = rb_define_module("OpenSSL");
|
776
794
|
eOSSLError = rb_define_class_under(mOSSL, "OpenSSLError", rb_eStandardError);
|
data/lib/openssl/buffering.rb
CHANGED
@@ -316,20 +316,15 @@ module OpenSSL::Buffering
|
|
316
316
|
@wbuffer << s
|
317
317
|
@wbuffer.force_encoding(Encoding::BINARY)
|
318
318
|
@sync ||= false
|
319
|
-
if @sync or @wbuffer.size > BLOCK_SIZE
|
320
|
-
|
321
|
-
nwritten = 0
|
322
|
-
while remain > 0
|
323
|
-
str = @wbuffer[nwritten,remain]
|
319
|
+
if @sync or @wbuffer.size > BLOCK_SIZE
|
320
|
+
until @wbuffer.empty?
|
324
321
|
begin
|
325
|
-
nwrote = syswrite(
|
322
|
+
nwrote = syswrite(@wbuffer)
|
326
323
|
rescue Errno::EAGAIN
|
327
324
|
retry
|
328
325
|
end
|
329
|
-
|
330
|
-
nwritten += nwrote
|
326
|
+
@wbuffer[0, nwrote] = ""
|
331
327
|
end
|
332
|
-
@wbuffer[0,nwritten] = ""
|
333
328
|
end
|
334
329
|
end
|
335
330
|
|
@@ -409,9 +404,7 @@ module OpenSSL::Buffering
|
|
409
404
|
end
|
410
405
|
args.each{|arg|
|
411
406
|
s << arg.to_s
|
412
|
-
|
413
|
-
s << "\n"
|
414
|
-
end
|
407
|
+
s.sub!(/(?<!\n)\z/, "\n")
|
415
408
|
}
|
416
409
|
do_write(s)
|
417
410
|
nil
|