1 #ifndef _TLS_H_INCLUDED_
2 #define _TLS_H_INCLUDED_
41 #define TLS_LEV_INVALID -2
42 #define TLS_LEV_NOTFOUND -1
43 #define TLS_LEV_NONE 0
45 #define TLS_LEV_ENCRYPT 2
46 #define TLS_LEV_FPRINT 3
47 #define TLS_LEV_HALF_DANE 4
48 #define TLS_LEV_DANE 5
49 #define TLS_LEV_DANE_ONLY 6
50 #define TLS_LEV_VERIFY 7
51 #define TLS_LEV_SECURE 8
53 #define TLS_REQUIRED(l) ((l) > TLS_LEV_MAY)
54 #define TLS_MUST_MATCH(l) ((l) > TLS_LEV_ENCRYPT)
55 #define TLS_MUST_TRUST(l) ((l) >= TLS_LEV_HALF_DANE)
56 #define TLS_MUST_PKIX(l) ((l) >= TLS_LEV_VERIFY)
57 #define TLS_OPPORTUNISTIC(l) ((l) == TLS_LEV_MAY || (l) == TLS_LEV_DANE)
58 #define TLS_DANE_BASED(l) \
59 ((l) >= TLS_LEV_HALF_DANE && (l) <= TLS_LEV_DANE_ONLY)
60 #define TLS_NEVER_SECURED(l) ((l) == TLS_LEV_HALF_DANE)
70 #include <openssl/lhash.h>
71 #include <openssl/bn.h>
72 #include <openssl/err.h>
73 #include <openssl/pem.h>
74 #include <openssl/x509.h>
75 #include <openssl/x509v3.h>
76 #include <openssl/rand.h>
77 #include <openssl/crypto.h>
78 #include <openssl/opensslv.h>
79 #include <openssl/ssl.h>
82 #define x509_stack_t STACK_OF(X509)
83 #define general_name_stack_t STACK_OF(GENERAL_NAME)
84 #define ssl_cipher_stack_t STACK_OF(SSL_CIPHER)
85 #define ssl_comp_stack_t STACK_OF(SSL_COMP)
87 #if (OPENSSL_VERSION_NUMBER < 0x00090700f)
88 #error "need OpenSSL version 0.9.7 or later"
92 #if OPENSSL_VERSION_NUMBER < 0x10100000L
93 #define OpenSSL_version_num SSLeay
94 #define OpenSSL_version SSLeay_version
95 #define OPENSSL_VERSION SSLEAY_VERSION
96 #define X509_up_ref(x) \
97 CRYPTO_add(&((x)->references), 1, CRYPTO_LOCK_X509)
98 #define EVP_PKEY_up_ref(k) \
99 CRYPTO_add(&((k)->references), 1, CRYPTO_LOCK_EVP_PKEY)
100 #define X509_STORE_CTX_get0_cert(ctx) ((ctx)->cert)
101 #define X509_STORE_CTX_get0_untrusted(ctx) ((ctx)->untrusted)
102 #define X509_STORE_CTX_set0_untrusted X509_STORE_CTX_set_chain
103 #define X509_STORE_CTX_set0_trusted_stack X509_STORE_CTX_trusted_stack
104 #define ASN1_STRING_get0_data ASN1_STRING_data
105 #define X509_getm_notBefore X509_get_notBefore
106 #define X509_getm_notAfter X509_get_notAfter
107 #define TLS_method SSLv23_method
108 #define TLS_client_method SSLv23_client_method
109 #define TLS_server_method SSLv23_server_method
113 #if OPENSSL_VERSION_NUMBER >= 0x0090707fL
114 #define SSL_CIPHER_const const
116 #define SSL_CIPHER_const
120 #if OPENSSL_VERSION_NUMBER >= 0x0090801fL
121 #define D2I_const const
141 #define TLS_MGR_SCACHE_SMTPD "smtpd"
142 #define TLS_MGR_SCACHE_SMTP "smtp"
143 #define TLS_MGR_SCACHE_LMTP "lmtp"
148 #define TLS_DANE_TA 0
149 #define TLS_DANE_EE 1
151 #define TLS_DANE_CERT 0
152 #define TLS_DANE_PKEY 1
154 #define TLS_DANE_FLAG_NORRS (1<<0)
155 #define TLS_DANE_FLAG_EMPTY (1<<1)
156 #define TLS_DANE_FLAG_ERROR (1<<2)
158 #define tls_dane_unusable(dane) ((dane)->flags & TLS_DANE_FLAG_EMPTY)
159 #define tls_dane_notfound(dane) ((dane)->flags & TLS_DANE_FLAG_NORRS)
161 #define TLS_DANE_CACHE_TTL_MIN 1
162 #define TLS_DANE_CACHE_TTL_MAX 100
168 typedef struct TLS_TLSA {
172 struct TLS_TLSA *next;
178 typedef struct TLS_CERTS {
180 struct TLS_CERTS *next;
186 typedef struct TLS_PKEYS {
188 struct TLS_PKEYS *next;
191 typedef struct TLS_DANE {
202 #define TLS_DANE_HASTA(d) ((d) ? (d)->ta : 0)
203 #define TLS_DANE_HASEE(d) ((d) ? (d)->ee : 0)
208 extern int tls_dane_avail(
void);
209 extern void tls_dane_flush(
void);
210 extern void tls_dane_verbose(
int);
211 extern TLS_DANE *tls_dane_alloc(
void);
212 extern void tls_dane_add_ee_digests(TLS_DANE *,
const char *,
const char *,
214 extern void tls_dane_free(TLS_DANE *);
215 extern TLS_DANE *tls_dane_resolve(
unsigned,
const char *,
DNS_RR *,
int);
216 extern int tls_dane_load_trustfile(TLS_DANE *,
const char *);
224 #define CCERT_BUFSIZ 256
230 char *peer_cert_fprint;
231 char *peer_pkey_fprint;
233 const char *protocol;
234 const char *cipher_name;
250 const TLS_DANE *dane;
255 x509_stack_t *untrusted;
256 x509_stack_t *trusted;
263 #define TLS_CERT_FLAG_PRESENT (1<<0)
264 #define TLS_CERT_FLAG_ALTNAME (1<<1)
265 #define TLS_CERT_FLAG_TRUSTED (1<<2)
266 #define TLS_CERT_FLAG_MATCHED (1<<3)
267 #define TLS_CERT_FLAG_SECURED (1<<4)
269 #define TLS_CERT_IS_PRESENT(c) ((c) && ((c)->peer_status&TLS_CERT_FLAG_PRESENT))
270 #define TLS_CERT_IS_ALTNAME(c) ((c) && ((c)->peer_status&TLS_CERT_FLAG_ALTNAME))
271 #define TLS_CERT_IS_TRUSTED(c) ((c) && ((c)->peer_status&TLS_CERT_FLAG_TRUSTED))
272 #define TLS_CERT_IS_MATCHED(c) ((c) && ((c)->peer_status&TLS_CERT_FLAG_MATCHED))
273 #define TLS_CERT_IS_SECURED(c) ((c) && ((c)->peer_status&TLS_CERT_FLAG_SECURED))
278 typedef struct TLS_APPL_STATE TLS_APPL_STATE;
285 extern int tls_log_mask(
const char *,
const char *);
290 #define TLS_LOG_NONE (1<<0)
291 #define TLS_LOG_SUMMARY (1<<1)
292 #define TLS_LOG_UNTRUSTED (1<<2)
293 #define TLS_LOG_PEERCERT (1<<3)
294 #define TLS_LOG_CERTMATCH (1<<4)
295 #define TLS_LOG_VERBOSE (1<<5)
296 #define TLS_LOG_CACHE (1<<6)
297 #define TLS_LOG_DEBUG (1<<7)
298 #define TLS_LOG_TLSPKTS (1<<8)
299 #define TLS_LOG_ALLPKTS (1<<9)
304 struct TLS_APPL_STATE {
308 char *cipher_exclusions;
317 extern void tls_update_app_logmask(TLS_APPL_STATE *,
int);
318 extern void tls_free_app_context(TLS_APPL_STATE *);
323 extern void tls_param_init(
void);
328 #define TLS_PROTOCOL_INVALID (~0)
331 #define TLS_PROTOCOL_SSLv2 (1<<0)
333 #define SSL_TXT_SSLV2 "SSLv2"
334 #define TLS_PROTOCOL_SSLv2 0
335 #undef SSL_OP_NO_SSLv2
336 #define SSL_OP_NO_SSLv2 0L
340 #define TLS_PROTOCOL_SSLv3 (1<<1)
342 #define SSL_TXT_SSLV3 "SSLv3"
343 #define TLS_PROTOCOL_SSLv3 0
344 #undef SSL_OP_NO_SSLv3
345 #define SSL_OP_NO_SSLv3 0L
349 #define TLS_PROTOCOL_TLSv1 (1<<2)
351 #define SSL_TXT_TLSV1 "TLSv1"
352 #define TLS_PROTOCOL_TLSv1 0
353 #undef SSL_OP_NO_TLSv1
354 #define SSL_OP_NO_TLSv1 0L
357 #ifdef SSL_TXT_TLSV1_1
358 #define TLS_PROTOCOL_TLSv1_1 (1<<3)
360 #define SSL_TXT_TLSV1_1 "TLSv1.1"
361 #define TLS_PROTOCOL_TLSv1_1 0
362 #undef SSL_OP_NO_TLSv1_1
363 #define SSL_OP_NO_TLSv1_1 0L
366 #ifdef SSL_TXT_TLSV1_2
367 #define TLS_PROTOCOL_TLSv1_2 (1<<4)
369 #define SSL_TXT_TLSV1_2 "TLSv1.2"
370 #define TLS_PROTOCOL_TLSv1_2 0
371 #undef SSL_OP_NO_TLSv1_2
372 #define SSL_OP_NO_TLSv1_2 0L
375 #ifdef SSL_TXT_TLSV1_3
376 #define TLS_PROTOCOL_TLSv1_3 (1<<5)
378 #define SSL_TXT_TLSV1_3 "TLSv1.3"
379 #define TLS_PROTOCOL_TLSv1_3 0
380 #undef SSL_OP_NO_TLSv1_3
381 #define SSL_OP_NO_TLSv1_3 0L
384 #define TLS_KNOWN_PROTOCOLS \
385 ( TLS_PROTOCOL_SSLv2 | TLS_PROTOCOL_SSLv3 | TLS_PROTOCOL_TLSv1 \
386 | TLS_PROTOCOL_TLSv1_1 | TLS_PROTOCOL_TLSv1_2 )
387 #define TLS_SSL_OP_PROTOMASK(m) \
388 ((((m) & TLS_PROTOCOL_SSLv2) ? SSL_OP_NO_SSLv2 : 0L) \
389 | (((m) & TLS_PROTOCOL_SSLv3) ? SSL_OP_NO_SSLv3 : 0L) \
390 | (((m) & TLS_PROTOCOL_TLSv1) ? SSL_OP_NO_TLSv1 : 0L) \
391 | (((m) & TLS_PROTOCOL_TLSv1_1) ? SSL_OP_NO_TLSv1_1 : 0L) \
392 | (((m) & TLS_PROTOCOL_TLSv1_2) ? SSL_OP_NO_TLSv1_2 : 0L) \
393 | (((m) & TLS_PROTOCOL_TLSv1_3) ? SSL_OP_NO_TLSv1_3 : 0L))
399 #define TLS_SSL_OP_MANAGED_BITS \
400 (SSL_OP_CIPHER_SERVER_PREFERENCE | TLS_SSL_OP_PROTOMASK(~0))
402 extern int tls_protocol_mask(
const char *);
407 #define TLS_CIPHER_NONE 0
408 #define TLS_CIPHER_NULL 1
409 #define TLS_CIPHER_EXPORT 2
410 #define TLS_CIPHER_LOW 3
411 #define TLS_CIPHER_MEDIUM 4
412 #define TLS_CIPHER_HIGH 5
414 extern const NAME_CODE tls_cipher_grade_table[];
416 #define tls_cipher_grade(str) \
417 name_code(tls_cipher_grade_table, NAME_CODE_FLAG_NONE, (str))
418 #define str_tls_cipher_grade(gr) \
419 str_name_code(tls_cipher_grade_table, (gr))
424 extern const char *tls_set_ciphers(TLS_APPL_STATE *,
const char *,
425 const char *,
const char *);
433 const char *log_param;
434 const char *log_level;
436 const char *cache_type;
437 const char *cert_file;
438 const char *key_file;
439 const char *dcert_file;
440 const char *dkey_file;
441 const char *eccert_file;
442 const char *eckey_file;
446 } TLS_CLIENT_INIT_PROPS;
456 const char *serverid;
458 const char *protocols;
459 const char *cipher_grade;
460 const char *cipher_exclusions;
461 const ARGV *matchargv;
463 const TLS_DANE *dane;
464 } TLS_CLIENT_START_PROPS;
466 extern TLS_APPL_STATE *tls_client_init(
const TLS_CLIENT_INIT_PROPS *);
467 extern TLS_SESS_STATE *tls_client_start(
const TLS_CLIENT_START_PROPS *);
469 #define tls_client_stop(ctx, stream, timeout, failure, TLScontext) \
470 tls_session_stop(ctx, (stream), (timeout), (failure), (TLScontext))
472 #define TLS_CLIENT_INIT(props, a1, a2, a3, a4, a5, a6, a7, a8, a9, \
473 a10, a11, a12, a13) \
474 tls_client_init((((props)->a1), ((props)->a2), ((props)->a3), \
475 ((props)->a4), ((props)->a5), ((props)->a6), ((props)->a7), \
476 ((props)->a8), ((props)->a9), ((props)->a10), ((props)->a11), \
477 ((props)->a12), ((props)->a13), (props)))
479 #define TLS_CLIENT_START(props, a1, a2, a3, a4, a5, a6, a7, a8, a9, \
480 a10, a11, a12, a13, a14, a15) \
481 tls_client_start((((props)->a1), ((props)->a2), ((props)->a3), \
482 ((props)->a4), ((props)->a5), ((props)->a6), ((props)->a7), \
483 ((props)->a8), ((props)->a9), ((props)->a10), ((props)->a11), \
484 ((props)->a12), ((props)->a13), ((props)->a14), ((props)->a15), (props)))
490 const char *log_param;
491 const char *log_level;
493 const char *cache_type;
495 const char *cert_file;
496 const char *key_file;
497 const char *dcert_file;
498 const char *dkey_file;
499 const char *eccert_file;
500 const char *eckey_file;
503 const char *protocols;
504 const char *eecdh_grade;
505 const char *dh1024_param_file;
506 const char *dh512_param_file;
509 } TLS_SERVER_INIT_PROPS;
517 const char *serverid;
519 const char *cipher_grade;
520 const char *cipher_exclusions;
522 } TLS_SERVER_START_PROPS;
524 extern TLS_APPL_STATE *tls_server_init(
const TLS_SERVER_INIT_PROPS *);
525 extern TLS_SESS_STATE *tls_server_start(
const TLS_SERVER_START_PROPS *props);
526 extern TLS_SESS_STATE *tls_server_post_accept(TLS_SESS_STATE *);
528 #define tls_server_stop(ctx, stream, timeout, failure, TLScontext) \
529 tls_session_stop(ctx, (stream), (timeout), (failure), (TLScontext))
531 #define TLS_SERVER_INIT(props, a1, a2, a3, a4, a5, a6, a7, a8, a9, \
532 a10, a11, a12, a13, a14, a15, a16, a17, a18, a19) \
533 tls_server_init((((props)->a1), ((props)->a2), ((props)->a3), \
534 ((props)->a4), ((props)->a5), ((props)->a6), ((props)->a7), \
535 ((props)->a8), ((props)->a9), ((props)->a10), ((props)->a11), \
536 ((props)->a12), ((props)->a13), ((props)->a14), ((props)->a15), \
537 ((props)->a16), ((props)->a17), ((props)->a18), ((props)->a19), (props)))
539 #define TLS_SERVER_START(props, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) \
540 tls_server_start((((props)->a1), ((props)->a2), ((props)->a3), \
541 ((props)->a4), ((props)->a5), ((props)->a6), ((props)->a7), \
542 ((props)->a8), ((props)->a9), ((props)->a10), (props)))
547 extern void tls_session_stop(TLS_APPL_STATE *,
VSTREAM *,
int,
int, TLS_SESS_STATE *);
552 extern const char *tls_compile_version(
void);
553 extern const char *tls_run_version(
void);
554 extern const char **tls_pkey_algorithms(
void);
560 extern VSTRING *tls_session_passivate(SSL_SESSION *);
561 extern SSL_SESSION *tls_session_activate(
const char *,
int);
566 extern void tls_stream_start(
VSTREAM *, TLS_SESS_STATE *);
567 extern void tls_stream_stop(
VSTREAM *);
575 extern int tls_bio(
int,
int, TLS_SESS_STATE *,
577 int (*) (SSL *,
void *,
int),
578 int (*) (SSL *,
const void *,
int),
581 #define tls_bio_connect(fd, timeout, context) \
582 tls_bio((fd), (timeout), (context), SSL_connect, \
584 #define tls_bio_accept(fd, timeout, context) \
585 tls_bio((fd), (timeout), (context), SSL_accept, \
587 #define tls_bio_shutdown(fd, timeout, context) \
588 tls_bio((fd), (timeout), (context), SSL_shutdown, \
590 #define tls_bio_read(fd, buf, len, timeout, context) \
591 tls_bio((fd), (timeout), (context), NULL, \
592 SSL_read, NULL, (buf), (len))
593 #define tls_bio_write(fd, buf, len, timeout, context) \
594 tls_bio((fd), (timeout), (context), NULL, \
595 NULL, SSL_write, (buf), (len))
600 extern void tls_set_dh_from_file(
const char *,
int);
601 extern DH *tls_tmp_dh_cb(SSL *,
int,
int);
602 extern void tls_set_eecdh_curve(SSL_CTX *,
const char *);
603 extern void tls_auto_eecdh_curves(SSL_CTX *);
608 extern RSA *tls_tmp_rsa_cb(SSL *,
int,
int);
613 extern char *tls_peer_CN(X509 *,
const TLS_SESS_STATE *);
614 extern char *tls_issuer_CN(X509 *,
const TLS_SESS_STATE *);
615 extern const char *tls_dns_name(
const GENERAL_NAME *,
const TLS_SESS_STATE *);
616 extern int tls_verify_certificate_callback(
int, X509_STORE_CTX *);
617 extern void tls_log_verify_error(TLS_SESS_STATE *);
622 extern int tls_dane_match(TLS_SESS_STATE *,
int, X509 *,
int);
623 extern void tls_dane_set_callback(SSL_CTX *, TLS_SESS_STATE *);
628 extern char *tls_digest_encode(
const unsigned char *,
int);
629 extern char *tls_data_fprint(
const char *,
int,
const char *);
630 extern char *tls_cert_fprint(X509 *,
const char *);
631 extern char *tls_pkey_fprint(X509 *,
const char *);
632 extern char *tls_serverid_digest(
const TLS_CLIENT_START_PROPS *,
long,
638 extern int tls_set_ca_certificate_info(SSL_CTX *,
const char *,
const char *);
639 extern int tls_set_my_certificate_key_info(SSL_CTX *,
640 const char *,
const char *,
641 const char *,
const char *,
642 const char *,
const char *);
647 extern int TLScontext_index;
649 extern TLS_APPL_STATE *tls_alloc_app_context(SSL_CTX *,
int);
650 extern TLS_SESS_STATE *tls_alloc_sess_context(
int,
const char *);
651 extern void tls_free_context(TLS_SESS_STATE *);
652 extern void tls_check_version(
void);
653 extern long tls_bug_bits(
void);
654 extern void tls_print_errors(
void);
655 extern void tls_info_callback(
const SSL *,
int,
int);
656 extern long tls_bio_dump_cb(BIO *,
int,
const char *,
int,
long,
long);
657 extern int tls_validate_digest(
const char *);
662 extern void tls_int_seed(
void);
663 extern int tls_ext_seed(
int);
const char * str_tls_level(int)
int tls_level_lookup(const char *)