1*de0e0e4dSAntonio Huete Jimenez /* $OpenBSD: tls_internal.h,v 1.80 2022/03/24 15:56:34 tb Exp $ */ 2f5b1c8a1SJohn Marino /* 3f5b1c8a1SJohn Marino * Copyright (c) 2014 Jeremie Courreges-Anglas <jca@openbsd.org> 4f5b1c8a1SJohn Marino * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> 5f5b1c8a1SJohn Marino * 6f5b1c8a1SJohn Marino * Permission to use, copy, modify, and distribute this software for any 7f5b1c8a1SJohn Marino * purpose with or without fee is hereby granted, provided that the above 8f5b1c8a1SJohn Marino * copyright notice and this permission notice appear in all copies. 9f5b1c8a1SJohn Marino * 10f5b1c8a1SJohn Marino * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11f5b1c8a1SJohn Marino * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12f5b1c8a1SJohn Marino * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13f5b1c8a1SJohn Marino * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14f5b1c8a1SJohn Marino * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15f5b1c8a1SJohn Marino * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16f5b1c8a1SJohn Marino * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17f5b1c8a1SJohn Marino */ 18f5b1c8a1SJohn Marino 19f5b1c8a1SJohn Marino #ifndef HEADER_TLS_INTERNAL_H 20f5b1c8a1SJohn Marino #define HEADER_TLS_INTERNAL_H 21f5b1c8a1SJohn Marino 2272c33676SMaxim Ag #include <pthread.h> 2372c33676SMaxim Ag 24f5b1c8a1SJohn Marino #include <arpa/inet.h> 25f5b1c8a1SJohn Marino #include <netinet/in.h> 26f5b1c8a1SJohn Marino 27f5b1c8a1SJohn Marino #include <openssl/ssl.h> 28f5b1c8a1SJohn Marino 2972c33676SMaxim Ag __BEGIN_HIDDEN_DECLS 30f5b1c8a1SJohn Marino 31cca6fc52SDaniel Fojt #ifndef TLS_DEFAULT_CA_FILE 32cca6fc52SDaniel Fojt #define TLS_DEFAULT_CA_FILE "/etc/ssl/cert.pem" 33cca6fc52SDaniel Fojt #endif 34cca6fc52SDaniel Fojt 35cca6fc52SDaniel Fojt #define TLS_CIPHERS_DEFAULT "TLSv1.3:TLSv1.2+AEAD+ECDHE:TLSv1.2+AEAD+DHE" 36f5b1c8a1SJohn Marino #define TLS_CIPHERS_COMPAT "HIGH:!aNULL" 37f5b1c8a1SJohn Marino #define TLS_CIPHERS_LEGACY "HIGH:MEDIUM:!aNULL" 38f5b1c8a1SJohn Marino #define TLS_CIPHERS_ALL "ALL:!aNULL:!eNULL" 39f5b1c8a1SJohn Marino 4072c33676SMaxim Ag #define TLS_ECDHE_CURVES "X25519,P-256,P-384" 4172c33676SMaxim Ag 42f5b1c8a1SJohn Marino union tls_addr { 43f5b1c8a1SJohn Marino struct in_addr ip4; 44f5b1c8a1SJohn Marino struct in6_addr ip6; 45f5b1c8a1SJohn Marino }; 46f5b1c8a1SJohn Marino 47f5b1c8a1SJohn Marino struct tls_error { 48f5b1c8a1SJohn Marino char *msg; 49f5b1c8a1SJohn Marino int num; 5072c33676SMaxim Ag int tls; 51f5b1c8a1SJohn Marino }; 52f5b1c8a1SJohn Marino 53f5b1c8a1SJohn Marino struct tls_keypair { 54f5b1c8a1SJohn Marino struct tls_keypair *next; 55f5b1c8a1SJohn Marino 56f5b1c8a1SJohn Marino char *cert_mem; 57f5b1c8a1SJohn Marino size_t cert_len; 58f5b1c8a1SJohn Marino char *key_mem; 59f5b1c8a1SJohn Marino size_t key_len; 6072c33676SMaxim Ag char *ocsp_staple; 6172c33676SMaxim Ag size_t ocsp_staple_len; 6272c33676SMaxim Ag char *pubkey_hash; 6372c33676SMaxim Ag }; 6472c33676SMaxim Ag 6572c33676SMaxim Ag #define TLS_MIN_SESSION_TIMEOUT (4) 6672c33676SMaxim Ag #define TLS_MAX_SESSION_TIMEOUT (24 * 60 * 60) 6772c33676SMaxim Ag 6872c33676SMaxim Ag #define TLS_NUM_TICKETS 4 6972c33676SMaxim Ag #define TLS_TICKET_NAME_SIZE 16 7072c33676SMaxim Ag #define TLS_TICKET_AES_SIZE 32 7172c33676SMaxim Ag #define TLS_TICKET_HMAC_SIZE 16 7272c33676SMaxim Ag 7372c33676SMaxim Ag struct tls_ticket_key { 7472c33676SMaxim Ag /* The key_name must be 16 bytes according to -lssl */ 7572c33676SMaxim Ag unsigned char key_name[TLS_TICKET_NAME_SIZE]; 7672c33676SMaxim Ag unsigned char aes_key[TLS_TICKET_AES_SIZE]; 7772c33676SMaxim Ag unsigned char hmac_key[TLS_TICKET_HMAC_SIZE]; 7872c33676SMaxim Ag time_t time; 79f5b1c8a1SJohn Marino }; 80f5b1c8a1SJohn Marino 81*de0e0e4dSAntonio Huete Jimenez typedef int (*tls_sign_cb)(void *_cb_arg, const char *_pubkey_hash, 82*de0e0e4dSAntonio Huete Jimenez const uint8_t *_input, size_t _input_len, int _padding_type, 83*de0e0e4dSAntonio Huete Jimenez uint8_t **_out_signature, size_t *_out_signature_len); 84*de0e0e4dSAntonio Huete Jimenez 85f5b1c8a1SJohn Marino struct tls_config { 86f5b1c8a1SJohn Marino struct tls_error error; 87f5b1c8a1SJohn Marino 8872c33676SMaxim Ag pthread_mutex_t mutex; 8972c33676SMaxim Ag int refcount; 9072c33676SMaxim Ag 9172c33676SMaxim Ag char *alpn; 9272c33676SMaxim Ag size_t alpn_len; 93f5b1c8a1SJohn Marino const char *ca_path; 94f5b1c8a1SJohn Marino char *ca_mem; 95f5b1c8a1SJohn Marino size_t ca_len; 96f5b1c8a1SJohn Marino const char *ciphers; 97f5b1c8a1SJohn Marino int ciphers_server; 9872c33676SMaxim Ag char *crl_mem; 9972c33676SMaxim Ag size_t crl_len; 100f5b1c8a1SJohn Marino int dheparams; 10172c33676SMaxim Ag int *ecdhecurves; 10272c33676SMaxim Ag size_t ecdhecurves_len; 103f5b1c8a1SJohn Marino struct tls_keypair *keypair; 10472c33676SMaxim Ag int ocsp_require_stapling; 105f5b1c8a1SJohn Marino uint32_t protocols; 10672c33676SMaxim Ag unsigned char session_id[TLS_MAX_SESSION_ID_LENGTH]; 10772c33676SMaxim Ag int session_fd; 10872c33676SMaxim Ag int session_lifetime; 10972c33676SMaxim Ag struct tls_ticket_key ticket_keys[TLS_NUM_TICKETS]; 11072c33676SMaxim Ag uint32_t ticket_keyrev; 11172c33676SMaxim Ag int ticket_autorekey; 112f5b1c8a1SJohn Marino int verify_cert; 113f5b1c8a1SJohn Marino int verify_client; 114f5b1c8a1SJohn Marino int verify_depth; 115f5b1c8a1SJohn Marino int verify_name; 116f5b1c8a1SJohn Marino int verify_time; 11772c33676SMaxim Ag int skip_private_key_check; 118*de0e0e4dSAntonio Huete Jimenez int use_fake_private_key; 119*de0e0e4dSAntonio Huete Jimenez tls_sign_cb sign_cb; 120*de0e0e4dSAntonio Huete Jimenez void *sign_cb_arg; 121f5b1c8a1SJohn Marino }; 122f5b1c8a1SJohn Marino 123f5b1c8a1SJohn Marino struct tls_conninfo { 12472c33676SMaxim Ag char *alpn; 12572c33676SMaxim Ag char *cipher; 126cca6fc52SDaniel Fojt int cipher_strength; 12772c33676SMaxim Ag char *servername; 12872c33676SMaxim Ag int session_resumed; 12972c33676SMaxim Ag char *version; 13072c33676SMaxim Ag 13172c33676SMaxim Ag char *hash; 132f5b1c8a1SJohn Marino char *issuer; 133f5b1c8a1SJohn Marino char *subject; 13472c33676SMaxim Ag 13572c33676SMaxim Ag uint8_t *peer_cert; 13672c33676SMaxim Ag size_t peer_cert_len; 13772c33676SMaxim Ag 138f5b1c8a1SJohn Marino time_t notbefore; 139f5b1c8a1SJohn Marino time_t notafter; 140f5b1c8a1SJohn Marino }; 141f5b1c8a1SJohn Marino 142f5b1c8a1SJohn Marino #define TLS_CLIENT (1 << 0) 143f5b1c8a1SJohn Marino #define TLS_SERVER (1 << 1) 144f5b1c8a1SJohn Marino #define TLS_SERVER_CONN (1 << 2) 145f5b1c8a1SJohn Marino 146f5b1c8a1SJohn Marino #define TLS_EOF_NO_CLOSE_NOTIFY (1 << 0) 14772c33676SMaxim Ag #define TLS_CONNECTED (1 << 1) 14872c33676SMaxim Ag #define TLS_HANDSHAKE_COMPLETE (1 << 2) 14972c33676SMaxim Ag #define TLS_SSL_NEEDS_SHUTDOWN (1 << 3) 15072c33676SMaxim Ag 15172c33676SMaxim Ag struct tls_ocsp_result { 15272c33676SMaxim Ag const char *result_msg; 15372c33676SMaxim Ag int response_status; 15472c33676SMaxim Ag int cert_status; 15572c33676SMaxim Ag int crl_reason; 15672c33676SMaxim Ag time_t this_update; 15772c33676SMaxim Ag time_t next_update; 15872c33676SMaxim Ag time_t revocation_time; 15972c33676SMaxim Ag }; 16072c33676SMaxim Ag 16172c33676SMaxim Ag struct tls_ocsp { 16272c33676SMaxim Ag /* responder location */ 16372c33676SMaxim Ag char *ocsp_url; 16472c33676SMaxim Ag 16572c33676SMaxim Ag /* cert data, this struct does not own these */ 16672c33676SMaxim Ag X509 *main_cert; 16772c33676SMaxim Ag STACK_OF(X509) *extra_certs; 16872c33676SMaxim Ag 16972c33676SMaxim Ag struct tls_ocsp_result *ocsp_result; 17072c33676SMaxim Ag }; 17172c33676SMaxim Ag 17272c33676SMaxim Ag struct tls_sni_ctx { 17372c33676SMaxim Ag struct tls_sni_ctx *next; 17472c33676SMaxim Ag 17572c33676SMaxim Ag struct tls_keypair *keypair; 17672c33676SMaxim Ag 17772c33676SMaxim Ag SSL_CTX *ssl_ctx; 17872c33676SMaxim Ag X509 *ssl_cert; 17972c33676SMaxim Ag }; 180f5b1c8a1SJohn Marino 181f5b1c8a1SJohn Marino struct tls { 182f5b1c8a1SJohn Marino struct tls_config *config; 18372c33676SMaxim Ag struct tls_keypair *keypair; 18472c33676SMaxim Ag 185f5b1c8a1SJohn Marino struct tls_error error; 186f5b1c8a1SJohn Marino 187f5b1c8a1SJohn Marino uint32_t flags; 188f5b1c8a1SJohn Marino uint32_t state; 189f5b1c8a1SJohn Marino 190f5b1c8a1SJohn Marino char *servername; 191f5b1c8a1SJohn Marino int socket; 192f5b1c8a1SJohn Marino 193f5b1c8a1SJohn Marino SSL *ssl_conn; 194f5b1c8a1SJohn Marino SSL_CTX *ssl_ctx; 19572c33676SMaxim Ag 19672c33676SMaxim Ag struct tls_sni_ctx *sni_ctx; 19772c33676SMaxim Ag 198f5b1c8a1SJohn Marino X509 *ssl_peer_cert; 19972c33676SMaxim Ag STACK_OF(X509) *ssl_peer_chain; 20072c33676SMaxim Ag 201f5b1c8a1SJohn Marino struct tls_conninfo *conninfo; 20272c33676SMaxim Ag 20372c33676SMaxim Ag struct tls_ocsp *ocsp; 20472c33676SMaxim Ag 20572c33676SMaxim Ag tls_read_cb read_cb; 20672c33676SMaxim Ag tls_write_cb write_cb; 20772c33676SMaxim Ag void *cb_arg; 208f5b1c8a1SJohn Marino }; 209f5b1c8a1SJohn Marino 21072c33676SMaxim Ag int tls_set_mem(char **_dest, size_t *_destlen, const void *_src, 21172c33676SMaxim Ag size_t _srclen); 21272c33676SMaxim Ag int tls_set_string(const char **_dest, const char *_src); 21372c33676SMaxim Ag 21472c33676SMaxim Ag struct tls_keypair *tls_keypair_new(void); 21572c33676SMaxim Ag void tls_keypair_clear_key(struct tls_keypair *_keypair); 21672c33676SMaxim Ag void tls_keypair_free(struct tls_keypair *_keypair); 21772c33676SMaxim Ag int tls_keypair_set_cert_file(struct tls_keypair *_keypair, 21872c33676SMaxim Ag struct tls_error *_error, const char *_cert_file); 21972c33676SMaxim Ag int tls_keypair_set_cert_mem(struct tls_keypair *_keypair, 22072c33676SMaxim Ag struct tls_error *_error, const uint8_t *_cert, size_t _len); 22172c33676SMaxim Ag int tls_keypair_set_key_file(struct tls_keypair *_keypair, 22272c33676SMaxim Ag struct tls_error *_error, const char *_key_file); 22372c33676SMaxim Ag int tls_keypair_set_key_mem(struct tls_keypair *_keypair, 22472c33676SMaxim Ag struct tls_error *_error, const uint8_t *_key, size_t _len); 22572c33676SMaxim Ag int tls_keypair_set_ocsp_staple_file(struct tls_keypair *_keypair, 22672c33676SMaxim Ag struct tls_error *_error, const char *_ocsp_file); 22772c33676SMaxim Ag int tls_keypair_set_ocsp_staple_mem(struct tls_keypair *_keypair, 22872c33676SMaxim Ag struct tls_error *_error, const uint8_t *_staple, size_t _len); 22972c33676SMaxim Ag int tls_keypair_load_cert(struct tls_keypair *_keypair, 23072c33676SMaxim Ag struct tls_error *_error, X509 **_cert); 23172c33676SMaxim Ag 23272c33676SMaxim Ag struct tls_sni_ctx *tls_sni_ctx_new(void); 23372c33676SMaxim Ag void tls_sni_ctx_free(struct tls_sni_ctx *sni_ctx); 23472c33676SMaxim Ag 23572c33676SMaxim Ag struct tls_config *tls_config_new_internal(void); 23672c33676SMaxim Ag 237f5b1c8a1SJohn Marino struct tls *tls_new(void); 238f5b1c8a1SJohn Marino struct tls *tls_server_conn(struct tls *ctx); 239f5b1c8a1SJohn Marino 24072c33676SMaxim Ag int tls_check_name(struct tls *ctx, X509 *cert, const char *servername, 24172c33676SMaxim Ag int *match); 242f5b1c8a1SJohn Marino int tls_configure_server(struct tls *ctx); 24372c33676SMaxim Ag 24472c33676SMaxim Ag int tls_configure_ssl(struct tls *ctx, SSL_CTX *ssl_ctx); 24572c33676SMaxim Ag int tls_configure_ssl_keypair(struct tls *ctx, SSL_CTX *ssl_ctx, 24672c33676SMaxim Ag struct tls_keypair *keypair, int required); 24772c33676SMaxim Ag int tls_configure_ssl_verify(struct tls *ctx, SSL_CTX *ssl_ctx, int verify); 24872c33676SMaxim Ag 249f5b1c8a1SJohn Marino int tls_handshake_client(struct tls *ctx); 250f5b1c8a1SJohn Marino int tls_handshake_server(struct tls *ctx); 25172c33676SMaxim Ag 25272c33676SMaxim Ag int tls_config_load_file(struct tls_error *error, const char *filetype, 25372c33676SMaxim Ag const char *filename, char **buf, size_t *len); 25472c33676SMaxim Ag int tls_config_ticket_autorekey(struct tls_config *config); 255f5b1c8a1SJohn Marino int tls_host_port(const char *hostport, char **host, char **port); 256f5b1c8a1SJohn Marino 25772c33676SMaxim Ag int tls_set_cbs(struct tls *ctx, 25872c33676SMaxim Ag tls_read_cb read_cb, tls_write_cb write_cb, void *cb_arg); 25972c33676SMaxim Ag 26072c33676SMaxim Ag void tls_error_clear(struct tls_error *error); 261f5b1c8a1SJohn Marino int tls_error_set(struct tls_error *error, const char *fmt, ...) 262f5b1c8a1SJohn Marino __attribute__((__format__ (printf, 2, 3))) 263f5b1c8a1SJohn Marino __attribute__((__nonnull__ (2))); 264f5b1c8a1SJohn Marino int tls_error_setx(struct tls_error *error, const char *fmt, ...) 265f5b1c8a1SJohn Marino __attribute__((__format__ (printf, 2, 3))) 266f5b1c8a1SJohn Marino __attribute__((__nonnull__ (2))); 267f5b1c8a1SJohn Marino int tls_config_set_error(struct tls_config *cfg, const char *fmt, ...) 268f5b1c8a1SJohn Marino __attribute__((__format__ (printf, 2, 3))) 269f5b1c8a1SJohn Marino __attribute__((__nonnull__ (2))); 270f5b1c8a1SJohn Marino int tls_config_set_errorx(struct tls_config *cfg, const char *fmt, ...) 271f5b1c8a1SJohn Marino __attribute__((__format__ (printf, 2, 3))) 272f5b1c8a1SJohn Marino __attribute__((__nonnull__ (2))); 273f5b1c8a1SJohn Marino int tls_set_error(struct tls *ctx, const char *fmt, ...) 274f5b1c8a1SJohn Marino __attribute__((__format__ (printf, 2, 3))) 275f5b1c8a1SJohn Marino __attribute__((__nonnull__ (2))); 276f5b1c8a1SJohn Marino int tls_set_errorx(struct tls *ctx, const char *fmt, ...) 277f5b1c8a1SJohn Marino __attribute__((__format__ (printf, 2, 3))) 278f5b1c8a1SJohn Marino __attribute__((__nonnull__ (2))); 27972c33676SMaxim Ag int tls_set_ssl_errorx(struct tls *ctx, const char *fmt, ...) 28072c33676SMaxim Ag __attribute__((__format__ (printf, 2, 3))) 28172c33676SMaxim Ag __attribute__((__nonnull__ (2))); 282f5b1c8a1SJohn Marino 283f5b1c8a1SJohn Marino int tls_ssl_error(struct tls *ctx, SSL *ssl_conn, int ssl_ret, 284f5b1c8a1SJohn Marino const char *prefix); 285f5b1c8a1SJohn Marino 28672c33676SMaxim Ag int tls_conninfo_populate(struct tls *ctx); 28772c33676SMaxim Ag void tls_conninfo_free(struct tls_conninfo *conninfo); 288f5b1c8a1SJohn Marino 28972c33676SMaxim Ag int tls_ocsp_verify_cb(SSL *ssl, void *arg); 29072c33676SMaxim Ag int tls_ocsp_stapling_cb(SSL *ssl, void *arg); 29172c33676SMaxim Ag void tls_ocsp_free(struct tls_ocsp *ctx); 29272c33676SMaxim Ag struct tls_ocsp *tls_ocsp_setup_from_peer(struct tls *ctx); 29372c33676SMaxim Ag int tls_hex_string(const unsigned char *_in, size_t _inlen, char **_out, 29472c33676SMaxim Ag size_t *_outlen); 29572c33676SMaxim Ag int tls_cert_hash(X509 *_cert, char **_hash); 29672c33676SMaxim Ag int tls_cert_pubkey_hash(X509 *_cert, char **_hash); 29772c33676SMaxim Ag 29872c33676SMaxim Ag int tls_password_cb(char *_buf, int _size, int _rwflag, void *_u); 29972c33676SMaxim Ag 300*de0e0e4dSAntonio Huete Jimenez RSA_METHOD *tls_signer_rsa_method(void); 301*de0e0e4dSAntonio Huete Jimenez ECDSA_METHOD *tls_signer_ecdsa_method(void); 302*de0e0e4dSAntonio Huete Jimenez 303*de0e0e4dSAntonio Huete Jimenez #define TLS_PADDING_NONE 0 304*de0e0e4dSAntonio Huete Jimenez #define TLS_PADDING_RSA_PKCS1 1 305*de0e0e4dSAntonio Huete Jimenez #define TLS_PADDING_RSA_X9_31 2 306*de0e0e4dSAntonio Huete Jimenez 307*de0e0e4dSAntonio Huete Jimenez int tls_config_set_sign_cb(struct tls_config *_config, tls_sign_cb _cb, 308*de0e0e4dSAntonio Huete Jimenez void *_cb_arg); 309*de0e0e4dSAntonio Huete Jimenez 310*de0e0e4dSAntonio Huete Jimenez struct tls_signer* tls_signer_new(void); 311*de0e0e4dSAntonio Huete Jimenez void tls_signer_free(struct tls_signer * _signer); 312*de0e0e4dSAntonio Huete Jimenez const char *tls_signer_error(struct tls_signer * _signer); 313*de0e0e4dSAntonio Huete Jimenez int tls_signer_add_keypair_file(struct tls_signer *_signer, 314*de0e0e4dSAntonio Huete Jimenez const char *_cert_file, const char *_key_file); 315*de0e0e4dSAntonio Huete Jimenez int tls_signer_add_keypair_mem(struct tls_signer *_signer, const uint8_t *_cert, 316*de0e0e4dSAntonio Huete Jimenez size_t _cert_len, const uint8_t *_key, size_t _key_len); 317*de0e0e4dSAntonio Huete Jimenez int tls_signer_sign(struct tls_signer *_signer, const char *_pubkey_hash, 318*de0e0e4dSAntonio Huete Jimenez const uint8_t *_input, size_t _input_len, int _padding_type, 319*de0e0e4dSAntonio Huete Jimenez uint8_t **_out_signature, size_t *_out_signature_len); 320*de0e0e4dSAntonio Huete Jimenez 32172c33676SMaxim Ag __END_HIDDEN_DECLS 32272c33676SMaxim Ag 32372c33676SMaxim Ag /* XXX this function is not fully hidden so relayd can use it */ 32472c33676SMaxim Ag void tls_config_skip_private_key_check(struct tls_config *config); 325*de0e0e4dSAntonio Huete Jimenez void tls_config_use_fake_private_key(struct tls_config *config); 326f5b1c8a1SJohn Marino 327f5b1c8a1SJohn Marino #endif /* HEADER_TLS_INTERNAL_H */ 328