xref: /dflybsd-src/crypto/libressl/tls/tls_internal.h (revision 961e30ea7dc61d1112b778ea4981eac68129fb86)
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