tls_openssl.c File Reference

TLS implementation with OpenSSL. More...

## Data Structures

struct | tls_t

## Macros

#define | STROPHE_ERR_func_error_string(e)
#define | STROPHE_SSL_get1_peer_certificate(s)
#define | TLS_ERROR_STR(error, table)
#define | TLS_ERROR_FIELD(x)

## Enumerations

enum | { TLS_SHUTDOWN_MAX_RETRIES = 10 , TLS_TIMEOUT_SEC = 0 , TLS_TIMEOUT_USEC = 100000 }

## Functions

static const unsigned char * | ASN1_STRING_get0_data (ASN1_STRING *asn1)
static int | SSL_CTX_use_cert_and_key (SSL_CTX *ctx, X509 *x509, EVP_PKEY *privatekey, STACK_OF(X509) *chain, int override)
static int | GENERAL_NAME_get0_otherName (const GENERAL_NAME *gen, ASN1_OBJECT **poid, ASN1_TYPE **pvalue)
static void | _tls_sock_wait (tls_t *tls, int error)
static const char * | _tls_error_str (int error, const char **tbl, size_t tbl_size)
static void | _tls_set_error (tls_t *tls, int error)
static void | _tls_log_error (xmpp_ctx_t *ctx)
static void | _tls_dump_cert_info (tls_t *tls)
static X509 * | _tls_cert_read (xmpp_conn_t *conn)
static X509 * | _tls_cert_read_p12 (xmpp_conn_t *conn, EVP_PKEY **pkey, STACK_OF(X509) **ca)
static int | _tls_xaddr_nid (void)
static int | _tls_xmppaddr_to_string (GENERAL_NAME *name, char **res)
| Convert GENERAL_NAME* to a string.
static int | _tls_dnsname_to_string (GENERAL_NAME *name, char **res)
static GENERAL_NAMES * | _tls_conn_get_names (xmpp_conn_t *conn)
static GENERAL_NAMES * | _tls_cert_get_names (X509 *client_cert)
void | tls_initialize (void)
void | tls_shutdown (void)
int | tls_error (struct conn_interface *intf)
char * | tls_id_on_xmppaddr (xmpp_conn_t *conn, unsigned int n)
| Search through the SubjectAlternativeNames and return the next id-on-xmppAddr element starting from n.
unsigned int | tls_id_on_xmppaddr_num (xmpp_conn_t *conn)
static int | _convert_ASN1TIME (ASN1_TIME *ansi_time, char *buf, size_t len)
static char * | _asn1_time_to_str (const xmpp_ctx_t *ctx, ASN1_TIME *t)
static char * | _get_fingerprint (const xmpp_ctx_t *ctx, X509 *err_cert, xmpp_cert_element_t el)
static char * | _get_alg (const xmpp_ctx_t *ctx, X509 *err_cert, xmpp_cert_element_t el)
static xmpp_tlscert_t * | _x509_to_tlscert (xmpp_ctx_t *ctx, X509 *cert)
static int | _tls_verify (int preverify_ok, X509_STORE_CTX *x509_ctx)
static int | _tls_password_callback (char *buf, int size, int rwflag, void *u)
static void | _try_open_keylogfile (tls_t *tls)
tls_t * | tls_new (xmpp_conn_t *conn)
void | tls_free (tls_t *tls)
xmpp_tlscert_t * | tls_peer_cert (xmpp_conn_t *conn)
int | tls_set_credentials (tls_t *tls, const char *cafilename)
int | tls_init_channel_binding (tls_t *tls, const char **binding_prefix, size_t *binding_prefix_len)
const void * | tls_get_channel_binding_data (tls_t *tls, size_t *size)
int | tls_start (tls_t *tls)
int | tls_stop (tls_t *tls)
int | tls_is_recoverable (struct conn_interface *intf, int error)
int | tls_pending (struct conn_interface *intf)
int | tls_read (struct conn_interface *intf, void *buff, size_t len)
int | tls_write (struct conn_interface *intf, const void *buff, size_t len)
int | tls_clear_pending_write (struct conn_interface *intf)
static X509 * | _tls_cert_read_x509 (xmpp_conn_t *conn)
static int | _tls_parse_p12 (PKCS12 *p12, const char *pass, EVP_PKEY **pkey, X509 **cert, STACK_OF(X509) **ca)

## Variables

const char * | tls_errors []
const char * | cert_errors []

## Detailed Description

TLS implementation with OpenSSL.

## Macro Definition Documentation

## STROPHE_ERR_func_error_string

#define STROPHE_ERR_func_error_string | ( |  | e | ) |

Value:
ERR_func_error_string(e)

## STROPHE_SSL_get1_peer_certificate

#define STROPHE_SSL_get1_peer_certificate | ( |  | s | ) |

Value:
SSL_get_peer_certificate(s)

## TLS_ERROR_STR

#define TLS_ERROR_STR | ( |  | error,
|  |  | table )

Value:
_tls_error_str(error, table, ARRAY_SIZE(table))
_tls_error_str
static const char * _tls_error_str(int error, const char **tbl, size_t tbl_size)
Definition tls_openssl.c:1001
ARRAY_SIZE
#define ARRAY_SIZE(arr)
Definition util.h:23

## TLS_ERROR_FIELD

#define TLS_ERROR_FIELD | ( |  | x | ) |

Value:
[x] = #x

## Enumeration Type Documentation

## anonymous enum

anonymous enum

Enumerator
TLS_SHUTDOWN_MAX_RETRIES |
TLS_TIMEOUT_SEC |
TLS_TIMEOUT_USEC |

## Function Documentation

## ASN1_STRING_get0_data()

const unsigned char * ASN1_STRING_get0_data | ( | ASN1_STRING * | asn1 | ) |

static

## SSL_CTX_use_cert_and_key()

int SSL_CTX_use_cert_and_key | ( | SSL_CTX * | ctx,
|  | X509 * | x509,
|  | EVP_PKEY * | privatekey,
|  | STACK_OF(X509) * | chain,
|  | int | override )

static

## GENERAL_NAME_get0_otherName()

int GENERAL_NAME_get0_otherName | ( | const GENERAL_NAME * | gen,
|  | ASN1_OBJECT ** | poid,
|  | ASN1_TYPE ** | pvalue )

static

## _tls_sock_wait()

void _tls_sock_wait | ( | tls_t * | tls,
|  | int | error )

static

## _tls_error_str()

const char * _tls_error_str | ( | int | error,
|  | const char ** | tbl,
|  | size_t | tbl_size )

static

## _tls_set_error()

void _tls_set_error | ( | tls_t * | tls,
|  | int | error )

static

## _tls_log_error()

void _tls_log_error | ( | xmpp_ctx_t * | ctx | ) |

static

## _tls_dump_cert_info()

void _tls_dump_cert_info | ( | tls_t * | tls | ) |

static

## _tls_cert_read()

X509 * _tls_cert_read | ( | xmpp_conn_t * | conn | ) |

static

## _tls_cert_read_p12()

X509 * _tls_cert_read_p12 | ( | xmpp_conn_t * | conn,
|  | EVP_PKEY ** | pkey,
|  | STACK_OF(X509) ** | ca )

static

## _tls_xaddr_nid()

int _tls_xaddr_nid | ( | void |  | ) |

static

## _tls_xmppaddr_to_string()

int _tls_xmppaddr_to_string | ( | GENERAL_NAME * | name,
|  | char ** | res )

static

Convert GENERAL_NAME* to a string.

This checks whether the GENERAL_NAME* that is given has the correct id-on-xmppAddr set and then optionally converts this form ASN.1 to a string/char*.

When res pointer is set to NULL this method doesn't allocate the result but only checks whether it is in the correct format.

Parameters

  name | Pointer to the GENERAL_NAME that shall be converted
  res | Result-pointer (optional, can be NULL)

Returns
  classic Unix style - 0=success, 1=error

## _tls_dnsname_to_string()

int _tls_dnsname_to_string | ( | GENERAL_NAME * | name,
|  | char ** | res )

static

## _tls_conn_get_names()

GENERAL_NAMES * _tls_conn_get_names | ( | xmpp_conn_t * | conn | ) |

static

## _tls_cert_get_names()

GENERAL_NAMES * _tls_cert_get_names | ( | X509 * | client_cert | ) |

static

## tls_initialize()

void tls_initialize | ( | void |  | ) |

## tls_shutdown()

void tls_shutdown | ( | void |  | ) |

## tls_error()

int tls_error | ( | struct conn_interface * | intf | ) |

## tls_id_on_xmppaddr()

char * tls_id_on_xmppaddr | ( | xmpp_conn_t * | conn,
|  | unsigned int | n )

Search through the SubjectAlternativeNames and return the next id-on-xmppAddr element starting from n.

## tls_id_on_xmppaddr_num()

unsigned int tls_id_on_xmppaddr_num | ( | xmpp_conn_t * | conn | ) |

## _convert_ASN1TIME()

int _convert_ASN1TIME | ( | ASN1_TIME * | ansi_time,
|  | char * | buf,
|  | size_t | len )

static

## _asn1_time_to_str()

char * _asn1_time_to_str | ( | const xmpp_ctx_t * | ctx,
|  | ASN1_TIME * | t )

static

## _get_fingerprint()

char * _get_fingerprint | ( | const xmpp_ctx_t * | ctx,
|  | X509 * | err_cert,
|  | xmpp_cert_element_t | el )

static

## _get_alg()

char * _get_alg | ( | const xmpp_ctx_t * | ctx,
|  | X509 * | err_cert,
|  | xmpp_cert_element_t | el )

static

## _x509_to_tlscert()

xmpp_tlscert_t * _x509_to_tlscert | ( | xmpp_ctx_t * | ctx,
|  | X509 * | cert )

static

## _tls_verify()

int _tls_verify | ( | int | preverify_ok,
|  | X509_STORE_CTX * | x509_ctx )

static

## _tls_password_callback()

int _tls_password_callback | ( | char * | buf,
|  | int | size,
|  | int | rwflag,
|  | void * | u )

static

## _try_open_keylogfile()

void _try_open_keylogfile | ( | tls_t * | tls | ) |

static

## tls_new()

tls_t * tls_new | ( | xmpp_conn_t * | conn | ) |

## tls_free()

void tls_free | ( | tls_t * | tls | ) |

## tls_peer_cert()

xmpp_tlscert_t * tls_peer_cert | ( | xmpp_conn_t * | conn | ) |

## tls_set_credentials()

int tls_set_credentials | ( | tls_t * | tls,
|  | const char * | cafilename )

## tls_init_channel_binding()

int tls_init_channel_binding | ( | tls_t * | tls,
|  | const char ** | binding_prefix,
|  | size_t * | binding_prefix_len )

## tls_get_channel_binding_data()

const void * tls_get_channel_binding_data | ( | tls_t * | tls,
|  | size_t * | size )

## tls_start()

int tls_start | ( | tls_t * | tls | ) |

## tls_stop()

int tls_stop | ( | tls_t * | tls | ) |

## tls_is_recoverable()

int tls_is_recoverable | ( | struct conn_interface * | intf,
|  | int | error )

## tls_pending()

int tls_pending | ( | struct conn_interface * | intf | ) |

## tls_read()

int tls_read | ( | struct conn_interface * | intf,
|  | void * | buff,
|  | size_t | len )

## tls_write()

int tls_write | ( | struct conn_interface * | intf,
|  | const void * | buff,
|  | size_t | len )

## tls_clear_pending_write()

int tls_clear_pending_write | ( | struct conn_interface * | intf | ) |

## _tls_cert_read_x509()

X509 * _tls_cert_read_x509 | ( | xmpp_conn_t * | conn | ) |

static

## _tls_parse_p12()

int _tls_parse_p12 | ( | PKCS12 * | p12,
|  | const char * | pass,
|  | EVP_PKEY ** | pkey,
|  | X509 ** | cert,
|  | STACK_OF(X509) ** | ca )

static

## Variable Documentation

## tls_errors

const char* tls_errors[]

Initial value:
= {
TLS_ERROR_FIELD(SSL_ERROR_NONE),
TLS_ERROR_FIELD(SSL_ERROR_SSL),
TLS_ERROR_FIELD(SSL_ERROR_WANT_READ),
TLS_ERROR_FIELD(SSL_ERROR_WANT_WRITE),
TLS_ERROR_FIELD(SSL_ERROR_WANT_X509_LOOKUP),
TLS_ERROR_FIELD(SSL_ERROR_SYSCALL),
TLS_ERROR_FIELD(SSL_ERROR_ZERO_RETURN),
TLS_ERROR_FIELD(SSL_ERROR_WANT_CONNECT),
TLS_ERROR_FIELD(SSL_ERROR_WANT_ACCEPT),
}
TLS_ERROR_FIELD
#define TLS_ERROR_FIELD(x)
Definition tls_openssl.c:141

## cert_errors

const char* cert_errors[]