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)
35 #define ossl_sslctx_set_cert(o,v) rb_iv_set((o),"@cert",(v))
36 #define ossl_sslctx_set_key(o,v) rb_iv_set((o),"@key",(v))
37 #define ossl_sslctx_set_client_ca(o,v) rb_iv_set((o),"@client_ca",(v))
38 #define ossl_sslctx_set_ca_file(o,v) rb_iv_set((o),"@ca_file",(v))
39 #define ossl_sslctx_set_ca_path(o,v) rb_iv_set((o),"@ca_path",(v))
40 #define ossl_sslctx_set_timeout(o,v) rb_iv_set((o),"@timeout",(v))
41 #define ossl_sslctx_set_verify_mode(o,v) rb_iv_set((o),"@verify_mode",(v))
42 #define ossl_sslctx_set_verify_dep(o,v) rb_iv_set((o),"@verify_depth",(v))
43 #define ossl_sslctx_set_verify_cb(o,v) rb_iv_set((o),"@verify_callback",(v))
44 #define ossl_sslctx_set_options(o,v) rb_iv_set((o),"@options",(v))
45 #define ossl_sslctx_set_cert_store(o,v) rb_iv_set((o),"@cert_store",(v))
46 #define ossl_sslctx_set_extra_cert(o,v) rb_iv_set((o),"@extra_chain_cert",(v))
47 #define ossl_sslctx_set_client_cert_cb(o,v) rb_iv_set((o),"@client_cert_cb",(v))
48 #define ossl_sslctx_set_tmp_dh_cb(o,v) rb_iv_set((o),"@tmp_dh_callback",(v))
49 #define ossl_sslctx_set_sess_id_ctx(o, v) rb_iv_set((o),"@session_id_context",(v))
51 #define ossl_sslctx_get_cert(o) rb_iv_get((o),"@cert")
52 #define ossl_sslctx_get_key(o) rb_iv_get((o),"@key")
53 #define ossl_sslctx_get_client_ca(o) rb_iv_get((o),"@client_ca")
54 #define ossl_sslctx_get_ca_file(o) rb_iv_get((o),"@ca_file")
55 #define ossl_sslctx_get_ca_path(o) rb_iv_get((o),"@ca_path")
56 #define ossl_sslctx_get_timeout(o) rb_iv_get((o),"@timeout")
57 #define ossl_sslctx_get_verify_mode(o) rb_iv_get((o),"@verify_mode")
58 #define ossl_sslctx_get_verify_dep(o) rb_iv_get((o),"@verify_depth")
59 #define ossl_sslctx_get_verify_cb(o) rb_iv_get((o),"@verify_callback")
60 #define ossl_sslctx_get_options(o) rb_iv_get((o),"@options")
61 #define ossl_sslctx_get_cert_store(o) rb_iv_get((o),"@cert_store")
62 #define ossl_sslctx_get_extra_cert(o) rb_iv_get((o),"@extra_chain_cert")
63 #define ossl_sslctx_get_client_cert_cb(o) rb_iv_get((o),"@client_cert_cb")
64 #define ossl_sslctx_get_tmp_dh_cb(o) rb_iv_get((o),"@tmp_dh_callback")
65 #define ossl_sslctx_get_sess_id_ctx(o) rb_iv_get((o),"@session_id_context")
68 "cert",
"key",
"client_ca",
"ca_file",
"ca_path",
69 "timeout",
"verify_mode",
"verify_depth",
"renegotiation_cb",
70 "verify_callback",
"options",
"cert_store",
"extra_chain_cert",
71 "client_cert_cb",
"tmp_dh_callback",
"session_id_context",
72 "session_get_cb",
"session_new_cb",
"session_remove_cb",
73 #ifdef HAVE_SSL_SET_TLSEXT_HOST_NAME
76 #ifdef HAVE_OPENSSL_NPN_NEGOTIATED
82 #define ossl_ssl_get_io(o) rb_iv_get((o),"@io")
83 #define ossl_ssl_get_ctx(o) rb_iv_get((o),"@context")
84 #define ossl_ssl_get_sync_close(o) rb_iv_get((o),"@sync_close")
85 #define ossl_ssl_get_x509(o) rb_iv_get((o),"@x509")
86 #define ossl_ssl_get_key(o) rb_iv_get((o),"@key")
87 #define ossl_ssl_get_tmp_dh(o) rb_iv_get((o),"@tmp_dh")
89 #define ossl_ssl_set_io(o,v) rb_iv_set((o),"@io",(v))
90 #define ossl_ssl_set_ctx(o,v) rb_iv_set((o),"@context",(v))
91 #define ossl_ssl_set_sync_close(o,v) rb_iv_set((o),"@sync_close",(v))
92 #define ossl_ssl_set_x509(o,v) rb_iv_set((o),"@x509",(v))
93 #define ossl_ssl_set_key(o,v) rb_iv_set((o),"@key",(v))
94 #define ossl_ssl_set_tmp_dh(o,v) rb_iv_set((o),"@tmp_dh",(v))
98 #ifdef HAVE_SSL_SET_TLSEXT_HOST_NAME
115 #define OSSL_SSL_METHOD_ENTRY(name) { #name, (SSL_METHOD *(*)(void))name##_method }
119 #if defined(HAVE_TLSV1_2_METHOD) && defined(HAVE_TLSV1_2_SERVER_METHOD) && \
120 defined(HAVE_TLSV1_2_CLIENT_METHOD)
125 #if defined(HAVE_TLSV1_1_METHOD) && defined(HAVE_TLSV1_1_SERVER_METHOD) && \
126 defined(HAVE_TLSV1_1_CLIENT_METHOD)
131 #if defined(HAVE_SSLV2_METHOD) && defined(HAVE_SSLV2_SERVER_METHOD) && \
132 defined(HAVE_SSLV2_CLIENT_METHOD)
137 #if defined(HAVE_SSLV3_METHOD) && defined(HAVE_SSLV3_SERVER_METHOD) && \
138 defined(HAVE_SSLV3_CLIENT_METHOD)
146 #undef OSSL_SSL_METHOD_ENTRY
159 ctx->cert_store =
NULL;
167 long mode = SSL_MODE_ENABLE_PARTIAL_WRITE;
169 #ifdef SSL_MODE_RELEASE_BUFFERS
170 mode |= SSL_MODE_RELEASE_BUFFERS;
173 ctx = SSL_CTX_new(SSLv23_method());
177 SSL_CTX_set_mode(ctx, mode);
210 if (SSL_CTX_set_ssl_version(ctx, method) != 1) {
271 if (!
RTEST(success))
return 0;
278 #if !defined(OPENSSL_NO_DH)
291 if (EVP_PKEY_type(pkey->type) != EVP_PKEY_DH)
return Qfalse;
333 ssl = X509_STORE_CTX_get_ex_data(ctx, SSL_get_ex_data_X509_STORE_CTX_idx());
342 VALUE ssl_obj, sslctx_obj, cb;
347 sslctx_obj =
rb_iv_get(ssl_obj,
"@context");
349 cb =
rb_iv_get(sslctx_obj,
"@session_get_cb");
364 OSSL_Debug(
"SSL SESSION get callback entered");
367 ssl_obj = (
VALUE)ptr;
389 VALUE ssl_obj, sslctx_obj, cb;
394 sslctx_obj =
rb_iv_get(ssl_obj,
"@context");
396 cb =
rb_iv_get(sslctx_obj,
"@session_new_cb");
410 OSSL_Debug(
"SSL SESSION new callback entered");
414 ssl_obj = (
VALUE)ptr;
416 CRYPTO_add(&sess->references, 1, CRYPTO_LOCK_SSL_SESSION);
441 VALUE sslctx_obj, cb;
446 cb =
rb_iv_get(sslctx_obj,
"@session_remove_cb");
459 OSSL_Debug(
"SSL SESSION remove callback entered");
463 sslctx_obj = (
VALUE)ptr;
465 CRYPTO_add(&sess->references, 1, CRYPTO_LOCK_SSL_SESSION);
490 if(!SSL_CTX_add_extra_chain_cert(ctx, x509)){
499 #ifdef HAVE_SSL_SET_TLSEXT_HOST_NAME
503 VALUE ssl_obj, sslctx_obj, cb, ret_obj;
508 sslctx_obj =
rb_iv_get(ssl_obj,
"@context");
510 cb =
rb_iv_get(sslctx_obj,
"@servername_cb");
521 SSL_set_SSL_CTX(ssl, ctx2);
522 }
else if (!
NIL_P(ret_obj)) {
530 ssl_servername_cb(SSL *ssl,
int *ad,
void *
arg)
535 const char *servername = SSL_get_servername(ssl, TLSEXT_NAMETYPE_host_name);
538 return SSL_TLSEXT_ERR_OK;
541 return SSL_TLSEXT_ERR_ALERT_FATAL;
542 ssl_obj = (
VALUE)ptr;
550 return SSL_TLSEXT_ERR_ALERT_FATAL;
553 return SSL_TLSEXT_ERR_OK;
560 VALUE ssl_obj, sslctx_obj, cb;
565 ssl_obj = (
VALUE)ptr;
567 sslctx_obj =
rb_iv_get(ssl_obj,
"@context");
568 if (
NIL_P(sslctx_obj))
return;
569 cb =
rb_iv_get(sslctx_obj,
"@renegotiation_cb");
570 if (
NIL_P(cb))
return;
575 #if defined(HAVE_SSL_CTX_SET_NEXT_PROTO_SELECT_CB) || defined(HAVE_SSL_CTX_SET_ALPN_SELECT_CB)
577 ssl_npn_encode_protocol_i(
VALUE cur,
VALUE encoded)
581 if (len < 1 || len > 255)
591 ssl_npn_encode_protocols(
VALUE sslctx,
VALUE protocols)
596 rb_iv_set(sslctx,
"@_protocols", encoded);
600 ssl_npn_select_cb_common(
VALUE cb,
const unsigned char **
out,
unsigned char *outlen,
const unsigned char *
in,
unsigned int inlen)
622 if (len < 1 || len >= 256) {
626 *outlen = (
unsigned char)len;
628 return SSL_TLSEXT_ERR_OK;
631 #ifdef HAVE_SSL_CTX_SET_NEXT_PROTO_SELECT_CB
633 ssl_npn_advertise_cb(SSL *ssl,
const unsigned char **out,
unsigned int *outlen,
void *arg)
638 *out = (
const unsigned char *)
RSTRING_PTR(protocols);
641 return SSL_TLSEXT_ERR_OK;
645 ssl_npn_select_cb(SSL *
s,
unsigned char **out,
unsigned char *outlen,
const unsigned char *in,
unsigned int inlen,
void *arg)
647 VALUE sslctx_obj, cb;
649 sslctx_obj = (
VALUE) arg;
650 cb =
rb_iv_get(sslctx_obj,
"@npn_select_cb");
652 return ssl_npn_select_cb_common(cb, (
const unsigned char **)out, outlen, in, inlen);
662 int state = SSL_state(ssl);
664 if ((where & SSL_CB_HANDSHAKE_START) &&
665 (state & SSL_ST_ACCEPT)) {
683 X509 *cert =
NULL, *client_ca =
NULL;
686 char *ca_path =
NULL, *ca_file =
NULL;
693 #if !defined(OPENSSL_NO_DH)
712 SSL_CTX_set_cert_store(ctx, store);
727 if (!SSL_CTX_use_certificate(ctx, cert)) {
731 if (!SSL_CTX_use_PrivateKey(ctx, key)) {
735 if (!SSL_CTX_check_private_key(ctx)) {
745 if (!SSL_CTX_add_client_CA(ctx, client_ca)){
753 if (!SSL_CTX_add_client_CA(ctx, client_ca)){
764 if(ca_file || ca_path){
765 if (!SSL_CTX_load_verify_locations(ctx, ca_file, ca_path))
770 verify_mode =
NIL_P(val) ? SSL_VERIFY_NONE :
NUM2INT(val);
779 if(!
NIL_P(val)) SSL_CTX_set_verify_depth(ctx,
NUM2INT(val));
783 SSL_CTX_set_options(ctx,
NUM2LONG(val));
785 SSL_CTX_set_options(ctx, SSL_OP_ALL);
788 #ifdef HAVE_SSL_CTX_SET_NEXT_PROTO_SELECT_CB
791 ssl_npn_encode_protocols(
self, val);
792 SSL_CTX_set_next_protos_advertised_cb(ctx, ssl_npn_advertise_cb, (
void *)
self);
793 OSSL_Debug(
"SSL NPN advertise callback added");
796 SSL_CTX_set_next_proto_select_cb(ctx, ssl_npn_select_cb, (
void *)
self);
806 if (!SSL_CTX_set_session_id_context(ctx, (
unsigned char *)
RSTRING_PTR(val),
822 OSSL_Debug(
"SSL SESSION remove callback added");
825 #ifdef HAVE_SSL_SET_TLSEXT_HOST_NAME
828 SSL_CTX_set_tlsext_servername_callback(ctx, ssl_servername_cb);
829 OSSL_Debug(
"SSL TLSEXT servername callback added");
845 bits = SSL_CIPHER_get_bits(cipher, &alg_bits);
872 ciphers = ctx->cipher_list;
877 num = sk_SSL_CIPHER_num(ciphers);
879 for(i = 0; i < num; i++){
880 cipher = sk_SSL_CIPHER_value(ciphers, i);
927 if (!SSL_CTX_set_cipher_list(ctx,
RSTRING_PTR(str))) {
949 return SSL_CTX_add_session(ctx, sess) == 1 ?
Qtrue :
Qfalse;
967 return SSL_CTX_remove_session(ctx, sess) == 1 ?
Qtrue :
Qfalse;
983 return LONG2NUM(SSL_CTX_get_session_cache_mode(ctx));
1001 SSL_CTX_set_session_cache_mode(ctx,
NUM2LONG(arg));
1020 return LONG2NUM(SSL_CTX_sess_get_cache_size(ctx));
1037 SSL_CTX_sess_set_cache_size(ctx,
NUM2LONG(arg));
1115 SSL_CTX_flush_sessions(ctx, (
long)tm);
1123 #ifndef OPENSSL_NO_SOCK
1132 for (i = 0; i < 4; ++
i) {
1137 if (rc = SSL_shutdown(ssl))
1205 #ifdef HAVE_SSL_SET_TLSEXT_HOST_NAME
1218 #ifdef HAVE_SSL_SET_TLSEXT_HOST_NAME
1219 if (!
NIL_P(hostname)) {
1220 if (SSL_set_tlsext_host_name(ssl,
StringValuePtr(hostname)) != 1)
1243 #define ssl_get_error(ssl, ret) (errno = rb_w32_map_errno(WSAGetLastError()), SSL_get_error((ssl), (ret)))
1245 #define ssl_get_error(ssl, ret) SSL_get_error((ssl), (ret))
1248 #define ossl_ssl_data_get_struct(v, ssl) \
1250 Data_Get_Struct((v), SSL, (ssl)); \
1252 rb_warning("SSL session is not started yet."); \
1292 if (!
NIL_P(cb_state))
1299 case SSL_ERROR_WANT_WRITE:
1303 case SSL_ERROR_WANT_READ:
1307 case SSL_ERROR_SYSCALL:
1309 ossl_raise(
eSSLError,
"%s SYSCALL returned=%d errno=%d state=%s", funcname, ret2,
errno, SSL_state_string_long(ssl));
1400 int ilen, nread = 0;
1401 int no_exception = 0;
1418 if(ilen == 0)
return str;
1423 if(!nonblock && SSL_pending(ssl) <= 0)
1428 case SSL_ERROR_NONE:
1430 case SSL_ERROR_ZERO_RETURN:
1431 if (no_exception) {
return Qnil; }
1433 case SSL_ERROR_WANT_WRITE:
1438 case SSL_ERROR_WANT_READ:
1443 case SSL_ERROR_SYSCALL:
1444 if(ERR_peek_error() == 0 && nread == 0) {
1445 if (no_exception) {
return Qnil; }
1456 rb_warning(
"SSL session is not started yet.");
1515 case SSL_ERROR_NONE:
1517 case SSL_ERROR_WANT_WRITE:
1522 case SSL_ERROR_WANT_READ:
1527 case SSL_ERROR_SYSCALL:
1536 rb_warning(
"SSL session is not started yet.");
1568 int no_exception = 0;
1627 cert = SSL_get_certificate(ssl);
1650 cert = SSL_get_peer_certificate(ssl);
1678 chain = SSL_get_peer_cert_chain(ssl);
1679 if(!chain)
return Qnil;
1680 num = sk_X509_num(chain);
1682 for (i = 0; i < num; i++){
1683 cert = sk_X509_value(chain, i);
1721 cipher = (SSL_CIPHER *)SSL_get_current_cipher(ssl);
1761 return INT2NUM(SSL_pending(ssl));
1777 switch(SSL_session_reused(ssl)) {
1778 case 1:
return Qtrue;
1805 if (SSL_set_session(ssl, sess) != 1)
1827 return INT2FIX(SSL_get_verify_result(ssl));
1849 ca = SSL_get_client_CA_list(ssl);
1853 # ifdef HAVE_SSL_CTX_SET_NEXT_PROTO_SELECT_CB
1862 ossl_ssl_npn_protocol(
VALUE self)
1865 const unsigned char *
out;
1866 unsigned int outlen;
1870 SSL_get0_next_proto_negotiated(ssl, &out, &outlen);
1874 return rb_str_new((
const char *) out, outlen);
1895 SSL_get_ex_new_index(0,(
void *)
"ossl_ssl_ex_client_cert_cb_idx",0,0,0);
1897 SSL_get_ex_new_index(0,(
void *)
"ossl_ssl_ex_tmp_dh_callback_idx",0,0,0);
2063 #ifdef HAVE_SSL_SET_TLSEXT_HOST_NAME
2095 #ifdef HAVE_SSL_CTX_SET_NEXT_PROTO_SELECT_CB
2208 #ifdef OPENSSL_NO_SOCK
2239 # ifdef HAVE_SSL_CTX_SET_NEXT_PROTO_SELECT_CB
2244 #define ossl_ssl_def_const(x) rb_define_const(mSSL, #x, INT2NUM(SSL_##x))
2259 #if defined(SSL_OP_MSIE_SSLV2_RSA_PADDING)
2267 #if defined(SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION)
2270 #if defined(SSL_OP_SINGLE_ECDH_USE)
2275 #if defined(SSL_OP_CIPHER_SERVER_PREFERENCE)
2282 #if defined(SSL_OP_NO_TLSv1_1)
2285 #if defined(SSL_OP_NO_TLSv1_2)
2288 #if defined(SSL_OP_NO_TICKET)
2291 #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)
static VALUE eSSLErrorWaitReadable
rb_funcall(memo->yielder, id_lshift, 1, rb_assoc_new(memo->prev_value, memo->prev_elts))
SSL_METHOD *(* func)(void)
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_define_class_under(VALUE outer, const char *name, VALUE super)
Defines a class under the namespace of outer.
void rb_include_module(VALUE klass, VALUE module)
#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_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_ivar_get(VALUE, ID)
static void ossl_ssl_shutdown(SSL *ssl)
RUBY_EXTERN VALUE rb_mWaitWritable
static VALUE sym_exception
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)
return Data_Wrap_Struct(CLASS_OF(interp), 0, ip_free, slave)
static VALUE ossl_sslctx_get_ciphers(VALUE self)
#define StringValuePtr(v)
#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)
static VALUE ossl_ssl_write_internal(VALUE self, VALUE str, int nonblock, int no_exception)
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)
unsigned char buf[MIME_BUF_SIZE]
#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)
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)
rb_block_call(enumerable, id_each, 0, 0, chunk_ii, arg)
#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,...)
void rb_attr(VALUE, ID, int, int, int)
#define ossl_ssl_data_get_struct(v, ssl)
static VALUE ossl_ssl_write_nonblock(int argc, VALUE *argv, VALUE self)
#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)
rb_hash_aset(hash, RARRAY_AREF(key_value_pair, 0), RARRAY_AREF(key_value_pair, 1))
static VALUE ossl_sslctx_set_session_cache_mode(VALUE self, VALUE arg)
#define ossl_ssl_get_key(o)
static VALUE eSSLErrorWaitWritable
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)
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)
#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)
void rb_notimplement(void)
static VALUE ossl_ssl_get_version(VALUE self)
static VALUE ossl_sslctx_set_session_cache_size(VALUE self, VALUE arg)
#define RSTRING_LENINT(str)
rb_ivar_set(yielder, id_memo, LONG2NUM(++count))
EVP_PKEY * DupPKeyPtr(VALUE obj)
X509 * DupX509CertPtr(VALUE)
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)
VALUE rb_hash_aref(VALUE, VALUE)
void rb_warning(const char *fmt,...)
#define SafeGetSSLSession(obj, sess)
static void ossl_sslctx_session_remove_cb(SSL_CTX *ctx, SSL_SESSION *sess)
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)
#define RB_BLOCK_CALL_FUNC_ARGLIST(yielded_arg, callback_arg)
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)
struct @43 ossl_ssl_method_tab[]
void rb_str_set_len(VALUE, long)