openssl 2.2.0 → 3.1.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 +33 -45
- data/History.md +260 -0
- data/ext/openssl/extconf.rb +85 -72
- data/ext/openssl/openssl_missing.c +0 -66
- data/ext/openssl/openssl_missing.h +26 -45
- data/ext/openssl/ossl.c +67 -47
- data/ext/openssl/ossl.h +26 -6
- data/ext/openssl/ossl_asn1.c +26 -13
- data/ext/openssl/ossl_bn.c +278 -142
- data/ext/openssl/ossl_bn.h +2 -1
- data/ext/openssl/ossl_cipher.c +12 -13
- data/ext/openssl/ossl_config.c +412 -41
- data/ext/openssl/ossl_config.h +4 -7
- data/ext/openssl/ossl_digest.c +15 -11
- data/ext/openssl/ossl_engine.c +16 -15
- data/ext/openssl/ossl_hmac.c +56 -135
- data/ext/openssl/ossl_kdf.c +11 -3
- data/ext/openssl/ossl_ocsp.c +5 -53
- data/ext/openssl/ossl_pkcs12.c +21 -3
- data/ext/openssl/ossl_pkcs7.c +42 -59
- data/ext/openssl/ossl_pkey.c +1142 -191
- data/ext/openssl/ossl_pkey.h +36 -73
- data/ext/openssl/ossl_pkey_dh.c +130 -340
- data/ext/openssl/ossl_pkey_dsa.c +100 -405
- data/ext/openssl/ossl_pkey_ec.c +163 -335
- data/ext/openssl/ossl_pkey_rsa.c +106 -493
- data/ext/openssl/ossl_ssl.c +529 -421
- data/ext/openssl/ossl_ssl_session.c +28 -29
- data/ext/openssl/ossl_ts.c +64 -39
- data/ext/openssl/ossl_x509.c +0 -6
- data/ext/openssl/ossl_x509cert.c +167 -11
- data/ext/openssl/ossl_x509crl.c +13 -10
- data/ext/openssl/ossl_x509ext.c +1 -2
- data/ext/openssl/ossl_x509name.c +9 -2
- data/ext/openssl/ossl_x509req.c +13 -10
- data/ext/openssl/ossl_x509revoked.c +3 -3
- data/ext/openssl/ossl_x509store.c +193 -90
- data/lib/openssl/buffering.rb +10 -1
- data/lib/openssl/hmac.rb +65 -0
- data/lib/openssl/pkey.rb +429 -0
- data/lib/openssl/ssl.rb +13 -8
- data/lib/openssl/version.rb +1 -1
- data/lib/openssl/x509.rb +22 -0
- data/lib/openssl.rb +0 -1
- metadata +8 -66
- data/ext/openssl/ruby_missing.h +0 -24
- data/lib/openssl/config.rb +0 -501
data/ext/openssl/ossl_ssl.c
CHANGED
@@ -11,8 +11,18 @@
|
|
11
11
|
*/
|
12
12
|
#include "ossl.h"
|
13
13
|
|
14
|
+
#ifndef OPENSSL_NO_SOCK
|
14
15
|
#define numberof(ary) (int)(sizeof(ary)/sizeof((ary)[0]))
|
15
16
|
|
17
|
+
#if !defined(OPENSSL_NO_NEXTPROTONEG) && !OSSL_IS_LIBRESSL
|
18
|
+
# define OSSL_USE_NEXTPROTONEG
|
19
|
+
#endif
|
20
|
+
|
21
|
+
#if !defined(TLS1_3_VERSION) && \
|
22
|
+
OSSL_LIBRESSL_PREREQ(3, 2, 0) && !OSSL_LIBRESSL_PREREQ(3, 4, 0)
|
23
|
+
# define TLS1_3_VERSION 0x0304
|
24
|
+
#endif
|
25
|
+
|
16
26
|
#ifdef _WIN32
|
17
27
|
# define TO_SOCKET(s) _get_osfhandle(s)
|
18
28
|
#else
|
@@ -24,7 +34,6 @@
|
|
24
34
|
} while (0)
|
25
35
|
|
26
36
|
VALUE mSSL;
|
27
|
-
static VALUE mSSLExtConfig;
|
28
37
|
static VALUE eSSLError;
|
29
38
|
VALUE cSSLContext;
|
30
39
|
VALUE cSSLSocket;
|
@@ -32,42 +41,41 @@ VALUE cSSLSocket;
|
|
32
41
|
static VALUE eSSLErrorWaitReadable;
|
33
42
|
static VALUE eSSLErrorWaitWritable;
|
34
43
|
|
35
|
-
static ID id_call, ID_callback_state, id_tmp_dh_callback,
|
36
|
-
id_npn_protocols_encoded;
|
44
|
+
static ID id_call, ID_callback_state, id_tmp_dh_callback,
|
45
|
+
id_npn_protocols_encoded, id_each;
|
37
46
|
static VALUE sym_exception, sym_wait_readable, sym_wait_writable;
|
38
47
|
|
39
48
|
static ID id_i_cert_store, id_i_ca_file, id_i_ca_path, id_i_verify_mode,
|
40
49
|
id_i_verify_depth, id_i_verify_callback, id_i_client_ca,
|
41
50
|
id_i_renegotiation_cb, id_i_cert, id_i_key, id_i_extra_chain_cert,
|
42
|
-
id_i_client_cert_cb,
|
51
|
+
id_i_client_cert_cb, id_i_timeout,
|
43
52
|
id_i_session_id_context, id_i_session_get_cb, id_i_session_new_cb,
|
44
53
|
id_i_session_remove_cb, id_i_npn_select_cb, id_i_npn_protocols,
|
45
54
|
id_i_alpn_select_cb, id_i_alpn_protocols, id_i_servername_cb,
|
46
|
-
id_i_verify_hostname;
|
55
|
+
id_i_verify_hostname, id_i_keylog_cb;
|
47
56
|
static ID id_i_io, id_i_context, id_i_hostname;
|
48
57
|
|
49
58
|
static int ossl_ssl_ex_vcb_idx;
|
50
59
|
static int ossl_ssl_ex_ptr_idx;
|
51
60
|
static int ossl_sslctx_ex_ptr_idx;
|
52
|
-
#if !defined(HAVE_X509_STORE_UP_REF)
|
53
|
-
static int ossl_sslctx_ex_store_p;
|
54
|
-
#endif
|
55
61
|
|
56
62
|
static void
|
57
|
-
|
63
|
+
ossl_sslctx_mark(void *ptr)
|
58
64
|
{
|
59
65
|
SSL_CTX *ctx = ptr;
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
66
|
+
rb_gc_mark((VALUE)SSL_CTX_get_ex_data(ctx, ossl_sslctx_ex_ptr_idx));
|
67
|
+
}
|
68
|
+
|
69
|
+
static void
|
70
|
+
ossl_sslctx_free(void *ptr)
|
71
|
+
{
|
72
|
+
SSL_CTX_free(ptr);
|
65
73
|
}
|
66
74
|
|
67
75
|
static const rb_data_type_t ossl_sslctx_type = {
|
68
76
|
"OpenSSL/SSL/CTX",
|
69
77
|
{
|
70
|
-
|
78
|
+
ossl_sslctx_mark, ossl_sslctx_free,
|
71
79
|
},
|
72
80
|
0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
|
73
81
|
};
|
@@ -83,7 +91,7 @@ ossl_sslctx_s_alloc(VALUE klass)
|
|
83
91
|
VALUE obj;
|
84
92
|
|
85
93
|
obj = TypedData_Wrap_Struct(klass, &ossl_sslctx_type, 0);
|
86
|
-
#if OPENSSL_VERSION_NUMBER >= 0x10100000
|
94
|
+
#if OPENSSL_VERSION_NUMBER >= 0x10100000 || defined(LIBRESSL_VERSION_NUMBER)
|
87
95
|
ctx = SSL_CTX_new(TLS_method());
|
88
96
|
#else
|
89
97
|
ctx = SSL_CTX_new(SSLv23_method());
|
@@ -95,14 +103,15 @@ ossl_sslctx_s_alloc(VALUE klass)
|
|
95
103
|
RTYPEDDATA_DATA(obj) = ctx;
|
96
104
|
SSL_CTX_set_ex_data(ctx, ossl_sslctx_ex_ptr_idx, (void *)obj);
|
97
105
|
|
98
|
-
#if !defined(OPENSSL_NO_EC) &&
|
106
|
+
#if !defined(OPENSSL_NO_EC) && OPENSSL_VERSION_NUMBER < 0x10100000 && \
|
107
|
+
!defined(LIBRESSL_VERSION_NUMBER)
|
99
108
|
/* We use SSL_CTX_set1_curves_list() to specify the curve used in ECDH. It
|
100
109
|
* allows to specify multiple curve names and OpenSSL will select
|
101
110
|
* automatically from them. In OpenSSL 1.0.2, the automatic selection has to
|
102
|
-
* be enabled explicitly.
|
103
|
-
* always enabled. To uniform the behavior, we enable the
|
104
|
-
* selection also in 1.0.2. Users can still disable ECDH by
|
105
|
-
* cipher suites by SSLContext#ciphers=. */
|
111
|
+
* be enabled explicitly. OpenSSL 1.1.0 and LibreSSL 2.6.1 removed the knob
|
112
|
+
* and it is always enabled. To uniform the behavior, we enable the
|
113
|
+
* automatic selection also in 1.0.2. Users can still disable ECDH by
|
114
|
+
* removing ECDH cipher suites by SSLContext#ciphers=. */
|
106
115
|
if (!SSL_CTX_set_ecdh_auto(ctx, 1))
|
107
116
|
ossl_raise(eSSLError, "SSL_CTX_set_ecdh_auto");
|
108
117
|
#endif
|
@@ -231,8 +240,7 @@ ossl_client_cert_cb(SSL *ssl, X509 **x509, EVP_PKEY **pkey)
|
|
231
240
|
return 1;
|
232
241
|
}
|
233
242
|
|
234
|
-
#if !defined(OPENSSL_NO_DH)
|
235
|
-
!defined(OPENSSL_NO_EC) && defined(HAVE_SSL_CTX_SET_TMP_ECDH_CALLBACK)
|
243
|
+
#if !defined(OPENSSL_NO_DH)
|
236
244
|
struct tmp_dh_callback_args {
|
237
245
|
VALUE ssl_obj;
|
238
246
|
ID id;
|
@@ -241,22 +249,23 @@ struct tmp_dh_callback_args {
|
|
241
249
|
int keylength;
|
242
250
|
};
|
243
251
|
|
244
|
-
static
|
245
|
-
ossl_call_tmp_dh_callback(
|
252
|
+
static VALUE
|
253
|
+
ossl_call_tmp_dh_callback(VALUE arg)
|
246
254
|
{
|
255
|
+
struct tmp_dh_callback_args *args = (struct tmp_dh_callback_args *)arg;
|
247
256
|
VALUE cb, dh;
|
248
257
|
EVP_PKEY *pkey;
|
249
258
|
|
250
259
|
cb = rb_funcall(args->ssl_obj, args->id, 0);
|
251
260
|
if (NIL_P(cb))
|
252
|
-
return NULL;
|
261
|
+
return (VALUE)NULL;
|
253
262
|
dh = rb_funcall(cb, id_call, 3, args->ssl_obj, INT2NUM(args->is_export),
|
254
263
|
INT2NUM(args->keylength));
|
255
264
|
pkey = GetPKeyPtr(dh);
|
256
265
|
if (EVP_PKEY_base_id(pkey) != args->type)
|
257
|
-
return NULL;
|
266
|
+
return (VALUE)NULL;
|
258
267
|
|
259
|
-
return pkey;
|
268
|
+
return (VALUE)pkey;
|
260
269
|
}
|
261
270
|
#endif
|
262
271
|
|
@@ -276,7 +285,7 @@ ossl_tmp_dh_callback(SSL *ssl, int is_export, int keylength)
|
|
276
285
|
args.keylength = keylength;
|
277
286
|
args.type = EVP_PKEY_DH;
|
278
287
|
|
279
|
-
pkey = (EVP_PKEY *)rb_protect(
|
288
|
+
pkey = (EVP_PKEY *)rb_protect(ossl_call_tmp_dh_callback,
|
280
289
|
(VALUE)&args, &state);
|
281
290
|
if (state) {
|
282
291
|
rb_ivar_set(rb_ssl, ID_callback_state, INT2NUM(state));
|
@@ -285,39 +294,10 @@ ossl_tmp_dh_callback(SSL *ssl, int is_export, int keylength)
|
|
285
294
|
if (!pkey)
|
286
295
|
return NULL;
|
287
296
|
|
288
|
-
return EVP_PKEY_get0_DH(pkey);
|
297
|
+
return (DH *)EVP_PKEY_get0_DH(pkey);
|
289
298
|
}
|
290
299
|
#endif /* OPENSSL_NO_DH */
|
291
300
|
|
292
|
-
#if !defined(OPENSSL_NO_EC) && defined(HAVE_SSL_CTX_SET_TMP_ECDH_CALLBACK)
|
293
|
-
static EC_KEY *
|
294
|
-
ossl_tmp_ecdh_callback(SSL *ssl, int is_export, int keylength)
|
295
|
-
{
|
296
|
-
VALUE rb_ssl;
|
297
|
-
EVP_PKEY *pkey;
|
298
|
-
struct tmp_dh_callback_args args;
|
299
|
-
int state;
|
300
|
-
|
301
|
-
rb_ssl = (VALUE)SSL_get_ex_data(ssl, ossl_ssl_ex_ptr_idx);
|
302
|
-
args.ssl_obj = rb_ssl;
|
303
|
-
args.id = id_tmp_ecdh_callback;
|
304
|
-
args.is_export = is_export;
|
305
|
-
args.keylength = keylength;
|
306
|
-
args.type = EVP_PKEY_EC;
|
307
|
-
|
308
|
-
pkey = (EVP_PKEY *)rb_protect((VALUE (*)(VALUE))ossl_call_tmp_dh_callback,
|
309
|
-
(VALUE)&args, &state);
|
310
|
-
if (state) {
|
311
|
-
rb_ivar_set(rb_ssl, ID_callback_state, INT2NUM(state));
|
312
|
-
return NULL;
|
313
|
-
}
|
314
|
-
if (!pkey)
|
315
|
-
return NULL;
|
316
|
-
|
317
|
-
return EVP_PKEY_get0_EC_KEY(pkey);
|
318
|
-
}
|
319
|
-
#endif
|
320
|
-
|
321
301
|
static VALUE
|
322
302
|
call_verify_certificate_identity(VALUE ctx_v)
|
323
303
|
{
|
@@ -387,7 +367,7 @@ ossl_call_session_get_cb(VALUE ary)
|
|
387
367
|
}
|
388
368
|
|
389
369
|
static SSL_SESSION *
|
390
|
-
#if
|
370
|
+
#if defined(LIBRESSL_VERSION_NUMBER) || OPENSSL_VERSION_NUMBER >= 0x10100000
|
391
371
|
ossl_sslctx_session_get_cb(SSL *ssl, const unsigned char *buf, int len, int *copy)
|
392
372
|
#else
|
393
373
|
ossl_sslctx_session_get_cb(SSL *ssl, unsigned char *buf, int len, int *copy)
|
@@ -464,6 +444,54 @@ ossl_sslctx_session_new_cb(SSL *ssl, SSL_SESSION *sess)
|
|
464
444
|
return 0;
|
465
445
|
}
|
466
446
|
|
447
|
+
#if OPENSSL_VERSION_NUMBER >= 0x10101000 && !defined(LIBRESSL_VERSION_NUMBER)
|
448
|
+
/*
|
449
|
+
* It is only compatible with OpenSSL >= 1.1.1. Even if LibreSSL implements
|
450
|
+
* SSL_CTX_set_keylog_callback() from v3.4.2, it does nothing (see
|
451
|
+
* https://github.com/libressl-portable/openbsd/commit/648d39f0f035835d0653342d139883b9661e9cb6).
|
452
|
+
*/
|
453
|
+
|
454
|
+
struct ossl_call_keylog_cb_args {
|
455
|
+
VALUE ssl_obj;
|
456
|
+
const char * line;
|
457
|
+
};
|
458
|
+
|
459
|
+
static VALUE
|
460
|
+
ossl_call_keylog_cb(VALUE args_v)
|
461
|
+
{
|
462
|
+
VALUE sslctx_obj, cb, line_v;
|
463
|
+
struct ossl_call_keylog_cb_args *args = (struct ossl_call_keylog_cb_args *) args_v;
|
464
|
+
|
465
|
+
sslctx_obj = rb_attr_get(args->ssl_obj, id_i_context);
|
466
|
+
|
467
|
+
cb = rb_attr_get(sslctx_obj, id_i_keylog_cb);
|
468
|
+
if (NIL_P(cb)) return Qnil;
|
469
|
+
|
470
|
+
line_v = rb_str_new_cstr(args->line);
|
471
|
+
|
472
|
+
return rb_funcall(cb, id_call, 2, args->ssl_obj, line_v);
|
473
|
+
}
|
474
|
+
|
475
|
+
static void
|
476
|
+
ossl_sslctx_keylog_cb(const SSL *ssl, const char *line)
|
477
|
+
{
|
478
|
+
VALUE ssl_obj;
|
479
|
+
struct ossl_call_keylog_cb_args args;
|
480
|
+
int state = 0;
|
481
|
+
|
482
|
+
OSSL_Debug("SSL keylog callback entered");
|
483
|
+
|
484
|
+
ssl_obj = (VALUE)SSL_get_ex_data(ssl, ossl_ssl_ex_ptr_idx);
|
485
|
+
args.ssl_obj = ssl_obj;
|
486
|
+
args.line = line;
|
487
|
+
|
488
|
+
rb_protect(ossl_call_keylog_cb, (VALUE)&args, &state);
|
489
|
+
if (state) {
|
490
|
+
rb_ivar_set(ssl_obj, ID_callback_state, INT2NUM(state));
|
491
|
+
}
|
492
|
+
}
|
493
|
+
#endif
|
494
|
+
|
467
495
|
static VALUE
|
468
496
|
ossl_call_session_remove_cb(VALUE ary)
|
469
497
|
{
|
@@ -596,8 +624,6 @@ ssl_renegotiation_cb(const SSL *ssl)
|
|
596
624
|
rb_funcallv(cb, id_call, 1, &ssl_obj);
|
597
625
|
}
|
598
626
|
|
599
|
-
#if !defined(OPENSSL_NO_NEXTPROTONEG) || \
|
600
|
-
defined(HAVE_SSL_CTX_SET_ALPN_SELECT_CB)
|
601
627
|
static VALUE
|
602
628
|
ssl_npn_encode_protocol_i(RB_BLOCK_CALL_FUNC_ARGLIST(cur, encoded))
|
603
629
|
{
|
@@ -616,7 +642,7 @@ static VALUE
|
|
616
642
|
ssl_encode_npn_protocols(VALUE protocols)
|
617
643
|
{
|
618
644
|
VALUE encoded = rb_str_new(NULL, 0);
|
619
|
-
|
645
|
+
rb_block_call(protocols, id_each, 0, 0, ssl_npn_encode_protocol_i, encoded);
|
620
646
|
return encoded;
|
621
647
|
}
|
622
648
|
|
@@ -679,14 +705,13 @@ ssl_npn_select_cb_common(SSL *ssl, VALUE cb, const unsigned char **out,
|
|
679
705
|
|
680
706
|
return SSL_TLSEXT_ERR_OK;
|
681
707
|
}
|
682
|
-
#endif
|
683
708
|
|
684
|
-
#
|
709
|
+
#ifdef OSSL_USE_NEXTPROTONEG
|
685
710
|
static int
|
686
711
|
ssl_npn_advertise_cb(SSL *ssl, const unsigned char **out, unsigned int *outlen,
|
687
712
|
void *arg)
|
688
713
|
{
|
689
|
-
VALUE protocols = (VALUE)arg;
|
714
|
+
VALUE protocols = rb_attr_get((VALUE)arg, id_npn_protocols_encoded);
|
690
715
|
|
691
716
|
*out = (const unsigned char *) RSTRING_PTR(protocols);
|
692
717
|
*outlen = RSTRING_LENINT(protocols);
|
@@ -708,7 +733,6 @@ ssl_npn_select_cb(SSL *ssl, unsigned char **out, unsigned char *outlen,
|
|
708
733
|
}
|
709
734
|
#endif
|
710
735
|
|
711
|
-
#ifdef HAVE_SSL_CTX_SET_ALPN_SELECT_CB
|
712
736
|
static int
|
713
737
|
ssl_alpn_select_cb(SSL *ssl, const unsigned char **out, unsigned char *outlen,
|
714
738
|
const unsigned char *in, unsigned int inlen, void *arg)
|
@@ -720,7 +744,6 @@ ssl_alpn_select_cb(SSL *ssl, const unsigned char **out, unsigned char *outlen,
|
|
720
744
|
|
721
745
|
return ssl_npn_select_cb_common(ssl, cb, out, outlen, in, inlen);
|
722
746
|
}
|
723
|
-
#endif
|
724
747
|
|
725
748
|
/* This function may serve as the entry point to support further callbacks. */
|
726
749
|
static void
|
@@ -797,26 +820,6 @@ ossl_sslctx_setup(VALUE self)
|
|
797
820
|
SSL_CTX_set_tmp_dh_callback(ctx, ossl_tmp_dh_callback);
|
798
821
|
#endif
|
799
822
|
|
800
|
-
#if !defined(OPENSSL_NO_EC)
|
801
|
-
/* We added SSLContext#tmp_ecdh_callback= in Ruby 2.3.0,
|
802
|
-
* but SSL_CTX_set_tmp_ecdh_callback() was removed in OpenSSL 1.1.0. */
|
803
|
-
if (RTEST(rb_attr_get(self, id_i_tmp_ecdh_callback))) {
|
804
|
-
# if defined(HAVE_SSL_CTX_SET_TMP_ECDH_CALLBACK)
|
805
|
-
rb_warn("#tmp_ecdh_callback= is deprecated; use #ecdh_curves= instead");
|
806
|
-
SSL_CTX_set_tmp_ecdh_callback(ctx, ossl_tmp_ecdh_callback);
|
807
|
-
# if defined(HAVE_SSL_CTX_SET_ECDH_AUTO)
|
808
|
-
/* tmp_ecdh_callback and ecdh_auto conflict; OpenSSL ignores
|
809
|
-
* tmp_ecdh_callback. So disable ecdh_auto. */
|
810
|
-
if (!SSL_CTX_set_ecdh_auto(ctx, 0))
|
811
|
-
ossl_raise(eSSLError, "SSL_CTX_set_ecdh_auto");
|
812
|
-
# endif
|
813
|
-
# else
|
814
|
-
ossl_raise(eSSLError, "OpenSSL does not support tmp_ecdh_callback; "
|
815
|
-
"use #ecdh_curves= instead");
|
816
|
-
# endif
|
817
|
-
}
|
818
|
-
#endif /* OPENSSL_NO_EC */
|
819
|
-
|
820
823
|
#ifdef HAVE_SSL_CTX_SET_POST_HANDSHAKE_AUTH
|
821
824
|
SSL_CTX_set_post_handshake_auth(ctx, 1);
|
822
825
|
#endif
|
@@ -825,17 +828,7 @@ ossl_sslctx_setup(VALUE self)
|
|
825
828
|
if (!NIL_P(val)) {
|
826
829
|
X509_STORE *store = GetX509StorePtr(val); /* NO NEED TO DUP */
|
827
830
|
SSL_CTX_set_cert_store(ctx, store);
|
828
|
-
#if !defined(HAVE_X509_STORE_UP_REF)
|
829
|
-
/*
|
830
|
-
* WORKAROUND:
|
831
|
-
* X509_STORE can count references, but
|
832
|
-
* X509_STORE_free() doesn't care it.
|
833
|
-
* So we won't increment it but mark it by ex_data.
|
834
|
-
*/
|
835
|
-
SSL_CTX_set_ex_data(ctx, ossl_sslctx_ex_store_p, ctx);
|
836
|
-
#else /* Fixed in OpenSSL 1.0.2; bff9ce4db38b (master), 5b4b9ce976fc (1.0.2) */
|
837
831
|
X509_STORE_up_ref(store);
|
838
|
-
#endif
|
839
832
|
}
|
840
833
|
|
841
834
|
val = rb_attr_get(self, id_i_extra_chain_cert);
|
@@ -886,10 +879,17 @@ ossl_sslctx_setup(VALUE self)
|
|
886
879
|
ca_file = NIL_P(val) ? NULL : StringValueCStr(val);
|
887
880
|
val = rb_attr_get(self, id_i_ca_path);
|
888
881
|
ca_path = NIL_P(val) ? NULL : StringValueCStr(val);
|
882
|
+
#ifdef HAVE_SSL_CTX_LOAD_VERIFY_FILE
|
883
|
+
if (ca_file && !SSL_CTX_load_verify_file(ctx, ca_file))
|
884
|
+
ossl_raise(eSSLError, "SSL_CTX_load_verify_file");
|
885
|
+
if (ca_path && !SSL_CTX_load_verify_dir(ctx, ca_path))
|
886
|
+
ossl_raise(eSSLError, "SSL_CTX_load_verify_dir");
|
887
|
+
#else
|
889
888
|
if(ca_file || ca_path){
|
890
889
|
if (!SSL_CTX_load_verify_locations(ctx, ca_file, ca_path))
|
891
890
|
rb_warning("can't set verify locations");
|
892
891
|
}
|
892
|
+
#endif
|
893
893
|
|
894
894
|
val = rb_attr_get(self, id_i_verify_mode);
|
895
895
|
verify_mode = NIL_P(val) ? SSL_VERIFY_NONE : NUM2INT(val);
|
@@ -903,12 +903,12 @@ ossl_sslctx_setup(VALUE self)
|
|
903
903
|
val = rb_attr_get(self, id_i_verify_depth);
|
904
904
|
if(!NIL_P(val)) SSL_CTX_set_verify_depth(ctx, NUM2INT(val));
|
905
905
|
|
906
|
-
#
|
906
|
+
#ifdef OSSL_USE_NEXTPROTONEG
|
907
907
|
val = rb_attr_get(self, id_i_npn_protocols);
|
908
908
|
if (!NIL_P(val)) {
|
909
909
|
VALUE encoded = ssl_encode_npn_protocols(val);
|
910
910
|
rb_ivar_set(self, id_npn_protocols_encoded, encoded);
|
911
|
-
SSL_CTX_set_next_protos_advertised_cb(ctx, ssl_npn_advertise_cb, (void *)
|
911
|
+
SSL_CTX_set_next_protos_advertised_cb(ctx, ssl_npn_advertise_cb, (void *)self);
|
912
912
|
OSSL_Debug("SSL NPN advertise callback added");
|
913
913
|
}
|
914
914
|
if (RTEST(rb_attr_get(self, id_i_npn_select_cb))) {
|
@@ -917,7 +917,6 @@ ossl_sslctx_setup(VALUE self)
|
|
917
917
|
}
|
918
918
|
#endif
|
919
919
|
|
920
|
-
#ifdef HAVE_SSL_CTX_SET_ALPN_SELECT_CB
|
921
920
|
val = rb_attr_get(self, id_i_alpn_protocols);
|
922
921
|
if (!NIL_P(val)) {
|
923
922
|
VALUE rprotos = ssl_encode_npn_protocols(val);
|
@@ -932,7 +931,6 @@ ossl_sslctx_setup(VALUE self)
|
|
932
931
|
SSL_CTX_set_alpn_select_cb(ctx, ssl_alpn_select_cb, (void *) self);
|
933
932
|
OSSL_Debug("SSL ALPN select callback added");
|
934
933
|
}
|
935
|
-
#endif
|
936
934
|
|
937
935
|
rb_obj_freeze(self);
|
938
936
|
|
@@ -964,6 +962,18 @@ ossl_sslctx_setup(VALUE self)
|
|
964
962
|
OSSL_Debug("SSL TLSEXT servername callback added");
|
965
963
|
}
|
966
964
|
|
965
|
+
#if OPENSSL_VERSION_NUMBER >= 0x10101000 && !defined(LIBRESSL_VERSION_NUMBER)
|
966
|
+
/*
|
967
|
+
* It is only compatible with OpenSSL >= 1.1.1. Even if LibreSSL implements
|
968
|
+
* SSL_CTX_set_keylog_callback() from v3.4.2, it does nothing (see
|
969
|
+
* https://github.com/libressl-portable/openbsd/commit/648d39f0f035835d0653342d139883b9661e9cb6).
|
970
|
+
*/
|
971
|
+
if (RTEST(rb_attr_get(self, id_i_keylog_cb))) {
|
972
|
+
SSL_CTX_set_keylog_callback(ctx, ossl_sslctx_keylog_cb);
|
973
|
+
OSSL_Debug("SSL keylog callback added");
|
974
|
+
}
|
975
|
+
#endif
|
976
|
+
|
967
977
|
return Qtrue;
|
968
978
|
}
|
969
979
|
|
@@ -1012,27 +1022,13 @@ ossl_sslctx_get_ciphers(VALUE self)
|
|
1012
1022
|
return ary;
|
1013
1023
|
}
|
1014
1024
|
|
1015
|
-
/*
|
1016
|
-
* call-seq:
|
1017
|
-
* ctx.ciphers = "cipher1:cipher2:..."
|
1018
|
-
* ctx.ciphers = [name, ...]
|
1019
|
-
* ctx.ciphers = [[name, version, bits, alg_bits], ...]
|
1020
|
-
*
|
1021
|
-
* Sets the list of available cipher suites for this context. Note in a server
|
1022
|
-
* context some ciphers require the appropriate certificates. For example, an
|
1023
|
-
* RSA cipher suite can only be chosen when an RSA certificate is available.
|
1024
|
-
*/
|
1025
1025
|
static VALUE
|
1026
|
-
|
1026
|
+
build_cipher_string(VALUE v)
|
1027
1027
|
{
|
1028
|
-
SSL_CTX *ctx;
|
1029
1028
|
VALUE str, elem;
|
1030
1029
|
int i;
|
1031
1030
|
|
1032
|
-
|
1033
|
-
if (NIL_P(v))
|
1034
|
-
return v;
|
1035
|
-
else if (RB_TYPE_P(v, T_ARRAY)) {
|
1031
|
+
if (RB_TYPE_P(v, T_ARRAY)) {
|
1036
1032
|
str = rb_str_new(0, 0);
|
1037
1033
|
for (i = 0; i < RARRAY_LEN(v); i++) {
|
1038
1034
|
elem = rb_ary_entry(v, i);
|
@@ -1046,14 +1042,113 @@ ossl_sslctx_set_ciphers(VALUE self, VALUE v)
|
|
1046
1042
|
StringValue(str);
|
1047
1043
|
}
|
1048
1044
|
|
1045
|
+
return str;
|
1046
|
+
}
|
1047
|
+
|
1048
|
+
/*
|
1049
|
+
* call-seq:
|
1050
|
+
* ctx.ciphers = "cipher1:cipher2:..."
|
1051
|
+
* ctx.ciphers = [name, ...]
|
1052
|
+
* ctx.ciphers = [[name, version, bits, alg_bits], ...]
|
1053
|
+
*
|
1054
|
+
* Sets the list of available cipher suites for this context. Note in a server
|
1055
|
+
* context some ciphers require the appropriate certificates. For example, an
|
1056
|
+
* RSA cipher suite can only be chosen when an RSA certificate is available.
|
1057
|
+
*/
|
1058
|
+
static VALUE
|
1059
|
+
ossl_sslctx_set_ciphers(VALUE self, VALUE v)
|
1060
|
+
{
|
1061
|
+
SSL_CTX *ctx;
|
1062
|
+
VALUE str;
|
1063
|
+
|
1064
|
+
rb_check_frozen(self);
|
1065
|
+
if (NIL_P(v))
|
1066
|
+
return v;
|
1067
|
+
|
1068
|
+
str = build_cipher_string(v);
|
1069
|
+
|
1049
1070
|
GetSSLCTX(self, ctx);
|
1050
|
-
if (!SSL_CTX_set_cipher_list(ctx, StringValueCStr(str)))
|
1071
|
+
if (!SSL_CTX_set_cipher_list(ctx, StringValueCStr(str)))
|
1051
1072
|
ossl_raise(eSSLError, "SSL_CTX_set_cipher_list");
|
1052
|
-
}
|
1053
1073
|
|
1054
1074
|
return v;
|
1055
1075
|
}
|
1056
1076
|
|
1077
|
+
#ifdef HAVE_SSL_CTX_SET_CIPHERSUITES
|
1078
|
+
/*
|
1079
|
+
* call-seq:
|
1080
|
+
* ctx.ciphersuites = "cipher1:cipher2:..."
|
1081
|
+
* ctx.ciphersuites = [name, ...]
|
1082
|
+
* ctx.ciphersuites = [[name, version, bits, alg_bits], ...]
|
1083
|
+
*
|
1084
|
+
* Sets the list of available TLSv1.3 cipher suites for this context.
|
1085
|
+
*/
|
1086
|
+
static VALUE
|
1087
|
+
ossl_sslctx_set_ciphersuites(VALUE self, VALUE v)
|
1088
|
+
{
|
1089
|
+
SSL_CTX *ctx;
|
1090
|
+
VALUE str;
|
1091
|
+
|
1092
|
+
rb_check_frozen(self);
|
1093
|
+
if (NIL_P(v))
|
1094
|
+
return v;
|
1095
|
+
|
1096
|
+
str = build_cipher_string(v);
|
1097
|
+
|
1098
|
+
GetSSLCTX(self, ctx);
|
1099
|
+
if (!SSL_CTX_set_ciphersuites(ctx, StringValueCStr(str)))
|
1100
|
+
ossl_raise(eSSLError, "SSL_CTX_set_ciphersuites");
|
1101
|
+
|
1102
|
+
return v;
|
1103
|
+
}
|
1104
|
+
#endif
|
1105
|
+
|
1106
|
+
#ifndef OPENSSL_NO_DH
|
1107
|
+
/*
|
1108
|
+
* call-seq:
|
1109
|
+
* ctx.tmp_dh = pkey
|
1110
|
+
*
|
1111
|
+
* Sets DH parameters used for ephemeral DH key exchange. This is relevant for
|
1112
|
+
* servers only.
|
1113
|
+
*
|
1114
|
+
* +pkey+ is an instance of OpenSSL::PKey::DH. Note that key components
|
1115
|
+
* contained in the key object, if any, are ignored. The server will always
|
1116
|
+
* generate a new key pair for each handshake.
|
1117
|
+
*
|
1118
|
+
* Added in version 3.0. See also the man page SSL_set0_tmp_dh_pkey(3).
|
1119
|
+
*
|
1120
|
+
* Example:
|
1121
|
+
* ctx = OpenSSL::SSL::SSLContext.new
|
1122
|
+
* ctx.tmp_dh = OpenSSL::DH.generate(2048)
|
1123
|
+
* svr = OpenSSL::SSL::SSLServer.new(tcp_svr, ctx)
|
1124
|
+
* Thread.new { svr.accept }
|
1125
|
+
*/
|
1126
|
+
static VALUE
|
1127
|
+
ossl_sslctx_set_tmp_dh(VALUE self, VALUE arg)
|
1128
|
+
{
|
1129
|
+
SSL_CTX *ctx;
|
1130
|
+
EVP_PKEY *pkey;
|
1131
|
+
|
1132
|
+
rb_check_frozen(self);
|
1133
|
+
GetSSLCTX(self, ctx);
|
1134
|
+
pkey = GetPKeyPtr(arg);
|
1135
|
+
|
1136
|
+
if (EVP_PKEY_base_id(pkey) != EVP_PKEY_DH)
|
1137
|
+
rb_raise(eSSLError, "invalid pkey type %s (expected DH)",
|
1138
|
+
OBJ_nid2sn(EVP_PKEY_base_id(pkey)));
|
1139
|
+
#ifdef HAVE_SSL_SET0_TMP_DH_PKEY
|
1140
|
+
if (!SSL_CTX_set0_tmp_dh_pkey(ctx, pkey))
|
1141
|
+
ossl_raise(eSSLError, "SSL_CTX_set0_tmp_dh_pkey");
|
1142
|
+
EVP_PKEY_up_ref(pkey);
|
1143
|
+
#else
|
1144
|
+
if (!SSL_CTX_set_tmp_dh(ctx, EVP_PKEY_get0_DH(pkey)))
|
1145
|
+
ossl_raise(eSSLError, "SSL_CTX_set_tmp_dh");
|
1146
|
+
#endif
|
1147
|
+
|
1148
|
+
return arg;
|
1149
|
+
}
|
1150
|
+
#endif
|
1151
|
+
|
1057
1152
|
#if !defined(OPENSSL_NO_EC)
|
1058
1153
|
/*
|
1059
1154
|
* call-seq:
|
@@ -1065,9 +1160,6 @@ ossl_sslctx_set_ciphers(VALUE self, VALUE v)
|
|
1065
1160
|
* Extension. For a server, the list is used by OpenSSL to determine the set of
|
1066
1161
|
* shared curves. OpenSSL will pick the most appropriate one from it.
|
1067
1162
|
*
|
1068
|
-
* Note that this works differently with old OpenSSL (<= 1.0.1). Only one curve
|
1069
|
-
* can be set, and this has no effect for TLS clients.
|
1070
|
-
*
|
1071
1163
|
* === Example
|
1072
1164
|
* ctx1 = OpenSSL::SSL::SSLContext.new
|
1073
1165
|
* ctx1.ecdh_curves = "X25519:P-256:P-224"
|
@@ -1091,48 +1183,8 @@ ossl_sslctx_set_ecdh_curves(VALUE self, VALUE arg)
|
|
1091
1183
|
GetSSLCTX(self, ctx);
|
1092
1184
|
StringValueCStr(arg);
|
1093
1185
|
|
1094
|
-
#if defined(HAVE_SSL_CTX_SET1_CURVES_LIST)
|
1095
1186
|
if (!SSL_CTX_set1_curves_list(ctx, RSTRING_PTR(arg)))
|
1096
1187
|
ossl_raise(eSSLError, NULL);
|
1097
|
-
#else
|
1098
|
-
/* OpenSSL does not have SSL_CTX_set1_curves_list()... Fallback to
|
1099
|
-
* SSL_CTX_set_tmp_ecdh(). So only the first curve is used. */
|
1100
|
-
{
|
1101
|
-
VALUE curve, splitted;
|
1102
|
-
EC_KEY *ec;
|
1103
|
-
int nid;
|
1104
|
-
|
1105
|
-
splitted = rb_str_split(arg, ":");
|
1106
|
-
if (!RARRAY_LEN(splitted))
|
1107
|
-
ossl_raise(eSSLError, "invalid input format");
|
1108
|
-
curve = RARRAY_AREF(splitted, 0);
|
1109
|
-
StringValueCStr(curve);
|
1110
|
-
|
1111
|
-
/* SSL_CTX_set1_curves_list() accepts NIST names */
|
1112
|
-
nid = EC_curve_nist2nid(RSTRING_PTR(curve));
|
1113
|
-
if (nid == NID_undef)
|
1114
|
-
nid = OBJ_txt2nid(RSTRING_PTR(curve));
|
1115
|
-
if (nid == NID_undef)
|
1116
|
-
ossl_raise(eSSLError, "unknown curve name");
|
1117
|
-
|
1118
|
-
ec = EC_KEY_new_by_curve_name(nid);
|
1119
|
-
if (!ec)
|
1120
|
-
ossl_raise(eSSLError, NULL);
|
1121
|
-
EC_KEY_set_asn1_flag(ec, OPENSSL_EC_NAMED_CURVE);
|
1122
|
-
if (!SSL_CTX_set_tmp_ecdh(ctx, ec)) {
|
1123
|
-
EC_KEY_free(ec);
|
1124
|
-
ossl_raise(eSSLError, "SSL_CTX_set_tmp_ecdh");
|
1125
|
-
}
|
1126
|
-
EC_KEY_free(ec);
|
1127
|
-
# if defined(HAVE_SSL_CTX_SET_ECDH_AUTO)
|
1128
|
-
/* tmp_ecdh and ecdh_auto conflict. tmp_ecdh is ignored when ecdh_auto
|
1129
|
-
* is enabled. So disable ecdh_auto. */
|
1130
|
-
if (!SSL_CTX_set_ecdh_auto(ctx, 0))
|
1131
|
-
ossl_raise(eSSLError, "SSL_CTX_set_ecdh_auto");
|
1132
|
-
# endif
|
1133
|
-
}
|
1134
|
-
#endif
|
1135
|
-
|
1136
1188
|
return arg;
|
1137
1189
|
}
|
1138
1190
|
#else
|
@@ -1223,7 +1275,7 @@ ossl_sslctx_enable_fallback_scsv(VALUE self)
|
|
1223
1275
|
|
1224
1276
|
/*
|
1225
1277
|
* call-seq:
|
1226
|
-
* ctx.add_certificate(
|
1278
|
+
* ctx.add_certificate(certificate, pkey [, extra_certs]) -> self
|
1227
1279
|
*
|
1228
1280
|
* Adds a certificate to the context. _pkey_ must be a corresponding private
|
1229
1281
|
* key with _certificate_.
|
@@ -1255,10 +1307,6 @@ ossl_sslctx_enable_fallback_scsv(VALUE self)
|
|
1255
1307
|
* ecdsa_pkey = ...
|
1256
1308
|
* another_ca_cert = ...
|
1257
1309
|
* ctx.add_certificate(ecdsa_cert, ecdsa_pkey, [another_ca_cert])
|
1258
|
-
*
|
1259
|
-
* === Note
|
1260
|
-
* OpenSSL before the version 1.0.2 could handle only one extra chain across
|
1261
|
-
* all key types. Calling this method discards the chain set previously.
|
1262
1310
|
*/
|
1263
1311
|
static VALUE
|
1264
1312
|
ossl_sslctx_add_certificate(int argc, VALUE *argv, VALUE self)
|
@@ -1283,7 +1331,7 @@ ossl_sslctx_add_certificate(int argc, VALUE *argv, VALUE self)
|
|
1283
1331
|
EVP_PKEY_free(pub_pkey);
|
1284
1332
|
if (!pub_pkey)
|
1285
1333
|
rb_raise(rb_eArgError, "certificate does not contain public key");
|
1286
|
-
if (
|
1334
|
+
if (EVP_PKEY_eq(pub_pkey, pkey) != 1)
|
1287
1335
|
rb_raise(rb_eArgError, "public key mismatch");
|
1288
1336
|
|
1289
1337
|
if (argc >= 3)
|
@@ -1297,34 +1345,9 @@ ossl_sslctx_add_certificate(int argc, VALUE *argv, VALUE self)
|
|
1297
1345
|
sk_X509_pop_free(extra_chain, X509_free);
|
1298
1346
|
ossl_raise(eSSLError, "SSL_CTX_use_PrivateKey");
|
1299
1347
|
}
|
1300
|
-
|
1301
|
-
|
1302
|
-
|
1303
|
-
if (!SSL_CTX_set0_chain(ctx, extra_chain)) {
|
1304
|
-
sk_X509_pop_free(extra_chain, X509_free);
|
1305
|
-
ossl_raise(eSSLError, "SSL_CTX_set0_chain");
|
1306
|
-
}
|
1307
|
-
#else
|
1308
|
-
STACK_OF(X509) *orig_extra_chain;
|
1309
|
-
X509 *x509_tmp;
|
1310
|
-
|
1311
|
-
/* First, clear the existing chain */
|
1312
|
-
SSL_CTX_get_extra_chain_certs(ctx, &orig_extra_chain);
|
1313
|
-
if (orig_extra_chain && sk_X509_num(orig_extra_chain)) {
|
1314
|
-
rb_warning("SSL_CTX_set0_chain() is not available; " \
|
1315
|
-
"clearing previously set certificate chain");
|
1316
|
-
SSL_CTX_clear_extra_chain_certs(ctx);
|
1317
|
-
}
|
1318
|
-
while ((x509_tmp = sk_X509_shift(extra_chain))) {
|
1319
|
-
/* Transfers ownership */
|
1320
|
-
if (!SSL_CTX_add_extra_chain_cert(ctx, x509_tmp)) {
|
1321
|
-
X509_free(x509_tmp);
|
1322
|
-
sk_X509_pop_free(extra_chain, X509_free);
|
1323
|
-
ossl_raise(eSSLError, "SSL_CTX_add_extra_chain_cert");
|
1324
|
-
}
|
1325
|
-
}
|
1326
|
-
sk_X509_free(extra_chain);
|
1327
|
-
#endif
|
1348
|
+
if (extra_chain && !SSL_CTX_set0_chain(ctx, extra_chain)) {
|
1349
|
+
sk_X509_pop_free(extra_chain, X509_free);
|
1350
|
+
ossl_raise(eSSLError, "SSL_CTX_set0_chain");
|
1328
1351
|
}
|
1329
1352
|
return self;
|
1330
1353
|
}
|
@@ -1518,12 +1541,19 @@ ossl_sslctx_flush_sessions(int argc, VALUE *argv, VALUE self)
|
|
1518
1541
|
/*
|
1519
1542
|
* SSLSocket class
|
1520
1543
|
*/
|
1521
|
-
#ifndef OPENSSL_NO_SOCK
|
1522
1544
|
static inline int
|
1523
1545
|
ssl_started(SSL *ssl)
|
1524
1546
|
{
|
1525
|
-
/*
|
1526
|
-
return
|
1547
|
+
/* BIO is created through ossl_ssl_setup(), called by #connect or #accept */
|
1548
|
+
return SSL_get_rbio(ssl) != NULL;
|
1549
|
+
}
|
1550
|
+
|
1551
|
+
static void
|
1552
|
+
ossl_ssl_mark(void *ptr)
|
1553
|
+
{
|
1554
|
+
SSL *ssl = ptr;
|
1555
|
+
rb_gc_mark((VALUE)SSL_get_ex_data(ssl, ossl_ssl_ex_ptr_idx));
|
1556
|
+
rb_gc_mark((VALUE)SSL_get_ex_data(ssl, ossl_ssl_ex_vcb_idx));
|
1527
1557
|
}
|
1528
1558
|
|
1529
1559
|
static void
|
@@ -1535,7 +1565,7 @@ ossl_ssl_free(void *ssl)
|
|
1535
1565
|
const rb_data_type_t ossl_ssl_type = {
|
1536
1566
|
"OpenSSL/SSL",
|
1537
1567
|
{
|
1538
|
-
|
1568
|
+
ossl_ssl_mark, ossl_ssl_free,
|
1539
1569
|
},
|
1540
1570
|
0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
|
1541
1571
|
};
|
@@ -1546,6 +1576,29 @@ ossl_ssl_s_alloc(VALUE klass)
|
|
1546
1576
|
return TypedData_Wrap_Struct(klass, &ossl_ssl_type, NULL);
|
1547
1577
|
}
|
1548
1578
|
|
1579
|
+
static VALUE
|
1580
|
+
peer_ip_address(VALUE self)
|
1581
|
+
{
|
1582
|
+
VALUE remote_address = rb_funcall(rb_attr_get(self, id_i_io), rb_intern("remote_address"), 0);
|
1583
|
+
|
1584
|
+
return rb_funcall(remote_address, rb_intern("inspect_sockaddr"), 0);
|
1585
|
+
}
|
1586
|
+
|
1587
|
+
static VALUE
|
1588
|
+
fallback_peer_ip_address(VALUE self, VALUE args)
|
1589
|
+
{
|
1590
|
+
return rb_str_new_cstr("(null)");
|
1591
|
+
}
|
1592
|
+
|
1593
|
+
static VALUE
|
1594
|
+
peeraddr_ip_str(VALUE self)
|
1595
|
+
{
|
1596
|
+
VALUE rb_mErrno = rb_const_get(rb_cObject, rb_intern("Errno"));
|
1597
|
+
VALUE rb_eSystemCallError = rb_const_get(rb_mErrno, rb_intern("SystemCallError"));
|
1598
|
+
|
1599
|
+
return rb_rescue2(peer_ip_address, self, fallback_peer_ip_address, (VALUE)0, rb_eSystemCallError, NULL);
|
1600
|
+
}
|
1601
|
+
|
1549
1602
|
/*
|
1550
1603
|
* call-seq:
|
1551
1604
|
* SSLSocket.new(io) => aSSLSocket
|
@@ -1582,6 +1635,7 @@ ossl_ssl_initialize(int argc, VALUE *argv, VALUE self)
|
|
1582
1635
|
|
1583
1636
|
if (rb_respond_to(io, rb_intern("nonblock=")))
|
1584
1637
|
rb_funcall(io, rb_intern("nonblock="), 1, Qtrue);
|
1638
|
+
Check_Type(io, T_FILE);
|
1585
1639
|
rb_ivar_set(self, id_i_io, io);
|
1586
1640
|
|
1587
1641
|
ssl = SSL_new(ctx);
|
@@ -1649,8 +1703,33 @@ no_exception_p(VALUE opts)
|
|
1649
1703
|
return 0;
|
1650
1704
|
}
|
1651
1705
|
|
1706
|
+
// Provided by Ruby 3.2.0 and later in order to support the default IO#timeout.
|
1707
|
+
#ifndef RUBY_IO_TIMEOUT_DEFAULT
|
1708
|
+
#define RUBY_IO_TIMEOUT_DEFAULT Qnil
|
1709
|
+
#endif
|
1710
|
+
|
1711
|
+
static void
|
1712
|
+
io_wait_writable(rb_io_t *fptr)
|
1713
|
+
{
|
1714
|
+
#ifdef HAVE_RB_IO_MAYBE_WAIT
|
1715
|
+
rb_io_maybe_wait_writable(errno, fptr->self, RUBY_IO_TIMEOUT_DEFAULT);
|
1716
|
+
#else
|
1717
|
+
rb_io_wait_writable(fptr->fd);
|
1718
|
+
#endif
|
1719
|
+
}
|
1720
|
+
|
1721
|
+
static void
|
1722
|
+
io_wait_readable(rb_io_t *fptr)
|
1723
|
+
{
|
1724
|
+
#ifdef HAVE_RB_IO_MAYBE_WAIT
|
1725
|
+
rb_io_maybe_wait_readable(errno, fptr->self, RUBY_IO_TIMEOUT_DEFAULT);
|
1726
|
+
#else
|
1727
|
+
rb_io_wait_readable(fptr->fd);
|
1728
|
+
#endif
|
1729
|
+
}
|
1730
|
+
|
1652
1731
|
static VALUE
|
1653
|
-
ossl_start_ssl(VALUE self, int (*func)(), const char *funcname, VALUE opts)
|
1732
|
+
ossl_start_ssl(VALUE self, int (*func)(SSL *), const char *funcname, VALUE opts)
|
1654
1733
|
{
|
1655
1734
|
SSL *ssl;
|
1656
1735
|
rb_io_t *fptr;
|
@@ -1683,16 +1762,23 @@ ossl_start_ssl(VALUE self, int (*func)(), const char *funcname, VALUE opts)
|
|
1683
1762
|
case SSL_ERROR_WANT_WRITE:
|
1684
1763
|
if (no_exception_p(opts)) { return sym_wait_writable; }
|
1685
1764
|
write_would_block(nonblock);
|
1686
|
-
|
1765
|
+
io_wait_writable(fptr);
|
1687
1766
|
continue;
|
1688
1767
|
case SSL_ERROR_WANT_READ:
|
1689
1768
|
if (no_exception_p(opts)) { return sym_wait_readable; }
|
1690
1769
|
read_would_block(nonblock);
|
1691
|
-
|
1770
|
+
io_wait_readable(fptr);
|
1692
1771
|
continue;
|
1693
1772
|
case SSL_ERROR_SYSCALL:
|
1773
|
+
#ifdef __APPLE__
|
1774
|
+
/* See ossl_ssl_write_internal() */
|
1775
|
+
if (errno == EPROTOTYPE)
|
1776
|
+
continue;
|
1777
|
+
#endif
|
1694
1778
|
if (errno) rb_sys_fail(funcname);
|
1695
|
-
ossl_raise(eSSLError, "%s SYSCALL returned=%d errno=%d state=%s",
|
1779
|
+
ossl_raise(eSSLError, "%s SYSCALL returned=%d errno=%d peeraddr=%"PRIsVALUE" state=%s",
|
1780
|
+
funcname, ret2, errno, peeraddr_ip_str(self), SSL_state_string_long(ssl));
|
1781
|
+
|
1696
1782
|
#if defined(SSL_R_CERTIFICATE_VERIFY_FAILED)
|
1697
1783
|
case SSL_ERROR_SSL:
|
1698
1784
|
err = ERR_peek_last_error();
|
@@ -1705,13 +1791,15 @@ ossl_start_ssl(VALUE self, int (*func)(), const char *funcname, VALUE opts)
|
|
1705
1791
|
if (!verify_msg)
|
1706
1792
|
verify_msg = "(null)";
|
1707
1793
|
ossl_clear_error(); /* let ossl_raise() not append message */
|
1708
|
-
ossl_raise(eSSLError, "%s returned=%d errno=%d state=%s: %s (%s)",
|
1709
|
-
funcname, ret2, errno, SSL_state_string_long(ssl),
|
1794
|
+
ossl_raise(eSSLError, "%s returned=%d errno=%d peeraddr=%"PRIsVALUE" state=%s: %s (%s)",
|
1795
|
+
funcname, ret2, errno, peeraddr_ip_str(self), SSL_state_string_long(ssl),
|
1710
1796
|
err_msg, verify_msg);
|
1711
1797
|
}
|
1712
1798
|
#endif
|
1799
|
+
/* fallthrough */
|
1713
1800
|
default:
|
1714
|
-
ossl_raise(eSSLError, "%s returned=%d errno=%d state=%s",
|
1801
|
+
ossl_raise(eSSLError, "%s returned=%d errno=%d peeraddr=%"PRIsVALUE" state=%s",
|
1802
|
+
funcname, ret2, errno, peeraddr_ip_str(self), SSL_state_string_long(ssl));
|
1715
1803
|
}
|
1716
1804
|
}
|
1717
1805
|
|
@@ -1722,8 +1810,7 @@ ossl_start_ssl(VALUE self, int (*func)(), const char *funcname, VALUE opts)
|
|
1722
1810
|
* call-seq:
|
1723
1811
|
* ssl.connect => self
|
1724
1812
|
*
|
1725
|
-
* Initiates an SSL/TLS handshake with a server.
|
1726
|
-
* after unencrypted data has been sent over the socket.
|
1813
|
+
* Initiates an SSL/TLS handshake with a server.
|
1727
1814
|
*/
|
1728
1815
|
static VALUE
|
1729
1816
|
ossl_ssl_connect(VALUE self)
|
@@ -1770,8 +1857,7 @@ ossl_ssl_connect_nonblock(int argc, VALUE *argv, VALUE self)
|
|
1770
1857
|
* call-seq:
|
1771
1858
|
* ssl.accept => self
|
1772
1859
|
*
|
1773
|
-
* Waits for a SSL/TLS client to initiate a handshake.
|
1774
|
-
* started after unencrypted data has been sent over the socket.
|
1860
|
+
* Waits for a SSL/TLS client to initiate a handshake.
|
1775
1861
|
*/
|
1776
1862
|
static VALUE
|
1777
1863
|
ossl_ssl_accept(VALUE self)
|
@@ -1818,7 +1904,7 @@ static VALUE
|
|
1818
1904
|
ossl_ssl_read_internal(int argc, VALUE *argv, VALUE self, int nonblock)
|
1819
1905
|
{
|
1820
1906
|
SSL *ssl;
|
1821
|
-
int ilen
|
1907
|
+
int ilen;
|
1822
1908
|
VALUE len, str;
|
1823
1909
|
rb_io_t *fptr;
|
1824
1910
|
VALUE io, opts = Qnil;
|
@@ -1828,6 +1914,9 @@ ossl_ssl_read_internal(int argc, VALUE *argv, VALUE self, int nonblock)
|
|
1828
1914
|
} else {
|
1829
1915
|
rb_scan_args(argc, argv, "11", &len, &str);
|
1830
1916
|
}
|
1917
|
+
GetSSL(self, ssl);
|
1918
|
+
if (!ssl_started(ssl))
|
1919
|
+
rb_raise(eSSLError, "SSL session is not started yet");
|
1831
1920
|
|
1832
1921
|
ilen = NUM2INT(len);
|
1833
1922
|
if (NIL_P(str))
|
@@ -1843,74 +1932,60 @@ ossl_ssl_read_internal(int argc, VALUE *argv, VALUE self, int nonblock)
|
|
1843
1932
|
if (ilen == 0)
|
1844
1933
|
return str;
|
1845
1934
|
|
1846
|
-
GetSSL(self, ssl);
|
1847
1935
|
io = rb_attr_get(self, id_i_io);
|
1848
1936
|
GetOpenFile(io, fptr);
|
1849
|
-
|
1850
|
-
|
1851
|
-
|
1852
|
-
|
1853
|
-
|
1854
|
-
|
1855
|
-
|
1856
|
-
|
1857
|
-
|
1858
|
-
|
1859
|
-
|
1937
|
+
|
1938
|
+
rb_str_locktmp(str);
|
1939
|
+
for (;;) {
|
1940
|
+
int nread = SSL_read(ssl, RSTRING_PTR(str), ilen);
|
1941
|
+
switch (ssl_get_error(ssl, nread)) {
|
1942
|
+
case SSL_ERROR_NONE:
|
1943
|
+
rb_str_unlocktmp(str);
|
1944
|
+
rb_str_set_len(str, nread);
|
1945
|
+
return str;
|
1946
|
+
case SSL_ERROR_ZERO_RETURN:
|
1947
|
+
rb_str_unlocktmp(str);
|
1948
|
+
if (no_exception_p(opts)) { return Qnil; }
|
1949
|
+
rb_eof_error();
|
1950
|
+
case SSL_ERROR_WANT_WRITE:
|
1951
|
+
if (nonblock) {
|
1952
|
+
rb_str_unlocktmp(str);
|
1953
|
+
if (no_exception_p(opts)) { return sym_wait_writable; }
|
1860
1954
|
write_would_block(nonblock);
|
1861
|
-
|
1862
|
-
|
1863
|
-
|
1864
|
-
|
1955
|
+
}
|
1956
|
+
io_wait_writable(fptr);
|
1957
|
+
continue;
|
1958
|
+
case SSL_ERROR_WANT_READ:
|
1959
|
+
if (nonblock) {
|
1960
|
+
rb_str_unlocktmp(str);
|
1961
|
+
if (no_exception_p(opts)) { return sym_wait_readable; }
|
1865
1962
|
read_would_block(nonblock);
|
1866
|
-
|
1867
|
-
|
1868
|
-
|
1869
|
-
|
1870
|
-
|
1871
|
-
|
1872
|
-
|
1873
|
-
|
1874
|
-
|
1875
|
-
|
1876
|
-
|
1877
|
-
|
1878
|
-
|
1879
|
-
|
1880
|
-
|
1881
|
-
|
1882
|
-
|
1883
|
-
|
1884
|
-
|
1885
|
-
|
1886
|
-
|
1887
|
-
|
1888
|
-
|
1889
|
-
|
1890
|
-
else {
|
1891
|
-
ID meth = nonblock ? rb_intern("read_nonblock") : rb_intern("sysread");
|
1892
|
-
|
1893
|
-
rb_warning("SSL session is not started yet.");
|
1894
|
-
#if defined(RB_PASS_KEYWORDS)
|
1895
|
-
if (nonblock) {
|
1896
|
-
VALUE argv[3];
|
1897
|
-
argv[0] = len;
|
1898
|
-
argv[1] = str;
|
1899
|
-
argv[2] = opts;
|
1900
|
-
return rb_funcallv_kw(io, meth, 3, argv, RB_PASS_KEYWORDS);
|
1901
|
-
}
|
1902
|
-
#else
|
1903
|
-
if (nonblock) {
|
1904
|
-
return rb_funcall(io, meth, 3, len, str, opts);
|
1963
|
+
}
|
1964
|
+
io_wait_readable(fptr);
|
1965
|
+
continue;
|
1966
|
+
case SSL_ERROR_SYSCALL:
|
1967
|
+
if (!ERR_peek_error()) {
|
1968
|
+
rb_str_unlocktmp(str);
|
1969
|
+
if (errno)
|
1970
|
+
rb_sys_fail(0);
|
1971
|
+
else {
|
1972
|
+
/*
|
1973
|
+
* The underlying BIO returned 0. This is actually a
|
1974
|
+
* protocol error. But unfortunately, not all
|
1975
|
+
* implementations cleanly shutdown the TLS connection
|
1976
|
+
* but just shutdown/close the TCP connection. So report
|
1977
|
+
* EOF for now...
|
1978
|
+
*/
|
1979
|
+
if (no_exception_p(opts)) { return Qnil; }
|
1980
|
+
rb_eof_error();
|
1981
|
+
}
|
1982
|
+
}
|
1983
|
+
/* fall through */
|
1984
|
+
default:
|
1985
|
+
rb_str_unlocktmp(str);
|
1986
|
+
ossl_raise(eSSLError, "SSL_read");
|
1905
1987
|
}
|
1906
|
-
#endif
|
1907
|
-
else
|
1908
|
-
return rb_funcall(io, meth, 2, len, str);
|
1909
1988
|
}
|
1910
|
-
|
1911
|
-
end:
|
1912
|
-
rb_str_set_len(str, nread);
|
1913
|
-
return str;
|
1914
1989
|
}
|
1915
1990
|
|
1916
1991
|
/*
|
@@ -1950,67 +2025,55 @@ static VALUE
|
|
1950
2025
|
ossl_ssl_write_internal(VALUE self, VALUE str, VALUE opts)
|
1951
2026
|
{
|
1952
2027
|
SSL *ssl;
|
1953
|
-
int nwrite = 0;
|
1954
2028
|
rb_io_t *fptr;
|
1955
|
-
int nonblock = opts != Qfalse;
|
1956
|
-
VALUE io;
|
2029
|
+
int num, nonblock = opts != Qfalse;
|
2030
|
+
VALUE tmp, io;
|
1957
2031
|
|
1958
|
-
StringValue(str);
|
1959
2032
|
GetSSL(self, ssl);
|
2033
|
+
if (!ssl_started(ssl))
|
2034
|
+
rb_raise(eSSLError, "SSL session is not started yet");
|
2035
|
+
|
2036
|
+
tmp = rb_str_new_frozen(StringValue(str));
|
1960
2037
|
io = rb_attr_get(self, id_i_io);
|
1961
2038
|
GetOpenFile(io, fptr);
|
1962
|
-
|
1963
|
-
|
1964
|
-
|
1965
|
-
|
1966
|
-
|
1967
|
-
|
1968
|
-
|
1969
|
-
|
1970
|
-
|
1971
|
-
|
1972
|
-
|
1973
|
-
|
1974
|
-
|
1975
|
-
|
1976
|
-
|
1977
|
-
|
1978
|
-
|
1979
|
-
|
1980
|
-
|
1981
|
-
|
1982
|
-
|
2039
|
+
|
2040
|
+
/* SSL_write(3ssl) manpage states num == 0 is undefined */
|
2041
|
+
num = RSTRING_LENINT(tmp);
|
2042
|
+
if (num == 0)
|
2043
|
+
return INT2FIX(0);
|
2044
|
+
|
2045
|
+
for (;;) {
|
2046
|
+
int nwritten = SSL_write(ssl, RSTRING_PTR(tmp), num);
|
2047
|
+
switch (ssl_get_error(ssl, nwritten)) {
|
2048
|
+
case SSL_ERROR_NONE:
|
2049
|
+
return INT2NUM(nwritten);
|
2050
|
+
case SSL_ERROR_WANT_WRITE:
|
2051
|
+
if (no_exception_p(opts)) { return sym_wait_writable; }
|
2052
|
+
write_would_block(nonblock);
|
2053
|
+
io_wait_writable(fptr);
|
2054
|
+
continue;
|
2055
|
+
case SSL_ERROR_WANT_READ:
|
2056
|
+
if (no_exception_p(opts)) { return sym_wait_readable; }
|
2057
|
+
read_would_block(nonblock);
|
2058
|
+
io_wait_readable(fptr);
|
2059
|
+
continue;
|
2060
|
+
case SSL_ERROR_SYSCALL:
|
2061
|
+
#ifdef __APPLE__
|
2062
|
+
/*
|
2063
|
+
* It appears that send syscall can return EPROTOTYPE if the
|
2064
|
+
* socket is being torn down. Retry to get a proper errno to
|
2065
|
+
* make the error handling in line with the socket library.
|
2066
|
+
* [Bug #14713] https://bugs.ruby-lang.org/issues/14713
|
2067
|
+
*/
|
2068
|
+
if (errno == EPROTOTYPE)
|
1983
2069
|
continue;
|
1984
|
-
case SSL_ERROR_SYSCALL:
|
1985
|
-
if (errno) rb_sys_fail(0);
|
1986
|
-
default:
|
1987
|
-
ossl_raise(eSSLError, "SSL_write");
|
1988
|
-
}
|
1989
|
-
}
|
1990
|
-
}
|
1991
|
-
else {
|
1992
|
-
ID meth = nonblock ?
|
1993
|
-
rb_intern("write_nonblock") : rb_intern("syswrite");
|
1994
|
-
|
1995
|
-
rb_warning("SSL session is not started yet.");
|
1996
|
-
#if defined(RB_PASS_KEYWORDS)
|
1997
|
-
if (nonblock) {
|
1998
|
-
VALUE argv[2];
|
1999
|
-
argv[0] = str;
|
2000
|
-
argv[1] = opts;
|
2001
|
-
return rb_funcallv_kw(io, meth, 2, argv, RB_PASS_KEYWORDS);
|
2002
|
-
}
|
2003
|
-
#else
|
2004
|
-
if (nonblock) {
|
2005
|
-
return rb_funcall(io, meth, 2, str, opts);
|
2006
|
-
}
|
2007
2070
|
#endif
|
2008
|
-
|
2009
|
-
|
2071
|
+
if (errno) rb_sys_fail(0);
|
2072
|
+
/* fallthrough */
|
2073
|
+
default:
|
2074
|
+
ossl_raise(eSSLError, "SSL_write");
|
2075
|
+
}
|
2010
2076
|
}
|
2011
|
-
|
2012
|
-
end:
|
2013
|
-
return INT2NUM(nwrite);
|
2014
2077
|
}
|
2015
2078
|
|
2016
2079
|
/*
|
@@ -2385,7 +2448,7 @@ ossl_ssl_get_client_ca_list(VALUE self)
|
|
2385
2448
|
return ossl_x509name_sk2ary(ca);
|
2386
2449
|
}
|
2387
2450
|
|
2388
|
-
#
|
2451
|
+
# ifdef OSSL_USE_NEXTPROTONEG
|
2389
2452
|
/*
|
2390
2453
|
* call-seq:
|
2391
2454
|
* ssl.npn_protocol => String | nil
|
@@ -2410,7 +2473,6 @@ ossl_ssl_npn_protocol(VALUE self)
|
|
2410
2473
|
}
|
2411
2474
|
# endif
|
2412
2475
|
|
2413
|
-
# ifdef HAVE_SSL_CTX_SET_ALPN_SELECT_CB
|
2414
2476
|
/*
|
2415
2477
|
* call-seq:
|
2416
2478
|
* ssl.alpn_protocol => String | nil
|
@@ -2433,9 +2495,50 @@ ossl_ssl_alpn_protocol(VALUE self)
|
|
2433
2495
|
else
|
2434
2496
|
return rb_str_new((const char *) out, outlen);
|
2435
2497
|
}
|
2436
|
-
# endif
|
2437
2498
|
|
2438
|
-
|
2499
|
+
/*
|
2500
|
+
* call-seq:
|
2501
|
+
* session.export_keying_material(label, length) -> String
|
2502
|
+
*
|
2503
|
+
* Enables use of shared session key material in accordance with RFC 5705.
|
2504
|
+
*/
|
2505
|
+
static VALUE
|
2506
|
+
ossl_ssl_export_keying_material(int argc, VALUE *argv, VALUE self)
|
2507
|
+
{
|
2508
|
+
SSL *ssl;
|
2509
|
+
VALUE str;
|
2510
|
+
VALUE label;
|
2511
|
+
VALUE length;
|
2512
|
+
VALUE context;
|
2513
|
+
unsigned char *p;
|
2514
|
+
size_t len;
|
2515
|
+
int use_ctx = 0;
|
2516
|
+
unsigned char *ctx = NULL;
|
2517
|
+
size_t ctx_len = 0;
|
2518
|
+
int ret;
|
2519
|
+
|
2520
|
+
rb_scan_args(argc, argv, "21", &label, &length, &context);
|
2521
|
+
StringValue(label);
|
2522
|
+
|
2523
|
+
GetSSL(self, ssl);
|
2524
|
+
|
2525
|
+
len = (size_t)NUM2LONG(length);
|
2526
|
+
str = rb_str_new(0, len);
|
2527
|
+
p = (unsigned char *)RSTRING_PTR(str);
|
2528
|
+
if (!NIL_P(context)) {
|
2529
|
+
use_ctx = 1;
|
2530
|
+
StringValue(context);
|
2531
|
+
ctx = (unsigned char *)RSTRING_PTR(context);
|
2532
|
+
ctx_len = RSTRING_LEN(context);
|
2533
|
+
}
|
2534
|
+
ret = SSL_export_keying_material(ssl, p, len, (char *)RSTRING_PTR(label),
|
2535
|
+
RSTRING_LENINT(label), ctx, ctx_len, use_ctx);
|
2536
|
+
if (ret == 0 || ret == -1) {
|
2537
|
+
ossl_raise(eSSLError, "SSL_export_keying_material");
|
2538
|
+
}
|
2539
|
+
return str;
|
2540
|
+
}
|
2541
|
+
|
2439
2542
|
/*
|
2440
2543
|
* call-seq:
|
2441
2544
|
* ssl.tmp_key => PKey or nil
|
@@ -2453,11 +2556,8 @@ ossl_ssl_tmp_key(VALUE self)
|
|
2453
2556
|
return Qnil;
|
2454
2557
|
return ossl_pkey_new(key);
|
2455
2558
|
}
|
2456
|
-
# endif /* defined(HAVE_SSL_GET_SERVER_TMP_KEY) */
|
2457
2559
|
#endif /* !defined(OPENSSL_NO_SOCK) */
|
2458
2560
|
|
2459
|
-
#undef rb_intern
|
2460
|
-
#define rb_intern(s) rb_intern_const(s)
|
2461
2561
|
void
|
2462
2562
|
Init_ossl_ssl(void)
|
2463
2563
|
{
|
@@ -2468,8 +2568,9 @@ Init_ossl_ssl(void)
|
|
2468
2568
|
rb_mWaitWritable = rb_define_module_under(rb_cIO, "WaitWritable");
|
2469
2569
|
#endif
|
2470
2570
|
|
2471
|
-
|
2472
|
-
|
2571
|
+
#ifndef OPENSSL_NO_SOCK
|
2572
|
+
id_call = rb_intern_const("call");
|
2573
|
+
ID_callback_state = rb_intern_const("callback_state");
|
2473
2574
|
|
2474
2575
|
ossl_ssl_ex_vcb_idx = SSL_get_ex_new_index(0, (void *)"ossl_ssl_ex_vcb_idx", 0, 0, 0);
|
2475
2576
|
if (ossl_ssl_ex_vcb_idx < 0)
|
@@ -2480,11 +2581,6 @@ Init_ossl_ssl(void)
|
|
2480
2581
|
ossl_sslctx_ex_ptr_idx = SSL_CTX_get_ex_new_index(0, (void *)"ossl_sslctx_ex_ptr_idx", 0, 0, 0);
|
2481
2582
|
if (ossl_sslctx_ex_ptr_idx < 0)
|
2482
2583
|
ossl_raise(rb_eRuntimeError, "SSL_CTX_get_ex_new_index");
|
2483
|
-
#if !defined(HAVE_X509_STORE_UP_REF)
|
2484
|
-
ossl_sslctx_ex_store_p = SSL_CTX_get_ex_new_index(0, (void *)"ossl_sslctx_ex_store_p", 0, 0, 0);
|
2485
|
-
if (ossl_sslctx_ex_store_p < 0)
|
2486
|
-
ossl_raise(rb_eRuntimeError, "SSL_CTX_get_ex_new_index");
|
2487
|
-
#endif
|
2488
2584
|
|
2489
2585
|
/* Document-module: OpenSSL::SSL
|
2490
2586
|
*
|
@@ -2495,16 +2591,6 @@ Init_ossl_ssl(void)
|
|
2495
2591
|
*/
|
2496
2592
|
mSSL = rb_define_module_under(mOSSL, "SSL");
|
2497
2593
|
|
2498
|
-
/* Document-module: OpenSSL::ExtConfig
|
2499
|
-
*
|
2500
|
-
* This module contains configuration information about the SSL extension,
|
2501
|
-
* for example if socket support is enabled, or the host name TLS extension
|
2502
|
-
* is enabled. Constants in this module will always be defined, but contain
|
2503
|
-
* +true+ or +false+ values depending on the configuration of your OpenSSL
|
2504
|
-
* installation.
|
2505
|
-
*/
|
2506
|
-
mSSLExtConfig = rb_define_module_under(mOSSL, "ExtConfig");
|
2507
|
-
|
2508
2594
|
/* Document-class: OpenSSL::SSL::SSLError
|
2509
2595
|
*
|
2510
2596
|
* Generic error class raised by SSLSocket and SSLContext.
|
@@ -2536,7 +2622,7 @@ Init_ossl_ssl(void)
|
|
2536
2622
|
* The _cert_, _key_, and _extra_chain_cert_ attributes are deprecated.
|
2537
2623
|
* It is recommended to use #add_certificate instead.
|
2538
2624
|
*/
|
2539
|
-
rb_attr(cSSLContext,
|
2625
|
+
rb_attr(cSSLContext, rb_intern_const("cert"), 1, 1, Qfalse);
|
2540
2626
|
|
2541
2627
|
/*
|
2542
2628
|
* Context private key
|
@@ -2544,29 +2630,29 @@ Init_ossl_ssl(void)
|
|
2544
2630
|
* The _cert_, _key_, and _extra_chain_cert_ attributes are deprecated.
|
2545
2631
|
* It is recommended to use #add_certificate instead.
|
2546
2632
|
*/
|
2547
|
-
rb_attr(cSSLContext,
|
2633
|
+
rb_attr(cSSLContext, rb_intern_const("key"), 1, 1, Qfalse);
|
2548
2634
|
|
2549
2635
|
/*
|
2550
2636
|
* A certificate or Array of certificates that will be sent to the client.
|
2551
2637
|
*/
|
2552
|
-
rb_attr(cSSLContext,
|
2638
|
+
rb_attr(cSSLContext, rb_intern_const("client_ca"), 1, 1, Qfalse);
|
2553
2639
|
|
2554
2640
|
/*
|
2555
2641
|
* The path to a file containing a PEM-format CA certificate
|
2556
2642
|
*/
|
2557
|
-
rb_attr(cSSLContext,
|
2643
|
+
rb_attr(cSSLContext, rb_intern_const("ca_file"), 1, 1, Qfalse);
|
2558
2644
|
|
2559
2645
|
/*
|
2560
2646
|
* The path to a directory containing CA certificates in PEM format.
|
2561
2647
|
*
|
2562
2648
|
* Files are looked up by subject's X509 name's hash value.
|
2563
2649
|
*/
|
2564
|
-
rb_attr(cSSLContext,
|
2650
|
+
rb_attr(cSSLContext, rb_intern_const("ca_path"), 1, 1, Qfalse);
|
2565
2651
|
|
2566
2652
|
/*
|
2567
2653
|
* Maximum session lifetime in seconds.
|
2568
2654
|
*/
|
2569
|
-
rb_attr(cSSLContext,
|
2655
|
+
rb_attr(cSSLContext, rb_intern_const("timeout"), 1, 1, Qfalse);
|
2570
2656
|
|
2571
2657
|
/*
|
2572
2658
|
* Session verification mode.
|
@@ -2579,12 +2665,12 @@ Init_ossl_ssl(void)
|
|
2579
2665
|
*
|
2580
2666
|
* See SSL_CTX_set_verify(3) for details.
|
2581
2667
|
*/
|
2582
|
-
rb_attr(cSSLContext,
|
2668
|
+
rb_attr(cSSLContext, rb_intern_const("verify_mode"), 1, 1, Qfalse);
|
2583
2669
|
|
2584
2670
|
/*
|
2585
2671
|
* Number of CA certificates to walk when verifying a certificate chain.
|
2586
2672
|
*/
|
2587
|
-
rb_attr(cSSLContext,
|
2673
|
+
rb_attr(cSSLContext, rb_intern_const("verify_depth"), 1, 1, Qfalse);
|
2588
2674
|
|
2589
2675
|
/*
|
2590
2676
|
* A callback for additional certificate verification. The callback is
|
@@ -2598,7 +2684,7 @@ Init_ossl_ssl(void)
|
|
2598
2684
|
* If the callback returns +false+, the chain verification is immediately
|
2599
2685
|
* stopped and a bad_certificate alert is then sent.
|
2600
2686
|
*/
|
2601
|
-
rb_attr(cSSLContext,
|
2687
|
+
rb_attr(cSSLContext, rb_intern_const("verify_callback"), 1, 1, Qfalse);
|
2602
2688
|
|
2603
2689
|
/*
|
2604
2690
|
* Whether to check the server certificate is valid for the hostname.
|
@@ -2606,12 +2692,12 @@ Init_ossl_ssl(void)
|
|
2606
2692
|
* In order to make this work, verify_mode must be set to VERIFY_PEER and
|
2607
2693
|
* the server hostname must be given by OpenSSL::SSL::SSLSocket#hostname=.
|
2608
2694
|
*/
|
2609
|
-
rb_attr(cSSLContext,
|
2695
|
+
rb_attr(cSSLContext, rb_intern_const("verify_hostname"), 1, 1, Qfalse);
|
2610
2696
|
|
2611
2697
|
/*
|
2612
2698
|
* An OpenSSL::X509::Store used for certificate verification.
|
2613
2699
|
*/
|
2614
|
-
rb_attr(cSSLContext,
|
2700
|
+
rb_attr(cSSLContext, rb_intern_const("cert_store"), 1, 1, Qfalse);
|
2615
2701
|
|
2616
2702
|
/*
|
2617
2703
|
* An Array of extra X509 certificates to be added to the certificate
|
@@ -2620,7 +2706,7 @@ Init_ossl_ssl(void)
|
|
2620
2706
|
* The _cert_, _key_, and _extra_chain_cert_ attributes are deprecated.
|
2621
2707
|
* It is recommended to use #add_certificate instead.
|
2622
2708
|
*/
|
2623
|
-
rb_attr(cSSLContext,
|
2709
|
+
rb_attr(cSSLContext, rb_intern_const("extra_chain_cert"), 1, 1, Qfalse);
|
2624
2710
|
|
2625
2711
|
/*
|
2626
2712
|
* A callback invoked when a client certificate is requested by a server
|
@@ -2630,28 +2716,14 @@ Init_ossl_ssl(void)
|
|
2630
2716
|
* containing an OpenSSL::X509::Certificate and an OpenSSL::PKey. If any
|
2631
2717
|
* other value is returned the handshake is suspended.
|
2632
2718
|
*/
|
2633
|
-
rb_attr(cSSLContext,
|
2634
|
-
|
2635
|
-
#if !defined(OPENSSL_NO_EC) && defined(HAVE_SSL_CTX_SET_TMP_ECDH_CALLBACK)
|
2636
|
-
/*
|
2637
|
-
* A callback invoked when ECDH parameters are required.
|
2638
|
-
*
|
2639
|
-
* The callback is invoked with the Session for the key exchange, an
|
2640
|
-
* flag indicating the use of an export cipher and the keylength
|
2641
|
-
* required.
|
2642
|
-
*
|
2643
|
-
* The callback is deprecated. This does not work with recent versions of
|
2644
|
-
* OpenSSL. Use OpenSSL::SSL::SSLContext#ecdh_curves= instead.
|
2645
|
-
*/
|
2646
|
-
rb_attr(cSSLContext, rb_intern("tmp_ecdh_callback"), 1, 1, Qfalse);
|
2647
|
-
#endif
|
2719
|
+
rb_attr(cSSLContext, rb_intern_const("client_cert_cb"), 1, 1, Qfalse);
|
2648
2720
|
|
2649
2721
|
/*
|
2650
2722
|
* Sets the context in which a session can be reused. This allows
|
2651
2723
|
* sessions for multiple applications to be distinguished, for example, by
|
2652
2724
|
* name.
|
2653
2725
|
*/
|
2654
|
-
rb_attr(cSSLContext,
|
2726
|
+
rb_attr(cSSLContext, rb_intern_const("session_id_context"), 1, 1, Qfalse);
|
2655
2727
|
|
2656
2728
|
/*
|
2657
2729
|
* A callback invoked on a server when a session is proposed by the client
|
@@ -2660,7 +2732,7 @@ Init_ossl_ssl(void)
|
|
2660
2732
|
* The callback is invoked with the SSLSocket and session id. The
|
2661
2733
|
* callback may return a Session from an external cache.
|
2662
2734
|
*/
|
2663
|
-
rb_attr(cSSLContext,
|
2735
|
+
rb_attr(cSSLContext, rb_intern_const("session_get_cb"), 1, 1, Qfalse);
|
2664
2736
|
|
2665
2737
|
/*
|
2666
2738
|
* A callback invoked when a new session was negotiated.
|
@@ -2668,7 +2740,7 @@ Init_ossl_ssl(void)
|
|
2668
2740
|
* The callback is invoked with an SSLSocket. If +false+ is returned the
|
2669
2741
|
* session will be removed from the internal cache.
|
2670
2742
|
*/
|
2671
|
-
rb_attr(cSSLContext,
|
2743
|
+
rb_attr(cSSLContext, rb_intern_const("session_new_cb"), 1, 1, Qfalse);
|
2672
2744
|
|
2673
2745
|
/*
|
2674
2746
|
* A callback invoked when a session is removed from the internal cache.
|
@@ -2679,9 +2751,7 @@ Init_ossl_ssl(void)
|
|
2679
2751
|
* multi-threaded application. The callback is called inside a global lock
|
2680
2752
|
* and it can randomly cause deadlock on Ruby thread switching.
|
2681
2753
|
*/
|
2682
|
-
rb_attr(cSSLContext,
|
2683
|
-
|
2684
|
-
rb_define_const(mSSLExtConfig, "HAVE_TLSEXT_HOST_NAME", Qtrue);
|
2754
|
+
rb_attr(cSSLContext, rb_intern_const("session_remove_cb"), 1, 1, Qfalse);
|
2685
2755
|
|
2686
2756
|
/*
|
2687
2757
|
* A callback invoked whenever a new handshake is initiated on an
|
@@ -2702,8 +2772,8 @@ Init_ossl_ssl(void)
|
|
2702
2772
|
* raise RuntimeError, "Client renegotiation disabled"
|
2703
2773
|
* end
|
2704
2774
|
*/
|
2705
|
-
rb_attr(cSSLContext,
|
2706
|
-
#
|
2775
|
+
rb_attr(cSSLContext, rb_intern_const("renegotiation_cb"), 1, 1, Qfalse);
|
2776
|
+
#ifdef OSSL_USE_NEXTPROTONEG
|
2707
2777
|
/*
|
2708
2778
|
* An Enumerable of Strings. Each String represents a protocol to be
|
2709
2779
|
* advertised as the list of supported protocols for Next Protocol
|
@@ -2715,7 +2785,7 @@ Init_ossl_ssl(void)
|
|
2715
2785
|
*
|
2716
2786
|
* ctx.npn_protocols = ["http/1.1", "spdy/2"]
|
2717
2787
|
*/
|
2718
|
-
rb_attr(cSSLContext,
|
2788
|
+
rb_attr(cSSLContext, rb_intern_const("npn_protocols"), 1, 1, Qfalse);
|
2719
2789
|
/*
|
2720
2790
|
* A callback invoked on the client side when the client needs to select
|
2721
2791
|
* a protocol from the list sent by the server. Supported in OpenSSL 1.0.1
|
@@ -2732,10 +2802,9 @@ Init_ossl_ssl(void)
|
|
2732
2802
|
* protocols.first
|
2733
2803
|
* end
|
2734
2804
|
*/
|
2735
|
-
rb_attr(cSSLContext,
|
2805
|
+
rb_attr(cSSLContext, rb_intern_const("npn_select_cb"), 1, 1, Qfalse);
|
2736
2806
|
#endif
|
2737
2807
|
|
2738
|
-
#ifdef HAVE_SSL_CTX_SET_ALPN_SELECT_CB
|
2739
2808
|
/*
|
2740
2809
|
* An Enumerable of Strings. Each String represents a protocol to be
|
2741
2810
|
* advertised as the list of supported protocols for Application-Layer
|
@@ -2747,7 +2816,7 @@ Init_ossl_ssl(void)
|
|
2747
2816
|
*
|
2748
2817
|
* ctx.alpn_protocols = ["http/1.1", "spdy/2", "h2"]
|
2749
2818
|
*/
|
2750
|
-
rb_attr(cSSLContext,
|
2819
|
+
rb_attr(cSSLContext, rb_intern_const("alpn_protocols"), 1, 1, Qfalse);
|
2751
2820
|
/*
|
2752
2821
|
* A callback invoked on the server side when the server needs to select
|
2753
2822
|
* a protocol from the list sent by the client. Supported in OpenSSL 1.0.2
|
@@ -2764,8 +2833,30 @@ Init_ossl_ssl(void)
|
|
2764
2833
|
* protocols.first
|
2765
2834
|
* end
|
2766
2835
|
*/
|
2767
|
-
rb_attr(cSSLContext,
|
2768
|
-
|
2836
|
+
rb_attr(cSSLContext, rb_intern_const("alpn_select_cb"), 1, 1, Qfalse);
|
2837
|
+
|
2838
|
+
/*
|
2839
|
+
* A callback invoked when TLS key material is generated or received, in
|
2840
|
+
* order to allow applications to store this keying material for debugging
|
2841
|
+
* purposes.
|
2842
|
+
*
|
2843
|
+
* The callback is invoked with an SSLSocket and a string containing the
|
2844
|
+
* key material in the format used by NSS for its SSLKEYLOGFILE debugging
|
2845
|
+
* output.
|
2846
|
+
*
|
2847
|
+
* It is only compatible with OpenSSL >= 1.1.1. Even if LibreSSL implements
|
2848
|
+
* SSL_CTX_set_keylog_callback() from v3.4.2, it does nothing (see
|
2849
|
+
* https://github.com/libressl-portable/openbsd/commit/648d39f0f035835d0653342d139883b9661e9cb6).
|
2850
|
+
*
|
2851
|
+
* === Example
|
2852
|
+
*
|
2853
|
+
* context.keylog_cb = proc do |_sock, line|
|
2854
|
+
* File.open('ssl_keylog_file', "a") do |f|
|
2855
|
+
* f.write("#{line}\n")
|
2856
|
+
* end
|
2857
|
+
* end
|
2858
|
+
*/
|
2859
|
+
rb_attr(cSSLContext, rb_intern_const("keylog_cb"), 1, 1, Qfalse);
|
2769
2860
|
|
2770
2861
|
rb_define_alias(cSSLContext, "ssl_timeout", "timeout");
|
2771
2862
|
rb_define_alias(cSSLContext, "ssl_timeout=", "timeout=");
|
@@ -2773,6 +2864,12 @@ Init_ossl_ssl(void)
|
|
2773
2864
|
ossl_sslctx_set_minmax_proto_version, 2);
|
2774
2865
|
rb_define_method(cSSLContext, "ciphers", ossl_sslctx_get_ciphers, 0);
|
2775
2866
|
rb_define_method(cSSLContext, "ciphers=", ossl_sslctx_set_ciphers, 1);
|
2867
|
+
#ifdef HAVE_SSL_CTX_SET_CIPHERSUITES
|
2868
|
+
rb_define_method(cSSLContext, "ciphersuites=", ossl_sslctx_set_ciphersuites, 1);
|
2869
|
+
#endif
|
2870
|
+
#ifndef OPENSSL_NO_DH
|
2871
|
+
rb_define_method(cSSLContext, "tmp_dh=", ossl_sslctx_set_tmp_dh, 1);
|
2872
|
+
#endif
|
2776
2873
|
rb_define_method(cSSLContext, "ecdh_curves=", ossl_sslctx_set_ecdh_curves, 1);
|
2777
2874
|
rb_define_method(cSSLContext, "security_level", ossl_sslctx_get_security_level, 0);
|
2778
2875
|
rb_define_method(cSSLContext, "security_level=", ossl_sslctx_set_security_level, 1);
|
@@ -2846,11 +2943,6 @@ Init_ossl_ssl(void)
|
|
2846
2943
|
* Document-class: OpenSSL::SSL::SSLSocket
|
2847
2944
|
*/
|
2848
2945
|
cSSLSocket = rb_define_class_under(mSSL, "SSLSocket", rb_cObject);
|
2849
|
-
#ifdef OPENSSL_NO_SOCK
|
2850
|
-
rb_define_const(mSSLExtConfig, "OPENSSL_NO_SOCK", Qtrue);
|
2851
|
-
rb_define_method(cSSLSocket, "initialize", rb_f_notimplement, -1);
|
2852
|
-
#else
|
2853
|
-
rb_define_const(mSSLExtConfig, "OPENSSL_NO_SOCK", Qfalse);
|
2854
2946
|
rb_define_alloc_func(cSSLSocket, ossl_ssl_s_alloc);
|
2855
2947
|
rb_define_method(cSSLSocket, "initialize", ossl_ssl_initialize, -1);
|
2856
2948
|
rb_undef_method(cSSLSocket, "initialize_copy");
|
@@ -2879,16 +2971,12 @@ Init_ossl_ssl(void)
|
|
2879
2971
|
rb_define_method(cSSLSocket, "hostname=", ossl_ssl_set_hostname, 1);
|
2880
2972
|
rb_define_method(cSSLSocket, "finished_message", ossl_ssl_get_finished, 0);
|
2881
2973
|
rb_define_method(cSSLSocket, "peer_finished_message", ossl_ssl_get_peer_finished, 0);
|
2882
|
-
# ifdef HAVE_SSL_GET_SERVER_TMP_KEY
|
2883
2974
|
rb_define_method(cSSLSocket, "tmp_key", ossl_ssl_tmp_key, 0);
|
2884
|
-
# endif
|
2885
|
-
# ifdef HAVE_SSL_CTX_SET_ALPN_SELECT_CB
|
2886
2975
|
rb_define_method(cSSLSocket, "alpn_protocol", ossl_ssl_alpn_protocol, 0);
|
2887
|
-
|
2888
|
-
#
|
2976
|
+
rb_define_method(cSSLSocket, "export_keying_material", ossl_ssl_export_keying_material, -1);
|
2977
|
+
# ifdef OSSL_USE_NEXTPROTONEG
|
2889
2978
|
rb_define_method(cSSLSocket, "npn_protocol", ossl_ssl_npn_protocol, 0);
|
2890
2979
|
# endif
|
2891
|
-
#endif
|
2892
2980
|
|
2893
2981
|
rb_define_const(mSSL, "VERIFY_NONE", INT2NUM(SSL_VERIFY_NONE));
|
2894
2982
|
rb_define_const(mSSL, "VERIFY_PEER", INT2NUM(SSL_VERIFY_PEER));
|
@@ -2896,12 +2984,23 @@ Init_ossl_ssl(void)
|
|
2896
2984
|
rb_define_const(mSSL, "VERIFY_CLIENT_ONCE", INT2NUM(SSL_VERIFY_CLIENT_ONCE));
|
2897
2985
|
|
2898
2986
|
rb_define_const(mSSL, "OP_ALL", ULONG2NUM(SSL_OP_ALL));
|
2987
|
+
#ifdef SSL_OP_CLEANSE_PLAINTEXT /* OpenSSL 3.0 */
|
2988
|
+
rb_define_const(mSSL, "OP_CLEANSE_PLAINTEXT", ULONG2NUM(SSL_OP_CLEANSE_PLAINTEXT));
|
2989
|
+
#endif
|
2899
2990
|
rb_define_const(mSSL, "OP_LEGACY_SERVER_CONNECT", ULONG2NUM(SSL_OP_LEGACY_SERVER_CONNECT));
|
2900
|
-
#ifdef
|
2901
|
-
rb_define_const(mSSL, "
|
2991
|
+
#ifdef SSL_OP_ENABLE_KTLS /* OpenSSL 3.0 */
|
2992
|
+
rb_define_const(mSSL, "OP_ENABLE_KTLS", ULONG2NUM(SSL_OP_ENABLE_KTLS));
|
2902
2993
|
#endif
|
2903
|
-
|
2994
|
+
rb_define_const(mSSL, "OP_TLSEXT_PADDING", ULONG2NUM(SSL_OP_TLSEXT_PADDING));
|
2904
2995
|
rb_define_const(mSSL, "OP_SAFARI_ECDHE_ECDSA_BUG", ULONG2NUM(SSL_OP_SAFARI_ECDHE_ECDSA_BUG));
|
2996
|
+
#ifdef SSL_OP_IGNORE_UNEXPECTED_EOF /* OpenSSL 3.0 */
|
2997
|
+
rb_define_const(mSSL, "OP_IGNORE_UNEXPECTED_EOF", ULONG2NUM(SSL_OP_IGNORE_UNEXPECTED_EOF));
|
2998
|
+
#endif
|
2999
|
+
#ifdef SSL_OP_ALLOW_CLIENT_RENEGOTIATION /* OpenSSL 3.0 */
|
3000
|
+
rb_define_const(mSSL, "OP_ALLOW_CLIENT_RENEGOTIATION", ULONG2NUM(SSL_OP_ALLOW_CLIENT_RENEGOTIATION));
|
3001
|
+
#endif
|
3002
|
+
#ifdef SSL_OP_DISABLE_TLSEXT_CA_NAMES /* OpenSSL 3.0 */
|
3003
|
+
rb_define_const(mSSL, "OP_DISABLE_TLSEXT_CA_NAMES", ULONG2NUM(SSL_OP_DISABLE_TLSEXT_CA_NAMES));
|
2905
3004
|
#endif
|
2906
3005
|
#ifdef SSL_OP_ALLOW_NO_DHE_KEX /* OpenSSL 1.1.1 */
|
2907
3006
|
rb_define_const(mSSL, "OP_ALLOW_NO_DHE_KEX", ULONG2NUM(SSL_OP_ALLOW_NO_DHE_KEX));
|
@@ -2914,13 +3013,15 @@ Init_ossl_ssl(void)
|
|
2914
3013
|
#ifdef SSL_OP_NO_ENCRYPT_THEN_MAC /* OpenSSL 1.1.1 */
|
2915
3014
|
rb_define_const(mSSL, "OP_NO_ENCRYPT_THEN_MAC", ULONG2NUM(SSL_OP_NO_ENCRYPT_THEN_MAC));
|
2916
3015
|
#endif
|
2917
|
-
|
2918
|
-
rb_define_const(mSSL, "
|
2919
|
-
#
|
2920
|
-
|
3016
|
+
#ifdef SSL_OP_ENABLE_MIDDLEBOX_COMPAT /* OpenSSL 1.1.1 */
|
3017
|
+
rb_define_const(mSSL, "OP_ENABLE_MIDDLEBOX_COMPAT", ULONG2NUM(SSL_OP_ENABLE_MIDDLEBOX_COMPAT));
|
3018
|
+
#endif
|
3019
|
+
#ifdef SSL_OP_PRIORITIZE_CHACHA /* OpenSSL 1.1.1 */
|
3020
|
+
rb_define_const(mSSL, "OP_PRIORITIZE_CHACHA", ULONG2NUM(SSL_OP_PRIORITIZE_CHACHA));
|
3021
|
+
#endif
|
3022
|
+
#ifdef SSL_OP_NO_ANTI_REPLAY /* OpenSSL 1.1.1 */
|
3023
|
+
rb_define_const(mSSL, "OP_NO_ANTI_REPLAY", ULONG2NUM(SSL_OP_NO_ANTI_REPLAY));
|
2921
3024
|
#endif
|
2922
|
-
rb_define_const(mSSL, "OP_CRYPTOPRO_TLSEXT_BUG", ULONG2NUM(SSL_OP_CRYPTOPRO_TLSEXT_BUG));
|
2923
|
-
|
2924
3025
|
rb_define_const(mSSL, "OP_NO_SSLv3", ULONG2NUM(SSL_OP_NO_SSLv3));
|
2925
3026
|
rb_define_const(mSSL, "OP_NO_TLSv1", ULONG2NUM(SSL_OP_NO_TLSv1));
|
2926
3027
|
rb_define_const(mSSL, "OP_NO_TLSv1_1", ULONG2NUM(SSL_OP_NO_TLSv1_1));
|
@@ -2928,6 +3029,12 @@ Init_ossl_ssl(void)
|
|
2928
3029
|
#ifdef SSL_OP_NO_TLSv1_3 /* OpenSSL 1.1.1 */
|
2929
3030
|
rb_define_const(mSSL, "OP_NO_TLSv1_3", ULONG2NUM(SSL_OP_NO_TLSv1_3));
|
2930
3031
|
#endif
|
3032
|
+
rb_define_const(mSSL, "OP_CIPHER_SERVER_PREFERENCE", ULONG2NUM(SSL_OP_CIPHER_SERVER_PREFERENCE));
|
3033
|
+
rb_define_const(mSSL, "OP_TLS_ROLLBACK_BUG", ULONG2NUM(SSL_OP_TLS_ROLLBACK_BUG));
|
3034
|
+
#ifdef SSL_OP_NO_RENEGOTIATION /* OpenSSL 1.1.1 */
|
3035
|
+
rb_define_const(mSSL, "OP_NO_RENEGOTIATION", ULONG2NUM(SSL_OP_NO_RENEGOTIATION));
|
3036
|
+
#endif
|
3037
|
+
rb_define_const(mSSL, "OP_CRYPTOPRO_TLSEXT_BUG", ULONG2NUM(SSL_OP_CRYPTOPRO_TLSEXT_BUG));
|
2931
3038
|
|
2932
3039
|
/* SSL_OP_* flags for DTLS */
|
2933
3040
|
#if 0
|
@@ -2992,16 +3099,16 @@ Init_ossl_ssl(void)
|
|
2992
3099
|
#endif
|
2993
3100
|
|
2994
3101
|
|
2995
|
-
sym_exception = ID2SYM(
|
2996
|
-
sym_wait_readable = ID2SYM(
|
2997
|
-
sym_wait_writable = ID2SYM(
|
3102
|
+
sym_exception = ID2SYM(rb_intern_const("exception"));
|
3103
|
+
sym_wait_readable = ID2SYM(rb_intern_const("wait_readable"));
|
3104
|
+
sym_wait_writable = ID2SYM(rb_intern_const("wait_writable"));
|
2998
3105
|
|
2999
|
-
id_tmp_dh_callback =
|
3000
|
-
|
3001
|
-
|
3106
|
+
id_tmp_dh_callback = rb_intern_const("tmp_dh_callback");
|
3107
|
+
id_npn_protocols_encoded = rb_intern_const("npn_protocols_encoded");
|
3108
|
+
id_each = rb_intern_const("each");
|
3002
3109
|
|
3003
3110
|
#define DefIVarID(name) do \
|
3004
|
-
id_i_##name =
|
3111
|
+
id_i_##name = rb_intern_const("@"#name); while (0)
|
3005
3112
|
|
3006
3113
|
DefIVarID(cert_store);
|
3007
3114
|
DefIVarID(ca_file);
|
@@ -3015,7 +3122,6 @@ Init_ossl_ssl(void)
|
|
3015
3122
|
DefIVarID(key);
|
3016
3123
|
DefIVarID(extra_chain_cert);
|
3017
3124
|
DefIVarID(client_cert_cb);
|
3018
|
-
DefIVarID(tmp_ecdh_callback);
|
3019
3125
|
DefIVarID(timeout);
|
3020
3126
|
DefIVarID(session_id_context);
|
3021
3127
|
DefIVarID(session_get_cb);
|
@@ -3027,8 +3133,10 @@ Init_ossl_ssl(void)
|
|
3027
3133
|
DefIVarID(alpn_select_cb);
|
3028
3134
|
DefIVarID(servername_cb);
|
3029
3135
|
DefIVarID(verify_hostname);
|
3136
|
+
DefIVarID(keylog_cb);
|
3030
3137
|
|
3031
3138
|
DefIVarID(io);
|
3032
3139
|
DefIVarID(context);
|
3033
3140
|
DefIVarID(hostname);
|
3141
|
+
#endif /* !defined(OPENSSL_NO_SOCK) */
|
3034
3142
|
}
|