xref: /openbsd-src/lib/libtls/tls_internal.h (revision 26433cb13cc3308103fce1cf0c8fcad1280ba684)
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