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