Line data Source code
1 : #ifndef HEADER_fd_src_waltz_h2_fd_h2_rbuf_ossl_h 2 : #define HEADER_fd_src_waltz_h2_fd_h2_rbuf_ossl_h 3 : 4 : /* fd_h2_rbuf_ossl.h provides utils for I/O between rbuf and OpenSSL 5 : BIO. */ 6 : 7 : #include "fd_h2_rbuf.h" 8 : 9 : #if FD_HAS_OPENSSL 10 : 11 : #include <openssl/err.h> 12 : #include <openssl/ssl.h> 13 : 14 : /* fd_h2_rbuf_ssl_read reads bytes from a SSL and places them into rbuf. */ 15 : 16 : static inline ulong 17 : fd_h2_rbuf_ssl_read( fd_h2_rbuf_t * rbuf_out, 18 : SSL * ssl, 19 0 : int * ssl_err ) { 20 0 : ulong sz0, sz1; 21 0 : uchar * rbuf_free = fd_h2_rbuf_peek_free( rbuf_out, &sz0, &sz1 ); 22 0 : if( FD_UNLIKELY( !sz0 ) ) return 0UL; 23 : 24 0 : ERR_clear_error(); 25 0 : ulong read_sz; 26 0 : if( FD_UNLIKELY( !SSL_read_ex( ssl, rbuf_free, sz0, &read_sz ) ) ) { 27 0 : *ssl_err = SSL_get_error( ssl, 0 ); 28 0 : return 0UL; 29 0 : } 30 0 : fd_h2_rbuf_alloc( rbuf_out, read_sz ); 31 0 : return read_sz; 32 0 : } 33 : 34 : /* fd_h2_rbuf_ssl_write writes bytes from an rbuf into a SSL. 35 : FIXME react to fatal errors here? */ 36 : 37 : static inline ulong 38 : fd_h2_rbuf_ssl_write( fd_h2_rbuf_t * rbuf_in, 39 0 : SSL * ssl ) { 40 0 : ulong sz0, sz1; 41 0 : uchar * rbuf_used = fd_h2_rbuf_peek_used( rbuf_in, &sz0, &sz1 ); 42 0 : if( FD_UNLIKELY( !sz0 ) ) return 0UL; 43 : 44 0 : ulong write_sz; 45 0 : if( FD_UNLIKELY( !SSL_write_ex( ssl, rbuf_used, sz0, &write_sz ) ) ) return 0UL; 46 0 : if( FD_UNLIKELY( sz1 && write_sz==sz0 ) ) { 47 0 : ulong write_sz1; 48 0 : if( SSL_write_ex( ssl, rbuf_in->buf0, sz1, &write_sz1 ) ) { 49 0 : write_sz += write_sz1; 50 0 : } 51 0 : } 52 0 : fd_h2_rbuf_skip( rbuf_in, write_sz ); 53 0 : return write_sz; 54 0 : } 55 : 56 : #endif /* FD_HAS_OPENSSL */ 57 : 58 : #endif /* HEADER_fd_src_waltz_h2_fd_h2_rbuf_ossl_h */