| =pod |
| |
| =head1 NAME |
| |
| SSL_psk_client_cb_func, |
| SSL_psk_use_session_cb_func, |
| SSL_CTX_set_psk_client_callback, |
| SSL_set_psk_client_callback, |
| SSL_CTX_set_psk_use_session_callback, |
| SSL_set_psk_use_session_callback |
| - set PSK client callback |
| |
| =head1 SYNOPSIS |
| |
| #include <openssl/ssl.h> |
| |
| typedef int (*SSL_psk_use_session_cb_func)(SSL *ssl, const EVP_MD *md, |
| const unsigned char **id, |
| size_t *idlen, |
| SSL_SESSION **sess); |
| |
| |
| void SSL_CTX_set_psk_use_session_callback(SSL_CTX *ctx, |
| SSL_psk_use_session_cb_func cb); |
| void SSL_set_psk_use_session_callback(SSL *s, SSL_psk_use_session_cb_func cb); |
| |
| |
| typedef unsigned int (*SSL_psk_client_cb_func)(SSL *ssl, |
| const char *hint, |
| char *identity, |
| unsigned int max_identity_len, |
| unsigned char *psk, |
| unsigned int max_psk_len); |
| |
| void SSL_CTX_set_psk_client_callback(SSL_CTX *ctx, SSL_psk_client_cb_func cb); |
| void SSL_set_psk_client_callback(SSL *ssl, SSL_psk_client_cb_func cb); |
| |
| |
| =head1 DESCRIPTION |
| |
| A client application wishing to use TLSv1.3 PSKs should use either |
| SSL_CTX_set_psk_use_session_callback() or SSL_set_psk_use_session_callback() as |
| appropriate. These functions cannot be used for TLSv1.2 and below PSKs. |
| |
| The callback function is given a pointer to the SSL connection in B<ssl>. |
| |
| The first time the callback is called for a connection the B<md> parameter is |
| NULL. In some circumstances the callback will be called a second time. In that |
| case the server will have specified a ciphersuite to use already and the PSK |
| must be compatible with the digest for that ciphersuite. The digest will be |
| given in B<md>. The PSK returned by the callback is allowed to be different |
| between the first and second time it is called. |
| |
| On successful completion the callback must store a pointer to an identifier for |
| the PSK in B<*id>. The identifier length in bytes should be stored in B<*idlen>. |
| The memory pointed to by B<*id> remains owned by the application and should |
| be freed by it as required at any point after the handshake is complete. |
| |
| Additionally the callback should store a pointer to an SSL_SESSION object in |
| B<*sess>. This is used as the basis for the PSK, and should, at a minimum, have |
| the following fields set: |
| |
| =over 4 |
| |
| =item The master key |
| |
| This can be set via a call to L<SSL_SESSION_set1_master_key(3)>. |
| |
| =item A ciphersuite |
| |
| Only the handshake digest associated with the ciphersuite is relevant for the |
| PSK (the server may go on to negotiate any ciphersuite which is compatible with |
| the digest). The application can use any TLSv1.3 ciphersuite. If B<md> is |
| not NULL the handshake digest for the ciphersuite should be the same. |
| The ciphersuite can be set via a call to <SSL_SESSION_set_cipher(3)>. The |
| handshake digest of an SSL_CIPHER object can be checked using |
| <SSL_CIPHER_get_handshake_digest(3)>. |
| |
| =item The protocol version |
| |
| This can be set via a call to L<SSL_SESSION_set_protocol_version(3)> and should |
| be TLS1_3_VERSION. |
| |
| =back |
| |
| Additionally the maximum early data value should be set via a call to |
| L<SSL_SESSION_set_max_early_data(3)> if the PSK will be used for sending early |
| data. |
| |
| Alternatively an SSL_SESSION created from a previous non-PSK handshake may also |
| be used as the basis for a PSK. |
| |
| Ownership of the SSL_SESSION object is passed to the OpenSSL library and so it |
| should not be freed by the application. |
| |
| It is also possible for the callback to succeed but not supply a PSK. In this |
| case no PSK will be sent to the server but the handshake will continue. To do |
| this the callback should return successfully and ensure that B<*sess> is |
| NULL. The contents of B<*id> and B<*idlen> will be ignored. |
| |
| A client application wishing to use PSK ciphersuites for TLSv1.2 and below must |
| provide a different callback function. This function will be called when the |
| client is sending the ClientKeyExchange message to the server. |
| |
| The purpose of the callback function is to select the PSK identity and |
| the pre-shared key to use during the connection setup phase. |
| |
| The callback is set using functions SSL_CTX_set_psk_client_callback() |
| or SSL_set_psk_client_callback(). The callback function is given the |
| connection in parameter B<ssl>, a B<NUL>-terminated PSK identity hint |
| sent by the server in parameter B<hint>, a buffer B<identity> of |
| length B<max_identity_len> bytes (including the B<NUL>-terminator) where the |
| resulting B<NUL>-terminated identity is to be stored, and a buffer B<psk> |
| of length B<max_psk_len> bytes where the resulting pre-shared key is to |
| be stored. |
| |
| The callback for use in TLSv1.2 will also work in TLSv1.3 although it is |
| recommended to use SSL_CTX_set_psk_use_session_callback() |
| or SSL_set_psk_use_session_callback() for this purpose instead. If TLSv1.3 has |
| been negotiated then OpenSSL will first check to see if a callback has been set |
| via SSL_CTX_set_psk_use_session_callback() or SSL_set_psk_use_session_callback() |
| and it will use that in preference. If no such callback is present then it will |
| check to see if a callback has been set via SSL_CTX_set_psk_client_callback() or |
| SSL_set_psk_client_callback() and use that. In this case the B<hint> value will |
| always be NULL and the handshake digest will default to SHA-256 for any returned |
| PSK. TLSv1.3 early data exchanges are possible in PSK connections only with the |
| B<SSL_psk_use_session_cb_func> callback, and are not possible with the |
| B<SSL_psk_client_cb_func> callback. |
| |
| =head1 NOTES |
| |
| Note that parameter B<hint> given to the callback may be B<NULL>. |
| |
| A connection established via a TLSv1.3 PSK will appear as if session resumption |
| has occurred so that L<SSL_session_reused(3)> will return true. |
| |
| There are no known security issues with sharing the same PSK between TLSv1.2 (or |
| below) and TLSv1.3. However, the RFC has this note of caution: |
| |
| "While there is no known way in which the same PSK might produce related output |
| in both versions, only limited analysis has been done. Implementations can |
| ensure safety from cross-protocol related output by not reusing PSKs between |
| TLS 1.3 and TLS 1.2." |
| |
| =head1 RETURN VALUES |
| |
| Return values from the B<SSL_psk_client_cb_func> callback are interpreted as |
| follows: |
| |
| On success (callback found a PSK identity and a pre-shared key to use) |
| the length (> 0) of B<psk> in bytes is returned. |
| |
| Otherwise or on errors the callback should return 0. In this case |
| the connection setup fails. |
| |
| The SSL_psk_use_session_cb_func callback should return 1 on success or 0 on |
| failure. In the event of failure the connection setup fails. |
| |
| =head1 SEE ALSO |
| |
| L<ssl(7)>, |
| L<SSL_CTX_set_psk_find_session_callback(3)>, |
| L<SSL_set_psk_find_session_callback(3)> |
| |
| =head1 HISTORY |
| |
| SSL_CTX_set_psk_use_session_callback() and SSL_set_psk_use_session_callback() |
| were added in OpenSSL 1.1.1. |
| |
| =head1 COPYRIGHT |
| |
| Copyright 2006-2020 The OpenSSL Project Authors. All Rights Reserved. |
| |
| Licensed under the Apache License 2.0 (the "License"). You may not use |
| this file except in compliance with the License. You can obtain a copy |
| in the file LICENSE in the source distribution or at |
| L<https://www.openssl.org/source/license.html>. |
| |
| =cut |