| // Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. | |
| // Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved. | |
| // Copyright 2005 Nokia. All rights reserved. | |
| // | |
| // Licensed under the Apache License, Version 2.0 (the "License"); | |
| // you may not use this file except in compliance with the License. | |
| // You may obtain a copy of the License at | |
| // | |
| // https://www.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // Unless required by applicable law or agreed to in writing, software | |
| // distributed under the License is distributed on an "AS IS" BASIS, | |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| // See the License for the specific language governing permissions and | |
| // limitations under the License. | |
| #ifndef OPENSSL_HEADER_SSL_H | |
| #define OPENSSL_HEADER_SSL_H | |
| #include <openssl/base.h> // IWYU pragma: export | |
| #include <openssl/bio.h> | |
| #include <openssl/buf.h> | |
| #include <openssl/pem.h> | |
| #include <openssl/span.h> | |
| #include <openssl/ssl3.h> // IWYU pragma: export | |
| #include <openssl/tls1.h> // IWYU pragma: export | |
| #include <openssl/x509.h> | |
| #if !defined(OPENSSL_WINDOWS) | |
| #include <sys/time.h> | |
| #endif | |
| // Forward-declare struct timeval. On Windows, it is defined in winsock2.h and | |
| // Windows headers define too many macros to be included in public headers. | |
| // However, only a forward declaration is needed. | |
| struct timeval; | |
| #if defined(__cplusplus) | |
| extern "C" { | |
| #endif | |
| // SSL implementation. | |
| // SSL contexts. | |
| // | |
| // `SSL_CTX` objects manage shared state and configuration between multiple TLS | |
| // or DTLS connections. Whether the connections are TLS or DTLS is selected by | |
| // an `SSL_METHOD` on creation. | |
| // | |
| // `SSL_CTX` are reference-counted and may be shared by connections across | |
| // multiple threads. Once shared, functions which change the `SSL_CTX`'s | |
| // configuration may not be used. | |
| // TLS_method is the `SSL_METHOD` used for TLS connections. | |
| OPENSSL_EXPORT const SSL_METHOD *TLS_method(void); | |
| // DTLS_method is the `SSL_METHOD` used for DTLS connections. | |
| OPENSSL_EXPORT const SSL_METHOD *DTLS_method(void); | |
| // TLS_with_buffers_method is like `TLS_method`, but avoids all use of | |
| // crypto/x509. All client connections created with `TLS_with_buffers_method` | |
| // will fail unless a certificate verifier is installed with | |
| // `SSL_set_custom_verify` or `SSL_CTX_set_custom_verify`. | |
| OPENSSL_EXPORT const SSL_METHOD *TLS_with_buffers_method(void); | |
| // DTLS_with_buffers_method is like `DTLS_method`, but avoids all use of | |
| // crypto/x509. | |
| OPENSSL_EXPORT const SSL_METHOD *DTLS_with_buffers_method(void); | |
| // SSL_CTX_new returns a newly-allocated `SSL_CTX` with default settings or NULL | |
| // on error. | |
| OPENSSL_EXPORT SSL_CTX *SSL_CTX_new(const SSL_METHOD *method); | |
| // SSL_CTX_up_ref increments the reference count of `ctx`. It returns one. | |
| OPENSSL_EXPORT int SSL_CTX_up_ref(SSL_CTX *ctx); | |
| // SSL_CTX_dup_ref increments the reference count of `ctx` and returns the same | |
| // handle. | |
| OPENSSL_EXPORT SSL_CTX *SSL_CTX_dup_ref(const SSL_CTX *ctx); | |
| // SSL_CTX_free releases memory associated with `ctx`. | |
| OPENSSL_EXPORT void SSL_CTX_free(SSL_CTX *ctx); | |
| // SSL connections. | |
| // | |
| // An `SSL` object represents a single TLS or DTLS connection. Although the | |
| // shared `SSL_CTX` is thread-safe, an `SSL` is not thread-safe and may only be | |
| // used on one thread at a time. | |
| // SSL_new returns a newly-allocated `SSL` using `ctx` or NULL on error. The new | |
| // connection inherits settings from `ctx` at the time of creation. Settings may | |
| // also be individually configured on the connection. | |
| // | |
| // On creation, an `SSL` is not configured to be either a client or server. Call | |
| // `SSL_set_connect_state` or `SSL_set_accept_state` to set this. | |
| OPENSSL_EXPORT SSL *SSL_new(SSL_CTX *ctx); | |
| // SSL_free releases memory associated with `ssl`. | |
| OPENSSL_EXPORT void SSL_free(SSL *ssl); | |
| // SSL_get_SSL_CTX returns the `SSL_CTX` associated with `ssl`. If | |
| // `SSL_set_SSL_CTX` is called, it returns the new `SSL_CTX`, not the initial | |
| // one. | |
| OPENSSL_EXPORT SSL_CTX *SSL_get_SSL_CTX(const SSL *ssl); | |
| // SSL_set_connect_state configures `ssl` to be a client. | |
| OPENSSL_EXPORT void SSL_set_connect_state(SSL *ssl); | |
| // SSL_set_accept_state configures `ssl` to be a server. | |
| OPENSSL_EXPORT void SSL_set_accept_state(SSL *ssl); | |
| // SSL_is_server returns one if `ssl` is configured as a server and zero | |
| // otherwise. | |
| OPENSSL_EXPORT int SSL_is_server(const SSL *ssl); | |
| // SSL_is_dtls returns one if `ssl` is a DTLS connection and zero otherwise. | |
| OPENSSL_EXPORT int SSL_is_dtls(const SSL *ssl); | |
| // SSL_is_quic returns one if `ssl` is a QUIC connection and zero otherwise. | |
| OPENSSL_EXPORT int SSL_is_quic(const SSL *ssl); | |
| // SSL_set_bio configures `ssl` to read from `rbio` and write to `wbio`. `ssl` | |
| // takes ownership of the two `BIO`s. If `rbio` and `wbio` are the same, `ssl` | |
| // only takes ownership of one reference. See `SSL_set0_rbio` and | |
| // `SSL_set0_wbio` for requirements on `rbio` and `wbio`, respectively. | |
| // | |
| // If `rbio` is the same as the currently configured `BIO` for reading, that | |
| // side is left untouched and is not freed. | |
| // | |
| // If `wbio` is the same as the currently configured `BIO` for writing AND `ssl` | |
| // is not currently configured to read from and write to the same `BIO`, that | |
| // side is left untouched and is not freed. This asymmetry is present for | |
| // historical reasons. | |
| // | |
| // Due to the very complex historical behavior of this function, calling this | |
| // function if `ssl` already has `BIO`s configured is deprecated. Prefer | |
| // `SSL_set0_rbio` and `SSL_set0_wbio` instead. | |
| OPENSSL_EXPORT void SSL_set_bio(SSL *ssl, BIO *rbio, BIO *wbio); | |
| // SSL_set0_rbio configures `ssl` to read from `rbio`. It takes ownership of | |
| // `rbio`. `rbio` may be a custom `BIO`, in which case it must implement | |
| // `BIO_read` with `BIO_meth_set_read`. In DTLS, `rbio` must be non-blocking to | |
| // properly handle timeouts and retransmits. | |
| // | |
| // Note that, although this function and `SSL_set0_wbio` may be called on the | |
| // same `BIO`, each call takes a reference. Use `BIO_up_ref` to balance this. | |
| OPENSSL_EXPORT void SSL_set0_rbio(SSL *ssl, BIO *rbio); | |
| // SSL_set0_wbio configures `ssl` to write to `wbio`. It takes ownership of | |
| // `wbio`. `wbio` may be a custom `BIO`, in which case it must implement | |
| // `BIO_write` with `BIO_meth_set_write`. It must additionally implement | |
| // `BIO_flush` with `BIO_meth_set_ctrl` and `BIO_CTRL_FLUSH`. If flushing is | |
| // unnecessary with `wbio`, `BIO_flush` should return one and do nothing. | |
| // | |
| // Note that, although this function and `SSL_set0_rbio` may be called on the | |
| // same `BIO`, each call takes a reference. Use `BIO_up_ref` to balance this. | |
| OPENSSL_EXPORT void SSL_set0_wbio(SSL *ssl, BIO *wbio); | |
| // SSL_get_rbio returns the `BIO` that `ssl` reads from. | |
| OPENSSL_EXPORT BIO *SSL_get_rbio(const SSL *ssl); | |
| // SSL_get_wbio returns the `BIO` that `ssl` writes to. | |
| OPENSSL_EXPORT BIO *SSL_get_wbio(const SSL *ssl); | |
| // SSL_get_fd calls `SSL_get_rfd`. | |
| OPENSSL_EXPORT int SSL_get_fd(const SSL *ssl); | |
| // SSL_get_rfd returns the file descriptor that `ssl` is configured to read | |
| // from. If `ssl`'s read `BIO` is not configured or doesn't wrap a file | |
| // descriptor then it returns -1. | |
| // | |
| // Note: On Windows, this may return either a file descriptor or a socket (cast | |
| // to int), depending on whether `ssl` was configured with a file descriptor or | |
| // socket `BIO`. | |
| OPENSSL_EXPORT int SSL_get_rfd(const SSL *ssl); | |
| // SSL_get_wfd returns the file descriptor that `ssl` is configured to write | |
| // to. If `ssl`'s write `BIO` is not configured or doesn't wrap a file | |
| // descriptor then it returns -1. | |
| // | |
| // Note: On Windows, this may return either a file descriptor or a socket (cast | |
| // to int), depending on whether `ssl` was configured with a file descriptor or | |
| // socket `BIO`. | |
| OPENSSL_EXPORT int SSL_get_wfd(const SSL *ssl); | |
| #if !defined(OPENSSL_NO_SOCK) | |
| // SSL_set_fd configures `ssl` to read from and write to `fd`. It returns one | |
| // on success and zero on allocation error. The caller retains ownership of | |
| // `fd`. | |
| // | |
| // On Windows, `fd` is cast to a `SOCKET` and used with Winsock APIs. | |
| OPENSSL_EXPORT int SSL_set_fd(SSL *ssl, int fd); | |
| // SSL_set_rfd configures `ssl` to read from `fd`. It returns one on success and | |
| // zero on allocation error. The caller retains ownership of `fd`. | |
| // | |
| // On Windows, `fd` is cast to a `SOCKET` and used with Winsock APIs. | |
| OPENSSL_EXPORT int SSL_set_rfd(SSL *ssl, int fd); | |
| // SSL_set_wfd configures `ssl` to write to `fd`. It returns one on success and | |
| // zero on allocation error. The caller retains ownership of `fd`. | |
| // | |
| // On Windows, `fd` is cast to a `SOCKET` and used with Winsock APIs. | |
| OPENSSL_EXPORT int SSL_set_wfd(SSL *ssl, int fd); | |
| #endif // !OPENSSL_NO_SOCK | |
| // SSL_do_handshake continues the current handshake. If there is none or the | |
| // handshake has completed, it returns one. Otherwise, it returns zero if the | |
| // handshake was interrupted by EOF and -1 on error. If the return value was not | |
| // one, the caller should pass the value into `SSL_get_error` to determine how | |
| // to proceed. | |
| // | |
| // Both a TLS-level EOF (the close_notify alert) and a transport-level EOF | |
| // result in a zero return. `SSL_get_error` can be used to distinguish the two. | |
| // | |
| // TODO(crbug.com/42290000): Replace the two EOF cases with -1 and some error in | |
| // the error queue. Unlike in `SSL_read`, these are both error conditions | |
| // because we were expecting a handshake. | |
| // | |
| // When some features are enabled (TLS 1.2 False Start and TLS 1.3 Early Data), | |
| // application data may be sent or received before the handshake is fully | |
| // complete. In those modes, `SSL_do_handshake` will return one early to signal | |
| // that `ssl` is usable. These features are opt-in. See the corresponding | |
| // features for details on how they impact API behavior. | |
| // | |
| // In DTLS, the caller must drive retransmissions and timeouts. After calling | |
| // this function, the caller must use `DTLSv1_get_timeout` to determine the | |
| // current timeout, if any. If it expires before the application next calls into | |
| // `ssl`, call `DTLSv1_handle_timeout`. Note that DTLS handshake retransmissions | |
| // use fresh sequence numbers, so it is not sufficient to replay packets at the | |
| // transport. | |
| // | |
| // After the DTLS handshake, some retransmissions may remain. If `ssl` wrote | |
| // last in the handshake, it may need to retransmit the final flight in case of | |
| // packet loss. Additionally, in DTLS 1.3, it may need to retransmit | |
| // post-handshake messages. To handle these, the caller must always be prepared | |
| // to receive packets and process them with `SSL_read`, even when the | |
| // application protocol would otherwise not read from the connection. | |
| OPENSSL_EXPORT int SSL_do_handshake(SSL *ssl); | |
| // SSL_connect configures `ssl` as a client, if unconfigured, and calls | |
| // `SSL_do_handshake`. | |
| OPENSSL_EXPORT int SSL_connect(SSL *ssl); | |
| // SSL_accept configures `ssl` as a server, if unconfigured, and calls | |
| // `SSL_do_handshake`. | |
| OPENSSL_EXPORT int SSL_accept(SSL *ssl); | |
| // SSL_read reads up to `num` bytes from `ssl` into `buf`. It implicitly runs | |
| // any pending handshakes, including renegotiations when enabled. On success, it | |
| // returns the number of bytes read. Otherwise, it returns zero on EOF and -1 on | |
| // error. In the latter two cases, the caller should pass the value into | |
| // `SSL_get_error` to determine how to proceed. | |
| // | |
| // Both a TLS-level EOF (the close_notify alert) and a transport-level EOF | |
| // result in a zero return. `SSL_get_error` can be used to distinguish the two. | |
| // Transport-level EOFs are unauthenticated and may be injected by a network | |
| // attacker. However, some ecosystems, such as HTTPS, do not reliably send | |
| // close_notify in practice. | |
| // | |
| // WARNING: If `num` is zero, the success and EOF cases are ambiguous. Callers | |
| // attempting to seek to the next record, without consuming data, should instead | |
| // call `SSL_peek` with a one-byte buffer. | |
| // | |
| // In DTLS 1.3, the caller must also drive timeouts from retransmitting the | |
| // final flight of the handshake, as well as post-handshake messages. After | |
| // calling this function, the caller must use `DTLSv1_get_timeout` to determine | |
| // the current timeout, if any. If it expires before the application next calls | |
| // into `ssl`, call `DTLSv1_handle_timeout`. | |
| OPENSSL_EXPORT int SSL_read(SSL *ssl, void *buf, int num); | |
| // SSL_peek behaves like `SSL_read` but does not consume any bytes returned. A | |
| // subsequent call to `SSL_read` or `SSL_peek` will return the same data. | |
| OPENSSL_EXPORT int SSL_peek(SSL *ssl, void *buf, int num); | |
| // SSL_pending returns the number of buffered, decrypted bytes available for | |
| // read in `ssl`. It does not read from the transport. | |
| // | |
| // In DTLS, it is possible for this function to return zero while there is | |
| // buffered, undecrypted data from the transport in `ssl`. For example, | |
| // `SSL_read` may read a datagram with two records, decrypt the first, and leave | |
| // the second buffered for a subsequent call to `SSL_read`. Callers that wish to | |
| // detect this case can use `SSL_has_pending`. | |
| OPENSSL_EXPORT int SSL_pending(const SSL *ssl); | |
| // SSL_has_pending returns one if `ssl` has buffered, decrypted bytes available | |
| // for read, or if `ssl` has buffered data from the transport that has not yet | |
| // been decrypted. If `ssl` has neither, this function returns zero. | |
| // | |
| // In TLS, BoringSSL does not implement read-ahead, so this function returns one | |
| // if and only if `SSL_pending` would return a non-zero value. In DTLS, it is | |
| // possible for this function to return one while `SSL_pending` returns zero. | |
| // For example, `SSL_read` may read a datagram with two records, decrypt the | |
| // first, and leave the second buffered for a subsequent call to `SSL_read`. | |
| // | |
| // As a result, if this function returns one, the next call to `SSL_read` may | |
| // still fail, read from the transport, or both. The buffered, undecrypted data | |
| // may be invalid or incomplete. | |
| OPENSSL_EXPORT int SSL_has_pending(const SSL *ssl); | |
| // SSL_write writes up to `num` bytes from `buf` into `ssl`. It implicitly runs | |
| // any pending handshakes, including renegotiations when enabled. On success, it | |
| // returns the number of bytes written. Otherwise, it returns -1. In the latter | |
| // case, the caller should pass the value into `SSL_get_error` to determine how | |
| // to proceed. | |
| // | |
| // A zero return is only possible if `num` is zero. If `num` is zero, this | |
| // function will flush any pending control messages, such as NewSessionTicket or | |
| // KeyUpdate, otherwise do nothing, and return zero on success. If `num` is | |
| // greater than zero, it will either successfully write a greater than zero | |
| // number of bytes, or -1 to indicate failure. | |
| // | |
| // In TLS, a non-blocking `SSL_write` differs from non-blocking `write` in that | |
| // a failed `SSL_write` still commits to the data passed in. When retrying, the | |
| // caller must supply the original write buffer (or a larger one containing the | |
| // original as a prefix). By default, retries will fail if they also do not | |
| // reuse the same `buf` pointer. This may be relaxed with | |
| // `SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER`, but the buffer contents still must be | |
| // unchanged. | |
| // | |
| // By default, in TLS, `SSL_write` will not return success until all `num` bytes | |
| // are written. This may be relaxed with `SSL_MODE_ENABLE_PARTIAL_WRITE`. It | |
| // allows `SSL_write` to complete with a partial result when only part of the | |
| // input was written in a single record. | |
| // | |
| // In DTLS, neither `SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER` and | |
| // `SSL_MODE_ENABLE_PARTIAL_WRITE` do anything. The caller may retry with a | |
| // different buffer freely. A single call to `SSL_write` only ever writes a | |
| // single record in a single packet, so `num` must be at most | |
| // `SSL3_RT_MAX_PLAIN_LENGTH`. | |
| OPENSSL_EXPORT int SSL_write(SSL *ssl, const void *buf, int num); | |
| // SSL_KEY_UPDATE_REQUESTED indicates that the peer should reply to a KeyUpdate | |
| // message with its own, thus updating traffic secrets for both directions on | |
| // the connection. | |
| #define SSL_KEY_UPDATE_REQUESTED 1 | |
| // SSL_KEY_UPDATE_NOT_REQUESTED indicates that the peer should not reply with | |
| // it's own KeyUpdate message. | |
| #define SSL_KEY_UPDATE_NOT_REQUESTED 0 | |
| // SSL_key_update queues a TLS 1.3 KeyUpdate message to be sent on `ssl` | |
| // if one is not already queued. The `request_type` argument must one of the | |
| // `SSL_KEY_UPDATE_*` values. This function requires that `ssl` have completed a | |
| // TLS >= 1.3 handshake. It returns one on success or zero on error. | |
| // | |
| // Note that this function does not _send_ the message itself. The next call to | |
| // `SSL_write` will cause the message to be sent. `SSL_write` may be called with | |
| // a zero length to flush a KeyUpdate message when no application data is | |
| // pending. | |
| OPENSSL_EXPORT int SSL_key_update(SSL *ssl, int request_type); | |
| // SSL_shutdown shuts down `ssl`. It runs in two stages. First, it sends | |
| // close_notify and returns zero or one on success or -1 on failure. Zero | |
| // indicates that close_notify was sent, but not received, and one additionally | |
| // indicates that the peer's close_notify had already been received. | |
| // | |
| // To then wait for the peer's close_notify, run `SSL_shutdown` to completion a | |
| // second time. This returns 1 on success and -1 on failure. Application data | |
| // is considered a fatal error at this point. To process or discard it, read | |
| // until close_notify with `SSL_read` instead. | |
| // | |
| // In both cases, on failure, pass the return value into `SSL_get_error` to | |
| // determine how to proceed. | |
| // | |
| // Most callers should stop at the first stage. Reading for close_notify is | |
| // primarily used for uncommon protocols where the underlying transport is | |
| // reused after TLS completes. Additionally, DTLS uses an unordered transport | |
| // and is unordered, so the second stage is a no-op in DTLS. | |
| OPENSSL_EXPORT int SSL_shutdown(SSL *ssl); | |
| // SSL_CTX_set_quiet_shutdown sets quiet shutdown on `ctx` to `mode`. If | |
| // enabled, `SSL_shutdown` will not send a close_notify alert or wait for one | |
| // from the peer. It will instead synchronously return one. | |
| OPENSSL_EXPORT void SSL_CTX_set_quiet_shutdown(SSL_CTX *ctx, int mode); | |
| // SSL_CTX_get_quiet_shutdown returns whether quiet shutdown is enabled for | |
| // `ctx`. | |
| OPENSSL_EXPORT int SSL_CTX_get_quiet_shutdown(const SSL_CTX *ctx); | |
| // SSL_set_quiet_shutdown sets quiet shutdown on `ssl` to `mode`. If enabled, | |
| // `SSL_shutdown` will not send a close_notify alert or wait for one from the | |
| // peer. It will instead synchronously return one. | |
| OPENSSL_EXPORT void SSL_set_quiet_shutdown(SSL *ssl, int mode); | |
| // SSL_get_quiet_shutdown returns whether quiet shutdown is enabled for | |
| // `ssl`. | |
| OPENSSL_EXPORT int SSL_get_quiet_shutdown(const SSL *ssl); | |
| // SSL_get_error returns a `SSL_ERROR_*` value for the most recent operation on | |
| // `ssl`. It should be called after an operation failed to determine whether the | |
| // error was fatal and, if not, when to retry. | |
| OPENSSL_EXPORT int SSL_get_error(const SSL *ssl, int ret_code); | |
| // SSL_ERROR_NONE indicates the operation succeeded. | |
| #define SSL_ERROR_NONE 0 | |
| // SSL_ERROR_SSL indicates the operation failed within the library. The caller | |
| // may inspect the error queue (see `ERR_get_error`) for more information. | |
| #define SSL_ERROR_SSL 1 | |
| // SSL_ERROR_WANT_READ indicates the operation failed attempting to read from | |
| // the transport. The caller may retry the operation when the transport is ready | |
| // for reading. | |
| #define SSL_ERROR_WANT_READ 2 | |
| // SSL_ERROR_WANT_WRITE indicates the operation failed attempting to write to | |
| // the transport. The caller may retry the operation when the transport is ready | |
| // for writing. | |
| #define SSL_ERROR_WANT_WRITE 3 | |
| // SSL_ERROR_WANT_X509_LOOKUP indicates the operation failed in calling the | |
| // `cert_cb` or `client_cert_cb`. The caller may retry the operation when the | |
| // callback is ready to return a certificate or one has been configured | |
| // externally. | |
| // | |
| // See also `SSL_CTX_set_cert_cb` and `SSL_CTX_set_client_cert_cb`. | |
| #define SSL_ERROR_WANT_X509_LOOKUP 4 | |
| // SSL_ERROR_SYSCALL indicates the operation failed externally to the library. | |
| // The caller should consult the system-specific error mechanism. This is | |
| // typically `errno` but may be something custom if using a custom `BIO`. It | |
| // may also be signaled if the transport returned EOF, in which case the | |
| // operation's return value will be zero. | |
| #define SSL_ERROR_SYSCALL 5 | |
| // SSL_ERROR_ZERO_RETURN indicates the operation failed because the connection | |
| // was cleanly shut down with a close_notify alert. | |
| #define SSL_ERROR_ZERO_RETURN 6 | |
| // SSL_ERROR_WANT_CONNECT indicates the operation failed attempting to connect | |
| // the transport (the `BIO` signaled `BIO_RR_CONNECT`). The caller may retry the | |
| // operation when the transport is ready. | |
| #define SSL_ERROR_WANT_CONNECT 7 | |
| // SSL_ERROR_WANT_ACCEPT indicates the operation failed attempting to accept a | |
| // connection from the transport (the `BIO` signaled `BIO_RR_ACCEPT`). The | |
| // caller may retry the operation when the transport is ready. | |
| // | |
| // TODO(davidben): Remove this. It's used by accept BIOs which are bizarre. | |
| #define SSL_ERROR_WANT_ACCEPT 8 | |
| // SSL_ERROR_WANT_CHANNEL_ID_LOOKUP is never used. | |
| // | |
| // TODO(davidben): Remove this. Some callers reference it when stringifying | |
| // errors. They should use `SSL_error_description` instead. | |
| #define SSL_ERROR_WANT_CHANNEL_ID_LOOKUP 9 | |
| // SSL_ERROR_PENDING_SESSION indicates the operation failed because the session | |
| // lookup callback indicated the session was unavailable. The caller may retry | |
| // the operation when lookup has completed. | |
| // | |
| // See also `SSL_CTX_sess_set_get_cb` and `SSL_magic_pending_session_ptr`. | |
| #define SSL_ERROR_PENDING_SESSION 11 | |
| // SSL_ERROR_PENDING_CERTIFICATE indicates the operation failed because the | |
| // early callback indicated certificate lookup was incomplete. The caller may | |
| // retry the operation when lookup has completed. | |
| // | |
| // See also `SSL_CTX_set_select_certificate_cb`. | |
| #define SSL_ERROR_PENDING_CERTIFICATE 12 | |
| // SSL_ERROR_WANT_PRIVATE_KEY_OPERATION indicates the operation failed because | |
| // a private key operation was unfinished. The caller may retry the operation | |
| // when the private key operation is complete. | |
| // | |
| // See also `SSL_set_private_key_method`, `SSL_CTX_set_private_key_method`, and | |
| // `SSL_CREDENTIAL_set_private_key_method`. | |
| #define SSL_ERROR_WANT_PRIVATE_KEY_OPERATION 13 | |
| // SSL_ERROR_PENDING_TICKET indicates that a ticket decryption is pending. The | |
| // caller may retry the operation when the decryption is ready. | |
| // | |
| // See also `SSL_CTX_set_ticket_aead_method`. | |
| #define SSL_ERROR_PENDING_TICKET 14 | |
| // SSL_ERROR_EARLY_DATA_REJECTED indicates that early data was rejected. The | |
| // caller should treat this as a connection failure and retry any operations | |
| // associated with the rejected early data. `SSL_reset_early_data_reject` may be | |
| // used to reuse the underlying connection for the retry. | |
| #define SSL_ERROR_EARLY_DATA_REJECTED 15 | |
| // SSL_ERROR_WANT_CERTIFICATE_VERIFY indicates the operation failed because | |
| // certificate verification was incomplete. The caller may retry the operation | |
| // when certificate verification is complete. | |
| // | |
| // See also `SSL_CTX_set_custom_verify`. | |
| #define SSL_ERROR_WANT_CERTIFICATE_VERIFY 16 | |
| // SSL_ERROR_WANT_RENEGOTIATE indicates the operation is pending a response to | |
| // a renegotiation request from the server. The caller may call | |
| // `SSL_renegotiate` to schedule a renegotiation and retry the operation. | |
| // | |
| // See also `ssl_renegotiate_explicit`. | |
| #define SSL_ERROR_WANT_RENEGOTIATE 19 | |
| // SSL_ERROR_HANDSHAKE_HINTS_READY indicates the handshake has progressed enough | |
| // for `SSL_serialize_handshake_hints` to be called. See also | |
| // `SSL_request_handshake_hints`. | |
| #define SSL_ERROR_HANDSHAKE_HINTS_READY 20 | |
| // SSL_error_description returns a string representation of `err`, where `err` | |
| // is one of the `SSL_ERROR_*` constants returned by `SSL_get_error`, or NULL | |
| // if the value is unrecognized. | |
| OPENSSL_EXPORT const char *SSL_error_description(int err); | |
| // SSL_set_mtu sets the `ssl`'s MTU in DTLS to `mtu`. It returns one on success | |
| // and zero on failure. | |
| OPENSSL_EXPORT int SSL_set_mtu(SSL *ssl, unsigned mtu); | |
| // DTLSv1_set_initial_timeout_duration sets the initial duration for a DTLS | |
| // handshake timeout. | |
| // | |
| // This duration overrides the default of 400 milliseconds, which is | |
| // recommendation of RFC 9147 for real-time protocols. | |
| // | |
| // If `ssl` is an open connection, this function may update currently running | |
| // timers and may make them expire. Callers should call | |
| // `DTLSv1_get_timeout` for an updated timeout and reschedule accordingly. | |
| OPENSSL_EXPORT void DTLSv1_set_initial_timeout_duration(SSL *ssl, | |
| uint32_t duration_ms); | |
| // DTLSv1_get_timeout queries the running DTLS timers. If there are any in | |
| // progress, it sets `*out` to the time remaining until the first timer expires | |
| // and returns one. Otherwise, it returns zero. Timers may be scheduled both | |
| // during and after the handshake. | |
| // | |
| // When the timeout expires, call `DTLSv1_handle_timeout` to handle the | |
| // retransmit behavior. | |
| // | |
| // NOTE: This function must be queried again whenever the state machine changes, | |
| // including when `DTLSv1_handle_timeout` is called. | |
| OPENSSL_EXPORT int DTLSv1_get_timeout(const SSL *ssl, struct timeval *out); | |
| // DTLSv1_handle_timeout is called when a DTLS timeout expires. If no timeout | |
| // had expired, it returns 0. Otherwise, it handles the timeout and returns 1 on | |
| // success or -1 on error. | |
| // | |
| // This function may write to the transport (e.g. to retransmit messages) or | |
| // update `ssl`'s internal state and schedule an updated timer. | |
| // | |
| // The caller's external timer should be compatible with the one `ssl` queries | |
| // within some fudge factor. Otherwise, the call will be a no-op, but | |
| // `DTLSv1_get_timeout` will return an updated timeout. | |
| // | |
| // If the function returns -1, checking if `SSL_get_error` returns | |
| // `SSL_ERROR_WANT_WRITE` may be used to determine if the retransmit failed due | |
| // to a non-fatal error at the write `BIO`. In this case, when the `BIO` is | |
| // writable, the operation may be retried by calling the original function, | |
| // `SSL_do_handshake` or `SSL_read`. | |
| // | |
| // WARNING: This function breaks the usual return value convention. | |
| // | |
| // TODO(davidben): We can make this function entirely optional by just checking | |
| // the timers in `SSL_do_handshake` or `SSL_read`. Then timers behave like any | |
| // other retry condition: rerun the operation and the library will make what | |
| // progress it can. | |
| OPENSSL_EXPORT int DTLSv1_handle_timeout(SSL *ssl); | |
| // Protocol versions. | |
| #define DTLS1_VERSION_MAJOR 0xfe | |
| #define SSL3_VERSION_MAJOR 0x03 | |
| #define SSL3_VERSION 0x0300 | |
| #define TLS1_VERSION 0x0301 | |
| #define TLS1_1_VERSION 0x0302 | |
| #define TLS1_2_VERSION 0x0303 | |
| #define TLS1_3_VERSION 0x0304 | |
| #define DTLS1_VERSION 0xfeff | |
| #define DTLS1_2_VERSION 0xfefd | |
| #define DTLS1_3_VERSION 0xfefc | |
| // SSL_CTX_set_min_proto_version sets the minimum protocol version for `ctx` to | |
| // `version`. If `version` is zero, the default minimum version is used. It | |
| // returns one on success and zero if `version` is invalid. | |
| OPENSSL_EXPORT int SSL_CTX_set_min_proto_version(SSL_CTX *ctx, | |
| uint16_t version); | |
| // SSL_CTX_set_max_proto_version sets the maximum protocol version for `ctx` to | |
| // `version`. If `version` is zero, the default maximum version is used. It | |
| // returns one on success and zero if `version` is invalid. | |
| OPENSSL_EXPORT int SSL_CTX_set_max_proto_version(SSL_CTX *ctx, | |
| uint16_t version); | |
| // SSL_CTX_get_min_proto_version returns the minimum protocol version for `ctx` | |
| OPENSSL_EXPORT uint16_t SSL_CTX_get_min_proto_version(const SSL_CTX *ctx); | |
| // SSL_CTX_get_max_proto_version returns the maximum protocol version for `ctx` | |
| OPENSSL_EXPORT uint16_t SSL_CTX_get_max_proto_version(const SSL_CTX *ctx); | |
| // SSL_set_min_proto_version sets the minimum protocol version for `ssl` to | |
| // `version`. If `version` is zero, the default minimum version is used. It | |
| // returns one on success and zero if `version` is invalid. | |
| OPENSSL_EXPORT int SSL_set_min_proto_version(SSL *ssl, uint16_t version); | |
| // SSL_set_max_proto_version sets the maximum protocol version for `ssl` to | |
| // `version`. If `version` is zero, the default maximum version is used. It | |
| // returns one on success and zero if `version` is invalid. | |
| OPENSSL_EXPORT int SSL_set_max_proto_version(SSL *ssl, uint16_t version); | |
| // SSL_get_min_proto_version returns the minimum protocol version for `ssl`. If | |
| // the connection's configuration has been shed, 0 is returned. | |
| OPENSSL_EXPORT uint16_t SSL_get_min_proto_version(const SSL *ssl); | |
| // SSL_get_max_proto_version returns the maximum protocol version for `ssl`. If | |
| // the connection's configuration has been shed, 0 is returned. | |
| OPENSSL_EXPORT uint16_t SSL_get_max_proto_version(const SSL *ssl); | |
| // SSL_version returns the TLS or DTLS protocol version used by `ssl`, which is | |
| // one of the `*_VERSION` values. (E.g. `TLS1_2_VERSION`.) Before the version | |
| // is negotiated, the result is undefined. | |
| OPENSSL_EXPORT int SSL_version(const SSL *ssl); | |
| // Options. | |
| // | |
| // Options configure protocol behavior. | |
| // SSL_OP_LEGACY_SERVER_CONNECT configures a client to permit connecting to | |
| // legacy servers that do not implement renegotiation_info (RFC 5746). If | |
| // disabled, connections to such servers will fail. This option is enabled by | |
| // default, but may be disabled with `SSL_CTX_clear_options`. | |
| #define SSL_OP_LEGACY_SERVER_CONNECT 0x00000004L | |
| // SSL_OP_NO_QUERY_MTU, in DTLS, disables querying the MTU from the underlying | |
| // `BIO`. Instead, the MTU is configured with `SSL_set_mtu`. | |
| #define SSL_OP_NO_QUERY_MTU 0x00001000L | |
| // SSL_OP_NO_TICKET disables session ticket support (RFC 5077). | |
| #define SSL_OP_NO_TICKET 0x00004000L | |
| // SSL_OP_CIPHER_SERVER_PREFERENCE configures servers to select ciphers and | |
| // ECDHE curves according to the server's preferences instead of the | |
| // client's. | |
| #define SSL_OP_CIPHER_SERVER_PREFERENCE 0x00400000L | |
| // SSL_OP_ALL is the set of options that are enabled by default. It is safe, but | |
| // not necessary, to pass this value to `SSL_CTX_set_options`. | |
| // TODO(crbug.com/41393419): Disable SSL_OP_LEGACY_SERVER_CONNECT by default. | |
| #define SSL_OP_ALL SSL_OP_LEGACY_SERVER_CONNECT | |
| // The following flags toggle individual protocol versions. This is deprecated. | |
| // Use `SSL_CTX_set_min_proto_version` and `SSL_CTX_set_max_proto_version` | |
| // instead. | |
| #define SSL_OP_NO_TLSv1 0x04000000L | |
| #define SSL_OP_NO_TLSv1_2 0x08000000L | |
| #define SSL_OP_NO_TLSv1_1 0x10000000L | |
| #define SSL_OP_NO_TLSv1_3 0x20000000L | |
| #define SSL_OP_NO_DTLSv1 SSL_OP_NO_TLSv1 | |
| #define SSL_OP_NO_DTLSv1_2 SSL_OP_NO_TLSv1_2 | |
| // SSL_CTX_set_options enables all options set in `options` (which should be one | |
| // or more of the `SSL_OP_*` values, ORed together) in `ctx`. It returns a | |
| // bitmask representing the resulting enabled options. | |
| OPENSSL_EXPORT uint32_t SSL_CTX_set_options(SSL_CTX *ctx, uint32_t options); | |
| // SSL_CTX_clear_options disables all options set in `options` (which should be | |
| // one or more of the `SSL_OP_*` values, ORed together) in `ctx`. It returns a | |
| // bitmask representing the resulting enabled options. | |
| OPENSSL_EXPORT uint32_t SSL_CTX_clear_options(SSL_CTX *ctx, uint32_t options); | |
| // SSL_CTX_get_options returns a bitmask of `SSL_OP_*` values that represent all | |
| // the options enabled for `ctx`. | |
| OPENSSL_EXPORT uint32_t SSL_CTX_get_options(const SSL_CTX *ctx); | |
| // SSL_set_options enables all options set in `options` (which should be one or | |
| // more of the `SSL_OP_*` values, ORed together) in `ssl`. It returns a bitmask | |
| // representing the resulting enabled options. | |
| OPENSSL_EXPORT uint32_t SSL_set_options(SSL *ssl, uint32_t options); | |
| // SSL_clear_options disables all options set in `options` (which should be one | |
| // or more of the `SSL_OP_*` values, ORed together) in `ssl`. It returns a | |
| // bitmask representing the resulting enabled options. | |
| OPENSSL_EXPORT uint32_t SSL_clear_options(SSL *ssl, uint32_t options); | |
| // SSL_get_options returns a bitmask of `SSL_OP_*` values that represent all the | |
| // options enabled for `ssl`. | |
| OPENSSL_EXPORT uint32_t SSL_get_options(const SSL *ssl); | |
| // Modes. | |
| // | |
| // Modes configure API behavior. | |
| // SSL_MODE_ENABLE_PARTIAL_WRITE, in TLS, allows `SSL_write` to complete with a | |
| // partial result when the only part of the input was written in a single | |
| // record. In DTLS, it does nothing. | |
| #define SSL_MODE_ENABLE_PARTIAL_WRITE 0x00000001L | |
| // SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER, in TLS, allows retrying an incomplete | |
| // `SSL_write` with a different buffer. However, `SSL_write` still assumes the | |
| // buffer contents are unchanged. This is not the default to avoid the | |
| // misconception that non-blocking `SSL_write` behaves like non-blocking | |
| // `write`. In DTLS, it does nothing. | |
| #define SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER 0x00000002L | |
| // SSL_MODE_NO_AUTO_CHAIN disables automatically building a certificate chain | |
| // before sending certificates to the peer. This flag is set (and the feature | |
| // disabled) by default. | |
| // TODO(davidben): Remove this behavior. https://crbug.com/boringssl/42. | |
| #define SSL_MODE_NO_AUTO_CHAIN 0x00000008L | |
| // SSL_MODE_ENABLE_FALSE_START allows clients to send application data before | |
| // receipt of ChangeCipherSpec and Finished. This mode enables full handshakes | |
| // to 'complete' in one RTT. See RFC 7918. | |
| // | |
| // When False Start is enabled, `SSL_do_handshake` may succeed before the | |
| // handshake has completely finished. `SSL_write` will function at this point, | |
| // and `SSL_read` will transparently wait for the final handshake leg before | |
| // returning application data. To determine if False Start occurred or when the | |
| // handshake is completely finished, see `SSL_in_false_start`, `SSL_in_init`, | |
| // and `SSL_CB_HANDSHAKE_DONE` from `SSL_CTX_set_info_callback`. | |
| #define SSL_MODE_ENABLE_FALSE_START 0x00000080L | |
| // SSL_MODE_CBC_RECORD_SPLITTING causes multi-byte CBC records in TLS 1.0 to be | |
| // split in two: the first record will contain a single byte and the second will | |
| // contain the remainder. This effectively randomises the IV and prevents BEAST | |
| // attacks. | |
| #define SSL_MODE_CBC_RECORD_SPLITTING 0x00000100L | |
| // SSL_MODE_NO_SESSION_CREATION will cause any attempts to create a session to | |
| // fail with SSL_R_SESSION_MAY_NOT_BE_CREATED. This can be used to enforce that | |
| // session resumption is used for a given SSL*. | |
| #define SSL_MODE_NO_SESSION_CREATION 0x00000200L | |
| // SSL_MODE_SEND_FALLBACK_SCSV sends TLS_FALLBACK_SCSV in the ClientHello. | |
| // To be set only by applications that reconnect with a downgraded protocol | |
| // version; see RFC 7507 for details. | |
| // | |
| // DO NOT ENABLE THIS if your application attempts a normal handshake. Only use | |
| // this in explicit fallback retries, following the guidance in RFC 7507. | |
| #define SSL_MODE_SEND_FALLBACK_SCSV 0x00000400L | |
| // SSL_CTX_set_mode enables all modes set in `mode` (which should be one or more | |
| // of the `SSL_MODE_*` values, ORed together) in `ctx`. It returns a bitmask | |
| // representing the resulting enabled modes. | |
| OPENSSL_EXPORT uint32_t SSL_CTX_set_mode(SSL_CTX *ctx, uint32_t mode); | |
| // SSL_CTX_clear_mode disables all modes set in `mode` (which should be one or | |
| // more of the `SSL_MODE_*` values, ORed together) in `ctx`. It returns a | |
| // bitmask representing the resulting enabled modes. | |
| OPENSSL_EXPORT uint32_t SSL_CTX_clear_mode(SSL_CTX *ctx, uint32_t mode); | |
| // SSL_CTX_get_mode returns a bitmask of `SSL_MODE_*` values that represent all | |
| // the modes enabled for `ssl`. | |
| OPENSSL_EXPORT uint32_t SSL_CTX_get_mode(const SSL_CTX *ctx); | |
| // SSL_set_mode enables all modes set in `mode` (which should be one or more of | |
| // the `SSL_MODE_*` values, ORed together) in `ssl`. It returns a bitmask | |
| // representing the resulting enabled modes. | |
| OPENSSL_EXPORT uint32_t SSL_set_mode(SSL *ssl, uint32_t mode); | |
| // SSL_clear_mode disables all modes set in `mode` (which should be one or more | |
| // of the `SSL_MODE_*` values, ORed together) in `ssl`. It returns a bitmask | |
| // representing the resulting enabled modes. | |
| OPENSSL_EXPORT uint32_t SSL_clear_mode(SSL *ssl, uint32_t mode); | |
| // SSL_get_mode returns a bitmask of `SSL_MODE_*` values that represent all the | |
| // modes enabled for `ssl`. | |
| OPENSSL_EXPORT uint32_t SSL_get_mode(const SSL *ssl); | |
| // SSL_CTX_set1_buffer_pool sets a `CRYPTO_BUFFER_POOL` that will be used to | |
| // store certificates. This can allow multiple connections to share | |
| // certificates and thus save memory. | |
| OPENSSL_EXPORT void SSL_CTX_set1_buffer_pool(SSL_CTX *ctx, | |
| CRYPTO_BUFFER_POOL *pool); | |
| // Credentials. | |
| // | |
| // TLS endpoints may present authentication during the handshake, usually using | |
| // X.509 certificates. This is typically required for servers and optional for | |
| // clients. BoringSSL uses the `SSL_CREDENTIAL` object to abstract between | |
| // different kinds of credentials, as well as configure automatic selection | |
| // between multiple credentials. This may be used to select between ECDSA and | |
| // RSA certificates. | |
| // | |
| // `SSL_CTX` and `SSL` objects maintain lists of credentials in preference | |
| // order. During the handshake, BoringSSL will select the first usable | |
| // credential from the list. Non-credential APIs, such as | |
| // `SSL_CTX_use_certificate`, configure a "legacy credential", which is | |
| // appended to this list if configured. Using the legacy credential is the same | |
| // as configuring an equivalent credential with the `SSL_CREDENTIAL` API. | |
| // | |
| // When selecting credentials, BoringSSL considers the credential's type, its | |
| // cryptographic capabilities, and capabilities advertised by the peer. This | |
| // varies between TLS versions but includes: | |
| // | |
| // - Whether the peer supports the leaf certificate key | |
| // - Whether there is a common signature algorithm that is compatible with the | |
| // credential | |
| // - Whether there is a common cipher suite that is compatible with the | |
| // credential | |
| // | |
| // WARNING: In TLS 1.2 and below, there is no mechanism for servers to advertise | |
| // supported ECDSA curves to the client. BoringSSL clients will assume the | |
| // server accepts all ECDSA curves in client certificates. | |
| // | |
| // By default, BoringSSL does not check the following, though we may add APIs | |
| // in the future to enable them on a per-credential basis. | |
| // | |
| // - Whether the peer supports the signature algorithms in the certificate chain | |
| // - Whether the a server certificate is compatible with the server_name | |
| // extension (SNI) | |
| // | |
| // Credentials may be configured before the handshake or dynamically in the | |
| // early callback (see `SSL_CTX_set_select_certificate_cb`) and certificate | |
| // callback (see `SSL_CTX_set_cert_cb`). These callbacks allow applications to | |
| // use BoringSSL's built-in selection logic in tandem with custom logic. For | |
| // example, a callback could evaluate application-specific SNI rules to filter | |
| // down to an ECDSA and RSA credential, then configure both for BoringSSL to | |
| // select between the two. | |
| // | |
| // On the server, the credential is selected before resumption. By default, | |
| // sessions established when using one credential can be resumed on other | |
| // credentials. Callers can partition sessions with | |
| // `SSL_CREDENTIAL_set1_session_id_context`. | |
| // SSL_CREDENTIAL_new_x509 returns a new, empty X.509 credential, or NULL on | |
| // error. Callers should release the result with `SSL_CREDENTIAL_free` when | |
| // done. | |
| // | |
| // Callers should configure a certificate chain and private key on the | |
| // credential, along with other properties, then add it with | |
| // `SSL_CTX_add1_credential`. | |
| OPENSSL_EXPORT SSL_CREDENTIAL *SSL_CREDENTIAL_new_x509(void); | |
| // SSL_CREDENTIAL_up_ref increments the reference count of `cred`. | |
| OPENSSL_EXPORT void SSL_CREDENTIAL_up_ref(SSL_CREDENTIAL *cred); | |
| // SSL_CREDENTIAL_dup_ref increments the reference count of `cred` and returns | |
| // `cred`. The caller must call `SSL_CREDENTIAL_free` on the result to release | |
| // the reference. | |
| // | |
| // WARNING: Although the result is non-const for use with `SSL_CREDENTIAL_free`, | |
| // it is still shared with other parts of the application that share the same | |
| // object. Avoid mutating shared `SSL_CREDENTIAL`s. | |
| OPENSSL_EXPORT SSL_CREDENTIAL *SSL_CREDENTIAL_dup_ref( | |
| const SSL_CREDENTIAL *cred); | |
| // SSL_CREDENTIAL_free decrements the reference count of `cred`. If it reaches | |
| // zero, all data referenced by `cred` and `cred` itself are released. | |
| OPENSSL_EXPORT void SSL_CREDENTIAL_free(SSL_CREDENTIAL *cred); | |
| // SSL_CREDENTIAL_is_complete returns one if the returns one if `cred` has all | |
| // required properties configured, and zero otherwise. | |
| // | |
| // This includes checks on whether the public key is present in a X.509 | |
| // credential and whether a private key or private key method has been set up | |
| // for such. | |
| OPENSSL_EXPORT int SSL_CREDENTIAL_is_complete(const SSL_CREDENTIAL *cred); | |
| // SSL_CREDENTIAL_set1_private_key sets `cred`'s private key to `cred`. It | |
| // returns one on success and zero on failure. | |
| OPENSSL_EXPORT int SSL_CREDENTIAL_set1_private_key(SSL_CREDENTIAL *cred, | |
| EVP_PKEY *key); | |
| // SSL_CREDENTIAL_set1_signing_algorithm_prefs configures `cred` to use `prefs` | |
| // as the preference list when signing with `cred`'s private key. It returns one | |
| // on success and zero on error. `prefs` should not include the internal-only | |
| // value `SSL_SIGN_RSA_PKCS1_MD5_SHA1`. | |
| // | |
| // It is an error to call this function with delegated credentials (see | |
| // `SSL_CREDENTIAL_new_delegated`) because delegated credentials already | |
| // constrain the key to a single algorithm. | |
| OPENSSL_EXPORT int SSL_CREDENTIAL_set1_signing_algorithm_prefs( | |
| SSL_CREDENTIAL *cred, const uint16_t *prefs, size_t num_prefs); | |
| // SSL_CREDENTIAL_set1_cert_chain sets `cred`'s certificate chain, starting from | |
| // the leaf, to `num_cert`s certificates from `certs`. It returns one on success | |
| // and zero on error. | |
| OPENSSL_EXPORT int SSL_CREDENTIAL_set1_cert_chain(SSL_CREDENTIAL *cred, | |
| CRYPTO_BUFFER *const *certs, | |
| size_t num_certs); | |
| // SSL_CREDENTIAL_set1_ocsp_response sets `cred`'s stapled OCSP response to | |
| // `ocsp`. It returns one on success and zero on error. | |
| OPENSSL_EXPORT int SSL_CREDENTIAL_set1_ocsp_response(SSL_CREDENTIAL *cred, | |
| CRYPTO_BUFFER *ocsp); | |
| // SSL_CREDENTIAL_set1_certificate_properties parses | |
| // `certificate_property_list` as a CertificatePropertyList (see Section 7 of | |
| // draft-ietf-tls-trust-anchor-ids-06) and applies recognized properties to | |
| // `cred`. It returns one on success and zero on error. It is an error if | |
| // `certificate_property_list` does not parse correctly, or if any recognized | |
| // properties from `certificate_property_list` cannot be applied to `cred`. | |
| // | |
| // CertificatePropertyList is an extensible structure which allows serving | |
| // properties of a certificate chain to be passed from a CA, through an | |
| // application's issuance and configuration pipeline, and to the TLS serving | |
| // logic, without requiring application changes for each property defined. | |
| // | |
| // BoringSSL currently supports the following properties: | |
| // * trust_anchor_id (see `SSL_CREDENTIAL_set1_trust_anchor_id`) | |
| // * trust_anchor_groups (see `SSL_CREDENTIAL_add1_trust_anchor_group`) | |
| // | |
| // Note this function does not automatically enable issuer matching. Callers | |
| // must separately call `SSL_CREDENTIAL_set_must_match_issuer` if desired. | |
| OPENSSL_EXPORT int SSL_CREDENTIAL_set1_certificate_properties( | |
| SSL_CREDENTIAL *cred, CRYPTO_BUFFER *cert_property_list); | |
| // SSL_CREDENTIAL_set1_signed_cert_timestamp_list sets `cred`'s list of signed | |
| // certificate timestamps `sct_list`. `sct_list` must contain one or more SCT | |
| // structures serialised as a SignedCertificateTimestampList (see | |
| // https://tools.ietf.org/html/rfc6962#section-3.3) – i.e. each SCT is prefixed | |
| // by a big-endian, uint16 length and the concatenation of one or more such | |
| // prefixed SCTs are themselves also prefixed by a uint16 length. It returns one | |
| // on success and zero on error. | |
| OPENSSL_EXPORT int SSL_CREDENTIAL_set1_signed_cert_timestamp_list( | |
| SSL_CREDENTIAL *cred, CRYPTO_BUFFER *sct_list); | |
| // SSL_CREDENTIAL_set_must_match_issuer configures whether `cred` should check | |
| // if the peer supports the certificate chain's issuer. | |
| // | |
| // If `match` is non-zero, `cred` will only be applicable when the certificate | |
| // chain is issued by some CA requested by the peer in the | |
| // certificate_authorities extension or, if `cred` has a trust anchor ID (see | |
| // `SSL_CREDENTIAL_set1_trust_anchor_id`), the trust_anchors extension. `cred`'s | |
| // certificate chain must then be a correctly ordered certification path. | |
| // | |
| // If `match` is zero (default), `cred` will not be conditioned on the peer's | |
| // requested CAs. This can be used for certificate chains that are assumed to be | |
| // usable by most peers. | |
| // | |
| // This setting can be used for certificate chains that may not be usable by all | |
| // peers, e.g. chains with fewer cross-signs or issued from a newer CA. The | |
| // credential list is tried in order, so more specific credentials that enable | |
| // issuer matching should generally be ordered before less specific credentials | |
| // that do not. | |
| OPENSSL_EXPORT void SSL_CREDENTIAL_set_must_match_issuer(SSL_CREDENTIAL *cred, | |
| int match); | |
| // SSL_CREDENTIAL_set1_session_id_context sets `cred`'s session ID context to | |
| // `sid_ctx`. It returns one on success and zero on error. The session ID | |
| // context is an application-defined opaque byte string used to partition | |
| // session resumption. A session will not be used in a connection without a | |
| // matching session ID context. | |
| // | |
| // If unset on a server credential, the session ID context configured on the | |
| // `SSL` (or `SSL_CTX`) will be used. See `SSL_CTX_set_session_id_context`. | |
| // | |
| // This setting is only applicable to server credentials. | |
| OPENSSL_EXPORT int SSL_CREDENTIAL_set1_session_id_context( | |
| SSL_CREDENTIAL *cred, const uint8_t *sid_ctx, size_t sid_ctx_len); | |
| // SSL_CTX_add1_credential appends `cred` to `ctx`'s credential list. It returns | |
| // one on success and zero on error. The credential list is maintained in order | |
| // of decreasing preference, so earlier calls are preferred over later calls. | |
| // | |
| // After calling this function, it is an error to modify `cred`. Doing so may | |
| // result in inconsistent handshake behavior or race conditions. | |
| OPENSSL_EXPORT int SSL_CTX_add1_credential(SSL_CTX *ctx, | |
| const SSL_CREDENTIAL *cred); | |
| // SSL_add1_credential appends `cred` to `ssl`'s credential list. It returns one | |
| // on success and zero on error. The credential list is maintained in order of | |
| // decreasing preference, so earlier calls are preferred over later calls. | |
| // | |
| // After calling this function, it is an error to modify `cred`. Doing so may | |
| // result in inconsistent handshake behavior or race conditions. | |
| OPENSSL_EXPORT int SSL_add1_credential(SSL *ssl, const SSL_CREDENTIAL *cred); | |
| // SSL_certs_clear removes all credentials configured on `ssl`. It also removes | |
| // the certificate chain and private key on the legacy credential. | |
| OPENSSL_EXPORT void SSL_certs_clear(SSL *ssl); | |
| // SSL_get0_selected_credential returns the credential in use in the current | |
| // handshake on `ssl`. If there is current handshake on `ssl` or if the | |
| // handshake has not progressed to this point, it returns NULL. | |
| // | |
| // This function is intended for use with `SSL_CREDENTIAL_get_ex_data`. It may | |
| // be called from handshake callbacks, such as those in | |
| // `SSL_PRIVATE_KEY_METHOD`, to trigger credential-specific behavior. | |
| // | |
| // In applications that use the older APIs, such as `SSL_use_certificate`, this | |
| // function may return an internal `SSL_CREDENTIAL` object. This internal object | |
| // will have no ex_data installed. To avoid this, it is recommended that callers | |
| // moving to `SSL_CREDENTIAL` use the new APIs consistently. | |
| OPENSSL_EXPORT const SSL_CREDENTIAL *SSL_get0_selected_credential( | |
| const SSL *ssl); | |
| // Configuring certificates and private keys. | |
| // | |
| // These functions configure the connection's leaf certificate, private key, and | |
| // certificate chain. The certificate chain is ordered leaf to root (as sent on | |
| // the wire) but does not include the leaf. Both client and server certificates | |
| // use these functions. | |
| // | |
| // Prefer to configure the certificate before the private key. If configured in | |
| // the other order, inconsistent private keys will be silently dropped, rather | |
| // than return an error. Additionally, overwriting a previously-configured | |
| // certificate and key pair only works if the certificate is configured first. | |
| // | |
| // Each of these functions configures the single "legacy credential" on the | |
| // `SSL_CTX` or `SSL`. To select between multiple certificates, use | |
| // `SSL_CREDENTIAL_new_x509` and other APIs to configure a list of credentials. | |
| // SSL_CTX_use_certificate sets `ctx`'s leaf certificate to `x509`. It returns | |
| // one on success and zero on failure. If `ctx` has a private key which is | |
| // inconsistent with `x509`, the private key is silently dropped. | |
| OPENSSL_EXPORT int SSL_CTX_use_certificate(SSL_CTX *ctx, X509 *x509); | |
| // SSL_use_certificate sets `ssl`'s leaf certificate to `x509`. It returns one | |
| // on success and zero on failure. If `ssl` has a private key which is | |
| // inconsistent with `x509`, the private key is silently dropped. | |
| OPENSSL_EXPORT int SSL_use_certificate(SSL *ssl, X509 *x509); | |
| // SSL_CTX_use_PrivateKey sets `ctx`'s private key to `pkey`. It returns one on | |
| // success and zero on failure. If `ctx` had a private key or | |
| // `SSL_PRIVATE_KEY_METHOD` previously configured, it is replaced. | |
| OPENSSL_EXPORT int SSL_CTX_use_PrivateKey(SSL_CTX *ctx, EVP_PKEY *pkey); | |
| // SSL_use_PrivateKey sets `ssl`'s private key to `pkey`. It returns one on | |
| // success and zero on failure. If `ssl` had a private key or | |
| // `SSL_PRIVATE_KEY_METHOD` previously configured, it is replaced. | |
| OPENSSL_EXPORT int SSL_use_PrivateKey(SSL *ssl, EVP_PKEY *pkey); | |
| // SSL_CTX_set0_chain sets `ctx`'s certificate chain, excluding the leaf, to | |
| // `chain`. On success, it returns one and takes ownership of `chain`. | |
| // Otherwise, it returns zero. | |
| OPENSSL_EXPORT int SSL_CTX_set0_chain(SSL_CTX *ctx, STACK_OF(X509) *chain); | |
| // SSL_CTX_set1_chain sets `ctx`'s certificate chain, excluding the leaf, to | |
| // `chain`. It returns one on success and zero on failure. The caller retains | |
| // ownership of `chain` and may release it freely. | |
| OPENSSL_EXPORT int SSL_CTX_set1_chain(SSL_CTX *ctx, STACK_OF(X509) *chain); | |
| // SSL_set0_chain sets `ssl`'s certificate chain, excluding the leaf, to | |
| // `chain`. On success, it returns one and takes ownership of `chain`. | |
| // Otherwise, it returns zero. | |
| OPENSSL_EXPORT int SSL_set0_chain(SSL *ssl, STACK_OF(X509) *chain); | |
| // SSL_set1_chain sets `ssl`'s certificate chain, excluding the leaf, to | |
| // `chain`. It returns one on success and zero on failure. The caller retains | |
| // ownership of `chain` and may release it freely. | |
| OPENSSL_EXPORT int SSL_set1_chain(SSL *ssl, STACK_OF(X509) *chain); | |
| // SSL_CTX_add0_chain_cert appends `x509` to `ctx`'s certificate chain. On | |
| // success, it returns one and takes ownership of `x509`. Otherwise, it returns | |
| // zero. | |
| OPENSSL_EXPORT int SSL_CTX_add0_chain_cert(SSL_CTX *ctx, X509 *x509); | |
| // SSL_CTX_add1_chain_cert appends `x509` to `ctx`'s certificate chain. It | |
| // returns one on success and zero on failure. The caller retains ownership of | |
| // `x509` and may release it freely. | |
| OPENSSL_EXPORT int SSL_CTX_add1_chain_cert(SSL_CTX *ctx, X509 *x509); | |
| // SSL_add0_chain_cert appends `x509` to `ctx`'s certificate chain. On success, | |
| // it returns one and takes ownership of `x509`. Otherwise, it returns zero. | |
| OPENSSL_EXPORT int SSL_add0_chain_cert(SSL *ssl, X509 *x509); | |
| // SSL_CTX_add_extra_chain_cert calls `SSL_CTX_add0_chain_cert`. | |
| OPENSSL_EXPORT int SSL_CTX_add_extra_chain_cert(SSL_CTX *ctx, X509 *x509); | |
| // SSL_add1_chain_cert appends `x509` to `ctx`'s certificate chain. It returns | |
| // one on success and zero on failure. The caller retains ownership of `x509` | |
| // and may release it freely. | |
| OPENSSL_EXPORT int SSL_add1_chain_cert(SSL *ssl, X509 *x509); | |
| // SSL_CTX_clear_chain_certs clears `ctx`'s certificate chain and returns | |
| // one. | |
| OPENSSL_EXPORT int SSL_CTX_clear_chain_certs(SSL_CTX *ctx); | |
| // SSL_CTX_clear_extra_chain_certs calls `SSL_CTX_clear_chain_certs`. | |
| OPENSSL_EXPORT int SSL_CTX_clear_extra_chain_certs(SSL_CTX *ctx); | |
| // SSL_clear_chain_certs clears `ssl`'s certificate chain and returns one. | |
| OPENSSL_EXPORT int SSL_clear_chain_certs(SSL *ssl); | |
| // SSL_CTX_set_cert_cb sets a callback that is called to select a certificate. | |
| // The callback returns one on success, zero on internal error, and a negative | |
| // number on failure or to pause the handshake. If the handshake is paused, | |
| // `SSL_get_error` will return `SSL_ERROR_WANT_X509_LOOKUP`. | |
| // | |
| // On the client, the callback may call `SSL_get0_certificate_types` and | |
| // `SSL_get_client_CA_list` for information on the server's certificate | |
| // request. | |
| // | |
| // On the server, the callback will be called after extensions have been | |
| // processed, but before the resumption decision has been made. This differs | |
| // from OpenSSL which handles resumption before selecting the certificate. | |
| OPENSSL_EXPORT void SSL_CTX_set_cert_cb(SSL_CTX *ctx, | |
| int (*cb)(SSL *ssl, void *arg), | |
| void *arg); | |
| // SSL_CTX_set_cert_cb_ex sets a callback that is called to select a certificate | |
| // like `SSL_CTX_set_cert_cb` with an additional argument to allow the callback | |
| // to select the fatal alert to send. | |
| // If `cb` returns zero, it should set `*out_alert` to one of `SSL_AD_*` to | |
| // specify the alert. If unset, it defaults to `SSL_AD_INTERNAL_ERROR`. | |
| // `SSL_AD_HANDSHAKE_FAILURE` is an appropriate alert if the caller and peer do | |
| // not have parameters in common. | |
| OPENSSL_EXPORT void SSL_CTX_set_cert_cb_ex(SSL_CTX *ctx, | |
| int (*cb)(SSL *ssl, void *arg, | |
| uint8_t *out_alert), | |
| void *arg); | |
| // SSL_set_cert_cb sets a callback that is called to select a certificate. The | |
| // callback returns one on success, zero on internal error, and a negative | |
| // number on failure or to pause the handshake. If the handshake is paused, | |
| // `SSL_get_error` will return `SSL_ERROR_WANT_X509_LOOKUP`. | |
| // | |
| // On the client, the callback may call `SSL_get0_certificate_types` and | |
| // `SSL_get_client_CA_list` for information on the server's certificate | |
| // request. | |
| // | |
| // On the server, the callback will be called after extensions have been | |
| // processed, but before the resumption decision has been made. This differs | |
| // from OpenSSL which handles resumption before selecting the certificate. | |
| OPENSSL_EXPORT void SSL_set_cert_cb(SSL *ssl, int (*cb)(SSL *ssl, void *arg), | |
| void *arg); | |
| // SSL_set_cert_cb_ex sets a callback that is called to select a certificate | |
| // like `SSL_CTX_set_cert_cb` with an additional argument to allow the callback | |
| // to select the fatal alert to send. | |
| // If `cb` returns zero, it should set `*out_alert` to one of `SSL_AD_*` to | |
| // specify the alert. If unset, it defaults to `SSL_AD_INTERNAL_ERROR`. | |
| // `SSL_AD_HANDSHAKE_FAILURE` is an appropriate alert if the caller and peer do | |
| // not have parameters in common. | |
| OPENSSL_EXPORT void SSL_set_cert_cb_ex( | |
| SSL *ssl, int (*cb)(SSL *ssl, void *arg, uint8_t *out_alert), void *arg); | |
| // SSL_get0_certificate_types, for a client, sets `*out_types` to an array | |
| // containing the client certificate types requested by a server. It returns the | |
| // length of the array. Note this list is always empty in TLS 1.3. The server | |
| // will instead send signature algorithms. See | |
| // `SSL_get0_peer_verify_algorithms`. | |
| // | |
| // The behavior of this function is undefined except during the callbacks set by | |
| // by `SSL_CTX_set_cert_cb` and `SSL_CTX_set_client_cert_cb` or when the | |
| // handshake is paused because of them. | |
| OPENSSL_EXPORT size_t SSL_get0_certificate_types(const SSL *ssl, | |
| const uint8_t **out_types); | |
| // SSL_get0_peer_verify_algorithms sets `*out_sigalgs` to an array containing | |
| // the signature algorithms the peer is able to verify. It returns the length of | |
| // the array. Note these values are only sent starting TLS 1.2 and only | |
| // mandatory starting TLS 1.3. If not sent, the empty array is returned. For the | |
| // historical client certificate types list, see `SSL_get0_certificate_types`. | |
| // | |
| // The behavior of this function is undefined except during the callbacks set by | |
| // by `SSL_CTX_set_cert_cb` and `SSL_CTX_set_client_cert_cb` or when the | |
| // handshake is paused because of them. | |
| OPENSSL_EXPORT size_t | |
| SSL_get0_peer_verify_algorithms(const SSL *ssl, const uint16_t **out_sigalgs); | |
| // SSL_get0_peer_delegation_algorithms sets `*out_sigalgs` to an array | |
| // containing the signature algorithms the peer is willing to use with delegated | |
| // credentials. It returns the length of the array. If not sent, the empty | |
| // array is returned. | |
| // | |
| // The behavior of this function is undefined except during the callbacks set by | |
| // by `SSL_CTX_set_cert_cb` and `SSL_CTX_set_client_cert_cb` or when the | |
| // handshake is paused because of them. | |
| OPENSSL_EXPORT size_t SSL_get0_peer_delegation_algorithms( | |
| const SSL *ssl, const uint16_t **out_sigalgs); | |
| // SSL_CTX_get0_certificate returns `ctx`'s leaf certificate. | |
| OPENSSL_EXPORT X509 *SSL_CTX_get0_certificate(const SSL_CTX *ctx); | |
| // SSL_get_certificate returns `ssl`'s leaf certificate. | |
| OPENSSL_EXPORT X509 *SSL_get_certificate(const SSL *ssl); | |
| // SSL_CTX_get0_privatekey returns `ctx`'s private key. | |
| OPENSSL_EXPORT EVP_PKEY *SSL_CTX_get0_privatekey(const SSL_CTX *ctx); | |
| // SSL_get_privatekey returns `ssl`'s private key. | |
| OPENSSL_EXPORT EVP_PKEY *SSL_get_privatekey(const SSL *ssl); | |
| // SSL_CTX_get0_chain_certs sets `*out_chain` to `ctx`'s certificate chain and | |
| // returns one. | |
| OPENSSL_EXPORT int SSL_CTX_get0_chain_certs(const SSL_CTX *ctx, | |
| STACK_OF(X509) **out_chain); | |
| // SSL_CTX_get_extra_chain_certs calls `SSL_CTX_get0_chain_certs`. | |
| OPENSSL_EXPORT int SSL_CTX_get_extra_chain_certs(const SSL_CTX *ctx, | |
| STACK_OF(X509) **out_chain); | |
| // SSL_get0_chain_certs sets `*out_chain` to `ssl`'s certificate chain and | |
| // returns one. | |
| OPENSSL_EXPORT int SSL_get0_chain_certs(const SSL *ssl, | |
| STACK_OF(X509) **out_chain); | |
| // SSL_CTX_set_signed_cert_timestamp_list sets the list of signed certificate | |
| // timestamps that is sent to clients that request it. The `list` argument must | |
| // contain one or more SCT structures serialised as a SignedCertificateTimestamp | |
| // List (see https://tools.ietf.org/html/rfc6962#section-3.3) – i.e. each SCT | |
| // is prefixed by a big-endian, uint16 length and the concatenation of one or | |
| // more such prefixed SCTs are themselves also prefixed by a uint16 length. It | |
| // returns one on success and zero on error. The caller retains ownership of | |
| // `list`. | |
| OPENSSL_EXPORT int SSL_CTX_set_signed_cert_timestamp_list(SSL_CTX *ctx, | |
| const uint8_t *list, | |
| size_t list_len); | |
| // SSL_set_signed_cert_timestamp_list sets the list of signed certificate | |
| // timestamps that is sent to clients that request is. The same format as the | |
| // one used for `SSL_CTX_set_signed_cert_timestamp_list` applies. The caller | |
| // retains ownership of `list`. | |
| OPENSSL_EXPORT int SSL_set_signed_cert_timestamp_list(SSL *ctx, | |
| const uint8_t *list, | |
| size_t list_len); | |
| // SSL_CTX_set_ocsp_response sets the OCSP response that is sent to clients | |
| // which request it. It returns one on success and zero on error. The caller | |
| // retains ownership of `response`. | |
| OPENSSL_EXPORT int SSL_CTX_set_ocsp_response(SSL_CTX *ctx, | |
| const uint8_t *response, | |
| size_t response_len); | |
| // SSL_set_ocsp_response sets the OCSP response that is sent to clients which | |
| // request it. It returns one on success and zero on error. The caller retains | |
| // ownership of `response`. | |
| OPENSSL_EXPORT int SSL_set_ocsp_response(SSL *ssl, const uint8_t *response, | |
| size_t response_len); | |
| // SSL_SIGN_* are signature algorithm values as defined in TLS 1.3. | |
| #define SSL_SIGN_RSA_PKCS1_SHA1 0x0201 | |
| #define SSL_SIGN_RSA_PKCS1_SHA256 0x0401 | |
| #define SSL_SIGN_RSA_PKCS1_SHA384 0x0501 | |
| #define SSL_SIGN_RSA_PKCS1_SHA512 0x0601 | |
| #define SSL_SIGN_ECDSA_SHA1 0x0203 | |
| #define SSL_SIGN_ECDSA_SECP256R1_SHA256 0x0403 | |
| #define SSL_SIGN_ECDSA_SECP384R1_SHA384 0x0503 | |
| #define SSL_SIGN_ECDSA_SECP521R1_SHA512 0x0603 | |
| #define SSL_SIGN_RSA_PSS_RSAE_SHA256 0x0804 | |
| #define SSL_SIGN_RSA_PSS_RSAE_SHA384 0x0805 | |
| #define SSL_SIGN_RSA_PSS_RSAE_SHA512 0x0806 | |
| #define SSL_SIGN_ED25519 0x0807 | |
| #define SSL_SIGN_ML_DSA_44 0x0904 | |
| #define SSL_SIGN_ML_DSA_65 0x0905 | |
| #define SSL_SIGN_ML_DSA_87 0x0906 | |
| // SSL_SIGN_RSA_PKCS1_SHA256_LEGACY is a backport of RSASSA-PKCS1-v1_5 with | |
| // SHA-256 to TLS 1.3. It is disabled by default and only defined for client | |
| // certificates. | |
| #define SSL_SIGN_RSA_PKCS1_SHA256_LEGACY 0x0420 | |
| // SSL_SIGN_RSA_PKCS1_MD5_SHA1 is an internal signature algorithm used to | |
| // specify raw RSASSA-PKCS1-v1_5 with an MD5/SHA-1 concatenation, as used in TLS | |
| // before TLS 1.2. | |
| #define SSL_SIGN_RSA_PKCS1_MD5_SHA1 0xff01 | |
| // SSL_get_signature_algorithm_name returns a human-readable name for `sigalg`, | |
| // or NULL if unknown. If `include_curve` is one, the curve for ECDSA algorithms | |
| // is included as in TLS 1.3. Otherwise, it is excluded as in TLS 1.2. | |
| // This string is always an ASCII string. | |
| OPENSSL_EXPORT const char *SSL_get_signature_algorithm_name(uint16_t sigalg, | |
| int include_curve); | |
| // SSL_get_all_signature_algorithm_names outputs a list of possible strings | |
| // `SSL_get_signature_algorithm_name` may return in this version of BoringSSL. | |
| // It writes at most `max_out` entries to `out` and returns the total number it | |
| // would have written, if `max_out` had been large enough. `max_out` may be | |
| // initially set to zero to size the output. | |
| // | |
| // This function is only intended to help initialize tables in callers that want | |
| // possible strings pre-declared. This list would not be suitable to set a list | |
| // of supported features. It is in no particular order, and may contain | |
| // placeholder, experimental, or deprecated values that do not apply to every | |
| // caller. Future versions of BoringSSL may also return strings not in this | |
| // list, so this does not apply if, say, sending strings across services. | |
| // The strings are always ASCII-encoded. | |
| OPENSSL_EXPORT size_t SSL_get_all_signature_algorithm_names(const char **out, | |
| size_t max_out); | |
| // SSL_get_signature_algorithm_key_type returns the key type associated with | |
| // `sigalg` as an `EVP_PKEY_*` constant or `EVP_PKEY_NONE` if unknown. | |
| OPENSSL_EXPORT int SSL_get_signature_algorithm_key_type(uint16_t sigalg); | |
| // SSL_get_signature_algorithm_digest returns the digest function associated | |
| // with `sigalg` or `NULL` if `sigalg` has no prehash (Ed25519) or is unknown. | |
| OPENSSL_EXPORT const EVP_MD *SSL_get_signature_algorithm_digest( | |
| uint16_t sigalg); | |
| // SSL_is_signature_algorithm_rsa_pss returns one if `sigalg` is an RSA-PSS | |
| // signature algorithm and zero otherwise. | |
| OPENSSL_EXPORT int SSL_is_signature_algorithm_rsa_pss(uint16_t sigalg); | |
| // SSL_CTX_set_signing_algorithm_prefs configures `ctx` to use `prefs` as the | |
| // preference list when signing with `ctx`'s private key in TLS 1.2 and up. It | |
| // returns one on success and zero on error. `prefs` should not include the | |
| // internal-only TLS 1.0 value `SSL_SIGN_RSA_PKCS1_MD5_SHA1`. | |
| // | |
| // This setting is not used in TLS 1.0 and 1.1. Those protocols always sign a | |
| // hardcoded algorithm (an MD5/SHA-1 concatenation for RSA, and SHA-1 for | |
| // ECDSA). BoringSSL will use those algorithms if and only if those versions are | |
| // used. To disable them, set the minimum version to TLS 1.2 (default) or | |
| // higher. | |
| OPENSSL_EXPORT int SSL_CTX_set_signing_algorithm_prefs(SSL_CTX *ctx, | |
| const uint16_t *prefs, | |
| size_t num_prefs); | |
| // SSL_set_signing_algorithm_prefs configures `ssl` to use `prefs` as the | |
| // preference list when signing with `ssl`'s private key in TLS 1.2 and up. It | |
| // returns one on success and zero on error. `prefs` should not include the | |
| // internal-only TLS 1.0 value `SSL_SIGN_RSA_PKCS1_MD5_SHA1`. | |
| // | |
| // This setting is not used in TLS 1.0 and 1.1. Those protocols always sign a | |
| // hardcoded algorithm (an MD5/SHA-1 concatenation for RSA, and SHA-1 for | |
| // ECDSA). BoringSSL will use those algorithms if and only if those versions are | |
| // used. To disable them, set the minimum version to TLS 1.2 (default) or | |
| // higher. | |
| OPENSSL_EXPORT int SSL_set_signing_algorithm_prefs(SSL *ssl, | |
| const uint16_t *prefs, | |
| size_t num_prefs); | |
| // Certificate and private key convenience functions. | |
| // SSL_CTX_set_chain_and_key sets the certificate chain and private key for a | |
| // TLS client or server. References to the given `CRYPTO_BUFFER` and `EVP_PKEY` | |
| // objects are added as needed. Exactly one of `privkey` or `privkey_method` | |
| // may be non-NULL. Returns one on success and zero on error. | |
| OPENSSL_EXPORT int SSL_CTX_set_chain_and_key( | |
| SSL_CTX *ctx, CRYPTO_BUFFER *const *certs, size_t num_certs, | |
| EVP_PKEY *privkey, const SSL_PRIVATE_KEY_METHOD *privkey_method); | |
| // SSL_set_chain_and_key sets the certificate chain and private key for a TLS | |
| // client or server. References to the given `CRYPTO_BUFFER` and `EVP_PKEY` | |
| // objects are added as needed. Exactly one of `privkey` or `privkey_method` | |
| // may be non-NULL. Returns one on success and zero on error. | |
| OPENSSL_EXPORT int SSL_set_chain_and_key( | |
| SSL *ssl, CRYPTO_BUFFER *const *certs, size_t num_certs, EVP_PKEY *privkey, | |
| const SSL_PRIVATE_KEY_METHOD *privkey_method); | |
| // SSL_CTX_get0_chain returns the list of `CRYPTO_BUFFER`s that were set by | |
| // `SSL_CTX_set_chain_and_key`. Reference counts are not incremented by this | |
| // call. The return value may be `NULL` if no chain has been set. | |
| // | |
| // (Note: if a chain was configured by non-`CRYPTO_BUFFER`-based functions then | |
| // the return value is undefined and, even if not NULL, the stack itself may | |
| // contain nullptrs. Thus you shouldn't mix this function with | |
| // non-`CRYPTO_BUFFER` functions for manipulating the chain.) | |
| OPENSSL_EXPORT const STACK_OF(CRYPTO_BUFFER) *SSL_CTX_get0_chain( | |
| const SSL_CTX *ctx); | |
| // SSL_get0_chain returns the list of `CRYPTO_BUFFER`s that were set by | |
| // `SSL_set_chain_and_key`, unless they have been discarded. Reference counts | |
| // are not incremented by this call. The return value may be `NULL` if no chain | |
| // has been set. | |
| // | |
| // (Note: if a chain was configured by non-`CRYPTO_BUFFER`-based functions then | |
| // the return value is undefined and, even if not NULL, the stack itself may | |
| // contain nullptrs. Thus you shouldn't mix this function with | |
| // non-`CRYPTO_BUFFER` functions for manipulating the chain.) | |
| // | |
| // This function may return nullptr if a handshake has completed even if | |
| // `SSL_set_chain_and_key` was previously called, since the configuration | |
| // containing the certificates is typically cleared after handshake completion. | |
| OPENSSL_EXPORT const STACK_OF(CRYPTO_BUFFER) *SSL_get0_chain(const SSL *ssl); | |
| // SSL_CTX_use_RSAPrivateKey sets `ctx`'s private key to `rsa`. It returns one | |
| // on success and zero on failure. | |
| OPENSSL_EXPORT int SSL_CTX_use_RSAPrivateKey(SSL_CTX *ctx, RSA *rsa); | |
| // SSL_use_RSAPrivateKey sets `ctx`'s private key to `rsa`. It returns one on | |
| // success and zero on failure. | |
| OPENSSL_EXPORT int SSL_use_RSAPrivateKey(SSL *ssl, RSA *rsa); | |
| // The following functions configure certificates or private keys but take as | |
| // input DER-encoded structures. They return one on success and zero on | |
| // failure. | |
| OPENSSL_EXPORT int SSL_CTX_use_certificate_ASN1(SSL_CTX *ctx, size_t der_len, | |
| const uint8_t *der); | |
| OPENSSL_EXPORT int SSL_use_certificate_ASN1(SSL *ssl, const uint8_t *der, | |
| size_t der_len); | |
| OPENSSL_EXPORT int SSL_CTX_use_PrivateKey_ASN1(int pk, SSL_CTX *ctx, | |
| const uint8_t *der, | |
| size_t der_len); | |
| OPENSSL_EXPORT int SSL_use_PrivateKey_ASN1(int type, SSL *ssl, | |
| const uint8_t *der, size_t der_len); | |
| OPENSSL_EXPORT int SSL_CTX_use_RSAPrivateKey_ASN1(SSL_CTX *ctx, | |
| const uint8_t *der, | |
| size_t der_len); | |
| OPENSSL_EXPORT int SSL_use_RSAPrivateKey_ASN1(SSL *ssl, const uint8_t *der, | |
| size_t der_len); | |
| // The following functions configure certificates or private keys but take as | |
| // input files to read from. They return one on success and zero on failure. The | |
| // `type` parameter is one of the `SSL_FILETYPE_*` values and determines whether | |
| // the file's contents are read as PEM or DER. | |
| #define SSL_FILETYPE_PEM 1 | |
| #define SSL_FILETYPE_ASN1 2 | |
| OPENSSL_EXPORT int SSL_CTX_use_RSAPrivateKey_file(SSL_CTX *ctx, | |
| const char *file, int type); | |
| OPENSSL_EXPORT int SSL_use_RSAPrivateKey_file(SSL *ssl, const char *file, | |
| int type); | |
| OPENSSL_EXPORT int SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file, | |
| int type); | |
| OPENSSL_EXPORT int SSL_use_certificate_file(SSL *ssl, const char *file, | |
| int type); | |
| OPENSSL_EXPORT int SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx, const char *file, | |
| int type); | |
| OPENSSL_EXPORT int SSL_use_PrivateKey_file(SSL *ssl, const char *file, | |
| int type); | |
| // SSL_CTX_use_certificate_chain_file configures certificates for `ctx`. It | |
| // reads the contents of `file` as a PEM-encoded leaf certificate followed | |
| // optionally by the certificate chain to send to the peer. It returns one on | |
| // success and zero on failure. | |
| // | |
| // WARNING: If the input contains "TRUSTED CERTIFICATE" PEM blocks, this | |
| // function parses auxiliary properties as in `d2i_X509_AUX`. Passing untrusted | |
| // input to this function allows an attacker to influence those properties. See | |
| // `d2i_X509_AUX` for details. | |
| OPENSSL_EXPORT int SSL_CTX_use_certificate_chain_file(SSL_CTX *ctx, | |
| const char *file); | |
| // SSL_CTX_set_default_passwd_cb sets the password callback for PEM-based | |
| // convenience functions called on `ctx`. | |
| OPENSSL_EXPORT void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, | |
| pem_password_cb *cb); | |
| // SSL_CTX_get_default_passwd_cb returns the callback set by | |
| // `SSL_CTX_set_default_passwd_cb`. | |
| OPENSSL_EXPORT pem_password_cb *SSL_CTX_get_default_passwd_cb( | |
| const SSL_CTX *ctx); | |
| // SSL_CTX_set_default_passwd_cb_userdata sets the userdata parameter for | |
| // `ctx`'s password callback. | |
| OPENSSL_EXPORT void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx, | |
| void *data); | |
| // SSL_CTX_get_default_passwd_cb_userdata returns the userdata parameter set by | |
| // `SSL_CTX_set_default_passwd_cb_userdata`. | |
| OPENSSL_EXPORT void *SSL_CTX_get_default_passwd_cb_userdata(const SSL_CTX *ctx); | |
| // Custom private keys. | |
| enum ssl_private_key_result_t BORINGSSL_ENUM_INT { | |
| ssl_private_key_success, | |
| ssl_private_key_retry, | |
| ssl_private_key_failure, | |
| }; | |
| // ssl_private_key_method_st (aka `SSL_PRIVATE_KEY_METHOD`) describes private | |
| // key hooks. This is used to off-load signing operations to a custom, | |
| // potentially asynchronous, backend. Metadata about the key such as the type | |
| // and size are parsed out of the certificate. | |
| struct ssl_private_key_method_st { | |
| // sign signs the message `in` in using the specified signature algorithm. On | |
| // success, it returns `ssl_private_key_success` and writes at most `max_out` | |
| // bytes of signature data to `out` and sets `*out_len` to the number of bytes | |
| // written. On failure, it returns `ssl_private_key_failure`. If the operation | |
| // has not completed, it returns `ssl_private_key_retry`. `sign` should | |
| // arrange for the high-level operation on `ssl` to be retried when the | |
| // operation is completed. This will result in a call to `complete`. | |
| // | |
| // `signature_algorithm` is one of the `SSL_SIGN_*` values, as defined in TLS | |
| // 1.3. Note that, in TLS 1.2, ECDSA algorithms do not require that curve | |
| // sizes match hash sizes, so the curve portion of `SSL_SIGN_ECDSA_*` values | |
| // must be ignored. BoringSSL will internally handle the curve matching logic | |
| // where appropriate. | |
| // | |
| // It is an error to call `sign` while another private key operation is in | |
| // progress on `ssl`. | |
| enum ssl_private_key_result_t (*sign)(SSL *ssl, uint8_t *out, size_t *out_len, | |
| size_t max_out, | |
| uint16_t signature_algorithm, | |
| const uint8_t *in, size_t in_len); | |
| // decrypt decrypts `in_len` bytes of encrypted data from `in`. On success it | |
| // returns `ssl_private_key_success`, writes at most `max_out` bytes of | |
| // decrypted data to `out` and sets `*out_len` to the actual number of bytes | |
| // written. On failure it returns `ssl_private_key_failure`. If the operation | |
| // has not completed, it returns `ssl_private_key_retry`. The caller should | |
| // arrange for the high-level operation on `ssl` to be retried when the | |
| // operation is completed, which will result in a call to `complete`. This | |
| // function only works with RSA keys and should perform a raw RSA decryption | |
| // operation with no padding. | |
| // | |
| // It is an error to call `decrypt` while another private key operation is in | |
| // progress on `ssl`. | |
| enum ssl_private_key_result_t (*decrypt)(SSL *ssl, uint8_t *out, | |
| size_t *out_len, size_t max_out, | |
| const uint8_t *in, size_t in_len); | |
| // complete completes a pending operation. If the operation has completed, it | |
| // returns `ssl_private_key_success` and writes the result to `out` as in | |
| // `sign`. Otherwise, it returns `ssl_private_key_failure` on failure and | |
| // `ssl_private_key_retry` if the operation is still in progress. | |
| // | |
| // `complete` may be called arbitrarily many times before completion, but it | |
| // is an error to call `complete` if there is no pending operation in progress | |
| // on `ssl`. | |
| enum ssl_private_key_result_t (*complete)(SSL *ssl, uint8_t *out, | |
| size_t *out_len, size_t max_out); | |
| }; | |
| // SSL_set_private_key_method configures a custom private key on `ssl`. | |
| // `key_method` must remain valid for the lifetime of `ssl`. | |
| // | |
| // If using an RSA or ECDSA key, callers should configure signing capabilities | |
| // with `SSL_set_signing_algorithm_prefs`. Otherwise, BoringSSL may select a | |
| // signature algorithm that `key_method` does not support. | |
| OPENSSL_EXPORT void SSL_set_private_key_method( | |
| SSL *ssl, const SSL_PRIVATE_KEY_METHOD *key_method); | |
| // SSL_CTX_set_private_key_method configures a custom private key on `ctx`. | |
| // `key_method` must remain valid for the lifetime of `ctx`. | |
| // | |
| // If using an RSA or ECDSA key, callers should configure signing capabilities | |
| // with `SSL_CTX_set_signing_algorithm_prefs`. Otherwise, BoringSSL may select a | |
| // signature algorithm that `key_method` does not support. | |
| OPENSSL_EXPORT void SSL_CTX_set_private_key_method( | |
| SSL_CTX *ctx, const SSL_PRIVATE_KEY_METHOD *key_method); | |
| // SSL_CREDENTIAL_set_private_key_method configures a custom private key on | |
| // `cred`. `key_method` must remain valid for the lifetime of `cred`. It returns | |
| // one on success and zero if `cred` does not use private keys. | |
| // | |
| // If using an RSA or ECDSA key, callers should configure signing capabilities | |
| // with `SSL_CREDENTIAL_set1_signing_algorithm_prefs`. Otherwise, BoringSSL may | |
| // select a signature algorithm that `key_method` does not support. This is not | |
| // necessary for delegated credentials (see `SSL_CREDENTIAL_new_delegated`) | |
| // because delegated credentials only support a single signature algorithm. | |
| // | |
| // Functions in `key_method` will be passed an `SSL` object, but not `cred` | |
| // directly. Use `SSL_get0_selected_credential` to determine the selected | |
| // credential. From there, `SSL_CREDENTIAL_get_ex_data` can be used to look up | |
| // credential-specific state, such as a handle to the private key. | |
| OPENSSL_EXPORT int SSL_CREDENTIAL_set_private_key_method( | |
| SSL_CREDENTIAL *cred, const SSL_PRIVATE_KEY_METHOD *key_method); | |
| // SSL_can_release_private_key returns one if `ssl` will no longer call into the | |
| // private key and zero otherwise. If the function returns one, the caller can | |
| // release state associated with the private key. | |
| // | |
| // NOTE: This function assumes the caller does not use `SSL_clear` to reuse | |
| // `ssl` for a second connection. If `SSL_clear` is used, BoringSSL may still | |
| // use the private key on the second connection. | |
| OPENSSL_EXPORT int SSL_can_release_private_key(const SSL *ssl); | |
| // Cipher suites. | |
| // | |
| // `SSL_CIPHER` objects represent cipher suites. | |
| DEFINE_CONST_STACK_OF(SSL_CIPHER) | |
| // The following constants are TLS cipher suite protocol IDs, as returned from | |
| // `SSL_CIPHER_get_protocol_id`. | |
| #define SSL_CIPHER_AES_128_GCM_SHA256 0x1301 | |
| #define SSL_CIPHER_AES_256_GCM_SHA384 0x1302 | |
| #define SSL_CIPHER_CHACHA20_POLY1305_SHA256 0x1303 | |
| #define SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 0xc02b | |
| #define SSL_CIPHER_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 0xc02c | |
| #define SSL_CIPHER_ECDHE_RSA_WITH_AES_128_GCM_SHA256 0xc02f | |
| #define SSL_CIPHER_ECDHE_RSA_WITH_AES_256_GCM_SHA384 0xc030 | |
| #define SSL_CIPHER_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 0xcca8 | |
| #define SSL_CIPHER_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 0xcca9 | |
| #define SSL_CIPHER_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 0xccac | |
| #define SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_CBC_SHA 0xc009 | |
| #define SSL_CIPHER_ECDHE_ECDSA_WITH_AES_256_CBC_SHA 0xc00a | |
| #define SSL_CIPHER_ECDHE_RSA_WITH_AES_128_CBC_SHA 0xc013 | |
| #define SSL_CIPHER_ECDHE_RSA_WITH_AES_256_CBC_SHA 0xc014 | |
| #define SSL_CIPHER_ECDHE_PSK_WITH_AES_128_CBC_SHA 0xc035 | |
| #define SSL_CIPHER_ECDHE_PSK_WITH_AES_256_CBC_SHA 0xc036 | |
| #define SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 0xc023 | |
| #define SSL_CIPHER_ECDHE_RSA_WITH_AES_128_CBC_SHA256 0xc027 | |
| #define SSL_CIPHER_RSA_WITH_AES_128_GCM_SHA256 0x009c | |
| #define SSL_CIPHER_RSA_WITH_AES_256_GCM_SHA384 0x009d | |
| #define SSL_CIPHER_RSA_WITH_AES_128_CBC_SHA 0x002f | |
| #define SSL_CIPHER_RSA_WITH_AES_256_CBC_SHA 0x0035 | |
| #define SSL_CIPHER_PSK_WITH_AES_128_CBC_SHA 0x008c | |
| #define SSL_CIPHER_PSK_WITH_AES_256_CBC_SHA 0x008d | |
| #define SSL_CIPHER_RSA_WITH_3DES_EDE_CBC_SHA 0x000a | |
| // The following constants are not cipher suites, but are used in the protocol | |
| // as signalling values. | |
| #define SSL_CIPHER_EMPTY_RENEGOTIATION_INFO_SCSV 0x00ff | |
| #define SSL_CIPHER_FALLBACK_SCSV 0x5600 | |
| // SSL_get_cipher_by_value returns the structure representing a TLS cipher | |
| // suite based on its assigned number, or NULL if unknown. See | |
| // https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-4. | |
| OPENSSL_EXPORT const SSL_CIPHER *SSL_get_cipher_by_value(uint16_t value); | |
| // SSL_CIPHER_get_protocol_id returns `cipher`'s two-byte protocol ID. | |
| OPENSSL_EXPORT uint16_t SSL_CIPHER_get_protocol_id(const SSL_CIPHER *cipher); | |
| // SSL_CIPHER_is_aead returns one if `cipher` uses an AEAD cipher. | |
| OPENSSL_EXPORT int SSL_CIPHER_is_aead(const SSL_CIPHER *cipher); | |
| // SSL_CIPHER_is_block_cipher returns one if `cipher` is a block cipher. | |
| OPENSSL_EXPORT int SSL_CIPHER_is_block_cipher(const SSL_CIPHER *cipher); | |
| // SSL_CIPHER_get_cipher_nid returns the NID for `cipher`'s bulk | |
| // cipher. Possible values are `NID_aes_128_gcm`, `NID_aes_256_gcm`, | |
| // `NID_chacha20_poly1305`, `NID_aes_128_cbc`, `NID_aes_256_cbc`, and | |
| // `NID_des_ede3_cbc`. | |
| OPENSSL_EXPORT int SSL_CIPHER_get_cipher_nid(const SSL_CIPHER *cipher); | |
| // SSL_CIPHER_get_digest_nid returns the NID for `cipher`'s HMAC if it is a | |
| // legacy cipher suite. For modern AEAD-based ciphers (see | |
| // `SSL_CIPHER_is_aead`), it returns `NID_undef`. | |
| // | |
| // Note this function only returns the legacy HMAC digest, not the PRF hash. | |
| OPENSSL_EXPORT int SSL_CIPHER_get_digest_nid(const SSL_CIPHER *cipher); | |
| // SSL_CIPHER_get_kx_nid returns the NID for `cipher`'s key exchange. This may | |
| // be `NID_kx_rsa`, `NID_kx_ecdhe`, or `NID_kx_psk` for TLS 1.2. In TLS 1.3, | |
| // cipher suites do not specify the key exchange, so this function returns | |
| // `NID_kx_any`. | |
| OPENSSL_EXPORT int SSL_CIPHER_get_kx_nid(const SSL_CIPHER *cipher); | |
| // SSL_CIPHER_get_auth_nid returns the NID for `cipher`'s authentication | |
| // type. This may be `NID_auth_rsa`, `NID_auth_ecdsa`, or `NID_auth_psk` for TLS | |
| // 1.2. In TLS 1.3, cipher suites do not specify authentication, so this | |
| // function returns `NID_auth_any`. | |
| OPENSSL_EXPORT int SSL_CIPHER_get_auth_nid(const SSL_CIPHER *cipher); | |
| // SSL_CIPHER_get_handshake_digest returns `cipher`'s PRF hash. If `cipher` | |
| // is a pre-TLS-1.2 cipher, it returns `EVP_md5_sha1` but note these ciphers use | |
| // SHA-256 in TLS 1.2. Other return values may be treated uniformly in all | |
| // applicable versions. | |
| OPENSSL_EXPORT const EVP_MD *SSL_CIPHER_get_handshake_digest( | |
| const SSL_CIPHER *cipher); | |
| // SSL_CIPHER_get_prf_nid behaves like `SSL_CIPHER_get_handshake_digest` but | |
| // returns the NID constant. Use `SSL_CIPHER_get_handshake_digest` instead. | |
| OPENSSL_EXPORT int SSL_CIPHER_get_prf_nid(const SSL_CIPHER *cipher); | |
| // SSL_CIPHER_get_min_version returns the minimum protocol version required | |
| // for `cipher`. | |
| OPENSSL_EXPORT uint16_t SSL_CIPHER_get_min_version(const SSL_CIPHER *cipher); | |
| // SSL_CIPHER_get_max_version returns the maximum protocol version that | |
| // supports `cipher`. | |
| OPENSSL_EXPORT uint16_t SSL_CIPHER_get_max_version(const SSL_CIPHER *cipher); | |
| // SSL_CIPHER_standard_name returns the standard IETF name for `cipher`. For | |
| // example, "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256". | |
| // The standard name is always an ASCII string. | |
| OPENSSL_EXPORT const char *SSL_CIPHER_standard_name(const SSL_CIPHER *cipher); | |
| // SSL_CIPHER_get_kx_name returns a string that describes the key-exchange | |
| // method used by `cipher`. For example, "ECDHE_ECDSA". TLS 1.3 AEAD-only | |
| // ciphers return the string "GENERIC". | |
| // The key-exchange method name is always an ASCII string. | |
| OPENSSL_EXPORT const char *SSL_CIPHER_get_kx_name(const SSL_CIPHER *cipher); | |
| // SSL_CIPHER_get_bits returns the strength, in bits, of `cipher`. If | |
| // `out_alg_bits` is not NULL, it writes the number of bits consumed by the | |
| // symmetric algorithm to `*out_alg_bits`. | |
| OPENSSL_EXPORT int SSL_CIPHER_get_bits(const SSL_CIPHER *cipher, | |
| int *out_alg_bits); | |
| // SSL_get_all_cipher_names outputs a list of possible strings | |
| // `SSL_CIPHER_get_name` may return in this version of BoringSSL. It writes at | |
| // most `max_out` entries to `out` and returns the total number it would have | |
| // written, if `max_out` had been large enough. `max_out` may be initially set | |
| // to zero to size the output. | |
| // | |
| // This function is only intended to help initialize tables in callers that want | |
| // possible strings pre-declared. This list would not be suitable to set a list | |
| // of supported features. It is in no particular order, and may contain | |
| // placeholder, experimental, or deprecated values that do not apply to every | |
| // caller. Future versions of BoringSSL may also return strings not in this | |
| // list, so this does not apply if, say, sending strings across services. | |
| // The strings are always ASCII-encoded. | |
| OPENSSL_EXPORT size_t SSL_get_all_cipher_names(const char **out, | |
| size_t max_out); | |
| // SSL_get_all_standard_cipher_names outputs a list of possible strings | |
| // `SSL_CIPHER_standard_name` may return in this version of BoringSSL. It writes | |
| // at most `max_out` entries to `out` and returns the total number it would have | |
| // written, if `max_out` had been large enough. `max_out` may be initially set | |
| // to zero to size the output. | |
| // | |
| // This function is only intended to help initialize tables in callers that want | |
| // possible strings pre-declared. This list would not be suitable to set a list | |
| // of supported features. It is in no particular order, and may contain | |
| // placeholder, experimental, or deprecated values that do not apply to every | |
| // caller. Future versions of BoringSSL may also return strings not in this | |
| // list, so this does not apply if, say, sending strings across services. | |
| // The strings are always ASCII-encoded. | |
| OPENSSL_EXPORT size_t SSL_get_all_standard_cipher_names(const char **out, | |
| size_t max_out); | |
| // Cipher suite configuration. | |
| // | |
| // OpenSSL uses a mini-language to configure cipher suites. The language | |
| // maintains an ordered list of enabled ciphers, along with an ordered list of | |
| // disabled but available ciphers. Initially, all ciphers are disabled with a | |
| // default ordering. The cipher string is then interpreted as a sequence of | |
| // directives, separated by colons, each of which modifies this state. | |
| // | |
| // Most directives consist of a one character or empty opcode followed by a | |
| // selector which matches a subset of available ciphers. | |
| // | |
| // Available opcodes are: | |
| // | |
| // - The empty opcode enables and appends all matching disabled ciphers to the | |
| // end of the enabled list. The newly appended ciphers are ordered relative to | |
| // each other matching their order in the disabled list. | |
| // | |
| // - `-` disables all matching enabled ciphers and prepends them to the disabled | |
| // list, with relative order from the enabled list preserved. This means the | |
| // most recently disabled ciphers get highest preference relative to other | |
| // disabled ciphers if re-enabled. | |
| // | |
| // - `+` moves all matching enabled ciphers to the end of the enabled list, with | |
| // relative order preserved. | |
| // | |
| // - `!` deletes all matching ciphers, enabled or not, from either list. Deleted | |
| // ciphers will not matched by future operations. | |
| // | |
| // A selector may be a specific cipher (using either the standard or OpenSSL | |
| // name for the cipher) or one or more rules separated by |+|. The final | |
| // selector matches the intersection of each rule. For instance, `AESGCM+aECDSA` | |
| // matches ECDSA-authenticated AES-GCM ciphers. | |
| // | |
| // Available cipher rules are: | |
| // | |
| // - `ALL` matches all ciphers, except for deprecated ciphers which must be | |
| // named explicitly. | |
| // | |
| // - `kRSA`, `kDHE`, `kECDHE`, and `kPSK` match ciphers using plain RSA, DHE, | |
| // ECDHE, and plain PSK key exchanges, respectively. Note that ECDHE_PSK is | |
| // matched by `kECDHE` and not `kPSK`. | |
| // | |
| // - `aRSA`, `aECDSA`, and `aPSK` match ciphers authenticated by RSA, ECDSA, and | |
| // a pre-shared key, respectively. | |
| // | |
| // - `RSA`, `DHE`, `ECDHE`, `PSK`, `ECDSA`, and `PSK` are aliases for the | |
| // corresponding `k*` or `a*` cipher rule. `RSA` is an alias for `kRSA`, not | |
| // `aRSA`. | |
| // | |
| // - `3DES`, `AES128`, `AES256`, `AES`, `AESGCM`, `CHACHA20` match ciphers | |
| // whose bulk cipher use the corresponding encryption scheme. Note that | |
| // `AES`, `AES128`, and `AES256` match both CBC and GCM ciphers. | |
| // | |
| // - `SHA1`, and its alias `SHA`, match legacy cipher suites using HMAC-SHA1. | |
| // | |
| // Deprecated cipher rules: | |
| // | |
| // - `kEDH`, `EDH`, `kEECDH`, and `EECDH` are legacy aliases for `kDHE`, `DHE`, | |
| // `kECDHE`, and `ECDHE`, respectively. | |
| // | |
| // - `HIGH` is an alias for `ALL`. | |
| // | |
| // - `FIPS` is an alias for `HIGH`. | |
| // | |
| // - `SSLv3` and `TLSv1` match ciphers available in TLS 1.1 or earlier. | |
| // `TLSv1.2` matches ciphers new in TLS 1.2. This is confusing and should not | |
| // be used. | |
| // | |
| // Unknown rules are silently ignored by legacy APIs, and rejected by APIs with | |
| // "strict" in the name, which should be preferred. Cipher lists can be long | |
| // and it's easy to commit typos. Strict functions will also reject the use of | |
| // spaces, semi-colons and commas as alternative separators. | |
| // | |
| // The special `@STRENGTH` directive will sort all enabled ciphers by strength. | |
| // | |
| // The `DEFAULT` directive, when appearing at the front of the string, expands | |
| // to the default ordering of available ciphers. | |
| // | |
| // If configuring a server, one may also configure equal-preference groups to | |
| // partially respect the client's preferences when | |
| // `SSL_OP_CIPHER_SERVER_PREFERENCE` is enabled. Ciphers in an equal-preference | |
| // group have equal priority and use the client order. This may be used to | |
| // enforce that AEADs are preferred but select AES-GCM vs. ChaCha20-Poly1305 | |
| // based on client preferences. An equal-preference is specified with square | |
| // brackets, combining multiple selectors separated by |. For example: | |
| // | |
| // [TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256|TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256] | |
| // | |
| // Once an equal-preference group is used, future directives must be | |
| // opcode-less. Inside an equal-preference group, spaces are not allowed. | |
| // | |
| // TLS 1.3 ciphers do not participate in this mechanism and are instead | |
| // configured by the functions in the next section. Functions to set cipher | |
| // lists do not affect TLS 1.3, and functions to query the cipher list do not | |
| // include TLS 1.3 ciphers. | |
| // SSL_DEFAULT_CIPHER_LIST is the default cipher suite configuration. It is | |
| // substituted when a cipher string starts with 'DEFAULT'. | |
| #define SSL_DEFAULT_CIPHER_LIST "ALL" | |
| // SSL_CTX_set_strict_cipher_list configures the cipher list for `ctx`, | |
| // evaluating `str` as a cipher string and returning error if `str` contains | |
| // anything meaningless. It returns one on success and zero on failure. | |
| OPENSSL_EXPORT int SSL_CTX_set_strict_cipher_list(SSL_CTX *ctx, | |
| const char *str); | |
| // SSL_CTX_set_cipher_list configures the cipher list for `ctx`, evaluating | |
| // `str` as a cipher string. It returns one on success and zero on failure. | |
| // | |
| // Prefer to use `SSL_CTX_set_strict_cipher_list`. This function tolerates | |
| // garbage inputs, unless an empty cipher list results. | |
| OPENSSL_EXPORT int SSL_CTX_set_cipher_list(SSL_CTX *ctx, const char *str); | |
| // SSL_set_strict_cipher_list configures the cipher list for `ssl`, evaluating | |
| // `str` as a cipher string and returning error if `str` contains anything | |
| // meaningless. It returns one on success and zero on failure. | |
| OPENSSL_EXPORT int SSL_set_strict_cipher_list(SSL *ssl, const char *str); | |
| // SSL_set_cipher_list configures the cipher list for `ssl`, evaluating `str` as | |
| // a cipher string. It returns one on success and zero on failure. | |
| // | |
| // Prefer to use `SSL_set_strict_cipher_list`. This function tolerates garbage | |
| // inputs, unless an empty cipher list results. | |
| OPENSSL_EXPORT int SSL_set_cipher_list(SSL *ssl, const char *str); | |
| // SSL_CTX_get_ciphers returns the cipher list for `ctx`, in order of | |
| // preference. | |
| // TODO(crbug.com/550501994): This should return a const pointer. | |
| OPENSSL_EXPORT STACK_OF(SSL_CIPHER) *SSL_CTX_get_ciphers(const SSL_CTX *ctx); | |
| // SSL_CTX_cipher_in_group returns one if the `i`th cipher (see | |
| // `SSL_CTX_get_ciphers`) is in the same equipreference group as the one | |
| // following it and zero otherwise. | |
| OPENSSL_EXPORT int SSL_CTX_cipher_in_group(const SSL_CTX *ctx, size_t i); | |
| // SSL_get_ciphers returns the cipher list for `ssl`, in order of preference. | |
| // TODO(crbug.com/550501994): This should return a const pointer. | |
| OPENSSL_EXPORT STACK_OF(SSL_CIPHER) *SSL_get_ciphers(const SSL *ssl); | |
| // TLS 1.3 Ciphers. | |
| // SSL_CIPHER_FLAG_* define flags used with `SSL_CTX_set1_tls13_ciphers` and | |
| // `SSL_set1_tls13_ciphers`. | |
| // | |
| // If configuring a server, SSL_CIPHER_FLAG_EQUAL_PREFERENCE_WITH_NEXT indicates | |
| // that the corresponding cipher suite has equal preference with the next member | |
| // of the list of ciphers being configured. Assigning equal preference to a | |
| // range of consecutively listed cipher suites allows a server to partially | |
| // respect the client's preferences. | |
| #define SSL_CIPHER_FLAG_EQUAL_PREFERENCE_WITH_NEXT 0x01 | |
| // SSL_CTX_set1_tls13_ciphers sets the preferred TLS 1.3 cipher suites for `ctx` | |
| // to `cipher_ids`. If `flags` is non-null, the preference list is modified by | |
| // the corresponding `flags` for each element, which is a set of | |
| // `SSL_CIPHER_FLAG_*` values ORed together. Each element of `cipher_ids` should | |
| // be a unique one of the `SSL_CIPHER_*` constants corresponding to the protocol | |
| // ID of a TLS 1.3 cipher suite. If `cipher_ids` is empty, TLS 1.3 cipher suites | |
| // will instead be determined by a built-in preference order. `cipher_ids` and | |
| // `flags` (if non-null) should both have `num_cipher_ids` elements. This | |
| // function returns one on success and zero on failure. | |
| OPENSSL_EXPORT int SSL_CTX_set1_tls13_ciphers(SSL_CTX *ctx, | |
| const uint16_t *cipher_ids, | |
| const uint32_t *flags, | |
| size_t num_cipher_ids); | |
| // SSL_set1_tls13_ciphers behaves like `SSL_CTX_set1_tls13_ciphers` except that | |
| // it configures the preferred TLS 1.3 ciphers on `ssl`. | |
| OPENSSL_EXPORT int SSL_set1_tls13_ciphers(SSL *ssl, const uint16_t *cipher_ids, | |
| const uint32_t *flags, | |
| size_t num_cipher_ids); | |
| // Connection information. | |
| // SSL_is_init_finished returns one if `ssl` has completed its initial handshake | |
| // and has no pending handshake. It returns zero otherwise. | |
| OPENSSL_EXPORT int SSL_is_init_finished(const SSL *ssl); | |
| // SSL_in_init returns one if `ssl` has a pending handshake and zero | |
| // otherwise. | |
| OPENSSL_EXPORT int SSL_in_init(const SSL *ssl); | |
| // SSL_in_false_start returns one if `ssl` has a pending handshake that is in | |
| // False Start. `SSL_write` may be called at this point without waiting for the | |
| // peer, but `SSL_read` will complete the handshake before accepting application | |
| // data. | |
| // | |
| // See also `SSL_MODE_ENABLE_FALSE_START`. | |
| OPENSSL_EXPORT int SSL_in_false_start(const SSL *ssl); | |
| // SSL_get_peer_certificate returns the peer's leaf certificate or NULL if the | |
| // peer did not use certificates. The caller must call `X509_free` on the | |
| // result to release it. | |
| OPENSSL_EXPORT X509 *SSL_get_peer_certificate(const SSL *ssl); | |
| // SSL_get_peer_cert_chain returns the peer's certificate chain or NULL if | |
| // unavailable or the peer did not use certificates. This is the unverified list | |
| // of certificates as sent by the peer, not the final chain built during | |
| // verification. The caller does not take ownership of the result. | |
| // | |
| // WARNING: This function behaves differently between client and server. If | |
| // `ssl` is a server, the returned chain does not include the leaf certificate. | |
| // If a client, it does. | |
| OPENSSL_EXPORT STACK_OF(X509) *SSL_get_peer_cert_chain(const SSL *ssl); | |
| // SSL_get_peer_full_cert_chain returns the peer's certificate chain, or NULL if | |
| // unavailable or the peer did not use certificates. This is the unverified list | |
| // of certificates as sent by the peer, not the final chain built during | |
| // verification. The caller does not take ownership of the result. | |
| // | |
| // This is the same as `SSL_get_peer_cert_chain` except that this function | |
| // always returns the full chain, i.e. the first element of the return value | |
| // (if any) will be the leaf certificate. In contrast, `SSL_get_peer_cert_chain` | |
| // returns only the intermediate certificates if the `ssl` is a server. | |
| OPENSSL_EXPORT STACK_OF(X509) *SSL_get_peer_full_cert_chain(const SSL *ssl); | |
| // SSL_get0_peer_certificates returns the peer's certificate chain, or NULL if | |
| // unavailable or the peer did not use certificates. This is the unverified list | |
| // of certificates as sent by the peer, not the final chain built during | |
| // verification. The caller does not take ownership of the result. | |
| // | |
| // This is the `CRYPTO_BUFFER` variant of `SSL_get_peer_full_cert_chain`. | |
| OPENSSL_EXPORT const STACK_OF(CRYPTO_BUFFER) *SSL_get0_peer_certificates( | |
| const SSL *ssl); | |
| // SSL_get0_signed_cert_timestamp_list sets `*out` and `*out_len` to point to | |
| // `*out_len` bytes of SCT information from the server. This is only valid if | |
| // `ssl` is a client. The SCT information is a SignedCertificateTimestampList | |
| // (including the two leading length bytes). | |
| // See https://tools.ietf.org/html/rfc6962#section-3.3 | |
| // If no SCT was received then `*out_len` will be zero on return. | |
| // | |
| // WARNING: the returned data is not guaranteed to be well formed. | |
| OPENSSL_EXPORT void SSL_get0_signed_cert_timestamp_list(const SSL *ssl, | |
| const uint8_t **out, | |
| size_t *out_len); | |
| // SSL_get0_ocsp_response sets `*out` and `*out_len` to point to `*out_len` | |
| // bytes of an OCSP response from the server. This is the DER encoding of an | |
| // OCSPResponse type as defined in RFC 2560. | |
| // | |
| // WARNING: the returned data is not guaranteed to be well formed. | |
| OPENSSL_EXPORT void SSL_get0_ocsp_response(const SSL *ssl, const uint8_t **out, | |
| size_t *out_len); | |
| // SSL_get_tls_unique writes at most `max_out` bytes of the tls-unique value | |
| // for `ssl` to `out` and sets `*out_len` to the number of bytes written. It | |
| // returns one on success or zero on error. In general `max_out` should be at | |
| // least 12. | |
| // | |
| // This function will always fail if the initial handshake has not completed. | |
| // The tls-unique value will change after a renegotiation but, since | |
| // renegotiations can be initiated by the server at any point, the higher-level | |
| // protocol must either leave them disabled or define states in which the | |
| // tls-unique value can be read. | |
| // | |
| // The tls-unique value is defined by | |
| // https://tools.ietf.org/html/rfc5929#section-3.1. Due to a weakness in the | |
| // TLS protocol, tls-unique is broken for resumed connections unless the | |
| // Extended Master Secret extension is negotiated. Thus this function will | |
| // return zero if `ssl` performed session resumption unless EMS was used when | |
| // negotiating the original session. | |
| OPENSSL_EXPORT int SSL_get_tls_unique(const SSL *ssl, uint8_t *out, | |
| size_t *out_len, size_t max_out); | |
| // SSL_get_extms_support returns one if the Extended Master Secret extension or | |
| // TLS 1.3 was negotiated. Otherwise, it returns zero. | |
| OPENSSL_EXPORT int SSL_get_extms_support(const SSL *ssl); | |
| // SSL_get_current_cipher returns cipher suite used by `ssl`, or NULL if it has | |
| // not been negotiated yet. | |
| OPENSSL_EXPORT const SSL_CIPHER *SSL_get_current_cipher(const SSL *ssl); | |
| // SSL_session_reused returns one if `ssl` performed an abbreviated handshake | |
| // and zero otherwise. | |
| // | |
| // TODO(davidben): Hammer down the semantics of this API while a handshake, | |
| // initial or renego, is in progress. | |
| OPENSSL_EXPORT int SSL_session_reused(const SSL *ssl); | |
| // SSL_get_secure_renegotiation_support returns one if the peer supports secure | |
| // renegotiation (RFC 5746) or TLS 1.3. Otherwise, it returns zero. | |
| OPENSSL_EXPORT int SSL_get_secure_renegotiation_support(const SSL *ssl); | |
| // SSL_export_keying_material exports a connection-specific secret from `ssl`, | |
| // as specified in RFC 5705. It writes `out_len` bytes to `out` given a label | |
| // and optional context. If `use_context` is zero, the `context` parameter is | |
| // ignored. | |
| // | |
| // To derive the same value, both sides of a connection must use the same output | |
| // length, label, and context. In TLS 1.2 and earlier, using a zero-length | |
| // context and using no context would give different output. In TLS 1.3 and | |
| // later, the output length impacts the derivation, so a truncated longer export | |
| // will not match a shorter export. | |
| // | |
| // It returns one on success and zero otherwise. | |
| OPENSSL_EXPORT int SSL_export_keying_material(const SSL *ssl, uint8_t *out, | |
| size_t out_len, const char *label, | |
| size_t label_len, | |
| const uint8_t *context, | |
| size_t context_len, | |
| int use_context); | |
| // Sessions. | |
| // | |
| // An `SSL_SESSION` represents an SSL session that may be resumed in an | |
| // abbreviated handshake. It is reference-counted and immutable. Once | |
| // established, an `SSL_SESSION` may be shared by multiple `SSL` objects on | |
| // different threads and must not be modified. | |
| // | |
| // Note the TLS notion of "session" is not suitable for application-level | |
| // session state. It is an optional caching mechanism for the handshake. Not all | |
| // connections within an application-level session will reuse TLS sessions. TLS | |
| // sessions may be dropped by the client or ignored by the server at any time. | |
| // SSL_SESSION_new returns a newly-allocated blank `SSL_SESSION` or NULL on | |
| // error. This may be useful when writing tests but should otherwise not be | |
| // used. | |
| OPENSSL_EXPORT SSL_SESSION *SSL_SESSION_new(const SSL_CTX *ctx); | |
| // SSL_SESSION_up_ref increments the reference count of `session` and returns | |
| // one. | |
| OPENSSL_EXPORT int SSL_SESSION_up_ref(SSL_SESSION *session); | |
| // SSL_SESSION_dup_ref increments the reference count of `session` and returns | |
| // the same handle. | |
| OPENSSL_EXPORT SSL_SESSION *SSL_SESSION_dup_ref(const SSL_SESSION *session); | |
| // SSL_SESSION_free decrements the reference count of `session`. If it reaches | |
| // zero, all data referenced by `session` and `session` itself are released. | |
| OPENSSL_EXPORT void SSL_SESSION_free(SSL_SESSION *session); | |
| // SSL_SESSION_to_bytes serializes `in` into a newly allocated buffer and sets | |
| // `*out_data` to that buffer and `*out_len` to its length. The caller takes | |
| // ownership of the buffer and must call `OPENSSL_free` when done. It returns | |
| // one on success and zero on error. | |
| OPENSSL_EXPORT int SSL_SESSION_to_bytes(const SSL_SESSION *in, | |
| uint8_t **out_data, size_t *out_len); | |
| // SSL_SESSION_to_bytes_for_ticket serializes `in`, but excludes the session | |
| // identification information, namely the session ID and ticket. | |
| OPENSSL_EXPORT int SSL_SESSION_to_bytes_for_ticket(const SSL_SESSION *in, | |
| uint8_t **out_data, | |
| size_t *out_len); | |
| // SSL_SESSION_from_bytes parses `in_len` bytes from `in` as an SSL_SESSION. It | |
| // returns a newly-allocated `SSL_SESSION` on success or NULL on error. | |
| OPENSSL_EXPORT SSL_SESSION *SSL_SESSION_from_bytes(const uint8_t *in, | |
| size_t in_len, | |
| const SSL_CTX *ctx); | |
| // PEM_read_bio_SSL_SESSION reads an `SSL_SESSION` as a PEM block of type "SSL | |
| // SESSION PARAMETERS", as described in `PEM_read_bio_SAMPLE`. | |
| OPENSSL_EXPORT SSL_SESSION *PEM_read_bio_SSL_SESSION(BIO *bio, | |
| SSL_SESSION **out, | |
| pem_password_cb *cb, | |
| void *userdata); | |
| // PEM_read_SSL_SESSION behaves like `PEM_read_bio_SSL_SESSION` but reads from | |
| // `fp`. | |
| OPENSSL_EXPORT SSL_SESSION *PEM_read_SSL_SESSION(FILE *fp, SSL_SESSION **out, | |
| pem_password_cb *cb, | |
| void *userdata); | |
| // PEM_write_bio_SSL_SESSION writes `in` to `bio` as a PEM block of type "SSL | |
| // SESSION PARAMETERS", as described in `PEM_write_bio_SAMPLE`. | |
| OPENSSL_EXPORT int PEM_write_bio_SSL_SESSION(BIO *bio, const SSL_SESSION *in); | |
| // PEM_write_SSL_SESSION behaves like `PEM_write_bio_SSL_SESSION` but writes to | |
| // `fp`. | |
| OPENSSL_EXPORT int PEM_write_SSL_SESSION(FILE *fp, const SSL_SESSION *in); | |
| // SSL_SESSION_get_version returns a string describing the TLS or DTLS version | |
| // `session` was established at. For example, "TLSv1.2" or "DTLSv1". | |
| // The version string is always an ASCII string. | |
| OPENSSL_EXPORT const char *SSL_SESSION_get_version(const SSL_SESSION *session); | |
| // SSL_SESSION_get_protocol_version returns the TLS or DTLS version `session` | |
| // was established at. | |
| OPENSSL_EXPORT uint16_t | |
| SSL_SESSION_get_protocol_version(const SSL_SESSION *session); | |
| // SSL_SESSION_set_protocol_version sets `session`'s TLS or DTLS version to | |
| // `version`. This may be useful when writing tests but should otherwise not be | |
| // used. It returns one on success and zero on error. | |
| OPENSSL_EXPORT int SSL_SESSION_set_protocol_version(SSL_SESSION *session, | |
| uint16_t version); | |
| // SSL_MAX_SSL_SESSION_ID_LENGTH is the maximum length of an SSL session ID. | |
| #define SSL_MAX_SSL_SESSION_ID_LENGTH 32 | |
| // SSL_SESSION_get_id returns a pointer to a buffer containing `session`'s | |
| // session ID and sets `*out_len` to its length. | |
| // | |
| // This function should only be used for implementing a TLS session cache. TLS | |
| // sessions are not suitable for application-level session state, and a session | |
| // ID is an implementation detail of the TLS resumption handshake mechanism. Not | |
| // all resumption flows use session IDs, and not all connections within an | |
| // application-level session will reuse TLS sessions. | |
| // | |
| // To determine if resumption occurred, use `SSL_session_reused` instead. | |
| // Comparing session IDs will not give the right result in all cases. | |
| // | |
| // As a workaround for some broken applications, BoringSSL sometimes synthesizes | |
| // arbitrary session IDs for non-ID-based sessions. This behavior may be | |
| // removed in the future. | |
| OPENSSL_EXPORT const uint8_t *SSL_SESSION_get_id(const SSL_SESSION *session, | |
| unsigned *out_len); | |
| // SSL_SESSION_set1_id sets `session`'s session ID to `sid`, It returns one on | |
| // success and zero on error. This function may be useful in writing tests but | |
| // otherwise should not be used. | |
| OPENSSL_EXPORT int SSL_SESSION_set1_id(SSL_SESSION *session, const uint8_t *sid, | |
| size_t sid_len); | |
| // SSL_SESSION_get_time returns the time at which `session` was established in | |
| // seconds since the UNIX epoch. | |
| OPENSSL_EXPORT uint64_t SSL_SESSION_get_time(const SSL_SESSION *session); | |
| // SSL_SESSION_get_timeout returns the lifetime of `session` in seconds. | |
| OPENSSL_EXPORT uint32_t SSL_SESSION_get_timeout(const SSL_SESSION *session); | |
| // SSL_SESSION_get0_peer returns the peer leaf certificate stored in | |
| // `session`. | |
| // | |
| // TODO(davidben): This should return a const X509 *. | |
| OPENSSL_EXPORT X509 *SSL_SESSION_get0_peer(const SSL_SESSION *session); | |
| // SSL_SESSION_get0_peer_certificates returns the peer certificate chain stored | |
| // in `session`, or NULL if the peer did not use certificates. This is the | |
| // unverified list of certificates as sent by the peer, not the final chain | |
| // built during verification. The caller does not take ownership of the result. | |
| OPENSSL_EXPORT const STACK_OF(CRYPTO_BUFFER) * | |
| SSL_SESSION_get0_peer_certificates(const SSL_SESSION *session); | |
| // SSL_SESSION_get0_peer_rpk returns the peer raw public key stored in | |
| // `session`, or NULL if the peer did not send a raw public key. | |
| OPENSSL_EXPORT EVP_PKEY *SSL_SESSION_get0_peer_rpk(const SSL_SESSION *session); | |
| // SSL_SESSION_get0_signed_cert_timestamp_list sets `*out` and `*out_len` to | |
| // point to `*out_len` bytes of SCT information stored in `session`. This is | |
| // only valid for client sessions. The SCT information is a | |
| // SignedCertificateTimestampList (including the two leading length bytes). See | |
| // https://tools.ietf.org/html/rfc6962#section-3.3 If no SCT was received then | |
| // `*out_len` will be zero on return. | |
| // | |
| // WARNING: the returned data is not guaranteed to be well formed. | |
| OPENSSL_EXPORT void SSL_SESSION_get0_signed_cert_timestamp_list( | |
| const SSL_SESSION *session, const uint8_t **out, size_t *out_len); | |
| // SSL_SESSION_get0_ocsp_response sets `*out` and `*out_len` to point to | |
| // `*out_len` bytes of an OCSP response from the server. This is the DER | |
| // encoding of an OCSPResponse type as defined in RFC 2560. | |
| // | |
| // WARNING: the returned data is not guaranteed to be well formed. | |
| OPENSSL_EXPORT void SSL_SESSION_get0_ocsp_response(const SSL_SESSION *session, | |
| const uint8_t **out, | |
| size_t *out_len); | |
| // SSL_MAX_MASTER_KEY_LENGTH is the maximum length of a master secret. | |
| #define SSL_MAX_MASTER_KEY_LENGTH 48 | |
| // SSL_SESSION_get_master_key writes up to `max_out` bytes of `session`'s secret | |
| // to `out` and returns the number of bytes written. If `max_out` is zero, it | |
| // returns the size of the secret. | |
| OPENSSL_EXPORT size_t SSL_SESSION_get_master_key(const SSL_SESSION *session, | |
| uint8_t *out, size_t max_out); | |
| // SSL_SESSION_set_time sets `session`'s creation time to `time` and returns | |
| // `time`. This function may be useful in writing tests but otherwise should not | |
| // be used. | |
| OPENSSL_EXPORT uint64_t SSL_SESSION_set_time(SSL_SESSION *session, | |
| uint64_t time); | |
| // SSL_SESSION_set_timeout sets `session`'s timeout to `timeout` and returns | |
| // one. This function may be useful in writing tests but otherwise should not | |
| // be used. | |
| OPENSSL_EXPORT uint32_t SSL_SESSION_set_timeout(SSL_SESSION *session, | |
| uint32_t timeout); | |
| // SSL_SESSION_get0_id_context returns a pointer to a buffer containing | |
| // `session`'s session ID context (see `SSL_CTX_set_session_id_context`) and | |
| // sets `*out_len` to its length. | |
| OPENSSL_EXPORT const uint8_t *SSL_SESSION_get0_id_context( | |
| const SSL_SESSION *session, unsigned *out_len); | |
| // SSL_SESSION_set1_id_context sets `session`'s session ID context (see | |
| // `SSL_CTX_set_session_id_context`) to `sid_ctx`. It returns one on success and | |
| // zero on error. This function may be useful in writing tests but otherwise | |
| // should not be used. | |
| OPENSSL_EXPORT int SSL_SESSION_set1_id_context(SSL_SESSION *session, | |
| const uint8_t *sid_ctx, | |
| size_t sid_ctx_len); | |
| // SSL_SESSION_should_be_single_use returns one if `session` should be | |
| // single-use (TLS 1.3 and later) and zero otherwise. | |
| // | |
| // If this function returns one, clients retain multiple sessions and use each | |
| // only once. This prevents passive observers from correlating connections with | |
| // tickets. See RFC 8446, appendix C.4. If it returns zero, `session` cannot be | |
| // used without leaking a correlator. | |
| OPENSSL_EXPORT int SSL_SESSION_should_be_single_use(const SSL_SESSION *session); | |
| // SSL_SESSION_is_resumable returns one if `session` is complete and contains a | |
| // session ID or ticket. It returns zero otherwise. Note this function does not | |
| // ensure `session` will be resumed. It may be expired, dropped by the server, | |
| // or associated with incompatible parameters. | |
| OPENSSL_EXPORT int SSL_SESSION_is_resumable(const SSL_SESSION *session); | |
| // SSL_SESSION_has_ticket returns one if `session` has a ticket and zero | |
| // otherwise. | |
| OPENSSL_EXPORT int SSL_SESSION_has_ticket(const SSL_SESSION *session); | |
| // SSL_SESSION_get0_ticket sets `*out_ticket` and `*out_len` to `session`'s | |
| // ticket, or NULL and zero if it does not have one. `out_ticket` may be NULL | |
| // if only the ticket length is needed. | |
| OPENSSL_EXPORT void SSL_SESSION_get0_ticket(const SSL_SESSION *session, | |
| const uint8_t **out_ticket, | |
| size_t *out_len); | |
| // SSL_SESSION_set_ticket sets `session`'s ticket to `ticket`. It returns one on | |
| // success and zero on error. This function may be useful in writing tests but | |
| // otherwise should not be used. | |
| OPENSSL_EXPORT int SSL_SESSION_set_ticket(SSL_SESSION *session, | |
| const uint8_t *ticket, | |
| size_t ticket_len); | |
| // SSL_SESSION_get_ticket_lifetime_hint returns ticket lifetime hint of | |
| // `session` in seconds or zero if none was set. | |
| OPENSSL_EXPORT uint32_t | |
| SSL_SESSION_get_ticket_lifetime_hint(const SSL_SESSION *session); | |
| // SSL_SESSION_get0_cipher returns the cipher negotiated by the connection which | |
| // established `session`. | |
| // | |
| // Note that, in TLS 1.3, there is no guarantee that resumptions with `session` | |
| // will use that cipher. Prefer calling `SSL_get_current_cipher` on the `SSL` | |
| // instead. | |
| OPENSSL_EXPORT const SSL_CIPHER *SSL_SESSION_get0_cipher( | |
| const SSL_SESSION *session); | |
| // SSL_SESSION_has_peer_sha256 returns one if `session` has a SHA-256 hash of | |
| // the peer's certificate retained and zero if the peer did not present a | |
| // certificate or if this was not enabled when `session` was created. See also | |
| // `SSL_CTX_set_retain_only_sha256_of_client_certs`. | |
| OPENSSL_EXPORT int SSL_SESSION_has_peer_sha256(const SSL_SESSION *session); | |
| // SSL_SESSION_get0_peer_sha256 sets `*out_ptr` and `*out_len` to the SHA-256 | |
| // hash of the peer certificate retained in `session`, or NULL and zero if it | |
| // does not have one. See also `SSL_CTX_set_retain_only_sha256_of_client_certs`. | |
| OPENSSL_EXPORT void SSL_SESSION_get0_peer_sha256(const SSL_SESSION *session, | |
| const uint8_t **out_ptr, | |
| size_t *out_len); | |
| // SSL_SESSION_is_resumable_across_names returns one if `session` may be resumed | |
| // with any identity in the server certificate and zero otherwise. See | |
| // draft-ietf-tls-cross-sni-resumption. | |
| OPENSSL_EXPORT int SSL_SESSION_is_resumable_across_names( | |
| const SSL_SESSION *session); | |
| // Session caching. | |
| // | |
| // Session caching allows connections to be established more efficiently based | |
| // on saved parameters from a previous connection, called a session (see | |
| // `SSL_SESSION`). The client offers a saved session, using an opaque identifier | |
| // from a previous connection. The server may accept the session, if it has the | |
| // parameters available. Otherwise, it will decline and continue with a full | |
| // handshake. | |
| // | |
| // This requires both the client and the server to retain session state. A | |
| // client does so with a stateful session cache. A server may do the same or, if | |
| // supported by both sides, statelessly using session tickets. For more | |
| // information on the latter, see the next section. | |
| // | |
| // For a server, the library implements a built-in internal session cache as an | |
| // in-memory hash table. Servers may also use `SSL_CTX_sess_set_get_cb` and | |
| // `SSL_CTX_sess_set_new_cb` to implement a custom external session cache. In | |
| // particular, this may be used to share a session cache between multiple | |
| // servers in a large deployment. An external cache may be used in addition to | |
| // or instead of the internal one. Use `SSL_CTX_set_session_cache_mode` to | |
| // toggle the internal cache. | |
| // | |
| // For a client, the only option is an external session cache. Clients may use | |
| // `SSL_CTX_sess_set_new_cb` to register a callback for when new sessions are | |
| // available. These may be cached and, in subsequent compatible connections, | |
| // configured with `SSL_set_session`. | |
| // | |
| // Note that offering or accepting a session short-circuits certificate | |
| // verification and most parameter negotiation. Resuming sessions across | |
| // different contexts may result in security failures and surprising | |
| // behavior. For a typical client, this means sessions for different hosts must | |
| // be cached under different keys. A client that connects to the same host with, | |
| // e.g., different cipher suite settings or client certificates should also use | |
| // separate session caches between those contexts. Servers should also partition | |
| // session caches between SNI hosts with `SSL_CTX_set_session_id_context` or | |
| // `SSL_CREDENTIAL_set1_session_id_context`. | |
| // | |
| // Note also, in TLS 1.2 and earlier, offering sessions allows passive observers | |
| // to correlate different client connections. TLS 1.3 and later fix this, | |
| // provided clients use sessions at most once. Session caches are managed by the | |
| // caller in BoringSSL, so this must be implemented externally. See | |
| // `SSL_SESSION_should_be_single_use` for details. | |
| // SSL_SESS_CACHE_OFF disables all session caching. | |
| #define SSL_SESS_CACHE_OFF 0x0000 | |
| // SSL_SESS_CACHE_CLIENT enables session caching for a client. The internal | |
| // cache is never used on a client, so this only enables the callbacks. | |
| #define SSL_SESS_CACHE_CLIENT 0x0001 | |
| // SSL_SESS_CACHE_SERVER enables session caching for a server. | |
| #define SSL_SESS_CACHE_SERVER 0x0002 | |
| // SSL_SESS_CACHE_BOTH enables session caching for both client and server. | |
| #define SSL_SESS_CACHE_BOTH (SSL_SESS_CACHE_CLIENT | SSL_SESS_CACHE_SERVER) | |
| // SSL_SESS_CACHE_NO_AUTO_CLEAR disables automatically calling | |
| // `SSL_CTX_flush_sessions` every 255 connections. | |
| #define SSL_SESS_CACHE_NO_AUTO_CLEAR 0x0080 | |
| // SSL_SESS_CACHE_NO_INTERNAL_LOOKUP, on a server, disables looking up a session | |
| // from the internal session cache. | |
| #define SSL_SESS_CACHE_NO_INTERNAL_LOOKUP 0x0100 | |
| // SSL_SESS_CACHE_NO_INTERNAL_STORE, on a server, disables storing sessions in | |
| // the internal session cache. | |
| #define SSL_SESS_CACHE_NO_INTERNAL_STORE 0x0200 | |
| // SSL_SESS_CACHE_NO_INTERNAL, on a server, disables the internal session | |
| // cache. | |
| #define SSL_SESS_CACHE_NO_INTERNAL \ | |
| (SSL_SESS_CACHE_NO_INTERNAL_LOOKUP | SSL_SESS_CACHE_NO_INTERNAL_STORE) | |
| // SSL_CTX_set_session_cache_mode sets the session cache mode bits for `ctx` to | |
| // `mode`. It returns the previous value. | |
| OPENSSL_EXPORT int SSL_CTX_set_session_cache_mode(SSL_CTX *ctx, int mode); | |
| // SSL_CTX_get_session_cache_mode returns the session cache mode bits for | |
| // `ctx` | |
| OPENSSL_EXPORT int SSL_CTX_get_session_cache_mode(const SSL_CTX *ctx); | |
| // SSL_set_session, for a client, configures `ssl` to offer to resume `session` | |
| // in the initial handshake and returns one. The caller retains ownership of | |
| // `session`. Note that configuring a session assumes the authentication in the | |
| // session is valid. For callers that wish to revalidate the session before | |
| // offering, see `SSL_SESSION_get0_peer_certificates`, | |
| // `SSL_SESSION_get0_signed_cert_timestamp_list`, and | |
| // `SSL_SESSION_get0_ocsp_response`. | |
| // | |
| // It is an error to call this function after the handshake has begun. | |
| OPENSSL_EXPORT int SSL_set_session(SSL *ssl, SSL_SESSION *session); | |
| // SSL_DEFAULT_SESSION_TIMEOUT is the default lifetime, in seconds, of a | |
| // session in TLS 1.2 or earlier. This is how long we are willing to use the | |
| // secret to encrypt traffic without fresh key material. | |
| #define SSL_DEFAULT_SESSION_TIMEOUT (2 * 60 * 60) | |
| // SSL_DEFAULT_SESSION_PSK_DHE_TIMEOUT is the default lifetime, in seconds, of a | |
| // session for TLS 1.3 psk_dhe_ke. This is how long we are willing to use the | |
| // secret as an authenticator. | |
| #define SSL_DEFAULT_SESSION_PSK_DHE_TIMEOUT (2 * 24 * 60 * 60) | |
| // SSL_DEFAULT_SESSION_AUTH_TIMEOUT is the default non-renewable lifetime, in | |
| // seconds, of a TLS 1.3 session. This is how long we are willing to trust the | |
| // signature in the initial handshake. | |
| #define SSL_DEFAULT_SESSION_AUTH_TIMEOUT (7 * 24 * 60 * 60) | |
| // SSL_CTX_set_timeout sets the lifetime, in seconds, of TLS 1.2 (or earlier) | |
| // sessions created in `ctx` to `timeout`. | |
| OPENSSL_EXPORT uint32_t SSL_CTX_set_timeout(SSL_CTX *ctx, uint32_t timeout); | |
| // SSL_CTX_set_session_psk_dhe_timeout sets the lifetime, in seconds, of TLS 1.3 | |
| // sessions created in `ctx` to `timeout`. | |
| OPENSSL_EXPORT void SSL_CTX_set_session_psk_dhe_timeout(SSL_CTX *ctx, | |
| uint32_t timeout); | |
| // SSL_CTX_get_timeout returns the lifetime, in seconds, of TLS 1.2 (or earlier) | |
| // sessions created in `ctx`. | |
| OPENSSL_EXPORT uint32_t SSL_CTX_get_timeout(const SSL_CTX *ctx); | |
| // SSL_MAX_SID_CTX_LENGTH is the maximum length of a session ID context. | |
| #define SSL_MAX_SID_CTX_LENGTH 32 | |
| // SSL_CTX_set_session_id_context sets `ctx`'s session ID context to `sid_ctx`. | |
| // It returns one on success and zero on error. The session ID context is an | |
| // application-defined opaque byte string used to partition session resumption. | |
| // A session will not be used in a connection without a matching session ID | |
| // context. | |
| // | |
| // See also `SSL_CREDENTIAL_set1_session_id_context`. | |
| OPENSSL_EXPORT int SSL_CTX_set_session_id_context(SSL_CTX *ctx, | |
| const uint8_t *sid_ctx, | |
| size_t sid_ctx_len); | |
| // SSL_set_session_id_context sets `ssl`'s session ID context to `sid_ctx`. It | |
| // returns one on success and zero on error. See also | |
| // `SSL_CTX_set_session_id_context`. | |
| OPENSSL_EXPORT int SSL_set_session_id_context(SSL *ssl, const uint8_t *sid_ctx, | |
| size_t sid_ctx_len); | |
| // SSL_get0_session_id_context returns a pointer to `ssl`'s session ID context | |
| // and sets `*out_len` to its length. It returns NULL on error. | |
| OPENSSL_EXPORT const uint8_t *SSL_get0_session_id_context(const SSL *ssl, | |
| size_t *out_len); | |
| // SSL_SESSION_CACHE_MAX_SIZE_DEFAULT is the default maximum size of a session | |
| // cache. | |
| #define SSL_SESSION_CACHE_MAX_SIZE_DEFAULT (1024 * 20) | |
| // SSL_CTX_sess_set_cache_size sets the maximum size of `ctx`'s internal session | |
| // cache to `size`. It returns the previous value. | |
| OPENSSL_EXPORT unsigned long SSL_CTX_sess_set_cache_size(SSL_CTX *ctx, | |
| unsigned long size); | |
| // SSL_CTX_sess_get_cache_size returns the maximum size of `ctx`'s internal | |
| // session cache. | |
| OPENSSL_EXPORT unsigned long SSL_CTX_sess_get_cache_size(const SSL_CTX *ctx); | |
| // SSL_CTX_sess_number returns the number of sessions in `ctx`'s internal | |
| // session cache. | |
| OPENSSL_EXPORT size_t SSL_CTX_sess_number(const SSL_CTX *ctx); | |
| // SSL_CTX_add_session inserts `session` into `ctx`'s internal session cache. It | |
| // returns one on success and zero on error or if `session` is already in the | |
| // cache. The caller retains its reference to `session`. A `session` can be | |
| // only in one `ctx` at any given time; it is an error to add it to more. | |
| // | |
| // TODO(crbug.com/527997772): Remove this restriction. | |
| OPENSSL_EXPORT int SSL_CTX_add_session(SSL_CTX *ctx, SSL_SESSION *session); | |
| // SSL_CTX_remove_session removes `session` from `ctx`'s internal session cache. | |
| // It returns one on success and zero if `session` was not in the cache. | |
| OPENSSL_EXPORT int SSL_CTX_remove_session(SSL_CTX *ctx, SSL_SESSION *session); | |
| // SSL_CTX_flush_sessions removes all sessions from `ctx` which have expired as | |
| // of time `time`. If `time` is zero, all sessions are removed. | |
| OPENSSL_EXPORT void SSL_CTX_flush_sessions(SSL_CTX *ctx, uint64_t time); | |
| // SSL_new_session_cb is the type of the callback that is called when a new | |
| // session is established and ready to be cached. | |
| typedef int (*SSL_new_session_cb)(SSL *ssl, SSL_SESSION *session); | |
| // SSL_CTX_sess_set_new_cb sets the callback to be called when a new session is | |
| // established and ready to be cached. If the session cache is disabled (the | |
| // appropriate one of `SSL_SESS_CACHE_CLIENT` or `SSL_SESS_CACHE_SERVER` is | |
| // unset), the callback is not called. | |
| // | |
| // The callback is passed a reference to `session`. It returns one if it takes | |
| // ownership (and then calls `SSL_SESSION_free` when done) and zero otherwise. A | |
| // consumer which places `session` into an in-memory cache will likely return | |
| // one, with the cache calling `SSL_SESSION_free`. A consumer which serializes | |
| // `session` with `SSL_SESSION_to_bytes` may not need to retain `session` and | |
| // will likely return zero. Returning one is equivalent to calling | |
| // `SSL_SESSION_up_ref` and then returning zero. | |
| // | |
| // Note: For a client, the callback may be called on abbreviated handshakes if a | |
| // ticket is renewed. Further, it may not be called until some time after | |
| // `SSL_do_handshake` or `SSL_connect` completes if False Start is enabled. Thus | |
| // it's recommended to use this callback over calling `SSL_get_session` on | |
| // handshake completion. | |
| OPENSSL_EXPORT void SSL_CTX_sess_set_new_cb(SSL_CTX *ctx, | |
| SSL_new_session_cb new_session_cb); | |
| // SSL_CTX_sess_get_new_cb returns the callback set by | |
| // `SSL_CTX_sess_set_new_cb`. | |
| OPENSSL_EXPORT SSL_new_session_cb SSL_CTX_sess_get_new_cb(SSL_CTX *ctx); | |
| // SSL_remove_session_cb is the type of the callback that is called when a | |
| // session is removed from the internal session cache. | |
| typedef void (*SSL_remove_session_cb)(SSL_CTX *ctx, SSL_SESSION *session); | |
| // SSL_CTX_sess_set_remove_cb sets a callback which is called when a session is | |
| // removed from the internal session cache. | |
| // | |
| // TODO(davidben): What is the point of this callback? It seems useless since it | |
| // only fires on sessions in the internal cache. | |
| OPENSSL_EXPORT void SSL_CTX_sess_set_remove_cb( | |
| SSL_CTX *ctx, SSL_remove_session_cb remove_session_cb); | |
| // SSL_CTX_sess_get_remove_cb returns the callback set by | |
| // `SSL_CTX_sess_set_remove_cb`. | |
| OPENSSL_EXPORT SSL_remove_session_cb SSL_CTX_sess_get_remove_cb(SSL_CTX *ctx); | |
| // SSL_get_session_cb is the type of the callback that is called to look up a | |
| // session by ID for a server. | |
| typedef SSL_SESSION *(*SSL_get_session_cb)(SSL *ssl, const uint8_t *id, | |
| int id_len, int *out_copy); | |
| // SSL_CTX_sess_set_get_cb sets a callback to look up a session by ID for a | |
| // server. The callback is passed the session ID and should return a matching | |
| // `SSL_SESSION` or NULL if not found. It should set `*out_copy` to zero and | |
| // return a new reference to the session. This callback is not used for a | |
| // client. | |
| // | |
| // For historical reasons, if `*out_copy` is set to one (default), the SSL | |
| // library will take a new reference to the returned `SSL_SESSION`, expecting | |
| // the callback to return a non-owning pointer. This is not recommended. If | |
| // `ctx` and thus the callback is used on multiple threads, the session may be | |
| // removed and invalidated before the SSL library calls `SSL_SESSION_up_ref`, | |
| // whereas the callback may synchronize internally. | |
| // | |
| // To look up a session asynchronously, the callback may return | |
| // `SSL_magic_pending_session_ptr`. See the documentation for that function and | |
| // `SSL_ERROR_PENDING_SESSION`. | |
| // | |
| // If the internal session cache is enabled, the callback is only consulted if | |
| // the internal cache does not return a match. | |
| OPENSSL_EXPORT void SSL_CTX_sess_set_get_cb(SSL_CTX *ctx, | |
| SSL_get_session_cb get_session_cb); | |
| // SSL_CTX_sess_get_get_cb returns the callback set by | |
| // `SSL_CTX_sess_set_get_cb`. | |
| OPENSSL_EXPORT SSL_get_session_cb SSL_CTX_sess_get_get_cb(SSL_CTX *ctx); | |
| // SSL_magic_pending_session_ptr returns a magic `SSL_SESSION`* which indicates | |
| // that the session isn't currently unavailable. `SSL_get_error` will then | |
| // return `SSL_ERROR_PENDING_SESSION` and the handshake can be retried later | |
| // when the lookup has completed. | |
| OPENSSL_EXPORT SSL_SESSION *SSL_magic_pending_session_ptr(void); | |
| // SSL_CTX_set_resumption_across_names_enabled configures whether `ctx`, as a | |
| // TLS 1.3 server, signals its sessions are compatible with any identity in the | |
| // server certificate, e.g. all DNS names in the subjectAlternateNames list. | |
| // This does not change BoringSSL's resumption behavior, only whether it signals | |
| // this to the client. See draft-ietf-tls-cross-sni-resumption. | |
| // | |
| // When this is enabled, all identities in the server certificate should by | |
| // hosted by servers that accept TLS 1.3 tickets issued by `ctx`. The connection | |
| // will otherwise function, but performance may suffer from clients wasting | |
| // single-use tickets. | |
| OPENSSL_EXPORT void SSL_CTX_set_resumption_across_names_enabled(SSL_CTX *ctx, | |
| int enabled); | |
| // SSL_set_resumption_across_names_enabled configures whether `ssl`, as a | |
| // TLS 1.3 server, signals its sessions are compatible with any identity in the | |
| // server certificate, e.g. all DNS names in the subjectAlternateNames list. | |
| // This does not change BoringSSL's resumption behavior, only whether it signals | |
| // this to the client. See draft-ietf-tls-cross-sni-resumption. | |
| // | |
| // When this is enabled, all identities in the server certificate should by | |
| // hosted by servers that accept TLS 1.3 tickets issued by `ssl`. The connection | |
| // will otherwise function, but performance may suffer from clients wasting | |
| // single-use tickets. | |
| OPENSSL_EXPORT void SSL_set_resumption_across_names_enabled(SSL *ssl, | |
| int enabled); | |
| // Session tickets. | |
| // | |
| // Session tickets, from RFC 5077, allow session resumption without server-side | |
| // state. The server maintains a secret ticket key and sends the client opaque | |
| // encrypted session parameters, called a ticket. When offering the session, the | |
| // client sends the ticket which the server decrypts to recover session state. | |
| // Session tickets are enabled by default but may be disabled with | |
| // `SSL_OP_NO_TICKET`. | |
| // | |
| // On the client, ticket-based sessions use the same APIs as ID-based tickets. | |
| // Callers do not need to handle them differently. | |
| // | |
| // On the server, tickets are encrypted and authenticated with a secret key. | |
| // By default, an `SSL_CTX` will manage session ticket encryption keys by | |
| // generating them internally and rotating every 48 hours. Tickets are minted | |
| // and processed transparently. The following functions may be used to configure | |
| // a persistent key or implement more custom behavior, including key rotation | |
| // and sharing keys between multiple servers in a large deployment. There are | |
| // three levels of customisation possible: | |
| // | |
| // 1) One can simply set the keys with `SSL_CTX_set_tlsext_ticket_keys`. | |
| // 2) One can configure an `EVP_CIPHER_CTX` and `HMAC_CTX` directly for | |
| // encryption and authentication. | |
| // 3) One can configure an `SSL_TICKET_AEAD_METHOD` to have more control | |
| // and the option of asynchronous decryption. | |
| // | |
| // An attacker that compromises a server's session ticket key can impersonate | |
| // the server and, prior to TLS 1.3, retroactively decrypt all application | |
| // traffic from sessions using that ticket key. Thus ticket keys must be | |
| // regularly rotated for forward secrecy. Note the default key is rotated | |
| // automatically once every 48 hours but manually configured keys are not. | |
| // SSL_DEFAULT_TICKET_KEY_ROTATION_INTERVAL is the interval with which the | |
| // default session ticket encryption key is rotated, if in use. If any | |
| // non-default ticket encryption mechanism is configured, automatic rotation is | |
| // disabled. | |
| #define SSL_DEFAULT_TICKET_KEY_ROTATION_INTERVAL (2 * 24 * 60 * 60) | |
| // SSL_CTX_get_tlsext_ticket_keys writes `ctx`'s session ticket key material to | |
| // `len` bytes of `out`. It returns one on success and zero if `len` is not | |
| // 48. If `out` is NULL, it returns 48 instead. | |
| OPENSSL_EXPORT int SSL_CTX_get_tlsext_ticket_keys(SSL_CTX *ctx, void *out, | |
| size_t len); | |
| // SSL_CTX_set_tlsext_ticket_keys sets `ctx`'s session ticket key material to | |
| // `len` bytes of `in`. It returns one on success and zero if `len` is not | |
| // 48. If `in` is NULL, it returns 48 instead. | |
| OPENSSL_EXPORT int SSL_CTX_set_tlsext_ticket_keys(SSL_CTX *ctx, const void *in, | |
| size_t len); | |
| // SSL_TICKET_KEY_NAME_LEN is the length of the key name prefix of a session | |
| // ticket. | |
| #define SSL_TICKET_KEY_NAME_LEN 16 | |
| // SSL_CTX_set_tlsext_ticket_key_cb sets the ticket callback to `callback` and | |
| // returns one. `callback` will be called when encrypting a new ticket and when | |
| // decrypting a ticket from the client. | |
| // | |
| // In both modes, `ctx` and `hmac_ctx` will already have been initialized with | |
| // `EVP_CIPHER_CTX_init` and `HMAC_CTX_init`, respectively. `callback` | |
| // configures `hmac_ctx` with an HMAC digest and key, and configures `ctx` | |
| // for encryption or decryption, based on the mode. | |
| // | |
| // When encrypting a new ticket, `encrypt` will be one. It writes a public | |
| // 16-byte key name to `key_name` and a fresh IV to `iv`. The output IV length | |
| // must match `EVP_CIPHER_CTX_iv_length` of the cipher selected. In this mode, | |
| // `callback` returns 1 on success, 0 to decline sending a ticket, and -1 on | |
| // error. | |
| // | |
| // When decrypting a ticket, `encrypt` will be zero. `key_name` will point to a | |
| // 16-byte key name and `iv` points to an IV. The length of the IV consumed must | |
| // match `EVP_CIPHER_CTX_iv_length` of the cipher selected. In this mode, | |
| // `callback` returns -1 to abort the handshake, 0 if the ticket key was | |
| // unrecognized, and 1 or 2 on success. If it returns 2, the ticket will be | |
| // renewed. This may be used to re-key the ticket. | |
| // | |
| // WARNING: `callback` wildly breaks the usual return value convention and is | |
| // called in two different modes. | |
| OPENSSL_EXPORT int SSL_CTX_set_tlsext_ticket_key_cb( | |
| SSL_CTX *ctx, | |
| int (*callback)(SSL *ssl, uint8_t *key_name, uint8_t *iv, | |
| EVP_CIPHER_CTX *ctx, HMAC_CTX *hmac_ctx, int encrypt)); | |
| // ssl_ticket_aead_result_t enumerates the possible results from decrypting a | |
| // ticket with an `SSL_TICKET_AEAD_METHOD`. | |
| enum ssl_ticket_aead_result_t BORINGSSL_ENUM_INT { | |
| // ssl_ticket_aead_success indicates that the ticket was successfully | |
| // decrypted. | |
| ssl_ticket_aead_success, | |
| // ssl_ticket_aead_retry indicates that the operation could not be | |
| // immediately completed and must be reattempted, via `open`, at a later | |
| // point. | |
| ssl_ticket_aead_retry, | |
| // ssl_ticket_aead_ignore_ticket indicates that the ticket should be ignored | |
| // (i.e. is corrupt or otherwise undecryptable). | |
| ssl_ticket_aead_ignore_ticket, | |
| // ssl_ticket_aead_error indicates that a fatal error occurred and the | |
| // handshake should be terminated. | |
| ssl_ticket_aead_error, | |
| }; | |
| // ssl_ticket_aead_method_st (aka `SSL_TICKET_AEAD_METHOD`) contains methods | |
| // for encrypting and decrypting session tickets. | |
| struct ssl_ticket_aead_method_st { | |
| // max_overhead returns the maximum number of bytes of overhead that `seal` | |
| // may add. | |
| size_t (*max_overhead)(SSL *ssl); | |
| // seal encrypts and authenticates `in_len` bytes from `in`, writes, at most, | |
| // `max_out_len` bytes to `out`, and puts the number of bytes written in | |
| // `*out_len`. The `in` and `out` buffers may be equal but will not otherwise | |
| // alias. It returns one on success or zero on error. If the function returns | |
| // but `*out_len` is zero, BoringSSL will skip sending a ticket. | |
| int (*seal)(SSL *ssl, uint8_t *out, size_t *out_len, size_t max_out_len, | |
| const uint8_t *in, size_t in_len); | |
| // open authenticates and decrypts `in_len` bytes from `in`, writes, at most, | |
| // `max_out_len` bytes of plaintext to `out`, and puts the number of bytes | |
| // written in `*out_len`. The `in` and `out` buffers may be equal but will | |
| // not otherwise alias. See `ssl_ticket_aead_result_t` for details of the | |
| // return values. In the case that a retry is indicated, the caller should | |
| // arrange for the high-level operation on `ssl` to be retried when the | |
| // operation is completed, which will result in another call to `open`. | |
| enum ssl_ticket_aead_result_t (*open)(SSL *ssl, uint8_t *out, size_t *out_len, | |
| size_t max_out_len, const uint8_t *in, | |
| size_t in_len); | |
| }; | |
| // SSL_CTX_set_ticket_aead_method configures a custom ticket AEAD method table | |
| // on `ctx`. `aead_method` must remain valid for the lifetime of `ctx`. | |
| OPENSSL_EXPORT void SSL_CTX_set_ticket_aead_method( | |
| SSL_CTX *ctx, const SSL_TICKET_AEAD_METHOD *aead_method); | |
| // SSL_process_tls13_new_session_ticket processes an unencrypted TLS 1.3 | |
| // NewSessionTicket message from `buf` and returns a resumable `SSL_SESSION`, | |
| // or NULL on error. The caller takes ownership of the returned session and | |
| // must call `SSL_SESSION_free` to free it. | |
| // | |
| // `buf` contains `buf_len` bytes that represents a complete NewSessionTicket | |
| // message including its header, i.e., one byte for the type (0x04) and three | |
| // bytes for the length. `buf` must contain only one such message. | |
| // | |
| // This function may be used to process NewSessionTicket messages in TLS 1.3 | |
| // clients that are handling the record layer externally. | |
| OPENSSL_EXPORT SSL_SESSION *SSL_process_tls13_new_session_ticket( | |
| SSL *ssl, const uint8_t *buf, size_t buf_len); | |
| // SSL_CTX_set_num_tickets configures `ctx` to send `num_tickets` immediately | |
| // after a successful TLS 1.3 handshake as a server. It returns one. Large | |
| // values of `num_tickets` will be capped within the library. | |
| // | |
| // By default, BoringSSL sends two tickets. | |
| OPENSSL_EXPORT int SSL_CTX_set_num_tickets(SSL_CTX *ctx, size_t num_tickets); | |
| // SSL_CTX_get_num_tickets returns the number of tickets `ctx` will send | |
| // immediately after a successful TLS 1.3 handshake as a server. | |
| OPENSSL_EXPORT size_t SSL_CTX_get_num_tickets(const SSL_CTX *ctx); | |
| // Diffie-Hellman groups and ephemeral key exchanges. | |
| // | |
| // Most TLS handshakes (ECDHE cipher suites in TLS 1.2, and all supported TLS | |
| // 1.3 modes) incorporate an ephemeral key exchange, most commonly using | |
| // Elliptic Curve Diffie-Hellman (ECDH), as described in RFC 8422. The key | |
| // exchange algorithm is negotiated separately from the cipher suite, using | |
| // NamedGroup values, which define Diffie-Hellman groups. | |
| // | |
| // Historically, these values were known as "curves", in reference to ECDH, and | |
| // some APIs refer to the original name. RFC 7919 renamed them to "groups" in | |
| // reference to Diffie-Hellman in general. These values are also used to select | |
| // experimental post-quantum KEMs. Though not Diffie-Hellman groups, KEMs can | |
| // fill a similar role in TLS, so they use the same codepoints. | |
| // | |
| // In TLS 1.2, the ECDH values also negotiate elliptic curves used in ECDSA. In | |
| // TLS 1.3 and later, ECDSA curves are part of the signature algorithm. See | |
| // `SSL_SIGN_*`. | |
| // SSL_GROUP_* define TLS group IDs. | |
| #define SSL_GROUP_SECP256R1 23 | |
| #define SSL_GROUP_SECP384R1 24 | |
| #define SSL_GROUP_SECP521R1 25 | |
| #define SSL_GROUP_X25519 29 | |
| #define SSL_GROUP_X25519_MLKEM768 0x11ec | |
| #define SSL_GROUP_MLKEM1024 0x0202 | |
| // SSL_CTX_set1_group_ids sets the preferred groups for `ctx` to `group_ids`. | |
| // Each element of `group_ids` should be a unique one of the `SSL_GROUP_*` | |
| // constants. If `group_ids` is empty, a default list will be set instead. It | |
| // returns one on success and zero on failure. | |
| OPENSSL_EXPORT int SSL_CTX_set1_group_ids(SSL_CTX *ctx, | |
| const uint16_t *group_ids, | |
| size_t num_group_ids); | |
| // SSL_set1_group_ids sets the preferred groups for `ssl` to `group_ids`. Each | |
| // element of `group_ids` should be a unique one of the `SSL_GROUP_*` constants. | |
| // If `group_ids` is empty, a default list will be set instead. It returns one | |
| // on success and zero on failure. | |
| OPENSSL_EXPORT int SSL_set1_group_ids(SSL *ssl, const uint16_t *group_ids, | |
| size_t num_group_ids); | |
| // SSL_GROUP_FLAG_* define flags used with SSL_CTX_set1_group_ids_with_flags | |
| // and SSL_set1_group_ids_with_flags. | |
| // | |
| // If configuring a server, SSL_GROUP_FLAG_EQUAL_PREFERENCE_WITH_NEXT indicates | |
| // that the corresponding group has equal preference with the next member of the | |
| // list of groups being configured. Assigning equal preference to a range of | |
| // consecutively listed groups allows a server to partially respect the | |
| // client's preferences when `SSL_OP_CIPHER_SERVER_PREFERENCE` is enabled. | |
| #define SSL_GROUP_FLAG_EQUAL_PREFERENCE_WITH_NEXT 0x01 | |
| // SSL_CTX_set1_group_ids_with_flags sets the preferred groups for `ctx` to | |
| // `group_ids`, using the corresponding `flags` for each element, which is a set | |
| // of SSL_GROUP_FLAG_* values ORed together. Each element of `group_ids` should | |
| // be a unique one of the `SSL_GROUP_*` constants. If `group_ids` is empty, a | |
| // default list of groups and flags defaulting to zero will be set instead. | |
| // `group_ids` and `flags` should both have `num_group_ids` elements. It returns | |
| // one on success and zero on failure. | |
| OPENSSL_EXPORT int SSL_CTX_set1_group_ids_with_flags(SSL_CTX *ctx, | |
| const uint16_t *group_ids, | |
| const uint32_t *flags, | |
| size_t num_group_ids); | |
| // SSL_set1_group_ids_with_flags sets the preferred groups for `ssl` to | |
| // `group_ids`, using the corresponding `flags` for each element, which is a set | |
| // of SSL_GROUP_FLAG_* values ORed together. Each element of `group_ids` should | |
| // be a unique one of the `SSL_GROUP_*` constants. If `group_ids` is empty, a | |
| // default list of groups and flags defaulting to zero will be set instead. | |
| // `group_ids` and `flags` should both have `num_group_ids` elements. It | |
| // returns one on success and zero on failure. | |
| OPENSSL_EXPORT int SSL_set1_group_ids_with_flags(SSL *ssl, | |
| const uint16_t *group_ids, | |
| const uint32_t *flags, | |
| size_t num_group_ids); | |
| // SSL_get_group_id returns the ID of the group used by `ssl`'s most recently | |
| // completed handshake, or 0 if not applicable. | |
| OPENSSL_EXPORT uint16_t SSL_get_group_id(const SSL *ssl); | |
| // SSL_get_group_name returns a human-readable name for the group specified by | |
| // the given TLS group ID, or NULL if the group is unknown. | |
| // The group name is always an ASCII string. | |
| OPENSSL_EXPORT const char *SSL_get_group_name(uint16_t group_id); | |
| // SSL_get_all_group_names outputs a list of possible strings | |
| // `SSL_get_group_name` may return in this version of BoringSSL. It writes at | |
| // most `max_out` entries to `out` and returns the total number it would have | |
| // written, if `max_out` had been large enough. `max_out` may be initially set | |
| // to zero to size the output. | |
| // | |
| // This function is only intended to help initialize tables in callers that want | |
| // possible strings pre-declared. This list would not be suitable to set a list | |
| // of supported features. It is in no particular order, and may contain | |
| // placeholder, experimental, or deprecated values that do not apply to every | |
| // caller. Future versions of BoringSSL may also return strings not in this | |
| // list, so this does not apply if, say, sending strings across services. | |
| // The strings are always ASCII-encoded. | |
| OPENSSL_EXPORT size_t SSL_get_all_group_names(const char **out, size_t max_out); | |
| // The following APIs also configure Diffie-Hellman groups, but use `NID_*` | |
| // constants instead of `SSL_GROUP_*` constants. These are provided for OpenSSL | |
| // compatibility. Where NIDs are unstable constants specific to OpenSSL and | |
| // BoringSSL, group IDs are defined by the TLS protocol. Prefer the group ID | |
| // representation if storing persistently, or exporting to another process or | |
| // library. | |
| // SSL_CTX_set1_groups sets the preferred groups for `ctx` to be `groups`. Each | |
| // element of `groups` should be a unique `NID_*` constant from nid.h. If | |
| // `groups` is empty, a default list will be set instead. It returns one on | |
| // success and zero on failure. | |
| OPENSSL_EXPORT int SSL_CTX_set1_groups(SSL_CTX *ctx, const int *groups, | |
| size_t num_groups); | |
| // SSL_set1_groups sets the preferred groups for `ssl` to be `groups`. Each | |
| // element of `groups` should be a unique `NID_*` constant from nid.h. If | |
| // `groups` is empty, a default list will be set instead. It returns one on | |
| // success and zero on failure. | |
| OPENSSL_EXPORT int SSL_set1_groups(SSL *ssl, const int *groups, | |
| size_t num_groups); | |
| // SSL_CTX_set1_groups_list decodes `groups` as a non-empty colon-separated list | |
| // of group names (e.g. "X25519" or "P-256") and sets `ctx`'s preferred groups | |
| // to the result. The list must not contain duplicates. It returns one on | |
| // success and zero on failure. | |
| OPENSSL_EXPORT int SSL_CTX_set1_groups_list(SSL_CTX *ctx, const char *groups); | |
| // SSL_set1_groups_list decodes `groups` as a non-empty colon-separated list of | |
| // group names (e.g. "X25519" or "P-256") and sets `ssl`'s preferred groups to | |
| // the result. The list must not contain duplicates. It returns one on success | |
| // and zero on failure. | |
| OPENSSL_EXPORT int SSL_set1_groups_list(SSL *ssl, const char *groups); | |
| // SSL_get_negotiated_group returns the NID of the group used by `ssl`'s most | |
| // recently completed handshake, or `NID_undef` if not applicable. | |
| OPENSSL_EXPORT int SSL_get_negotiated_group(const SSL *ssl); | |
| // Client key shares. | |
| // | |
| // The key_share extension in TLS 1.3 (RFC 8446 section 4.2.8) may be sent in | |
| // the initial ClientHello to provide key exchange parameters for a subset of | |
| // the groups offered in the client's supported_groups extension, in hopes of | |
| // saving a round-trip by having proactively started a key exchange for the | |
| // ultimately-negotiated group. | |
| // | |
| // If not otherwise configured, the default client key share selection logic | |
| // outputs key shares for up to two supported groups, at most one of which is | |
| // post-quantum. | |
| // SSL_set1_client_key_shares, when called by a client before the handshake, | |
| // configures `ssl` to send a key_share extension in the initial ClientHello | |
| // containing exactly the groups given by `group_ids`, in the order given. Each | |
| // member of `group_ids` should be one of the `SSL_GROUP_*` constants, and they | |
| // must be unique. This function returns one on success and zero on failure. | |
| // | |
| // If non-empty, the sequence of `group_ids` must be a (not necessarily | |
| // contiguous) subsequence of the groups supported by `ssl`, which may have been | |
| // configured explicitly on `ssl` or its context, or populated by default. | |
| // Caller should finish configuring the group list before calling this function. | |
| // Changing the supported groups for `ssl` after having set client key shares | |
| // will result in the key share selections being reset if this constraint no | |
| // longer holds. | |
| // | |
| // Setting an empty sequence of `group_ids` results in an empty client | |
| // key_share, which will cause the handshake to always take an extra round-trip | |
| // for HelloRetryRequest. | |
| // | |
| // An extra round-trip will be needed if the server's choice of group is not | |
| // among the key shares sent; conversely, sending any key shares other than the | |
| // server's choice wastes CPU and bandwidth (the latter is particularly costly | |
| // for post-quantum key exchanges). To avoid these sub-optimal outcomes, | |
| // key shares should be chosen such that they are likely to be supported by the | |
| // peer server. | |
| OPENSSL_EXPORT int SSL_set1_client_key_shares(SSL *ssl, | |
| const uint16_t *group_ids, | |
| size_t num_group_ids); | |
| // SSL_set1_server_supported_groups_hint, when `ssl` is a client, indicates that | |
| // the server is likely to support groups listed in `server_groups`, in order of | |
| // decreasing server preference. This function returns one on success and zero | |
| // on error. This may be used when receiving a server hint, such as described in | |
| // draft-ietf-tls-key-share-prediction. | |
| // | |
| // If called, `ssl` will try to predict the server's selected named group based | |
| // on `ssl`'s local preferences and `server_groups`. If it predicts a group, it | |
| // will then send an initial ClientHello with key_share extension containing | |
| // only this prediction. In this case, the prediction will supersede any | |
| // configuration from `SSL_set1_client_key_shares`. This is a convenience | |
| // function so that callers do not need to process the server preference list | |
| // themselves. | |
| // | |
| // Groups listed in `server_groups` should be identified by their TLS group IDs, | |
| // such as the `SSL_GROUP_*` constants. A server may implement groups not known | |
| // to BoringSSL, so `server_groups` may contain unrecognized group IDs. If so, | |
| // this function will ignore them. | |
| OPENSSL_EXPORT int SSL_set1_server_supported_groups_hint( | |
| SSL *ssl, const uint16_t *server_groups, size_t num_server_groups); | |
| // Certificate verification. | |
| // | |
| // SSL may authenticate either endpoint with an X.509 certificate. Typically | |
| // this is used to authenticate the server to the client. These functions | |
| // configure certificate verification. | |
| // | |
| // WARNING: By default, certificate verification errors on a client are not | |
| // fatal. See `SSL_VERIFY_NONE` This may be configured with | |
| // `SSL_CTX_set_verify`. | |
| // | |
| // By default clients are anonymous but a server may request a certificate from | |
| // the client by setting `SSL_VERIFY_PEER`. | |
| // | |
| // Many of these functions use OpenSSL's legacy X.509 stack which is | |
| // underdocumented and deprecated, but the replacement isn't ready yet. For | |
| // now, consumers may use the existing stack or bypass it by performing | |
| // certificate verification externally. This may be done with | |
| // `SSL_CTX_set_cert_verify_callback` or by extracting the chain with | |
| // `SSL_get_peer_cert_chain` after the handshake. In the future, functions will | |
| // be added to use the SSL stack without dependency on any part of the legacy | |
| // X.509 and ASN.1 stack. | |
| // | |
| // To augment certificate verification, a client may also enable OCSP stapling | |
| // (RFC 6066) and Certificate Transparency (RFC 6962) extensions. | |
| // SSL_VERIFY_NONE, on a client, verifies the server certificate but does not | |
| // make errors fatal. The result may be checked with `SSL_get_verify_result`. On | |
| // a server it does not request a client certificate. This is the default. | |
| #define SSL_VERIFY_NONE 0x00 | |
| // SSL_VERIFY_PEER, on a client, makes server certificate errors fatal. On a | |
| // server it requests a client certificate and makes errors fatal. However, | |
| // anonymous clients are still allowed. See | |
| // `SSL_VERIFY_FAIL_IF_NO_PEER_CERT`. | |
| #define SSL_VERIFY_PEER 0x01 | |
| // SSL_VERIFY_FAIL_IF_NO_PEER_CERT configures a server to reject connections if | |
| // the client declines to send a certificate. This flag must be used together | |
| // with `SSL_VERIFY_PEER`, otherwise it won't work. | |
| #define SSL_VERIFY_FAIL_IF_NO_PEER_CERT 0x02 | |
| // SSL_CTX_set_verify configures certificate verification behavior. `mode` is | |
| // one of the `SSL_VERIFY_*` values defined above. `callback` should be NULL. | |
| // | |
| // If `callback` is non-NULL, it is called as in `X509_STORE_CTX_set_verify_cb`, | |
| // which is a deprecated and fragile mechanism to run the default certificate | |
| // verification process, but suppress individual errors in it. See | |
| // `X509_STORE_CTX_set_verify_cb` for details, If set, the callback may use | |
| // `SSL_get_ex_data_X509_STORE_CTX_idx` with `X509_STORE_CTX_get_ex_data` to | |
| // look up the `SSL` from `store_ctx`. | |
| // | |
| // WARNING: `callback` is not suitable for implementing custom certificate | |
| // check, accepting all certificates, or extracting the certificate after | |
| // verification. It does not replace the default process and is called multiple | |
| // times throughout that process. It is also very difficult to implement this | |
| // callback safely, without inadvertently relying on implementation details or | |
| // making incorrect assumptions about when the callback is called. | |
| // | |
| // Instead, use `SSL_CTX_set_custom_verify` or | |
| // `SSL_CTX_set_cert_verify_callback` to customize certificate verification. | |
| // Those callbacks can inspect the peer-sent chain, call `X509_verify_cert` and | |
| // inspect the result, or perform other operations more straightforwardly. | |
| OPENSSL_EXPORT void SSL_CTX_set_verify( | |
| SSL_CTX *ctx, int mode, int (*callback)(int ok, X509_STORE_CTX *store_ctx)); | |
| // SSL_set_verify configures certificate verification behavior. `mode` is one of | |
| // the `SSL_VERIFY_*` values defined above. `callback` should be NULL. | |
| // | |
| // If `callback` is non-NULL, it is called as in `X509_STORE_CTX_set_verify_cb`, | |
| // which is a deprecated and fragile mechanism to run the default certificate | |
| // verification process, but suppress individual errors in it. See | |
| // `X509_STORE_CTX_set_verify_cb` for details, If set, the callback may use | |
| // `SSL_get_ex_data_X509_STORE_CTX_idx` with `X509_STORE_CTX_get_ex_data` to | |
| // look up the `SSL` from `store_ctx`. | |
| // | |
| // WARNING: `callback` is not suitable for implementing custom certificate | |
| // check, accepting all certificates, or extracting the certificate after | |
| // verification. It does not replace the default process and is called multiple | |
| // times throughout that process. It is also very difficult to implement this | |
| // callback safely, without inadvertently relying on implementation details or | |
| // making incorrect assumptions about when the callback is called. | |
| // | |
| // Instead, use `SSL_set_custom_verify` or `SSL_set_cert_verify_callback` to | |
| // customize certificate verification. Those callbacks can inspect the peer-sent | |
| // chain, call `X509_verify_cert` and inspect the result, or perform other | |
| // operations more straightforwardly. | |
| OPENSSL_EXPORT void SSL_set_verify(SSL *ssl, int mode, | |
| int (*callback)(int ok, | |
| X509_STORE_CTX *store_ctx)); | |
| enum ssl_verify_result_t BORINGSSL_ENUM_INT { | |
| ssl_verify_ok, | |
| ssl_verify_invalid, | |
| ssl_verify_retry, | |
| }; | |
| // SSL_CTX_set_custom_verify configures certificate verification. `mode` is one | |
| // of the `SSL_VERIFY_*` values defined above. `callback` performs the | |
| // certificate verification. | |
| // | |
| // The callback may call `SSL_get0_peer_certificates` for the certificate chain | |
| // to validate. The callback should return `ssl_verify_ok` if the certificate is | |
| // valid. If the certificate is invalid, the callback should return | |
| // `ssl_verify_invalid` and optionally set `*out_alert` to an alert to send to | |
| // the peer. Some useful alerts include `SSL_AD_CERTIFICATE_EXPIRED`, | |
| // `SSL_AD_CERTIFICATE_REVOKED`, `SSL_AD_UNKNOWN_CA`, `SSL_AD_BAD_CERTIFICATE`, | |
| // `SSL_AD_CERTIFICATE_UNKNOWN`, and `SSL_AD_INTERNAL_ERROR`. See RFC 5246 | |
| // section 7.2.2 for their precise meanings. If unspecified, | |
| // `SSL_AD_CERTIFICATE_UNKNOWN` will be sent by default. | |
| // | |
| // To verify a certificate asynchronously, the callback may return | |
| // `ssl_verify_retry`. The handshake will then pause with `SSL_get_error` | |
| // returning `SSL_ERROR_WANT_CERTIFICATE_VERIFY`. | |
| OPENSSL_EXPORT void SSL_CTX_set_custom_verify( | |
| SSL_CTX *ctx, int mode, | |
| enum ssl_verify_result_t (*callback)(SSL *ssl, uint8_t *out_alert)); | |
| // SSL_set_custom_verify behaves like `SSL_CTX_set_custom_verify` but configures | |
| // an individual `SSL`. | |
| OPENSSL_EXPORT void SSL_set_custom_verify( | |
| SSL *ssl, int mode, | |
| enum ssl_verify_result_t (*callback)(SSL *ssl, uint8_t *out_alert)); | |
| // SSL_CTX_get_verify_mode returns `ctx`'s verify mode, set by | |
| // `SSL_CTX_set_verify`. | |
| OPENSSL_EXPORT int SSL_CTX_get_verify_mode(const SSL_CTX *ctx); | |
| // SSL_get_verify_mode returns `ssl`'s verify mode, set by `SSL_CTX_set_verify` | |
| // or `SSL_set_verify`. It returns -1 on error. | |
| OPENSSL_EXPORT int SSL_get_verify_mode(const SSL *ssl); | |
| // SSL_CTX_get_verify_callback returns the callback set by | |
| // `SSL_CTX_set_verify`. | |
| OPENSSL_EXPORT int (*SSL_CTX_get_verify_callback(const SSL_CTX *ctx))( | |
| int ok, X509_STORE_CTX *store_ctx); | |
| // SSL_get_verify_callback returns the callback set by `SSL_CTX_set_verify` or | |
| // `SSL_set_verify`. | |
| OPENSSL_EXPORT int (*SSL_get_verify_callback(const SSL *ssl))( | |
| int ok, X509_STORE_CTX *store_ctx); | |
| // SSL_set1_host sets a DNS name that will be required to be present in the | |
| // verified leaf certificate. It returns one on success and zero on error. | |
| // | |
| // Note: unless _some_ name checking is performed, certificate validation is | |
| // ineffective. Simply checking that a host has some certificate from a CA is | |
| // rarely meaningful—you have to check that the CA believed that the host was | |
| // who you expect to be talking to. | |
| // | |
| // By default, both subject alternative names and the subject's common name | |
| // attribute are checked. The latter has long been deprecated, so callers should | |
| // call `SSL_set_hostflags` with `X509_CHECK_FLAG_NEVER_CHECK_SUBJECT` to use | |
| // the standard behavior. https://crbug.com/boringssl/464 tracks fixing the | |
| // default. | |
| OPENSSL_EXPORT int SSL_set1_host(SSL *ssl, const char *hostname); | |
| // SSL_set_hostflags calls `X509_VERIFY_PARAM_set_hostflags` on the | |
| // `X509_VERIFY_PARAM` associated with this `SSL*`. `flags` should be some | |
| // combination of the `X509_CHECK_*` constants. | |
| OPENSSL_EXPORT void SSL_set_hostflags(SSL *ssl, unsigned flags); | |
| // SSL_CTX_set_verify_depth sets the maximum depth of a certificate chain | |
| // accepted in verification. This count excludes both the target certificate and | |
| // the trust anchor (root certificate). | |
| OPENSSL_EXPORT void SSL_CTX_set_verify_depth(SSL_CTX *ctx, int depth); | |
| // SSL_set_verify_depth sets the maximum depth of a certificate chain accepted | |
| // in verification. This count excludes both the target certificate and the | |
| // trust anchor (root certificate). | |
| OPENSSL_EXPORT void SSL_set_verify_depth(SSL *ssl, int depth); | |
| // SSL_CTX_get_verify_depth returns the maximum depth of a certificate accepted | |
| // in verification. | |
| OPENSSL_EXPORT int SSL_CTX_get_verify_depth(const SSL_CTX *ctx); | |
| // SSL_get_verify_depth returns the maximum depth of a certificate accepted in | |
| // verification. | |
| OPENSSL_EXPORT int SSL_get_verify_depth(const SSL *ssl); | |
| // SSL_CTX_set1_param sets verification parameters from `param`. It returns one | |
| // on success and zero on failure. The caller retains ownership of `param`. | |
| OPENSSL_EXPORT int SSL_CTX_set1_param(SSL_CTX *ctx, | |
| const X509_VERIFY_PARAM *param); | |
| // SSL_set1_param sets verification parameters from `param`. It returns one on | |
| // success and zero on failure. The caller retains ownership of `param`. | |
| OPENSSL_EXPORT int SSL_set1_param(SSL *ssl, const X509_VERIFY_PARAM *param); | |
| // SSL_CTX_get0_param returns `ctx`'s `X509_VERIFY_PARAM` for certificate | |
| // verification. The caller must not release the returned pointer but may call | |
| // functions on it to configure it. | |
| OPENSSL_EXPORT X509_VERIFY_PARAM *SSL_CTX_get0_param(SSL_CTX *ctx); | |
| // SSL_get0_param returns `ssl`'s `X509_VERIFY_PARAM` for certificate | |
| // verification. The caller must not release the returned pointer but may call | |
| // functions on it to configure it. | |
| OPENSSL_EXPORT X509_VERIFY_PARAM *SSL_get0_param(SSL *ssl); | |
| // SSL_CTX_set_purpose sets `ctx`'s `X509_VERIFY_PARAM`'s 'purpose' parameter to | |
| // `purpose`. It returns one on success and zero on error. | |
| OPENSSL_EXPORT int SSL_CTX_set_purpose(SSL_CTX *ctx, int purpose); | |
| // SSL_set_purpose sets `ssl`'s `X509_VERIFY_PARAM`'s 'purpose' parameter to | |
| // `purpose`. It returns one on success and zero on error. | |
| OPENSSL_EXPORT int SSL_set_purpose(SSL *ssl, int purpose); | |
| // SSL_CTX_set_trust sets `ctx`'s `X509_VERIFY_PARAM`'s 'trust' parameter to | |
| // `trust`. It returns one on success and zero on error. | |
| OPENSSL_EXPORT int SSL_CTX_set_trust(SSL_CTX *ctx, int trust); | |
| // SSL_set_trust sets `ssl`'s `X509_VERIFY_PARAM`'s 'trust' parameter to | |
| // `trust`. It returns one on success and zero on error. | |
| OPENSSL_EXPORT int SSL_set_trust(SSL *ssl, int trust); | |
| // SSL_CTX_set_cert_store sets `ctx`'s certificate store to `store`. It takes | |
| // ownership of `store`. The store is used for certificate verification. | |
| // | |
| // The store is also used for the auto-chaining feature, but this is deprecated. | |
| // See also `SSL_MODE_NO_AUTO_CHAIN`. | |
| OPENSSL_EXPORT void SSL_CTX_set_cert_store(SSL_CTX *ctx, X509_STORE *store); | |
| // SSL_CTX_get_cert_store returns `ctx`'s certificate store. | |
| OPENSSL_EXPORT X509_STORE *SSL_CTX_get_cert_store(const SSL_CTX *ctx); | |
| // SSL_CTX_set_default_verify_paths calls `X509_STORE_set_default_paths` on | |
| // `ctx`'s store. See that function for details. | |
| // | |
| // Using this function is not recommended. In OpenSSL, these defaults are | |
| // determined by OpenSSL's install prefix. There is no corresponding concept for | |
| // BoringSSL. Future versions of BoringSSL may change or remove this | |
| // functionality. | |
| OPENSSL_EXPORT int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx); | |
| // SSL_CTX_load_verify_locations calls `X509_STORE_load_locations` on `ctx`'s | |
| // store. See that function for details. | |
| OPENSSL_EXPORT int SSL_CTX_load_verify_locations(SSL_CTX *ctx, | |
| const char *ca_file, | |
| const char *ca_dir); | |
| // SSL_get_verify_result returns the result of certificate verification. It is | |
| // either `X509_V_OK` or a `X509_V_ERR_*` value. | |
| OPENSSL_EXPORT long SSL_get_verify_result(const SSL *ssl); | |
| // SSL_alert_from_verify_result returns the SSL alert code, such as | |
| // `SSL_AD_CERTIFICATE_EXPIRED`, that corresponds to an `X509_V_ERR_*` value. | |
| // The return value is always an alert, even when `result` is `X509_V_OK`. | |
| OPENSSL_EXPORT int SSL_alert_from_verify_result(long result); | |
| // SSL_get_ex_data_X509_STORE_CTX_idx returns the ex_data index used to look up | |
| // the `SSL` associated with an `X509_STORE_CTX` in the verify callback. | |
| OPENSSL_EXPORT int SSL_get_ex_data_X509_STORE_CTX_idx(void); | |
| // SSL_CTX_set_cert_verify_callback sets a custom callback to be called on | |
| // certificate verification rather than `X509_verify_cert`. `store_ctx` contains | |
| // the verification parameters. The callback should return one on success and | |
| // zero on fatal error. It may use `X509_STORE_CTX_set_error` to set a | |
| // verification result. | |
| // | |
| // The callback may use `SSL_get_ex_data_X509_STORE_CTX_idx` to recover the | |
| // `SSL` object from `store_ctx`. | |
| OPENSSL_EXPORT void SSL_CTX_set_cert_verify_callback( | |
| SSL_CTX *ctx, int (*callback)(X509_STORE_CTX *store_ctx, void *arg), | |
| void *arg); | |
| // SSL_enable_signed_cert_timestamps causes `ssl` (which must be the client end | |
| // of a connection) to request SCTs from the server. See | |
| // https://tools.ietf.org/html/rfc6962. | |
| // | |
| // Call `SSL_get0_signed_cert_timestamp_list` to recover the SCT after the | |
| // handshake. | |
| OPENSSL_EXPORT void SSL_enable_signed_cert_timestamps(SSL *ssl); | |
| // SSL_CTX_enable_signed_cert_timestamps enables SCT requests on all client SSL | |
| // objects created from `ctx`. | |
| // | |
| // Call `SSL_get0_signed_cert_timestamp_list` to recover the SCT after the | |
| // handshake. | |
| OPENSSL_EXPORT void SSL_CTX_enable_signed_cert_timestamps(SSL_CTX *ctx); | |
| // SSL_enable_ocsp_stapling causes `ssl` (which must be the client end of a | |
| // connection) to request a stapled OCSP response from the server. | |
| // | |
| // Call `SSL_get0_ocsp_response` to recover the OCSP response after the | |
| // handshake. | |
| OPENSSL_EXPORT void SSL_enable_ocsp_stapling(SSL *ssl); | |
| // SSL_CTX_enable_ocsp_stapling enables OCSP stapling on all client SSL objects | |
| // created from `ctx`. | |
| // | |
| // Call `SSL_get0_ocsp_response` to recover the OCSP response after the | |
| // handshake. | |
| OPENSSL_EXPORT void SSL_CTX_enable_ocsp_stapling(SSL_CTX *ctx); | |
| // SSL_CTX_set0_verify_cert_store sets an `X509_STORE` that will be used | |
| // exclusively for certificate verification and returns one. Ownership of | |
| // `store` is transferred to the `SSL_CTX`. | |
| OPENSSL_EXPORT int SSL_CTX_set0_verify_cert_store(SSL_CTX *ctx, | |
| X509_STORE *store); | |
| // SSL_CTX_set1_verify_cert_store sets an `X509_STORE` that will be used | |
| // exclusively for certificate verification and returns one. An additional | |
| // reference to `store` will be taken. | |
| OPENSSL_EXPORT int SSL_CTX_set1_verify_cert_store(SSL_CTX *ctx, | |
| X509_STORE *store); | |
| // SSL_set0_verify_cert_store sets an `X509_STORE` that will be used | |
| // exclusively for certificate verification and returns one. Ownership of | |
| // `store` is transferred to the `SSL`. | |
| OPENSSL_EXPORT int SSL_set0_verify_cert_store(SSL *ssl, X509_STORE *store); | |
| // SSL_set1_verify_cert_store sets an `X509_STORE` that will be used | |
| // exclusively for certificate verification and returns one. An additional | |
| // reference to `store` will be taken. | |
| OPENSSL_EXPORT int SSL_set1_verify_cert_store(SSL *ssl, X509_STORE *store); | |
| // SSL_CTX_set_verify_algorithm_prefs configures `ctx` to use `prefs` as the | |
| // preference list when verifying signatures from the peer's long-term key in | |
| // TLS 1.2 and up. It returns one on zero on error. `prefs` should not include | |
| // the internal-only TLS 1.0 value `SSL_SIGN_RSA_PKCS1_MD5_SHA1`. | |
| // | |
| // This setting is not used in TLS 1.0 and 1.1. Those protocols always sign a | |
| // hardcoded algorithm (an MD5/SHA-1 concatenation for RSA, and SHA-1 for | |
| // ECDSA). BoringSSL will accept those algorithms if and only if those versions | |
| // are used. To disable them, set the minimum version to TLS 1.2 (default) or | |
| // higher. | |
| OPENSSL_EXPORT int SSL_CTX_set_verify_algorithm_prefs(SSL_CTX *ctx, | |
| const uint16_t *prefs, | |
| size_t num_prefs); | |
| // SSL_set_verify_algorithm_prefs configures `ssl` to use `prefs` as the | |
| // preference list when verifying signatures from the peer's long-term key in | |
| // TLS 1.2 and up. It returns one on zero on error. `prefs` should not include | |
| // the internal-only TLS 1.0 value `SSL_SIGN_RSA_PKCS1_MD5_SHA1`. | |
| // | |
| // This setting is not used in TLS 1.0 and 1.1. Those protocols always sign a | |
| // hardcoded algorithm (an MD5/SHA-1 concatenation for RSA, and SHA-1 for | |
| // ECDSA). BoringSSL will accept those algorithms if and only if those versions | |
| // are used. To disable them, set the minimum version to TLS 1.2 (default) or | |
| // higher. | |
| OPENSSL_EXPORT int SSL_set_verify_algorithm_prefs(SSL *ssl, | |
| const uint16_t *prefs, | |
| size_t num_prefs); | |
| // Certificate authorities. | |
| // | |
| // TLS implementations can send a list of supported certificate authorities to | |
| // guide the peer in selecting a certificate. This was originally defined for | |
| // servers requesting client certificates, but TLS 1.3 generalized it to server | |
| // certificates with the certificate_authorities extension. | |
| // | |
| // The following functions can be used to configure and query this list. They do | |
| // not directly impact certificate verification, only the list of certificate | |
| // authorities sent to the peer. | |
| // SSL_set_client_CA_list sets `ssl`'s client certificate CA list to | |
| // `name_list`. It takes ownership of `name_list`. | |
| OPENSSL_EXPORT void SSL_set_client_CA_list(SSL *ssl, | |
| STACK_OF(X509_NAME) *name_list); | |
| // SSL_CTX_set_client_CA_list sets `ctx`'s client certificate CA list to | |
| // `name_list`. It takes ownership of `name_list`. | |
| OPENSSL_EXPORT void SSL_CTX_set_client_CA_list(SSL_CTX *ctx, | |
| STACK_OF(X509_NAME) *name_list); | |
| // SSL_set0_client_CAs sets `ssl`'s client certificate CA list to `name_list`, | |
| // which should contain DER-encoded distinguished names (RFC 5280). It takes | |
| // ownership of `name_list`. | |
| OPENSSL_EXPORT void SSL_set0_client_CAs(SSL *ssl, | |
| STACK_OF(CRYPTO_BUFFER) *name_list); | |
| // SSL_set0_CA_names sets `ssl`'s CA name list for the certificate authorities | |
| // extension to `name_list`, which should contain DER-encoded distinguished | |
| // names (RFC 5280). It takes ownership of `name_list`. | |
| OPENSSL_EXPORT void SSL_set0_CA_names(SSL *ssl, | |
| STACK_OF(CRYPTO_BUFFER) *name_list); | |
| // SSL_CTX_set0_client_CAs sets `ctx`'s client certificate CA list to | |
| // `name_list`, which should contain DER-encoded distinguished names (RFC 5280). | |
| // It takes ownership of `name_list`. | |
| OPENSSL_EXPORT void SSL_CTX_set0_client_CAs(SSL_CTX *ctx, | |
| STACK_OF(CRYPTO_BUFFER) *name_list); | |
| // SSL_get_client_CA_list returns `ssl`'s client certificate CA list. If `ssl` | |
| // has not been configured as a client, this is the list configured by | |
| // `SSL_CTX_set_client_CA_list`. | |
| // | |
| // If configured as a client, it returns the client certificate CA list sent by | |
| // the server. In this mode, the behavior is undefined except during the | |
| // callbacks set by `SSL_CTX_set_cert_cb` and `SSL_CTX_set_client_cert_cb` or | |
| // when the handshake is paused because of them. | |
| OPENSSL_EXPORT STACK_OF(X509_NAME) *SSL_get_client_CA_list(const SSL *ssl); | |
| // SSL_get0_server_requested_CAs returns the CAs sent by a server to guide a | |
| // client in certificate selection. They are a series of DER-encoded X.509 | |
| // names. This function may only be called during a callback set by | |
| // `SSL_CTX_set_cert_cb` or when the handshake is paused because of it. | |
| // | |
| // The returned stack is owned by `ssl`, as are its contents. It should not be | |
| // used past the point where the handshake is restarted after the callback. | |
| OPENSSL_EXPORT const STACK_OF(CRYPTO_BUFFER) *SSL_get0_server_requested_CAs( | |
| const SSL *ssl); | |
| // SSL_CTX_get_client_CA_list returns `ctx`'s client certificate CA list. | |
| OPENSSL_EXPORT STACK_OF(X509_NAME) *SSL_CTX_get_client_CA_list( | |
| const SSL_CTX *ctx); | |
| // SSL_add_client_CA appends `x509`'s subject to the client certificate CA list. | |
| // It returns one on success or zero on error. The caller retains ownership of | |
| // `x509`. | |
| OPENSSL_EXPORT int SSL_add_client_CA(SSL *ssl, X509 *x509); | |
| // SSL_CTX_add_client_CA appends `x509`'s subject to the client certificate CA | |
| // list. It returns one on success or zero on error. The caller retains | |
| // ownership of `x509`. | |
| OPENSSL_EXPORT int SSL_CTX_add_client_CA(SSL_CTX *ctx, X509 *x509); | |
| // SSL_load_client_CA_file opens `file` and reads PEM-encoded certificates from | |
| // it. It returns a newly-allocated stack of the certificate subjects or NULL | |
| // on error. Duplicates in `file` are ignored. | |
| OPENSSL_EXPORT STACK_OF(X509_NAME) *SSL_load_client_CA_file(const char *file); | |
| // SSL_dup_CA_list makes a deep copy of `list`. It returns the new list on | |
| // success or NULL on allocation error. | |
| OPENSSL_EXPORT STACK_OF(X509_NAME) *SSL_dup_CA_list(STACK_OF(X509_NAME) *list); | |
| // SSL_add_file_cert_subjects_to_stack behaves like `SSL_load_client_CA_file` | |
| // but appends the result to `out`. It returns one on success or zero on | |
| // error. | |
| OPENSSL_EXPORT int SSL_add_file_cert_subjects_to_stack(STACK_OF(X509_NAME) *out, | |
| const char *file); | |
| // SSL_add_bio_cert_subjects_to_stack behaves like | |
| // `SSL_add_file_cert_subjects_to_stack` but reads from `bio`. | |
| OPENSSL_EXPORT int SSL_add_bio_cert_subjects_to_stack(STACK_OF(X509_NAME) *out, | |
| BIO *bio); | |
| // Trust Anchor Identifiers. | |
| // | |
| // The trust_anchors extension, like certificate_authorities, allows clients to | |
| // communicate supported CAs to guide server certificate selection, or vice | |
| // versa. It better supports larger PKIs by referring to CAs by short "trust | |
| // anchor IDs" and, in the server certificate direction, allowing a client to | |
| // advertise only a subset of its full list, with DNS hinting and a retry | |
| // mechanism to manage the subset. | |
| // | |
| // See https://datatracker.ietf.org/doc/draft-ietf-tls-trust-anchor-ids/ | |
| // | |
| // BoringSSL currently only implements this for server certificates, and not yet | |
| // client certificates. | |
| // SSL_CREDENTIAL_set1_trust_anchor_id sets `cred`'s trust anchor ID to `id`, or | |
| // clears it if `id_len` is zero. It returns one on success and zero on | |
| // error. If not clearing, `id` must be in binary format (Section 4 of | |
| // draft-ietf-tls-trust-anchor-ids-06) of length `id_len`, and describe the | |
| // issuer of the final certificate in `cred`'s certificate chain. | |
| // | |
| // Additionally, `cred` must enable issuer matching (see | |
| // `SSL_CREDENTIAL_set_must_match_issuer`) for this value to take effect. | |
| // | |
| // For extensibility, callers are recommended to configure this information with | |
| // a CertificatePropertyList. See `SSL_CREDENTIAL_set1_certificate_properties`. | |
| OPENSSL_EXPORT int SSL_CREDENTIAL_set1_trust_anchor_id(SSL_CREDENTIAL *cred, | |
| const uint8_t *id, | |
| size_t id_len); | |
| // SSL_CREDENTIAL_add1_trust_anchor_group specifies that `cred` matches all | |
| // trust anchor IDs that match `pattern`. It returns one on success and zero on | |
| // error. This function may be called multiple times to register multiple group | |
| // patterns. | |
| // | |
| // `pattern` is interpreted as the byte representation of a trust anchor ID | |
| // pattern, as described in draft-ietf-tls-trust-anchor-ids. | |
| // | |
| // For extensibility, callers are recommended to configure this information with | |
| // a CertificatePropertyList. See `SSL_CREDENTIAL_set1_certificate_properties`. | |
| OPENSSL_EXPORT int SSL_CREDENTIAL_add1_trust_anchor_group( | |
| SSL_CREDENTIAL *cred, const uint8_t *pattern, size_t pattern_len); | |
| // SSL_CTX_set1_requested_trust_anchors configures `ctx` to request a | |
| // certificate issued by one of the trust anchors or trust anchor groups in | |
| // `ids`. It returns one on success and zero on error. `ids` must be a list of | |
| // trust anchor IDs in wire-format (a series of non-empty, 8-bit length-prefixed | |
| // strings). | |
| // | |
| // See Section 5.2 of draft-ietf-tls-trust-anchor-ids-06 for guidance on | |
| // determining this list. If applicable, client applications can use | |
| // `SSL_get0_peer_available_trust_anchors` to implement the recovery flow from | |
| // Section 5.6 of draft-ietf-tls-trust-anchor-ids-06. | |
| // | |
| // If empty (`ids_len` is zero), the trust_anchors extension will still be sent | |
| // in ClientHello. This may be used by a client application to signal support | |
| // for the retry flow without requesting specific trust anchors. | |
| // | |
| // This function does not directly impact certificate verification, only the | |
| // list of trust anchors sent to the peer. | |
| OPENSSL_EXPORT int SSL_CTX_set1_requested_trust_anchors(SSL_CTX *ctx, | |
| const uint8_t *ids, | |
| size_t ids_len); | |
| // SSL_set1_requested_trust_anchors behaves like | |
| // `SSL_CTX_set1_requested_trust_anchors` but configures the value on `ssl`. | |
| OPENSSL_EXPORT int SSL_set1_requested_trust_anchors(SSL *ssl, | |
| const uint8_t *ids, | |
| size_t ids_len); | |
| // SSL_peer_matched_trust_anchor returns one if the peer reported that its | |
| // certificate chain matched one of the trust anchor IDs requested by `ssl`, and | |
| // zero otherwise. | |
| // | |
| // This value is only available during the handshake and is expected to be | |
| // called during certificate verification, e.g. during `SSL_set_custom_verify` | |
| // or `SSL_CTX_set_cert_verify_callback` callbacks. If the value is one, callers | |
| // can safely treat the peer's certificate chain as a pre-built path and skip | |
| // path-building in certificate verification. | |
| OPENSSL_EXPORT int SSL_peer_matched_trust_anchor(const SSL *ssl); | |
| // SSL_get0_peer_available_trust_anchors gets the peer's available trust anchor | |
| // IDs. It sets `*out` and `*out_len` so that `*out` points to `*out_len` bytes | |
| // containing the list in wire format (i.e. a series of non-empty | |
| // 8-bit-length-prefixed strings). If the peer did not provide a list, the | |
| // function will output zero bytes. Only servers can provide available trust | |
| // anchor IDs, so this API will only output a list when `ssl` is a client. | |
| // | |
| // This value is only available during the handshake and is expected to be | |
| // called in the event of certificate verification failure. Client applications | |
| // can use it to retry the connection, requesting different trust anchors. See | |
| // Section 5.6 of draft-ietf-tls-trust-anchor-ids-06 for details. | |
| // `CBS_get_u8_length_prefixed` may be used to iterate over the format. | |
| // | |
| // If needed in other contexts, callers may save the value during certificate | |
| // verification, or at `SSL_CB_HANDSHAKE_DONE` with `SSL_CTX_set_info_callback`. | |
| OPENSSL_EXPORT void SSL_get0_peer_available_trust_anchors(const SSL *ssl, | |
| const uint8_t **out, | |
| size_t *out_len); | |
| // SSL_CTX_set1_available_trust_anchors configures `ctx`, as a server, to send | |
| // `ids` as the list of available trust anchors alongside the certificate. It | |
| // returns one on success and zero on error. This list is used to allow the peer | |
| // to retry the connection and request a different trust anchor, if the | |
| // presented certificate is unacceptable. `ids` must be a non-empty list of | |
| // trust anchor IDs in wire-format (a series of non-empty, 8-bit length-prefixed | |
| // strings), in order of decreasing preference. | |
| // | |
| // Most applications will not need to call this. If not configured, BoringSSL | |
| // derives available trust anchors from the credential list (see | |
| // `SSL_CTX_add1_credential`). This function may be used if, for example, the | |
| // caller filters the available credentials by trust anchor in | |
| // `SSL_CTX_set_select_certificate_cb`, such that the credential list visible to | |
| // BoringSSL is incomplete. | |
| OPENSSL_EXPORT int SSL_CTX_set1_available_trust_anchors(SSL_CTX *ctx, | |
| const uint8_t *ids, | |
| size_t ids_len); | |
| // SSL_set1_available_trust_anchors behaves like | |
| // `SSL_CTX_set1_available_trust_anchors` but configures the value on `ssl`. | |
| OPENSSL_EXPORT int SSL_set1_available_trust_anchors(SSL *ssl, | |
| const uint8_t *ids, | |
| size_t ids_len); | |
| // Server name indication. | |
| // | |
| // The server_name extension (RFC 3546) allows the client to advertise the name | |
| // of the server it is connecting to. This is used in virtual hosting | |
| // deployments to select one of a several certificates on a single IP. Only the | |
| // host_name name type is supported. | |
| #define TLSEXT_NAMETYPE_host_name 0 | |
| // SSL_set_tlsext_host_name, for a client, configures `ssl` to advertise `name` | |
| // in the server_name extension. It returns one on success and zero on error. | |
| OPENSSL_EXPORT int SSL_set_tlsext_host_name(SSL *ssl, const char *name); | |
| // SSL_get_servername, for a server, returns the hostname supplied by the | |
| // client or NULL if there was none. The `type` argument must be | |
| // `TLSEXT_NAMETYPE_host_name`. | |
| OPENSSL_EXPORT const char *SSL_get_servername(const SSL *ssl, const int type); | |
| // SSL_get_servername_type, for a server, returns `TLSEXT_NAMETYPE_host_name` | |
| // if the client sent a hostname and -1 otherwise. | |
| OPENSSL_EXPORT int SSL_get_servername_type(const SSL *ssl); | |
| // SSL_CTX_set_tlsext_servername_callback configures `callback` to be called on | |
| // the server after ClientHello extensions have been parsed and returns one. | |
| // The callback may use `SSL_get_servername` to examine the server_name | |
| // extension and returns a `SSL_TLSEXT_ERR_*` value. The value of `arg` may be | |
| // set by calling `SSL_CTX_set_tlsext_servername_arg`. | |
| // | |
| // If the callback returns `SSL_TLSEXT_ERR_NOACK`, the server_name extension is | |
| // not acknowledged in the ServerHello. If the return value is | |
| // `SSL_TLSEXT_ERR_ALERT_FATAL`, then `*out_alert` is the alert to send, | |
| // defaulting to `SSL_AD_UNRECOGNIZED_NAME`. `SSL_TLSEXT_ERR_ALERT_WARNING` is | |
| // ignored and treated as `SSL_TLSEXT_ERR_OK`. | |
| OPENSSL_EXPORT int SSL_CTX_set_tlsext_servername_callback( | |
| SSL_CTX *ctx, int (*callback)(SSL *ssl, int *out_alert, void *arg)); | |
| // SSL_CTX_set_tlsext_servername_arg sets the argument to the servername | |
| // callback and returns one. See `SSL_CTX_set_tlsext_servername_callback`. | |
| OPENSSL_EXPORT int SSL_CTX_set_tlsext_servername_arg(SSL_CTX *ctx, void *arg); | |
| // SSL_TLSEXT_ERR_* are values returned by some extension-related callbacks. | |
| #define SSL_TLSEXT_ERR_OK 0 | |
| #define SSL_TLSEXT_ERR_ALERT_WARNING 1 | |
| #define SSL_TLSEXT_ERR_ALERT_FATAL 2 | |
| #define SSL_TLSEXT_ERR_NOACK 3 | |
| // SSL_set_SSL_CTX changes `ssl`'s `SSL_CTX`. `ssl` will use the | |
| // certificate-related settings from `ctx`, and `SSL_get_SSL_CTX` will report | |
| // `ctx`. This function may be used during the callbacks registered by | |
| // `SSL_CTX_set_select_certificate_cb`, | |
| // `SSL_CTX_set_tlsext_servername_callback`, and `SSL_CTX_set_cert_cb` or when | |
| // the handshake is paused from them. It is typically used to switch | |
| // certificates based on SNI. | |
| // | |
| // Note the session cache and related settings will continue to use the initial | |
| // `SSL_CTX`. Callers should use `SSL_CTX_set_session_id_context` to partition | |
| // the session cache between different domains. | |
| // | |
| // TODO(davidben): Should other settings change after this call? | |
| OPENSSL_EXPORT SSL_CTX *SSL_set_SSL_CTX(SSL *ssl, SSL_CTX *ctx); | |
| // Application-layer protocol negotiation. | |
| // | |
| // The ALPN extension (RFC 7301) allows negotiating different application-layer | |
| // protocols over a single port. This is used, for example, to negotiate | |
| // HTTP/2. | |
| // SSL_CTX_set_alpn_protos sets the client ALPN protocol list on `ctx` to | |
| // `protos`. `protos` must be in wire-format (i.e. a series of non-empty, 8-bit | |
| // length-prefixed strings), or the empty string to disable ALPN. It returns | |
| // zero on success and one on failure. Configuring a non-empty string enables | |
| // ALPN on a client. On a client, it will advertise these protocols. On a | |
| // server, it will use them to automatically select a protocol if the client | |
| // supports ALPN and no select callback is set. | |
| // | |
| // Those configuring HTTP/2 must also configure the cipher suite set on the | |
| // SSL_CTX so that the selected cipher is compliant with RFC 7540 Section 9.2. | |
| // Servers should install their own ALPN callback to comply with the RFC. | |
| // | |
| // WARNING: this function is dangerous because it breaks the usual return value | |
| // convention. | |
| OPENSSL_EXPORT int SSL_CTX_set_alpn_protos(SSL_CTX *ctx, const uint8_t *protos, | |
| size_t protos_len); | |
| // SSL_set_alpn_protos sets the client ALPN protocol list on `ssl` to `protos`. | |
| // `protos` must be in wire-format (i.e. a series of non-empty, 8-bit | |
| // length-prefixed strings), or the empty string to disable ALPN. It returns | |
| // zero on success and one on failure. Configuring a non-empty string enables | |
| // ALPN on a client. On a client, it will advertise these protocols. On a | |
| // server, it will use them to automatically select a protocol if the client | |
| // supports ALPN and no select callback is set. | |
| // | |
| // Those configuring HTTP/2 must also configure the cipher suite set on the | |
| // SSL_CTX so that the selected cipher is compliant with RFC 7540 Section 9.2. | |
| // Servers should install their own ALPN callback to comply with the RFC. | |
| // | |
| // WARNING: this function is dangerous because it breaks the usual return value | |
| // convention. | |
| OPENSSL_EXPORT int SSL_set_alpn_protos(SSL *ssl, const uint8_t *protos, | |
| size_t protos_len); | |
| // SSL_CTX_set_alpn_select_cb sets a callback function on `ctx` that is called | |
| // during ClientHello processing in order to select an ALPN protocol from the | |
| // client's list of offered protocols. `SSL_select_next_proto` is an optional | |
| // utility function which may be useful in implementing this callback. | |
| // | |
| // The callback is passed a wire-format (i.e. a series of non-empty, 8-bit | |
| // length-prefixed strings) ALPN protocol list in `in`. To select a protocol, | |
| // the callback should set `*out` and `*out_len` to the selected protocol and | |
| // return `SSL_TLSEXT_ERR_OK` on success. It does not pass ownership of the | |
| // buffer, so `*out` should point to a static string, a buffer that outlives the | |
| // callback call, or the corresponding entry in `in`. | |
| // | |
| // If the server supports ALPN, but there are no protocols in common, the | |
| // callback should return `SSL_TLSEXT_ERR_ALERT_FATAL` to abort the connection | |
| // with a no_application_protocol alert. | |
| // | |
| // If the server does not support ALPN, it can return `SSL_TLSEXT_ERR_NOACK` to | |
| // continue the handshake without negotiating a protocol. This may be useful if | |
| // multiple server configurations share an `SSL_CTX`, only some of which have | |
| // ALPN protocols configured. | |
| // | |
| // `SSL_TLSEXT_ERR_ALERT_WARNING` is ignored and will be treated as | |
| // `SSL_TLSEXT_ERR_NOACK`. | |
| // | |
| // The callback will only be called if the client supports ALPN. Callers that | |
| // wish to require ALPN for all clients must check `SSL_get0_alpn_selected` | |
| // after the handshake. In QUIC connections, this is done automatically. | |
| // | |
| // The cipher suite is selected before negotiating ALPN. The callback may use | |
| // `SSL_get_pending_cipher` to query the cipher suite. This may be used to | |
| // implement HTTP/2's cipher suite constraints. | |
| OPENSSL_EXPORT void SSL_CTX_set_alpn_select_cb( | |
| SSL_CTX *ctx, | |
| int (*cb)(SSL *ssl, const uint8_t **out, uint8_t *out_len, | |
| const uint8_t *in, unsigned in_len, void *arg), | |
| void *arg); | |
| // SSL_get0_alpn_selected gets the selected ALPN protocol (if any) from `ssl`. | |
| // On return it sets `*out_data` to point to `*out_len` bytes of protocol name | |
| // (not including the leading length-prefix byte). If the server didn't respond | |
| // with a negotiated protocol then `*out_len` will be zero. | |
| OPENSSL_EXPORT void SSL_get0_alpn_selected(const SSL *ssl, | |
| const uint8_t **out_data, | |
| unsigned *out_len); | |
| // SSL_CTX_set_allow_unknown_alpn_protos configures client connections on `ctx` | |
| // to allow unknown ALPN protocols from the server. Otherwise, by default, the | |
| // client will require that the protocol be advertised in | |
| // `SSL_CTX_set_alpn_protos`. | |
| OPENSSL_EXPORT void SSL_CTX_set_allow_unknown_alpn_protos(SSL_CTX *ctx, | |
| int enabled); | |
| // Application-layer protocol settings | |
| // | |
| // The ALPS extension (draft-vvv-tls-alps) allows exchanging application-layer | |
| // settings in the TLS handshake for applications negotiated with ALPN. Note | |
| // that, when ALPS is negotiated, the client and server each advertise their own | |
| // settings, so there are functions to both configure setting to send and query | |
| // received settings. | |
| // SSL_add_application_settings configures `ssl` to enable ALPS with ALPN | |
| // protocol `proto`, sending an ALPS value of `settings`. It returns one on | |
| // success and zero on error. If `proto` is negotiated via ALPN and the peer | |
| // supports ALPS, `settings` will be sent to the peer. The peer's ALPS value can | |
| // be retrieved with `SSL_get0_peer_application_settings`. | |
| // | |
| // On the client, this function should be called before the handshake, once for | |
| // each supported ALPN protocol which uses ALPS. `proto` must be included in the | |
| // client's ALPN configuration (see `SSL_CTX_set_alpn_protos` and | |
| // `SSL_set_alpn_protos`). On the server, ALPS can be preconfigured for each | |
| // protocol as in the client, or configuration can be deferred to the ALPN | |
| // callback (see `SSL_CTX_set_alpn_select_cb`), in which case only the selected | |
| // protocol needs to be configured. | |
| // | |
| // ALPS can be independently configured from 0-RTT, however changes in protocol | |
| // settings will fallback to 1-RTT to negotiate the new value, so it is | |
| // recommended for `settings` to be relatively stable. | |
| OPENSSL_EXPORT int SSL_add_application_settings(SSL *ssl, const uint8_t *proto, | |
| size_t proto_len, | |
| const uint8_t *settings, | |
| size_t settings_len); | |
| // SSL_get0_peer_application_settings sets `*out_data` and `*out_len` to a | |
| // buffer containing the peer's ALPS value, or the empty string if ALPS was not | |
| // negotiated. Note an empty string could also indicate the peer sent an empty | |
| // settings value. Use `SSL_has_application_settings` to check if ALPS was | |
| // negotiated. The output buffer is owned by `ssl` and is valid until the next | |
| // time `ssl` is modified. | |
| OPENSSL_EXPORT void SSL_get0_peer_application_settings(const SSL *ssl, | |
| const uint8_t **out_data, | |
| size_t *out_len); | |
| // SSL_has_application_settings returns one if ALPS was negotiated on this | |
| // connection and zero otherwise. | |
| OPENSSL_EXPORT int SSL_has_application_settings(const SSL *ssl); | |
| // SSL_set_alps_use_new_codepoint configures whether to use the new ALPS | |
| // codepoint. By default, the new codepoint is used. | |
| OPENSSL_EXPORT void SSL_set_alps_use_new_codepoint(SSL *ssl, int use_new); | |
| // Certificate compression. | |
| // | |
| // Certificates in TLS 1.3 can be compressed (RFC 8879). BoringSSL supports this | |
| // as both a client and a server, but does not link against any specific | |
| // compression libraries in order to keep dependencies to a minimum. Instead, | |
| // hooks for compression and decompression can be installed in an `SSL_CTX` to | |
| // enable support. | |
| // ssl_cert_compression_func_t is a pointer to a function that performs | |
| // compression. It must write the compressed representation of `in` to `out`, | |
| // returning one on success and zero on error. The results of compressing | |
| // certificates are not cached internally. Implementations may wish to implement | |
| // their own cache if they expect it to be useful given the certificates that | |
| // they serve. | |
| typedef int (*ssl_cert_compression_func_t)(SSL *ssl, CBB *out, | |
| const uint8_t *in, size_t in_len); | |
| // ssl_cert_decompression_func_t is a pointer to a function that performs | |
| // decompression. The compressed data from the peer is passed as `in` and the | |
| // decompressed result must be exactly `uncompressed_len` bytes long. It returns | |
| // one on success, in which case `*out` must be set to the result of | |
| // decompressing `in`, or zero on error. Setting `*out` transfers ownership, | |
| // i.e. `CRYPTO_BUFFER_free` will be called on `*out` at some point in the | |
| // future. The results of decompressions are not cached internally. | |
| // Implementations may wish to implement their own cache if they expect it to be | |
| // useful. | |
| typedef int (*ssl_cert_decompression_func_t)(SSL *ssl, CRYPTO_BUFFER **out, | |
| size_t uncompressed_len, | |
| const uint8_t *in, size_t in_len); | |
| // SSL_CTX_add_cert_compression_alg registers a certificate compression | |
| // algorithm on `ctx` with ID `alg_id`. (The value of `alg_id` should be an IANA | |
| // assigned value and each can only be registered once.) | |
| // | |
| // One of the function pointers may be NULL to avoid having to implement both | |
| // sides of a compression algorithm if you're only going to use it in one | |
| // direction. In this case, the unimplemented direction acts like it was never | |
| // configured. | |
| // | |
| // For a server, algorithms are registered in preference order with the most | |
| // preferable first. It returns one on success or zero on error. | |
| OPENSSL_EXPORT int SSL_CTX_add_cert_compression_alg( | |
| SSL_CTX *ctx, uint16_t alg_id, ssl_cert_compression_func_t compress, | |
| ssl_cert_decompression_func_t decompress); | |
| // Next protocol negotiation. | |
| // | |
| // The NPN extension (draft-agl-tls-nextprotoneg-03) is the predecessor to ALPN | |
| // and deprecated in favor of it. | |
| // SSL_CTX_set_next_protos_advertised_cb sets a callback that is called when a | |
| // TLS server needs a list of supported protocols for Next Protocol Negotiation. | |
| // | |
| // If the callback wishes to advertise NPN to the client, it should return | |
| // `SSL_TLSEXT_ERR_OK` and then set `*out` and `*out_len` to describe to a | |
| // buffer containing a (possibly empty) list of supported protocols in wire | |
| // format. That is, each protocol is prefixed with a 1-byte length, then | |
| // concatenated. From there, the client will select a protocol, possibly one not | |
| // on the server's list. The caller can use `SSL_get0_next_proto_negotiated` | |
| // after the handshake completes to query the final protocol. | |
| // | |
| // The returned buffer must remain valid and unmodified for at least the | |
| // duration of the `SSL` operation (e.g. `SSL_do_handshake`) that triggered the | |
| // callback. | |
| // | |
| // If the caller wishes not to advertise NPN, it should return | |
| // `SSL_TLSEXT_ERR_NOACK`. No NPN extension will be included in the ServerHello, | |
| // and the TLS server will behave as if it does not implement NPN. | |
| OPENSSL_EXPORT void SSL_CTX_set_next_protos_advertised_cb( | |
| SSL_CTX *ctx, | |
| int (*cb)(SSL *ssl, const uint8_t **out, unsigned *out_len, void *arg), | |
| void *arg); | |
| // SSL_CTX_set_next_proto_select_cb sets a callback that is called when a client | |
| // needs to select a protocol from the server's provided list, passed in wire | |
| // format in `in_len` bytes from `in`. The callback can assume that `in` is | |
| // syntactically valid. `SSL_select_next_proto` is an optional utility function | |
| // which may be useful in implementing this callback. | |
| // | |
| // On success, the callback should return `SSL_TLSEXT_ERR_OK` and set `*out` and | |
| // `*out_len` to describe a buffer containing the selected protocol, or an | |
| // empty buffer to select no protocol. The returned buffer may point within | |
| // `in`, or it may point to some other buffer that remains valid and unmodified | |
| // for at least the duration of the `SSL` operation (e.g. `SSL_do_handshake`) | |
| // that triggered the callback. | |
| // | |
| // Returning any other value indicates a fatal error and will terminate the TLS | |
| // connection. To proceed without selecting a protocol, the callback must return | |
| // `SSL_TLSEXT_ERR_OK` and set `*out` and `*out_len` to an empty buffer. (E.g. | |
| // NULL and zero, respectively.) | |
| // | |
| // Configuring this callback enables NPN on a client. Although the callback can | |
| // then decline to negotiate a protocol, merely configuring the callback causes | |
| // the client to offer NPN in the ClientHello. Callers thus should not configure | |
| // this callback in TLS client contexts that are not intended to use NPN. | |
| OPENSSL_EXPORT void SSL_CTX_set_next_proto_select_cb( | |
| SSL_CTX *ctx, | |
| int (*cb)(SSL *ssl, uint8_t **out, uint8_t *out_len, const uint8_t *in, | |
| unsigned in_len, void *arg), | |
| void *arg); | |
| // SSL_get0_next_proto_negotiated sets `*out_data` and `*out_len` to point to | |
| // the client's requested protocol for this connection. If the client didn't | |
| // request any protocol, then `*out_len` is set to zero. | |
| // | |
| // Note that the client can request any protocol it chooses. The value returned | |
| // from this function need not be a member of the list of supported protocols | |
| // provided by the server. | |
| OPENSSL_EXPORT void SSL_get0_next_proto_negotiated(const SSL *ssl, | |
| const uint8_t **out_data, | |
| unsigned *out_len); | |
| // SSL_select_next_proto implements the standard protocol selection for either | |
| // ALPN servers or NPN clients. It is expected that this function is called from | |
| // the callback set by `SSL_CTX_set_alpn_select_cb` or | |
| // `SSL_CTX_set_next_proto_select_cb`. | |
| // | |
| // `peer` and `supported` contain the peer and locally-configured protocols, | |
| // respectively. This function finds the first protocol in `peer` which is also | |
| // in `supported`. If one was found, it sets `*out` and `*out_len` to point to | |
| // it and returns `OPENSSL_NPN_NEGOTIATED`. Otherwise, it returns | |
| // `OPENSSL_NPN_NO_OVERLAP` and sets `*out` and `*out_len` to the first | |
| // supported protocol. | |
| // | |
| // In ALPN, the server should only select protocols among those that the client | |
| // offered. Thus, if this function returns `OPENSSL_NPN_NO_OVERLAP`, the caller | |
| // should ignore `*out` and return `SSL_TLSEXT_ERR_ALERT_FATAL` from | |
| // `SSL_CTX_set_alpn_select_cb`'s callback to indicate there was no match. | |
| // | |
| // In NPN, the client may either select one of the server's protocols, or an | |
| // "opportunistic" protocol as described in Section 6 of | |
| // draft-agl-tls-nextprotoneg-03. When this function returns | |
| // `OPENSSL_NPN_NO_OVERLAP`, `*out` implicitly selects the first supported | |
| // protocol for use as the opportunistic protocol. The caller may use it, | |
| // ignore it and select a different opportunistic protocol, or ignore it and | |
| // select no protocol (empty string). | |
| // | |
| // `peer` and `supported` must be vectors of 8-bit, length-prefixed byte | |
| // strings. The length byte itself is not included in the length. A byte string | |
| // of length 0 is invalid. No byte string may be truncated. `supported` must be | |
| // non-empty; a caller that supports no ALPN/NPN protocols should skip | |
| // negotiating the extension, rather than calling this function. If any of these | |
| // preconditions do not hold, this function will return `OPENSSL_NPN_NO_OVERLAP` | |
| // and set `*out` and `*out_len` to an empty buffer for robustness, but callers | |
| // are not recommended to rely on this. An empty buffer is not a valid output | |
| // for `SSL_CTX_set_alpn_select_cb`'s callback. | |
| // | |
| // WARNING: `*out` and `*out_len` may alias either `peer` or `supported` and may | |
| // not be used after one of those buffers is modified or released. Additionally, | |
| // this function is not const-correct for compatibility reasons. Although `*out` | |
| // is a non-const pointer, callers may not modify the buffer though `*out`. | |
| OPENSSL_EXPORT int SSL_select_next_proto(uint8_t **out, uint8_t *out_len, | |
| const uint8_t *peer, unsigned peer_len, | |
| const uint8_t *supported, | |
| unsigned supported_len); | |
| #define OPENSSL_NPN_UNSUPPORTED 0 | |
| #define OPENSSL_NPN_NEGOTIATED 1 | |
| #define OPENSSL_NPN_NO_OVERLAP 2 | |
| // Channel ID. | |
| // | |
| // See draft-balfanz-tls-channelid-01. This is an old, experimental mechanism | |
| // and should not be used in new code. | |
| // SSL_CTX_set_tls_channel_id_enabled configures whether connections associated | |
| // with `ctx` should enable Channel ID as a server. | |
| OPENSSL_EXPORT void SSL_CTX_set_tls_channel_id_enabled(SSL_CTX *ctx, | |
| int enabled); | |
| // SSL_set_tls_channel_id_enabled configures whether `ssl` should enable Channel | |
| // ID as a server. | |
| OPENSSL_EXPORT void SSL_set_tls_channel_id_enabled(SSL *ssl, int enabled); | |
| // SSL_CTX_set1_tls_channel_id configures a TLS client to send a TLS Channel ID | |
| // to compatible servers. `private_key` must be a P-256 EC key. It returns one | |
| // on success and zero on error. | |
| OPENSSL_EXPORT int SSL_CTX_set1_tls_channel_id(SSL_CTX *ctx, | |
| EVP_PKEY *private_key); | |
| // SSL_set1_tls_channel_id configures a TLS client to send a TLS Channel ID to | |
| // compatible servers. `private_key` must be a P-256 EC key. It returns one on | |
| // success and zero on error. | |
| OPENSSL_EXPORT int SSL_set1_tls_channel_id(SSL *ssl, EVP_PKEY *private_key); | |
| // SSL_get_tls_channel_id gets the client's TLS Channel ID from a server `SSL` | |
| // and copies up to the first `max_out` bytes into `out`. The Channel ID | |
| // consists of the client's P-256 public key as an (x,y) pair where each is a | |
| // 32-byte, big-endian field element. It returns 0 if the client didn't offer a | |
| // Channel ID and the length of the complete Channel ID otherwise. This function | |
| // always returns zero if `ssl` is a client. | |
| OPENSSL_EXPORT size_t SSL_get_tls_channel_id(SSL *ssl, uint8_t *out, | |
| size_t max_out); | |
| // DTLS-SRTP. | |
| // | |
| // See RFC 5764. | |
| // srtp_protection_profile_st (aka `SRTP_PROTECTION_PROFILE`) is an SRTP | |
| // profile for use with the use_srtp extension. | |
| struct srtp_protection_profile_st { | |
| const char *name; | |
| unsigned long id; | |
| } /* SRTP_PROTECTION_PROFILE */; | |
| DEFINE_CONST_STACK_OF(SRTP_PROTECTION_PROFILE) | |
| // SRTP_* define constants for SRTP profiles. | |
| #define SRTP_AES128_CM_SHA1_80 0x0001 | |
| #define SRTP_AES128_CM_SHA1_32 0x0002 | |
| #define SRTP_AES128_F8_SHA1_80 0x0003 | |
| #define SRTP_AES128_F8_SHA1_32 0x0004 | |
| #define SRTP_NULL_SHA1_80 0x0005 | |
| #define SRTP_NULL_SHA1_32 0x0006 | |
| #define SRTP_AEAD_AES_128_GCM 0x0007 | |
| #define SRTP_AEAD_AES_256_GCM 0x0008 | |
| // SSL_CTX_set_srtp_profiles enables SRTP for all SSL objects created from | |
| // `ctx`. `profile` contains a colon-separated list of profile names. It returns | |
| // one on success and zero on failure. | |
| OPENSSL_EXPORT int SSL_CTX_set_srtp_profiles(SSL_CTX *ctx, | |
| const char *profiles); | |
| // SSL_set_srtp_profiles enables SRTP for `ssl`. `profile` contains a | |
| // colon-separated list of profile names. It returns one on success and zero on | |
| // failure. | |
| OPENSSL_EXPORT int SSL_set_srtp_profiles(SSL *ssl, const char *profiles); | |
| // SSL_get_srtp_profiles returns the SRTP profiles supported by `ssl`. | |
| OPENSSL_EXPORT const STACK_OF(SRTP_PROTECTION_PROFILE) *SSL_get_srtp_profiles( | |
| const SSL *ssl); | |
| // SSL_get_selected_srtp_profile returns the selected SRTP profile, or NULL if | |
| // SRTP was not negotiated. | |
| OPENSSL_EXPORT const SRTP_PROTECTION_PROFILE *SSL_get_selected_srtp_profile( | |
| SSL *ssl); | |
| // TLS 1.3 pre-shared keys. | |
| // | |
| // TLS 1.3 connections can be authenticated using external pre-shared keys | |
| // (PSKs), as described in RFC 9258. These are represented in BoringSSL with | |
| // `SSL_CREDENTIAL` objects. | |
| // | |
| // BoringSSL only implements the PSK importer interface from RFC 9258. The | |
| // underlying protocol- and cipher-specific TLS 1.3 PSK mechanism is not exposed | |
| // directly. | |
| // SSL_CREDENTIAL_new_pre_shared_key returns a newly-allocated `SSL_CREDENTIAL` | |
| // representing an external pre-shared key, as described in RFC 9258, or NULL on | |
| // error. `key` is the base key, `id` is the external identity, and `md` is the | |
| // hash function. The result may be added to the credential list with | |
| // `SSL_CTX_add1_credential` or `SSL_add1_credential`. `context` is the context | |
| // string to use when importing to TLS. | |
| // | |
| // WARNING: An attacker with knowledge of `key` can impersonate either side of | |
| // the connection. Additionally, using a pre-shared key exposes `key` to offline | |
| // brute force attacks. `key` must thus be a high-entropy, secret value. | |
| // Passwords or short PINs, for example, would not be safe to use as `key`. | |
| // | |
| // Callers can configure the credential list with multiple PSKs, or a mix of | |
| // PSKs and other credentials, in some preference order. Due to protocol | |
| // differences, clients and servers evaluate PSKs in the credential list | |
| // differently: | |
| // | |
| // - As a server, PSK credentials behave similarly to other credentials. Callers | |
| // can configure them dynamically in the certificate callbacks (see | |
| // `SSL_CTX_set_select_certificate_cb` and `SSL_CTX_set_cert_cb`). After those | |
| // callbacks run, BoringSSL will select a credential to use from the list. | |
| // | |
| // - As a client, PSK credentials are offered in the ClientHello and selected by | |
| // the server. This means all PSK credentials must be configured before | |
| // starting the handshake, and the order between PSK and non-PSK credentials | |
| // will be ignored. PSK credentials cannot be configured dynamically in | |
| // callbacks such as `SSL_CTX_set_cert_cb`. | |
| // | |
| // A single connection may be configured to accept only certificate-based | |
| // handshakes, only PSK-based handshakes, or both. The server credential | |
| // determines the kind of handshake, so this is implicitly controlled by the | |
| // credential list as a server: | |
| // | |
| // - If the credential list only contains PSKs, BoringSSL will only consider | |
| // PSK-based handshakes. | |
| // | |
| // - If the credential list contains PSKs and certificates, BoringSSL will | |
| // consider both, depending on the client. | |
| // | |
| // As a client, if any PSK credentials are configured, BoringSSL will only | |
| // accept PSK-based handshakes by default. Setting the verify mode to | |
| // `SSL_VERIFY_PEER` (see `SSL_CTX_set_verify` and `SSL_CTX_set_custom_verify`) | |
| // overrides this behavior and causes BoringSSL to accept either. | |
| // | |
| // In both clients and servers, if a caller configures one or more PSK | |
| // credentials, and calls no certificate-related functions, the connection will | |
| // only accept one of those PSKs. | |
| OPENSSL_EXPORT SSL_CREDENTIAL *SSL_CREDENTIAL_new_pre_shared_key( | |
| const uint8_t *key, size_t key_len, const uint8_t *id, size_t id_len, | |
| const EVP_MD *md, const uint8_t *context, size_t context_len); | |
| // SSL_CREDENTIAL_get0_pre_shared_key_id returns the external identity of this | |
| // pre-shared key credential, or NULL if `cred` is not a pre-shared key | |
| // credential or `id_len` is NULL. | |
| OPENSSL_EXPORT const uint8_t *SSL_CREDENTIAL_get0_pre_shared_key_id( | |
| const SSL_CREDENTIAL *cred, size_t *id_len); | |
| // TLS 1.2 pre-shared keys. | |
| // | |
| // TLS 1.2 connections may be configured with PSK (Pre-Shared Key) cipher | |
| // suites. These authenticate using out-of-band pre-shared keys rather than | |
| // certificates. See RFC 4279. | |
| // | |
| // This implementation uses NUL-terminated C strings for identities and identity | |
| // hints, so values with a NUL character are not supported. (RFC 4279 does not | |
| // specify the format of an identity.) | |
| // | |
| // Functions in this section only relate to PSKs in TLS 1.2 or earlier. New | |
| // PSK-based applications likely do not need this functionality and instead | |
| // should use TLS 1.3. See `SSL_CREDENTIAL_new_pre_shared_key` for TLS 1.3 PSKs. | |
| // PSK_MAX_IDENTITY_LEN is the maximum supported length of a TLS 1.2 PSK | |
| // identity, excluding the NUL terminator. | |
| #define PSK_MAX_IDENTITY_LEN 128 | |
| // PSK_MAX_PSK_LEN is the maximum supported length of a TLS 1.2 pre-shared key. | |
| #define PSK_MAX_PSK_LEN 256 | |
| // SSL_CTX_set_psk_client_callback sets the callback to be called when TLS 1.2 | |
| // PSK is negotiated on the client. This callback must be set to enable PSK | |
| // cipher suites on the client. | |
| // | |
| // The callback is passed the identity hint in `hint` or NULL if none was | |
| // provided. It should select a PSK identity and write the identity and the | |
| // corresponding PSK to `identity` and `psk`, respectively. The identity is | |
| // written as a NUL-terminated C string of length (excluding the NUL terminator) | |
| // at most `max_identity_len`. The PSK's length must be at most `max_psk_len`. | |
| // The callback returns the length of the PSK or 0 if no suitable identity was | |
| // found. | |
| OPENSSL_EXPORT void SSL_CTX_set_psk_client_callback( | |
| SSL_CTX *ctx, unsigned (*cb)(SSL *ssl, const char *hint, char *identity, | |
| unsigned max_identity_len, uint8_t *psk, | |
| unsigned max_psk_len)); | |
| // SSL_set_psk_client_callback sets the callback to be called when TLS 1.2 PSK | |
| // is negotiated on the client. This callback must be set to enable PSK cipher | |
| // suites on the client. See also `SSL_CTX_set_psk_client_callback`. | |
| OPENSSL_EXPORT void SSL_set_psk_client_callback( | |
| SSL *ssl, unsigned (*cb)(SSL *ssl, const char *hint, char *identity, | |
| unsigned max_identity_len, uint8_t *psk, | |
| unsigned max_psk_len)); | |
| // SSL_CTX_set_psk_server_callback sets the callback to be called when TLS 1.2 | |
| // PSK is negotiated on the server. This callback must be set to enable PSK | |
| // cipher suites on the server. | |
| // | |
| // The callback is passed the identity in `identity`. It should write a PSK of | |
| // length at most `max_psk_len` to `psk` and return the number of bytes written | |
| // or zero if the PSK identity is unknown. | |
| OPENSSL_EXPORT void SSL_CTX_set_psk_server_callback( | |
| SSL_CTX *ctx, unsigned (*cb)(SSL *ssl, const char *identity, uint8_t *psk, | |
| unsigned max_psk_len)); | |
| // SSL_set_psk_server_callback sets the callback to be called when TLS 1.2 PSK | |
| // is negotiated on the server. This callback must be set to enable PSK cipher | |
| // suites on the server. See also `SSL_CTX_set_psk_server_callback`. | |
| OPENSSL_EXPORT void SSL_set_psk_server_callback( | |
| SSL *ssl, unsigned (*cb)(SSL *ssl, const char *identity, uint8_t *psk, | |
| unsigned max_psk_len)); | |
| // SSL_CTX_use_psk_identity_hint configures server connections to advertise an | |
| // identity hint of `identity_hint`. It returns one on success and zero on | |
| // error. | |
| OPENSSL_EXPORT int SSL_CTX_use_psk_identity_hint(SSL_CTX *ctx, | |
| const char *identity_hint); | |
| // SSL_use_psk_identity_hint configures server connections to advertise an | |
| // identity hint of `identity_hint`. It returns one on success and zero on | |
| // error. | |
| OPENSSL_EXPORT int SSL_use_psk_identity_hint(SSL *ssl, | |
| const char *identity_hint); | |
| // SSL_get_psk_identity_hint returns the TLS 1.2 PSK identity hint advertised | |
| // for `ssl` or NULL if there is none. | |
| OPENSSL_EXPORT const char *SSL_get_psk_identity_hint(const SSL *ssl); | |
| // SSL_get_psk_identity, after the handshake completes, returns the TLS 1.2 PSK | |
| // identity that was negotiated by `ssl` or NULL if PSK was not used. | |
| OPENSSL_EXPORT const char *SSL_get_psk_identity(const SSL *ssl); | |
| // Delegated credentials. | |
| // | |
| // Delegated credentials (RFC 9345) allow a TLS 1.3 endpoint to use its | |
| // certificate to issue new credentials for authentication. Once issued, | |
| // credentials can't be revoked. In order to mitigate the damage in case the | |
| // credential secret key is compromised, the credential is only valid for a | |
| // short time (days, hours, or even minutes). | |
| // | |
| // Currently only the authenticating side, as a server, is implemented. To | |
| // authenticate with delegated credentials, construct an `SSL_CREDENTIAL` with | |
| // `SSL_CREDENTIAL_new_delegated` and add it to the credential list. See also | |
| // `SSL_CTX_add1_credential`. Callers may configure a mix of delegated | |
| // credentials and X.509 credentials on the same `SSL` or `SSL_CTX` to support a | |
| // range of clients. | |
| // SSL_CREDENTIAL_new_delegated returns a new, empty delegated credential, or | |
| // NULL on error. Callers should release the result with `SSL_CREDENTIAL_free` | |
| // when done. | |
| // | |
| // Callers should configure a delegated credential, certificate chain and | |
| // private key on the credential, along with other properties, then add it with | |
| // `SSL_CTX_add1_credential`. | |
| OPENSSL_EXPORT SSL_CREDENTIAL *SSL_CREDENTIAL_new_delegated(void); | |
| // SSL_CREDENTIAL_set1_delegated_credential sets `cred`'s delegated credentials | |
| // structure to `dc`. It returns one on success and zero on error, including if | |
| // `dc` is malformed. This should be a DelegatedCredential structure, signed by | |
| // the end-entity certificate, as described in RFC 9345. | |
| OPENSSL_EXPORT int SSL_CREDENTIAL_set1_delegated_credential( | |
| SSL_CREDENTIAL *cred, CRYPTO_BUFFER *dc); | |
| // Raw Public Keys (RFC 7250). | |
| // | |
| // Raw public keys can be used (e.g., instead of X.509 certificates) to | |
| // authenticate a TLS connection, assuming an out-of-band mechanism has been | |
| // used to bind the public keys to their presenting entities. | |
| // | |
| // A caller wishing to authenticate using a raw public key must construct an | |
| // `SSL_CREDENTIAL` with `SSL_CREDENTIAL_new_raw_public_key` and add it to the | |
| // credential list (see `SSL_CTX_add1_credential`). Callers may configure a mix | |
| // of raw public keys and other credentials on the same `SSL` or `SSL_CTX` to | |
| // support a range of peers. | |
| // | |
| // When raw public keys are in use, the client_certificate_type and | |
| // server_certificate_type extensions are sent in the handshake to indicate to | |
| // the peer which type(s) of certificate(s) can be exchanged. | |
| // | |
| // To verify a received raw public key, the caller must set a custom | |
| // verification callback (see `SSL_CTX_set_custom_verify`). If no callback is | |
| // configured, raw public keys will be rejected by default. | |
| // TLSEXT_cert_type_* are certificate types with values taken from the "TLS | |
| // Certificate Types" subregistry of the TLS Extensions registry. | |
| #define TLSEXT_cert_type_x509 0x00 | |
| #define TLSEXT_cert_type_rpk 0x02 | |
| // SSL_CREDENTIAL_new_raw_public_key returns a new raw public key credential | |
| // using `pkey` as the public and private key, or nullptr on error. `pkey` must | |
| // have both a private and public key. | |
| // | |
| // Callers should then add the returned credential with | |
| // `SSL_CTX_add1_credential` and release it with `SSL_CREDENTIAL_free` when | |
| // done. | |
| // | |
| // This credential may be configured before the handshake or dynamically in the | |
| // early callback (see `SSL_CTX_set_select_certificate_cb`) and certificate | |
| // callback (see `SSL_CTX_set_cert_cb`). | |
| OPENSSL_EXPORT SSL_CREDENTIAL *SSL_CREDENTIAL_new_raw_public_key( | |
| EVP_PKEY *pkey); | |
| // SSL_CREDENTIAL_new_raw_public_key_custom returns a new raw public key | |
| // credential using `pubkey` as the public key and `method` as the custom | |
| // private key method, or nullptr on error. `pkey` must have a public key. | |
| // `method` must remain valid for the lifetime of the returned credential. See | |
| // `SSL_CREDENTIAL_set_private_key_method` for how the custom private key method | |
| // is used. | |
| // | |
| // Callers should then add the returned credential with | |
| // `SSL_CTX_add1_credential` and release it with `SSL_CREDENTIAL_free` when | |
| // done. | |
| // | |
| // This credential may be configured before the handshake or dynamically in the | |
| // early callback (see `SSL_CTX_set_select_certificate_cb`) and certificate | |
| // callback (see `SSL_CTX_set_cert_cb`). | |
| OPENSSL_EXPORT SSL_CREDENTIAL *SSL_CREDENTIAL_new_raw_public_key_custom( | |
| EVP_PKEY *pubkey, const SSL_PRIVATE_KEY_METHOD *method); | |
| // SSL_CTX_set1_accepted_peer_cert_types sets the types of certificates that the | |
| // caller wishes to accept from the peer, for `ctx`. `values` is a nonempty list | |
| // of `num_values` certificate types (`TLSEXT_cert_type_*` values) in preference | |
| // order. If a valid list is not configured explicitly, only X.509 certificates | |
| // are accepted by default. This function returns one on success or zero on | |
| // failure. | |
| OPENSSL_EXPORT int SSL_CTX_set1_accepted_peer_cert_types(SSL_CTX *ctx, | |
| const uint8_t *values, | |
| size_t num_values); | |
| // SSL_set1_accepted_peer_cert_types behaves like | |
| // `SSL_CTX_set1_accepted_peer_cert_types`, but configures the values on `ssl`. | |
| OPENSSL_EXPORT int SSL_set1_accepted_peer_cert_types(SSL *ssl, | |
| const uint8_t *values, | |
| size_t num_values); | |
| // SSL_CTX_set1_available_client_cert_types sets the types of certificates that | |
| // the caller, as a client, wishes to advertise in order to authenticate itself | |
| // to the server, for `ctx`. `values` is a nonempty list of `num_values` | |
| // certificate types (`TLSEXT_cert_type_*` values) in preference order. Any | |
| // values configured via this function will be sent in the | |
| // client_certificate_type extension in ClientHello. `values` may be empty to | |
| // indicate omission of the client_certificate_extension. | |
| // | |
| // Calling this function is optional: by default, the client_certificate_type | |
| // extension for a client will be determined implicitly by the types of | |
| // `SSL_CREDENTIAL`s present in the credential list. This function should only | |
| // be used if the caller configures client credentials late (after the handshake | |
| // begins), or wishes to override the default order derived from the credential | |
| // list. This returns one on success or zero on failure. | |
| OPENSSL_EXPORT int SSL_CTX_set1_available_client_cert_types( | |
| SSL_CTX *ctx, const uint8_t *values, size_t num_values); | |
| // SSL_set1_available_client_cert_types behaves like | |
| // `SSL_CTX_set1_available_client_cert_types`, but configures the values on | |
| // `ssl`. | |
| OPENSSL_EXPORT int SSL_set1_available_client_cert_types(SSL *ssl, | |
| const uint8_t *values, | |
| size_t num_values); | |
| // SSL_get_peer_cert_type returns a `TLSEXT_cert_type_*` value describing the | |
| // type of the peer's certificate. If the peer has no certificate, or it is too | |
| // early in the handshake to receive one, this function returns | |
| // `TLSEXT_cert_type_x509`. | |
| OPENSSL_EXPORT int SSL_get_peer_cert_type(const SSL *ssl); | |
| // SSL_get0_peer_rpk returns the peer's raw public key from `ssl`, if the peer | |
| // has sent one in the handshake. It returns nullptr otherwise. | |
| OPENSSL_EXPORT EVP_PKEY *SSL_get0_peer_rpk(const SSL *ssl); | |
| // Password Authenticated Key Exchange (PAKE). | |
| // | |
| // Password Authenticated Key Exchange protocols allow client and server to | |
| // mutually authenticate one another using knowledge of a password or other | |
| // low-entropy secret. While the TLS 1.3 pre-shared key (PSK) mechanism can | |
| // authenticate a high-entropy secret, it cannot be used with low-entropy | |
| // secrets as the PSK binder values can be used to mount a dictionary attack on | |
| // a low-entropy PSK. Using TLS 1.3 with a PAKE limits an attacker to confirming | |
| // one password guess per handshake attempt. | |
| // | |
| // WARNING: The PAKE mode in TLS is not a general-purpose authentication scheme. | |
| // As the underlying secret is still low-entropy, callers must limit brute force | |
| // attacks across multiple connections, especially in multi-connection protocols | |
| // such as HTTP. The `error_limit` and `rate_limit` parameters in the functions | |
| // below may be used to implement this, provided the same `SSL_CREDENTIAL` | |
| // object is used across connections. Applications using multiple connections | |
| // should use the PAKE credential only once to authenticate a high-entropy | |
| // secret. For example, an application may export a PSK from a PAKE connection | |
| // with `SSL_export_keying_material`, and then pass the result to | |
| // `SSL_CREDENTIAL_new_pre_shared_key` to authenticate subsequent connections. | |
| // | |
| // WARNING: PAKE support in TLS is still experimental and may change as the | |
| // standard evolves. See | |
| // https://chris-wood.github.io/draft-bmw-tls-pake13/draft-bmw-tls-pake13.html | |
| // | |
| // Currently, only the SPAKE2PLUS_V1 named PAKE algorithm is implemented; see | |
| // https://chris-wood.github.io/draft-bmw-tls-pake13/draft-bmw-tls-pake13.html#section-8.1. | |
| // SSL_PAKE_SPAKE2PLUSV1 is the codepoint for SPAKE2PLUS_V1. See | |
| // https://chris-wood.github.io/draft-bmw-tls-pake13/draft-bmw-tls-pake13.html#name-named-pake-registry. | |
| #define SSL_PAKE_SPAKE2PLUSV1 0x7d96 | |
| // SSL_spake2plusv1_register computes the values that the client (w0, | |
| // w1) and server (w0, registration_record) require to run SPAKE2+. These values | |
| // can be used when calling `SSL_CREDENTIAL_new_spake2plusv1_client` and | |
| // `SSL_CREDENTIAL_new_spake2plusv1_server`. The client and server identities | |
| // must match the values passed to those functions. | |
| // | |
| // Returns one on success and zero on error. | |
| OPENSSL_EXPORT int SSL_spake2plusv1_register( | |
| uint8_t out_w0[32], uint8_t out_w1[32], uint8_t out_registration_record[65], | |
| const uint8_t *password, size_t password_len, | |
| const uint8_t *client_identity, size_t client_identity_len, | |
| const uint8_t *server_identity, size_t server_identity_len); | |
| // SSL_CREDENTIAL_new_spake2plusv1_client creates a new `SSL_CREDENTIAL` that | |
| // authenticates using SPAKE2+. It is to be used with a TLS client. | |
| // | |
| // The `context`, `client_identity`, and `server_identity` fields serve to | |
| // identity the SPAKE2+ settings and both sides of a connection must agree on | |
| // these values. If `context` is `NULL`, a default value will be used. | |
| // | |
| // `error_limit` is the number of failed handshakes allowed on the credential. | |
| // After the limit is reached, using the credential will fail. Ideally this | |
| // value is set to 1. Setting it to a higher value allows an attacker to have | |
| // that many attempts at guessing the password using this `SSL_CREDENTIAL`. | |
| // (Assuming that multiple TLS connections are allowed.) | |
| // | |
| // `w0` and `w1` come from calling `SSL_spake2plusv1_register`. | |
| // | |
| // Unlike most `SSL_CREDENTIAL`s, PAKE client credentials must be the only | |
| // credential configured on the connection. BoringSSL does not currently support | |
| // configuring multiple PAKE credentials as a client, or configuring a mix of | |
| // PAKE and non-PAKE credentials. Once a PAKE credential is configured, the | |
| // connection will require the server to authenticate with the same secret, so a | |
| // successful connection then implies that the server supported the PAKE and | |
| // knew the password. | |
| OPENSSL_EXPORT SSL_CREDENTIAL *SSL_CREDENTIAL_new_spake2plusv1_client( | |
| const uint8_t *context, size_t context_len, const uint8_t *client_identity, | |
| size_t client_identity_len, const uint8_t *server_identity, | |
| size_t server_identity_len, uint32_t error_limit, const uint8_t *w0, | |
| size_t w0_len, const uint8_t *w1, size_t w1_len); | |
| // SSL_CREDENTIAL_new_spake2plusv1_server creates a new `SSL_CREDENTIAL` that | |
| // authenticates using SPAKE2+. It is to be used with a TLS server. | |
| // | |
| // The `context`, `client_identity`, and `server_identity` fields serve to | |
| // identity the SPAKE2+ settings and both sides of a connection must agree on | |
| // these values. If `context` is `NULL`, a default value will be used. | |
| // | |
| // `rate_limit` is the number of failed or unfinished handshakes allowed on the | |
| // credential. After the limit is reached, using the credential will fail. | |
| // Ideally this value is set to 1. Setting it to a higher value allows an | |
| // attacker to have that many attempts at guessing the password using this | |
| // `SSL_CREDENTIAL`. (Assuming that multiple TLS connections are allowed.) | |
| // | |
| // WARNING: `rate_limit` differs from the client's `error_limit` parameter. | |
| // Server PAKE credentials must temporarily deduct incomplete handshakes from | |
| // the limit, until the peer completes the handshake correctly. Thus | |
| // applications that use multiple connections in parallel may need a higher | |
| // limit, and thus higher attacker exposure, to avoid failures. Such | |
| // applications should instead use one PAKE-based connection to established a | |
| // high-entropy secret (e.g. with `SSL_export_keying_material`) instead of | |
| // repeating the PAKE exchange for each connection. | |
| // | |
| // `w0` and `registration_record` come from calling `SSL_spake2plusv1_register`, | |
| // which may be computed externally so that the server does not know the | |
| // password, or a password-equivalent secret. | |
| // | |
| // A server wishing to support a PAKE should install one of these credentials. | |
| // It is also possible to install certificate-based credentials, in which case | |
| // both PAKE and non-PAKE clients can be supported. However, if only a PAKE | |
| // credential is installed then the server knows that any successfully-connected | |
| // clients also knows the password. Otherwise, the server must be careful to | |
| // inspect the credential used for a connection before assuming that. | |
| OPENSSL_EXPORT SSL_CREDENTIAL *SSL_CREDENTIAL_new_spake2plusv1_server( | |
| const uint8_t *context, size_t context_len, const uint8_t *client_identity, | |
| size_t client_identity_len, const uint8_t *server_identity, | |
| size_t server_identity_len, uint32_t rate_limit, const uint8_t *w0, | |
| size_t w0_len, const uint8_t *registration_record, | |
| size_t registration_record_len); | |
| // QUIC integration. | |
| // | |
| // QUIC acts as an underlying transport for the TLS 1.3 handshake. The following | |
| // functions allow a QUIC implementation to serve as the underlying transport as | |
| // described in RFC 9001. | |
| // | |
| // When configured for QUIC, `SSL_do_handshake` will drive the handshake as | |
| // before, but it will not use the configured `BIO`. It will call functions on | |
| // `SSL_QUIC_METHOD` to configure secrets and send data. If data is needed from | |
| // the peer, it will return `SSL_ERROR_WANT_READ`. As the caller receives data | |
| // it can decrypt, it calls `SSL_provide_quic_data`. Subsequent | |
| // `SSL_do_handshake` calls will then consume that data and progress the | |
| // handshake. After the handshake is complete, the caller should continue to | |
| // call `SSL_provide_quic_data` for any post-handshake data, followed by | |
| // `SSL_process_quic_post_handshake` to process it. It is an error to call | |
| // `SSL_read` and `SSL_write` in QUIC. | |
| // | |
| // 0-RTT behaves similarly to `TLS_method`'s usual behavior. `SSL_do_handshake` | |
| // returns early as soon as the client (respectively, server) is allowed to send | |
| // 0-RTT (respectively, half-RTT) data. The caller should then call | |
| // `SSL_do_handshake` again to consume the remaining handshake messages and | |
| // confirm the handshake. As a client, `SSL_ERROR_EARLY_DATA_REJECTED` and | |
| // `SSL_reset_early_data_reject` behave as usual. | |
| // | |
| // See https://www.rfc-editor.org/rfc/rfc9001.html#section-4.1 for more details. | |
| // | |
| // To avoid DoS attacks, the QUIC implementation must limit the amount of data | |
| // being queued up. The implementation can call | |
| // `SSL_quic_max_handshake_flight_len` to get the maximum buffer length at each | |
| // encryption level. | |
| // | |
| // QUIC implementations must additionally configure transport parameters with | |
| // `SSL_set_quic_transport_params`. `SSL_get_peer_quic_transport_params` may be | |
| // used to query the value received from the peer. BoringSSL handles this | |
| // extension as an opaque byte string. The caller is responsible for serializing | |
| // and parsing them. See https://www.rfc-editor.org/rfc/rfc9000#section-7.4 for | |
| // details. | |
| // | |
| // QUIC additionally imposes restrictions on 0-RTT. In particular, the QUIC | |
| // transport layer requires that if a server accepts 0-RTT data, then the | |
| // transport parameters sent on the resumed connection must not lower any limits | |
| // compared to the transport parameters that the server sent on the connection | |
| // where the ticket for 0-RTT was issued. In effect, the server must remember | |
| // the transport parameters with the ticket. Application protocols running on | |
| // QUIC may impose similar restrictions, for example HTTP/3's restrictions on | |
| // SETTINGS frames. | |
| // | |
| // BoringSSL implements this check by doing a byte-for-byte comparison of an | |
| // opaque context passed in by the server. This context must be the same on the | |
| // connection where the ticket was issued and the connection where that ticket | |
| // is used for 0-RTT. If there is a mismatch, or the context was not set, | |
| // BoringSSL will reject early data (but not reject the resumption attempt). | |
| // This context is set via `SSL_set_quic_early_data_context` and should cover | |
| // both transport parameters and any application state. | |
| // `SSL_set_quic_early_data_context` must be called on the server with a | |
| // non-empty context if the server is to support 0-RTT in QUIC. | |
| // | |
| // BoringSSL does not perform any client-side checks on the transport | |
| // parameters received from a server that also accepted early data. It is up to | |
| // the caller to verify that the received transport parameters do not lower any | |
| // limits, and to close the QUIC connection if that is not the case. The same | |
| // holds for any application protocol state remembered for 0-RTT, e.g. HTTP/3 | |
| // SETTINGS. | |
| // ssl_encryption_level_t represents an encryption level in TLS 1.3. Values in | |
| // this enum match the first 4 epochs used in DTLS 1.3 (section 6.1). | |
| enum ssl_encryption_level_t BORINGSSL_ENUM_INT { | |
| ssl_encryption_initial = 0, | |
| ssl_encryption_early_data = 1, | |
| ssl_encryption_handshake = 2, | |
| ssl_encryption_application = 3, | |
| }; | |
| // ssl_quic_method_st (aka `SSL_QUIC_METHOD`) describes custom QUIC hooks. | |
| struct ssl_quic_method_st { | |
| // set_read_secret configures the read secret and cipher suite for the given | |
| // encryption level. It returns one on success and zero to terminate the | |
| // handshake with an error. It will be called at most once per encryption | |
| // level. | |
| // | |
| // BoringSSL will not release read keys before QUIC may use them. Once a level | |
| // has been initialized, QUIC may begin processing data from it. Handshake | |
| // data should be passed to `SSL_provide_quic_data` and application data (if | |
| // `level` is `ssl_encryption_early_data` or `ssl_encryption_application`) may | |
| // be processed according to the rules of the QUIC protocol. | |
| // | |
| // QUIC ACKs packets at the same encryption level they were received at, | |
| // except that client `ssl_encryption_early_data` (0-RTT) packets trigger | |
| // server `ssl_encryption_application` (1-RTT) ACKs. BoringSSL will always | |
| // install ACK-writing keys with `set_write_secret` before the packet-reading | |
| // keys with `set_read_secret`. This ensures the caller can always ACK any | |
| // packet it decrypts. Note this means the server installs 1-RTT write keys | |
| // before 0-RTT read keys. | |
| // | |
| // The converse is not true. An encryption level may be configured with write | |
| // secrets a roundtrip before the corresponding secrets for reading ACKs is | |
| // available. | |
| int (*set_read_secret)(SSL *ssl, enum ssl_encryption_level_t level, | |
| const SSL_CIPHER *cipher, const uint8_t *secret, | |
| size_t secret_len); | |
| // set_write_secret behaves like `set_read_secret` but configures the write | |
| // secret and cipher suite for the given encryption level. It will be called | |
| // at most once per encryption level. | |
| // | |
| // BoringSSL will not release write keys before QUIC may use them. If `level` | |
| // is `ssl_encryption_early_data` or `ssl_encryption_application`, QUIC may | |
| // begin sending application data at `level`. However, note that BoringSSL | |
| // configures server `ssl_encryption_application` write keys before the client | |
| // Finished. This allows QUIC to send half-RTT data, but the handshake is not | |
| // confirmed at this point and, if requesting client certificates, the client | |
| // is not yet authenticated. | |
| // | |
| // See `set_read_secret` for additional invariants between packets and their | |
| // ACKs. | |
| // | |
| // Note that, on 0-RTT reject, the `ssl_encryption_early_data` write secret | |
| // may use a different cipher suite from the other keys. | |
| int (*set_write_secret)(SSL *ssl, enum ssl_encryption_level_t level, | |
| const SSL_CIPHER *cipher, const uint8_t *secret, | |
| size_t secret_len); | |
| // add_handshake_data adds handshake data to the current flight at the given | |
| // encryption level. It returns one on success and zero on error. | |
| // | |
| // BoringSSL will pack data from a single encryption level together, but a | |
| // single handshake flight may include multiple encryption levels. Callers | |
| // should defer writing data to the network until `flush_flight` to better | |
| // pack QUIC packets into transport datagrams. | |
| // | |
| // If `level` is not `ssl_encryption_initial`, this function will not be | |
| // called before `level` is initialized with `set_write_secret`. | |
| int (*add_handshake_data)(SSL *ssl, enum ssl_encryption_level_t level, | |
| const uint8_t *data, size_t len); | |
| // flush_flight is called when the current flight is complete and should be | |
| // written to the transport. Note a flight may contain data at several | |
| // encryption levels. It returns one on success and zero on error. | |
| int (*flush_flight)(SSL *ssl); | |
| // send_alert sends a fatal alert at the specified encryption level. It | |
| // returns one on success and zero on error. | |
| // | |
| // If `level` is not `ssl_encryption_initial`, this function will not be | |
| // called before `level` is initialized with `set_write_secret`. | |
| int (*send_alert)(SSL *ssl, enum ssl_encryption_level_t level, uint8_t alert); | |
| }; | |
| // SSL_quic_max_handshake_flight_len returns the maximum number of bytes | |
| // that may be received at the given encryption level. This function should be | |
| // used to limit buffering in the QUIC implementation. | |
| // | |
| // See https://www.rfc-editor.org/rfc/rfc9000#section-7.5 | |
| OPENSSL_EXPORT size_t SSL_quic_max_handshake_flight_len( | |
| const SSL *ssl, enum ssl_encryption_level_t level); | |
| // SSL_quic_read_level returns the current read encryption level. | |
| // | |
| // TODO(davidben): Is it still necessary to expose this function to callers? | |
| // QUICHE does not use it. | |
| OPENSSL_EXPORT enum ssl_encryption_level_t SSL_quic_read_level(const SSL *ssl); | |
| // SSL_quic_write_level returns the current write encryption level. | |
| // | |
| // TODO(davidben): Is it still necessary to expose this function to callers? | |
| // QUICHE does not use it. | |
| OPENSSL_EXPORT enum ssl_encryption_level_t SSL_quic_write_level(const SSL *ssl); | |
| // SSL_provide_quic_data provides data from QUIC at a particular encryption | |
| // level `level`. It returns one on success and zero on error. Note this | |
| // function will return zero if the handshake is not expecting data from `level` | |
| // at this time. The QUIC implementation should then close the connection with | |
| // an error. | |
| OPENSSL_EXPORT int SSL_provide_quic_data(SSL *ssl, | |
| enum ssl_encryption_level_t level, | |
| const uint8_t *data, size_t len); | |
| // SSL_process_quic_post_handshake processes any data that QUIC has provided | |
| // after the handshake has completed. This includes NewSessionTicket messages | |
| // sent by the server. It returns one on success and zero on error. | |
| OPENSSL_EXPORT int SSL_process_quic_post_handshake(SSL *ssl); | |
| // SSL_CTX_set_quic_method configures the QUIC hooks. This should only be | |
| // configured with a minimum version of TLS 1.3. `quic_method` must remain valid | |
| // for the lifetime of `ctx`. It returns one on success and zero on error. | |
| OPENSSL_EXPORT int SSL_CTX_set_quic_method(SSL_CTX *ctx, | |
| const SSL_QUIC_METHOD *quic_method); | |
| // SSL_set_quic_method configures the QUIC hooks. This should only be | |
| // configured with a minimum version of TLS 1.3. `quic_method` must remain valid | |
| // for the lifetime of `ssl`. It returns one on success and zero on error. | |
| OPENSSL_EXPORT int SSL_set_quic_method(SSL *ssl, | |
| const SSL_QUIC_METHOD *quic_method); | |
| // SSL_set_quic_transport_params configures `ssl` to send `params` (of length | |
| // `params_len`) in the quic_transport_parameters extension in either the | |
| // ClientHello or EncryptedExtensions handshake message. It is an error to set | |
| // transport parameters if `ssl` is not configured for QUIC. The buffer pointed | |
| // to by `params` only need be valid for the duration of the call to this | |
| // function. This function returns 1 on success and 0 on failure. | |
| OPENSSL_EXPORT int SSL_set_quic_transport_params(SSL *ssl, | |
| const uint8_t *params, | |
| size_t params_len); | |
| // SSL_get_peer_quic_transport_params provides the caller with the value of the | |
| // quic_transport_parameters extension sent by the peer. A pointer to the buffer | |
| // containing the TransportParameters will be put in `*out_params`, and its | |
| // length in `*params_len`. This buffer will be valid for the lifetime of the | |
| // `SSL`. If no params were received from the peer, `*out_params_len` will be 0. | |
| OPENSSL_EXPORT void SSL_get_peer_quic_transport_params( | |
| const SSL *ssl, const uint8_t **out_params, size_t *out_params_len); | |
| // SSL_set_quic_use_legacy_codepoint configures whether to use the legacy QUIC | |
| // extension codepoint 0xffa5 as opposed to the official value 57. Call with | |
| // `use_legacy` set to 1 to use 0xffa5 and call with 0 to use 57. By default, | |
| // the standard code point is used. | |
| OPENSSL_EXPORT void SSL_set_quic_use_legacy_codepoint(SSL *ssl, int use_legacy); | |
| // SSL_set_quic_early_data_context configures a context string in QUIC servers | |
| // for accepting early data. If a resumption connection offers early data, the | |
| // server will check if the value matches that of the connection which minted | |
| // the ticket. If not, resumption still succeeds but early data is rejected. | |
| // This should include all QUIC Transport Parameters except ones specified that | |
| // the client MUST NOT remember. This should also include any application | |
| // protocol-specific state. For HTTP/3, this should be the serialized server | |
| // SETTINGS frame and the QUIC Transport Parameters (except the stateless reset | |
| // token). | |
| // | |
| // This function may be called before `SSL_do_handshake` or during server | |
| // certificate selection. It returns 1 on success and 0 on failure. | |
| OPENSSL_EXPORT int SSL_set_quic_early_data_context(SSL *ssl, | |
| const uint8_t *context, | |
| size_t context_len); | |
| // Early data. | |
| // | |
| // WARNING: 0-RTT support in BoringSSL is currently experimental and not fully | |
| // implemented. It may cause interoperability or security failures when used. | |
| // | |
| // Early data, or 0-RTT, is a feature in TLS 1.3 which allows clients to send | |
| // data on the first flight during a resumption handshake. This can save a | |
| // round-trip in some application protocols. | |
| // | |
| // WARNING: A 0-RTT handshake has different security properties from normal | |
| // handshake, so it is off by default unless opted in. In particular, early data | |
| // is replayable by a network attacker. Callers must account for this when | |
| // sending or processing data before the handshake is confirmed. See RFC 8446 | |
| // for more information. | |
| // | |
| // As a server, if early data is accepted, `SSL_do_handshake` will complete as | |
| // soon as the ClientHello is processed and server flight sent. `SSL_write` may | |
| // be used to send half-RTT data. `SSL_read` will consume early data and | |
| // transition to 1-RTT data as appropriate. Prior to the transition, | |
| // `SSL_in_init` will report the handshake is still in progress. Callers may use | |
| // it or `SSL_in_early_data` to defer or reject requests as needed. | |
| // | |
| // Early data as a client is more complex. If the offered session (see | |
| // `SSL_set_session`) is 0-RTT-capable, the handshake will return after sending | |
| // the ClientHello. The predicted peer certificates and ALPN protocol will be | |
| // available via the usual APIs. `SSL_write` will write early data, up to the | |
| // session's limit. Writes past this limit and `SSL_read` will complete the | |
| // handshake before continuing. Callers may also call `SSL_do_handshake` again | |
| // to complete the handshake sooner. | |
| // | |
| // If the server accepts early data, the handshake will succeed. `SSL_read` and | |
| // `SSL_write` will then act as in a 1-RTT handshake. The peer certificates and | |
| // ALPN protocol will be as predicted and need not be re-queried. | |
| // | |
| // If the server rejects early data, `SSL_do_handshake` (and thus `SSL_read` and | |
| // `SSL_write`) will then fail with `SSL_get_error` returning | |
| // `SSL_ERROR_EARLY_DATA_REJECTED`. The caller should treat this as a connection | |
| // error and most likely perform a high-level retry. Note the server may still | |
| // have processed the early data due to attacker replays. | |
| // | |
| // To then continue the handshake on the original connection, use | |
| // `SSL_reset_early_data_reject`. The connection will then behave as one which | |
| // had not yet completed the handshake. This allows a faster retry than making a | |
| // fresh connection. `SSL_do_handshake` will complete the full handshake, | |
| // possibly resulting in different peer certificates, ALPN protocol, and other | |
| // properties. The caller must disregard any values from before the reset and | |
| // query again. | |
| // | |
| // Finally, to implement the fallback described in RFC 8446 appendix D.3, retry | |
| // on a fresh connection without 0-RTT if the handshake fails with | |
| // `SSL_R_WRONG_VERSION_ON_EARLY_DATA`. | |
| // SSL_CTX_set_early_data_enabled sets whether early data is allowed to be used | |
| // with resumptions using `ctx`. | |
| OPENSSL_EXPORT void SSL_CTX_set_early_data_enabled(SSL_CTX *ctx, int enabled); | |
| // SSL_set_early_data_enabled sets whether early data is allowed to be used | |
| // with resumptions using `ssl`. See `SSL_CTX_set_early_data_enabled` for more | |
| // information. | |
| OPENSSL_EXPORT void SSL_set_early_data_enabled(SSL *ssl, int enabled); | |
| // SSL_in_early_data returns one if `ssl` has a pending handshake that has | |
| // progressed enough to send or receive early data. Clients may call `SSL_write` | |
| // to send early data, but `SSL_read` will complete the handshake before | |
| // accepting application data. Servers may call `SSL_read` to read early data | |
| // and `SSL_write` to send half-RTT data. | |
| OPENSSL_EXPORT int SSL_in_early_data(const SSL *ssl); | |
| // SSL_SESSION_early_data_capable returns whether early data would have been | |
| // attempted with `session` if enabled. | |
| OPENSSL_EXPORT int SSL_SESSION_early_data_capable(const SSL_SESSION *session); | |
| // SSL_SESSION_copy_without_early_data returns a copy of `session` with early | |
| // data disabled. If `session` already does not support early data, it returns | |
| // `session` with the reference count increased. The caller takes ownership of | |
| // the result and must release it with `SSL_SESSION_free`. | |
| // | |
| // This function may be used on the client to clear early data support from | |
| // existing sessions when the server rejects early data. In particular, | |
| // `SSL_R_WRONG_VERSION_ON_EARLY_DATA` requires a fresh connection to retry, and | |
| // the client would not want 0-RTT enabled for the next connection attempt. | |
| OPENSSL_EXPORT SSL_SESSION *SSL_SESSION_copy_without_early_data( | |
| SSL_SESSION *session); | |
| // SSL_early_data_accepted returns whether early data was accepted on the | |
| // handshake performed by `ssl`. | |
| OPENSSL_EXPORT int SSL_early_data_accepted(const SSL *ssl); | |
| // SSL_reset_early_data_reject resets `ssl` after an early data reject. All | |
| // 0-RTT state is discarded, including any pending `SSL_write` calls. The caller | |
| // should treat `ssl` as a logically fresh connection, usually by driving the | |
| // handshake to completion using `SSL_do_handshake`. | |
| // | |
| // It is an error to call this function on an `SSL` object that is not signaling | |
| // `SSL_ERROR_EARLY_DATA_REJECTED`. | |
| OPENSSL_EXPORT void SSL_reset_early_data_reject(SSL *ssl); | |
| // SSL_get_ticket_age_skew returns the difference, in seconds, between the | |
| // client-sent ticket age and the server-computed value in TLS 1.3 server | |
| // connections which resumed a session. | |
| OPENSSL_EXPORT int32_t SSL_get_ticket_age_skew(const SSL *ssl); | |
| // An ssl_early_data_reason_t describes why 0-RTT was accepted or rejected. | |
| // These values are persisted to logs. Entries should not be renumbered and | |
| // numeric values should never be reused. | |
| enum ssl_early_data_reason_t BORINGSSL_ENUM_INT { | |
| // The handshake has not progressed far enough for the 0-RTT status to be | |
| // known. | |
| ssl_early_data_unknown = 0, | |
| // 0-RTT is disabled for this connection. | |
| ssl_early_data_disabled = 1, | |
| // 0-RTT was accepted. | |
| ssl_early_data_accepted = 2, | |
| // The negotiated protocol version does not support 0-RTT. | |
| ssl_early_data_protocol_version = 3, | |
| // The peer declined to offer or accept 0-RTT for an unknown reason. | |
| ssl_early_data_peer_declined = 4, | |
| // The client did not offer a session. | |
| ssl_early_data_no_session_offered = 5, | |
| // The server declined to resume the session. | |
| ssl_early_data_session_not_resumed = 6, | |
| // The session does not support 0-RTT. | |
| ssl_early_data_unsupported_for_session = 7, | |
| // The server sent a HelloRetryRequest. | |
| ssl_early_data_hello_retry_request = 8, | |
| // The negotiated ALPN protocol did not match the session. | |
| ssl_early_data_alpn_mismatch = 9, | |
| // The connection negotiated Channel ID, which is incompatible with 0-RTT. | |
| ssl_early_data_channel_id = 10, | |
| // Value 11 is reserved. (It has historically `ssl_early_data_token_binding`.) | |
| // The client and server ticket age were too far apart. | |
| ssl_early_data_ticket_age_skew = 12, | |
| // QUIC parameters differ between this connection and the original. | |
| ssl_early_data_quic_parameter_mismatch = 13, | |
| // The application settings did not match the session. | |
| ssl_early_data_alps_mismatch = 14, | |
| // The value of the largest entry. | |
| ssl_early_data_reason_max_value = ssl_early_data_alps_mismatch, | |
| }; | |
| // SSL_get_early_data_reason returns details why 0-RTT was accepted or rejected | |
| // on `ssl`. This is primarily useful on the server. | |
| OPENSSL_EXPORT enum ssl_early_data_reason_t SSL_get_early_data_reason( | |
| const SSL *ssl); | |
| // SSL_early_data_reason_string returns a string representation for `reason`, or | |
| // NULL if `reason` is unknown. This function may be used for logging. | |
| // This string is always ASCII-encoded. | |
| OPENSSL_EXPORT const char *SSL_early_data_reason_string( | |
| enum ssl_early_data_reason_t reason); | |
| // Encrypted ClientHello. | |
| // | |
| // ECH is a mechanism for encrypting the entire ClientHello message in TLS 1.3. | |
| // This can prevent observers from seeing cleartext information about the | |
| // connection, such as the server_name extension. | |
| // | |
| // By default, BoringSSL will treat the server name, session ticket, and client | |
| // certificate as secret, but most other parameters, such as the ALPN protocol | |
| // list will be treated as public and sent in the cleartext ClientHello. Other | |
| // APIs may be added for applications with different secrecy requirements. | |
| // | |
| // ECH support in BoringSSL is still experimental and under development. | |
| // | |
| // See RFC 9849. | |
| // SSL_set_enable_ech_grease configures whether the client will send a GREASE | |
| // ECH extension when no supported ECHConfig is available. | |
| OPENSSL_EXPORT void SSL_set_enable_ech_grease(SSL *ssl, int enable); | |
| // SSL_set_reject_unusable_ech_config configures whether the client will fail | |
| // the handshake if a valid, supported ECHConfig cannot be selected to offer | |
| // ECH. | |
| OPENSSL_EXPORT void SSL_set_reject_unusable_ech_config(SSL *ssl, int enable); | |
| // SSL_set1_ech_config_list configures `ssl` to, as a client, offer ECH with the | |
| // specified configuration. `ech_config_list` should contain a serialized | |
| // ECHConfigList structure. It returns one on success and zero on error. | |
| // | |
| // This function returns an error if the input is malformed. If the input is | |
| // valid but none of the ECHConfigs implement supported parameters, it will | |
| // return success and proceed without ECH. | |
| // | |
| // If a supported ECHConfig is found, `ssl` will encrypt the true ClientHello | |
| // parameters. If the server cannot decrypt it, e.g. due to a key mismatch, ECH | |
| // has a recovery flow. `ssl` will handshake using the cleartext parameters, | |
| // including a public name in the ECHConfig. If using | |
| // `SSL_CTX_set_custom_verify`, callers should use `SSL_get0_ech_name_override` | |
| // to verify the certificate with the public name. If using the built-in | |
| // verifier, the `X509_STORE_CTX` will be configured automatically. | |
| // | |
| // If no other errors are found in this handshake, it will fail with | |
| // `SSL_R_ECH_REJECTED`. Since it didn't use the true parameters, the connection | |
| // cannot be used for application data. Instead, callers should handle this | |
| // error by calling `SSL_get0_ech_retry_configs` and retrying the connection | |
| // with updated ECH parameters. If the retry also fails with | |
| // `SSL_R_ECH_REJECTED`, the caller should report a connection failure. | |
| OPENSSL_EXPORT int SSL_set1_ech_config_list(SSL *ssl, | |
| const uint8_t *ech_config_list, | |
| size_t ech_config_list_len); | |
| // SSL_get0_ech_name_override, if `ssl` is a client and the server rejected ECH, | |
| // sets `*out_name` and `*out_name_len` to point to a buffer containing the ECH | |
| // public name. Otherwise, the buffer will be empty. | |
| // | |
| // When offering ECH as a client, this function should be called during the | |
| // certificate verification callback (see `SSL_CTX_set_custom_verify`). If | |
| // `*out_name_len` is non-zero, the caller should verify the certificate against | |
| // the result, interpreted as a DNS name, rather than the true server name. In | |
| // this case, the handshake will never succeed and is only used to authenticate | |
| // retry configs. See also `SSL_get0_ech_retry_configs`. | |
| OPENSSL_EXPORT void SSL_get0_ech_name_override(const SSL *ssl, | |
| const char **out_name, | |
| size_t *out_name_len); | |
| // SSL_get0_ech_retry_configs sets `*out_retry_configs` and | |
| // `*out_retry_configs_len` to a buffer containing a serialized ECHConfigList. | |
| // If the server did not provide an ECHConfigList, `*out_retry_configs_len` will | |
| // be zero. | |
| // | |
| // When handling an `SSL_R_ECH_REJECTED` error code as a client, callers should | |
| // use this function to recover from potential key mismatches. If the result is | |
| // non-empty, the caller should retry the connection, passing this buffer to | |
| // `SSL_set1_ech_config_list`. If the result is empty, the server has rolled | |
| // back ECH support, and the caller should retry without ECH. | |
| // | |
| // This function must only be called in response to an `SSL_R_ECH_REJECTED` | |
| // error code. Calling this function on `ssl`s that have not authenticated the | |
| // rejection handshake will assert in debug builds and otherwise return an | |
| // unparsable list. | |
| OPENSSL_EXPORT void SSL_get0_ech_retry_configs( | |
| const SSL *ssl, const uint8_t **out_retry_configs, | |
| size_t *out_retry_configs_len); | |
| // SSL_marshal_ech_config constructs a new serialized ECHConfig. On success, it | |
| // sets `*out` to a newly-allocated buffer containing the result and `*out_len` | |
| // to the size of the buffer. The caller must call `OPENSSL_free` on `*out` to | |
| // release the memory. On failure, it returns zero. | |
| // | |
| // The `config_id` field is a single byte identifier for the ECHConfig. Reusing | |
| // config IDs is allowed, but if multiple ECHConfigs with the same config ID are | |
| // active at a time, server load may increase. See | |
| // `SSL_ECH_KEYS_has_duplicate_config_id`. | |
| // | |
| // The public key and KEM algorithm are taken from `key`. `public_name` is the | |
| // DNS name used to authenticate the recovery flow. `max_name_len` should be the | |
| // length of the longest name in the ECHConfig's anonymity set and influences | |
| // client padding decisions. | |
| OPENSSL_EXPORT int SSL_marshal_ech_config(uint8_t **out, size_t *out_len, | |
| uint8_t config_id, | |
| const EVP_HPKE_KEY *key, | |
| const char *public_name, | |
| size_t max_name_len); | |
| // SSL_ECH_KEYS_new returns a newly-allocated `SSL_ECH_KEYS` or NULL on error. | |
| OPENSSL_EXPORT SSL_ECH_KEYS *SSL_ECH_KEYS_new(void); | |
| // SSL_ECH_KEYS_up_ref increments the reference count of `keys`. | |
| OPENSSL_EXPORT void SSL_ECH_KEYS_up_ref(SSL_ECH_KEYS *keys); | |
| // SSL_ECH_KEYS_dup_ref increments the reference count of `keys` and returns the | |
| // same handle. | |
| OPENSSL_EXPORT SSL_ECH_KEYS *SSL_ECH_KEYS_dup_ref(const SSL_ECH_KEYS *keys); | |
| // SSL_ECH_KEYS_free releases memory associated with `keys`. | |
| OPENSSL_EXPORT void SSL_ECH_KEYS_free(SSL_ECH_KEYS *keys); | |
| // SSL_ECH_KEYS_add decodes `ech_config` as an ECHConfig and appends it with | |
| // `key` to `keys`. If `is_retry_config` is non-zero, this config will be | |
| // returned to the client on configuration mismatch. It returns one on success | |
| // and zero on error. | |
| // | |
| // This function should be called successively to register each ECHConfig in | |
| // decreasing order of preference. This configuration must be completed before | |
| // setting `keys` on an `SSL_CTX` with `SSL_CTX_set1_ech_keys`. After that | |
| // point, `keys` is immutable; no more ECHConfig values may be added. | |
| // | |
| // See also `SSL_CTX_set1_ech_keys`. | |
| OPENSSL_EXPORT int SSL_ECH_KEYS_add(SSL_ECH_KEYS *keys, int is_retry_config, | |
| const uint8_t *ech_config, | |
| size_t ech_config_len, | |
| const EVP_HPKE_KEY *key); | |
| // SSL_ECH_KEYS_has_duplicate_config_id returns one if `keys` has duplicate | |
| // config IDs or zero otherwise. Duplicate config IDs still work, but may | |
| // increase server load due to trial decryption. | |
| OPENSSL_EXPORT int SSL_ECH_KEYS_has_duplicate_config_id( | |
| const SSL_ECH_KEYS *keys); | |
| // SSL_ECH_KEYS_marshal_retry_configs serializes the retry configs in `keys` as | |
| // an ECHConfigList. On success, it sets `*out` to a newly-allocated buffer | |
| // containing the result and `*out_len` to the size of the buffer. The caller | |
| // must call `OPENSSL_free` on `*out` to release the memory. On failure, it | |
| // returns zero. | |
| // | |
| // This output may be advertised to clients in DNS. | |
| OPENSSL_EXPORT int SSL_ECH_KEYS_marshal_retry_configs(const SSL_ECH_KEYS *keys, | |
| uint8_t **out, | |
| size_t *out_len); | |
| // SSL_CTX_set1_ech_keys configures `ctx` to use `keys` to decrypt encrypted | |
| // ClientHellos. It returns one on success, and zero on failure. If `keys` does | |
| // not contain any retry configs, this function will fail. Retry configs are | |
| // marked as such when they are added to `keys` with `SSL_ECH_KEYS_add`. | |
| // | |
| // Once `keys` has been passed to this function, it is immutable. Unlike most | |
| // `SSL_CTX` configuration functions, this function may be called even if `ctx` | |
| // already has associated connections on multiple threads. This may be used to | |
| // rotate keys in a long-lived server process. | |
| // | |
| // The configured ECHConfig values should also be advertised out-of-band via DNS | |
| // (see RFC 9848). Before advertising an ECHConfig in DNS, deployments should | |
| // ensure all instances of the service are configured with the ECHConfig and | |
| // corresponding private key. | |
| // | |
| // Only the most recent fully-deployed ECHConfigs should be advertised in DNS. | |
| // `keys` may contain a newer set if those ECHConfigs are mid-deployment. It | |
| // should also contain older sets, until the DNS change has rolled out and the | |
| // old records have expired from caches. | |
| // | |
| // If there is a mismatch, `SSL` objects associated with `ctx` will complete the | |
| // handshake using the cleartext ClientHello and send updated ECHConfig values | |
| // to the client. The client will then retry to recover, but with a latency | |
| // penalty. This recovery flow depends on the public name in the ECHConfig. | |
| // Before advertising an ECHConfig in DNS, deployments must ensure all instances | |
| // of the service can present a valid certificate for the public name. | |
| // | |
| // BoringSSL negotiates ECH before certificate selection callbacks are called, | |
| // including `SSL_CTX_set_select_certificate_cb`. If ECH is negotiated, the | |
| // reported `SSL_CLIENT_HELLO` structure and `SSL_get_servername` function will | |
| // transparently reflect the inner ClientHello. Callers should select parameters | |
| // based on these values to correctly handle ECH as well as the recovery flow. | |
| OPENSSL_EXPORT int SSL_CTX_set1_ech_keys(SSL_CTX *ctx, SSL_ECH_KEYS *keys); | |
| // SSL_ech_accepted returns one if `ssl` negotiated ECH and zero otherwise. | |
| OPENSSL_EXPORT int SSL_ech_accepted(const SSL *ssl); | |
| // Alerts. | |
| // | |
| // TLS uses alerts to signal error conditions. Alerts have a type (warning or | |
| // fatal) and description. OpenSSL internally handles fatal alerts with | |
| // dedicated error codes (see `SSL_AD_REASON_OFFSET`). Except for close_notify, | |
| // warning alerts are silently ignored and may only be surfaced with | |
| // `SSL_CTX_set_info_callback`. | |
| // SSL_AD_REASON_OFFSET is the offset between error reasons and `SSL_AD_*` | |
| // values. Any error code under `ERR_LIB_SSL` with an error reason above this | |
| // value corresponds to an alert description. Consumers may add or subtract | |
| // `SSL_AD_REASON_OFFSET` to convert between them. | |
| // | |
| // make_errors.go reserves error codes above 1000 for manually-assigned errors. | |
| // This value must be kept in sync with reservedReasonCode in make_errors.h | |
| #define SSL_AD_REASON_OFFSET 1000 | |
| // SSL_AD_* are alert descriptions. | |
| #define SSL_AD_CLOSE_NOTIFY SSL3_AD_CLOSE_NOTIFY | |
| #define SSL_AD_UNEXPECTED_MESSAGE SSL3_AD_UNEXPECTED_MESSAGE | |
| #define SSL_AD_BAD_RECORD_MAC SSL3_AD_BAD_RECORD_MAC | |
| #define SSL_AD_DECRYPTION_FAILED TLS1_AD_DECRYPTION_FAILED | |
| #define SSL_AD_RECORD_OVERFLOW TLS1_AD_RECORD_OVERFLOW | |
| #define SSL_AD_DECOMPRESSION_FAILURE SSL3_AD_DECOMPRESSION_FAILURE | |
| #define SSL_AD_HANDSHAKE_FAILURE SSL3_AD_HANDSHAKE_FAILURE | |
| #define SSL_AD_NO_CERTIFICATE SSL3_AD_NO_CERTIFICATE // Legacy SSL 3.0 value | |
| #define SSL_AD_BAD_CERTIFICATE SSL3_AD_BAD_CERTIFICATE | |
| #define SSL_AD_UNSUPPORTED_CERTIFICATE SSL3_AD_UNSUPPORTED_CERTIFICATE | |
| #define SSL_AD_CERTIFICATE_REVOKED SSL3_AD_CERTIFICATE_REVOKED | |
| #define SSL_AD_CERTIFICATE_EXPIRED SSL3_AD_CERTIFICATE_EXPIRED | |
| #define SSL_AD_CERTIFICATE_UNKNOWN SSL3_AD_CERTIFICATE_UNKNOWN | |
| #define SSL_AD_ILLEGAL_PARAMETER SSL3_AD_ILLEGAL_PARAMETER | |
| #define SSL_AD_UNKNOWN_CA TLS1_AD_UNKNOWN_CA | |
| #define SSL_AD_ACCESS_DENIED TLS1_AD_ACCESS_DENIED | |
| #define SSL_AD_DECODE_ERROR TLS1_AD_DECODE_ERROR | |
| #define SSL_AD_DECRYPT_ERROR TLS1_AD_DECRYPT_ERROR | |
| #define SSL_AD_EXPORT_RESTRICTION TLS1_AD_EXPORT_RESTRICTION | |
| #define SSL_AD_PROTOCOL_VERSION TLS1_AD_PROTOCOL_VERSION | |
| #define SSL_AD_INSUFFICIENT_SECURITY TLS1_AD_INSUFFICIENT_SECURITY | |
| #define SSL_AD_INTERNAL_ERROR TLS1_AD_INTERNAL_ERROR | |
| #define SSL_AD_INAPPROPRIATE_FALLBACK SSL3_AD_INAPPROPRIATE_FALLBACK | |
| #define SSL_AD_USER_CANCELLED TLS1_AD_USER_CANCELLED | |
| #define SSL_AD_NO_RENEGOTIATION TLS1_AD_NO_RENEGOTIATION | |
| #define SSL_AD_MISSING_EXTENSION TLS1_AD_MISSING_EXTENSION | |
| #define SSL_AD_UNSUPPORTED_EXTENSION TLS1_AD_UNSUPPORTED_EXTENSION | |
| #define SSL_AD_CERTIFICATE_UNOBTAINABLE TLS1_AD_CERTIFICATE_UNOBTAINABLE | |
| #define SSL_AD_UNRECOGNIZED_NAME TLS1_AD_UNRECOGNIZED_NAME | |
| #define SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE \ | |
| TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE | |
| #define SSL_AD_BAD_CERTIFICATE_HASH_VALUE TLS1_AD_BAD_CERTIFICATE_HASH_VALUE | |
| #define SSL_AD_UNKNOWN_PSK_IDENTITY TLS1_AD_UNKNOWN_PSK_IDENTITY | |
| #define SSL_AD_CERTIFICATE_REQUIRED TLS1_AD_CERTIFICATE_REQUIRED | |
| #define SSL_AD_NO_APPLICATION_PROTOCOL TLS1_AD_NO_APPLICATION_PROTOCOL | |
| #define SSL_AD_ECH_REQUIRED TLS1_AD_ECH_REQUIRED | |
| // SSL_alert_type_string_long returns a string description of `value` as an | |
| // alert type (warning or fatal). | |
| // This string is always ASCII-encoded. | |
| OPENSSL_EXPORT const char *SSL_alert_type_string_long(int value); | |
| // SSL_alert_desc_string_long returns a string description of `value` as an | |
| // alert description or "unknown" if unknown. | |
| // This string is always ASCII-encoded. | |
| OPENSSL_EXPORT const char *SSL_alert_desc_string_long(int value); | |
| // SSL_send_fatal_alert sends a fatal alert over `ssl` of the specified type, | |
| // which should be one of the `SSL_AD_*` constants. It returns one on success | |
| // and <= 0 on error. The caller should pass the return value into | |
| // `SSL_get_error` to determine how to proceed. Once this function has been | |
| // called, future calls to `SSL_write` will fail. | |
| // | |
| // If retrying a failed operation due to `SSL_ERROR_WANT_WRITE`, subsequent | |
| // calls must use the same `alert` parameter. | |
| OPENSSL_EXPORT int SSL_send_fatal_alert(SSL *ssl, uint8_t alert); | |
| // ex_data functions. | |
| // | |
| // See `ex_data.h` for details. | |
| OPENSSL_EXPORT int SSL_set_ex_data(SSL *ssl, int idx, void *data); | |
| OPENSSL_EXPORT void *SSL_get_ex_data(const SSL *ssl, int idx); | |
| OPENSSL_EXPORT int SSL_get_ex_new_index(long argl, void *argp, | |
| CRYPTO_EX_unused *unused, | |
| CRYPTO_EX_dup *dup_unused, | |
| CRYPTO_EX_free *free_func); | |
| OPENSSL_EXPORT int SSL_SESSION_set_ex_data(SSL_SESSION *session, int idx, | |
| void *data); | |
| OPENSSL_EXPORT void *SSL_SESSION_get_ex_data(const SSL_SESSION *session, | |
| int idx); | |
| OPENSSL_EXPORT int SSL_SESSION_get_ex_new_index(long argl, void *argp, | |
| CRYPTO_EX_unused *unused, | |
| CRYPTO_EX_dup *dup_unused, | |
| CRYPTO_EX_free *free_func); | |
| OPENSSL_EXPORT int SSL_CTX_set_ex_data(SSL_CTX *ctx, int idx, void *data); | |
| OPENSSL_EXPORT void *SSL_CTX_get_ex_data(const SSL_CTX *ctx, int idx); | |
| OPENSSL_EXPORT int SSL_CTX_get_ex_new_index(long argl, void *argp, | |
| CRYPTO_EX_unused *unused, | |
| CRYPTO_EX_dup *dup_unused, | |
| CRYPTO_EX_free *free_func); | |
| OPENSSL_EXPORT int SSL_CREDENTIAL_set_ex_data(SSL_CREDENTIAL *cred, int idx, | |
| void *data); | |
| OPENSSL_EXPORT void *SSL_CREDENTIAL_get_ex_data(const SSL_CREDENTIAL *cred, | |
| int idx); | |
| OPENSSL_EXPORT int SSL_CREDENTIAL_get_ex_new_index(long argl, void *argp, | |
| CRYPTO_EX_unused *unused, | |
| CRYPTO_EX_dup *dup_unused, | |
| CRYPTO_EX_free *free_func); | |
| // Low-level record-layer state. | |
| // SSL_get_ivs sets `*out_iv_len` to the length of the IVs for the ciphers | |
| // underlying `ssl` and sets `*out_read_iv` and `*out_write_iv` to point to the | |
| // current IVs for the read and write directions. This is only meaningful for | |
| // connections with implicit IVs (i.e. CBC mode with TLS 1.0). | |
| // | |
| // It returns one on success or zero on error. | |
| OPENSSL_EXPORT int SSL_get_ivs(const SSL *ssl, const uint8_t **out_read_iv, | |
| const uint8_t **out_write_iv, | |
| size_t *out_iv_len); | |
| // SSL_get_key_block_len returns the length of `ssl`'s key block, for TLS 1.2 | |
| // and below. It is an error to call this function during a handshake, or if | |
| // `ssl` negotiated TLS 1.3. | |
| OPENSSL_EXPORT size_t SSL_get_key_block_len(const SSL *ssl); | |
| // SSL_generate_key_block generates `out_len` bytes of key material for `ssl`'s | |
| // current connection state, for TLS 1.2 and below. It is an error to call this | |
| // function during a handshake, or if `ssl` negotiated TLS 1.3. | |
| OPENSSL_EXPORT int SSL_generate_key_block(const SSL *ssl, uint8_t *out, | |
| size_t out_len); | |
| // SSL_get_read_sequence returns, in TLS, the expected sequence number of the | |
| // next incoming record in the current epoch. | |
| // | |
| // TODO(crbug.com/42290608): In DTLS, it returns the maximum sequence number | |
| // received in the current epoch (for some notion of "current" specific to | |
| // BoringSSL) and includes the epoch number in the two most significant bytes, | |
| // but this is deprecated. Use `SSL_get_dtls_read_sequence` instead. | |
| OPENSSL_EXPORT uint64_t SSL_get_read_sequence(const SSL *ssl); | |
| // SSL_get_write_sequence returns the sequence number of the next outgoing | |
| // record in the current epoch. | |
| // | |
| // TODO(crbug.com/42290608): In DTLS, it includes the epoch number in the two | |
| // most significant bytes, but this is deprecated. Use | |
| // `SSL_get_dtls_write_sequence` instead. | |
| OPENSSL_EXPORT uint64_t SSL_get_write_sequence(const SSL *ssl); | |
| // SSL_CTX_set_record_protocol_version returns whether `version` is zero. | |
| OPENSSL_EXPORT int SSL_CTX_set_record_protocol_version(SSL_CTX *ctx, | |
| int version); | |
| // SSL_is_dtls_handshake_idle returns one `ssl`'s handshake is idle and zero if | |
| // it is busy. The handshake is considered idle if all of the following are | |
| // true: | |
| // | |
| // - `ssl` is not mid handshake or post-handshake transaction. | |
| // - In DTLS 1.3, all sent handshake messages have been acknowledged. That is, | |
| // `ssl` does not have data to retransmit. | |
| // - All received handshake data has been processed. That is, `ssl` has no | |
| // buffered partial or out-of-order messages. | |
| // | |
| // If any condition is false, the handshake is considered busy. If this function | |
| // reports the handshake is busy, it is expected that the handshake will become | |
| // idle after short timers and a few roundtrips of successful communication. | |
| // However, this is not guaranteed if, e.g., the peer misbehaves or sends many | |
| // KeyUpdates. | |
| // | |
| // WARNING: In DTLS 1.3, this function may return one while multiple active read | |
| // epochs exist in `ssl`. | |
| // | |
| // WARNING: In DTLS 1.2 (or earlier), if `ssl` is the role that speaks last, it | |
| // retains its final flight for retransmission in case of loss. There is no | |
| // explicit protocol signal for when this completes, though after receiving | |
| // application data and/or a timeout it is likely that this is no longer needed. | |
| // BoringSSL does not currently evaluate either condition and leaves it to | |
| // the caller to determine whether this is now unnecessary. This applies when | |
| // `ssl` is a server for full handshakes and when `ssl` is a client for full | |
| // handshakes. | |
| OPENSSL_EXPORT int SSL_is_dtls_handshake_idle(const SSL *ssl); | |
| // SSL_get_dtls_handshake_read_seq returns the 16-bit sequence number of the | |
| // next DTLS handshake message to be read, or 0x10000 if handshake message | |
| // 0xffff (the maximum) has already been read. | |
| OPENSSL_EXPORT uint32_t SSL_get_dtls_handshake_read_seq(const SSL *ssl); | |
| // SSL_get_dtls_handshake_write_seq returns the 16-bit sequence number of the | |
| // next DTLS handshake message to be written or 0x10000 if handshake message | |
| // 0xffff (the maximum) has already been written. | |
| OPENSSL_EXPORT uint32_t SSL_get_dtls_handshake_write_seq(const SSL *ssl); | |
| // SSL_get_dtls_read_epoch returns the highest available DTLS read epoch in | |
| // `ssl`. In DTLS 1.3, `ssl` may have earlier epochs also active, sometimes to | |
| // optionally improve handling of reordered packets and sometimes as an | |
| // important part of the protocol correctness in the face of packet loss. | |
| // | |
| // The failure conditions of `SSL_get_dtls_read_traffic_secret` and | |
| // `SSL_get_dtls_read_sequence` can be used to determine if past epochs are | |
| // active. | |
| OPENSSL_EXPORT uint16_t SSL_get_dtls_read_epoch(const SSL *ssl); | |
| // SSL_get_dtls_write_epoch returns the current DTLS write epoch. If the | |
| // handshake is idle (see `SSL_is_dtls_handshake_idle`), no other write epochs | |
| // will be active. | |
| OPENSSL_EXPORT uint16_t SSL_get_dtls_write_epoch(const SSL *ssl); | |
| // SSL_get_dtls_read_sequence returns one more than the sequence number of the | |
| // highest record received in `epoch`. If no records have been received in | |
| // `epoch`. If the epoch does not exist, it returns `UINT64_MAX`. | |
| // | |
| // It is safe to discard all sequence numbers less than the return value of this | |
| // function. The sequence numbers returned by this function do not include the | |
| // epoch number in the upper 16 bits. | |
| OPENSSL_EXPORT uint64_t SSL_get_dtls_read_sequence(const SSL *ssl, | |
| uint16_t epoch); | |
| // SSL_get_dtls_write_sequence returns the sequence number of the next record to | |
| // be sent in `epoch`. If the epoch does not exist, it returns `UINT64_MAX`. | |
| // | |
| // The sequence numbers returned by this function do not include the epoch | |
| // number in the upper 16 bits. | |
| OPENSSL_EXPORT uint64_t SSL_get_dtls_write_sequence(const SSL *ssl, | |
| uint16_t epoch); | |
| // SSL_get_dtls_read_traffic_secret looks up the traffic secret for read epoch | |
| // `epoch`. If the epoch exists and is an encrypted (not epoch zero) DTLS 1.3 | |
| // epoch, it sets `*out_data` and `*out_len` to a buffer containing the secrets | |
| // and returns one. Otherwise, it returns zero. The buffer is valid until the | |
| // next operation on `ssl`. | |
| OPENSSL_EXPORT int SSL_get_dtls_read_traffic_secret(const SSL *ssl, | |
| const uint8_t **out_data, | |
| size_t *out_len, | |
| uint16_t epoch); | |
| // SSL_get_dtls_write_traffic_secret looks up the traffic secret for write epoch | |
| // `epoch`. If the epoch exists and is an encrypted (not epoch zero) DTLS 1.3 | |
| // epoch, it sets `*out_data` and `*out_len` to a buffer containing the secrets | |
| // and returns one. Otherwise, it returns zero. The buffer is valid until the | |
| // next operation on `ssl`. | |
| OPENSSL_EXPORT int SSL_get_dtls_write_traffic_secret(const SSL *ssl, | |
| const uint8_t **out_data, | |
| size_t *out_len, | |
| uint16_t epoch); | |
| // Handshake hints. | |
| // | |
| // WARNING: Contact the BoringSSL team before using this API. While this | |
| // mechanism was designed to gracefully recover from version skew and | |
| // configuration mismatch, splitting a single TLS server into multiple services | |
| // is complex. | |
| // | |
| // Some server deployments make asynchronous RPC calls in both ClientHello | |
| // dispatch and private key operations. In TLS handshakes where the private key | |
| // operation occurs in the first round-trip, this results in two consecutive RPC | |
| // round-trips. Handshake hints allow the RPC service to predict a signature. | |
| // If correctly predicted, this can skip the second RPC call. | |
| // | |
| // First, the server installs a certificate selection callback (see | |
| // `SSL_CTX_set_select_certificate_cb`). When that is called, it performs the | |
| // RPC as before, but includes the ClientHello and a capabilities string from | |
| // `SSL_serialize_capabilities`. | |
| // | |
| // Next, the RPC service creates its own `SSL` object, applies the results of | |
| // certificate selection, calls `SSL_request_handshake_hints`, and runs the | |
| // handshake. If this successfully computes handshake hints (see | |
| // `SSL_serialize_handshake_hints`), the RPC server should send the hints | |
| // alongside any certificate selection results. | |
| // | |
| // Finally, the server calls `SSL_set_handshake_hints` and applies any | |
| // configuration from the RPC server. It then completes the handshake as before. | |
| // If the hints apply, BoringSSL will use the predicted signature and skip the | |
| // private key callbacks. Otherwise, BoringSSL will call private key callbacks | |
| // to generate a signature as before. | |
| // | |
| // Callers should synchronize configuration across the two services. | |
| // Configuration mismatches and some cases of version skew are not fatal, but | |
| // may result in the hints not applying. Additionally, some handshake flows use | |
| // the private key in later round-trips, such as TLS 1.3 HelloRetryRequest. In | |
| // those cases, BoringSSL will not predict a signature as there is no benefit. | |
| // Callers must allow for handshakes to complete without a predicted signature. | |
| // SSL_serialize_capabilities writes an opaque byte string to `out` describing | |
| // some of `ssl`'s capabilities. It returns one on success and zero on error. | |
| // | |
| // This string is used by BoringSSL internally to reduce the impact of version | |
| // skew. | |
| OPENSSL_EXPORT int SSL_serialize_capabilities(const SSL *ssl, CBB *out); | |
| // SSL_request_handshake_hints configures `ssl` to generate a handshake hint for | |
| // `client_hello`. It returns one on success and zero on error. `client_hello` | |
| // should contain a serialized ClientHello structure, from the `client_hello` | |
| // and `client_hello_len` fields of the `SSL_CLIENT_HELLO` structure. | |
| // `capabilities` should contain the output of `SSL_serialize_capabilities`. | |
| // | |
| // When configured, `ssl` will perform no I/O (so there is no need to configure | |
| // `BIO`s). For QUIC, the caller should still configure an `SSL_QUIC_METHOD`, | |
| // but the callbacks themselves will never be called and may be left NULL or | |
| // report failure. `SSL_provide_quic_data` also should not be called. | |
| // | |
| // If hint generation is successful, `SSL_do_handshake` will stop the handshake | |
| // early with `SSL_get_error` returning `SSL_ERROR_HANDSHAKE_HINTS_READY`. At | |
| // this point, the caller should run `SSL_serialize_handshake_hints` to extract | |
| // the resulting hints. | |
| // | |
| // Hint generation may fail if, e.g., `ssl` was unable to process the | |
| // ClientHello. Callers should then complete the certificate selection RPC and | |
| // continue the original handshake with no hint. It will likely fail, but this | |
| // reports the correct alert to the client and is more robust in case of | |
| // mismatch. | |
| OPENSSL_EXPORT int SSL_request_handshake_hints(SSL *ssl, | |
| const uint8_t *client_hello, | |
| size_t client_hello_len, | |
| const uint8_t *capabilities, | |
| size_t capabilities_len); | |
| // SSL_serialize_handshake_hints writes an opaque byte string to `out` | |
| // containing the handshake hints computed by `out`. It returns one on success | |
| // and zero on error. This function should only be called if | |
| // `SSL_request_handshake_hints` was configured and the handshake terminated | |
| // with `SSL_ERROR_HANDSHAKE_HINTS_READY`. | |
| // | |
| // This string may be passed to `SSL_set_handshake_hints` on another `SSL` to | |
| // avoid an extra signature call. | |
| OPENSSL_EXPORT int SSL_serialize_handshake_hints(const SSL *ssl, CBB *out); | |
| // SSL_set_handshake_hints configures `ssl` to use `hints` as handshake hints. | |
| // It returns one on success and zero on error. The handshake will then continue | |
| // as before, but apply predicted values from `hints` where applicable. | |
| // | |
| // Hints may contain connection and session secrets, so they must not leak and | |
| // must come from a source trusted to terminate the connection. However, they | |
| // will not change `ssl`'s configuration. The caller is responsible for | |
| // serializing and applying options from the RPC server as needed. This ensures | |
| // `ssl`'s behavior is self-consistent and consistent with the caller's local | |
| // decisions. | |
| OPENSSL_EXPORT int SSL_set_handshake_hints(SSL *ssl, const uint8_t *hints, | |
| size_t hints_len); | |
| // Obscure functions. | |
| // SSL_CTX_set_msg_callback installs `cb` as the message callback for `ctx`. | |
| // This callback will be called when sending or receiving low-level record | |
| // headers, complete handshake messages, ChangeCipherSpec, alerts, and DTLS | |
| // ACKs. `write_p` is one for outgoing messages and zero for incoming messages. | |
| // | |
| // For each record header, `cb` is called with `version` = 0 and `content_type` | |
| // = `SSL3_RT_HEADER`. The `len` bytes from `buf` contain the header. Note that | |
| // this does not include the record body. If the record is sealed, the length | |
| // in the header is the length of the ciphertext. | |
| // | |
| // For each handshake message, ChangeCipherSpec, alert, and DTLS ACK, `version` | |
| // is the protocol version and `content_type` is the corresponding record type. | |
| // The `len` bytes from `buf` contain the handshake message, one-byte | |
| // ChangeCipherSpec body, two-byte alert, and ACK respectively. | |
| // | |
| // In connections that enable ECH, `cb` is additionally called with | |
| // `content_type` = `SSL3_RT_CLIENT_HELLO_INNER` for each ClientHelloInner that | |
| // is encrypted or decrypted. The `len` bytes from `buf` contain the | |
| // ClientHelloInner, including the reconstructed outer extensions and handshake | |
| // header. | |
| // | |
| // For a V2ClientHello, `version` is `SSL2_VERSION`, `content_type` is zero, and | |
| // the `len` bytes from `buf` contain the V2ClientHello structure. | |
| OPENSSL_EXPORT void SSL_CTX_set_msg_callback( | |
| SSL_CTX *ctx, void (*cb)(int is_write, int version, int content_type, | |
| const void *buf, size_t len, SSL *ssl, void *arg)); | |
| // SSL_CTX_set_msg_callback_arg sets the `arg` parameter of the message | |
| // callback. | |
| OPENSSL_EXPORT void SSL_CTX_set_msg_callback_arg(SSL_CTX *ctx, void *arg); | |
| // SSL_set_msg_callback installs `cb` as the message callback of `ssl`. See | |
| // `SSL_CTX_set_msg_callback` for when this callback is called. | |
| OPENSSL_EXPORT void SSL_set_msg_callback( | |
| SSL *ssl, void (*cb)(int write_p, int version, int content_type, | |
| const void *buf, size_t len, SSL *ssl, void *arg)); | |
| // SSL_set_msg_callback_arg sets the `arg` parameter of the message callback. | |
| OPENSSL_EXPORT void SSL_set_msg_callback_arg(SSL *ssl, void *arg); | |
| // SSL_CTX_set_keylog_callback configures a callback to log key material. This | |
| // is intended for debugging use with tools like Wireshark. The `cb` function | |
| // should log `line` followed by a newline, synchronizing with any concurrent | |
| // access to the log. | |
| // | |
| // The format is described in RFC 9850. | |
| // | |
| // WARNING: The data in `line` allows an attacker to break security properties | |
| // of the TLS protocol, including confidentiality, integrity, and forward | |
| // secrecy. This impacts both the current connection, and, in TLS 1.2, future | |
| // connections that resume a session from it. Both direct access to the data and | |
| // side channel leaks from application code are possible attack vectors. This | |
| // callback is intended for debugging and should not be used in production | |
| // connections. | |
| OPENSSL_EXPORT void SSL_CTX_set_keylog_callback(SSL_CTX *ctx, | |
| void (*cb)(const SSL *ssl, | |
| const char *line)); | |
| // SSL_CTX_get_keylog_callback returns the callback configured by | |
| // `SSL_CTX_set_keylog_callback`. | |
| OPENSSL_EXPORT void (*SSL_CTX_get_keylog_callback(const SSL_CTX *ctx))( | |
| const SSL *ssl, const char *line); | |
| // SSL_CTX_set_current_time_cb configures a callback to retrieve the current | |
| // time, which should be set in `*out_clock`. This can be used for testing | |
| // purposes; for example, a callback can be configured that returns a time | |
| // set explicitly by the test. The `ssl` pointer passed to `cb` is always null. | |
| OPENSSL_EXPORT void SSL_CTX_set_current_time_cb( | |
| SSL_CTX *ctx, void (*cb)(const SSL *ssl, struct timeval *out_clock)); | |
| // SSL_set_shed_handshake_config allows some of the configuration of `ssl` to be | |
| // freed after its handshake completes. Once configuration has been shed, APIs | |
| // that query it may fail. "Configuration" in this context means anything that | |
| // was set by the caller, as distinct from information derived from the | |
| // handshake. For example, `SSL_get_ciphers` queries how the `SSL` was | |
| // configured by the caller, and fails after configuration has been shed, | |
| // whereas `SSL_get_cipher` queries the result of the handshake, and is | |
| // unaffected by configuration shedding. | |
| // | |
| // If configuration shedding is enabled, it is an error to call `SSL_clear`. | |
| // | |
| // Note that configuration shedding as a client additionally depends on | |
| // renegotiation being disabled (see `SSL_set_renegotiate_mode`). If | |
| // renegotiation is possible, the configuration will be retained. If | |
| // configuration shedding is enabled and renegotiation later disabled after the | |
| // handshake, `SSL_set_renegotiate_mode` will shed configuration then. This may | |
| // be useful for clients which support renegotiation with some ALPN protocols, | |
| // such as HTTP/1.1, and not others, such as HTTP/2. | |
| OPENSSL_EXPORT void SSL_set_shed_handshake_config(SSL *ssl, int enable); | |
| enum ssl_renegotiate_mode_t BORINGSSL_ENUM_INT { | |
| ssl_renegotiate_never = 0, | |
| ssl_renegotiate_once, | |
| ssl_renegotiate_freely, | |
| ssl_renegotiate_ignore, | |
| ssl_renegotiate_explicit, | |
| }; | |
| // SSL_set_renegotiate_mode configures how `ssl`, a client, reacts to | |
| // renegotiation attempts by a server. If `ssl` is a server, peer-initiated | |
| // renegotiations are *always* rejected and this function does nothing. | |
| // | |
| // WARNING: Renegotiation is error-prone, complicates TLS's security properties, | |
| // and increases its attack surface. When enabled, many common assumptions about | |
| // BoringSSL's behavior no longer hold, and the calling application must handle | |
| // more cases. Renegotiation is also incompatible with many application | |
| // protocols, e.g. section 9.2.1 of RFC 7540. Many functions behave in ambiguous | |
| // or undefined ways during a renegotiation. | |
| // | |
| // The renegotiation mode defaults to `ssl_renegotiate_never`, but may be set | |
| // at any point in a connection's lifetime. Set it to `ssl_renegotiate_once` to | |
| // allow one renegotiation, `ssl_renegotiate_freely` to allow all | |
| // renegotiations or `ssl_renegotiate_ignore` to ignore HelloRequest messages. | |
| // Note that ignoring HelloRequest messages may cause the connection to stall | |
| // if the server waits for the renegotiation to complete. | |
| // | |
| // If set to `ssl_renegotiate_explicit`, `SSL_read` and `SSL_peek` calls which | |
| // encounter a HelloRequest will pause with `SSL_ERROR_WANT_RENEGOTIATE`. | |
| // `SSL_write` will continue to work while paused. The caller may call | |
| // `SSL_renegotiate` to begin the renegotiation at a later point. This mode may | |
| // be used if callers wish to eagerly call `SSL_peek` without triggering a | |
| // renegotiation. | |
| // | |
| // If configuration shedding is enabled (see `SSL_set_shed_handshake_config`), | |
| // configuration is released if, at any point after the handshake, renegotiation | |
| // is disabled. It is not possible to switch from disabling renegotiation to | |
| // enabling it on a given connection. Callers that condition renegotiation on, | |
| // e.g., ALPN must enable renegotiation before the handshake and conditionally | |
| // disable it afterwards. | |
| // | |
| // When enabled, renegotiation can cause properties of `ssl`, such as the cipher | |
| // suite, to change during the lifetime of the connection. More over, during a | |
| // renegotiation, not all properties of the new handshake are available or fully | |
| // established. In BoringSSL, most functions, such as `SSL_get_current_cipher`, | |
| // report information from the most recently completed handshake, not the | |
| // pending one. However, renegotiation may rerun handshake callbacks, such as | |
| // `SSL_CTX_set_cert_cb`. Such callbacks must ensure they are acting on the | |
| // desired versions of each property. | |
| // | |
| // BoringSSL does not reverify peer certificates on renegotiation and instead | |
| // requires they match between handshakes, so certificate verification callbacks | |
| // (see `SSL_CTX_set_custom_verify`) may assume `ssl` is in the initial | |
| // handshake and use `SSL_get0_peer_certificates`, etc. | |
| // | |
| // There is no support in BoringSSL for initiating renegotiations as a client | |
| // or server. | |
| OPENSSL_EXPORT void SSL_set_renegotiate_mode(SSL *ssl, | |
| enum ssl_renegotiate_mode_t mode); | |
| // SSL_renegotiate starts a deferred renegotiation on `ssl` if it was configured | |
| // with `ssl_renegotiate_explicit` and has a pending HelloRequest. It returns | |
| // one on success and zero on error. | |
| // | |
| // This function does not do perform any I/O. On success, a subsequent | |
| // `SSL_do_handshake` call will run the handshake. `SSL_write` and | |
| // `SSL_read` will also complete the handshake before sending or receiving | |
| // application data. | |
| OPENSSL_EXPORT int SSL_renegotiate(SSL *ssl); | |
| // SSL_renegotiate_pending returns one if `ssl` is in the middle of a | |
| // renegotiation. | |
| OPENSSL_EXPORT int SSL_renegotiate_pending(SSL *ssl); | |
| // SSL_total_renegotiations returns the total number of renegotiation handshakes | |
| // performed by `ssl`. This includes the pending renegotiation, if any. | |
| OPENSSL_EXPORT int SSL_total_renegotiations(const SSL *ssl); | |
| // SSL_MAX_CERT_LIST_DEFAULT is the default maximum length, in bytes, of a peer | |
| // certificate chain. | |
| #define SSL_MAX_CERT_LIST_DEFAULT (1024 * 100) | |
| // SSL_CTX_get_max_cert_list returns the maximum length, in bytes, of a peer | |
| // certificate chain accepted by `ctx`. | |
| OPENSSL_EXPORT size_t SSL_CTX_get_max_cert_list(const SSL_CTX *ctx); | |
| // SSL_CTX_set_max_cert_list sets the maximum length, in bytes, of a peer | |
| // certificate chain to `max_cert_list`. This affects how much memory may be | |
| // consumed during the handshake. | |
| OPENSSL_EXPORT void SSL_CTX_set_max_cert_list(SSL_CTX *ctx, | |
| size_t max_cert_list); | |
| // SSL_get_max_cert_list returns the maximum length, in bytes, of a peer | |
| // certificate chain accepted by `ssl`. | |
| OPENSSL_EXPORT size_t SSL_get_max_cert_list(const SSL *ssl); | |
| // SSL_set_max_cert_list sets the maximum length, in bytes, of a peer | |
| // certificate chain to `max_cert_list`. This affects how much memory may be | |
| // consumed during the handshake. | |
| OPENSSL_EXPORT void SSL_set_max_cert_list(SSL *ssl, size_t max_cert_list); | |
| // SSL_CTX_set_max_send_fragment sets the maximum length, in bytes, of records | |
| // sent by `ctx`. Beyond this length, handshake messages and application data | |
| // will be split into multiple records. It returns one on success or zero on | |
| // error. | |
| OPENSSL_EXPORT int SSL_CTX_set_max_send_fragment(SSL_CTX *ctx, | |
| size_t max_send_fragment); | |
| // SSL_set_max_send_fragment sets the maximum length, in bytes, of records sent | |
| // by `ssl`. Beyond this length, handshake messages and application data will | |
| // be split into multiple records. It returns one on success or zero on | |
| // error. | |
| OPENSSL_EXPORT int SSL_set_max_send_fragment(SSL *ssl, | |
| size_t max_send_fragment); | |
| // ssl_early_callback_ctx (aka `SSL_CLIENT_HELLO`) is passed to certain | |
| // callbacks that are called very early on during the server handshake. At this | |
| // point, much of the SSL* hasn't been filled out and only the ClientHello can | |
| // be depended on. | |
| struct ssl_early_callback_ctx { | |
| SSL *ssl; | |
| const uint8_t *client_hello; | |
| size_t client_hello_len; | |
| uint16_t version; | |
| const uint8_t *random; | |
| size_t random_len; | |
| const uint8_t *session_id; | |
| size_t session_id_len; | |
| const uint8_t *dtls_cookie; | |
| size_t dtls_cookie_len; | |
| const uint8_t *cipher_suites; | |
| size_t cipher_suites_len; | |
| const uint8_t *compression_methods; | |
| size_t compression_methods_len; | |
| const uint8_t *extensions; | |
| size_t extensions_len; | |
| } /* SSL_CLIENT_HELLO */; | |
| // ssl_select_cert_result_t enumerates the possible results from selecting a | |
| // certificate with `select_certificate_cb`. | |
| enum ssl_select_cert_result_t BORINGSSL_ENUM_INT { | |
| // ssl_select_cert_success indicates that the certificate selection was | |
| // successful. | |
| ssl_select_cert_success = 1, | |
| // ssl_select_cert_retry indicates that the operation could not be | |
| // immediately completed and must be reattempted at a later point. | |
| ssl_select_cert_retry = 0, | |
| // ssl_select_cert_error indicates that a fatal error occurred and the | |
| // handshake should be terminated. | |
| ssl_select_cert_error = -1, | |
| // ssl_select_cert_disable_ech indicates that, although an encrypted | |
| // ClientHelloInner was decrypted, it should be discarded. The certificate | |
| // selection callback will then be called again, passing in the | |
| // ClientHelloOuter instead. From there, the handshake will proceed | |
| // without retry_configs, to signal to the client to disable ECH. | |
| // | |
| // This value may only be returned when `SSL_ech_accepted` returns one. It | |
| // may be useful if the ClientHelloInner indicated a service which does not | |
| // support ECH, e.g. if it is a TLS-1.2 only service. | |
| ssl_select_cert_disable_ech = -2, | |
| }; | |
| // SSL_early_callback_ctx_extension_get searches the extensions in | |
| // `client_hello` for an extension of the given type. If not found, it returns | |
| // zero. Otherwise it sets `out_data` to point to the extension contents (not | |
| // including the type and length bytes), sets `out_len` to the length of the | |
| // extension contents and returns one. | |
| OPENSSL_EXPORT int SSL_early_callback_ctx_extension_get( | |
| const SSL_CLIENT_HELLO *client_hello, uint16_t extension_type, | |
| const uint8_t **out_data, size_t *out_len); | |
| // SSL_CTX_set_select_certificate_cb sets a callback that is called before most | |
| // ClientHello processing and before the decision whether to resume a session | |
| // is made. The callback may inspect the ClientHello and configure the | |
| // connection. See `ssl_select_cert_result_t` for details of the return values. | |
| // | |
| // In the case that a retry is indicated, `SSL_get_error` will return | |
| // `SSL_ERROR_PENDING_CERTIFICATE` and the caller should arrange for the | |
| // high-level operation on `ssl` to be retried at a later time, which will | |
| // result in another call to `cb`. | |
| // | |
| // `SSL_get_servername` may be used during this callback. | |
| // | |
| // Note: The `SSL_CLIENT_HELLO` is only valid for the duration of the callback | |
| // and is not valid while the handshake is paused. | |
| OPENSSL_EXPORT void SSL_CTX_set_select_certificate_cb( | |
| SSL_CTX *ctx, | |
| enum ssl_select_cert_result_t (*cb)(const SSL_CLIENT_HELLO *)); | |
| // SSL_CTX_set_dos_protection_cb sets a callback that is called once the | |
| // resumption decision for a ClientHello has been made. It can return one to | |
| // allow the handshake to continue or zero to cause the handshake to abort. | |
| OPENSSL_EXPORT void SSL_CTX_set_dos_protection_cb( | |
| SSL_CTX *ctx, int (*cb)(const SSL_CLIENT_HELLO *)); | |
| // SSL_CTX_set_reverify_on_resume configures whether the certificate | |
| // verification callback will be used to reverify stored certificates | |
| // when resuming a session. This only works with `SSL_CTX_set_custom_verify`. | |
| // For now, this is incompatible with `SSL_VERIFY_NONE` mode, and is only | |
| // respected on clients. | |
| OPENSSL_EXPORT void SSL_CTX_set_reverify_on_resume(SSL_CTX *ctx, int enabled); | |
| // SSL_ST_* are possible values for `SSL_state`, the bitmasks that make them up, | |
| // and some historical values for compatibility. Only `SSL_ST_INIT` and | |
| // `SSL_ST_OK` are ever returned. | |
| #define SSL_ST_CONNECT 0x1000 | |
| #define SSL_ST_ACCEPT 0x2000 | |
| #define SSL_ST_MASK 0x0FFF | |
| #define SSL_ST_INIT (SSL_ST_CONNECT | SSL_ST_ACCEPT) | |
| #define SSL_ST_OK 0x03 | |
| #define SSL_ST_RENEGOTIATE (0x04 | SSL_ST_INIT) | |
| #define SSL_ST_BEFORE (0x05 | SSL_ST_INIT) | |
| // TLS_ST_* are aliases for `SSL_ST_*` for OpenSSL 1.1.0 compatibility. | |
| #define TLS_ST_OK SSL_ST_OK | |
| #define TLS_ST_BEFORE SSL_ST_BEFORE | |
| // SSL_CB_* are possible values for the `type` parameter in the info | |
| // callback and the bitmasks that make them up. | |
| #define SSL_CB_LOOP 0x01 | |
| #define SSL_CB_EXIT 0x02 | |
| #define SSL_CB_READ 0x04 | |
| #define SSL_CB_WRITE 0x08 | |
| #define SSL_CB_ALERT 0x4000 | |
| #define SSL_CB_READ_ALERT (SSL_CB_ALERT | SSL_CB_READ) | |
| #define SSL_CB_WRITE_ALERT (SSL_CB_ALERT | SSL_CB_WRITE) | |
| #define SSL_CB_ACCEPT_LOOP (SSL_ST_ACCEPT | SSL_CB_LOOP) | |
| #define SSL_CB_ACCEPT_EXIT (SSL_ST_ACCEPT | SSL_CB_EXIT) | |
| #define SSL_CB_CONNECT_LOOP (SSL_ST_CONNECT | SSL_CB_LOOP) | |
| #define SSL_CB_CONNECT_EXIT (SSL_ST_CONNECT | SSL_CB_EXIT) | |
| #define SSL_CB_HANDSHAKE_START 0x10 | |
| #define SSL_CB_HANDSHAKE_DONE 0x20 | |
| // SSL_CTX_set_info_callback configures a callback to be run when various | |
| // events occur during a connection's lifetime. The `type` argument determines | |
| // the type of event and the meaning of the `value` argument. Callbacks must | |
| // ignore unexpected `type` values. | |
| // | |
| // `SSL_CB_READ_ALERT` is signaled for each alert received, warning or fatal. | |
| // The `value` argument is a 16-bit value where the alert level (either | |
| // `SSL3_AL_WARNING` or `SSL3_AL_FATAL`) is in the most-significant eight bits | |
| // and the alert type (one of `SSL_AD_*`) is in the least-significant eight. | |
| // | |
| // `SSL_CB_WRITE_ALERT` is signaled for each alert sent. The `value` argument | |
| // is constructed as with `SSL_CB_READ_ALERT`. | |
| // | |
| // `SSL_CB_HANDSHAKE_START` is signaled when a handshake begins. The `value` | |
| // argument is always one. | |
| // | |
| // `SSL_CB_HANDSHAKE_DONE` is signaled when a handshake completes successfully. | |
| // The `value` argument is always one. If a handshake False Starts, this event | |
| // may be used to determine when the Finished message is received. | |
| // | |
| // The following event types expose implementation details of the handshake | |
| // state machine. Consuming them is deprecated. | |
| // | |
| // `SSL_CB_ACCEPT_LOOP` (respectively, `SSL_CB_CONNECT_LOOP`) is signaled when | |
| // a server (respectively, client) handshake progresses. The `value` argument | |
| // is always one. | |
| // | |
| // `SSL_CB_ACCEPT_EXIT` (respectively, `SSL_CB_CONNECT_EXIT`) is signaled when | |
| // a server (respectively, client) handshake completes, fails, or is paused. | |
| // The `value` argument is one if the handshake succeeded and <= 0 | |
| // otherwise. | |
| OPENSSL_EXPORT void SSL_CTX_set_info_callback(SSL_CTX *ctx, | |
| void (*cb)(const SSL *ssl, | |
| int type, int value)); | |
| // SSL_CTX_get_info_callback returns the callback set by | |
| // `SSL_CTX_set_info_callback`. | |
| OPENSSL_EXPORT void (*SSL_CTX_get_info_callback(SSL_CTX *ctx))(const SSL *ssl, | |
| int type, | |
| int value); | |
| // SSL_set_info_callback configures a callback to be run at various events | |
| // during a connection's lifetime. See `SSL_CTX_set_info_callback`. | |
| OPENSSL_EXPORT void SSL_set_info_callback(SSL *ssl, | |
| void (*cb)(const SSL *ssl, int type, | |
| int value)); | |
| // SSL_get_info_callback returns the callback set by `SSL_set_info_callback`. | |
| OPENSSL_EXPORT void (*SSL_get_info_callback(const SSL *ssl))(const SSL *ssl, | |
| int type, | |
| int value); | |
| // SSL_state_string_long returns the current state of the handshake state | |
| // machine as a string. This may be useful for debugging and logging. | |
| // This string is always ASCII-encoded. | |
| OPENSSL_EXPORT const char *SSL_state_string_long(const SSL *ssl); | |
| #define SSL_SENT_SHUTDOWN 1 | |
| #define SSL_RECEIVED_SHUTDOWN 2 | |
| // SSL_get_shutdown returns a bitmask with a subset of `SSL_SENT_SHUTDOWN` and | |
| // `SSL_RECEIVED_SHUTDOWN` to query whether close_notify was sent or received, | |
| // respectively. | |
| OPENSSL_EXPORT int SSL_get_shutdown(const SSL *ssl); | |
| // SSL_get_peer_signature_algorithm returns the signature algorithm used by the | |
| // peer. If not applicable, it returns zero. | |
| OPENSSL_EXPORT uint16_t SSL_get_peer_signature_algorithm(const SSL *ssl); | |
| // SSL_get_client_random writes up to `max_out` bytes of the most recent | |
| // handshake's client_random to `out` and returns the number of bytes written. | |
| // If `max_out` is zero, it returns the size of the client_random. | |
| OPENSSL_EXPORT size_t SSL_get_client_random(const SSL *ssl, uint8_t *out, | |
| size_t max_out); | |
| // SSL_get_server_random writes up to `max_out` bytes of the most recent | |
| // handshake's server_random to `out` and returns the number of bytes written. | |
| // If `max_out` is zero, it returns the size of the server_random. | |
| OPENSSL_EXPORT size_t SSL_get_server_random(const SSL *ssl, uint8_t *out, | |
| size_t max_out); | |
| // SSL_get_signature_algorithm_used returns the signature algorithm that `ssl` | |
| // used, or will use, to generate a signature in the current handshake. If not | |
| // applicable (e.g. if `ssl` did not authenticate itself with a certificate), it | |
| // returns zero. | |
| // | |
| // This function only returns a value during the handshake. After the handshake | |
| // is complete, the value is discarded. If needed after the handshake, callers | |
| // may save the value at `SSL_CB_HANDSHAKE_DONE` with | |
| // `SSL_CTX_set_info_callback`. | |
| OPENSSL_EXPORT uint16_t SSL_get_signature_algorithm_used(const SSL *ssl); | |
| // SSL_get_pending_cipher returns the cipher suite for the current handshake or | |
| // NULL if one has not been negotiated yet or there is no pending handshake. | |
| OPENSSL_EXPORT const SSL_CIPHER *SSL_get_pending_cipher(const SSL *ssl); | |
| // SSL_set_retain_only_sha256_of_client_certs, on a server, sets whether only | |
| // the SHA-256 hash of peer's certificate should be saved in memory and in the | |
| // session. This can save memory, ticket size and session cache space. If | |
| // enabled, `SSL_get_peer_certificate` will return NULL after the handshake | |
| // completes. See `SSL_SESSION_has_peer_sha256` and | |
| // `SSL_SESSION_get0_peer_sha256` to query the hash. | |
| OPENSSL_EXPORT void SSL_set_retain_only_sha256_of_client_certs(SSL *ssl, | |
| int enable); | |
| // SSL_CTX_set_retain_only_sha256_of_client_certs, on a server, sets whether | |
| // only the SHA-256 hash of peer's certificate should be saved in memory and in | |
| // the session. This can save memory, ticket size and session cache space. If | |
| // enabled, `SSL_get_peer_certificate` will return NULL after the handshake | |
| // completes. See `SSL_SESSION_has_peer_sha256` and | |
| // `SSL_SESSION_get0_peer_sha256` to query the hash. | |
| OPENSSL_EXPORT void SSL_CTX_set_retain_only_sha256_of_client_certs(SSL_CTX *ctx, | |
| int enable); | |
| // SSL_CTX_set_grease_enabled configures whether sockets on `ctx` should enable | |
| // GREASE. See RFC 8701. | |
| // TODO(crbug.com/529360100): signature_algorithms extensions in | |
| // CertificateRequest messages should also be GREASE'd. | |
| OPENSSL_EXPORT void SSL_CTX_set_grease_enabled(SSL_CTX *ctx, int enabled); | |
| // SSL_CTX_set_permute_extensions configures whether sockets on `ctx` should | |
| // permute extensions. For now, this is only implemented for the ClientHello. | |
| OPENSSL_EXPORT void SSL_CTX_set_permute_extensions(SSL_CTX *ctx, int enabled); | |
| // SSL_set_permute_extensions configures whether sockets on `ssl` should | |
| // permute extensions. For now, this is only implemented for the ClientHello. | |
| OPENSSL_EXPORT void SSL_set_permute_extensions(SSL *ssl, int enabled); | |
| // SSL_max_seal_overhead returns the maximum overhead, in bytes, of sealing a | |
| // record with `ssl`. | |
| OPENSSL_EXPORT size_t SSL_max_seal_overhead(const SSL *ssl); | |
| // SSL_CTX_set_false_start_allowed_without_alpn configures whether connections | |
| // on `ctx` may use False Start (if `SSL_MODE_ENABLE_FALSE_START` is enabled) | |
| // without negotiating ALPN. | |
| OPENSSL_EXPORT void SSL_CTX_set_false_start_allowed_without_alpn(SSL_CTX *ctx, | |
| int allowed); | |
| // SSL_used_hello_retry_request returns one if the TLS 1.3 HelloRetryRequest | |
| // message has been either sent by the server or received by the client. It | |
| // returns zero otherwise. | |
| OPENSSL_EXPORT int SSL_used_hello_retry_request(const SSL *ssl); | |
| // SSL_set_jdk11_workaround configures whether to workaround various bugs in | |
| // JDK 11's TLS 1.3 implementation by disabling TLS 1.3 for such clients. | |
| // | |
| // https://bugs.openjdk.java.net/browse/JDK-8211806 | |
| // https://bugs.openjdk.java.net/browse/JDK-8212885 | |
| // https://bugs.openjdk.java.net/browse/JDK-8213202 | |
| OPENSSL_EXPORT void SSL_set_jdk11_workaround(SSL *ssl, int enable); | |
| // SSL_parse_client_hello decodes a ClientHello structure from `len` bytes in | |
| // `in`. On success, it returns one and writes the result to `*out`. Otherwise, | |
| // it returns zero. `ssl` will be saved into `*out` and determines how the | |
| // ClientHello is parsed, notably TLS vs DTLS. The fields in `*out` will alias | |
| // `in` and are only valid as long as `in` is valid and unchanged. | |
| // | |
| // `in` should contain just the ClientHello structure (RFC 8446 and RFC 9147), | |
| // excluding the handshake header and already reassembled from record layer. | |
| // That is, `in` should begin with the legacy_version field, not the | |
| // client_hello HandshakeType constant or the handshake ContentType constant. | |
| OPENSSL_EXPORT int SSL_parse_client_hello(const SSL *ssl, SSL_CLIENT_HELLO *out, | |
| const uint8_t *in, size_t len); | |
| // Compliance policy configurations | |
| // | |
| // A TLS connection has a large number of different parameters. Some are well | |
| // known, like cipher suites, but many are obscure and configuration functions | |
| // for them may not exist. These policy controls allow broad configuration | |
| // goals to be specified so that they can flow down to all the different | |
| // parameters of a TLS connection. | |
| enum ssl_compliance_policy_t BORINGSSL_ENUM_INT { | |
| // ssl_compliance_policy_none does nothing. However, since setting this | |
| // doesn't undo other policies it's an error to try and set it. | |
| ssl_compliance_policy_none, | |
| // ssl_compliance_policy_fips_202205 configures a TLS connection to use: | |
| // * TLS 1.2 or 1.3 | |
| // * For TLS 1.2, only ECDHE_[RSA|ECDSA]_WITH_AES_*_GCM_SHA*. | |
| // * For TLS 1.3, only AES-GCM | |
| // * P-256 or P-384 for key agreement. | |
| // * For server signatures, only PKCS#1/PSS with SHA256/384/512, or ECDSA | |
| // with P-256 or P-384 and SHA256/SHA384. | |
| // | |
| // Note: this policy can be configured even if BoringSSL has not been built in | |
| // FIPS mode. Call `FIPS_mode` to check that. | |
| // | |
| // Note: this setting aids with compliance with NIST requirements but does not | |
| // guarantee it. Careful reading of SP 800-52r2 is recommended. | |
| ssl_compliance_policy_fips_202205, | |
| // ssl_compliance_policy_fips_202609 configures a TLS connection to use: | |
| // * TLS 1.2 or 1.3 | |
| // * For TLS 1.2, only ECDHE_[RSA|ECDSA]_WITH_AES_*_GCM_SHA*. | |
| // * For TLS 1.3, only AES-GCM | |
| // * X25519MLKEM768 or ML-KEM-1024, or P-256 or P-384 for key agreement, | |
| // selecting X25519MLKEM768 or ML-KEM-1024 based on client preference. | |
| // * For server signatures, only PKCS#1/PSS with SHA256/384/512, or ECDSA | |
| // with P-256 or P-384 and SHA256/SHA384. | |
| // | |
| // Note: this policy can be configured even if BoringSSL has not been built in | |
| // FIPS mode. Call `FIPS_mode` to check that. | |
| // | |
| // Note: this setting aids with compliance with NIST requirements but does not | |
| // guarantee it. Careful reading of SP 800-52r2 is recommended. | |
| ssl_compliance_policy_fips_202609, | |
| // ssl_compliance_policy_wpa3_192_202304 configures a TLS connection to use: | |
| // * TLS 1.2 or 1.3. | |
| // * For TLS 1.2, only TLS_ECDHE_[ECDSA|RSA]_WITH_AES_256_GCM_SHA384. | |
| // * For TLS 1.3, only AES-256-GCM. | |
| // * P-384 for key agreement. | |
| // * For handshake signatures, only ECDSA with P-384 and SHA-384, or RSA | |
| // with SHA-384 or SHA-512. | |
| // | |
| // No limitations on the certificate chain nor leaf public key are imposed, | |
| // other than by the supported signature algorithms. But WPA3's "192-bit" | |
| // mode requires at least P-384 or 3072-bit along the chain. The caller must | |
| // enforce this themselves on the verified chain using functions such as | |
| // `X509_STORE_CTX_get0_chain`. | |
| // | |
| // Note that this setting is less secure than the default. The | |
| // implementation risks of using a more obscure primitive like P-384 | |
| // dominate other considerations. | |
| ssl_compliance_policy_wpa3_192_202304, | |
| // ssl_compliance_policy_cnsa_202407 configures a TLS connection to use: | |
| // * For TLS 1.3, AES-256-GCM over AES-128-GCM over ChaCha20-Poly1305. | |
| // | |
| // I.e. it ensures that AES-GCM will be used whenever the client supports it. | |
| // The cipher suite configuration mini-language can be used to similarly | |
| // configure prior TLS versions if they are enabled. | |
| ssl_compliance_policy_cnsa_202407, | |
| // ssl_compliance_policy_cnsa1_202603 configures a TLS connection to use: | |
| // * TLS 1.2 or TLS 1.3. | |
| // * For TLS 1.2, only TLS_ECDHE_[ECDSA|RSA]_WITH_AES_256_GCM_SHA384. | |
| // * For TLS 1.3, only AES-256-GCM. | |
| // * ML-KEM-1024 or P-384 for key agreement, preferring ML-KEM-1024 if the | |
| // client supports it. | |
| // * For handshake signatures, only ECDSA with P-384 and SHA-384, or RSA | |
| // with SHA-384. | |
| // | |
| // Note: this setting aids with compliance with CNSA requirements but does not | |
| // guarantee it. Careful reading of RFC 9151 is recommended. | |
| ssl_compliance_policy_cnsa1_202603, | |
| // ssl_compliance_policy_cnsa2_202603 configures a TLS connection to use: | |
| // * Only TLS 1.3, with AES-256-GCM. | |
| // * Only ML-KEM-1024 for key agreement. | |
| // * For handshake signatures, only ECDSA with P-384 and SHA-384, or RSA | |
| // with SHA-384. | |
| // | |
| // Note: this setting aids with compliance with CNSA requirements but does not | |
| // guarantee it. Careful reading of draft-becker-cnsa2-tls-profile is | |
| // recommended. | |
| ssl_compliance_policy_cnsa2_202603, | |
| }; | |
| // SSL_CTX_set_compliance_policy configures various aspects of `ctx` based on | |
| // the given policy requirements. Subsequently calling other functions that | |
| // configure `ctx` may override `policy`, or may not. This should be the final | |
| // configuration function called in order to have defined behaviour matching the | |
| // configuration profile documented for `policy` above. It's a fatal error if | |
| // `policy` is `ssl_compliance_policy_none`. | |
| OPENSSL_EXPORT int SSL_CTX_set_compliance_policy( | |
| SSL_CTX *ctx, enum ssl_compliance_policy_t policy); | |
| // SSL_CTX_get_compliance_policy returns the compliance policy configured on | |
| // `ctx`. | |
| OPENSSL_EXPORT enum ssl_compliance_policy_t SSL_CTX_get_compliance_policy( | |
| const SSL_CTX *ctx); | |
| // SSL_set_compliance_policy acts the same as `SSL_CTX_set_compliance_policy`, | |
| // but only configures a single `SSL*`. | |
| OPENSSL_EXPORT int SSL_set_compliance_policy( | |
| SSL *ssl, enum ssl_compliance_policy_t policy); | |
| // SSL_get_compliance_policy returns the compliance policy configured on | |
| // `ssl`. | |
| OPENSSL_EXPORT enum ssl_compliance_policy_t SSL_get_compliance_policy( | |
| const SSL *ssl); | |
| // Server Padding | |
| // | |
| // The Server Padding extension allows clients to request that servers add | |
| // additional bytes of padding through EncryptedExtensions on the TLS handshake. | |
| // This extension is only supported on TLS 1.3 connections. This is a temporary | |
| // feature supporting an experiment, and will be removed on conclusion of the | |
| // experiment. | |
| // SSL_set_server_padding_request configures `ssl` as a client to request | |
| // `num_bytes` of additional padding from servers on the TLS handshake. The | |
| // client can confirm whether the server sent back the requested amount of | |
| // padding in the handshake with `SSL_server_sent_requested_padding`. | |
| OPENSSL_EXPORT void SSL_set_server_padding_request(SSL *ssl, | |
| uint16_t num_bytes); | |
| // SSL_set_server_padding_enabled configures `ssl` as a server to respond to | |
| // the server padding extension with the padding requested by the client. | |
| // Passing 0 disables support for the server padding extension, 1 enables | |
| // support for the extension. | |
| // | |
| // By default, the extension is not enabled. | |
| OPENSSL_EXPORT void SSL_set_server_padding_enabled(SSL *ssl, int enabled); | |
| // SSL_server_sent_requested_padding returns 1 if `ssl`, as a client, received | |
| // the requested amount of padding from the server as requested through | |
| // `SSL_set_server_padding_request`. Otherwise, it returns 0. | |
| OPENSSL_EXPORT int SSL_server_sent_requested_padding(const SSL *ssl); | |
| // Preprocessor compatibility section (hidden). | |
| // | |
| // Historically, a number of APIs were implemented in OpenSSL as macros and | |
| // constants to 'ctrl' functions. To avoid breaking #ifdefs in consumers, this | |
| // section defines a number of legacy macros. | |
| // | |
| // Although using either the CTRL values or their wrapper macros in #ifdefs is | |
| // still supported, the CTRL values may not be passed to `SSL_ctrl` and | |
| // `SSL_CTX_ctrl`. Call the functions (previously wrapper macros) instead. | |
| // | |
| // See PORTING.md in the BoringSSL source tree for a table of corresponding | |
| // functions. | |
| // https://boringssl.googlesource.com/boringssl/+/main/PORTING.md#Replacements-for-values | |
| #define DTLS_CTRL_GET_TIMEOUT doesnt_exist | |
| #define DTLS_CTRL_HANDLE_TIMEOUT doesnt_exist | |
| #define SSL_CTRL_CHAIN doesnt_exist | |
| #define SSL_CTRL_CHAIN_CERT doesnt_exist | |
| #define SSL_CTRL_CHANNEL_ID doesnt_exist | |
| #define SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS doesnt_exist | |
| #define SSL_CTRL_CLEAR_MODE doesnt_exist | |
| #define SSL_CTRL_CLEAR_OPTIONS doesnt_exist | |
| #define SSL_CTRL_EXTRA_CHAIN_CERT doesnt_exist | |
| #define SSL_CTRL_GET_CHAIN_CERTS doesnt_exist | |
| #define SSL_CTRL_GET_CHANNEL_ID doesnt_exist | |
| #define SSL_CTRL_GET_CLIENT_CERT_TYPES doesnt_exist | |
| #define SSL_CTRL_GET_EXTRA_CHAIN_CERTS doesnt_exist | |
| #define SSL_CTRL_GET_MAX_CERT_LIST doesnt_exist | |
| #define SSL_CTRL_GET_NEGOTIATED_GROUP doesnt_exist | |
| #define SSL_CTRL_GET_NUM_RENEGOTIATIONS doesnt_exist | |
| #define SSL_CTRL_GET_READ_AHEAD doesnt_exist | |
| #define SSL_CTRL_GET_RI_SUPPORT doesnt_exist | |
| #define SSL_CTRL_GET_SERVER_TMP_KEY doesnt_exist | |
| #define SSL_CTRL_GET_SESSION_REUSED doesnt_exist | |
| #define SSL_CTRL_GET_SESS_CACHE_MODE doesnt_exist | |
| #define SSL_CTRL_GET_SESS_CACHE_SIZE doesnt_exist | |
| #define SSL_CTRL_GET_TLSEXT_TICKET_KEYS doesnt_exist | |
| #define SSL_CTRL_GET_TOTAL_RENEGOTIATIONS doesnt_exist | |
| #define SSL_CTRL_MODE doesnt_exist | |
| #define SSL_CTRL_NEED_TMP_RSA doesnt_exist | |
| #define SSL_CTRL_OPTIONS doesnt_exist | |
| #define SSL_CTRL_SESS_NUMBER doesnt_exist | |
| #define SSL_CTRL_SET_CURVES doesnt_exist | |
| #define SSL_CTRL_SET_CURVES_LIST doesnt_exist | |
| #define SSL_CTRL_SET_ECDH_AUTO doesnt_exist | |
| #define SSL_CTRL_SET_GROUPS doesnt_exist | |
| #define SSL_CTRL_SET_GROUPS_LIST doesnt_exist | |
| #define SSL_CTRL_SET_MAX_CERT_LIST doesnt_exist | |
| #define SSL_CTRL_SET_MAX_SEND_FRAGMENT doesnt_exist | |
| #define SSL_CTRL_SET_MSG_CALLBACK doesnt_exist | |
| #define SSL_CTRL_SET_MSG_CALLBACK_ARG doesnt_exist | |
| #define SSL_CTRL_SET_MTU doesnt_exist | |
| #define SSL_CTRL_SET_READ_AHEAD doesnt_exist | |
| #define SSL_CTRL_SET_SESS_CACHE_MODE doesnt_exist | |
| #define SSL_CTRL_SET_SESS_CACHE_SIZE doesnt_exist | |
| #define SSL_CTRL_SET_TLSEXT_HOSTNAME doesnt_exist | |
| #define SSL_CTRL_SET_TLSEXT_SERVERNAME_ARG doesnt_exist | |
| #define SSL_CTRL_SET_TLSEXT_SERVERNAME_CB doesnt_exist | |
| #define SSL_CTRL_SET_TLSEXT_TICKET_KEYS doesnt_exist | |
| #define SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB doesnt_exist | |
| #define SSL_CTRL_SET_TMP_DH doesnt_exist | |
| #define SSL_CTRL_SET_TMP_DH_CB doesnt_exist | |
| #define SSL_CTRL_SET_TMP_ECDH doesnt_exist | |
| #define SSL_CTRL_SET_TMP_ECDH_CB doesnt_exist | |
| #define SSL_CTRL_SET_TMP_RSA doesnt_exist | |
| #define SSL_CTRL_SET_TMP_RSA_CB doesnt_exist | |
| // `BORINGSSL_PREFIX` already makes some of these symbols into macros, so there | |
| // is no need to define conflicting macros; however it is compiler specific | |
| // which ones become macros. | |
| #if !defined(DTLSv1_get_timeout) | |
| #define DTLSv1_get_timeout DTLSv1_get_timeout | |
| #endif | |
| #if !defined(DTLSv1_handle_timeout) | |
| #define DTLSv1_handle_timeout DTLSv1_handle_timeout | |
| #endif | |
| #if !defined(SSL_CTX_add0_chain_cert) | |
| #define SSL_CTX_add0_chain_cert SSL_CTX_add0_chain_cert | |
| #endif | |
| #if !defined(SSL_CTX_add1_chain_cert) | |
| #define SSL_CTX_add1_chain_cert SSL_CTX_add1_chain_cert | |
| #endif | |
| #if !defined(SSL_CTX_add_extra_chain_cert) | |
| #define SSL_CTX_add_extra_chain_cert SSL_CTX_add_extra_chain_cert | |
| #endif | |
| #if !defined(SSL_CTX_clear_chain_certs) | |
| #define SSL_CTX_clear_chain_certs SSL_CTX_clear_chain_certs | |
| #endif | |
| #if !defined(SSL_CTX_clear_extra_chain_certs) | |
| #define SSL_CTX_clear_extra_chain_certs SSL_CTX_clear_extra_chain_certs | |
| #endif | |
| #if !defined(SSL_CTX_clear_mode) | |
| #define SSL_CTX_clear_mode SSL_CTX_clear_mode | |
| #endif | |
| #if !defined(SSL_CTX_clear_options) | |
| #define SSL_CTX_clear_options SSL_CTX_clear_options | |
| #endif | |
| #if !defined(SSL_CTX_get0_chain_certs) | |
| #define SSL_CTX_get0_chain_certs SSL_CTX_get0_chain_certs | |
| #endif | |
| #if !defined(SSL_CTX_get_extra_chain_certs) | |
| #define SSL_CTX_get_extra_chain_certs SSL_CTX_get_extra_chain_certs | |
| #endif | |
| #if !defined(SSL_CTX_get_max_cert_list) | |
| #define SSL_CTX_get_max_cert_list SSL_CTX_get_max_cert_list | |
| #endif | |
| #if !defined(SSL_CTX_get_mode) | |
| #define SSL_CTX_get_mode SSL_CTX_get_mode | |
| #endif | |
| #if !defined(SSL_CTX_get_options) | |
| #define SSL_CTX_get_options SSL_CTX_get_options | |
| #endif | |
| #if !defined(SSL_CTX_get_read_ahead) | |
| #define SSL_CTX_get_read_ahead SSL_CTX_get_read_ahead | |
| #endif | |
| #if !defined(SSL_CTX_get_session_cache_mode) | |
| #define SSL_CTX_get_session_cache_mode SSL_CTX_get_session_cache_mode | |
| #endif | |
| #if !defined(SSL_CTX_get_tlsext_ticket_keys) | |
| #define SSL_CTX_get_tlsext_ticket_keys SSL_CTX_get_tlsext_ticket_keys | |
| #endif | |
| #if !defined(SSL_CTX_need_tmp_RSA) | |
| #define SSL_CTX_need_tmp_RSA SSL_CTX_need_tmp_RSA | |
| #endif | |
| #if !defined(SSL_CTX_sess_get_cache_size) | |
| #define SSL_CTX_sess_get_cache_size SSL_CTX_sess_get_cache_size | |
| #endif | |
| #if !defined(SSL_CTX_sess_number) | |
| #define SSL_CTX_sess_number SSL_CTX_sess_number | |
| #endif | |
| #if !defined(SSL_CTX_sess_set_cache_size) | |
| #define SSL_CTX_sess_set_cache_size SSL_CTX_sess_set_cache_size | |
| #endif | |
| #if !defined(SSL_CTX_set0_chain) | |
| #define SSL_CTX_set0_chain SSL_CTX_set0_chain | |
| #endif | |
| #if !defined(SSL_CTX_set1_chain) | |
| #define SSL_CTX_set1_chain SSL_CTX_set1_chain | |
| #endif | |
| #if !defined(SSL_CTX_set1_curves) | |
| #define SSL_CTX_set1_curves SSL_CTX_set1_curves | |
| #endif | |
| #if !defined(SSL_CTX_set1_groups) | |
| #define SSL_CTX_set1_groups SSL_CTX_set1_groups | |
| #endif | |
| #if !defined(SSL_CTX_set_max_cert_list) | |
| #define SSL_CTX_set_max_cert_list SSL_CTX_set_max_cert_list | |
| #endif | |
| #if !defined(SSL_CTX_set_max_send_fragment) | |
| #define SSL_CTX_set_max_send_fragment SSL_CTX_set_max_send_fragment | |
| #endif | |
| #if !defined(SSL_CTX_set_mode) | |
| #define SSL_CTX_set_mode SSL_CTX_set_mode | |
| #endif | |
| #if !defined(SSL_CTX_set_msg_callback_arg) | |
| #define SSL_CTX_set_msg_callback_arg SSL_CTX_set_msg_callback_arg | |
| #endif | |
| #if !defined(SSL_CTX_set_options) | |
| #define SSL_CTX_set_options SSL_CTX_set_options | |
| #endif | |
| #if !defined(SSL_CTX_set_read_ahead) | |
| #define SSL_CTX_set_read_ahead SSL_CTX_set_read_ahead | |
| #endif | |
| #if !defined(SSL_CTX_set_session_cache_mode) | |
| #define SSL_CTX_set_session_cache_mode SSL_CTX_set_session_cache_mode | |
| #endif | |
| #if !defined(SSL_CTX_set_tlsext_servername_arg) | |
| #define SSL_CTX_set_tlsext_servername_arg SSL_CTX_set_tlsext_servername_arg | |
| #endif | |
| #if !defined(SSL_CTX_set_tlsext_servername_callback) | |
| #define SSL_CTX_set_tlsext_servername_callback \ | |
| SSL_CTX_set_tlsext_servername_callback | |
| #endif | |
| #if !defined(SSL_CTX_set_tlsext_ticket_key_cb) | |
| #define SSL_CTX_set_tlsext_ticket_key_cb SSL_CTX_set_tlsext_ticket_key_cb | |
| #endif | |
| #if !defined(SSL_CTX_set_tlsext_ticket_keys) | |
| #define SSL_CTX_set_tlsext_ticket_keys SSL_CTX_set_tlsext_ticket_keys | |
| #endif | |
| #if !defined(SSL_CTX_set_tmp_dh) | |
| #define SSL_CTX_set_tmp_dh SSL_CTX_set_tmp_dh | |
| #endif | |
| #if !defined(SSL_CTX_set_tmp_ecdh) | |
| #define SSL_CTX_set_tmp_ecdh SSL_CTX_set_tmp_ecdh | |
| #endif | |
| #if !defined(SSL_CTX_set_tmp_rsa) | |
| #define SSL_CTX_set_tmp_rsa SSL_CTX_set_tmp_rsa | |
| #endif | |
| #if !defined(SSL_add0_chain_cert) | |
| #define SSL_add0_chain_cert SSL_add0_chain_cert | |
| #endif | |
| #if !defined(SSL_add1_chain_cert) | |
| #define SSL_add1_chain_cert SSL_add1_chain_cert | |
| #endif | |
| #if !defined(SSL_clear_chain_certs) | |
| #define SSL_clear_chain_certs SSL_clear_chain_certs | |
| #endif | |
| #if !defined(SSL_clear_mode) | |
| #define SSL_clear_mode SSL_clear_mode | |
| #endif | |
| #if !defined(SSL_clear_options) | |
| #define SSL_clear_options SSL_clear_options | |
| #endif | |
| #if !defined(SSL_get0_certificate_types) | |
| #define SSL_get0_certificate_types SSL_get0_certificate_types | |
| #endif | |
| #if !defined(SSL_get0_chain_certs) | |
| #define SSL_get0_chain_certs SSL_get0_chain_certs | |
| #endif | |
| #if !defined(SSL_get_max_cert_list) | |
| #define SSL_get_max_cert_list SSL_get_max_cert_list | |
| #endif | |
| #if !defined(SSL_get_mode) | |
| #define SSL_get_mode SSL_get_mode | |
| #endif | |
| #if !defined(SSL_get_negotiated_group) | |
| #define SSL_get_negotiated_group SSL_get_negotiated_group | |
| #endif | |
| #if !defined(SSL_get_options) | |
| #define SSL_get_options SSL_get_options | |
| #endif | |
| #if !defined(SSL_get_secure_renegotiation_support) | |
| #define SSL_get_secure_renegotiation_support \ | |
| SSL_get_secure_renegotiation_support | |
| #endif | |
| #if !defined(SSL_need_tmp_RSA) | |
| #define SSL_need_tmp_RSA SSL_need_tmp_RSA | |
| #endif | |
| #if !defined(SSL_num_renegotiations) | |
| #define SSL_num_renegotiations SSL_num_renegotiations | |
| #endif | |
| #if !defined(SSL_session_reused) | |
| #define SSL_session_reused SSL_session_reused | |
| #endif | |
| #if !defined(SSL_set0_chain) | |
| #define SSL_set0_chain SSL_set0_chain | |
| #endif | |
| #if !defined(SSL_set1_chain) | |
| #define SSL_set1_chain SSL_set1_chain | |
| #endif | |
| #if !defined(SSL_set1_curves) | |
| #define SSL_set1_curves SSL_set1_curves | |
| #endif | |
| #if !defined(SSL_set1_groups) | |
| #define SSL_set1_groups SSL_set1_groups | |
| #endif | |
| #if !defined(SSL_set_max_cert_list) | |
| #define SSL_set_max_cert_list SSL_set_max_cert_list | |
| #endif | |
| #if !defined(SSL_set_max_send_fragment) | |
| #define SSL_set_max_send_fragment SSL_set_max_send_fragment | |
| #endif | |
| #if !defined(SSL_set_mode) | |
| #define SSL_set_mode SSL_set_mode | |
| #endif | |
| #if !defined(SSL_set_msg_callback_arg) | |
| #define SSL_set_msg_callback_arg SSL_set_msg_callback_arg | |
| #endif | |
| #if !defined(SSL_set_mtu) | |
| #define SSL_set_mtu SSL_set_mtu | |
| #endif | |
| #if !defined(SSL_set_options) | |
| #define SSL_set_options SSL_set_options | |
| #endif | |
| #if !defined(SSL_set_tlsext_host_name) | |
| #define SSL_set_tlsext_host_name SSL_set_tlsext_host_name | |
| #endif | |
| #if !defined(SSL_set_tmp_dh) | |
| #define SSL_set_tmp_dh SSL_set_tmp_dh | |
| #endif | |
| #if !defined(SSL_set_tmp_ecdh) | |
| #define SSL_set_tmp_ecdh SSL_set_tmp_ecdh | |
| #endif | |
| #if !defined(SSL_set_tmp_rsa) | |
| #define SSL_set_tmp_rsa SSL_set_tmp_rsa | |
| #endif | |
| #if !defined(SSL_total_renegotiations) | |
| #define SSL_total_renegotiations SSL_total_renegotiations | |
| #endif | |
| #if defined(__cplusplus) | |
| } // extern C | |
| #endif | |
| #include <openssl/ssl_deprecated.h> // IWYU pragma: export | |
| #if defined(__cplusplus) | |
| #if !defined(BORINGSSL_NO_CXX) | |
| extern "C++" { | |
| BSSL_NAMESPACE_BEGIN | |
| BORINGSSL_MAKE_DELETER(SSL, SSL_free) | |
| BORINGSSL_MAKE_DELETER(SSL_CREDENTIAL, SSL_CREDENTIAL_free) | |
| BORINGSSL_MAKE_UP_REF(SSL_CREDENTIAL, SSL_CREDENTIAL_dup_ref) | |
| BORINGSSL_MAKE_DELETER(SSL_CTX, SSL_CTX_free) | |
| BORINGSSL_MAKE_UP_REF(SSL_CTX, SSL_CTX_dup_ref) | |
| BORINGSSL_MAKE_DELETER(SSL_ECH_KEYS, SSL_ECH_KEYS_free) | |
| BORINGSSL_MAKE_UP_REF(SSL_ECH_KEYS, SSL_ECH_KEYS_dup_ref) | |
| BORINGSSL_MAKE_DELETER(SSL_SESSION, SSL_SESSION_free) | |
| BORINGSSL_MAKE_UP_REF(SSL_SESSION, SSL_SESSION_dup_ref) | |
| // SSL_get_traffic_secrets sets `*out_read_traffic_secret` and | |
| // `*out_write_traffic_secret` to reference the current TLS 1.3 traffic secrets | |
| // for `ssl`. It returns true on success and false on error. | |
| // | |
| // This function is only valid on TLS 1.3 connections that have completed the | |
| // handshake. It is not valid for QUIC or DTLS, where multiple traffic secrets | |
| // may be active at a time. | |
| OPENSSL_EXPORT bool SSL_get_traffic_secrets( | |
| const SSL *ssl, Span<const uint8_t> *out_read_traffic_secret, | |
| Span<const uint8_t> *out_write_traffic_secret); | |
| BSSL_NAMESPACE_END | |
| } // extern C++ | |
| #endif // !defined(BORINGSSL_NO_CXX) | |
| #endif | |
| #define SSL_R_APP_DATA_IN_HANDSHAKE 100 | |
| #define SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT 101 | |
| #define SSL_R_BAD_ALERT 102 | |
| #define SSL_R_BAD_CHANGE_CIPHER_SPEC 103 | |
| #define SSL_R_BAD_DATA_RETURNED_BY_CALLBACK 104 | |
| #define SSL_R_BAD_DH_P_LENGTH 105 | |
| #define SSL_R_BAD_DIGEST_LENGTH 106 | |
| #define SSL_R_BAD_ECC_CERT 107 | |
| #define SSL_R_BAD_ECPOINT 108 | |
| #define SSL_R_BAD_HANDSHAKE_RECORD 109 | |
| #define SSL_R_BAD_HELLO_REQUEST 110 | |
| #define SSL_R_BAD_LENGTH 111 | |
| #define SSL_R_BAD_PACKET_LENGTH 112 | |
| #define SSL_R_BAD_RSA_ENCRYPT 113 | |
| #define SSL_R_BAD_SIGNATURE 114 | |
| #define SSL_R_BAD_SRTP_MKI_VALUE 115 | |
| #define SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST 116 | |
| #define SSL_R_BAD_SSL_FILETYPE 117 | |
| #define SSL_R_BAD_WRITE_RETRY 118 | |
| #define SSL_R_BIO_NOT_SET 119 | |
| #define SSL_R_BN_LIB 120 | |
| #define SSL_R_BUFFER_TOO_SMALL 121 | |
| #define SSL_R_CA_DN_LENGTH_MISMATCH 122 | |
| #define SSL_R_CA_DN_TOO_LONG 123 | |
| #define SSL_R_CCS_RECEIVED_EARLY 124 | |
| #define SSL_R_CERTIFICATE_VERIFY_FAILED 125 | |
| #define SSL_R_CERT_CB_ERROR 126 | |
| #define SSL_R_CERT_LENGTH_MISMATCH 127 | |
| #define SSL_R_CHANNEL_ID_NOT_P256 128 | |
| #define SSL_R_CHANNEL_ID_SIGNATURE_INVALID 129 | |
| #define SSL_R_CIPHER_OR_HASH_UNAVAILABLE 130 | |
| #define SSL_R_CLIENTHELLO_PARSE_FAILED 131 | |
| #define SSL_R_CLIENTHELLO_TLSEXT 132 | |
| #define SSL_R_CONNECTION_REJECTED 133 | |
| #define SSL_R_CONNECTION_TYPE_NOT_SET 134 | |
| #define SSL_R_CUSTOM_EXTENSION_ERROR 135 | |
| #define SSL_R_DATA_LENGTH_TOO_LONG 136 | |
| #define SSL_R_DECODE_ERROR 137 | |
| #define SSL_R_DECRYPTION_FAILED 138 | |
| #define SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC 139 | |
| #define SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG 140 | |
| #define SSL_R_DH_P_TOO_LONG 141 | |
| #define SSL_R_DIGEST_CHECK_FAILED 142 | |
| #define SSL_R_DTLS_MESSAGE_TOO_BIG 143 | |
| #define SSL_R_ECC_CERT_NOT_FOR_SIGNING 144 | |
| #define SSL_R_EMS_STATE_INCONSISTENT 145 | |
| #define SSL_R_ENCRYPTED_LENGTH_TOO_LONG 146 | |
| #define SSL_R_ERROR_ADDING_EXTENSION 147 | |
| #define SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST 148 | |
| #define SSL_R_ERROR_PARSING_EXTENSION 149 | |
| #define SSL_R_EXCESSIVE_MESSAGE_SIZE 150 | |
| #define SSL_R_EXTRA_DATA_IN_MESSAGE 151 | |
| #define SSL_R_FRAGMENT_MISMATCH 152 | |
| #define SSL_R_GOT_NEXT_PROTO_WITHOUT_EXTENSION 153 | |
| #define SSL_R_HANDSHAKE_FAILURE_ON_CLIENT_HELLO 154 | |
| #define SSL_R_HTTPS_PROXY_REQUEST 155 | |
| #define SSL_R_HTTP_REQUEST 156 | |
| #define SSL_R_INAPPROPRIATE_FALLBACK 157 | |
| #define SSL_R_INVALID_COMMAND 158 | |
| #define SSL_R_INVALID_MESSAGE 159 | |
| #define SSL_R_INVALID_SSL_SESSION 160 | |
| #define SSL_R_INVALID_TICKET_KEYS_LENGTH 161 | |
| #define SSL_R_LENGTH_MISMATCH 162 | |
| #define SSL_R_MISSING_EXTENSION 164 | |
| #define SSL_R_MISSING_RSA_CERTIFICATE 165 | |
| #define SSL_R_MISSING_TMP_DH_KEY 166 | |
| #define SSL_R_MISSING_TMP_ECDH_KEY 167 | |
| #define SSL_R_MIXED_SPECIAL_OPERATOR_WITH_GROUPS 168 | |
| #define SSL_R_MTU_TOO_SMALL 169 | |
| #define SSL_R_NEGOTIATED_BOTH_NPN_AND_ALPN 170 | |
| #define SSL_R_NESTED_GROUP 171 | |
| #define SSL_R_NO_CERTIFICATES_RETURNED 172 | |
| #define SSL_R_NO_CERTIFICATE_ASSIGNED 173 | |
| #define SSL_R_NO_CERTIFICATE_SET 174 | |
| #define SSL_R_NO_CIPHERS_AVAILABLE 175 | |
| #define SSL_R_NO_CIPHERS_PASSED 176 | |
| #define SSL_R_NO_CIPHER_MATCH 177 | |
| #define SSL_R_NO_COMPRESSION_SPECIFIED 178 | |
| #define SSL_R_NO_METHOD_SPECIFIED 179 | |
| #define SSL_R_NO_PRIVATE_KEY_ASSIGNED 181 | |
| #define SSL_R_NO_RENEGOTIATION 182 | |
| #define SSL_R_NO_REQUIRED_DIGEST 183 | |
| #define SSL_R_NO_SHARED_CIPHER 184 | |
| #define SSL_R_NULL_SSL_CTX 185 | |
| #define SSL_R_NULL_SSL_METHOD_PASSED 186 | |
| #define SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED 187 | |
| #define SSL_R_OLD_SESSION_VERSION_NOT_RETURNED 188 | |
| #define SSL_R_OUTPUT_ALIASES_INPUT 189 | |
| #define SSL_R_PARSE_TLSEXT 190 | |
| #define SSL_R_PATH_TOO_LONG 191 | |
| #define SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE 192 | |
| #define SSL_R_PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE 193 | |
| #define SSL_R_PROTOCOL_IS_SHUTDOWN 194 | |
| #define SSL_R_PSK_IDENTITY_NOT_FOUND 195 | |
| #define SSL_R_PSK_NO_CLIENT_CB 196 | |
| #define SSL_R_PSK_NO_SERVER_CB 197 | |
| #define SSL_R_READ_TIMEOUT_EXPIRED 198 | |
| #define SSL_R_RECORD_LENGTH_MISMATCH 199 | |
| #define SSL_R_RECORD_TOO_LARGE 200 | |
| #define SSL_R_RENEGOTIATION_ENCODING_ERR 201 | |
| #define SSL_R_RENEGOTIATION_MISMATCH 202 | |
| #define SSL_R_REQUIRED_CIPHER_MISSING 203 | |
| #define SSL_R_RESUMED_EMS_SESSION_WITHOUT_EMS_EXTENSION 204 | |
| #define SSL_R_RESUMED_NON_EMS_SESSION_WITH_EMS_EXTENSION 205 | |
| #define SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING 206 | |
| #define SSL_R_SERVERHELLO_TLSEXT 207 | |
| #define SSL_R_SESSION_ID_CONTEXT_UNINITIALIZED 208 | |
| #define SSL_R_SESSION_MAY_NOT_BE_CREATED 209 | |
| #define SSL_R_SIGNATURE_ALGORITHMS_EXTENSION_SENT_BY_SERVER 210 | |
| #define SSL_R_SRTP_COULD_NOT_ALLOCATE_PROFILES 211 | |
| #define SSL_R_SRTP_UNKNOWN_PROTECTION_PROFILE 212 | |
| #define SSL_R_SSL3_EXT_INVALID_SERVERNAME 213 | |
| #define SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION 214 | |
| #define SSL_R_SSL_HANDSHAKE_FAILURE 215 | |
| #define SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG 216 | |
| #define SSL_R_TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST 217 | |
| #define SSL_R_TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG 218 | |
| #define SSL_R_TOO_MANY_EMPTY_FRAGMENTS 219 | |
| #define SSL_R_TOO_MANY_WARNING_ALERTS 220 | |
| #define SSL_R_UNABLE_TO_FIND_ECDH_PARAMETERS 221 | |
| #define SSL_R_UNEXPECTED_EXTENSION 222 | |
| #define SSL_R_UNEXPECTED_MESSAGE 223 | |
| #define SSL_R_UNEXPECTED_OPERATOR_IN_GROUP 224 | |
| #define SSL_R_UNEXPECTED_RECORD 225 | |
| #define SSL_R_UNINITIALIZED 226 | |
| #define SSL_R_UNKNOWN_ALERT_TYPE 227 | |
| #define SSL_R_UNKNOWN_CERTIFICATE_TYPE 228 | |
| #define SSL_R_UNKNOWN_CIPHER_RETURNED 229 | |
| #define SSL_R_UNKNOWN_CIPHER_TYPE 230 | |
| #define SSL_R_UNKNOWN_DIGEST 231 | |
| #define SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE 232 | |
| #define SSL_R_UNKNOWN_PROTOCOL 233 | |
| #define SSL_R_UNKNOWN_SSL_VERSION 234 | |
| #define SSL_R_UNKNOWN_STATE 235 | |
| #define SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED 236 | |
| #define SSL_R_UNSUPPORTED_CIPHER 237 | |
| #define SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM 238 | |
| #define SSL_R_UNSUPPORTED_ELLIPTIC_CURVE 239 | |
| #define SSL_R_UNSUPPORTED_PROTOCOL 240 | |
| #define SSL_R_WRONG_CERTIFICATE_TYPE 241 | |
| #define SSL_R_WRONG_CIPHER_RETURNED 242 | |
| #define SSL_R_WRONG_CURVE 243 | |
| #define SSL_R_WRONG_MESSAGE_TYPE 244 | |
| #define SSL_R_WRONG_SIGNATURE_TYPE 245 | |
| #define SSL_R_WRONG_SSL_VERSION 246 | |
| #define SSL_R_WRONG_VERSION_NUMBER 247 | |
| #define SSL_R_X509_LIB 248 | |
| #define SSL_R_X509_VERIFICATION_SETUP_PROBLEMS 249 | |
| #define SSL_R_SHUTDOWN_WHILE_IN_INIT 250 | |
| #define SSL_R_INVALID_OUTER_RECORD_TYPE 251 | |
| #define SSL_R_UNSUPPORTED_PROTOCOL_FOR_CUSTOM_KEY 252 | |
| #define SSL_R_NO_COMMON_SIGNATURE_ALGORITHMS 253 | |
| #define SSL_R_DOWNGRADE_DETECTED 254 | |
| #define SSL_R_EXCESS_HANDSHAKE_DATA 255 | |
| #define SSL_R_INVALID_COMPRESSION_LIST 256 | |
| #define SSL_R_DUPLICATE_EXTENSION 257 | |
| #define SSL_R_MISSING_KEY_SHARE 258 | |
| #define SSL_R_INVALID_ALPN_PROTOCOL 259 | |
| #define SSL_R_TOO_MANY_KEY_UPDATES 260 | |
| #define SSL_R_BLOCK_CIPHER_PAD_IS_WRONG 261 | |
| #define SSL_R_NO_CIPHERS_SPECIFIED 262 | |
| #define SSL_R_RENEGOTIATION_EMS_MISMATCH 263 | |
| #define SSL_R_DUPLICATE_KEY_SHARE 264 | |
| #define SSL_R_NO_GROUPS_SPECIFIED 265 | |
| #define SSL_R_NO_SHARED_GROUP 266 | |
| #define SSL_R_PRE_SHARED_KEY_MUST_BE_LAST 267 | |
| #define SSL_R_OLD_SESSION_PRF_HASH_MISMATCH 268 | |
| #define SSL_R_INVALID_SCT_LIST 269 | |
| #define SSL_R_TOO_MUCH_SKIPPED_EARLY_DATA 270 | |
| #define SSL_R_PSK_IDENTITY_BINDER_COUNT_MISMATCH 271 | |
| #define SSL_R_CANNOT_PARSE_LEAF_CERT 272 | |
| #define SSL_R_SERVER_CERT_CHANGED 273 | |
| #define SSL_R_CERTIFICATE_AND_PRIVATE_KEY_MISMATCH 274 | |
| #define SSL_R_CANNOT_HAVE_BOTH_PRIVKEY_AND_METHOD 275 | |
| #define SSL_R_TICKET_ENCRYPTION_FAILED 276 | |
| #define SSL_R_ALPN_MISMATCH_ON_EARLY_DATA 277 | |
| #define SSL_R_WRONG_VERSION_ON_EARLY_DATA 278 | |
| #define SSL_R_UNEXPECTED_EXTENSION_ON_EARLY_DATA 279 | |
| #define SSL_R_NO_SUPPORTED_VERSIONS_ENABLED 280 | |
| #define SSL_R_EMPTY_HELLO_RETRY_REQUEST 282 | |
| #define SSL_R_EARLY_DATA_NOT_IN_USE 283 | |
| #define SSL_R_HANDSHAKE_NOT_COMPLETE 284 | |
| #define SSL_R_NEGOTIATED_TB_WITHOUT_EMS_OR_RI 285 | |
| #define SSL_R_SERVER_ECHOED_INVALID_SESSION_ID 286 | |
| #define SSL_R_PRIVATE_KEY_OPERATION_FAILED 287 | |
| #define SSL_R_SECOND_SERVERHELLO_VERSION_MISMATCH 288 | |
| #define SSL_R_OCSP_CB_ERROR 289 | |
| #define SSL_R_SSL_SESSION_ID_TOO_LONG 290 | |
| #define SSL_R_APPLICATION_DATA_ON_SHUTDOWN 291 | |
| #define SSL_R_CERT_DECOMPRESSION_FAILED 292 | |
| #define SSL_R_UNCOMPRESSED_CERT_TOO_LARGE 293 | |
| #define SSL_R_UNKNOWN_CERT_COMPRESSION_ALG 294 | |
| #define SSL_R_INVALID_SIGNATURE_ALGORITHM 295 | |
| #define SSL_R_DUPLICATE_SIGNATURE_ALGORITHM 296 | |
| #define SSL_R_TLS13_DOWNGRADE 297 | |
| #define SSL_R_QUIC_INTERNAL_ERROR 298 | |
| #define SSL_R_WRONG_ENCRYPTION_LEVEL_RECEIVED 299 | |
| #define SSL_R_TOO_MUCH_READ_EARLY_DATA 300 | |
| #define SSL_R_INVALID_DELEGATED_CREDENTIAL 301 | |
| #define SSL_R_KEY_USAGE_BIT_INCORRECT 302 | |
| #define SSL_R_INCONSISTENT_CLIENT_HELLO 303 | |
| #define SSL_R_CIPHER_MISMATCH_ON_EARLY_DATA 304 | |
| #define SSL_R_QUIC_TRANSPORT_PARAMETERS_MISCONFIGURED 305 | |
| #define SSL_R_UNEXPECTED_COMPATIBILITY_MODE 306 | |
| #define SSL_R_NO_APPLICATION_PROTOCOL 307 | |
| #define SSL_R_NEGOTIATED_ALPS_WITHOUT_ALPN 308 | |
| #define SSL_R_ALPS_MISMATCH_ON_EARLY_DATA 309 | |
| #define SSL_R_ECH_SERVER_CONFIG_AND_PRIVATE_KEY_MISMATCH 310 | |
| #define SSL_R_ECH_SERVER_CONFIG_UNSUPPORTED_EXTENSION 311 | |
| #define SSL_R_UNSUPPORTED_ECH_SERVER_CONFIG 312 | |
| #define SSL_R_ECH_SERVER_WOULD_HAVE_NO_RETRY_CONFIGS 313 | |
| #define SSL_R_INVALID_CLIENT_HELLO_INNER 314 | |
| #define SSL_R_INVALID_ALPN_PROTOCOL_LIST 315 | |
| #define SSL_R_COULD_NOT_PARSE_HINTS 316 | |
| #define SSL_R_INVALID_ECH_PUBLIC_NAME 317 | |
| #define SSL_R_INVALID_ECH_CONFIG_LIST 318 | |
| #define SSL_R_ECH_REJECTED 319 | |
| #define SSL_R_INVALID_OUTER_EXTENSION 320 | |
| #define SSL_R_INCONSISTENT_ECH_NEGOTIATION 321 | |
| #define SSL_R_INVALID_ALPS_CODEPOINT 322 | |
| #define SSL_R_NO_MATCHING_ISSUER 323 | |
| #define SSL_R_INVALID_SPAKE2PLUSV1_VALUE 324 | |
| #define SSL_R_PAKE_EXHAUSTED 325 | |
| #define SSL_R_PEER_PAKE_MISMATCH 326 | |
| #define SSL_R_UNSUPPORTED_CREDENTIAL_LIST 327 | |
| #define SSL_R_INVALID_TRUST_ANCHOR_LIST 328 | |
| #define SSL_R_INVALID_CERTIFICATE_PROPERTY_LIST 329 | |
| #define SSL_R_DUPLICATE_GROUP 330 | |
| #define SSL_R_INVALID_PSK_FOR_CONNECTION 331 | |
| #define SSL_R_NO_SUPPORTED_PSK_MODE 332 | |
| #define SSL_R_INVALID_CERT_TYPES_LIST 333 | |
| #define SSL_R_UNSUPPORTED_CERTIFICATE 334 | |
| #define SSL_R_MISSING_KEY 335 | |
| #define SSL_R_INVALID_RAW_PUBLIC_KEY 336 | |
| #define SSL_R_UNUSABLE_ECH_CONFIG_LIST 337 | |
| #define SSL_R_INVALID_CIPHER_FLAGS 338 | |
| #define SSL_R_DUPLICATE_CIPHER 339 | |
| #define SSL_R_INVALID_TRUST_ANCHOR_ID 340 | |
| #define SSL_R_SSLV3_ALERT_CLOSE_NOTIFY 1000 | |
| #define SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE 1010 | |
| #define SSL_R_SSLV3_ALERT_BAD_RECORD_MAC 1020 | |
| #define SSL_R_TLSV1_ALERT_DECRYPTION_FAILED 1021 | |
| #define SSL_R_TLSV1_ALERT_RECORD_OVERFLOW 1022 | |
| #define SSL_R_SSLV3_ALERT_DECOMPRESSION_FAILURE 1030 | |
| #define SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE 1040 | |
| #define SSL_R_SSLV3_ALERT_NO_CERTIFICATE 1041 | |
| #define SSL_R_SSLV3_ALERT_BAD_CERTIFICATE 1042 | |
| #define SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE 1043 | |
| #define SSL_R_SSLV3_ALERT_CERTIFICATE_REVOKED 1044 | |
| #define SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED 1045 | |
| #define SSL_R_SSLV3_ALERT_CERTIFICATE_UNKNOWN 1046 | |
| #define SSL_R_SSLV3_ALERT_ILLEGAL_PARAMETER 1047 | |
| #define SSL_R_TLSV1_ALERT_UNKNOWN_CA 1048 | |
| #define SSL_R_TLSV1_ALERT_ACCESS_DENIED 1049 | |
| #define SSL_R_TLSV1_ALERT_DECODE_ERROR 1050 | |
| #define SSL_R_TLSV1_ALERT_DECRYPT_ERROR 1051 | |
| #define SSL_R_TLSV1_ALERT_EXPORT_RESTRICTION 1060 | |
| #define SSL_R_TLSV1_ALERT_PROTOCOL_VERSION 1070 | |
| #define SSL_R_TLSV1_ALERT_INSUFFICIENT_SECURITY 1071 | |
| #define SSL_R_TLSV1_ALERT_INTERNAL_ERROR 1080 | |
| #define SSL_R_TLSV1_ALERT_INAPPROPRIATE_FALLBACK 1086 | |
| #define SSL_R_TLSV1_ALERT_USER_CANCELLED 1090 | |
| #define SSL_R_TLSV1_ALERT_NO_RENEGOTIATION 1100 | |
| #define SSL_R_TLSV1_ALERT_UNSUPPORTED_EXTENSION 1110 | |
| #define SSL_R_TLSV1_ALERT_CERTIFICATE_UNOBTAINABLE 1111 | |
| #define SSL_R_TLSV1_ALERT_UNRECOGNIZED_NAME 1112 | |
| #define SSL_R_TLSV1_ALERT_BAD_CERTIFICATE_STATUS_RESPONSE 1113 | |
| #define SSL_R_TLSV1_ALERT_BAD_CERTIFICATE_HASH_VALUE 1114 | |
| #define SSL_R_TLSV1_ALERT_UNKNOWN_PSK_IDENTITY 1115 | |
| #define SSL_R_TLSV1_ALERT_CERTIFICATE_REQUIRED 1116 | |
| #define SSL_R_TLSV1_ALERT_NO_APPLICATION_PROTOCOL 1120 | |
| #define SSL_R_TLSV1_ALERT_ECH_REQUIRED 1121 | |
| #endif // OPENSSL_HEADER_SSL_H |