wpa_supplicant / hostapd  2.5
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
Data Structures | Macros | Typedefs | Functions
tls_openssl.c File Reference

SSL/TLS interface functions for OpenSSL. More...

#include "includes.h"
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <openssl/pkcs12.h>
#include <openssl/x509v3.h>
#include <openssl/dsa.h>
#include <openssl/dh.h>
#include "common.h"
#include "crypto.h"
#include "sha1.h"
#include "sha256.h"
#include "tls.h"

Data Structures

struct  tls_context
 
struct  tls_data
 
struct  tls_connection
 

Macros

#define OPENSSL_NO_ENGINE
 
#define ERR_remove_thread_state(tid)   ERR_remove_state(0)
 

Typedefs

typedef int stack_index_t
 

Functions

void * tls_init (const struct tls_config *conf)
 Initialize TLS library. More...
 
void tls_deinit (void *ssl_ctx)
 Deinitialize TLS library. More...
 
int tls_get_errors (void *ssl_ctx)
 Process pending errors. More...
 
struct tls_connectiontls_connection_init (void *ssl_ctx)
 Initialize a new TLS connection. More...
 
void tls_connection_deinit (void *ssl_ctx, struct tls_connection *conn)
 Free TLS connection data. More...
 
int tls_connection_established (void *ssl_ctx, struct tls_connection *conn)
 Has the TLS connection been completed? More...
 
int tls_connection_shutdown (void *ssl_ctx, struct tls_connection *conn)
 Shutdown TLS connection. More...
 
int tls_global_set_verify (void *ssl_ctx, int check_crl)
 Set global certificate verification options. More...
 
int tls_connection_set_verify (void *ssl_ctx, struct tls_connection *conn, int verify_peer, unsigned int flags, const u8 *session_ctx, size_t session_ctx_len)
 Set certificate verification options. More...
 
int tls_connection_get_random (void *ssl_ctx, struct tls_connection *conn, struct tls_random *keys)
 Get random data from TLS connection. More...
 
int tls_connection_prf (void *tls_ctx, struct tls_connection *conn, const char *label, int server_random_first, int skip_keyblock, u8 *out, size_t out_len)
 Use TLS-PRF to derive keying material. More...
 
struct wpabuftls_connection_handshake (void *ssl_ctx, struct tls_connection *conn, const struct wpabuf *in_data, struct wpabuf **appl_data)
 Process TLS handshake (client side) More...
 
struct wpabuftls_connection_server_handshake (void *tls_ctx, struct tls_connection *conn, const struct wpabuf *in_data, struct wpabuf **appl_data)
 Process TLS handshake (server side) More...
 
struct wpabuftls_connection_encrypt (void *tls_ctx, struct tls_connection *conn, const struct wpabuf *in_data)
 Encrypt data into TLS tunnel. More...
 
struct wpabuftls_connection_decrypt (void *tls_ctx, struct tls_connection *conn, const struct wpabuf *in_data)
 Decrypt data from TLS tunnel. More...
 
int tls_connection_resumed (void *ssl_ctx, struct tls_connection *conn)
 Was session resumption used. More...
 
int tls_connection_set_cipher_list (void *tls_ctx, struct tls_connection *conn, u8 *ciphers)
 Configure acceptable cipher suites. More...
 
int tls_get_version (void *ssl_ctx, struct tls_connection *conn, char *buf, size_t buflen)
 Get the current TLS version number. More...
 
int tls_get_cipher (void *ssl_ctx, struct tls_connection *conn, char *buf, size_t buflen)
 Get current cipher name. More...
 
int tls_connection_enable_workaround (void *ssl_ctx, struct tls_connection *conn)
 Enable TLS workaround options. More...
 
int tls_connection_get_failed (void *ssl_ctx, struct tls_connection *conn)
 Get connection failure status. More...
 
int tls_connection_get_read_alerts (void *ssl_ctx, struct tls_connection *conn)
 Get connection read alert status. More...
 
int tls_connection_get_write_alerts (void *ssl_ctx, struct tls_connection *conn)
 Get connection write alert status. More...
 
int tls_connection_set_params (void *tls_ctx, struct tls_connection *conn, const struct tls_connection_params *params)
 Set TLS connection parameters. More...
 
int tls_global_set_params (void *tls_ctx, const struct tls_connection_params *params)
 Set TLS parameters for all TLS connection. More...
 
int tls_connection_set_session_ticket_cb (void *tls_ctx, struct tls_connection *conn, tls_session_ticket_cb cb, void *ctx)
 
int tls_get_library_version (char *buf, size_t buf_len)
 
void tls_connection_set_success_data (struct tls_connection *conn, struct wpabuf *data)
 
void tls_connection_set_success_data_resumed (struct tls_connection *conn)
 
const struct wpabuftls_connection_get_success_data (struct tls_connection *conn)
 
void tls_connection_remove_session (struct tls_connection *conn)
 

Detailed Description

SSL/TLS interface functions for OpenSSL.

Function Documentation

struct wpabuf* tls_connection_decrypt ( void *  tls_ctx,
struct tls_connection conn,
const struct wpabuf in_data 
)

Decrypt data from TLS tunnel.

Parameters
tls_ctxTLS context data from tls_init()
connConnection context data from tls_connection_init()
in_dataEncrypted TLS data
Returns
Decrypted TLS data or NULL on failure

This function is used after TLS handshake has been completed successfully to receive data from the encrypted tunnel. The caller is responsible for freeing the returned output data.

void tls_connection_deinit ( void *  tls_ctx,
struct tls_connection conn 
)

Free TLS connection data.

Parameters
tls_ctxTLS context data from tls_init()
connConnection context data from tls_connection_init()

Release all resources allocated for TLS connection.

int tls_connection_enable_workaround ( void *  tls_ctx,
struct tls_connection conn 
)

Enable TLS workaround options.

Parameters
tls_ctxTLS context data from tls_init()
connConnection context data from tls_connection_init()
Returns
0 on success, -1 on failure

This function is used to enable connection-specific workaround options for buffer SSL/TLS implementations.

struct wpabuf* tls_connection_encrypt ( void *  tls_ctx,
struct tls_connection conn,
const struct wpabuf in_data 
)

Encrypt data into TLS tunnel.

Parameters
tls_ctxTLS context data from tls_init()
connConnection context data from tls_connection_init()
in_dataPlaintext data to be encrypted
Returns
Encrypted TLS data or NULL on failure

This function is used after TLS handshake has been completed successfully to send data in the encrypted tunnel. The caller is responsible for freeing the returned output data.

int tls_connection_established ( void *  tls_ctx,
struct tls_connection conn 
)

Has the TLS connection been completed?

Parameters
tls_ctxTLS context data from tls_init()
connConnection context data from tls_connection_init()
Returns
1 if TLS connection has been completed, 0 if not.
int tls_connection_get_failed ( void *  tls_ctx,
struct tls_connection conn 
)

Get connection failure status.

Parameters
tls_ctxTLS context data from tls_init()
connConnection context data from tls_connection_init()

Returns >0 if connection has failed, 0 if not.

int tls_connection_get_random ( void *  tls_ctx,
struct tls_connection conn,
struct tls_random data 
)

Get random data from TLS connection.

Parameters
tls_ctxTLS context data from tls_init()
connConnection context data from tls_connection_init()
dataStructure of client/server random data (filled on success)
Returns
0 on success, -1 on failure
int tls_connection_get_read_alerts ( void *  tls_ctx,
struct tls_connection conn 
)

Get connection read alert status.

Parameters
tls_ctxTLS context data from tls_init()
connConnection context data from tls_connection_init()
Returns
Number of times a fatal read (remote end reported error) has happened during this connection.
int tls_connection_get_write_alerts ( void *  tls_ctx,
struct tls_connection conn 
)

Get connection write alert status.

Parameters
tls_ctxTLS context data from tls_init()
connConnection context data from tls_connection_init()
Returns
Number of times a fatal write (locally detected error) has happened during this connection.
struct wpabuf* tls_connection_handshake ( void *  tls_ctx,
struct tls_connection conn,
const struct wpabuf in_data,
struct wpabuf **  appl_data 
)

Process TLS handshake (client side)

Parameters
tls_ctxTLS context data from tls_init()
connConnection context data from tls_connection_init()
in_dataInput data from TLS server
appl_dataPointer to application data pointer, or NULL if dropped
Returns
Output data, NULL on failure

The caller is responsible for freeing the returned output data. If the final handshake message includes application data, this is decrypted and appl_data (if not NULL) is set to point this data. The caller is responsible for freeing appl_data.

This function is used during TLS handshake. The first call is done with in_data == NULL and the library is expected to return ClientHello packet. This packet is then send to the server and a response from server is given to TLS library by calling this function again with in_data pointing to the TLS message from the server.

If the TLS handshake fails, this function may return NULL. However, if the TLS library has a TLS alert to send out, that should be returned as the output data. In this case, tls_connection_get_failed() must return failure (> 0).

tls_connection_established() should return 1 once the TLS handshake has been completed successfully.

struct tls_connection* tls_connection_init ( void *  tls_ctx)

Initialize a new TLS connection.

Parameters
tls_ctxTLS context data from tls_init()
Returns
Connection context data, conn for other function calls
int tls_connection_prf ( void *  tls_ctx,
struct tls_connection conn,
const char *  label,
int  server_random_first,
int  skip_keyblock,
u8 *  out,
size_t  out_len 
)

Use TLS-PRF to derive keying material.

Parameters
tls_ctxTLS context data from tls_init()
connConnection context data from tls_connection_init()
labelLabel (e.g., description of the key) for PRF
server_random_firstseed is 0 = client_random|server_random, 1 = server_random|client_random
skip_keyblockSkip TLS key block from the beginning of PRF output
outBuffer for output data from TLS-PRF
out_lenLength of the output buffer
Returns
0 on success, -1 on failure

tls_connection_prf() is required so that further keying material can be derived from the master secret. Example implementation of this function is in tls_prf_sha1_md5() when it is called with seed set to client_random|server_random (or server_random|client_random). For TLSv1.2 and newer, a different PRF is needed, though.

int tls_connection_resumed ( void *  tls_ctx,
struct tls_connection conn 
)

Was session resumption used.

Parameters
tls_ctxTLS context data from tls_init()
connConnection context data from tls_connection_init()
Returns
1 if current session used session resumption, 0 if not
struct wpabuf* tls_connection_server_handshake ( void *  tls_ctx,
struct tls_connection conn,
const struct wpabuf in_data,
struct wpabuf **  appl_data 
)

Process TLS handshake (server side)

Parameters
tls_ctxTLS context data from tls_init()
connConnection context data from tls_connection_init()
in_dataInput data from TLS peer
appl_dataPointer to application data pointer, or NULL if dropped
Returns
Output data, NULL on failure

The caller is responsible for freeing the returned output data.

int tls_connection_set_cipher_list ( void *  tls_ctx,
struct tls_connection conn,
u8 *  ciphers 
)

Configure acceptable cipher suites.

Parameters
tls_ctxTLS context data from tls_init()
connConnection context data from tls_connection_init()
ciphersZero (TLS_CIPHER_NONE) terminated list of allowed ciphers (TLS_CIPHER_*).
Returns
0 on success, -1 on failure
int tls_connection_set_params ( void *  tls_ctx,
struct tls_connection conn,
const struct tls_connection_params params 
)

Set TLS connection parameters.

Parameters
tls_ctxTLS context data from tls_init()
connConnection context data from tls_connection_init()
paramsConnection parameters
Returns
0 on success, -1 on failure, TLS_SET_PARAMS_ENGINE_PRV_INIT_FAILED (-2) on error causing PKCS#11 engine failure, or TLS_SET_PARAMS_ENGINE_PRV_VERIFY_FAILED (-3) on failure to verify the PKCS#11 engine private key, or TLS_SET_PARAMS_ENGINE_PRV_BAD_PIN (-4) on PIN error causing PKCS#11 engine failure.
int tls_connection_set_verify ( void *  tls_ctx,
struct tls_connection conn,
int  verify_peer,
unsigned int  flags,
const u8 *  session_ctx,
size_t  session_ctx_len 
)

Set certificate verification options.

Parameters
tls_ctxTLS context data from tls_init()
connConnection context data from tls_connection_init()
verify_peer1 = verify peer certificate
flagsConnection flags (TLS_CONN_*)
session_ctxSession caching context or NULL to use default
session_ctx_lenLength of session_ctx in bytes.
Returns
0 on success, -1 on failure
int tls_connection_shutdown ( void *  tls_ctx,
struct tls_connection conn 
)

Shutdown TLS connection.

Parameters
tls_ctxTLS context data from tls_init()
connConnection context data from tls_connection_init()
Returns
0 on success, -1 on failure

Shutdown current TLS connection without releasing all resources. New connection can be started by using the same conn without having to call tls_connection_init() or setting certificates etc. again. The new connection should try to use session resumption.

void tls_deinit ( void *  tls_ctx)

Deinitialize TLS library.

Parameters
tls_ctxTLS context data from tls_init()

Called once during program shutdown and once for each RSN pre-authentication session. If global library deinitialization is needed (i.e., one that is shared between both authentication types), the TLS library wrapper should maintain a reference counter and do global deinitialization only when moving from 1 to 0 references.

int tls_get_cipher ( void *  tls_ctx,
struct tls_connection conn,
char *  buf,
size_t  buflen 
)

Get current cipher name.

Parameters
tls_ctxTLS context data from tls_init()
connConnection context data from tls_connection_init()
bufBuffer for the cipher name
buflenbuf size
Returns
0 on success, -1 on failure

Get the name of the currently used cipher.

int tls_get_errors ( void *  tls_ctx)

Process pending errors.

Parameters
tls_ctxTLS context data from tls_init()
Returns
Number of found error, 0 if no errors detected.

Process all pending TLS errors.

int tls_get_version ( void *  tls_ctx,
struct tls_connection conn,
char *  buf,
size_t  buflen 
)

Get the current TLS version number.

Parameters
tls_ctxTLS context data from tls_init()
connConnection context data from tls_connection_init()
bufBuffer for returning the TLS version number
buflenbuf size
Returns
0 on success, -1 on failure

Get the currently used TLS version number.

int tls_global_set_params ( void *  tls_ctx,
const struct tls_connection_params params 
)

Set TLS parameters for all TLS connection.

Parameters
tls_ctxTLS context data from tls_init()
paramsGlobal TLS parameters
Returns
0 on success, -1 on failure, TLS_SET_PARAMS_ENGINE_PRV_INIT_FAILED (-2) on error causing PKCS#11 engine failure, or TLS_SET_PARAMS_ENGINE_PRV_VERIFY_FAILED (-3) on failure to verify the PKCS#11 engine private key, or TLS_SET_PARAMS_ENGINE_PRV_BAD_PIN (-4) on PIN error causing PKCS#11 engine failure.
int tls_global_set_verify ( void *  tls_ctx,
int  check_crl 
)

Set global certificate verification options.

Parameters
tls_ctxTLS context data from tls_init()
check_crl0 = do not verify CRLs, 1 = verify CRL for the user certificate, 2 = verify CRL for all certificates
Returns
0 on success, -1 on failure
void* tls_init ( const struct tls_config conf)

Initialize TLS library.

Parameters
confConfiguration data for TLS library
Returns
Context data to be used as tls_ctx in calls to other functions, or NULL on failure.

Called once during program startup and once for each RSN pre-authentication session. In other words, there can be two concurrent TLS contexts. If global library initialization is needed (i.e., one that is shared between both authentication types), the TLS library wrapper should maintain a reference counter and do global initialization only when moving from 0 to 1 reference.