1*26433cb1Stb /* $OpenBSD: tls_internal.h,v 1.86 2024/12/10 08:40:30 tb Exp $ */ 2b600beedSjsing /* 3b600beedSjsing * Copyright (c) 2014 Jeremie Courreges-Anglas <jca@openbsd.org> 4b600beedSjsing * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> 5b600beedSjsing * 6b600beedSjsing * Permission to use, copy, modify, and distribute this software for any 7b600beedSjsing * purpose with or without fee is hereby granted, provided that the above 8b600beedSjsing * copyright notice and this permission notice appear in all copies. 9b600beedSjsing * 10b600beedSjsing * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11b600beedSjsing * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12b600beedSjsing * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13b600beedSjsing * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14b600beedSjsing * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15b600beedSjsing * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16b600beedSjsing * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17b600beedSjsing */ 18b600beedSjsing 19b600beedSjsing #ifndef HEADER_TLS_INTERNAL_H 20b600beedSjsing #define HEADER_TLS_INTERNAL_H 21b600beedSjsing 22bebb943aSjsing #include <pthread.h> 23bebb943aSjsing 24fc5c813dSjsing #include <arpa/inet.h> 25fc5c813dSjsing #include <netinet/in.h> 26fc5c813dSjsing 27b600beedSjsing #include <openssl/ssl.h> 28b600beedSjsing 29635a8441Sguenther __BEGIN_HIDDEN_DECLS 30635a8441Sguenther 3115dff5baSbeck #ifndef TLS_DEFAULT_CA_FILE 3215dff5baSbeck #define TLS_DEFAULT_CA_FILE "/etc/ssl/cert.pem" 3315dff5baSbeck #endif 3415dff5baSbeck 35b10e6c9eSbeck #define TLS_CIPHERS_DEFAULT "TLSv1.3:TLSv1.2+AEAD+ECDHE:TLSv1.2+AEAD+DHE" 36c52398cfSjsing #define TLS_CIPHERS_COMPAT "HIGH:!aNULL" 37c52398cfSjsing #define TLS_CIPHERS_LEGACY "HIGH:MEDIUM:!aNULL" 38c52398cfSjsing #define TLS_CIPHERS_ALL "ALL:!aNULL:!eNULL" 3985f64a89Sjsing 404896de1eSjsing #define TLS_ECDHE_CURVES "X25519,P-256,P-384" 414896de1eSjsing 42fc5c813dSjsing union tls_addr { 43fc5c813dSjsing struct in_addr ip4; 44fc5c813dSjsing struct in6_addr ip6; 45fc5c813dSjsing }; 46fc5c813dSjsing 47a88e9e95Sjsing struct tls_error { 48a88e9e95Sjsing char *msg; 497a756d37Sjoshua int code; 50deae75adSjoshua int errno_value; 519e219fcdSjsing int tls; 52a88e9e95Sjsing }; 53a88e9e95Sjsing 541fe9fea1Sjsing struct tls_keypair { 551fe9fea1Sjsing struct tls_keypair *next; 561fe9fea1Sjsing 571fe9fea1Sjsing char *cert_mem; 581fe9fea1Sjsing size_t cert_len; 591fe9fea1Sjsing char *key_mem; 601fe9fea1Sjsing size_t key_len; 619d519145Sbeck char *ocsp_staple; 629d519145Sbeck size_t ocsp_staple_len; 636db33eddSclaudio char *pubkey_hash; 641fe9fea1Sjsing }; 651fe9fea1Sjsing 6647c43cfeSclaudio #define TLS_MIN_SESSION_TIMEOUT (4) 6747c43cfeSclaudio #define TLS_MAX_SESSION_TIMEOUT (24 * 60 * 60) 6847c43cfeSclaudio 6947c43cfeSclaudio #define TLS_NUM_TICKETS 4 7047c43cfeSclaudio #define TLS_TICKET_NAME_SIZE 16 7147c43cfeSclaudio #define TLS_TICKET_AES_SIZE 32 7247c43cfeSclaudio #define TLS_TICKET_HMAC_SIZE 16 7347c43cfeSclaudio 7447c43cfeSclaudio struct tls_ticket_key { 7547c43cfeSclaudio /* The key_name must be 16 bytes according to -lssl */ 7647c43cfeSclaudio unsigned char key_name[TLS_TICKET_NAME_SIZE]; 7747c43cfeSclaudio unsigned char aes_key[TLS_TICKET_AES_SIZE]; 7847c43cfeSclaudio unsigned char hmac_key[TLS_TICKET_HMAC_SIZE]; 7947c43cfeSclaudio time_t time; 8047c43cfeSclaudio }; 8147c43cfeSclaudio 82fd9951f7Stb typedef int (*tls_sign_cb)(void *_cb_arg, const char *_pubkey_hash, 83fd9951f7Stb const uint8_t *_input, size_t _input_len, int _padding_type, 84fd9951f7Stb uint8_t **_out_signature, size_t *_out_signature_len); 85fd9951f7Stb 86b600beedSjsing struct tls_config { 87a88e9e95Sjsing struct tls_error error; 88a88e9e95Sjsing 89bebb943aSjsing pthread_mutex_t mutex; 9088c10dabSjsing int refcount; 9188c10dabSjsing 92183da8c6Sjsing char *alpn; 93183da8c6Sjsing size_t alpn_len; 94b600beedSjsing const char *ca_path; 9599cfb8c5Sreyk char *ca_mem; 9699cfb8c5Sreyk size_t ca_len; 97b600beedSjsing const char *ciphers; 98c57e6ec0Sjsing int ciphers_server; 9980bc881dSjsing char *crl_mem; 10080bc881dSjsing size_t crl_len; 1019e5deb48Sjsing int dheparams; 1024896de1eSjsing int *ecdhecurves; 1034896de1eSjsing size_t ecdhecurves_len; 1041fe9fea1Sjsing struct tls_keypair *keypair; 10569013f12Sbeck int ocsp_require_stapling; 106b600beedSjsing uint32_t protocols; 10747c43cfeSclaudio unsigned char session_id[TLS_MAX_SESSION_ID_LENGTH]; 1080dd084b9Sjsing int session_fd; 10947c43cfeSclaudio int session_lifetime; 11047c43cfeSclaudio struct tls_ticket_key ticket_keys[TLS_NUM_TICKETS]; 11147c43cfeSclaudio uint32_t ticket_keyrev; 11247c43cfeSclaudio int ticket_autorekey; 113b600beedSjsing int verify_cert; 11451f3bd3dSbeck int verify_client; 115b600beedSjsing int verify_depth; 1160ca7b9dfSjsing int verify_name; 117615956a0Sjsing int verify_time; 118c793ca29Sbeck int skip_private_key_check; 11915339a8cSeric int use_fake_private_key; 1209ecbddc1Seric tls_sign_cb sign_cb; 1219ecbddc1Seric void *sign_cb_arg; 122b600beedSjsing }; 123b600beedSjsing 124ab8f2ec6Sbeck struct tls_conninfo { 125183da8c6Sjsing char *alpn; 1260976903bSjsing char *cipher; 127bbf181b7Sjsing int cipher_strength; 12855272e79Sjsing char *servername; 1290dd084b9Sjsing int session_resumed; 1300976903bSjsing char *version; 1310976903bSjsing 132*26433cb1Stb char *common_name; 1330976903bSjsing char *hash; 134ab8f2ec6Sbeck char *issuer; 135ab8f2ec6Sbeck char *subject; 1360976903bSjsing 137328022f5Sjsing uint8_t *peer_cert; 138c67861f7Sbeck size_t peer_cert_len; 139c67861f7Sbeck 140f00a4e85Sbeck time_t notbefore; 141f00a4e85Sbeck time_t notafter; 142ab8f2ec6Sbeck }; 143ab8f2ec6Sbeck 144b600beedSjsing #define TLS_CLIENT (1 << 0) 145b600beedSjsing #define TLS_SERVER (1 << 1) 146b600beedSjsing #define TLS_SERVER_CONN (1 << 2) 14793310cfaSjsing 14839389942Sjsing #define TLS_EOF_NO_CLOSE_NOTIFY (1 << 0) 149d5f88726Sjsing #define TLS_CONNECTED (1 << 1) 150d5f88726Sjsing #define TLS_HANDSHAKE_COMPLETE (1 << 2) 151d5f88726Sjsing #define TLS_SSL_NEEDS_SHUTDOWN (1 << 3) 152b600beedSjsing 1532dc6b4e4Sbeck struct tls_ocsp_result { 1542dc6b4e4Sbeck const char *result_msg; 1552dc6b4e4Sbeck int response_status; 1562dc6b4e4Sbeck int cert_status; 1572dc6b4e4Sbeck int crl_reason; 1582dc6b4e4Sbeck time_t this_update; 1592dc6b4e4Sbeck time_t next_update; 1602dc6b4e4Sbeck time_t revocation_time; 1612dc6b4e4Sbeck }; 1622dc6b4e4Sbeck 1636ffc3042Sbeck struct tls_ocsp { 1642dc6b4e4Sbeck /* responder location */ 1652dc6b4e4Sbeck char *ocsp_url; 1662dc6b4e4Sbeck 1672dc6b4e4Sbeck /* cert data, this struct does not own these */ 1682dc6b4e4Sbeck X509 *main_cert; 1692dc6b4e4Sbeck STACK_OF(X509) *extra_certs; 1702dc6b4e4Sbeck 1712dc6b4e4Sbeck struct tls_ocsp_result *ocsp_result; 1722dc6b4e4Sbeck }; 1732dc6b4e4Sbeck 174f89edc01Sjsing struct tls_sni_ctx { 175f89edc01Sjsing struct tls_sni_ctx *next; 176f89edc01Sjsing 1779ee433b9Sjsing struct tls_keypair *keypair; 1789ee433b9Sjsing 179f89edc01Sjsing SSL_CTX *ssl_ctx; 180f89edc01Sjsing X509 *ssl_cert; 181f89edc01Sjsing }; 182f89edc01Sjsing 183b600beedSjsing struct tls { 184b600beedSjsing struct tls_config *config; 1859ee433b9Sjsing struct tls_keypair *keypair; 1869ee433b9Sjsing 187a88e9e95Sjsing struct tls_error error; 188a88e9e95Sjsing 18993310cfaSjsing uint32_t flags; 19093310cfaSjsing uint32_t state; 191b600beedSjsing 192e2b71c11Sjsing char *servername; 193b600beedSjsing int socket; 194b600beedSjsing 195b600beedSjsing SSL *ssl_conn; 196b600beedSjsing SSL_CTX *ssl_ctx; 197f89edc01Sjsing 198f89edc01Sjsing struct tls_sni_ctx *sni_ctx; 199f89edc01Sjsing 200e98425b4Sjsing X509 *ssl_peer_cert; 201c67861f7Sbeck STACK_OF(X509) *ssl_peer_chain; 202183da8c6Sjsing 203ab8f2ec6Sbeck struct tls_conninfo *conninfo; 204ed19021fSbcook 2056ffc3042Sbeck struct tls_ocsp *ocsp; 2062dc6b4e4Sbeck 207ed19021fSbcook tls_read_cb read_cb; 208ed19021fSbcook tls_write_cb write_cb; 209ed19021fSbcook void *cb_arg; 210b600beedSjsing }; 211b600beedSjsing 212bb4cb1b0Sjsing int tls_set_mem(char **_dest, size_t *_destlen, const void *_src, 213bb4cb1b0Sjsing size_t _srclen); 214bb4cb1b0Sjsing int tls_set_string(const char **_dest, const char *_src); 215bb4cb1b0Sjsing 216bb4cb1b0Sjsing struct tls_keypair *tls_keypair_new(void); 217b3064b8aSjsing void tls_keypair_clear_key(struct tls_keypair *_keypair); 2182974e8f1Sjsing void tls_keypair_free(struct tls_keypair *_keypair); 219bb4cb1b0Sjsing int tls_keypair_set_cert_file(struct tls_keypair *_keypair, 220bb4cb1b0Sjsing struct tls_error *_error, const char *_cert_file); 2212974e8f1Sjsing int tls_keypair_set_cert_mem(struct tls_keypair *_keypair, 2222974e8f1Sjsing struct tls_error *_error, const uint8_t *_cert, size_t _len); 223bb4cb1b0Sjsing int tls_keypair_set_key_file(struct tls_keypair *_keypair, 224bb4cb1b0Sjsing struct tls_error *_error, const char *_key_file); 2252974e8f1Sjsing int tls_keypair_set_key_mem(struct tls_keypair *_keypair, 2262974e8f1Sjsing struct tls_error *_error, const uint8_t *_key, size_t _len); 227bb4cb1b0Sjsing int tls_keypair_set_ocsp_staple_file(struct tls_keypair *_keypair, 228bb4cb1b0Sjsing struct tls_error *_error, const char *_ocsp_file); 229bb4cb1b0Sjsing int tls_keypair_set_ocsp_staple_mem(struct tls_keypair *_keypair, 2302974e8f1Sjsing struct tls_error *_error, const uint8_t *_staple, size_t _len); 231bb4cb1b0Sjsing int tls_keypair_load_cert(struct tls_keypair *_keypair, 232bb4cb1b0Sjsing struct tls_error *_error, X509 **_cert); 233bb4cb1b0Sjsing 234f89edc01Sjsing struct tls_sni_ctx *tls_sni_ctx_new(void); 235f89edc01Sjsing void tls_sni_ctx_free(struct tls_sni_ctx *sni_ctx); 236f89edc01Sjsing 237b9573a74Sjsing struct tls_config *tls_config_new_internal(void); 238b9573a74Sjsing 239b600beedSjsing struct tls *tls_new(void); 240b600beedSjsing struct tls *tls_server_conn(struct tls *ctx); 241b600beedSjsing 242*26433cb1Stb int tls_get_common_name(struct tls *_ctx, X509 *_cert, const char *_in_name, 243*26433cb1Stb char **_out_common_name); 2445f3c5205Sjsing int tls_check_name(struct tls *ctx, X509 *cert, const char *servername, 2455f3c5205Sjsing int *match); 246b600beedSjsing int tls_configure_server(struct tls *ctx); 247b7f318e7Sjsing 248b7f318e7Sjsing int tls_configure_ssl(struct tls *ctx, SSL_CTX *ssl_ctx); 249b7f318e7Sjsing int tls_configure_ssl_keypair(struct tls *ctx, SSL_CTX *ssl_ctx, 250b7f318e7Sjsing struct tls_keypair *keypair, int required); 251b7f318e7Sjsing int tls_configure_ssl_verify(struct tls *ctx, SSL_CTX *ssl_ctx, int verify); 25203ce4948Sjsing 253e2b71c11Sjsing int tls_handshake_client(struct tls *ctx); 254e2b71c11Sjsing int tls_handshake_server(struct tls *ctx); 25503ce4948Sjsing 25603ce4948Sjsing int tls_config_load_file(struct tls_error *error, const char *filetype, 25703ce4948Sjsing const char *filename, char **buf, size_t *len); 25847c43cfeSclaudio int tls_config_ticket_autorekey(struct tls_config *config); 259b600beedSjsing int tls_host_port(const char *hostport, char **host, char **port); 260a88e9e95Sjsing 261ed19021fSbcook int tls_set_cbs(struct tls *ctx, 262ed19021fSbcook tls_read_cb read_cb, tls_write_cb write_cb, void *cb_arg); 263ed19021fSbcook 2649e219fcdSjsing void tls_error_clear(struct tls_error *error); 2657a756d37Sjoshua int tls_error_set(struct tls_error *error, int code, const char *fmt, ...) 2667a756d37Sjoshua __attribute__((__format__ (printf, 3, 4))) 2677a756d37Sjoshua __attribute__((__nonnull__ (3))); 2687a756d37Sjoshua int tls_error_setx(struct tls_error *error, int code, const char *fmt, ...) 2697a756d37Sjoshua __attribute__((__format__ (printf, 3, 4))) 2707a756d37Sjoshua __attribute__((__nonnull__ (3))); 2717a756d37Sjoshua int tls_config_set_error(struct tls_config *cfg, int code, const char *fmt, ...) 2727a756d37Sjoshua __attribute__((__format__ (printf, 3, 4))) 2737a756d37Sjoshua __attribute__((__nonnull__ (3))); 2747a756d37Sjoshua int tls_config_set_errorx(struct tls_config *cfg, int code, const char *fmt, ...) 2757a756d37Sjoshua __attribute__((__format__ (printf, 3, 4))) 2767a756d37Sjoshua __attribute__((__nonnull__ (3))); 2777a756d37Sjoshua int tls_set_error(struct tls *ctx, int code, const char *fmt, ...) 2787a756d37Sjoshua __attribute__((__format__ (printf, 3, 4))) 2797a756d37Sjoshua __attribute__((__nonnull__ (3))); 2807a756d37Sjoshua int tls_set_errorx(struct tls *ctx, int code, const char *fmt, ...) 2817a756d37Sjoshua __attribute__((__format__ (printf, 3, 4))) 2827a756d37Sjoshua __attribute__((__nonnull__ (3))); 2837a756d37Sjoshua int tls_set_ssl_errorx(struct tls *ctx, int code, const char *fmt, ...) 2847a756d37Sjoshua __attribute__((__format__ (printf, 3, 4))) 2857a756d37Sjoshua __attribute__((__nonnull__ (3))); 286a88e9e95Sjsing 2875251ab8eSjsing int tls_ssl_error(struct tls *ctx, SSL *ssl_conn, int ssl_ret, 2885251ab8eSjsing const char *prefix); 289a88e9e95Sjsing 290dc559dc0Sjsing int tls_conninfo_populate(struct tls *ctx); 291dc559dc0Sjsing void tls_conninfo_free(struct tls_conninfo *conninfo); 292b600beedSjsing 2932dc6b4e4Sbeck int tls_ocsp_verify_cb(SSL *ssl, void *arg); 294668bec95Sbeck int tls_ocsp_stapling_cb(SSL *ssl, void *arg); 2956ffc3042Sbeck void tls_ocsp_free(struct tls_ocsp *ctx); 2966ffc3042Sbeck struct tls_ocsp *tls_ocsp_setup_from_peer(struct tls *ctx); 297c793ca29Sbeck int tls_hex_string(const unsigned char *_in, size_t _inlen, char **_out, 298c793ca29Sbeck size_t *_outlen); 299c793ca29Sbeck int tls_cert_hash(X509 *_cert, char **_hash); 3002974e8f1Sjsing int tls_cert_pubkey_hash(X509 *_cert, char **_hash); 3012dc6b4e4Sbeck 302a192468aSjsing int tls_password_cb(char *_buf, int _size, int _rwflag, void *_u); 303a192468aSjsing 3049ecbddc1Seric RSA_METHOD *tls_signer_rsa_method(void); 3059dba47cfSop EC_KEY_METHOD *tls_signer_ecdsa_method(void); 3069ecbddc1Seric 307fd9951f7Stb #define TLS_PADDING_NONE 0 308fd9951f7Stb #define TLS_PADDING_RSA_PKCS1 1 309fd9951f7Stb 310fd9951f7Stb int tls_config_set_sign_cb(struct tls_config *_config, tls_sign_cb _cb, 311fd9951f7Stb void *_cb_arg); 312fd9951f7Stb 313fd9951f7Stb struct tls_signer* tls_signer_new(void); 314fd9951f7Stb void tls_signer_free(struct tls_signer * _signer); 315fd9951f7Stb const char *tls_signer_error(struct tls_signer * _signer); 316fd9951f7Stb int tls_signer_add_keypair_file(struct tls_signer *_signer, 317fd9951f7Stb const char *_cert_file, const char *_key_file); 318fd9951f7Stb int tls_signer_add_keypair_mem(struct tls_signer *_signer, const uint8_t *_cert, 319fd9951f7Stb size_t _cert_len, const uint8_t *_key, size_t _key_len); 320fd9951f7Stb int tls_signer_sign(struct tls_signer *_signer, const char *_pubkey_hash, 321fd9951f7Stb const uint8_t *_input, size_t _input_len, int _padding_type, 322fd9951f7Stb uint8_t **_out_signature, size_t *_out_signature_len); 323fd9951f7Stb 324635a8441Sguenther __END_HIDDEN_DECLS 325635a8441Sguenther 32625ee42fcSclaudio /* XXX this function is not fully hidden so relayd can use it */ 32725ee42fcSclaudio void tls_config_skip_private_key_check(struct tls_config *config); 32815339a8cSeric void tls_config_use_fake_private_key(struct tls_config *config); 32925ee42fcSclaudio 330b600beedSjsing #endif /* HEADER_TLS_INTERNAL_H */ 331