xref: /freebsd/crypto/openssl/doc/man3/SSL_get_error.pod (revision e0c4386e7e71d93b0edc0c8fa156263fc4a8b0b6)
1e71b7053SJung-uk Kim=pod
2e71b7053SJung-uk Kim
3e71b7053SJung-uk Kim=head1 NAME
4e71b7053SJung-uk Kim
5e71b7053SJung-uk KimSSL_get_error - obtain result code for TLS/SSL I/O operation
6e71b7053SJung-uk Kim
7e71b7053SJung-uk Kim=head1 SYNOPSIS
8e71b7053SJung-uk Kim
9e71b7053SJung-uk Kim #include <openssl/ssl.h>
10e71b7053SJung-uk Kim
11e71b7053SJung-uk Kim int SSL_get_error(const SSL *ssl, int ret);
12e71b7053SJung-uk Kim
13e71b7053SJung-uk Kim=head1 DESCRIPTION
14e71b7053SJung-uk Kim
15e71b7053SJung-uk KimSSL_get_error() returns a result code (suitable for the C "switch"
16e71b7053SJung-uk Kimstatement) for a preceding call to SSL_connect(), SSL_accept(), SSL_do_handshake(),
17da327cd2SJung-uk KimSSL_read_ex(), SSL_read(), SSL_peek_ex(), SSL_peek(), SSL_shutdown(),
18da327cd2SJung-uk KimSSL_write_ex() or SSL_write() on B<ssl>.  The value returned by that TLS/SSL I/O
19da327cd2SJung-uk Kimfunction must be passed to SSL_get_error() in parameter B<ret>.
20e71b7053SJung-uk Kim
21e71b7053SJung-uk KimIn addition to B<ssl> and B<ret>, SSL_get_error() inspects the
22e71b7053SJung-uk Kimcurrent thread's OpenSSL error queue.  Thus, SSL_get_error() must be
23e71b7053SJung-uk Kimused in the same thread that performed the TLS/SSL I/O operation, and no
24e71b7053SJung-uk Kimother OpenSSL function calls should appear in between.  The current
25e71b7053SJung-uk Kimthread's error queue must be empty before the TLS/SSL I/O operation is
26e71b7053SJung-uk Kimattempted, or SSL_get_error() will not work reliably.
27e71b7053SJung-uk Kim
28b077aed3SPierre Pronchery=head1 NOTES
29b077aed3SPierre Pronchery
30b077aed3SPierre ProncherySome TLS implementations do not send a close_notify alert on shutdown.
31b077aed3SPierre Pronchery
32b077aed3SPierre ProncheryOn an unexpected EOF, versions before OpenSSL 3.0 returned
33b077aed3SPierre ProncheryB<SSL_ERROR_SYSCALL>, nothing was added to the error stack, and errno was 0.
34b077aed3SPierre ProncherySince OpenSSL 3.0 the returned error is B<SSL_ERROR_SSL> with a meaningful
35*e0c4386eSCy Schuberterror on the error stack (SSL_R_UNEXPECTED_EOF_WHILE_READING). This error reason
36*e0c4386eSCy Schubertcode may be used for control flow decisions (see the man page for
37*e0c4386eSCy SchubertL<ERR_GET_REASON(3)> for further details on this).
38b077aed3SPierre Pronchery
39e71b7053SJung-uk Kim=head1 RETURN VALUES
40e71b7053SJung-uk Kim
41e71b7053SJung-uk KimThe following return values can currently occur:
42e71b7053SJung-uk Kim
43e71b7053SJung-uk Kim=over 4
44e71b7053SJung-uk Kim
45e71b7053SJung-uk Kim=item SSL_ERROR_NONE
46e71b7053SJung-uk Kim
47e71b7053SJung-uk KimThe TLS/SSL I/O operation completed.  This result code is returned
48e71b7053SJung-uk Kimif and only if B<ret E<gt> 0>.
49e71b7053SJung-uk Kim
50e71b7053SJung-uk Kim=item SSL_ERROR_ZERO_RETURN
51e71b7053SJung-uk Kim
52e71b7053SJung-uk KimThe TLS/SSL peer has closed the connection for writing by sending the
53c9cf7b5cSJung-uk Kimclose_notify alert.
54e71b7053SJung-uk KimNo more data can be read.
55e71b7053SJung-uk KimNote that B<SSL_ERROR_ZERO_RETURN> does not necessarily
56e71b7053SJung-uk Kimindicate that the underlying transport has been closed.
57e71b7053SJung-uk Kim
58b077aed3SPierre ProncheryThis error can also appear when the option B<SSL_OP_IGNORE_UNEXPECTED_EOF>
59b077aed3SPierre Proncheryis set. See L<SSL_CTX_set_options(3)> for more details.
60b077aed3SPierre Pronchery
61e71b7053SJung-uk Kim=item SSL_ERROR_WANT_READ, SSL_ERROR_WANT_WRITE
62e71b7053SJung-uk Kim
63e71b7053SJung-uk KimThe operation did not complete and can be retried later.
64e71b7053SJung-uk Kim
65e71b7053SJung-uk KimB<SSL_ERROR_WANT_READ> is returned when the last operation was a read
6658f35182SJung-uk Kimoperation from a nonblocking B<BIO>.
67e71b7053SJung-uk KimIt means that not enough data was available at this time to complete the
68e71b7053SJung-uk Kimoperation.
69e71b7053SJung-uk KimIf at a later time the underlying B<BIO> has data available for reading the same
70e71b7053SJung-uk Kimfunction can be called again.
71e71b7053SJung-uk Kim
72e71b7053SJung-uk KimSSL_read() and SSL_read_ex() can also set B<SSL_ERROR_WANT_READ> when there is
73e71b7053SJung-uk Kimstill unprocessed data available at either the B<SSL> or the B<BIO> layer, even
74e71b7053SJung-uk Kimfor a blocking B<BIO>.
75e71b7053SJung-uk KimSee L<SSL_read(3)> for more information.
76e71b7053SJung-uk Kim
77e71b7053SJung-uk KimB<SSL_ERROR_WANT_WRITE> is returned when the last operation was a write
7858f35182SJung-uk Kimto a nonblocking B<BIO> and it was unable to sent all data to the B<BIO>.
7958f35182SJung-uk KimWhen the B<BIO> is writable again, the same function can be called again.
80e71b7053SJung-uk Kim
81e71b7053SJung-uk KimNote that the retry may again lead to an B<SSL_ERROR_WANT_READ> or
82e71b7053SJung-uk KimB<SSL_ERROR_WANT_WRITE> condition.
83e71b7053SJung-uk KimThere is no fixed upper limit for the number of iterations that
84e71b7053SJung-uk Kimmay be necessary until progress becomes visible at application
85e71b7053SJung-uk Kimprotocol level.
86e71b7053SJung-uk Kim
87e71b7053SJung-uk KimIt is safe to call SSL_read() or SSL_read_ex() when more data is available
88e71b7053SJung-uk Kimeven when the call that set this error was an SSL_write() or SSL_write_ex().
8958f35182SJung-uk KimHowever, if the call was an SSL_write() or SSL_write_ex(), it should be called
90b077aed3SPierre Proncheryagain to continue sending the application data. If you get B<SSL_ERROR_WANT_WRITE>
91b077aed3SPierre Proncheryfrom SSL_write() or SSL_write_ex() then you should not do any other operation
92b077aed3SPierre Proncherythat could trigger B<IO> other than to repeat the previous SSL_write() call.
93e71b7053SJung-uk Kim
94e71b7053SJung-uk KimFor socket B<BIO>s (e.g. when SSL_set_fd() was used), select() or
95e71b7053SJung-uk Kimpoll() on the underlying socket can be used to find out when the
96e71b7053SJung-uk KimTLS/SSL I/O function should be retried.
97e71b7053SJung-uk Kim
98e71b7053SJung-uk KimCaveat: Any TLS/SSL I/O function can lead to either of
99e71b7053SJung-uk KimB<SSL_ERROR_WANT_READ> and B<SSL_ERROR_WANT_WRITE>.
100e71b7053SJung-uk KimIn particular,
101e71b7053SJung-uk KimSSL_read_ex(), SSL_read(), SSL_peek_ex(), or SSL_peek() may want to write data
102e71b7053SJung-uk Kimand SSL_write() or SSL_write_ex() may want to read data.
103e71b7053SJung-uk KimThis is mainly because
104e71b7053SJung-uk KimTLS/SSL handshakes may occur at any time during the protocol (initiated by
105e71b7053SJung-uk Kimeither the client or the server); SSL_read_ex(), SSL_read(), SSL_peek_ex(),
106e71b7053SJung-uk KimSSL_peek(), SSL_write_ex(), and SSL_write() will handle any pending handshakes.
107e71b7053SJung-uk Kim
108e71b7053SJung-uk Kim=item SSL_ERROR_WANT_CONNECT, SSL_ERROR_WANT_ACCEPT
109e71b7053SJung-uk Kim
110e71b7053SJung-uk KimThe operation did not complete; the same TLS/SSL I/O function should be
111e71b7053SJung-uk Kimcalled again later. The underlying BIO was not connected yet to the peer
112e71b7053SJung-uk Kimand the call would block in connect()/accept(). The SSL function should be
113e71b7053SJung-uk Kimcalled again when the connection is established. These messages can only
114e71b7053SJung-uk Kimappear with a BIO_s_connect() or BIO_s_accept() BIO, respectively.
115e71b7053SJung-uk KimIn order to find out, when the connection has been successfully established,
116e71b7053SJung-uk Kimon many platforms select() or poll() for writing on the socket file descriptor
117e71b7053SJung-uk Kimcan be used.
118e71b7053SJung-uk Kim
119e71b7053SJung-uk Kim=item SSL_ERROR_WANT_X509_LOOKUP
120e71b7053SJung-uk Kim
121e71b7053SJung-uk KimThe operation did not complete because an application callback set by
122e71b7053SJung-uk KimSSL_CTX_set_client_cert_cb() has asked to be called again.
123e71b7053SJung-uk KimThe TLS/SSL I/O function should be called again later.
124e71b7053SJung-uk KimDetails depend on the application.
125e71b7053SJung-uk Kim
126e71b7053SJung-uk Kim=item SSL_ERROR_WANT_ASYNC
127e71b7053SJung-uk Kim
128e71b7053SJung-uk KimThe operation did not complete because an asynchronous engine is still
129e71b7053SJung-uk Kimprocessing data. This will only occur if the mode has been set to SSL_MODE_ASYNC
130e71b7053SJung-uk Kimusing L<SSL_CTX_set_mode(3)> or L<SSL_set_mode(3)> and an asynchronous capable
131e71b7053SJung-uk Kimengine is being used. An application can determine whether the engine has
132e71b7053SJung-uk Kimcompleted its processing using select() or poll() on the asynchronous wait file
133e71b7053SJung-uk Kimdescriptor. This file descriptor is available by calling
134e71b7053SJung-uk KimL<SSL_get_all_async_fds(3)> or L<SSL_get_changed_async_fds(3)>. The TLS/SSL I/O
135e71b7053SJung-uk Kimfunction should be called again later. The function B<must> be called from the
136e71b7053SJung-uk Kimsame thread that the original call was made from.
137e71b7053SJung-uk Kim
138e71b7053SJung-uk Kim=item SSL_ERROR_WANT_ASYNC_JOB
139e71b7053SJung-uk Kim
140e71b7053SJung-uk KimThe asynchronous job could not be started because there were no async jobs
141e71b7053SJung-uk Kimavailable in the pool (see ASYNC_init_thread(3)). This will only occur if the
142e71b7053SJung-uk Kimmode has been set to SSL_MODE_ASYNC using L<SSL_CTX_set_mode(3)> or
143e71b7053SJung-uk KimL<SSL_set_mode(3)> and a maximum limit has been set on the async job pool
144e71b7053SJung-uk Kimthrough a call to L<ASYNC_init_thread(3)>. The application should retry the
145e71b7053SJung-uk Kimoperation after a currently executing asynchronous operation for the current
146e71b7053SJung-uk Kimthread has completed.
147e71b7053SJung-uk Kim
148e71b7053SJung-uk Kim=item SSL_ERROR_WANT_CLIENT_HELLO_CB
149e71b7053SJung-uk Kim
150e71b7053SJung-uk KimThe operation did not complete because an application callback set by
151e71b7053SJung-uk KimSSL_CTX_set_client_hello_cb() has asked to be called again.
152e71b7053SJung-uk KimThe TLS/SSL I/O function should be called again later.
153e71b7053SJung-uk KimDetails depend on the application.
154e71b7053SJung-uk Kim
155e71b7053SJung-uk Kim=item SSL_ERROR_SYSCALL
156e71b7053SJung-uk Kim
1576935a639SJung-uk KimSome non-recoverable, fatal I/O error occurred. The OpenSSL error queue may
1586935a639SJung-uk Kimcontain more information on the error. For socket I/O on Unix systems, consult
1596935a639SJung-uk KimB<errno> for details. If this error occurs then no further I/O operations should
1606935a639SJung-uk Kimbe performed on the connection and SSL_shutdown() must not be called.
161e71b7053SJung-uk Kim
162e71b7053SJung-uk KimThis value can also be returned for other errors, check the error queue for
163e71b7053SJung-uk Kimdetails.
164e71b7053SJung-uk Kim
165e71b7053SJung-uk Kim=item SSL_ERROR_SSL
166e71b7053SJung-uk Kim
1676935a639SJung-uk KimA non-recoverable, fatal error in the SSL library occurred, usually a protocol
1686935a639SJung-uk Kimerror.  The OpenSSL error queue contains more information on the error. If this
1696935a639SJung-uk Kimerror occurs then no further I/O operations should be performed on the
1706935a639SJung-uk Kimconnection and SSL_shutdown() must not be called.
171e71b7053SJung-uk Kim
172e71b7053SJung-uk Kim=back
173e71b7053SJung-uk Kim
174e71b7053SJung-uk Kim=head1 SEE ALSO
175e71b7053SJung-uk Kim
176e71b7053SJung-uk KimL<ssl(7)>
177e71b7053SJung-uk Kim
178e71b7053SJung-uk Kim=head1 HISTORY
179e71b7053SJung-uk Kim
1806935a639SJung-uk KimThe SSL_ERROR_WANT_ASYNC error code was added in OpenSSL 1.1.0.
1816935a639SJung-uk KimThe SSL_ERROR_WANT_CLIENT_HELLO_CB error code was added in OpenSSL 1.1.1.
182e71b7053SJung-uk Kim
183e71b7053SJung-uk Kim=head1 COPYRIGHT
184e71b7053SJung-uk Kim
185*e0c4386eSCy SchubertCopyright 2000-2024 The OpenSSL Project Authors. All Rights Reserved.
186e71b7053SJung-uk Kim
187b077aed3SPierre ProncheryLicensed under the Apache License 2.0 (the "License").  You may not use
188e71b7053SJung-uk Kimthis file except in compliance with the License.  You can obtain a copy
189e71b7053SJung-uk Kimin the file LICENSE in the source distribution or at
190e71b7053SJung-uk KimL<https://www.openssl.org/source/license.html>.
191e71b7053SJung-uk Kim
192e71b7053SJung-uk Kim=cut
193