1e71b7053SJung-uk Kim=pod 2e71b7053SJung-uk Kim 3e71b7053SJung-uk Kim=head1 NAME 4e71b7053SJung-uk Kim 5e71b7053SJung-uk KimBIO_s_bio, BIO_make_bio_pair, BIO_destroy_bio_pair, BIO_shutdown_wr, 6e71b7053SJung-uk KimBIO_set_write_buf_size, BIO_get_write_buf_size, BIO_new_bio_pair, 7e71b7053SJung-uk KimBIO_get_write_guarantee, BIO_ctrl_get_write_guarantee, BIO_get_read_request, 8e71b7053SJung-uk KimBIO_ctrl_get_read_request, BIO_ctrl_reset_read_request - BIO pair BIO 9e71b7053SJung-uk Kim 10e71b7053SJung-uk Kim=head1 SYNOPSIS 11e71b7053SJung-uk Kim 12e71b7053SJung-uk Kim #include <openssl/bio.h> 13e71b7053SJung-uk Kim 14e71b7053SJung-uk Kim const BIO_METHOD *BIO_s_bio(void); 15e71b7053SJung-uk Kim 16e71b7053SJung-uk Kim int BIO_make_bio_pair(BIO *b1, BIO *b2); 17e71b7053SJung-uk Kim int BIO_destroy_bio_pair(BIO *b); 18e71b7053SJung-uk Kim int BIO_shutdown_wr(BIO *b); 19e71b7053SJung-uk Kim 20e71b7053SJung-uk Kim int BIO_set_write_buf_size(BIO *b, long size); 21e71b7053SJung-uk Kim size_t BIO_get_write_buf_size(BIO *b, long size); 22e71b7053SJung-uk Kim 23e71b7053SJung-uk Kim int BIO_new_bio_pair(BIO **bio1, size_t writebuf1, BIO **bio2, size_t writebuf2); 24e71b7053SJung-uk Kim 25e71b7053SJung-uk Kim int BIO_get_write_guarantee(BIO *b); 26e71b7053SJung-uk Kim size_t BIO_ctrl_get_write_guarantee(BIO *b); 27e71b7053SJung-uk Kim int BIO_get_read_request(BIO *b); 28e71b7053SJung-uk Kim size_t BIO_ctrl_get_read_request(BIO *b); 29e71b7053SJung-uk Kim int BIO_ctrl_reset_read_request(BIO *b); 30e71b7053SJung-uk Kim 31e71b7053SJung-uk Kim=head1 DESCRIPTION 32e71b7053SJung-uk Kim 33e71b7053SJung-uk KimBIO_s_bio() returns the method for a BIO pair. A BIO pair is a pair of source/sink 34e71b7053SJung-uk KimBIOs where data written to either half of the pair is buffered and can be read from 35e71b7053SJung-uk Kimthe other half. Both halves must usually by handled by the same application thread 36e71b7053SJung-uk Kimsince no locking is done on the internal data structures. 37e71b7053SJung-uk Kim 38e71b7053SJung-uk KimSince BIO chains typically end in a source/sink BIO it is possible to make this 39e71b7053SJung-uk Kimone half of a BIO pair and have all the data processed by the chain under application 40e71b7053SJung-uk Kimcontrol. 41e71b7053SJung-uk Kim 42e71b7053SJung-uk KimOne typical use of BIO pairs is to place TLS/SSL I/O under application control, this 43e71b7053SJung-uk Kimcan be used when the application wishes to use a non standard transport for 44e71b7053SJung-uk KimTLS/SSL or the normal socket routines are inappropriate. 45e71b7053SJung-uk Kim 46e71b7053SJung-uk KimCalls to BIO_read_ex() will read data from the buffer or request a retry if no 47e71b7053SJung-uk Kimdata is available. 48e71b7053SJung-uk Kim 49e71b7053SJung-uk KimCalls to BIO_write_ex() will place data in the buffer or request a retry if the 50e71b7053SJung-uk Kimbuffer is full. 51e71b7053SJung-uk Kim 52e71b7053SJung-uk KimThe standard calls BIO_ctrl_pending() and BIO_ctrl_wpending() can be used to 53e71b7053SJung-uk Kimdetermine the amount of pending data in the read or write buffer. 54e71b7053SJung-uk Kim 55e71b7053SJung-uk KimBIO_reset() clears any data in the write buffer. 56e71b7053SJung-uk Kim 57e71b7053SJung-uk KimBIO_make_bio_pair() joins two separate BIOs into a connected pair. 58e71b7053SJung-uk Kim 59e71b7053SJung-uk KimBIO_destroy_pair() destroys the association between two connected BIOs. Freeing 60e71b7053SJung-uk Kimup any half of the pair will automatically destroy the association. 61e71b7053SJung-uk Kim 62e71b7053SJung-uk KimBIO_shutdown_wr() is used to close down a BIO B<b>. After this call no further 63e71b7053SJung-uk Kimwrites on BIO B<b> are allowed (they will return an error). Reads on the other 64e71b7053SJung-uk Kimhalf of the pair will return any pending data or EOF when all pending data has 65e71b7053SJung-uk Kimbeen read. 66e71b7053SJung-uk Kim 67e71b7053SJung-uk KimBIO_set_write_buf_size() sets the write buffer size of BIO B<b> to B<size>. 68e71b7053SJung-uk KimIf the size is not initialized a default value is used. This is currently 69e71b7053SJung-uk Kim17K, sufficient for a maximum size TLS record. 70e71b7053SJung-uk Kim 71e71b7053SJung-uk KimBIO_get_write_buf_size() returns the size of the write buffer. 72e71b7053SJung-uk Kim 73e71b7053SJung-uk KimBIO_new_bio_pair() combines the calls to BIO_new(), BIO_make_bio_pair() and 74e71b7053SJung-uk KimBIO_set_write_buf_size() to create a connected pair of BIOs B<bio1>, B<bio2> 75e71b7053SJung-uk Kimwith write buffer sizes B<writebuf1> and B<writebuf2>. If either size is 76e71b7053SJung-uk Kimzero then the default size is used. BIO_new_bio_pair() does not check whether 77e71b7053SJung-uk KimB<bio1> or B<bio2> do point to some other BIO, the values are overwritten, 78e71b7053SJung-uk KimBIO_free() is not called. 79e71b7053SJung-uk Kim 80e71b7053SJung-uk KimBIO_get_write_guarantee() and BIO_ctrl_get_write_guarantee() return the maximum 81e71b7053SJung-uk Kimlength of data that can be currently written to the BIO. Writes larger than this 82e71b7053SJung-uk Kimvalue will return a value from BIO_write_ex() less than the amount requested or 83e71b7053SJung-uk Kimif the buffer is full request a retry. BIO_ctrl_get_write_guarantee() is a 84e71b7053SJung-uk Kimfunction whereas BIO_get_write_guarantee() is a macro. 85e71b7053SJung-uk Kim 86e71b7053SJung-uk KimBIO_get_read_request() and BIO_ctrl_get_read_request() return the 87e71b7053SJung-uk Kimamount of data requested, or the buffer size if it is less, if the 88e71b7053SJung-uk Kimlast read attempt at the other half of the BIO pair failed due to an 89e71b7053SJung-uk Kimempty buffer. This can be used to determine how much data should be 90e71b7053SJung-uk Kimwritten to the BIO so the next read will succeed: this is most useful 91e71b7053SJung-uk Kimin TLS/SSL applications where the amount of data read is usually 92e71b7053SJung-uk Kimmeaningful rather than just a buffer size. After a successful read 93e71b7053SJung-uk Kimthis call will return zero. It also will return zero once new data 94e71b7053SJung-uk Kimhas been written satisfying the read request or part of it. 95e71b7053SJung-uk KimNote that BIO_get_read_request() never returns an amount larger 96e71b7053SJung-uk Kimthan that returned by BIO_get_write_guarantee(). 97e71b7053SJung-uk Kim 98e71b7053SJung-uk KimBIO_ctrl_reset_read_request() can also be used to reset the value returned by 99e71b7053SJung-uk KimBIO_get_read_request() to zero. 100e71b7053SJung-uk Kim 101e71b7053SJung-uk Kim=head1 NOTES 102e71b7053SJung-uk Kim 103e71b7053SJung-uk KimBoth halves of a BIO pair should be freed. That is even if one half is implicit 104e71b7053SJung-uk Kimfreed due to a BIO_free_all() or SSL_free() call the other half needs to be freed. 105e71b7053SJung-uk Kim 106e71b7053SJung-uk KimWhen used in bidirectional applications (such as TLS/SSL) care should be taken to 107e71b7053SJung-uk Kimflush any data in the write buffer. This can be done by calling BIO_pending() 108e71b7053SJung-uk Kimon the other half of the pair and, if any data is pending, reading it and sending 109e71b7053SJung-uk Kimit to the underlying transport. This must be done before any normal processing 110e71b7053SJung-uk Kim(such as calling select() ) due to a request and BIO_should_read() being true. 111e71b7053SJung-uk Kim 112e71b7053SJung-uk KimTo see why this is important consider a case where a request is sent using 113e71b7053SJung-uk KimBIO_write_ex() and a response read with BIO_read_ex(), this can occur during an 114e71b7053SJung-uk KimTLS/SSL handshake for example. BIO_write_ex() will succeed and place data in the 115e71b7053SJung-uk Kimwrite buffer. BIO_read_ex() will initially fail and BIO_should_read() will be 116e71b7053SJung-uk Kimtrue. If the application then waits for data to be available on the underlying 117e71b7053SJung-uk Kimtransport before flushing the write buffer it will never succeed because the 118e71b7053SJung-uk Kimrequest was never sent! 119e71b7053SJung-uk Kim 120e71b7053SJung-uk KimBIO_eof() is true if no data is in the peer BIO and the peer BIO has been 121e71b7053SJung-uk Kimshutdown. 122e71b7053SJung-uk Kim 123e71b7053SJung-uk KimBIO_make_bio_pair(), BIO_destroy_bio_pair(), BIO_shutdown_wr(), 124e71b7053SJung-uk KimBIO_set_write_buf_size(), BIO_get_write_buf_size(), 125e71b7053SJung-uk KimBIO_get_write_guarantee(), and BIO_get_read_request() are implemented 126e71b7053SJung-uk Kimas macros. 127e71b7053SJung-uk Kim 128e71b7053SJung-uk Kim=head1 RETURN VALUES 129e71b7053SJung-uk Kim 130e71b7053SJung-uk KimBIO_new_bio_pair() returns 1 on success, with the new BIOs available in 131e71b7053SJung-uk KimB<bio1> and B<bio2>, or 0 on failure, with NULL pointers stored into the 132e71b7053SJung-uk Kimlocations for B<bio1> and B<bio2>. Check the error stack for more information. 133e71b7053SJung-uk Kim 134e71b7053SJung-uk Kim[XXXXX: More return values need to be added here] 135e71b7053SJung-uk Kim 136da327cd2SJung-uk Kim=head1 EXAMPLES 137e71b7053SJung-uk Kim 138e71b7053SJung-uk KimThe BIO pair can be used to have full control over the network access of an 139e71b7053SJung-uk Kimapplication. The application can call select() on the socket as required 140e71b7053SJung-uk Kimwithout having to go through the SSL-interface. 141e71b7053SJung-uk Kim 142e71b7053SJung-uk Kim BIO *internal_bio, *network_bio; 143e71b7053SJung-uk Kim 144e71b7053SJung-uk Kim ... 145e71b7053SJung-uk Kim BIO_new_bio_pair(&internal_bio, 0, &network_bio, 0); 146e71b7053SJung-uk Kim SSL_set_bio(ssl, internal_bio, internal_bio); 14758f35182SJung-uk Kim SSL_operations(); /* e.g. SSL_read and SSL_write */ 148e71b7053SJung-uk Kim ... 149e71b7053SJung-uk Kim 150e71b7053SJung-uk Kim application | TLS-engine 151e71b7053SJung-uk Kim | | 152e71b7053SJung-uk Kim +----------> SSL_operations() 153e71b7053SJung-uk Kim | /\ || 154e71b7053SJung-uk Kim | || \/ 155e71b7053SJung-uk Kim | BIO-pair (internal_bio) 156e71b7053SJung-uk Kim | BIO-pair (network_bio) 157e71b7053SJung-uk Kim | || /\ 158e71b7053SJung-uk Kim | \/ || 159e71b7053SJung-uk Kim +-----------< BIO_operations() 160e71b7053SJung-uk Kim | | 161e71b7053SJung-uk Kim | | 162e71b7053SJung-uk Kim socket 163e71b7053SJung-uk Kim 164e71b7053SJung-uk Kim ... 165e71b7053SJung-uk Kim SSL_free(ssl); /* implicitly frees internal_bio */ 166e71b7053SJung-uk Kim BIO_free(network_bio); 167e71b7053SJung-uk Kim ... 168e71b7053SJung-uk Kim 169e71b7053SJung-uk KimAs the BIO pair will only buffer the data and never directly access the 17058f35182SJung-uk Kimconnection, it behaves nonblocking and will return as soon as the write 171e71b7053SJung-uk Kimbuffer is full or the read buffer is drained. Then the application has to 172e71b7053SJung-uk Kimflush the write buffer and/or fill the read buffer. 173e71b7053SJung-uk Kim 174e71b7053SJung-uk KimUse the BIO_ctrl_pending(), to find out whether data is buffered in the BIO 175e71b7053SJung-uk Kimand must be transferred to the network. Use BIO_ctrl_get_read_request() to 176e71b7053SJung-uk Kimfind out, how many bytes must be written into the buffer before the 177e71b7053SJung-uk KimSSL_operation() can successfully be continued. 178e71b7053SJung-uk Kim 179da327cd2SJung-uk Kim=head1 WARNINGS 180e71b7053SJung-uk Kim 181e71b7053SJung-uk KimAs the data is buffered, SSL_operation() may return with an ERROR_SSL_WANT_READ 182e71b7053SJung-uk Kimcondition, but there is still data in the write buffer. An application must 183e71b7053SJung-uk Kimnot rely on the error value of SSL_operation() but must assure that the 184e71b7053SJung-uk Kimwrite buffer is always flushed first. Otherwise a deadlock may occur as 185e71b7053SJung-uk Kimthe peer might be waiting for the data before being able to continue. 186e71b7053SJung-uk Kim 187e71b7053SJung-uk Kim=head1 SEE ALSO 188e71b7053SJung-uk Kim 189e71b7053SJung-uk KimL<SSL_set_bio(3)>, L<ssl(7)>, L<bio(7)>, 190e71b7053SJung-uk KimL<BIO_should_retry(3)>, L<BIO_read_ex(3)> 191e71b7053SJung-uk Kim 192e71b7053SJung-uk Kim=head1 COPYRIGHT 193e71b7053SJung-uk Kim 19458f35182SJung-uk KimCopyright 2000-2020 The OpenSSL Project Authors. All Rights Reserved. 195e71b7053SJung-uk Kim 196*b077aed3SPierre ProncheryLicensed under the Apache License 2.0 (the "License"). You may not use 197e71b7053SJung-uk Kimthis file except in compliance with the License. You can obtain a copy 198e71b7053SJung-uk Kimin the file LICENSE in the source distribution or at 199e71b7053SJung-uk KimL<https://www.openssl.org/source/license.html>. 200e71b7053SJung-uk Kim 201e71b7053SJung-uk Kim=cut 202