BIO_F_SSL(3ssl) OpenSSL BIO_F_SSL(3ssl) BIO_do_handshake, BIO_f_ssl, BIO_set_ssl, BIO_get_ssl, BIO_set_ssl_mode, BIO_set_ssl_renegotiate_bytes, BIO_get_num_renegotiates, BIO_set_ssl_renegotiate_timeout, BIO_new_ssl, BIO_new_ssl_connect, BIO_new_buffer_ssl_connect, BIO_ssl_copy_session_id, BIO_ssl_shutdown - SSL BIO #include #include const BIO_METHOD *BIO_f_ssl(void); long BIO_set_ssl(BIO *b, SSL *ssl, long c); long BIO_get_ssl(BIO *b, SSL **sslp); long BIO_set_ssl_mode(BIO *b, long client); long BIO_set_ssl_renegotiate_bytes(BIO *b, long num); long BIO_set_ssl_renegotiate_timeout(BIO *b, long seconds); long BIO_get_num_renegotiates(BIO *b); BIO *BIO_new_ssl(SSL_CTX *ctx, int client); BIO *BIO_new_ssl_connect(SSL_CTX *ctx); BIO *BIO_new_buffer_ssl_connect(SSL_CTX *ctx); int BIO_ssl_copy_session_id(BIO *to, BIO *from); void BIO_ssl_shutdown(BIO *bio); long BIO_do_handshake(BIO *b); BIO_f_ssl() SSL BIO. BIO OpenSSL SSL "" BIO / SSL. / SSL BIO SSL BIOs SSL. SSL /. BIO SSL BIO BIO_push() BIOs SSL BIO. BIO_reset() SSL BIO SSL SSL_shutdown(). BIO_reset() BIO : . SSL BIO . SSL BIO SSL SSL_free(). BIO_set_ssl() SSL SSL BIO b ssl c. BIO_get_ssl() SSL SSL BIO b SSL . BIO_set_ssl_mode() SSL BIO client. client 1 . client 0 . BIO_set_ssl_renegotiate_bytes() SSL BIO b num. num / ( ) SSL . num 512 . BIO_set_ssl_renegotiate_timeout() SSL BIO b seconds. . BIO_get_num_renegotiates() / SSL BIO b. BIO_new_ssl() SSL BIO SSL_CTX ctx client . BIO_new_ssl_connect() BIO SSL BIO ( ctx) BIO . BIO_new_buffer_ssl_connect() BIO BIO SSL BIO ( ctx) BIO . BIO_ssl_copy_session_id() SSL BIO from to. BIOs SSL SSL_copy_session_id() SSL . BIO_ssl_shutdown() SSL BIO bio. SSL BIO SSL_shutdown() SSL . BIO_do_handshake() SSL BIO SSL. BIOs SSL TCP. IP connect(). 1 . . BIO_should_retry() BIOs . . BIOs SSL . BIO_read_ex() . SSL_AUTO_RETRY . SSL BIO . BIO_ctrl() BIOs BIO_set_host() BIO BIO_new_ssl_connect() BIO . BIO_do_handshake() / . BIO_set_ssl() BIO_get_ssl() BIO_set_ssl_mode() BIO_set_ssl_renegotiate_bytes() BIO_set_ssl_renegotiate_timeout() BIO_get_num_renegotiates() BIO_do_handshake() . BIO_ssl_copy_session_id() QUIC SSL . BIO_f_ssl() BIO_METHOD SSL. BIO_set_ssl() BIO_get_ssl() BIO_set_ssl_mode() BIO_set_ssl_renegotiate_bytes() BIO_set_ssl_renegotiate_timeout() BIO_get_num_renegotiates() 1 0 . BIO_new_ssl() BIO_new_ssl_connect() BIO_new_buffer_ssl_connect() BIO NULL . BIO_ssl_copy_session_id() 1 0 QUIC SSL. BIO_do_handshake() 1 . . SSL/TLS SSL/TLS. / BIO_s_connect(3). BIO *sbio, *out; int len; char tmpbuf[1024]; SSL_CTX *ctx; SSL *ssl; /* XXX Seed the PRNG if needed. */ ctx = SSL_CTX_new(TLS_client_method()); /* XXX Set verify paths and mode here. */ sbio = BIO_new_ssl_connect(ctx); BIO_get_ssl(sbio, &ssl); if (ssl == NULL) { fprintf(stderr, "Can't locate SSL pointer\n"); ERR_print_errors_fp(stderr); exit(1); } /* XXX We might want to do other things with ssl here */ /* An empty host part means the loopback address */ BIO_set_conn_hostname(sbio, ":https"); out = BIO_new_fp(stdout, BIO_NOCLOSE); if (BIO_do_connect(sbio) <= 0) { fprintf(stderr, "Error connecting to server\n"); ERR_print_errors_fp(stderr); exit(1); } /* XXX Could examine ssl here to get connection info */ BIO_puts(sbio, "GET / HTTP/1.0\n\n"); for (;;) { len = BIO_read(sbio, tmpbuf, 1024); if (len <= 0) break; BIO_write(out, tmpbuf, len); } BIO_free_all(sbio); BIO_free(out); . BIO SSL BIO BIO_gets. . BIO *sbio, *bbio, *acpt, *out; int len; char tmpbuf[1024]; SSL_CTX *ctx; SSL *ssl; /* XXX Seed the PRNG if needed. */ ctx = SSL_CTX_new(TLS_server_method()); if (!SSL_CTX_use_certificate_file(ctx, "server.pem", SSL_FILETYPE_PEM) || !SSL_CTX_use_PrivateKey_file(ctx, "server.pem", SSL_FILETYPE_PEM) || !SSL_CTX_check_private_key(ctx)) { fprintf(stderr, "Error setting up SSL_CTX\n"); ERR_print_errors_fp(stderr); exit(1); } /* XXX Other things like set verify locations, EDH temp callbacks. */ /* New SSL BIO setup as server */ sbio = BIO_new_ssl(ctx, 0); BIO_get_ssl(sbio, &ssl); if (ssl == NULL) { fprintf(stderr, "Can't locate SSL pointer\n"); ERR_print_errors_fp(stderr); exit(1); } bbio = BIO_new(BIO_f_buffer()); sbio = BIO_push(bbio, sbio); acpt = BIO_new_accept("4433"); /* * By doing this when a new connection is established * we automatically have sbio inserted into it. The * BIO chain is now 'swallowed' by the accept BIO and * will be freed when the accept BIO is freed. */ BIO_set_accept_bios(acpt, sbio); out = BIO_new_fp(stdout, BIO_NOCLOSE); /* First call to BIO_do_accept() sets up accept BIO */ if (BIO_do_accept(acpt) <= 0) { fprintf(stderr, "Error setting up accept BIO\n"); ERR_print_errors_fp(stderr); exit(1); } /* Second call to BIO_do_accept() waits for incoming connection */ if (BIO_do_accept(acpt) <= 0) { fprintf(stderr, "Error accepting connection\n"); ERR_print_errors_fp(stderr); exit(1); } /* We only want one connection so remove and free accept BIO */ sbio = BIO_pop(acpt); BIO_free_all(acpt); if (BIO_do_handshake(sbio) <= 0) { fprintf(stderr, "Error in SSL handshake\n"); ERR_print_errors_fp(stderr); exit(1); } BIO_puts(sbio, "HTTP/1.0 200 OK\r\nContent-type: text/plain\r\n\r\n"); BIO_puts(sbio, "\r\nConnection Established\r\nRequest headers:\r\n"); BIO_puts(sbio, "--------------------------------------------------\r\n"); for (;;) { len = BIO_gets(sbio, tmpbuf, 1024); if (len <= 0) break; BIO_write(sbio, tmpbuf, len); BIO_write(out, tmpbuf, len); /* Look for blank line signifying end of headers*/ if (tmpbuf[0] == '\r' || tmpbuf[0] == '\n') break; } BIO_puts(sbio, "--------------------------------------------------\r\n"); BIO_puts(sbio, "\r\n"); BIO_flush(sbio); BIO_free_all(sbio); OpenSSL 1.0.0 BIO_pop() I/O BIO ( ) SSL BIO SSL BIO ( ). ( BIOs ) BIO . 2000-2023 OpenSSL. . Apache 2.0 ( ""). . LICENSE . 3 . . : . 3.6.2 7 2026 BIO_F_SSL(3ssl)