openssl 2.1.3 → 3.0.1

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.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +35 -45
  3. data/History.md +237 -1
  4. data/README.md +2 -2
  5. data/ext/openssl/extconf.rb +46 -38
  6. data/ext/openssl/openssl_missing.c +0 -66
  7. data/ext/openssl/openssl_missing.h +59 -43
  8. data/ext/openssl/ossl.c +110 -64
  9. data/ext/openssl/ossl.h +27 -10
  10. data/ext/openssl/ossl_asn1.c +41 -4
  11. data/ext/openssl/ossl_bn.c +251 -134
  12. data/ext/openssl/ossl_bn.h +2 -1
  13. data/ext/openssl/ossl_cipher.c +38 -29
  14. data/ext/openssl/ossl_config.c +412 -41
  15. data/ext/openssl/ossl_config.h +4 -7
  16. data/ext/openssl/ossl_digest.c +25 -60
  17. data/ext/openssl/ossl_engine.c +18 -27
  18. data/ext/openssl/ossl_hmac.c +60 -145
  19. data/ext/openssl/ossl_kdf.c +11 -19
  20. data/ext/openssl/ossl_ns_spki.c +1 -1
  21. data/ext/openssl/ossl_ocsp.c +9 -62
  22. data/ext/openssl/ossl_ocsp.h +3 -3
  23. data/ext/openssl/ossl_pkcs12.c +21 -3
  24. data/ext/openssl/ossl_pkcs7.c +45 -78
  25. data/ext/openssl/ossl_pkcs7.h +16 -0
  26. data/ext/openssl/ossl_pkey.c +1295 -178
  27. data/ext/openssl/ossl_pkey.h +35 -72
  28. data/ext/openssl/ossl_pkey_dh.c +124 -334
  29. data/ext/openssl/ossl_pkey_dsa.c +93 -398
  30. data/ext/openssl/ossl_pkey_ec.c +159 -318
  31. data/ext/openssl/ossl_pkey_rsa.c +105 -484
  32. data/ext/openssl/ossl_rand.c +2 -32
  33. data/ext/openssl/ossl_ssl.c +347 -394
  34. data/ext/openssl/ossl_ssl_session.c +24 -29
  35. data/ext/openssl/ossl_ts.c +1539 -0
  36. data/ext/openssl/ossl_ts.h +16 -0
  37. data/ext/openssl/ossl_x509.c +0 -6
  38. data/ext/openssl/ossl_x509cert.c +169 -13
  39. data/ext/openssl/ossl_x509crl.c +13 -10
  40. data/ext/openssl/ossl_x509ext.c +15 -2
  41. data/ext/openssl/ossl_x509name.c +15 -4
  42. data/ext/openssl/ossl_x509req.c +13 -10
  43. data/ext/openssl/ossl_x509revoked.c +3 -3
  44. data/ext/openssl/ossl_x509store.c +154 -70
  45. data/lib/openssl/bn.rb +1 -1
  46. data/lib/openssl/buffering.rb +37 -5
  47. data/lib/openssl/cipher.rb +1 -1
  48. data/lib/openssl/digest.rb +10 -12
  49. data/lib/openssl/hmac.rb +78 -0
  50. data/lib/openssl/marshal.rb +30 -0
  51. data/lib/openssl/pkcs5.rb +1 -1
  52. data/lib/openssl/pkey.rb +443 -1
  53. data/lib/openssl/ssl.rb +47 -9
  54. data/lib/openssl/version.rb +5 -0
  55. data/lib/openssl/x509.rb +177 -1
  56. data/lib/openssl.rb +24 -9
  57. metadata +10 -79
  58. data/ext/openssl/deprecation.rb +0 -27
  59. data/ext/openssl/ossl_version.h +0 -15
  60. data/ext/openssl/ruby_missing.h +0 -24
  61. data/lib/openssl/config.rb +0 -492
@@ -38,14 +38,14 @@ VALUE cSSLSocket;
38
38
  static VALUE eSSLErrorWaitReadable;
39
39
  static VALUE eSSLErrorWaitWritable;
40
40
 
41
- static ID id_call, ID_callback_state, id_tmp_dh_callback, id_tmp_ecdh_callback,
41
+ static ID id_call, ID_callback_state, id_tmp_dh_callback,
42
42
  id_npn_protocols_encoded, id_each;
43
43
  static VALUE sym_exception, sym_wait_readable, sym_wait_writable;
44
44
 
45
45
  static ID id_i_cert_store, id_i_ca_file, id_i_ca_path, id_i_verify_mode,
46
46
  id_i_verify_depth, id_i_verify_callback, id_i_client_ca,
47
47
  id_i_renegotiation_cb, id_i_cert, id_i_key, id_i_extra_chain_cert,
48
- id_i_client_cert_cb, id_i_tmp_ecdh_callback, id_i_timeout,
48
+ id_i_client_cert_cb, id_i_timeout,
49
49
  id_i_session_id_context, id_i_session_get_cb, id_i_session_new_cb,
50
50
  id_i_session_remove_cb, id_i_npn_select_cb, id_i_npn_protocols,
51
51
  id_i_alpn_select_cb, id_i_alpn_protocols, id_i_servername_cb,
@@ -55,9 +55,6 @@ static ID id_i_io, id_i_context, id_i_hostname;
55
55
  static int ossl_ssl_ex_vcb_idx;
56
56
  static int ossl_ssl_ex_ptr_idx;
57
57
  static int ossl_sslctx_ex_ptr_idx;
58
- #if !defined(HAVE_X509_STORE_UP_REF)
59
- static int ossl_sslctx_ex_store_p;
60
- #endif
61
58
 
62
59
  static void
63
60
  ossl_sslctx_mark(void *ptr)
@@ -69,12 +66,7 @@ ossl_sslctx_mark(void *ptr)
69
66
  static void
70
67
  ossl_sslctx_free(void *ptr)
71
68
  {
72
- SSL_CTX *ctx = ptr;
73
- #if !defined(HAVE_X509_STORE_UP_REF)
74
- if (ctx && SSL_CTX_get_ex_data(ctx, ossl_sslctx_ex_store_p))
75
- ctx->cert_store = NULL;
76
- #endif
77
- SSL_CTX_free(ctx);
69
+ SSL_CTX_free(ptr);
78
70
  }
79
71
 
80
72
  static const rb_data_type_t ossl_sslctx_type = {
@@ -96,7 +88,7 @@ ossl_sslctx_s_alloc(VALUE klass)
96
88
  VALUE obj;
97
89
 
98
90
  obj = TypedData_Wrap_Struct(klass, &ossl_sslctx_type, 0);
99
- #if OPENSSL_VERSION_NUMBER >= 0x10100000 && !defined(LIBRESSL_VERSION_NUMBER)
91
+ #if OPENSSL_VERSION_NUMBER >= 0x10100000 || defined(LIBRESSL_VERSION_NUMBER)
100
92
  ctx = SSL_CTX_new(TLS_method());
101
93
  #else
102
94
  ctx = SSL_CTX_new(SSLv23_method());
@@ -108,14 +100,15 @@ ossl_sslctx_s_alloc(VALUE klass)
108
100
  RTYPEDDATA_DATA(obj) = ctx;
109
101
  SSL_CTX_set_ex_data(ctx, ossl_sslctx_ex_ptr_idx, (void *)obj);
110
102
 
111
- #if !defined(OPENSSL_NO_EC) && defined(HAVE_SSL_CTX_SET_ECDH_AUTO)
103
+ #if !defined(OPENSSL_NO_EC) && OPENSSL_VERSION_NUMBER < 0x10100000 && \
104
+ !defined(LIBRESSL_VERSION_NUMBER)
112
105
  /* We use SSL_CTX_set1_curves_list() to specify the curve used in ECDH. It
113
106
  * allows to specify multiple curve names and OpenSSL will select
114
107
  * automatically from them. In OpenSSL 1.0.2, the automatic selection has to
115
- * be enabled explicitly. But OpenSSL 1.1.0 removed the knob and it is
116
- * always enabled. To uniform the behavior, we enable the automatic
117
- * selection also in 1.0.2. Users can still disable ECDH by removing ECDH
118
- * cipher suites by SSLContext#ciphers=. */
108
+ * be enabled explicitly. OpenSSL 1.1.0 and LibreSSL 2.6.1 removed the knob
109
+ * and it is always enabled. To uniform the behavior, we enable the
110
+ * automatic selection also in 1.0.2. Users can still disable ECDH by
111
+ * removing ECDH cipher suites by SSLContext#ciphers=. */
119
112
  if (!SSL_CTX_set_ecdh_auto(ctx, 1))
120
113
  ossl_raise(eSSLError, "SSL_CTX_set_ecdh_auto");
121
114
  #endif
@@ -244,8 +237,7 @@ ossl_client_cert_cb(SSL *ssl, X509 **x509, EVP_PKEY **pkey)
244
237
  return 1;
245
238
  }
246
239
 
247
- #if !defined(OPENSSL_NO_DH) || \
248
- !defined(OPENSSL_NO_EC) && defined(HAVE_SSL_CTX_SET_TMP_ECDH_CALLBACK)
240
+ #if !defined(OPENSSL_NO_DH)
249
241
  struct tmp_dh_callback_args {
250
242
  VALUE ssl_obj;
251
243
  ID id;
@@ -254,22 +246,23 @@ struct tmp_dh_callback_args {
254
246
  int keylength;
255
247
  };
256
248
 
257
- static EVP_PKEY *
258
- ossl_call_tmp_dh_callback(struct tmp_dh_callback_args *args)
249
+ static VALUE
250
+ ossl_call_tmp_dh_callback(VALUE arg)
259
251
  {
252
+ struct tmp_dh_callback_args *args = (struct tmp_dh_callback_args *)arg;
260
253
  VALUE cb, dh;
261
254
  EVP_PKEY *pkey;
262
255
 
263
256
  cb = rb_funcall(args->ssl_obj, args->id, 0);
264
257
  if (NIL_P(cb))
265
- return NULL;
258
+ return (VALUE)NULL;
266
259
  dh = rb_funcall(cb, id_call, 3, args->ssl_obj, INT2NUM(args->is_export),
267
260
  INT2NUM(args->keylength));
268
261
  pkey = GetPKeyPtr(dh);
269
262
  if (EVP_PKEY_base_id(pkey) != args->type)
270
- return NULL;
263
+ return (VALUE)NULL;
271
264
 
272
- return pkey;
265
+ return (VALUE)pkey;
273
266
  }
274
267
  #endif
275
268
 
@@ -289,7 +282,7 @@ ossl_tmp_dh_callback(SSL *ssl, int is_export, int keylength)
289
282
  args.keylength = keylength;
290
283
  args.type = EVP_PKEY_DH;
291
284
 
292
- pkey = (EVP_PKEY *)rb_protect((VALUE (*)(VALUE))ossl_call_tmp_dh_callback,
285
+ pkey = (EVP_PKEY *)rb_protect(ossl_call_tmp_dh_callback,
293
286
  (VALUE)&args, &state);
294
287
  if (state) {
295
288
  rb_ivar_set(rb_ssl, ID_callback_state, INT2NUM(state));
@@ -302,35 +295,6 @@ ossl_tmp_dh_callback(SSL *ssl, int is_export, int keylength)
302
295
  }
303
296
  #endif /* OPENSSL_NO_DH */
304
297
 
305
- #if !defined(OPENSSL_NO_EC) && defined(HAVE_SSL_CTX_SET_TMP_ECDH_CALLBACK)
306
- static EC_KEY *
307
- ossl_tmp_ecdh_callback(SSL *ssl, int is_export, int keylength)
308
- {
309
- VALUE rb_ssl;
310
- EVP_PKEY *pkey;
311
- struct tmp_dh_callback_args args;
312
- int state;
313
-
314
- rb_ssl = (VALUE)SSL_get_ex_data(ssl, ossl_ssl_ex_ptr_idx);
315
- args.ssl_obj = rb_ssl;
316
- args.id = id_tmp_ecdh_callback;
317
- args.is_export = is_export;
318
- args.keylength = keylength;
319
- args.type = EVP_PKEY_EC;
320
-
321
- pkey = (EVP_PKEY *)rb_protect((VALUE (*)(VALUE))ossl_call_tmp_dh_callback,
322
- (VALUE)&args, &state);
323
- if (state) {
324
- rb_ivar_set(rb_ssl, ID_callback_state, INT2NUM(state));
325
- return NULL;
326
- }
327
- if (!pkey)
328
- return NULL;
329
-
330
- return EVP_PKEY_get0_EC_KEY(pkey);
331
- }
332
- #endif
333
-
334
298
  static VALUE
335
299
  call_verify_certificate_identity(VALUE ctx_v)
336
300
  {
@@ -400,7 +364,7 @@ ossl_call_session_get_cb(VALUE ary)
400
364
  }
401
365
 
402
366
  static SSL_SESSION *
403
- #if (!defined(LIBRESSL_VERSION_NUMBER) ? OPENSSL_VERSION_NUMBER >= 0x10100000 : LIBRESSL_VERSION_NUMBER >= 0x2080000f)
367
+ #if defined(LIBRESSL_VERSION_NUMBER) || OPENSSL_VERSION_NUMBER >= 0x10100000
404
368
  ossl_sslctx_session_get_cb(SSL *ssl, const unsigned char *buf, int len, int *copy)
405
369
  #else
406
370
  ossl_sslctx_session_get_cb(SSL *ssl, unsigned char *buf, int len, int *copy)
@@ -609,8 +573,6 @@ ssl_renegotiation_cb(const SSL *ssl)
609
573
  rb_funcallv(cb, id_call, 1, &ssl_obj);
610
574
  }
611
575
 
612
- #if !defined(OPENSSL_NO_NEXTPROTONEG) || \
613
- defined(HAVE_SSL_CTX_SET_ALPN_SELECT_CB)
614
576
  static VALUE
615
577
  ssl_npn_encode_protocol_i(RB_BLOCK_CALL_FUNC_ARGLIST(cur, encoded))
616
578
  {
@@ -692,7 +654,6 @@ ssl_npn_select_cb_common(SSL *ssl, VALUE cb, const unsigned char **out,
692
654
 
693
655
  return SSL_TLSEXT_ERR_OK;
694
656
  }
695
- #endif
696
657
 
697
658
  #ifndef OPENSSL_NO_NEXTPROTONEG
698
659
  static int
@@ -721,7 +682,6 @@ ssl_npn_select_cb(SSL *ssl, unsigned char **out, unsigned char *outlen,
721
682
  }
722
683
  #endif
723
684
 
724
- #ifdef HAVE_SSL_CTX_SET_ALPN_SELECT_CB
725
685
  static int
726
686
  ssl_alpn_select_cb(SSL *ssl, const unsigned char **out, unsigned char *outlen,
727
687
  const unsigned char *in, unsigned int inlen, void *arg)
@@ -733,7 +693,6 @@ ssl_alpn_select_cb(SSL *ssl, const unsigned char **out, unsigned char *outlen,
733
693
 
734
694
  return ssl_npn_select_cb_common(ssl, cb, out, outlen, in, inlen);
735
695
  }
736
- #endif
737
696
 
738
697
  /* This function may serve as the entry point to support further callbacks. */
739
698
  static void
@@ -810,41 +769,15 @@ ossl_sslctx_setup(VALUE self)
810
769
  SSL_CTX_set_tmp_dh_callback(ctx, ossl_tmp_dh_callback);
811
770
  #endif
812
771
 
813
- #if !defined(OPENSSL_NO_EC)
814
- /* We added SSLContext#tmp_ecdh_callback= in Ruby 2.3.0,
815
- * but SSL_CTX_set_tmp_ecdh_callback() was removed in OpenSSL 1.1.0. */
816
- if (RTEST(rb_attr_get(self, id_i_tmp_ecdh_callback))) {
817
- # if defined(HAVE_SSL_CTX_SET_TMP_ECDH_CALLBACK)
818
- rb_warn("#tmp_ecdh_callback= is deprecated; use #ecdh_curves= instead");
819
- SSL_CTX_set_tmp_ecdh_callback(ctx, ossl_tmp_ecdh_callback);
820
- # if defined(HAVE_SSL_CTX_SET_ECDH_AUTO)
821
- /* tmp_ecdh_callback and ecdh_auto conflict; OpenSSL ignores
822
- * tmp_ecdh_callback. So disable ecdh_auto. */
823
- if (!SSL_CTX_set_ecdh_auto(ctx, 0))
824
- ossl_raise(eSSLError, "SSL_CTX_set_ecdh_auto");
825
- # endif
826
- # else
827
- ossl_raise(eSSLError, "OpenSSL does not support tmp_ecdh_callback; "
828
- "use #ecdh_curves= instead");
829
- # endif
830
- }
831
- #endif /* OPENSSL_NO_EC */
772
+ #ifdef HAVE_SSL_CTX_SET_POST_HANDSHAKE_AUTH
773
+ SSL_CTX_set_post_handshake_auth(ctx, 1);
774
+ #endif
832
775
 
833
776
  val = rb_attr_get(self, id_i_cert_store);
834
777
  if (!NIL_P(val)) {
835
778
  X509_STORE *store = GetX509StorePtr(val); /* NO NEED TO DUP */
836
779
  SSL_CTX_set_cert_store(ctx, store);
837
- #if !defined(HAVE_X509_STORE_UP_REF)
838
- /*
839
- * WORKAROUND:
840
- * X509_STORE can count references, but
841
- * X509_STORE_free() doesn't care it.
842
- * So we won't increment it but mark it by ex_data.
843
- */
844
- SSL_CTX_set_ex_data(ctx, ossl_sslctx_ex_store_p, ctx);
845
- #else /* Fixed in OpenSSL 1.0.2; bff9ce4db38b (master), 5b4b9ce976fc (1.0.2) */
846
780
  X509_STORE_up_ref(store);
847
- #endif
848
781
  }
849
782
 
850
783
  val = rb_attr_get(self, id_i_extra_chain_cert);
@@ -895,10 +828,17 @@ ossl_sslctx_setup(VALUE self)
895
828
  ca_file = NIL_P(val) ? NULL : StringValueCStr(val);
896
829
  val = rb_attr_get(self, id_i_ca_path);
897
830
  ca_path = NIL_P(val) ? NULL : StringValueCStr(val);
831
+ #ifdef HAVE_SSL_CTX_LOAD_VERIFY_FILE
832
+ if (ca_file && !SSL_CTX_load_verify_file(ctx, ca_file))
833
+ ossl_raise(eSSLError, "SSL_CTX_load_verify_file");
834
+ if (ca_path && !SSL_CTX_load_verify_dir(ctx, ca_path))
835
+ ossl_raise(eSSLError, "SSL_CTX_load_verify_dir");
836
+ #else
898
837
  if(ca_file || ca_path){
899
838
  if (!SSL_CTX_load_verify_locations(ctx, ca_file, ca_path))
900
839
  rb_warning("can't set verify locations");
901
840
  }
841
+ #endif
902
842
 
903
843
  val = rb_attr_get(self, id_i_verify_mode);
904
844
  verify_mode = NIL_P(val) ? SSL_VERIFY_NONE : NUM2INT(val);
@@ -926,7 +866,6 @@ ossl_sslctx_setup(VALUE self)
926
866
  }
927
867
  #endif
928
868
 
929
- #ifdef HAVE_SSL_CTX_SET_ALPN_SELECT_CB
930
869
  val = rb_attr_get(self, id_i_alpn_protocols);
931
870
  if (!NIL_P(val)) {
932
871
  VALUE rprotos = ssl_encode_npn_protocols(val);
@@ -941,7 +880,6 @@ ossl_sslctx_setup(VALUE self)
941
880
  SSL_CTX_set_alpn_select_cb(ctx, ssl_alpn_select_cb, (void *) self);
942
881
  OSSL_Debug("SSL ALPN select callback added");
943
882
  }
944
- #endif
945
883
 
946
884
  rb_obj_freeze(self);
947
885
 
@@ -1063,6 +1001,52 @@ ossl_sslctx_set_ciphers(VALUE self, VALUE v)
1063
1001
  return v;
1064
1002
  }
1065
1003
 
1004
+ #ifndef OPENSSL_NO_DH
1005
+ /*
1006
+ * call-seq:
1007
+ * ctx.tmp_dh = pkey
1008
+ *
1009
+ * Sets DH parameters used for ephemeral DH key exchange. This is relevant for
1010
+ * servers only.
1011
+ *
1012
+ * +pkey+ is an instance of OpenSSL::PKey::DH. Note that key components
1013
+ * contained in the key object, if any, are ignored. The server will always
1014
+ * generate a new key pair for each handshake.
1015
+ *
1016
+ * Added in version 3.0. See also the man page SSL_set0_tmp_dh_pkey(3).
1017
+ *
1018
+ * Example:
1019
+ * ctx = OpenSSL::SSL::SSLContext.new
1020
+ * ctx.tmp_dh = OpenSSL::DH.generate(2048)
1021
+ * svr = OpenSSL::SSL::SSLServer.new(tcp_svr, ctx)
1022
+ * Thread.new { svr.accept }
1023
+ */
1024
+ static VALUE
1025
+ ossl_sslctx_set_tmp_dh(VALUE self, VALUE arg)
1026
+ {
1027
+ SSL_CTX *ctx;
1028
+ EVP_PKEY *pkey;
1029
+
1030
+ rb_check_frozen(self);
1031
+ GetSSLCTX(self, ctx);
1032
+ pkey = GetPKeyPtr(arg);
1033
+
1034
+ if (EVP_PKEY_base_id(pkey) != EVP_PKEY_DH)
1035
+ rb_raise(eSSLError, "invalid pkey type %s (expected DH)",
1036
+ OBJ_nid2sn(EVP_PKEY_base_id(pkey)));
1037
+ #ifdef HAVE_SSL_SET0_TMP_DH_PKEY
1038
+ if (!SSL_CTX_set0_tmp_dh_pkey(ctx, pkey))
1039
+ ossl_raise(eSSLError, "SSL_CTX_set0_tmp_dh_pkey");
1040
+ EVP_PKEY_up_ref(pkey);
1041
+ #else
1042
+ if (!SSL_CTX_set_tmp_dh(ctx, EVP_PKEY_get0_DH(pkey)))
1043
+ ossl_raise(eSSLError, "SSL_CTX_set_tmp_dh");
1044
+ #endif
1045
+
1046
+ return arg;
1047
+ }
1048
+ #endif
1049
+
1066
1050
  #if !defined(OPENSSL_NO_EC)
1067
1051
  /*
1068
1052
  * call-seq:
@@ -1074,9 +1058,6 @@ ossl_sslctx_set_ciphers(VALUE self, VALUE v)
1074
1058
  * Extension. For a server, the list is used by OpenSSL to determine the set of
1075
1059
  * shared curves. OpenSSL will pick the most appropriate one from it.
1076
1060
  *
1077
- * Note that this works differently with old OpenSSL (<= 1.0.1). Only one curve
1078
- * can be set, and this has no effect for TLS clients.
1079
- *
1080
1061
  * === Example
1081
1062
  * ctx1 = OpenSSL::SSL::SSLContext.new
1082
1063
  * ctx1.ecdh_curves = "X25519:P-256:P-224"
@@ -1100,48 +1081,8 @@ ossl_sslctx_set_ecdh_curves(VALUE self, VALUE arg)
1100
1081
  GetSSLCTX(self, ctx);
1101
1082
  StringValueCStr(arg);
1102
1083
 
1103
- #if defined(HAVE_SSL_CTX_SET1_CURVES_LIST)
1104
1084
  if (!SSL_CTX_set1_curves_list(ctx, RSTRING_PTR(arg)))
1105
1085
  ossl_raise(eSSLError, NULL);
1106
- #else
1107
- /* OpenSSL does not have SSL_CTX_set1_curves_list()... Fallback to
1108
- * SSL_CTX_set_tmp_ecdh(). So only the first curve is used. */
1109
- {
1110
- VALUE curve, splitted;
1111
- EC_KEY *ec;
1112
- int nid;
1113
-
1114
- splitted = rb_str_split(arg, ":");
1115
- if (!RARRAY_LEN(splitted))
1116
- ossl_raise(eSSLError, "invalid input format");
1117
- curve = RARRAY_AREF(splitted, 0);
1118
- StringValueCStr(curve);
1119
-
1120
- /* SSL_CTX_set1_curves_list() accepts NIST names */
1121
- nid = EC_curve_nist2nid(RSTRING_PTR(curve));
1122
- if (nid == NID_undef)
1123
- nid = OBJ_txt2nid(RSTRING_PTR(curve));
1124
- if (nid == NID_undef)
1125
- ossl_raise(eSSLError, "unknown curve name");
1126
-
1127
- ec = EC_KEY_new_by_curve_name(nid);
1128
- if (!ec)
1129
- ossl_raise(eSSLError, NULL);
1130
- EC_KEY_set_asn1_flag(ec, OPENSSL_EC_NAMED_CURVE);
1131
- if (!SSL_CTX_set_tmp_ecdh(ctx, ec)) {
1132
- EC_KEY_free(ec);
1133
- ossl_raise(eSSLError, "SSL_CTX_set_tmp_ecdh");
1134
- }
1135
- EC_KEY_free(ec);
1136
- # if defined(HAVE_SSL_CTX_SET_ECDH_AUTO)
1137
- /* tmp_ecdh and ecdh_auto conflict. tmp_ecdh is ignored when ecdh_auto
1138
- * is enabled. So disable ecdh_auto. */
1139
- if (!SSL_CTX_set_ecdh_auto(ctx, 0))
1140
- ossl_raise(eSSLError, "SSL_CTX_set_ecdh_auto");
1141
- # endif
1142
- }
1143
- #endif
1144
-
1145
1086
  return arg;
1146
1087
  }
1147
1088
  #else
@@ -1232,7 +1173,7 @@ ossl_sslctx_enable_fallback_scsv(VALUE self)
1232
1173
 
1233
1174
  /*
1234
1175
  * call-seq:
1235
- * ctx.add_certificate(certiticate, pkey [, extra_certs]) -> self
1176
+ * ctx.add_certificate(certificate, pkey [, extra_certs]) -> self
1236
1177
  *
1237
1178
  * Adds a certificate to the context. _pkey_ must be a corresponding private
1238
1179
  * key with _certificate_.
@@ -1264,10 +1205,6 @@ ossl_sslctx_enable_fallback_scsv(VALUE self)
1264
1205
  * ecdsa_pkey = ...
1265
1206
  * another_ca_cert = ...
1266
1207
  * ctx.add_certificate(ecdsa_cert, ecdsa_pkey, [another_ca_cert])
1267
- *
1268
- * === Note
1269
- * OpenSSL before the version 1.0.2 could handle only one extra chain across
1270
- * all key types. Calling this method discards the chain set previously.
1271
1208
  */
1272
1209
  static VALUE
1273
1210
  ossl_sslctx_add_certificate(int argc, VALUE *argv, VALUE self)
@@ -1292,7 +1229,7 @@ ossl_sslctx_add_certificate(int argc, VALUE *argv, VALUE self)
1292
1229
  EVP_PKEY_free(pub_pkey);
1293
1230
  if (!pub_pkey)
1294
1231
  rb_raise(rb_eArgError, "certificate does not contain public key");
1295
- if (EVP_PKEY_cmp(pub_pkey, pkey) != 1)
1232
+ if (EVP_PKEY_eq(pub_pkey, pkey) != 1)
1296
1233
  rb_raise(rb_eArgError, "public key mismatch");
1297
1234
 
1298
1235
  if (argc >= 3)
@@ -1306,34 +1243,9 @@ ossl_sslctx_add_certificate(int argc, VALUE *argv, VALUE self)
1306
1243
  sk_X509_pop_free(extra_chain, X509_free);
1307
1244
  ossl_raise(eSSLError, "SSL_CTX_use_PrivateKey");
1308
1245
  }
1309
-
1310
- if (extra_chain) {
1311
- #if OPENSSL_VERSION_NUMBER >= 0x10002000 && !defined(LIBRESSL_VERSION_NUMBER)
1312
- if (!SSL_CTX_set0_chain(ctx, extra_chain)) {
1313
- sk_X509_pop_free(extra_chain, X509_free);
1314
- ossl_raise(eSSLError, "SSL_CTX_set0_chain");
1315
- }
1316
- #else
1317
- STACK_OF(X509) *orig_extra_chain;
1318
- X509 *x509_tmp;
1319
-
1320
- /* First, clear the existing chain */
1321
- SSL_CTX_get_extra_chain_certs(ctx, &orig_extra_chain);
1322
- if (orig_extra_chain && sk_X509_num(orig_extra_chain)) {
1323
- rb_warning("SSL_CTX_set0_chain() is not available; " \
1324
- "clearing previously set certificate chain");
1325
- SSL_CTX_clear_extra_chain_certs(ctx);
1326
- }
1327
- while ((x509_tmp = sk_X509_shift(extra_chain))) {
1328
- /* Transfers ownership */
1329
- if (!SSL_CTX_add_extra_chain_cert(ctx, x509_tmp)) {
1330
- X509_free(x509_tmp);
1331
- sk_X509_pop_free(extra_chain, X509_free);
1332
- ossl_raise(eSSLError, "SSL_CTX_add_extra_chain_cert");
1333
- }
1334
- }
1335
- sk_X509_free(extra_chain);
1336
- #endif
1246
+ if (extra_chain && !SSL_CTX_set0_chain(ctx, extra_chain)) {
1247
+ sk_X509_pop_free(extra_chain, X509_free);
1248
+ ossl_raise(eSSLError, "SSL_CTX_set0_chain");
1337
1249
  }
1338
1250
  return self;
1339
1251
  }
@@ -1531,8 +1443,8 @@ ossl_sslctx_flush_sessions(int argc, VALUE *argv, VALUE self)
1531
1443
  static inline int
1532
1444
  ssl_started(SSL *ssl)
1533
1445
  {
1534
- /* the FD is set in ossl_ssl_setup(), called by #connect or #accept */
1535
- return SSL_get_fd(ssl) >= 0;
1446
+ /* BIO is created through ossl_ssl_setup(), called by #connect or #accept */
1447
+ return SSL_get_rbio(ssl) != NULL;
1536
1448
  }
1537
1449
 
1538
1450
  static void
@@ -1563,6 +1475,29 @@ ossl_ssl_s_alloc(VALUE klass)
1563
1475
  return TypedData_Wrap_Struct(klass, &ossl_ssl_type, NULL);
1564
1476
  }
1565
1477
 
1478
+ static VALUE
1479
+ peer_ip_address(VALUE self)
1480
+ {
1481
+ VALUE remote_address = rb_funcall(rb_attr_get(self, id_i_io), rb_intern("remote_address"), 0);
1482
+
1483
+ return rb_funcall(remote_address, rb_intern("inspect_sockaddr"), 0);
1484
+ }
1485
+
1486
+ static VALUE
1487
+ fallback_peer_ip_address(VALUE self, VALUE args)
1488
+ {
1489
+ return rb_str_new_cstr("(null)");
1490
+ }
1491
+
1492
+ static VALUE
1493
+ peeraddr_ip_str(VALUE self)
1494
+ {
1495
+ VALUE rb_mErrno = rb_const_get(rb_cObject, rb_intern("Errno"));
1496
+ VALUE rb_eSystemCallError = rb_const_get(rb_mErrno, rb_intern("SystemCallError"));
1497
+
1498
+ return rb_rescue2(peer_ip_address, self, fallback_peer_ip_address, (VALUE)0, rb_eSystemCallError, NULL);
1499
+ }
1500
+
1566
1501
  /*
1567
1502
  * call-seq:
1568
1503
  * SSLSocket.new(io) => aSSLSocket
@@ -1599,6 +1534,7 @@ ossl_ssl_initialize(int argc, VALUE *argv, VALUE self)
1599
1534
 
1600
1535
  if (rb_respond_to(io, rb_intern("nonblock=")))
1601
1536
  rb_funcall(io, rb_intern("nonblock="), 1, Qtrue);
1537
+ Check_Type(io, T_FILE);
1602
1538
  rb_ivar_set(self, id_i_io, io);
1603
1539
 
1604
1540
  ssl = SSL_new(ctx);
@@ -1666,6 +1602,26 @@ no_exception_p(VALUE opts)
1666
1602
  return 0;
1667
1603
  }
1668
1604
 
1605
+ static void
1606
+ io_wait_writable(rb_io_t *fptr)
1607
+ {
1608
+ #ifdef HAVE_RB_IO_MAYBE_WAIT
1609
+ rb_io_maybe_wait_writable(errno, fptr->self, Qnil);
1610
+ #else
1611
+ rb_io_wait_writable(fptr->fd);
1612
+ #endif
1613
+ }
1614
+
1615
+ static void
1616
+ io_wait_readable(rb_io_t *fptr)
1617
+ {
1618
+ #ifdef HAVE_RB_IO_MAYBE_WAIT
1619
+ rb_io_maybe_wait_readable(errno, fptr->self, Qnil);
1620
+ #else
1621
+ rb_io_wait_readable(fptr->fd);
1622
+ #endif
1623
+ }
1624
+
1669
1625
  static VALUE
1670
1626
  ossl_start_ssl(VALUE self, int (*func)(), const char *funcname, VALUE opts)
1671
1627
  {
@@ -1700,12 +1656,12 @@ ossl_start_ssl(VALUE self, int (*func)(), const char *funcname, VALUE opts)
1700
1656
  case SSL_ERROR_WANT_WRITE:
1701
1657
  if (no_exception_p(opts)) { return sym_wait_writable; }
1702
1658
  write_would_block(nonblock);
1703
- rb_io_wait_writable(fptr->fd);
1659
+ io_wait_writable(fptr);
1704
1660
  continue;
1705
1661
  case SSL_ERROR_WANT_READ:
1706
1662
  if (no_exception_p(opts)) { return sym_wait_readable; }
1707
1663
  read_would_block(nonblock);
1708
- rb_io_wait_readable(fptr->fd);
1664
+ io_wait_readable(fptr);
1709
1665
  continue;
1710
1666
  case SSL_ERROR_SYSCALL:
1711
1667
  #ifdef __APPLE__
@@ -1714,7 +1670,9 @@ ossl_start_ssl(VALUE self, int (*func)(), const char *funcname, VALUE opts)
1714
1670
  continue;
1715
1671
  #endif
1716
1672
  if (errno) rb_sys_fail(funcname);
1717
- ossl_raise(eSSLError, "%s SYSCALL returned=%d errno=%d state=%s", funcname, ret2, errno, SSL_state_string_long(ssl));
1673
+ ossl_raise(eSSLError, "%s SYSCALL returned=%d errno=%d peeraddr=%"PRIsVALUE" state=%s",
1674
+ funcname, ret2, errno, peeraddr_ip_str(self), SSL_state_string_long(ssl));
1675
+
1718
1676
  #if defined(SSL_R_CERTIFICATE_VERIFY_FAILED)
1719
1677
  case SSL_ERROR_SSL:
1720
1678
  err = ERR_peek_last_error();
@@ -1727,13 +1685,15 @@ ossl_start_ssl(VALUE self, int (*func)(), const char *funcname, VALUE opts)
1727
1685
  if (!verify_msg)
1728
1686
  verify_msg = "(null)";
1729
1687
  ossl_clear_error(); /* let ossl_raise() not append message */
1730
- ossl_raise(eSSLError, "%s returned=%d errno=%d state=%s: %s (%s)",
1731
- funcname, ret2, errno, SSL_state_string_long(ssl),
1688
+ ossl_raise(eSSLError, "%s returned=%d errno=%d peeraddr=%"PRIsVALUE" state=%s: %s (%s)",
1689
+ funcname, ret2, errno, peeraddr_ip_str(self), SSL_state_string_long(ssl),
1732
1690
  err_msg, verify_msg);
1733
1691
  }
1734
1692
  #endif
1693
+ /* fallthrough */
1735
1694
  default:
1736
- ossl_raise(eSSLError, "%s returned=%d errno=%d state=%s", funcname, ret2, errno, SSL_state_string_long(ssl));
1695
+ ossl_raise(eSSLError, "%s returned=%d errno=%d peeraddr=%"PRIsVALUE" state=%s",
1696
+ funcname, ret2, errno, peeraddr_ip_str(self), SSL_state_string_long(ssl));
1737
1697
  }
1738
1698
  }
1739
1699
 
@@ -1744,8 +1704,7 @@ ossl_start_ssl(VALUE self, int (*func)(), const char *funcname, VALUE opts)
1744
1704
  * call-seq:
1745
1705
  * ssl.connect => self
1746
1706
  *
1747
- * Initiates an SSL/TLS handshake with a server. The handshake may be started
1748
- * after unencrypted data has been sent over the socket.
1707
+ * Initiates an SSL/TLS handshake with a server.
1749
1708
  */
1750
1709
  static VALUE
1751
1710
  ossl_ssl_connect(VALUE self)
@@ -1792,8 +1751,7 @@ ossl_ssl_connect_nonblock(int argc, VALUE *argv, VALUE self)
1792
1751
  * call-seq:
1793
1752
  * ssl.accept => self
1794
1753
  *
1795
- * Waits for a SSL/TLS client to initiate a handshake. The handshake may be
1796
- * started after unencrypted data has been sent over the socket.
1754
+ * Waits for a SSL/TLS client to initiate a handshake.
1797
1755
  */
1798
1756
  static VALUE
1799
1757
  ossl_ssl_accept(VALUE self)
@@ -1840,7 +1798,7 @@ static VALUE
1840
1798
  ossl_ssl_read_internal(int argc, VALUE *argv, VALUE self, int nonblock)
1841
1799
  {
1842
1800
  SSL *ssl;
1843
- int ilen, nread = 0;
1801
+ int ilen;
1844
1802
  VALUE len, str;
1845
1803
  rb_io_t *fptr;
1846
1804
  VALUE io, opts = Qnil;
@@ -1850,6 +1808,9 @@ ossl_ssl_read_internal(int argc, VALUE *argv, VALUE self, int nonblock)
1850
1808
  } else {
1851
1809
  rb_scan_args(argc, argv, "11", &len, &str);
1852
1810
  }
1811
+ GetSSL(self, ssl);
1812
+ if (!ssl_started(ssl))
1813
+ rb_raise(eSSLError, "SSL session is not started yet");
1853
1814
 
1854
1815
  ilen = NUM2INT(len);
1855
1816
  if (NIL_P(str))
@@ -1865,85 +1826,60 @@ ossl_ssl_read_internal(int argc, VALUE *argv, VALUE self, int nonblock)
1865
1826
  if (ilen == 0)
1866
1827
  return str;
1867
1828
 
1868
- GetSSL(self, ssl);
1869
1829
  io = rb_attr_get(self, id_i_io);
1870
1830
  GetOpenFile(io, fptr);
1871
- if (ssl_started(ssl)) {
1872
- rb_str_locktmp(str);
1873
- for (;;) {
1874
- nread = SSL_read(ssl, RSTRING_PTR(str), ilen);
1875
- switch(ssl_get_error(ssl, nread)){
1876
- case SSL_ERROR_NONE:
1831
+
1832
+ rb_str_locktmp(str);
1833
+ for (;;) {
1834
+ int nread = SSL_read(ssl, RSTRING_PTR(str), ilen);
1835
+ switch (ssl_get_error(ssl, nread)) {
1836
+ case SSL_ERROR_NONE:
1837
+ rb_str_unlocktmp(str);
1838
+ rb_str_set_len(str, nread);
1839
+ return str;
1840
+ case SSL_ERROR_ZERO_RETURN:
1841
+ rb_str_unlocktmp(str);
1842
+ if (no_exception_p(opts)) { return Qnil; }
1843
+ rb_eof_error();
1844
+ case SSL_ERROR_WANT_WRITE:
1845
+ if (nonblock) {
1877
1846
  rb_str_unlocktmp(str);
1878
- goto end;
1879
- case SSL_ERROR_ZERO_RETURN:
1847
+ if (no_exception_p(opts)) { return sym_wait_writable; }
1848
+ write_would_block(nonblock);
1849
+ }
1850
+ io_wait_writable(fptr);
1851
+ continue;
1852
+ case SSL_ERROR_WANT_READ:
1853
+ if (nonblock) {
1880
1854
  rb_str_unlocktmp(str);
1881
- if (no_exception_p(opts)) { return Qnil; }
1882
- rb_eof_error();
1883
- case SSL_ERROR_WANT_WRITE:
1884
- if (nonblock) {
1885
- rb_str_unlocktmp(str);
1886
- if (no_exception_p(opts)) { return sym_wait_writable; }
1887
- write_would_block(nonblock);
1888
- }
1889
- rb_io_wait_writable(fptr->fd);
1890
- continue;
1891
- case SSL_ERROR_WANT_READ:
1892
- if (nonblock) {
1893
- rb_str_unlocktmp(str);
1894
- if (no_exception_p(opts)) { return sym_wait_readable; }
1895
- read_would_block(nonblock);
1896
- }
1897
- rb_io_wait_readable(fptr->fd);
1898
- continue;
1899
- case SSL_ERROR_SYSCALL:
1900
- if (!ERR_peek_error()) {
1901
- rb_str_unlocktmp(str);
1902
- if (errno)
1903
- rb_sys_fail(0);
1904
- else {
1905
- /*
1906
- * The underlying BIO returned 0. This is actually a
1907
- * protocol error. But unfortunately, not all
1908
- * implementations cleanly shutdown the TLS connection
1909
- * but just shutdown/close the TCP connection. So report
1910
- * EOF for now...
1911
- */
1912
- if (no_exception_p(opts)) { return Qnil; }
1913
- rb_eof_error();
1914
- }
1915
- }
1916
- /* fall through */
1917
- default:
1855
+ if (no_exception_p(opts)) { return sym_wait_readable; }
1856
+ read_would_block(nonblock);
1857
+ }
1858
+ io_wait_readable(fptr);
1859
+ continue;
1860
+ case SSL_ERROR_SYSCALL:
1861
+ if (!ERR_peek_error()) {
1918
1862
  rb_str_unlocktmp(str);
1919
- ossl_raise(eSSLError, "SSL_read");
1920
- }
1921
- }
1922
- }
1923
- else {
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);
1863
+ if (errno)
1864
+ rb_sys_fail(0);
1865
+ else {
1866
+ /*
1867
+ * The underlying BIO returned 0. This is actually a
1868
+ * protocol error. But unfortunately, not all
1869
+ * implementations cleanly shutdown the TLS connection
1870
+ * but just shutdown/close the TCP connection. So report
1871
+ * EOF for now...
1872
+ */
1873
+ if (no_exception_p(opts)) { return Qnil; }
1874
+ rb_eof_error();
1875
+ }
1876
+ }
1877
+ /* fall through */
1878
+ default:
1879
+ rb_str_unlocktmp(str);
1880
+ ossl_raise(eSSLError, "SSL_read");
1938
1881
  }
1939
- #endif
1940
- else
1941
- return rb_funcall(io, meth, 2, len, str);
1942
1882
  }
1943
-
1944
- end:
1945
- rb_str_set_len(str, nread);
1946
- return str;
1947
1883
  }
1948
1884
 
1949
1885
  /*
@@ -1983,77 +1919,55 @@ static VALUE
1983
1919
  ossl_ssl_write_internal(VALUE self, VALUE str, VALUE opts)
1984
1920
  {
1985
1921
  SSL *ssl;
1986
- int nwrite = 0;
1987
1922
  rb_io_t *fptr;
1988
- int nonblock = opts != Qfalse;
1923
+ int num, nonblock = opts != Qfalse;
1989
1924
  VALUE tmp, io;
1990
1925
 
1991
- tmp = rb_str_new_frozen(StringValue(str));
1992
1926
  GetSSL(self, ssl);
1927
+ if (!ssl_started(ssl))
1928
+ rb_raise(eSSLError, "SSL session is not started yet");
1929
+
1930
+ tmp = rb_str_new_frozen(StringValue(str));
1993
1931
  io = rb_attr_get(self, id_i_io);
1994
1932
  GetOpenFile(io, fptr);
1995
- if (ssl_started(ssl)) {
1996
- for (;;) {
1997
- int num = RSTRING_LENINT(tmp);
1998
-
1999
- /* SSL_write(3ssl) manpage states num == 0 is undefined */
2000
- if (num == 0)
2001
- goto end;
2002
-
2003
- nwrite = SSL_write(ssl, RSTRING_PTR(tmp), num);
2004
- switch(ssl_get_error(ssl, nwrite)){
2005
- case SSL_ERROR_NONE:
2006
- goto end;
2007
- case SSL_ERROR_WANT_WRITE:
2008
- if (no_exception_p(opts)) { return sym_wait_writable; }
2009
- write_would_block(nonblock);
2010
- rb_io_wait_writable(fptr->fd);
2011
- continue;
2012
- case SSL_ERROR_WANT_READ:
2013
- if (no_exception_p(opts)) { return sym_wait_readable; }
2014
- read_would_block(nonblock);
2015
- rb_io_wait_readable(fptr->fd);
2016
- continue;
2017
- case SSL_ERROR_SYSCALL:
1933
+
1934
+ /* SSL_write(3ssl) manpage states num == 0 is undefined */
1935
+ num = RSTRING_LENINT(tmp);
1936
+ if (num == 0)
1937
+ return INT2FIX(0);
1938
+
1939
+ for (;;) {
1940
+ int nwritten = SSL_write(ssl, RSTRING_PTR(tmp), num);
1941
+ switch (ssl_get_error(ssl, nwritten)) {
1942
+ case SSL_ERROR_NONE:
1943
+ return INT2NUM(nwritten);
1944
+ case SSL_ERROR_WANT_WRITE:
1945
+ if (no_exception_p(opts)) { return sym_wait_writable; }
1946
+ write_would_block(nonblock);
1947
+ io_wait_writable(fptr);
1948
+ continue;
1949
+ case SSL_ERROR_WANT_READ:
1950
+ if (no_exception_p(opts)) { return sym_wait_readable; }
1951
+ read_would_block(nonblock);
1952
+ io_wait_readable(fptr);
1953
+ continue;
1954
+ case SSL_ERROR_SYSCALL:
2018
1955
  #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;
1956
+ /*
1957
+ * It appears that send syscall can return EPROTOTYPE if the
1958
+ * socket is being torn down. Retry to get a proper errno to
1959
+ * make the error handling in line with the socket library.
1960
+ * [Bug #14713] https://bugs.ruby-lang.org/issues/14713
1961
+ */
1962
+ if (errno == EPROTOTYPE)
1963
+ continue;
2027
1964
  #endif
2028
- if (errno) rb_sys_fail(0);
2029
- default:
2030
- ossl_raise(eSSLError, "SSL_write");
2031
- }
1965
+ if (errno) rb_sys_fail(0);
1966
+ /* fallthrough */
1967
+ default:
1968
+ ossl_raise(eSSLError, "SSL_write");
2032
1969
  }
2033
1970
  }
2034
- else {
2035
- ID meth = nonblock ?
2036
- rb_intern("write_nonblock") : rb_intern("syswrite");
2037
-
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);
2053
- }
2054
-
2055
- end:
2056
- return INT2NUM(nwrite);
2057
1971
  }
2058
1972
 
2059
1973
  /*
@@ -2352,7 +2266,57 @@ ossl_ssl_get_verify_result(VALUE self)
2352
2266
 
2353
2267
  GetSSL(self, ssl);
2354
2268
 
2355
- return INT2NUM(SSL_get_verify_result(ssl));
2269
+ return LONG2NUM(SSL_get_verify_result(ssl));
2270
+ }
2271
+
2272
+ /*
2273
+ * call-seq:
2274
+ * ssl.finished_message => "finished message"
2275
+ *
2276
+ * Returns the last *Finished* message sent
2277
+ *
2278
+ */
2279
+ static VALUE
2280
+ ossl_ssl_get_finished(VALUE self)
2281
+ {
2282
+ SSL *ssl;
2283
+ char sizer[1], *buf;
2284
+ size_t len;
2285
+
2286
+ GetSSL(self, ssl);
2287
+
2288
+ len = SSL_get_finished(ssl, sizer, 0);
2289
+ if (len == 0)
2290
+ return Qnil;
2291
+
2292
+ buf = ALLOCA_N(char, len);
2293
+ SSL_get_finished(ssl, buf, len);
2294
+ return rb_str_new(buf, len);
2295
+ }
2296
+
2297
+ /*
2298
+ * call-seq:
2299
+ * ssl.peer_finished_message => "peer finished message"
2300
+ *
2301
+ * Returns the last *Finished* message received
2302
+ *
2303
+ */
2304
+ static VALUE
2305
+ ossl_ssl_get_peer_finished(VALUE self)
2306
+ {
2307
+ SSL *ssl;
2308
+ char sizer[1], *buf;
2309
+ size_t len;
2310
+
2311
+ GetSSL(self, ssl);
2312
+
2313
+ len = SSL_get_peer_finished(ssl, sizer, 0);
2314
+ if (len == 0)
2315
+ return Qnil;
2316
+
2317
+ buf = ALLOCA_N(char, len);
2318
+ SSL_get_peer_finished(ssl, buf, len);
2319
+ return rb_str_new(buf, len);
2356
2320
  }
2357
2321
 
2358
2322
  /*
@@ -2403,7 +2367,6 @@ ossl_ssl_npn_protocol(VALUE self)
2403
2367
  }
2404
2368
  # endif
2405
2369
 
2406
- # ifdef HAVE_SSL_CTX_SET_ALPN_SELECT_CB
2407
2370
  /*
2408
2371
  * call-seq:
2409
2372
  * ssl.alpn_protocol => String | nil
@@ -2426,9 +2389,7 @@ ossl_ssl_alpn_protocol(VALUE self)
2426
2389
  else
2427
2390
  return rb_str_new((const char *) out, outlen);
2428
2391
  }
2429
- # endif
2430
2392
 
2431
- # ifdef HAVE_SSL_GET_SERVER_TMP_KEY
2432
2393
  /*
2433
2394
  * call-seq:
2434
2395
  * ssl.tmp_key => PKey or nil
@@ -2446,11 +2407,8 @@ ossl_ssl_tmp_key(VALUE self)
2446
2407
  return Qnil;
2447
2408
  return ossl_pkey_new(key);
2448
2409
  }
2449
- # endif /* defined(HAVE_SSL_GET_SERVER_TMP_KEY) */
2450
2410
  #endif /* !defined(OPENSSL_NO_SOCK) */
2451
2411
 
2452
- #undef rb_intern
2453
- #define rb_intern(s) rb_intern_const(s)
2454
2412
  void
2455
2413
  Init_ossl_ssl(void)
2456
2414
  {
@@ -2461,8 +2419,8 @@ Init_ossl_ssl(void)
2461
2419
  rb_mWaitWritable = rb_define_module_under(rb_cIO, "WaitWritable");
2462
2420
  #endif
2463
2421
 
2464
- id_call = rb_intern("call");
2465
- ID_callback_state = rb_intern("callback_state");
2422
+ id_call = rb_intern_const("call");
2423
+ ID_callback_state = rb_intern_const("callback_state");
2466
2424
 
2467
2425
  ossl_ssl_ex_vcb_idx = SSL_get_ex_new_index(0, (void *)"ossl_ssl_ex_vcb_idx", 0, 0, 0);
2468
2426
  if (ossl_ssl_ex_vcb_idx < 0)
@@ -2473,11 +2431,6 @@ Init_ossl_ssl(void)
2473
2431
  ossl_sslctx_ex_ptr_idx = SSL_CTX_get_ex_new_index(0, (void *)"ossl_sslctx_ex_ptr_idx", 0, 0, 0);
2474
2432
  if (ossl_sslctx_ex_ptr_idx < 0)
2475
2433
  ossl_raise(rb_eRuntimeError, "SSL_CTX_get_ex_new_index");
2476
- #if !defined(HAVE_X509_STORE_UP_REF)
2477
- ossl_sslctx_ex_store_p = SSL_CTX_get_ex_new_index(0, (void *)"ossl_sslctx_ex_store_p", 0, 0, 0);
2478
- if (ossl_sslctx_ex_store_p < 0)
2479
- ossl_raise(rb_eRuntimeError, "SSL_CTX_get_ex_new_index");
2480
- #endif
2481
2434
 
2482
2435
  /* Document-module: OpenSSL::SSL
2483
2436
  *
@@ -2529,7 +2482,7 @@ Init_ossl_ssl(void)
2529
2482
  * The _cert_, _key_, and _extra_chain_cert_ attributes are deprecated.
2530
2483
  * It is recommended to use #add_certificate instead.
2531
2484
  */
2532
- rb_attr(cSSLContext, rb_intern("cert"), 1, 1, Qfalse);
2485
+ rb_attr(cSSLContext, rb_intern_const("cert"), 1, 1, Qfalse);
2533
2486
 
2534
2487
  /*
2535
2488
  * Context private key
@@ -2537,29 +2490,29 @@ Init_ossl_ssl(void)
2537
2490
  * The _cert_, _key_, and _extra_chain_cert_ attributes are deprecated.
2538
2491
  * It is recommended to use #add_certificate instead.
2539
2492
  */
2540
- rb_attr(cSSLContext, rb_intern("key"), 1, 1, Qfalse);
2493
+ rb_attr(cSSLContext, rb_intern_const("key"), 1, 1, Qfalse);
2541
2494
 
2542
2495
  /*
2543
2496
  * A certificate or Array of certificates that will be sent to the client.
2544
2497
  */
2545
- rb_attr(cSSLContext, rb_intern("client_ca"), 1, 1, Qfalse);
2498
+ rb_attr(cSSLContext, rb_intern_const("client_ca"), 1, 1, Qfalse);
2546
2499
 
2547
2500
  /*
2548
2501
  * The path to a file containing a PEM-format CA certificate
2549
2502
  */
2550
- rb_attr(cSSLContext, rb_intern("ca_file"), 1, 1, Qfalse);
2503
+ rb_attr(cSSLContext, rb_intern_const("ca_file"), 1, 1, Qfalse);
2551
2504
 
2552
2505
  /*
2553
2506
  * The path to a directory containing CA certificates in PEM format.
2554
2507
  *
2555
2508
  * Files are looked up by subject's X509 name's hash value.
2556
2509
  */
2557
- rb_attr(cSSLContext, rb_intern("ca_path"), 1, 1, Qfalse);
2510
+ rb_attr(cSSLContext, rb_intern_const("ca_path"), 1, 1, Qfalse);
2558
2511
 
2559
2512
  /*
2560
2513
  * Maximum session lifetime in seconds.
2561
2514
  */
2562
- rb_attr(cSSLContext, rb_intern("timeout"), 1, 1, Qfalse);
2515
+ rb_attr(cSSLContext, rb_intern_const("timeout"), 1, 1, Qfalse);
2563
2516
 
2564
2517
  /*
2565
2518
  * Session verification mode.
@@ -2572,12 +2525,12 @@ Init_ossl_ssl(void)
2572
2525
  *
2573
2526
  * See SSL_CTX_set_verify(3) for details.
2574
2527
  */
2575
- rb_attr(cSSLContext, rb_intern("verify_mode"), 1, 1, Qfalse);
2528
+ rb_attr(cSSLContext, rb_intern_const("verify_mode"), 1, 1, Qfalse);
2576
2529
 
2577
2530
  /*
2578
2531
  * Number of CA certificates to walk when verifying a certificate chain.
2579
2532
  */
2580
- rb_attr(cSSLContext, rb_intern("verify_depth"), 1, 1, Qfalse);
2533
+ rb_attr(cSSLContext, rb_intern_const("verify_depth"), 1, 1, Qfalse);
2581
2534
 
2582
2535
  /*
2583
2536
  * A callback for additional certificate verification. The callback is
@@ -2591,7 +2544,7 @@ Init_ossl_ssl(void)
2591
2544
  * If the callback returns +false+, the chain verification is immediately
2592
2545
  * stopped and a bad_certificate alert is then sent.
2593
2546
  */
2594
- rb_attr(cSSLContext, rb_intern("verify_callback"), 1, 1, Qfalse);
2547
+ rb_attr(cSSLContext, rb_intern_const("verify_callback"), 1, 1, Qfalse);
2595
2548
 
2596
2549
  /*
2597
2550
  * Whether to check the server certificate is valid for the hostname.
@@ -2599,12 +2552,12 @@ Init_ossl_ssl(void)
2599
2552
  * In order to make this work, verify_mode must be set to VERIFY_PEER and
2600
2553
  * the server hostname must be given by OpenSSL::SSL::SSLSocket#hostname=.
2601
2554
  */
2602
- rb_attr(cSSLContext, rb_intern("verify_hostname"), 1, 1, Qfalse);
2555
+ rb_attr(cSSLContext, rb_intern_const("verify_hostname"), 1, 1, Qfalse);
2603
2556
 
2604
2557
  /*
2605
2558
  * An OpenSSL::X509::Store used for certificate verification.
2606
2559
  */
2607
- rb_attr(cSSLContext, rb_intern("cert_store"), 1, 1, Qfalse);
2560
+ rb_attr(cSSLContext, rb_intern_const("cert_store"), 1, 1, Qfalse);
2608
2561
 
2609
2562
  /*
2610
2563
  * An Array of extra X509 certificates to be added to the certificate
@@ -2613,7 +2566,7 @@ Init_ossl_ssl(void)
2613
2566
  * The _cert_, _key_, and _extra_chain_cert_ attributes are deprecated.
2614
2567
  * It is recommended to use #add_certificate instead.
2615
2568
  */
2616
- rb_attr(cSSLContext, rb_intern("extra_chain_cert"), 1, 1, Qfalse);
2569
+ rb_attr(cSSLContext, rb_intern_const("extra_chain_cert"), 1, 1, Qfalse);
2617
2570
 
2618
2571
  /*
2619
2572
  * A callback invoked when a client certificate is requested by a server
@@ -2623,28 +2576,14 @@ Init_ossl_ssl(void)
2623
2576
  * containing an OpenSSL::X509::Certificate and an OpenSSL::PKey. If any
2624
2577
  * other value is returned the handshake is suspended.
2625
2578
  */
2626
- rb_attr(cSSLContext, rb_intern("client_cert_cb"), 1, 1, Qfalse);
2627
-
2628
- #if !defined(OPENSSL_NO_EC) && defined(HAVE_SSL_CTX_SET_TMP_ECDH_CALLBACK)
2629
- /*
2630
- * A callback invoked when ECDH parameters are required.
2631
- *
2632
- * The callback is invoked with the Session for the key exchange, an
2633
- * flag indicating the use of an export cipher and the keylength
2634
- * required.
2635
- *
2636
- * The callback is deprecated. This does not work with recent versions of
2637
- * OpenSSL. Use OpenSSL::SSL::SSLContext#ecdh_curves= instead.
2638
- */
2639
- rb_attr(cSSLContext, rb_intern("tmp_ecdh_callback"), 1, 1, Qfalse);
2640
- #endif
2579
+ rb_attr(cSSLContext, rb_intern_const("client_cert_cb"), 1, 1, Qfalse);
2641
2580
 
2642
2581
  /*
2643
2582
  * Sets the context in which a session can be reused. This allows
2644
2583
  * sessions for multiple applications to be distinguished, for example, by
2645
2584
  * name.
2646
2585
  */
2647
- rb_attr(cSSLContext, rb_intern("session_id_context"), 1, 1, Qfalse);
2586
+ rb_attr(cSSLContext, rb_intern_const("session_id_context"), 1, 1, Qfalse);
2648
2587
 
2649
2588
  /*
2650
2589
  * A callback invoked on a server when a session is proposed by the client
@@ -2653,7 +2592,7 @@ Init_ossl_ssl(void)
2653
2592
  * The callback is invoked with the SSLSocket and session id. The
2654
2593
  * callback may return a Session from an external cache.
2655
2594
  */
2656
- rb_attr(cSSLContext, rb_intern("session_get_cb"), 1, 1, Qfalse);
2595
+ rb_attr(cSSLContext, rb_intern_const("session_get_cb"), 1, 1, Qfalse);
2657
2596
 
2658
2597
  /*
2659
2598
  * A callback invoked when a new session was negotiated.
@@ -2661,7 +2600,7 @@ Init_ossl_ssl(void)
2661
2600
  * The callback is invoked with an SSLSocket. If +false+ is returned the
2662
2601
  * session will be removed from the internal cache.
2663
2602
  */
2664
- rb_attr(cSSLContext, rb_intern("session_new_cb"), 1, 1, Qfalse);
2603
+ rb_attr(cSSLContext, rb_intern_const("session_new_cb"), 1, 1, Qfalse);
2665
2604
 
2666
2605
  /*
2667
2606
  * A callback invoked when a session is removed from the internal cache.
@@ -2672,18 +2611,18 @@ Init_ossl_ssl(void)
2672
2611
  * multi-threaded application. The callback is called inside a global lock
2673
2612
  * and it can randomly cause deadlock on Ruby thread switching.
2674
2613
  */
2675
- rb_attr(cSSLContext, rb_intern("session_remove_cb"), 1, 1, Qfalse);
2614
+ rb_attr(cSSLContext, rb_intern_const("session_remove_cb"), 1, 1, Qfalse);
2676
2615
 
2677
2616
  rb_define_const(mSSLExtConfig, "HAVE_TLSEXT_HOST_NAME", Qtrue);
2678
2617
 
2679
2618
  /*
2680
- * A callback invoked whenever a new handshake is initiated. May be used
2681
- * to disable renegotiation entirely.
2619
+ * A callback invoked whenever a new handshake is initiated on an
2620
+ * established connection. May be used to disable renegotiation entirely.
2682
2621
  *
2683
2622
  * The callback is invoked with the active SSLSocket. The callback's
2684
- * return value is irrelevant, normal return indicates "approval" of the
2623
+ * return value is ignored. A normal return indicates "approval" of the
2685
2624
  * renegotiation and will continue the process. To forbid renegotiation
2686
- * and to cancel the process, an Error may be raised within the callback.
2625
+ * and to cancel the process, raise an exception within the callback.
2687
2626
  *
2688
2627
  * === Disable client renegotiation
2689
2628
  *
@@ -2691,13 +2630,11 @@ Init_ossl_ssl(void)
2691
2630
  * renegotiation entirely. You may use a callback as follows to implement
2692
2631
  * this feature:
2693
2632
  *
2694
- * num_handshakes = 0
2695
2633
  * ctx.renegotiation_cb = lambda do |ssl|
2696
- * num_handshakes += 1
2697
- * raise RuntimeError.new("Client renegotiation disabled") if num_handshakes > 1
2634
+ * raise RuntimeError, "Client renegotiation disabled"
2698
2635
  * end
2699
2636
  */
2700
- rb_attr(cSSLContext, rb_intern("renegotiation_cb"), 1, 1, Qfalse);
2637
+ rb_attr(cSSLContext, rb_intern_const("renegotiation_cb"), 1, 1, Qfalse);
2701
2638
  #ifndef OPENSSL_NO_NEXTPROTONEG
2702
2639
  /*
2703
2640
  * An Enumerable of Strings. Each String represents a protocol to be
@@ -2710,7 +2647,7 @@ Init_ossl_ssl(void)
2710
2647
  *
2711
2648
  * ctx.npn_protocols = ["http/1.1", "spdy/2"]
2712
2649
  */
2713
- rb_attr(cSSLContext, rb_intern("npn_protocols"), 1, 1, Qfalse);
2650
+ rb_attr(cSSLContext, rb_intern_const("npn_protocols"), 1, 1, Qfalse);
2714
2651
  /*
2715
2652
  * A callback invoked on the client side when the client needs to select
2716
2653
  * a protocol from the list sent by the server. Supported in OpenSSL 1.0.1
@@ -2727,10 +2664,9 @@ Init_ossl_ssl(void)
2727
2664
  * protocols.first
2728
2665
  * end
2729
2666
  */
2730
- rb_attr(cSSLContext, rb_intern("npn_select_cb"), 1, 1, Qfalse);
2667
+ rb_attr(cSSLContext, rb_intern_const("npn_select_cb"), 1, 1, Qfalse);
2731
2668
  #endif
2732
2669
 
2733
- #ifdef HAVE_SSL_CTX_SET_ALPN_SELECT_CB
2734
2670
  /*
2735
2671
  * An Enumerable of Strings. Each String represents a protocol to be
2736
2672
  * advertised as the list of supported protocols for Application-Layer
@@ -2742,7 +2678,7 @@ Init_ossl_ssl(void)
2742
2678
  *
2743
2679
  * ctx.alpn_protocols = ["http/1.1", "spdy/2", "h2"]
2744
2680
  */
2745
- rb_attr(cSSLContext, rb_intern("alpn_protocols"), 1, 1, Qfalse);
2681
+ rb_attr(cSSLContext, rb_intern_const("alpn_protocols"), 1, 1, Qfalse);
2746
2682
  /*
2747
2683
  * A callback invoked on the server side when the server needs to select
2748
2684
  * a protocol from the list sent by the client. Supported in OpenSSL 1.0.2
@@ -2759,8 +2695,7 @@ Init_ossl_ssl(void)
2759
2695
  * protocols.first
2760
2696
  * end
2761
2697
  */
2762
- rb_attr(cSSLContext, rb_intern("alpn_select_cb"), 1, 1, Qfalse);
2763
- #endif
2698
+ rb_attr(cSSLContext, rb_intern_const("alpn_select_cb"), 1, 1, Qfalse);
2764
2699
 
2765
2700
  rb_define_alias(cSSLContext, "ssl_timeout", "timeout");
2766
2701
  rb_define_alias(cSSLContext, "ssl_timeout=", "timeout=");
@@ -2768,6 +2703,9 @@ Init_ossl_ssl(void)
2768
2703
  ossl_sslctx_set_minmax_proto_version, 2);
2769
2704
  rb_define_method(cSSLContext, "ciphers", ossl_sslctx_get_ciphers, 0);
2770
2705
  rb_define_method(cSSLContext, "ciphers=", ossl_sslctx_set_ciphers, 1);
2706
+ #ifndef OPENSSL_NO_DH
2707
+ rb_define_method(cSSLContext, "tmp_dh=", ossl_sslctx_set_tmp_dh, 1);
2708
+ #endif
2771
2709
  rb_define_method(cSSLContext, "ecdh_curves=", ossl_sslctx_set_ecdh_curves, 1);
2772
2710
  rb_define_method(cSSLContext, "security_level", ossl_sslctx_get_security_level, 0);
2773
2711
  rb_define_method(cSSLContext, "security_level=", ossl_sslctx_set_security_level, 1);
@@ -2872,12 +2810,10 @@ Init_ossl_ssl(void)
2872
2810
  rb_define_method(cSSLSocket, "client_ca", ossl_ssl_get_client_ca_list, 0);
2873
2811
  /* #hostname is defined in lib/openssl/ssl.rb */
2874
2812
  rb_define_method(cSSLSocket, "hostname=", ossl_ssl_set_hostname, 1);
2875
- # ifdef HAVE_SSL_GET_SERVER_TMP_KEY
2813
+ rb_define_method(cSSLSocket, "finished_message", ossl_ssl_get_finished, 0);
2814
+ rb_define_method(cSSLSocket, "peer_finished_message", ossl_ssl_get_peer_finished, 0);
2876
2815
  rb_define_method(cSSLSocket, "tmp_key", ossl_ssl_tmp_key, 0);
2877
- # endif
2878
- # ifdef HAVE_SSL_CTX_SET_ALPN_SELECT_CB
2879
2816
  rb_define_method(cSSLSocket, "alpn_protocol", ossl_ssl_alpn_protocol, 0);
2880
- # endif
2881
2817
  # ifndef OPENSSL_NO_NEXTPROTONEG
2882
2818
  rb_define_method(cSSLSocket, "npn_protocol", ossl_ssl_npn_protocol, 0);
2883
2819
  # endif
@@ -2889,12 +2825,23 @@ Init_ossl_ssl(void)
2889
2825
  rb_define_const(mSSL, "VERIFY_CLIENT_ONCE", INT2NUM(SSL_VERIFY_CLIENT_ONCE));
2890
2826
 
2891
2827
  rb_define_const(mSSL, "OP_ALL", ULONG2NUM(SSL_OP_ALL));
2828
+ #ifdef SSL_OP_CLEANSE_PLAINTEXT /* OpenSSL 3.0 */
2829
+ rb_define_const(mSSL, "OP_CLEANSE_PLAINTEXT", ULONG2NUM(SSL_OP_CLEANSE_PLAINTEXT));
2830
+ #endif
2892
2831
  rb_define_const(mSSL, "OP_LEGACY_SERVER_CONNECT", ULONG2NUM(SSL_OP_LEGACY_SERVER_CONNECT));
2893
- #ifdef SSL_OP_TLSEXT_PADDING /* OpenSSL 1.0.1h and OpenSSL 1.0.2 */
2894
- rb_define_const(mSSL, "OP_TLSEXT_PADDING", ULONG2NUM(SSL_OP_TLSEXT_PADDING));
2832
+ #ifdef SSL_OP_ENABLE_KTLS /* OpenSSL 3.0 */
2833
+ rb_define_const(mSSL, "OP_ENABLE_KTLS", ULONG2NUM(SSL_OP_ENABLE_KTLS));
2895
2834
  #endif
2896
- #ifdef SSL_OP_SAFARI_ECDHE_ECDSA_BUG /* OpenSSL 1.0.1f and OpenSSL 1.0.2 */
2835
+ rb_define_const(mSSL, "OP_TLSEXT_PADDING", ULONG2NUM(SSL_OP_TLSEXT_PADDING));
2897
2836
  rb_define_const(mSSL, "OP_SAFARI_ECDHE_ECDSA_BUG", ULONG2NUM(SSL_OP_SAFARI_ECDHE_ECDSA_BUG));
2837
+ #ifdef SSL_OP_IGNORE_UNEXPECTED_EOF /* OpenSSL 3.0 */
2838
+ rb_define_const(mSSL, "OP_IGNORE_UNEXPECTED_EOF", ULONG2NUM(SSL_OP_IGNORE_UNEXPECTED_EOF));
2839
+ #endif
2840
+ #ifdef SSL_OP_ALLOW_CLIENT_RENEGOTIATION /* OpenSSL 3.0 */
2841
+ rb_define_const(mSSL, "OP_ALLOW_CLIENT_RENEGOTIATION", ULONG2NUM(SSL_OP_ALLOW_CLIENT_RENEGOTIATION));
2842
+ #endif
2843
+ #ifdef SSL_OP_DISABLE_TLSEXT_CA_NAMES /* OpenSSL 3.0 */
2844
+ rb_define_const(mSSL, "OP_DISABLE_TLSEXT_CA_NAMES", ULONG2NUM(SSL_OP_DISABLE_TLSEXT_CA_NAMES));
2898
2845
  #endif
2899
2846
  #ifdef SSL_OP_ALLOW_NO_DHE_KEX /* OpenSSL 1.1.1 */
2900
2847
  rb_define_const(mSSL, "OP_ALLOW_NO_DHE_KEX", ULONG2NUM(SSL_OP_ALLOW_NO_DHE_KEX));
@@ -2907,13 +2854,15 @@ Init_ossl_ssl(void)
2907
2854
  #ifdef SSL_OP_NO_ENCRYPT_THEN_MAC /* OpenSSL 1.1.1 */
2908
2855
  rb_define_const(mSSL, "OP_NO_ENCRYPT_THEN_MAC", ULONG2NUM(SSL_OP_NO_ENCRYPT_THEN_MAC));
2909
2856
  #endif
2910
- rb_define_const(mSSL, "OP_CIPHER_SERVER_PREFERENCE", ULONG2NUM(SSL_OP_CIPHER_SERVER_PREFERENCE));
2911
- rb_define_const(mSSL, "OP_TLS_ROLLBACK_BUG", ULONG2NUM(SSL_OP_TLS_ROLLBACK_BUG));
2912
- #ifdef SSL_OP_NO_RENEGOTIATION /* OpenSSL 1.1.1 */
2913
- rb_define_const(mSSL, "OP_NO_RENEGOTIATION", ULONG2NUM(SSL_OP_NO_RENEGOTIATION));
2857
+ #ifdef SSL_OP_ENABLE_MIDDLEBOX_COMPAT /* OpenSSL 1.1.1 */
2858
+ rb_define_const(mSSL, "OP_ENABLE_MIDDLEBOX_COMPAT", ULONG2NUM(SSL_OP_ENABLE_MIDDLEBOX_COMPAT));
2859
+ #endif
2860
+ #ifdef SSL_OP_PRIORITIZE_CHACHA /* OpenSSL 1.1.1 */
2861
+ rb_define_const(mSSL, "OP_PRIORITIZE_CHACHA", ULONG2NUM(SSL_OP_PRIORITIZE_CHACHA));
2862
+ #endif
2863
+ #ifdef SSL_OP_NO_ANTI_REPLAY /* OpenSSL 1.1.1 */
2864
+ rb_define_const(mSSL, "OP_NO_ANTI_REPLAY", ULONG2NUM(SSL_OP_NO_ANTI_REPLAY));
2914
2865
  #endif
2915
- rb_define_const(mSSL, "OP_CRYPTOPRO_TLSEXT_BUG", ULONG2NUM(SSL_OP_CRYPTOPRO_TLSEXT_BUG));
2916
-
2917
2866
  rb_define_const(mSSL, "OP_NO_SSLv3", ULONG2NUM(SSL_OP_NO_SSLv3));
2918
2867
  rb_define_const(mSSL, "OP_NO_TLSv1", ULONG2NUM(SSL_OP_NO_TLSv1));
2919
2868
  rb_define_const(mSSL, "OP_NO_TLSv1_1", ULONG2NUM(SSL_OP_NO_TLSv1_1));
@@ -2921,6 +2870,12 @@ Init_ossl_ssl(void)
2921
2870
  #ifdef SSL_OP_NO_TLSv1_3 /* OpenSSL 1.1.1 */
2922
2871
  rb_define_const(mSSL, "OP_NO_TLSv1_3", ULONG2NUM(SSL_OP_NO_TLSv1_3));
2923
2872
  #endif
2873
+ rb_define_const(mSSL, "OP_CIPHER_SERVER_PREFERENCE", ULONG2NUM(SSL_OP_CIPHER_SERVER_PREFERENCE));
2874
+ rb_define_const(mSSL, "OP_TLS_ROLLBACK_BUG", ULONG2NUM(SSL_OP_TLS_ROLLBACK_BUG));
2875
+ #ifdef SSL_OP_NO_RENEGOTIATION /* OpenSSL 1.1.1 */
2876
+ rb_define_const(mSSL, "OP_NO_RENEGOTIATION", ULONG2NUM(SSL_OP_NO_RENEGOTIATION));
2877
+ #endif
2878
+ rb_define_const(mSSL, "OP_CRYPTOPRO_TLSEXT_BUG", ULONG2NUM(SSL_OP_CRYPTOPRO_TLSEXT_BUG));
2924
2879
 
2925
2880
  /* SSL_OP_* flags for DTLS */
2926
2881
  #if 0
@@ -2985,17 +2940,16 @@ Init_ossl_ssl(void)
2985
2940
  #endif
2986
2941
 
2987
2942
 
2988
- sym_exception = ID2SYM(rb_intern("exception"));
2989
- sym_wait_readable = ID2SYM(rb_intern("wait_readable"));
2990
- sym_wait_writable = ID2SYM(rb_intern("wait_writable"));
2943
+ sym_exception = ID2SYM(rb_intern_const("exception"));
2944
+ sym_wait_readable = ID2SYM(rb_intern_const("wait_readable"));
2945
+ sym_wait_writable = ID2SYM(rb_intern_const("wait_writable"));
2991
2946
 
2992
- id_tmp_dh_callback = rb_intern("tmp_dh_callback");
2993
- id_tmp_ecdh_callback = rb_intern("tmp_ecdh_callback");
2994
- id_npn_protocols_encoded = rb_intern("npn_protocols_encoded");
2947
+ id_tmp_dh_callback = rb_intern_const("tmp_dh_callback");
2948
+ id_npn_protocols_encoded = rb_intern_const("npn_protocols_encoded");
2995
2949
  id_each = rb_intern_const("each");
2996
2950
 
2997
2951
  #define DefIVarID(name) do \
2998
- id_i_##name = rb_intern("@"#name); while (0)
2952
+ id_i_##name = rb_intern_const("@"#name); while (0)
2999
2953
 
3000
2954
  DefIVarID(cert_store);
3001
2955
  DefIVarID(ca_file);
@@ -3009,7 +2963,6 @@ Init_ossl_ssl(void)
3009
2963
  DefIVarID(key);
3010
2964
  DefIVarID(extra_chain_cert);
3011
2965
  DefIVarID(client_cert_cb);
3012
- DefIVarID(tmp_ecdh_callback);
3013
2966
  DefIVarID(timeout);
3014
2967
  DefIVarID(session_id_context);
3015
2968
  DefIVarID(session_get_cb);