]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/sendmail/src/tls.h
Merge commit '850ef5ae11d69ea3381bd310f564f025fc8caea3'
[FreeBSD/FreeBSD.git] / contrib / sendmail / src / tls.h
1 /*
2  * Copyright (c) 2015, 2020-2023 Proofpoint, Inc. and its suppliers.
3  *      All rights reserved.
4  *
5  * By using this file, you agree to the terms and conditions set
6  * forth in the LICENSE file which can be found at the top level of
7  * the sendmail distribution.
8  */
9
10 #ifndef _TLS_H
11 # define _TLS_H 1
12
13 #if STARTTLS
14 # include <openssl/ssl.h>
15 # if !TLS_NO_RSA
16 #  if _FFR_FIPSMODE
17 #   define RSA_KEYLENGTH        1024
18 #  else
19 #   define RSA_KEYLENGTH        512
20 #  endif
21 # endif /* !TLS_NO_RSA */
22
23 # if (OPENSSL_VERSION_NUMBER >= 0x10100000L && OPENSSL_VERSION_NUMBER < 0x20000000L) || OPENSSL_VERSION_NUMBER >= 0x30000000L
24 #  define TLS_version_num OpenSSL_version_num
25 # else
26 #  define TLS_version_num SSLeay
27 # endif
28
29 #ifndef MTA_HAVE_TLSv1_3
30 /*
31 **  HACK: if openssl can disable TLSv1_3 then "assume" it supports all
32 **   related functions!
33 */
34 # ifdef SSL_OP_NO_TLSv1_3
35 #  define MTA_HAVE_TLSv1_3 1
36 # endif
37 #endif
38
39 #ifdef _DEFINE
40 # define EXTERN
41 #else
42 # define EXTERN extern
43 #endif
44
45 #if _FFR_TLS_EC && !defined(TLS_EC)
46 # define TLS_EC _FFR_TLS_EC
47 #endif
48
49 #if DANE
50
51 # ifndef HAVE_SSL_CTX_dane_enable
52 #  if (OPENSSL_VERSION_NUMBER >= 0x10101000L && OPENSSL_VERSION_NUMBER < 0x20000000L) || OPENSSL_VERSION_NUMBER >= 0x30000000L
53 #   define HAVE_SSL_CTX_dane_enable 1
54 #  endif
55 # endif
56
57 extern int ssl_dane_enable __P((dane_vrfy_ctx_P, SSL *));
58 # define SM_NOTDONE 1
59 # define SM_FULL 2
60
61 extern int gettlsa __P((char *, char *, STAB **, unsigned long, unsigned int, unsigned int));
62 # ifndef MAX_TLSA_RR
63 #  if HAVE_SSL_CTX_dane_enable
64 #   define MAX_TLSA_RR  64
65 #  else
66 #   define MAX_TLSA_RR  16
67 #  endif
68 # endif
69
70 # define DANE_VRFY_NONE 0       /* no DANE */
71 /* # define DANE_VRFY_NO        1       * no TLSAs */
72 # define DANE_VRFY_FAIL 2       /* TLSA check failed */
73 # define DANE_VRFY_OK   3       /* TLSA check was ok */
74 # define DANE_VRFY_TEMP 4       /* TLSA check failed temporarily */
75
76 /* return values for dane_tlsa_chk() */
77 # define TLSA_BOGUS     (-10)
78 # define TLSA_UNSUPP    (-1)
79 /* note: anything >= 0 is ok and refers to the hash algorithm */
80 # define TLSA_IS_SUPPORTED(r)   ((r) >= 0)
81 # define TLSA_IS_VALID(r)       ((r) >= TLSA_UNSUPP)
82
83 struct dane_tlsa_S
84 {
85         time_t           dane_tlsa_exp;
86         int              dane_tlsa_n;
87         int              dane_tlsa_dnsrc;
88         unsigned long    dane_tlsa_flags;
89
90         /*
91         **  Note: all "valid" TLSA RRs are stored,
92         **  not just those which are "supported"
93         */
94
95         unsigned char   *dane_tlsa_rr[MAX_TLSA_RR];
96         int              dane_tlsa_len[MAX_TLSA_RR];
97         char            *dane_tlsa_sni;
98 };
99
100 # define TLSAFLNONE     0x00000000
101 /* Dane Mode */
102 # define TLSAFLALWAYS   0x00000001
103 # define TLSAFLSECURE   0x00000002
104 # define DANEMODE(fl)   ((fl) & 0x3)
105 # define TLSAFLNOEXP    0x00000010      /* do not check expiration */
106
107 # define TLSAFLNEW      0x00000020
108 # define TLSAFLADMX     0x00000100
109 # define TLSAFLADIP     0x00000200      /* changes with each IP lookup! */
110 # define TLSAFLNOTLS    0x00000400      /* starttls() failed */
111 /* treat IPv4 and IPv6 the same - the ad flag should be identical */
112 /* # define TLSAFLADTLSA                * currently unused */
113
114 /* NOTE: "flags" >= TLSAFLTEMP are stored, see TLSA_STORE_FL()! */
115 /* could be used to replace DNSRC */
116 # define TLSAFLTEMP     0x00001000      /* TLSA RR lookup tempfailed */
117 # define TLSAFL2MANY    0x00004000      /* too many TLSA RRs */
118
119 /*
120 **  Do not use this record, and do not look up new TLSA RRs because
121 **  the MX/host lookup was not secure.
122 **  XXX: host->MX lookup info can NOT be stored in dane_tlsa!
123 **  XXX: to determine: interaction with DANE=always
124 */
125
126 /* # define TLSAFLNOADMX        0x00010000 */
127 /* # define TLSAFLNOADTLSA      0x00020000      * TLSA: no AD - for DANE=always? */
128
129 # define TLSAFLTEMPVRFY 0x00008000      /* temporary DANE verification failure */
130 # define TLSAFLNOVRFY   0x00080000      /* do NOT perform DANE verification */
131
132 # define TLSAFLUNS      0x00100000      /* has unsupported TLSA RRs */
133 # define TLSAFLSUP      0x00200000      /* has supported TLSA RRs */
134
135 # define TLSA_SET_FL(dane_tlsa, fl)     (dane_tlsa)->dane_tlsa_flags |= (fl)
136 # define TLSA_CLR_FL(dane_tlsa, fl)     (dane_tlsa)->dane_tlsa_flags &= ~(fl)
137 # define TLSA_IS_FL(dane_tlsa, fl)      (((dane_tlsa)->dane_tlsa_flags & (fl)) != 0)
138
139 /* any TLSA RRs? */
140 # define TLSA_HAS_RRs(dane_tlsa)        TLSA_IS_FL(dane_tlsa, TLSAFLUNS|TLSAFLSUP)
141
142 # define TLSA_STORE_FL(fl)      ((fl) >= TLSAFLTEMP)
143
144 /* values for DANE option and dane_vrfy_chk */
145 # define DANE_NEVER     TLSAFLNONE /* XREF: see sendmail.h: #define Dane */
146 # define DANE_ALWAYS    TLSAFLALWAYS    /* NOT documented, testing... */
147 # define DANE_SECURE    TLSAFLSECURE
148 # define CHK_DANE(dane) (DANEMODE((dane)) != DANE_NEVER)
149 # define VRFY_DANE(dane_vrfy_chk) (0 == ((dane_vrfy_chk) & TLSAFLNOVRFY))
150
151 /* temp fails? others? */
152 # define TLSA_RR_TEMPFAIL(dane_tlsa) (((dane_tlsa) != NULL) && (dane_tlsa)->dane_tlsa_dnsrc == TRY_AGAIN)
153
154 # define ONLYUNSUPTLSARR ", status=all TLSA RRs are unsupported"
155 #endif /* DANE */
156
157 /*
158 **  TLS
159 */
160
161 /* what to do in the TLS initialization */
162 #define TLS_I_NONE      0x00000000      /* no requirements... */
163 #define TLS_I_CERT_EX   0x00000001      /* cert must exist */
164 #define TLS_I_CERT_UNR  0x00000002      /* cert must be g/o unreadable */
165 #define TLS_I_KEY_EX    0x00000004      /* key must exist */
166 #define TLS_I_KEY_UNR   0x00000008      /* key must be g/o unreadable */
167 #define TLS_I_CERTP_EX  0x00000010      /* CA cert path must exist */
168 #define TLS_I_CERTP_UNR 0x00000020      /* CA cert path must be g/o unreadable */
169 #define TLS_I_CERTF_EX  0x00000040      /* CA cert file must exist */
170 #define TLS_I_CERTF_UNR 0x00000080      /* CA cert file must be g/o unreadable */
171 #define TLS_I_RSA_TMP   0x00000100      /* RSA TMP must be generated */
172 #define TLS_I_USE_KEY   0x00000200      /* private key must usable */
173 #define TLS_I_USE_CERT  0x00000400      /* certificate must be usable */
174 /*
175 not "read" anywhere
176 #define TLS_I_VRFY_PATH 0x00000800      * load verify path must succeed *
177 */
178 #define TLS_I_VRFY_LOC  0x00001000      /* load verify default must succeed */
179 #define TLS_I_CACHE     0x00002000      /* require cache */
180 #define TLS_I_TRY_DH    0x00004000      /* try DH certificate */
181 #define TLS_I_REQ_DH    0x00008000      /* require DH certificate */
182 #define TLS_I_DHPAR_EX  0x00010000      /* require DH parameters */
183 #define TLS_I_DHPAR_UNR 0x00020000      /* DH param. must be g/o unreadable */
184 #define TLS_I_DH512     0x00040000      /* generate 512bit DH param */
185 #define TLS_I_DH1024    0x00080000      /* generate 1024bit DH param */
186 #define TLS_I_DH2048    0x00100000      /* generate 2048bit DH param */
187 #define TLS_I_NO_VRFY   0x00200000      /* do not require authentication */
188 #define TLS_I_KEY_OUNR  0x00400000      /* Key must be other unreadable */
189 #define TLS_I_CRLF_EX   0x00800000      /* CRL file must exist */
190 #define TLS_I_CRLF_UNR  0x01000000      /* CRL file must be g/o unreadable */
191 #define TLS_I_DHFIXED   0x02000000      /* use fixed DH param */
192 #define TLS_I_DHAUTO    0x04000000      /* */
193
194 /* require server cert */
195 #define TLS_I_SRV_CERT   (TLS_I_CERT_EX | TLS_I_KEY_EX | \
196                           TLS_I_KEY_UNR | TLS_I_KEY_OUNR | \
197                           TLS_I_CERTP_EX | TLS_I_CERTF_EX | \
198                           TLS_I_USE_KEY | TLS_I_USE_CERT | TLS_I_CACHE)
199
200 /* server requirements */
201 #define TLS_I_SRV       (TLS_I_SRV_CERT | TLS_I_RSA_TMP | /*TLS_I_VRFY_PATH|*/ \
202                          TLS_I_VRFY_LOC | TLS_I_TRY_DH | TLS_I_CACHE)
203
204 /* client requirements */
205 #define TLS_I_CLT       (TLS_I_KEY_UNR | TLS_I_KEY_OUNR)
206
207 #define TLS_AUTH_OK     0
208 #define TLS_AUTH_NO     1
209 #define TLS_AUTH_TEMP   2
210 #define TLS_AUTH_FAIL   (-1)
211
212 # ifndef TLS_VRFY_PER_CTX
213 #  define TLS_VRFY_PER_CTX 1
214 # endif
215
216 #define SM_SSL_FREE(ssl)                        \
217         do {                                    \
218                 if (ssl != NULL)                \
219                 {                               \
220                         SSL_free(ssl);          \
221                         ssl = NULL;             \
222                 }                               \
223         } while (0)
224
225 /* functions */
226 extern int      endtls __P((SSL **, const char *));
227 extern int      get_tls_se_features __P((ENVELOPE *, SSL *, tlsi_ctx_T *, bool));
228 extern int      init_tls_library __P((bool _fipsmode));
229 extern bool     inittls __P((SSL_CTX **, unsigned long, unsigned long, bool, char *, char *, char *, char *, char *));
230 extern bool     initclttls __P((bool));
231 extern bool     initsrvtls __P((bool));
232 extern bool     load_certkey __P((SSL *, bool, char *, char *));
233 /* extern bool  load_crlpath __P((SSL_CTX *, bool , char *)); */
234 extern void     setclttls __P((bool));
235 extern int      tls_get_info __P((SSL *, bool, char *, MACROS_T *, bool));
236 extern void     tlslogerr __P((int, int, const char *));
237 extern void     tls_set_verify __P((SSL_CTX *, SSL *, bool));
238 # if DANE
239 extern int dane_tlsa_chk __P((const unsigned char *, int, const char *, bool));
240 extern int dane_tlsa_clr __P((dane_tlsa_P));
241 extern int dane_tlsa_free __P((dane_tlsa_P));
242 # endif
243
244 EXTERN char     *CACertPath;    /* path to CA certificates (dir. with hashes) */
245 EXTERN char     *CACertFile;    /* file with CA certificate */
246 #if _FFR_CLIENTCA
247 EXTERN char     *CltCACertPath; /* path to CA certificates (dir. with hashes) */
248 EXTERN char     *CltCACertFile; /* file with CA certificate */
249 #endif
250 EXTERN char     *CltCertFile;   /* file with client certificate */
251 EXTERN char     *CltKeyFile;    /* file with client private key */
252 EXTERN char     *CipherList;    /* list of ciphers */
253 #if MTA_HAVE_TLSv1_3
254 EXTERN char     *CipherSuites;  /* cipher suites */
255 #endif
256 EXTERN char     *CertFingerprintAlgorithm;      /* name of fingerprint alg */
257 EXTERN const EVP_MD     *EVP_digest;    /* digest for cert fp */
258 EXTERN char     *DHParams;      /* file with DH parameters */
259 EXTERN char     *RandFile;      /* source of random data */
260 EXTERN char     *SrvCertFile;   /* file with server certificate */
261 EXTERN char     *SrvKeyFile;    /* file with server private key */
262 EXTERN char     *CRLFile;       /* file CRLs */
263 EXTERN char     *CRLPath;       /* path to CRLs (dir. with hashes) */
264 EXTERN unsigned long    TLS_Srv_Opts;   /* TLS server options */
265 EXTERN unsigned long    Srv_SSL_Options, Clt_SSL_Options; /* SSL options */
266 EXTERN bool     TLSFallbacktoClear;
267
268 EXTERN char     *SSLEngine;
269 EXTERN char     *SSLEnginePath;
270 EXTERN bool     SSLEngineprefork;
271
272 # if USE_OPENSSL_ENGINE
273 #define TLS_set_engine(id, prefork) SSL_set_engine(id)
274 # else
275 #  if !defined(OPENSSL_NO_ENGINE)
276 int TLS_set_engine __P((const char *, bool));
277 #  else
278 #define TLS_set_engine(id, prefork)     1
279 #  endif
280 # endif
281
282 extern int      set_tls_rd_tmo __P((int));
283 extern int data2hex __P((unsigned char *, int, unsigned char *, int));
284 # if DANE
285 extern int pubkey_fp __P((X509 *, const char*, unsigned char **));
286 extern dane_tlsa_P dane_get_tlsa __P((dane_vrfy_ctx_P));
287 # endif
288
289 #else /* STARTTLS */
290 # define set_tls_rd_tmo(rd_tmo) 0
291 #endif /* STARTTLS */
292 #undef EXTERN
293 #endif /* ! _TLS_H */