15 #if defined(HAVE_UNISTD_H)
19 #define numberof(ary) (int)(sizeof(ary)/sizeof((ary)[0]))
22 # define TO_SOCKET(s) _get_osfhandle(s)
24 # define TO_SOCKET(s) (s)
32 #define ossl_sslctx_set_cert(o,v) rb_iv_set((o),"@cert",(v))
33 #define ossl_sslctx_set_key(o,v) rb_iv_set((o),"@key",(v))
34 #define ossl_sslctx_set_client_ca(o,v) rb_iv_set((o),"@client_ca",(v))
35 #define ossl_sslctx_set_ca_file(o,v) rb_iv_set((o),"@ca_file",(v))
36 #define ossl_sslctx_set_ca_path(o,v) rb_iv_set((o),"@ca_path",(v))
37 #define ossl_sslctx_set_timeout(o,v) rb_iv_set((o),"@timeout",(v))
38 #define ossl_sslctx_set_verify_mode(o,v) rb_iv_set((o),"@verify_mode",(v))
39 #define ossl_sslctx_set_verify_dep(o,v) rb_iv_set((o),"@verify_depth",(v))
40 #define ossl_sslctx_set_verify_cb(o,v) rb_iv_set((o),"@verify_callback",(v))
41 #define ossl_sslctx_set_options(o,v) rb_iv_set((o),"@options",(v))
42 #define ossl_sslctx_set_cert_store(o,v) rb_iv_set((o),"@cert_store",(v))
43 #define ossl_sslctx_set_extra_cert(o,v) rb_iv_set((o),"@extra_chain_cert",(v))
44 #define ossl_sslctx_set_client_cert_cb(o,v) rb_iv_set((o),"@client_cert_cb",(v))
45 #define ossl_sslctx_set_tmp_dh_cb(o,v) rb_iv_set((o),"@tmp_dh_callback",(v))
46 #define ossl_sslctx_set_sess_id_ctx(o, v) rb_iv_set((o),"@session_id_context",(v))
48 #define ossl_sslctx_get_cert(o) rb_iv_get((o),"@cert")
49 #define ossl_sslctx_get_key(o) rb_iv_get((o),"@key")
50 #define ossl_sslctx_get_client_ca(o) rb_iv_get((o),"@client_ca")
51 #define ossl_sslctx_get_ca_file(o) rb_iv_get((o),"@ca_file")
52 #define ossl_sslctx_get_ca_path(o) rb_iv_get((o),"@ca_path")
53 #define ossl_sslctx_get_timeout(o) rb_iv_get((o),"@timeout")
54 #define ossl_sslctx_get_verify_mode(o) rb_iv_get((o),"@verify_mode")
55 #define ossl_sslctx_get_verify_dep(o) rb_iv_get((o),"@verify_depth")
56 #define ossl_sslctx_get_verify_cb(o) rb_iv_get((o),"@verify_callback")
57 #define ossl_sslctx_get_options(o) rb_iv_get((o),"@options")
58 #define ossl_sslctx_get_cert_store(o) rb_iv_get((o),"@cert_store")
59 #define ossl_sslctx_get_extra_cert(o) rb_iv_get((o),"@extra_chain_cert")
60 #define ossl_sslctx_get_client_cert_cb(o) rb_iv_get((o),"@client_cert_cb")
61 #define ossl_sslctx_get_tmp_dh_cb(o) rb_iv_get((o),"@tmp_dh_callback")
62 #define ossl_sslctx_get_sess_id_ctx(o) rb_iv_get((o),"@session_id_context")
65 "cert",
"key",
"client_ca",
"ca_file",
"ca_path",
66 "timeout",
"verify_mode",
"verify_depth",
"renegotiation_cb",
67 "verify_callback",
"options",
"cert_store",
"extra_chain_cert",
68 "client_cert_cb",
"tmp_dh_callback",
"session_id_context",
69 "session_get_cb",
"session_new_cb",
"session_remove_cb",
70 #ifdef HAVE_SSL_SET_TLSEXT_HOST_NAME
73 #ifdef HAVE_OPENSSL_NPN_NEGOTIATED
79 #define ossl_ssl_get_io(o) rb_iv_get((o),"@io")
80 #define ossl_ssl_get_ctx(o) rb_iv_get((o),"@context")
81 #define ossl_ssl_get_sync_close(o) rb_iv_get((o),"@sync_close")
82 #define ossl_ssl_get_x509(o) rb_iv_get((o),"@x509")
83 #define ossl_ssl_get_key(o) rb_iv_get((o),"@key")
84 #define ossl_ssl_get_tmp_dh(o) rb_iv_get((o),"@tmp_dh")
86 #define ossl_ssl_set_io(o,v) rb_iv_set((o),"@io",(v))
87 #define ossl_ssl_set_ctx(o,v) rb_iv_set((o),"@context",(v))
88 #define ossl_ssl_set_sync_close(o,v) rb_iv_set((o),"@sync_close",(v))
89 #define ossl_ssl_set_x509(o,v) rb_iv_set((o),"@x509",(v))
90 #define ossl_ssl_set_key(o,v) rb_iv_set((o),"@key",(v))
91 #define ossl_ssl_set_tmp_dh(o,v) rb_iv_set((o),"@tmp_dh",(v))
95 #ifdef HAVE_SSL_SET_TLSEXT_HOST_NAME
108 SSL_METHOD *(*func)(void);
110 #define OSSL_SSL_METHOD_ENTRY(name) { #name, (SSL_METHOD *(*)(void))name##_method }
114 #if defined(HAVE_TLSV1_2_METHOD) && defined(HAVE_TLSV1_2_SERVER_METHOD) && \
115 defined(HAVE_TLSV1_2_CLIENT_METHOD)
120 #if defined(HAVE_TLSV1_1_METHOD) && defined(HAVE_TLSV1_1_SERVER_METHOD) && \
121 defined(HAVE_TLSV1_1_CLIENT_METHOD)
126 #if defined(HAVE_SSLV2_METHOD) && defined(HAVE_SSLV2_SERVER_METHOD) && \
127 defined(HAVE_SSLV2_CLIENT_METHOD)
138 #undef OSSL_SSL_METHOD_ENTRY
151 ctx->cert_store =
NULL;
159 long mode = SSL_MODE_ENABLE_PARTIAL_WRITE;
161 #ifdef SSL_MODE_RELEASE_BUFFERS
162 mode |= SSL_MODE_RELEASE_BUFFERS;
165 ctx = SSL_CTX_new(SSLv23_method());
169 SSL_CTX_set_mode(ctx, mode);
183 SSL_METHOD *method =
NULL;
202 if (SSL_CTX_set_ssl_version(ctx, method) != 1) {
263 if (!
RTEST(success))
return 0;
270 #if !defined(OPENSSL_NO_DH)
283 if (EVP_PKEY_type(pkey->type) != EVP_PKEY_DH)
return Qfalse;
325 ssl = X509_STORE_CTX_get_ex_data(ctx, SSL_get_ex_data_X509_STORE_CTX_idx());
334 VALUE ssl_obj, sslctx_obj, cb;
339 sslctx_obj =
rb_iv_get(ssl_obj,
"@context");
341 cb =
rb_iv_get(sslctx_obj,
"@session_get_cb");
351 VALUE ary, ssl_obj, ret_obj;
356 OSSL_Debug(
"SSL SESSION get callback entered");
359 ssl_obj = (
VALUE)ptr;
381 VALUE ssl_obj, sslctx_obj, cb;
386 sslctx_obj =
rb_iv_get(ssl_obj,
"@context");
388 cb =
rb_iv_get(sslctx_obj,
"@session_new_cb");
398 VALUE ary, ssl_obj, sess_obj;
402 OSSL_Debug(
"SSL SESSION new callback entered");
406 ssl_obj = (
VALUE)ptr;
408 CRYPTO_add(&sess->references, 1, CRYPTO_LOCK_SSL_SESSION);
433 VALUE sslctx_obj, cb;
438 cb =
rb_iv_get(sslctx_obj,
"@session_remove_cb");
447 VALUE ary, sslctx_obj, sess_obj;
451 OSSL_Debug(
"SSL SESSION remove callback entered");
455 sslctx_obj = (
VALUE)ptr;
457 CRYPTO_add(&sess->references, 1, CRYPTO_LOCK_SSL_SESSION);
482 if(!SSL_CTX_add_extra_chain_cert(ctx, x509)){
491 #ifdef HAVE_SSL_SET_TLSEXT_HOST_NAME
493 ossl_call_servername_cb(
VALUE ary)
495 VALUE ssl_obj, sslctx_obj, cb, ret_obj;
500 sslctx_obj =
rb_iv_get(ssl_obj,
"@context");
502 cb =
rb_iv_get(sslctx_obj,
"@servername_cb");
513 SSL_set_SSL_CTX(ssl, ctx2);
514 }
else if (!
NIL_P(ret_obj)) {
522 ssl_servername_cb(SSL *ssl,
int *ad,
void *
arg)
527 const char *servername = SSL_get_servername(ssl, TLSEXT_NAMETYPE_host_name);
530 return SSL_TLSEXT_ERR_OK;
533 return SSL_TLSEXT_ERR_ALERT_FATAL;
534 ssl_obj = (
VALUE)ptr;
542 return SSL_TLSEXT_ERR_ALERT_FATAL;
545 return SSL_TLSEXT_ERR_OK;
552 VALUE ssl_obj, sslctx_obj, cb;
557 ssl_obj = (
VALUE)ptr;
559 sslctx_obj =
rb_iv_get(ssl_obj,
"@context");
560 if (
NIL_P(sslctx_obj))
return;
561 cb =
rb_iv_get(sslctx_obj,
"@renegotiation_cb");
562 if (
NIL_P(cb))
return;
567 #ifdef HAVE_OPENSSL_NPN_NEGOTIATED
569 ssl_npn_encode_protocol_i(
VALUE cur,
VALUE encoded)
573 if (len < 1 || len > 255)
583 ssl_npn_encode_protocols(
VALUE sslctx,
VALUE protocols)
588 rb_iv_set(sslctx,
"@_protocols", encoded);
592 ssl_npn_advertise_cb(SSL *ssl,
const unsigned char **out,
unsigned int *outlen,
void *arg)
597 *out = (
const unsigned char *)
RSTRING_PTR(protocols);
600 return SSL_TLSEXT_ERR_OK;
604 ssl_npn_select_cb(SSL *s,
unsigned char **out,
unsigned char *outlen,
const unsigned char *in,
unsigned int inlen,
void *arg)
607 VALUE sslctx_obj, cb, protocols, selected;
609 sslctx_obj = (
VALUE) arg;
610 cb =
rb_iv_get(sslctx_obj,
"@npn_select_cb");
625 return SSL_TLSEXT_ERR_OK;
634 int state = SSL_state(ssl);
636 if ((where & SSL_CB_HANDSHAKE_START) &&
637 (state & SSL_ST_ACCEPT)) {
655 X509 *cert =
NULL, *client_ca =
NULL;
658 char *ca_path =
NULL, *ca_file =
NULL;
665 #if !defined(OPENSSL_NO_DH)
684 SSL_CTX_set_cert_store(ctx, store);
699 if (!SSL_CTX_use_certificate(ctx, cert)) {
703 if (!SSL_CTX_use_PrivateKey(ctx, key)) {
707 if (!SSL_CTX_check_private_key(ctx)) {
717 if (!SSL_CTX_add_client_CA(ctx, client_ca)){
725 if (!SSL_CTX_add_client_CA(ctx, client_ca)){
736 if(ca_file || ca_path){
737 if (!SSL_CTX_load_verify_locations(ctx, ca_file, ca_path))
742 verify_mode =
NIL_P(val) ? SSL_VERIFY_NONE :
NUM2INT(val);
751 if(!
NIL_P(val)) SSL_CTX_set_verify_depth(ctx,
NUM2INT(val));
755 SSL_CTX_set_options(ctx,
NUM2LONG(val));
757 SSL_CTX_set_options(ctx, SSL_OP_ALL);
760 #ifdef HAVE_OPENSSL_NPN_NEGOTIATED
763 ssl_npn_encode_protocols(
self, val);
764 SSL_CTX_set_next_protos_advertised_cb(ctx, ssl_npn_advertise_cb, (
void *)
self);
765 OSSL_Debug(
"SSL NPN advertise callback added");
768 SSL_CTX_set_next_proto_select_cb(ctx, ssl_npn_select_cb, (
void *)
self);
778 if (!SSL_CTX_set_session_id_context(ctx, (
unsigned char *)
RSTRING_PTR(val),
794 OSSL_Debug(
"SSL SESSION remove callback added");
797 #ifdef HAVE_SSL_SET_TLSEXT_HOST_NAME
800 SSL_CTX_set_tlsext_servername_callback(ctx, ssl_servername_cb);
801 OSSL_Debug(
"SSL TLSEXT servername callback added");
817 bits = SSL_CIPHER_get_bits(cipher, &alg_bits);
844 ciphers = ctx->cipher_list;
849 num = sk_SSL_CIPHER_num(ciphers);
851 for(i = 0; i < num; i++){
852 cipher = sk_SSL_CIPHER_value(ciphers, i);
899 if (!SSL_CTX_set_cipher_list(ctx,
RSTRING_PTR(str))) {
921 return SSL_CTX_add_session(ctx, sess) == 1 ?
Qtrue :
Qfalse;
939 return SSL_CTX_remove_session(ctx, sess) == 1 ?
Qtrue :
Qfalse;
955 return LONG2NUM(SSL_CTX_get_session_cache_mode(ctx));
973 SSL_CTX_set_session_cache_mode(ctx,
NUM2LONG(arg));
992 return LONG2NUM(SSL_CTX_sess_get_cache_size(ctx));
1009 SSL_CTX_sess_set_cache_size(ctx,
NUM2LONG(arg));
1087 SSL_CTX_flush_sessions(ctx, (
long)tm);
1103 for (i = 0; i < 4; ++
i) {
1108 if (rc = SSL_shutdown(ssl))
1169 VALUE io, v_ctx, cb;
1176 #ifdef HAVE_SSL_SET_TLSEXT_HOST_NAME
1189 #ifdef HAVE_SSL_SET_TLSEXT_HOST_NAME
1190 if (!
NIL_P(hostname)) {
1191 if (SSL_set_tlsext_host_name(ssl,
StringValuePtr(hostname)) != 1)
1214 #define ssl_get_error(ssl, ret) (errno = rb_w32_map_errno(WSAGetLastError()), SSL_get_error((ssl), (ret)))
1216 #define ssl_get_error(ssl, ret) SSL_get_error((ssl), (ret))
1219 #define ossl_ssl_data_get_struct(v, ssl) \
1221 Data_Get_Struct((v), SSL, (ssl)); \
1223 rb_warning("SSL session is not started yet."); \
1265 if (!
NIL_P(cb_state))
1272 case SSL_ERROR_WANT_WRITE:
1276 case SSL_ERROR_WANT_READ:
1280 case SSL_ERROR_SYSCALL:
1282 ossl_raise(
eSSLError,
"%s SYSCALL returned=%d errno=%d state=%s", funcname, ret2,
errno, SSL_state_string_long(ssl));
1373 int ilen, nread = 0;
1385 if(ilen == 0)
return str;
1390 if(!nonblock && SSL_pending(ssl) <= 0)
1395 case SSL_ERROR_NONE:
1397 case SSL_ERROR_ZERO_RETURN:
1399 case SSL_ERROR_WANT_WRITE:
1403 case SSL_ERROR_WANT_READ:
1407 case SSL_ERROR_SYSCALL:
1408 if(ERR_peek_error() == 0 && nread == 0)
rb_eof_error();
1417 rb_warning(
"SSL session is not started yet.");
1474 case SSL_ERROR_NONE:
1476 case SSL_ERROR_WANT_WRITE:
1480 case SSL_ERROR_WANT_READ:
1484 case SSL_ERROR_SYSCALL:
1493 rb_warning(
"SSL session is not started yet.");
1571 cert = SSL_get_certificate(ssl);
1594 cert = SSL_get_peer_certificate(ssl);
1622 chain = SSL_get_peer_cert_chain(ssl);
1623 if(!chain)
return Qnil;
1624 num = sk_X509_num(chain);
1626 for (i = 0; i < num; i++){
1627 cert = sk_X509_value(chain, i);
1665 cipher = (SSL_CIPHER *)SSL_get_current_cipher(ssl);
1705 return INT2NUM(SSL_pending(ssl));
1721 switch(SSL_session_reused(ssl)) {
1722 case 1:
return Qtrue;
1749 if (SSL_set_session(ssl, sess) != 1)
1771 return INT2FIX(SSL_get_verify_result(ssl));
1793 ca = SSL_get_client_CA_list(ssl);
1797 #ifdef HAVE_OPENSSL_NPN_NEGOTIATED
1806 ossl_ssl_npn_protocol(
VALUE self)
1809 const unsigned char *out;
1810 unsigned int outlen;
1814 SSL_get0_next_proto_negotiated(ssl, &out, &outlen);
1818 return rb_str_new((
const char *) out, outlen);
1838 SSL_get_ex_new_index(0,(
void *)
"ossl_ssl_ex_client_cert_cb_idx",0,0,0);
1840 SSL_get_ex_new_index(0,(
void *)
"ossl_ssl_ex_tmp_dh_callback_idx",0,0,0);
2002 #ifdef HAVE_SSL_SET_TLSEXT_HOST_NAME
2034 #ifdef HAVE_OPENSSL_NPN_NEGOTIATED
2175 #ifdef HAVE_OPENSSL_NPN_NEGOTIATED
2179 #define ossl_ssl_def_const(x) rb_define_const(mSSL, #x, INT2NUM(SSL_##x))
2194 #if defined(SSL_OP_MSIE_SSLV2_RSA_PADDING)
2202 #if defined(SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION)
2205 #if defined(SSL_OP_SINGLE_ECDH_USE)
2210 #if defined(SSL_OP_CIPHER_SERVER_PREFERENCE)
2217 #if defined(SSL_OP_NO_TLSv1_1)
2220 #if defined(SSL_OP_NO_TLSv1_2)
2223 #if defined(SSL_OP_NO_TICKET)
2226 #if defined(SSL_OP_NO_COMPRESSION)
static VALUE ossl_ssl_get_cipher(VALUE self)
static VALUE ossl_sslctx_session_add(VALUE self, VALUE arg)
static VALUE ossl_sslctx_get_session_cache_stats(VALUE self)
static DH * ossl_tmp_dh_callback(SSL *ssl, int is_export, int keylength)
VALUE rb_ary_entry(VALUE ary, long offset)
#define ssl_get_error(ssl, ret)
void rb_io_check_readable(rb_io_t *)
#define ossl_sslctx_get_key(o)
void rb_thread_wait_fd(int)
VALUE rb_iv_set(VALUE, const char *, VALUE)
static VALUE ossl_sslctx_initialize(int argc, VALUE *argv, VALUE self)
#define ossl_ssl_get_tmp_dh(o)
static VALUE ossl_ssl_s_alloc(VALUE klass)
static VALUE ossl_ssl_read(int argc, VALUE *argv, VALUE self)
RUBY_EXTERN VALUE rb_mWaitReadable
static void ossl_sslctx_free(SSL_CTX *ctx)
#define rb_check_frozen(obj)
RUBY_EXTERN VALUE rb_cTime
#define ossl_ssl_set_key(o, v)
VALUE rb_iv_get(VALUE, const char *)
void rb_define_private_method(VALUE klass, const char *name, VALUE(*func)(ANYARGS), int argc)
int ossl_ssl_ex_tmp_dh_callback_idx
VALUE rb_obj_freeze(VALUE)
void rb_define_alloc_func(VALUE, rb_alloc_func_t)
static VALUE ossl_call_tmp_dh_callback(VALUE *args)
VALUE rb_ary_push(VALUE ary, VALUE item)
#define ossl_sslctx_get_client_cert_cb(o)
static VALUE ossl_ssl_get_cert(VALUE self)
VALUE ossl_x509name_sk2ary(STACK_OF(X509_NAME)*names)
VALUE rb_protect(VALUE(*proc)(VALUE), VALUE data, int *state)
VALUE rb_funcall(VALUE, ID, int,...)
Calls a method.
VALUE rb_define_class_under(VALUE outer, const char *name, VALUE super)
Defines a class under the namespace of outer.
#define ossl_ssl_set_tmp_dh(o, v)
#define ossl_sslctx_get_client_ca(o)
static VALUE ossl_ssl_connect_nonblock(VALUE self)
static VALUE ossl_sslctx_add_extra_chain_cert_i(VALUE i, VALUE arg)
static VALUE ossl_ssl_read_nonblock(int argc, VALUE *argv, VALUE self)
static VALUE ossl_ssl_close(VALUE self)
#define ossl_ssl_get_io(o)
VALUE rb_iterate(VALUE(*)(VALUE), VALUE, VALUE(*)(ANYARGS), VALUE)
#define GetOpenFile(obj, fp)
VALUE rb_str_append(VALUE, VALUE)
static VALUE ossl_ssl_write_nonblock(VALUE self, VALUE str)
VALUE rb_ivar_get(VALUE, ID)
static void ossl_ssl_shutdown(SSL *ssl)
RUBY_EXTERN VALUE rb_mWaitWritable
static VALUE ossl_ssl_write(VALUE self, VALUE str)
static VALUE ossl_call_client_cert_cb(VALUE obj)
VALUE ossl_exc_new(VALUE exc, const char *fmt,...)
void rb_exc_raise(VALUE mesg)
void Init_ossl_ssl_session(void)
STACK_OF(X509)*ossl_x509_ary2sk0(VALUE)
X509 * GetX509CertPtr(VALUE)
VALUE rb_obj_is_instance_of(VALUE, VALUE)
static VALUE ossl_ssl_accept(VALUE self)
static VALUE ossl_sslctx_get_ciphers(VALUE self)
#define StringValuePtr(v)
static VALUE ossl_ssl_write_internal(VALUE self, VALUE str, int nonblock)
#define ossl_sslctx_get_cert(o)
static VALUE ossl_ssl_session_reused(VALUE self)
#define ossl_ssl_get_ctx(o)
static VALUE ossl_call_session_remove_cb(VALUE ary)
static const char * ossl_ssl_attrs[]
#define ossl_sslctx_get_extra_cert(o)
#define StringValueCStr(v)
void rb_define_const(VALUE, const char *, VALUE)
VALUE rb_str_cat2(VALUE, const char *)
static VALUE ossl_ssl_accept_nonblock(VALUE self)
#define ossl_sslctx_get_sess_id_ctx(o)
static const char * ossl_sslctx_attrs[]
#define ossl_sslctx_get_ca_file(o)
int rb_io_wait_writable(int)
#define ossl_sslctx_get_verify_dep(o)
static VALUE ossl_ssl_pending(VALUE self)
static VALUE ossl_sslctx_setup(VALUE self)
VALUE rb_call_super(int, const VALUE *)
VALUE ossl_x509_new(X509 *)
static VALUE ossl_ssl_read_internal(int argc, VALUE *argv, VALUE self, int nonblock)
#define ossl_ssl_set_sync_close(o, v)
static VALUE ossl_ssl_set_session(VALUE self, VALUE arg1)
#define ossl_sslctx_get_verify_cb(o)
static VALUE ossl_ssl_get_verify_result(VALUE self)
static VALUE ossl_ssl_get_state(VALUE self)
static VALUE ossl_sslctx_get_session_cache_mode(VALUE self)
static SSL_SESSION * ossl_sslctx_session_get_cb(SSL *ssl, unsigned char *buf, int len, int *copy)
VALUE rb_str_buf_cat(VALUE, const char *, long)
#define ossl_sslctx_get_verify_mode(o)
VALUE rb_hash_aset(VALUE, VALUE, VALUE)
void rb_define_alias(VALUE klass, const char *name1, const char *name2)
Defines an alias of a method.
VALUE rb_str_resize(VALUE, long)
static VALUE ossl_ssl_get_client_ca_list(VALUE self)
static void write_would_block(int nonblock)
static VALUE ossl_ssl_setup(VALUE self)
SSL_METHOD *(* func)(void)
#define OSSL_SSL_METHOD_ENTRY(name)
static VALUE ossl_ssl_initialize(int argc, VALUE *argv, VALUE self)
#define ossl_sslctx_get_cert_store(o)
#define ossl_ssl_set_x509(o, v)
#define ossl_sslctx_get_timeout(o)
static VALUE ossl_sslctx_session_remove(VALUE self, VALUE arg)
int rb_scan_args(int argc, const VALUE *argv, const char *fmt,...)
VALUE rb_block_call(VALUE, ID, int, VALUE *, VALUE(*)(ANYARGS), VALUE)
unsigned char buf[MIME_BUF_SIZE]
void rb_attr(VALUE, ID, int, int, int)
#define ossl_ssl_data_get_struct(v, ssl)
#define ossl_ssl_get_x509(o)
#define ossl_sslctx_get_options(o)
static VALUE ossl_call_session_new_cb(VALUE ary)
static VALUE ossl_sslctx_set_ciphers(VALUE self, VALUE v)
static int ossl_client_cert_cb(SSL *ssl, X509 **x509, EVP_PKEY **pkey)
void rb_extend_object(VALUE obj, VALUE module)
static VALUE ossl_sslctx_set_session_cache_mode(VALUE self, VALUE arg)
#define ossl_ssl_get_key(o)
static void ssl_renegotiation_cb(const SSL *ssl)
void rb_sys_fail(const char *mesg)
void rb_jump_tag(int tag)
X509_STORE * GetX509StorePtr(VALUE)
VALUE rb_define_module_under(VALUE outer, const char *name)
#define ossl_sslctx_get_tmp_dh_cb(o)
#define ossl_sslctx_get_ca_path(o)
VALUE rb_ivar_set(VALUE, ID, VALUE)
static VALUE ossl_ssl_get_peer_cert(VALUE self)
void rb_str_modify(VALUE)
static VALUE ossl_call_session_get_cb(VALUE ary)
VALUE rb_obj_is_kind_of(VALUE, VALUE)
static void ossl_ssl_free(SSL *ssl)
#define OSSL_Check_Kind(obj, klass)
RUBY_EXTERN VALUE rb_cObject
static void ssl_info_cb(const SSL *ssl, int where, int val)
#define ossl_ssl_set_io(o, v)
#define Data_Get_Struct(obj, type, sval)
struct @11 ossl_ssl_method_tab[]
#define ossl_ssl_def_const(x)
void ossl_raise(VALUE exc, const char *fmt,...)
static int ossl_ssl_verify_callback(int preverify_ok, X509_STORE_CTX *ctx)
EVP_PKEY * GetPKeyPtr(VALUE obj)
static VALUE ossl_ssl_get_version(VALUE self)
static unsigned int hash(const char *str, unsigned int len)
static VALUE ossl_sslctx_set_session_cache_size(VALUE self, VALUE arg)
#define RSTRING_LENINT(str)
EVP_PKEY * DupPKeyPtr(VALUE obj)
X509 * DupX509CertPtr(VALUE)
VALUE rb_ary_new2(long capa)
VALUE rb_str_new(const char *, long)
void rb_io_check_writable(rb_io_t *)
VALUE rb_obj_alloc(VALUE)
static VALUE ossl_ssl_get_peer_cert_chain(VALUE self)
const char * rb_id2name(ID id)
static const char * ossl_ssl_attr_readers[]
static VALUE ossl_sslctx_flush_sessions(int argc, VALUE *argv, VALUE self)
void rb_warning(const char *fmt,...)
#define SafeGetSSLSession(obj, sess)
static void ossl_sslctx_session_remove_cb(SSL_CTX *ctx, SSL_SESSION *sess)
#define Data_Wrap_Struct(klass, mark, free, sval)
static VALUE ossl_sslctx_set_ssl_version(VALUE self, VALUE ssl_method)
VALUE rb_define_module(const char *name)
static int ossl_sslctx_session_new_cb(SSL *ssl, SSL_SESSION *sess)
static void read_would_block(int nonblock)
static VALUE ossl_ssl_connect(VALUE self)
int rb_io_wait_readable(int)
static VALUE ossl_sslctx_s_alloc(VALUE klass)
DH * OSSL_DEFAULT_DH_1024
void rb_define_method(VALUE klass, const char *name, VALUE(*func)(ANYARGS), int argc)
static VALUE ossl_ssl_cipher_to_ary(SSL_CIPHER *cipher)
static VALUE ossl_start_ssl(VALUE self, int(*func)(), const char *funcname, int nonblock)
int ossl_verify_cb(int ok, X509_STORE_CTX *ctx)
#define ossl_ssl_set_ctx(o, v)
static DH * ossl_default_tmp_dh_callback(SSL *ssl, int is_export, int keylength)
static VALUE ossl_sslctx_get_session_cache_size(VALUE self)
int ossl_ssl_ex_client_cert_cb_idx
#define ossl_ssl_get_sync_close(o)
void rb_str_set_len(VALUE, long)