xref: /freebsd/contrib/sendmail/src/tls.c (revision f126890ac5386406dadf7c4cfa9566cbb56537c5)
1 /*
2  * Copyright (c) 2000-2006, 2008, 2009, 2011, 2013-2016 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 
11 #include <sendmail.h>
12 
13 SM_RCSID("@(#)$Id: tls.c,v 8.127 2013-11-27 02:51:11 gshapiro Exp $")
14 
15 #if STARTTLS
16 # include <openssl/err.h>
17 # include <openssl/bio.h>
18 # include <openssl/pem.h>
19 # ifndef HASURANDOMDEV
20 #  include <openssl/rand.h>
21 # endif
22 # include <openssl/engine.h>
23 # if _FFR_TLS_ALTNAMES
24 #  include <openssl/x509v3.h>
25 # endif
26 # include <tls.h>
27 
28 # if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER <= 0x00907000L
29 #  error "OpenSSL versions <= 0x00907000L are unsupported."
30 # endif
31 
32 # if DANE && OPENSSL_VERSION_NUMBER == 0x30200000L
33 #  error OpenSSL 3.2.0 has a bug related to DANE
34 #  error see https://github.com/openssl/openssl/pull/22821
35 # endif
36 
37 /*
38 **  *SSL version numbers:
39 **  OpenSSL 0.9 - 1.1 (so far), 3.[012]
40 **  LibreSSL 2.0 (0x20000000L - part of "These will never change")
41 */
42 
43 # if (OPENSSL_VERSION_NUMBER >= 0x10100000L && OPENSSL_VERSION_NUMBER < 0x20000000L) || OPENSSL_VERSION_NUMBER >= 0x30000000L || (defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER >= 0x2070000fL)
44 #  define MTA_HAVE_DH_set0_pqg 1
45 #  define MTA_HAVE_DSA_GENERATE_EX	1
46 #  define MTA_HAVE_OPENSSL_init_ssl	1
47 #  define MTA_ASN1_STRING_data ASN1_STRING_get0_data
48 #  include <openssl/bn.h>
49 #  include <openssl/dsa.h>
50 # else
51 #  define X509_STORE_CTX_get0_cert(ctx)	(ctx)->cert
52 #  define MTA_RSA_TMP_CB	1
53 #  define MTA_ASN1_STRING_data ASN1_STRING_data
54 # endif
55 
56 /* Is this ok or use HAVE_SSL_get1_peer_certificate instead? */
57 #if OPENSSL_VERSION_NUMBER >= 0x30000000L
58 # define MTA_SSL_get_peer_certificate SSL_get1_peer_certificate
59 
60 # ifndef HAVE_ERR_get_error_all
61 #  define HAVE_ERR_get_error_all 1
62 # endif
63 
64 /* use SSL_CTX_set_dh_auto()?  which versions provide it? */
65 # define MTA_DH_AUTO	1
66 #else
67 # define MTA_SSL_get_peer_certificate SSL_get_peer_certificate
68 # define MTA_DH_AUTO	0
69 #endif
70 
71 #if HAVE_ERR_get_error_all
72 # define MTA_SSL_ERR_get(f, l, d, fl, fct) ERR_get_error_all(f, l, fct, d, fl)
73 #else /* if HAVE_ERR_get_error_line_data ? */
74 # define MTA_SSL_ERR_get(f, l, d, fl, fct) ERR_get_error_line_data(f, l, d, fl)
75 #endif
76 
77 # if !TLS_NO_RSA && MTA_RSA_TMP_CB
78 static RSA *rsa_tmp = NULL;	/* temporary RSA key */
79 static RSA *tmp_rsa_key __P((SSL *, int, int));
80 # endif
81 static int	tls_verify_cb __P((X509_STORE_CTX *, void *));
82 
83 static int x509_verify_cb __P((int, X509_STORE_CTX *));
84 
85 static void	apps_ssl_info_cb __P((const SSL *, int, int));
86 static bool	tls_ok_f __P((char *, char *, int));
87 static bool	tls_safe_f __P((char *, long, bool));
88 static int	tls_verify_log __P((int, X509_STORE_CTX *, const char *));
89 
90 int TLSsslidx = -1;
91 
92 # if !NO_DH
93 # include <openssl/dh.h>
94 static DH *get_dh512 __P((void));
95 
96 static unsigned char dh512_p[] =
97 {
98 	0xDA,0x58,0x3C,0x16,0xD9,0x85,0x22,0x89,0xD0,0xE4,0xAF,0x75,
99 	0x6F,0x4C,0xCA,0x92,0xDD,0x4B,0xE5,0x33,0xB8,0x04,0xFB,0x0F,
100 	0xED,0x94,0xEF,0x9C,0x8A,0x44,0x03,0xED,0x57,0x46,0x50,0xD3,
101 	0x69,0x99,0xDB,0x29,0xD7,0x76,0x27,0x6B,0xA2,0xD3,0xD4,0x12,
102 	0xE2,0x18,0xF4,0xDD,0x1E,0x08,0x4C,0xF6,0xD8,0x00,0x3E,0x7C,
103 	0x47,0x74,0xE8,0x33
104 };
105 static unsigned char dh512_g[] =
106 {
107 	0x02
108 };
109 
110 static DH *
111 get_dh512()
112 {
113 	DH *dh = NULL;
114 #  if MTA_HAVE_DH_set0_pqg
115 	BIGNUM *dhp_bn, *dhg_bn;
116 #  endif
117 
118 	if ((dh = DH_new()) == NULL)
119 		return NULL;
120 #  if MTA_HAVE_DH_set0_pqg
121 	dhp_bn = BN_bin2bn(dh512_p, sizeof (dh512_p), NULL);
122 	dhg_bn = BN_bin2bn(dh512_g, sizeof (dh512_g), NULL);
123 	if (dhp_bn == NULL || dhg_bn == NULL || !DH_set0_pqg(dh, dhp_bn, NULL, dhg_bn))  {
124 		DH_free(dh);
125 		BN_free(dhp_bn);
126 		BN_free(dhg_bn);
127 		return NULL;
128 	}
129 #  else
130 	dh->p = BN_bin2bn(dh512_p, sizeof(dh512_p), NULL);
131 	dh->g = BN_bin2bn(dh512_g, sizeof(dh512_g), NULL);
132 	if ((dh->p == NULL) || (dh->g == NULL))
133 	{
134 		DH_free(dh);
135 		return NULL;
136 	}
137 #  endif
138 	return dh;
139 }
140 
141 #  if 0
142 
143 This is the data from which the C code has been generated:
144 
145 -----BEGIN DH PARAMETERS-----
146 MIIBCAKCAQEArDcgcLpxEksQHPlolRKCUJ2szKRziseWV9cUSQNZGxoGw7KkROz4
147 HF9QSbg5axyNIG+QbZYtx0jp3l6/GWq1dLOj27yZkgYgaYgFrvKPiZ2jJ5xETQVH
148 UpZwbjRcyjyWkWYJVsx1aF4F/iY4kT0n/+iGEoimI3C9V3KXTJ2S6jIkyJ6M/CrN
149 EtrDynMlUMGlc7S1ouXVOTrtKeqy3S2L9eBLxVI+sChEijGIfELupdVeXihK006p
150 MgnABPDbkTx6OOtYmSZaGQX+OLW2FPmwvcrzgCz9t9cAsuUcBZv1LeHEqZZttyLU
151 oK0jjSXgFyeU4/NfyA+zuNeWzUL6bHmigwIBAg==
152 -----END DH PARAMETERS-----
153 #  endif /* 0 */
154 
155 static DH *
156 get_dh2048()
157 {
158 	static unsigned char dh2048_p[]={
159 		0xAC,0x37,0x20,0x70,0xBA,0x71,0x12,0x4B,0x10,0x1C,0xF9,0x68,
160 		0x95,0x12,0x82,0x50,0x9D,0xAC,0xCC,0xA4,0x73,0x8A,0xC7,0x96,
161 		0x57,0xD7,0x14,0x49,0x03,0x59,0x1B,0x1A,0x06,0xC3,0xB2,0xA4,
162 		0x44,0xEC,0xF8,0x1C,0x5F,0x50,0x49,0xB8,0x39,0x6B,0x1C,0x8D,
163 		0x20,0x6F,0x90,0x6D,0x96,0x2D,0xC7,0x48,0xE9,0xDE,0x5E,0xBF,
164 		0x19,0x6A,0xB5,0x74,0xB3,0xA3,0xDB,0xBC,0x99,0x92,0x06,0x20,
165 		0x69,0x88,0x05,0xAE,0xF2,0x8F,0x89,0x9D,0xA3,0x27,0x9C,0x44,
166 		0x4D,0x05,0x47,0x52,0x96,0x70,0x6E,0x34,0x5C,0xCA,0x3C,0x96,
167 		0x91,0x66,0x09,0x56,0xCC,0x75,0x68,0x5E,0x05,0xFE,0x26,0x38,
168 		0x91,0x3D,0x27,0xFF,0xE8,0x86,0x12,0x88,0xA6,0x23,0x70,0xBD,
169 		0x57,0x72,0x97,0x4C,0x9D,0x92,0xEA,0x32,0x24,0xC8,0x9E,0x8C,
170 		0xFC,0x2A,0xCD,0x12,0xDA,0xC3,0xCA,0x73,0x25,0x50,0xC1,0xA5,
171 		0x73,0xB4,0xB5,0xA2,0xE5,0xD5,0x39,0x3A,0xED,0x29,0xEA,0xB2,
172 		0xDD,0x2D,0x8B,0xF5,0xE0,0x4B,0xC5,0x52,0x3E,0xB0,0x28,0x44,
173 		0x8A,0x31,0x88,0x7C,0x42,0xEE,0xA5,0xD5,0x5E,0x5E,0x28,0x4A,
174 		0xD3,0x4E,0xA9,0x32,0x09,0xC0,0x04,0xF0,0xDB,0x91,0x3C,0x7A,
175 		0x38,0xEB,0x58,0x99,0x26,0x5A,0x19,0x05,0xFE,0x38,0xB5,0xB6,
176 		0x14,0xF9,0xB0,0xBD,0xCA,0xF3,0x80,0x2C,0xFD,0xB7,0xD7,0x00,
177 		0xB2,0xE5,0x1C,0x05,0x9B,0xF5,0x2D,0xE1,0xC4,0xA9,0x96,0x6D,
178 		0xB7,0x22,0xD4,0xA0,0xAD,0x23,0x8D,0x25,0xE0,0x17,0x27,0x94,
179 		0xE3,0xF3,0x5F,0xC8,0x0F,0xB3,0xB8,0xD7,0x96,0xCD,0x42,0xFA,
180 		0x6C,0x79,0xA2,0x83,
181 		};
182 	static unsigned char dh2048_g[]={ 0x02, };
183 	DH *dh;
184 #  if MTA_HAVE_DH_set0_pqg
185 	BIGNUM *dhp_bn, *dhg_bn;
186 #  endif
187 
188 	if ((dh=DH_new()) == NULL)
189 		return(NULL);
190 #  if MTA_HAVE_DH_set0_pqg
191 	dhp_bn = BN_bin2bn(dh2048_p, sizeof (dh2048_p), NULL);
192 	dhg_bn = BN_bin2bn(dh2048_g, sizeof (dh2048_g), NULL);
193 	if (dhp_bn == NULL || dhg_bn == NULL || !DH_set0_pqg(dh, dhp_bn, NULL, dhg_bn))  {
194 		DH_free(dh);
195 		BN_free(dhp_bn);
196 		BN_free(dhg_bn);
197 		return NULL;
198 	}
199 #  else
200 	dh->p=BN_bin2bn(dh2048_p,sizeof(dh2048_p),NULL);
201 	dh->g=BN_bin2bn(dh2048_g,sizeof(dh2048_g),NULL);
202 	if ((dh->p == NULL) || (dh->g == NULL))
203 	{
204 		DH_free(dh);
205 		return(NULL);
206 	}
207 #  endif
208 	return(dh);
209 }
210 # endif /* !NO_DH */
211 
212 /*
213 **  TLS_RAND_INIT -- initialize STARTTLS random generator
214 **
215 **	Parameters:
216 **		randfile -- name of file with random data
217 **		logl -- loglevel
218 **
219 **	Returns:
220 **		success/failure
221 **
222 **	Side Effects:
223 **		initializes PRNG for tls library.
224 */
225 
226 # define MIN_RAND_BYTES	128	/* 1024 bits */
227 
228 # define RF_OK		0	/* randfile OK */
229 # define RF_MISS	1	/* randfile == NULL || *randfile == '\0' */
230 # define RF_UNKNOWN	2	/* unknown prefix for randfile */
231 
232 # define RI_NONE	0	/* no init yet */
233 # define RI_SUCCESS	1	/* init was successful */
234 # define RI_FAIL	2	/* init failed */
235 
236 static bool	tls_rand_init __P((char *, int));
237 
238 static bool
239 tls_rand_init(randfile, logl)
240 	char *randfile;
241 	int logl;
242 {
243 # ifndef HASURANDOMDEV
244 	/* not required if /dev/urandom exists, OpenSSL does it internally */
245 
246 	bool ok;
247 	int randdef;
248 	static int done = RI_NONE;
249 
250 	/*
251 	**  initialize PRNG
252 	*/
253 
254 	/* did we try this before? if yes: return old value */
255 	if (done != RI_NONE)
256 		return done == RI_SUCCESS;
257 
258 	/* set default values */
259 	ok = false;
260 	done = RI_FAIL;
261 	randdef = (SM_IS_EMPTY(randfile)) ? RF_MISS : RF_OK;
262 #  if EGD
263 	if (randdef == RF_OK && sm_strncasecmp(randfile, "egd:", 4) == 0)
264 	{
265 		randfile += 4;
266 		if (RAND_egd(randfile) < 0)
267 		{
268 			sm_syslog(LOG_WARNING, NOQID,
269 				  "STARTTLS: RAND_egd(%s) failed: random number generator not seeded",
270 				   randfile);
271 		}
272 		else
273 			ok = true;
274 	}
275 	else
276 #  endif /* EGD */
277 	/* "else" in #if code above */
278 	if (randdef == RF_OK && sm_strncasecmp(randfile, "file:", 5) == 0)
279 	{
280 		int fd;
281 		long sff;
282 		struct stat st;
283 
284 		randfile += 5;
285 		sff = SFF_SAFEDIRPATH | SFF_NOWLINK
286 		      | SFF_NOGWFILES | SFF_NOWWFILES
287 		      | SFF_NOGRFILES | SFF_NOWRFILES
288 		      | SFF_MUSTOWN | SFF_ROOTOK | SFF_OPENASROOT;
289 		if (DontLockReadFiles)
290 			sff |= SFF_NOLOCK;
291 		if ((fd = safeopen(randfile, O_RDONLY, 0, sff)) >= 0)
292 		{
293 			if (fstat(fd, &st) < 0)
294 			{
295 				if (LogLevel > logl)
296 					sm_syslog(LOG_ERR, NOQID,
297 						  "STARTTLS: can't fstat(%s)",
298 						  randfile);
299 			}
300 			else
301 			{
302 				bool use, problem;
303 
304 				use = true;
305 				problem = false;
306 
307 				/* max. age of file: 10 minutes */
308 				if (st.st_mtime + 600 < curtime())
309 				{
310 					use = bitnset(DBS_INSUFFICIENTENTROPY,
311 						      DontBlameSendmail);
312 					problem = true;
313 					if (LogLevel > logl)
314 						sm_syslog(LOG_ERR, NOQID,
315 							  "STARTTLS: RandFile %s too old: %s",
316 							  randfile,
317 							  use ? "unsafe" :
318 								"unusable");
319 				}
320 				if (use && st.st_size < MIN_RAND_BYTES)
321 				{
322 					use = bitnset(DBS_INSUFFICIENTENTROPY,
323 						      DontBlameSendmail);
324 					problem = true;
325 					if (LogLevel > logl)
326 						sm_syslog(LOG_ERR, NOQID,
327 							  "STARTTLS: size(%s) < %d: %s",
328 							  randfile,
329 							  MIN_RAND_BYTES,
330 							  use ? "unsafe" :
331 								"unusable");
332 				}
333 				if (use)
334 					ok = RAND_load_file(randfile, -1) >=
335 					     MIN_RAND_BYTES;
336 				if (use && !ok)
337 				{
338 					if (LogLevel > logl)
339 						sm_syslog(LOG_WARNING, NOQID,
340 							  "STARTTLS: RAND_load_file(%s) failed: random number generator not seeded",
341 							  randfile);
342 				}
343 				if (problem)
344 					ok = false;
345 			}
346 			if (ok || bitnset(DBS_INSUFFICIENTENTROPY,
347 					  DontBlameSendmail))
348 			{
349 				/* add this even if fstat() failed */
350 				RAND_seed((void *) &st, sizeof(st));
351 			}
352 			(void) close(fd);
353 		}
354 		else
355 		{
356 			if (LogLevel > logl)
357 				sm_syslog(LOG_WARNING, NOQID,
358 					  "STARTTLS: Warning: safeopen(%s) failed",
359 					  randfile);
360 		}
361 	}
362 	else if (randdef == RF_OK)
363 	{
364 		if (LogLevel > logl)
365 			sm_syslog(LOG_WARNING, NOQID,
366 				  "STARTTLS: Error: no proper random file definition %s",
367 				  randfile);
368 		randdef = RF_UNKNOWN;
369 	}
370 	if (randdef == RF_MISS)
371 	{
372 		if (LogLevel > logl)
373 			sm_syslog(LOG_WARNING, NOQID,
374 				  "STARTTLS: Error: missing random file definition");
375 	}
376 	if (!ok && bitnset(DBS_INSUFFICIENTENTROPY, DontBlameSendmail))
377 	{
378 		int i;
379 		long r;
380 		unsigned char buf[MIN_RAND_BYTES];
381 
382 		/* assert((MIN_RAND_BYTES % sizeof(long)) == 0); */
383 		for (i = 0; i <= sizeof(buf) - sizeof(long); i += sizeof(long))
384 		{
385 			r = get_random();
386 			(void) memcpy(buf + i, (void *) &r, sizeof(long));
387 		}
388 		RAND_seed(buf, sizeof(buf));
389 		if (LogLevel > logl)
390 			sm_syslog(LOG_WARNING, NOQID,
391 				  "STARTTLS: Warning: random number generator not properly seeded");
392 		ok = true;
393 	}
394 	done = ok ? RI_SUCCESS : RI_FAIL;
395 	return ok;
396 # else /* ! HASURANDOMDEV */
397 	return true;
398 # endif /* ! HASURANDOMDEV */
399 }
400 
401 /*
402 **  INIT_TLS_LIBRARY -- Calls functions which set up TLS library for global use.
403 **
404 **	Parameters:
405 **		fipsmode -- use FIPS?
406 **
407 **	Returns:
408 **		0: OK
409 **		<0: perm.fail
410 **		>0: fail but can continue
411 */
412 
413 int
414 init_tls_library(fipsmode)
415 	bool fipsmode;
416 {
417 	bool bv;
418 
419 # if _FFR_FIPSMODE
420 	if (fipsmode && CertFingerprintAlgorithm == NULL)
421 		CertFingerprintAlgorithm = "sha1";
422 #  if OPENSSL_VERSION_NUMBER >= 0x30000000L
423 	if (LogLevel > 12)
424 		sm_syslog(LOG_DEBUG, NOQID,
425 			"fipsmode=%d, evp_is_FIPS=%d", fipsmode,
426 			EVP_default_properties_is_fips_enabled(NULL));
427 #  endif
428 # endif /* _FFR_FIPSMODE  */
429 
430 	/*
431 	**  OPENSSL_init_ssl(3): "As of version 1.1.0 OpenSSL will
432 	**  automatically allocate all resources that it needs
433 	**  so no explicit initialisation is required."
434 	*/
435 
436 # if !MTA_HAVE_OPENSSL_init_ssl
437 	/* basic TLS initialization, ignore result for now */
438 	SSL_library_init();
439 	SSL_load_error_strings();
440 	OpenSSL_add_all_algorithms();
441 # endif
442 
443 	bv = true;
444 	if (TLSsslidx < 0)
445 	{
446 		TLSsslidx = SSL_get_ex_new_index(0, 0, 0, 0, 0);
447 		if (TLSsslidx < 0)
448 		{
449 			if (LogLevel > 0)
450 				sm_syslog(LOG_ERR, NOQID,
451 					"STARTTLS=init, SSL_get_ex_new_index=%d",
452 					TLSsslidx);
453 			bv = false;
454 		}
455 	}
456 
457 	if (bv)
458 		bv = tls_rand_init(RandFile, 7);
459 # if _FFR_FIPSMODE && OPENSSL_VERSION_NUMBER < 0x30000000L
460 	if (bv && fipsmode)
461 	{
462 		if (!FIPS_mode_set(1))
463 		{
464 			unsigned long err;
465 
466 			err = ERR_get_error();
467 			if (LogLevel > 0)
468 				sm_syslog(LOG_ERR, NOQID,
469 					"STARTTLS=init, FIPSMode=%s",
470 					ERR_error_string(err, NULL));
471 			return -1;
472 		}
473 		else if (LogLevel > 9)
474 		{
475 			sm_syslog(LOG_INFO, NOQID,
476 				"STARTTLS=init, FIPSMode=ok");
477 		}
478 	}
479 # endif /* _FFR_FIPSMODE && OPENSSL_VERSION_NUMBER < 0x30000000L */
480 
481 	if (!TLS_set_engine(SSLEngine, true))
482 	{
483 		if (LogLevel > 0)
484 			sm_syslog(LOG_ERR, NOQID,
485 				  "STARTTLS=init, engine=%s, TLS_set_engine=failed",
486 				  SSLEngine);
487 		return -1;
488 	}
489 
490 	if (bv && CertFingerprintAlgorithm != NULL)
491 	{
492 		const EVP_MD *md;
493 
494 		md = EVP_get_digestbyname(CertFingerprintAlgorithm);
495 		if (NULL == md)
496 		{
497 			bv = false;
498 			if (LogLevel > 0)
499 				sm_syslog(LOG_ERR, NOQID,
500 					"STARTTLS=init, CertFingerprintAlgorithm=%s, status=invalid"
501 					, CertFingerprintAlgorithm);
502 		}
503 		else
504 			EVP_digest = md;
505 	}
506 	return bv ? 0 : 1;
507 }
508 
509 /*
510 **  TLS_SET_VERIFY -- request client certificate?
511 **
512 **	Parameters:
513 **		ctx -- TLS context
514 **		ssl -- TLS session context
515 **		vrfy -- request certificate?
516 **
517 **	Returns:
518 **		none.
519 **
520 **	Side Effects:
521 **		Sets verification state for TLS
522 **
523 # if TLS_VRFY_PER_CTX
524 **	Notice:
525 **		This is per TLS context, not per TLS structure;
526 **		the former is global, the latter per connection.
527 **		It would be nice to do this per connection, but this
528 **		doesn't work in the current TLS libraries :-(
529 # endif * TLS_VRFY_PER_CTX *
530 */
531 
532 void
533 tls_set_verify(ctx, ssl, vrfy)
534 	SSL_CTX *ctx;
535 	SSL *ssl;
536 	bool vrfy;
537 {
538 # if !TLS_VRFY_PER_CTX
539 	SSL_set_verify(ssl, vrfy ? SSL_VERIFY_PEER : SSL_VERIFY_NONE, NULL);
540 # else
541 	SSL_CTX_set_verify(ctx, vrfy ? SSL_VERIFY_PEER : SSL_VERIFY_NONE,
542 			NULL);
543 # endif
544 }
545 
546 /*
547 **  status in initialization
548 **  these flags keep track of the status of the initialization
549 **  i.e., whether a file exists (_EX) and whether it can be used (_OK)
550 **  [due to permissions]
551 */
552 
553 # define TLS_S_NONE	0x00000000	/* none yet */
554 # define TLS_S_CERT_EX	0x00000001	/* cert file exists */
555 # define TLS_S_CERT_OK	0x00000002	/* cert file is ok */
556 # define TLS_S_KEY_EX	0x00000004	/* key file exists */
557 # define TLS_S_KEY_OK	0x00000008	/* key file is ok */
558 # define TLS_S_CERTP_EX	0x00000010	/* CA cert path exists */
559 # define TLS_S_CERTP_OK	0x00000020	/* CA cert path is ok */
560 # define TLS_S_CERTF_EX	0x00000040	/* CA cert file exists */
561 # define TLS_S_CERTF_OK	0x00000080	/* CA cert file is ok */
562 # define TLS_S_CRLF_EX	0x00000100	/* CRL file exists */
563 # define TLS_S_CRLF_OK	0x00000200	/* CRL file is ok */
564 
565 # define TLS_S_CERT2_EX	0x00001000	/* 2nd cert file exists */
566 # define TLS_S_CERT2_OK	0x00002000	/* 2nd cert file is ok */
567 # define TLS_S_KEY2_EX	0x00004000	/* 2nd key file exists */
568 # define TLS_S_KEY2_OK	0x00008000	/* 2nd key file is ok */
569 
570 # define TLS_S_DH_OK	0x00200000	/* DH cert is ok */
571 # define TLS_S_DHPAR_EX	0x00400000	/* DH param file exists */
572 # define TLS_S_DHPAR_OK	0x00800000	/* DH param file is ok to use */
573 
574 /* Type of variable */
575 # define TLS_T_OTHER	0
576 # define TLS_T_SRV	1
577 # define TLS_T_CLT	2
578 
579 /*
580 **  TLS_OK_F -- can var be an absolute filename?
581 **
582 **	Parameters:
583 **		var -- filename
584 **		fn -- what is the filename used for?
585 **		type -- type of variable
586 **
587 **	Returns:
588 **		ok?
589 */
590 
591 static bool
592 tls_ok_f(var, fn, type)
593 	char *var;
594 	char *fn;
595 	int type;
596 {
597 	/* must be absolute pathname */
598 	if (var != NULL && *var == '/')
599 		return true;
600 	if (LogLevel > 12)
601 		sm_syslog(LOG_WARNING, NOQID, "STARTTLS: %s%s missing",
602 			  type == TLS_T_SRV ? "Server" :
603 			  (type == TLS_T_CLT ? "Client" : ""), fn);
604 	return false;
605 }
606 /*
607 **  TLS_SAFE_F -- is a file safe to use?
608 **
609 **	Parameters:
610 **		var -- filename
611 **		sff -- flags for safefile()
612 **		srv -- server side?
613 **
614 **	Returns:
615 **		ok?
616 */
617 
618 static bool
619 tls_safe_f(var, sff, srv)
620 	char *var;
621 	long sff;
622 	bool srv;
623 {
624 	int ret;
625 
626 	if ((ret = safefile(var, RunAsUid, RunAsGid, RunAsUserName, sff,
627 			    S_IRUSR, NULL)) == 0)
628 		return true;
629 	if (LogLevel > 7)
630 		sm_syslog(LOG_WARNING, NOQID, "STARTTLS=%s: file %s unsafe: %s",
631 			  srv ? "server" : "client", var, sm_errstring(ret));
632 	return false;
633 }
634 
635 /*
636 **  TLS_OK_F -- macro to simplify calls to tls_ok_f
637 **
638 **	Parameters:
639 **		var -- filename
640 **		fn -- what is the filename used for?
641 **		req -- is the file required?
642 **		st -- status bit to set if ok
643 **		type -- type of variable
644 **
645 **	Side Effects:
646 **		uses r, ok; may change ok and status.
647 **
648 */
649 
650 # define TLS_OK_F(var, fn, req, st, type) if (ok) \
651 	{ \
652 		r = tls_ok_f(var, fn, type); \
653 		if (r) \
654 			status |= st; \
655 		else if (req) \
656 			ok = false; \
657 	}
658 
659 /*
660 **  TLS_UNR -- macro to return whether a file should be unreadable
661 **
662 **	Parameters:
663 **		bit -- flag to test
664 **		req -- flags
665 **
666 **	Returns:
667 **		0/SFF_NORFILES
668 */
669 
670 # define TLS_UNR(bit, req)	(bitset(bit, req) ? SFF_NORFILES : 0)
671 # define TLS_OUNR(bit, req)	(bitset(bit, req) ? SFF_NOWRFILES : 0)
672 # define TLS_KEYSFF(req)	\
673 	(bitnset(DBS_GROUPREADABLEKEYFILE, DontBlameSendmail) ?	\
674 		TLS_OUNR(TLS_I_KEY_OUNR, req) :			\
675 		TLS_UNR(TLS_I_KEY_UNR, req))
676 
677 /*
678 **  TLS_SAFE_F -- macro to simplify calls to tls_safe_f
679 **
680 **	Parameters:
681 **		var -- filename
682 **		sff -- flags for safefile()
683 **		req -- is the file required?
684 **		ex -- does the file exist?
685 **		st -- status bit to set if ok
686 **		srv -- server side?
687 **
688 **	Side Effects:
689 **		uses r, ok, ex; may change ok and status.
690 **
691 */
692 
693 # define TLS_SAFE_F(var, sff, req, ex, st, srv) if (ex && ok) \
694 	{ \
695 		r = tls_safe_f(var, sff, srv); \
696 		if (r) \
697 			status |= st;	\
698 		else if (req) \
699 			ok = false;	\
700 	}
701 
702 /*
703 **  LOAD_CERTKEY -- load cert/key for TLS session
704 **
705 **	Parameters:
706 **		ssl -- TLS session context
707 **		srv -- server side?
708 **		certfile -- filename of certificate
709 **		keyfile -- filename of private key
710 **
711 **	Returns:
712 **		succeeded?
713 */
714 
715 bool
716 load_certkey(ssl, srv, certfile, keyfile)
717 	SSL *ssl;
718 	bool srv;
719 	char *certfile;
720 	char *keyfile;
721 {
722 	bool ok;
723 	int r;
724 	long sff, status;
725 	unsigned long req;
726 	char *who;
727 
728 	ok = true;
729 	who = srv ? "server" : "client";
730 	status = TLS_S_NONE;
731 	req = TLS_I_CERT_EX|TLS_I_KEY_EX;
732 	TLS_OK_F(certfile, "CertFile", bitset(TLS_I_CERT_EX, req),
733 		 TLS_S_CERT_EX, srv ? TLS_T_SRV : TLS_T_CLT);
734 	TLS_OK_F(keyfile, "KeyFile", bitset(TLS_I_KEY_EX, req),
735 		 TLS_S_KEY_EX, srv ? TLS_T_SRV : TLS_T_CLT);
736 
737 	/* certfile etc. must be "safe". */
738 	sff = SFF_REGONLY | SFF_SAFEDIRPATH | SFF_NOWLINK
739 	     | SFF_NOGWFILES | SFF_NOWWFILES
740 	     | SFF_ROOTOK | SFF_OPENASROOT;
741 	if (!bitnset(DBS_CERTOWNER, DontBlameSendmail))
742 		sff |= SFF_MUSTOWN;
743 	if (DontLockReadFiles)
744 		sff |= SFF_NOLOCK;
745 
746 	TLS_SAFE_F(certfile, sff | TLS_UNR(TLS_I_CERT_UNR, req),
747 		   bitset(TLS_I_CERT_EX, req),
748 		   bitset(TLS_S_CERT_EX, status), TLS_S_CERT_OK, srv);
749 	TLS_SAFE_F(keyfile, sff | TLS_KEYSFF(req),
750 		   bitset(TLS_I_KEY_EX, req),
751 		   bitset(TLS_S_KEY_EX, status), TLS_S_KEY_OK, srv);
752 
753 # define SSL_use_cert(ssl, certfile) \
754 	SSL_use_certificate_file(ssl, certfile, SSL_FILETYPE_PEM)
755 # define SSL_USE_CERT "SSL_use_certificate_file"
756 
757 	if (bitset(TLS_S_CERT_OK, status) &&
758 	    SSL_use_cert(ssl, certfile) <= 0)
759 	{
760 		if (LogLevel > 7)
761 		{
762 			sm_syslog(LOG_WARNING, NOQID,
763 				  "STARTTLS=%s, error: %s(%s) failed",
764 				  who, SSL_USE_CERT, certfile);
765 			tlslogerr(LOG_WARNING, 9, who);
766 		}
767 		if (bitset(TLS_I_USE_CERT, req))
768 			return false;
769 	}
770 	if (bitset(TLS_S_KEY_OK, status) &&
771 	    SSL_use_PrivateKey_file(ssl, keyfile, SSL_FILETYPE_PEM) <= 0)
772 	{
773 		if (LogLevel > 7)
774 		{
775 			sm_syslog(LOG_WARNING, NOQID,
776 				  "STARTTLS=%s, error: SSL_use_PrivateKey_file(%s) failed",
777 				  who, keyfile);
778 			tlslogerr(LOG_WARNING, 9, who);
779 		}
780 		if (bitset(TLS_I_USE_KEY, req))
781 			return false;
782 	}
783 
784 	/* check the private key */
785 	if (bitset(TLS_S_KEY_OK, status) &&
786 	    (r = SSL_check_private_key(ssl)) <= 0)
787 	{
788 		/* Private key does not match the certificate public key */
789 		if (LogLevel > 5)
790 		{
791 			sm_syslog(LOG_WARNING, NOQID,
792 				  "STARTTLS=%s, error: SSL_check_private_key failed(%s): %d",
793 				  who, keyfile, r);
794 			tlslogerr(LOG_WARNING, 9, who);
795 		}
796 		if (bitset(TLS_I_USE_KEY, req))
797 			return false;
798 	}
799 
800 	return true;
801 }
802 
803 /*
804 **  LOAD_CRLFILE -- load a file holding a CRL into the TLS context
805 **
806 **	Parameters:
807 **		ctx -- TLS context
808 **		srv -- server side?
809 **		filename -- filename of CRL
810 **
811 **	Returns:
812 **		succeeded?
813 */
814 
815 static bool load_crlfile __P((SSL_CTX *, bool, char *));
816 
817 static bool
818 load_crlfile(ctx, srv, filename)
819 	SSL_CTX *ctx;
820 	bool srv;
821 	char *filename;
822 {
823 	char *who;
824 	BIO *crl_file;
825 	X509_CRL *crl;
826 	X509_STORE *store;
827 
828 	who = srv ? "server" : "client";
829 	crl_file = BIO_new(BIO_s_file());
830 	if (crl_file == NULL)
831 	{
832 		if (LogLevel > 9)
833 			sm_syslog(LOG_WARNING, NOQID,
834 				  "STARTTLS=%s, error: BIO_new=failed", who);
835 		return false;
836 	}
837 
838 	if (BIO_read_filename(crl_file, filename) < 0)
839 	{
840 		if (LogLevel > 9)
841 			sm_syslog(LOG_WARNING, NOQID,
842 				  "STARTTLS=%s, error: BIO_read_filename(%s)=failed",
843 				  who, filename);
844 
845 		/* avoid memory leaks */
846 		BIO_free(crl_file);
847 		return false;
848 	}
849 
850 	crl = PEM_read_bio_X509_CRL(crl_file, NULL, NULL, NULL);
851 	if (crl == NULL)
852 	{
853 		if (LogLevel > 9)
854 			sm_syslog(LOG_WARNING, NOQID,
855 				  "STARTTLS=%s, error: PEM_read_bio_X509_CRL(%s)=failed",
856 				  who, filename);
857 		BIO_free(crl_file);
858 		return true;	/* XXX should probably be 'false' */
859 	}
860 
861 	BIO_free(crl_file);
862 
863 	/* get a pointer to the current certificate validation store */
864 	store = SSL_CTX_get_cert_store(ctx);	/* does not fail */
865 
866 	if (X509_STORE_add_crl(store, crl) == 0)
867 	{
868 		if (LogLevel > 9)
869 			sm_syslog(LOG_WARNING, NOQID,
870 				  "STARTTLS=%s, error: X509_STORE_add_crl=failed",
871 				  who);
872 		X509_CRL_free(crl);
873 		return false;
874 	}
875 
876 	X509_CRL_free(crl);
877 
878 	X509_STORE_set_flags(store,
879 		X509_V_FLAG_CRL_CHECK|X509_V_FLAG_CRL_CHECK_ALL);
880 	X509_STORE_set_verify_cb_func(store, x509_verify_cb);
881 
882 	return true;
883 }
884 
885 /*
886 **  LOAD_CRLPATH -- configure the TLS context to lookup CRLs in a directory
887 **
888 **	Parameters:
889 **		ctx -- TLS context
890 **		srv -- server side?
891 **		path -- path of hashed directory of CRLs
892 **
893 **	Returns:
894 **		succeeded?
895 */
896 
897 static bool load_crlpath __P((SSL_CTX *, bool, char *));
898 
899 static bool
900 load_crlpath(ctx, srv, path)
901 	SSL_CTX *ctx;
902 	bool srv;
903 	char *path;
904 {
905 	char *who;
906 	X509_STORE *store;
907 	X509_LOOKUP *lookup;
908 
909 	who = srv ? "server" : "client";
910 
911 	/* get a pointer to the current certificate validation store */
912 	store = SSL_CTX_get_cert_store(ctx);	/* does not fail */
913 
914 	lookup = X509_STORE_add_lookup(store, X509_LOOKUP_hash_dir());
915 	if (lookup == NULL)
916 	{
917 		if (LogLevel > 9)
918 			sm_syslog(LOG_WARNING, NOQID,
919 				  "STARTTLS=%s, error: X509_STORE_add_lookup(hash)=failed",
920 				  who);
921 		return false;
922 	}
923 
924 	if (X509_LOOKUP_add_dir(lookup, path, X509_FILETYPE_PEM) == 0)
925 	{
926 		if (LogLevel > 9)
927 			sm_syslog(LOG_WARNING, NOQID,
928 				  "STARTTLS=%s, error: X509_LOOKUP_add_dir(%s)=failed",
929 				  who, path);
930 		return false;
931 	}
932 
933 	X509_STORE_set_flags(store,
934 		X509_V_FLAG_CRL_CHECK|X509_V_FLAG_CRL_CHECK_ALL);
935 	X509_STORE_set_verify_cb_func(store, x509_verify_cb);
936 
937 	return true;
938 }
939 
940 /*
941 **  INITTLS -- initialize TLS
942 **
943 **	Parameters:
944 **		ctx -- pointer to context
945 **		req -- requirements for initialization (see sendmail.h)
946 **		options -- options
947 **		srv -- server side?
948 **		certfile -- filename of certificate
949 **		keyfile -- filename of private key
950 **		cacertpath -- path to CAs
951 **		cacertfile -- file with CA(s)
952 **		dhparam -- parameters for DH
953 **
954 **	Returns:
955 **		succeeded?
956 */
957 
958 /*
959 **  The session_id_context identifies the service that created a session.
960 **  This information is used to distinguish between multiple TLS-based
961 **  servers running on the same server. We use the name of the mail system.
962 **  Note: the session cache is not persistent.
963 */
964 
965 static char server_session_id_context[] = "sendmail8";
966 
967 /* 0.9.8a and b have a problem with SSL_OP_TLS_BLOCK_PADDING_BUG */
968 # if (OPENSSL_VERSION_NUMBER >= 0x0090800fL)
969 #  define SM_SSL_OP_TLS_BLOCK_PADDING_BUG	1
970 # else
971 #  define SM_SSL_OP_TLS_BLOCK_PADDING_BUG	0
972 # endif
973 
974 bool
975 inittls(ctx, req, options, srv, certfile, keyfile, cacertpath, cacertfile, dhparam)
976 	SSL_CTX **ctx;
977 	unsigned long req;
978 	unsigned long options;
979 	bool srv;
980 	char *certfile, *keyfile, *cacertpath, *cacertfile, *dhparam;
981 {
982 # if !NO_DH
983 	static DH *dh = NULL;
984 # endif
985 	int r;
986 	bool ok;
987 	long sff, status;
988 	char *who;
989 	char *cf2, *kf2;
990 # if SM_CONF_SHM && !TLS_NO_RSA && MTA_RSA_TMP_CB
991 	extern int ShmId;
992 # endif
993 # if SM_SSL_OP_TLS_BLOCK_PADDING_BUG
994 	long rt_version;
995 	STACK_OF(SSL_COMP) *comp_methods;
996 # endif
997 
998 	status = TLS_S_NONE;
999 	who = srv ? "server" : "client";
1000 	if (ctx == NULL)
1001 	{
1002 		syserr("STARTTLS=%s, inittls: ctx == NULL", who);
1003 		/* NOTREACHED */
1004 		SM_ASSERT(ctx != NULL);
1005 	}
1006 
1007 	/* already initialized? (we could re-init...) */
1008 	if (*ctx != NULL)
1009 		return true;
1010 	ok = true;
1011 
1012 	/*
1013 	**  look for a second filename: it must be separated by a ','
1014 	**  no blanks allowed (they won't be skipped).
1015 	**  we change a global variable here! this change will be undone
1016 	**  before return from the function but only if it returns true.
1017 	**  this isn't a problem since in a failure case this function
1018 	**  won't be called again with the same (overwritten) values.
1019 	**  otherwise each return must be replaced with a goto endinittls.
1020 	*/
1021 
1022 	cf2 = NULL;
1023 	kf2 = NULL;
1024 	if (certfile != NULL && (cf2 = strchr(certfile, ',')) != NULL)
1025 	{
1026 		*cf2++ = '\0';
1027 		if (keyfile != NULL && (kf2 = strchr(keyfile, ',')) != NULL)
1028 			*kf2++ = '\0';
1029 	}
1030 
1031 	/*
1032 	**  Check whether files/paths are defined
1033 	*/
1034 
1035 	TLS_OK_F(certfile, "CertFile", bitset(TLS_I_CERT_EX, req),
1036 		 TLS_S_CERT_EX, srv ? TLS_T_SRV : TLS_T_CLT);
1037 	TLS_OK_F(keyfile, "KeyFile", bitset(TLS_I_KEY_EX, req),
1038 		 TLS_S_KEY_EX, srv ? TLS_T_SRV : TLS_T_CLT);
1039 	TLS_OK_F(cacertpath, "CACertPath", bitset(TLS_I_CERTP_EX, req),
1040 		 TLS_S_CERTP_EX, TLS_T_OTHER);
1041 	TLS_OK_F(cacertfile, "CACertFile", bitset(TLS_I_CERTF_EX, req),
1042 		 TLS_S_CERTF_EX, TLS_T_OTHER);
1043 
1044 	TLS_OK_F(CRLFile, "CRLFile", bitset(TLS_I_CRLF_EX, req),
1045 		 TLS_S_CRLF_EX, TLS_T_OTHER);
1046 
1047 	/*
1048 	**  if the second file is specified it must exist
1049 	**  XXX: it is possible here to define only one of those files
1050 	*/
1051 
1052 	if (cf2 != NULL)
1053 	{
1054 		TLS_OK_F(cf2, "CertFile", bitset(TLS_I_CERT_EX, req),
1055 			 TLS_S_CERT2_EX, srv ? TLS_T_SRV : TLS_T_CLT);
1056 	}
1057 	if (kf2 != NULL)
1058 	{
1059 		TLS_OK_F(kf2, "KeyFile", bitset(TLS_I_KEY_EX, req),
1060 			 TLS_S_KEY2_EX, srv ? TLS_T_SRV : TLS_T_CLT);
1061 	}
1062 
1063 	/*
1064 	**  valid values for dhparam are (only the first char is checked)
1065 	**  none	no parameters: don't use DH
1066 	**  i		use precomputed 2048 bit parameters
1067 	**  512		use precomputed 512 bit parameters
1068 	**  1024	generate 1024 bit parameters
1069 	**  2048	generate 2048 bit parameters
1070 	**  /file/name	read parameters from /file/name
1071 	*/
1072 
1073 # if MTA_DH_AUTO
1074 #  define SET_DH_DFL	\
1075 	do {	\
1076 		dhparam = "a";	\
1077 		req |= TLS_I_DHAUTO;	\
1078 	} while (0)
1079 # else
1080 #  define SET_DH_DFL	\
1081 	do {	\
1082 		dhparam = "I";	\
1083 		req |= TLS_I_DHFIXED;	\
1084 	} while (0)
1085 # endif
1086 
1087 	if (bitset(TLS_I_TRY_DH, req))
1088 	{
1089 		if (dhparam != NULL)
1090 		{
1091 			char c = *dhparam;
1092 
1093 # if MTA_DH_AUTO
1094 			if (c == 'a')
1095 				req |= TLS_I_DHAUTO;
1096 			else
1097 # endif
1098 			if (c == '1')
1099 				req |= TLS_I_DH1024;
1100 			else if (c == 'I' || c == 'i')
1101 				req |= TLS_I_DHFIXED;
1102 			else if (c == '2')
1103 				req |= TLS_I_DH2048;
1104 			else if (c == '5')
1105 				req |= TLS_I_DH512;
1106 			else if (c == 'n' || c == 'N')
1107 				req &= ~TLS_I_TRY_DH;
1108 			else if (c != '/')
1109 			{
1110 				if (LogLevel > 12)
1111 					sm_syslog(LOG_WARNING, NOQID,
1112 						  "STARTTLS=%s, error: illegal value '%s' for DHParameters",
1113 						  who, dhparam);
1114 				dhparam = NULL;
1115 			}
1116 		}
1117 		if (dhparam == NULL)
1118 			SET_DH_DFL;
1119 		else if (*dhparam == '/')
1120 		{
1121 			TLS_OK_F(dhparam, "DHParameters",
1122 				 bitset(TLS_I_DHPAR_EX, req),
1123 				 TLS_S_DHPAR_EX, TLS_T_OTHER);
1124 		}
1125 	}
1126 	if (!ok)
1127 		return ok;
1128 
1129 	/* certfile etc. must be "safe". */
1130 	sff = SFF_REGONLY | SFF_SAFEDIRPATH | SFF_NOWLINK
1131 	     | SFF_NOGWFILES | SFF_NOWWFILES
1132 	     | SFF_ROOTOK | SFF_OPENASROOT;
1133 	if (!bitnset(DBS_CERTOWNER, DontBlameSendmail))
1134 		sff |= SFF_MUSTOWN;
1135 	if (DontLockReadFiles)
1136 		sff |= SFF_NOLOCK;
1137 
1138 	TLS_SAFE_F(certfile, sff | TLS_UNR(TLS_I_CERT_UNR, req),
1139 		   bitset(TLS_I_CERT_EX, req),
1140 		   bitset(TLS_S_CERT_EX, status), TLS_S_CERT_OK, srv);
1141 	TLS_SAFE_F(keyfile, sff | TLS_KEYSFF(req),
1142 		   bitset(TLS_I_KEY_EX, req),
1143 		   bitset(TLS_S_KEY_EX, status), TLS_S_KEY_OK, srv);
1144 	TLS_SAFE_F(cacertfile, sff | TLS_UNR(TLS_I_CERTF_UNR, req),
1145 		   bitset(TLS_I_CERTF_EX, req),
1146 		   bitset(TLS_S_CERTF_EX, status), TLS_S_CERTF_OK, srv);
1147 	if (dhparam != NULL && *dhparam == '/')
1148 	{
1149 		TLS_SAFE_F(dhparam, sff | TLS_UNR(TLS_I_DHPAR_UNR, req),
1150 			   bitset(TLS_I_DHPAR_EX, req),
1151 			   bitset(TLS_S_DHPAR_EX, status), TLS_S_DHPAR_OK, srv);
1152 		if (!bitset(TLS_S_DHPAR_OK, status))
1153 			SET_DH_DFL;
1154 	}
1155 	TLS_SAFE_F(CRLFile, sff | TLS_UNR(TLS_I_CRLF_UNR, req),
1156 		   bitset(TLS_I_CRLF_EX, req),
1157 		   bitset(TLS_S_CRLF_EX, status), TLS_S_CRLF_OK, srv);
1158 	if (!ok)
1159 		return ok;
1160 	if (cf2 != NULL)
1161 	{
1162 		TLS_SAFE_F(cf2, sff | TLS_UNR(TLS_I_CERT_UNR, req),
1163 			   bitset(TLS_I_CERT_EX, req),
1164 			   bitset(TLS_S_CERT2_EX, status), TLS_S_CERT2_OK, srv);
1165 	}
1166 	if (kf2 != NULL)
1167 	{
1168 		TLS_SAFE_F(kf2, sff | TLS_KEYSFF(req),
1169 			   bitset(TLS_I_KEY_EX, req),
1170 			   bitset(TLS_S_KEY2_EX, status), TLS_S_KEY2_OK, srv);
1171 	}
1172 
1173 	/* create a method and a new context */
1174 	if ((*ctx = SSL_CTX_new(srv ? SSLv23_server_method() :
1175 				      SSLv23_client_method())) == NULL)
1176 	{
1177 		if (LogLevel > 7)
1178 			sm_syslog(LOG_WARNING, NOQID,
1179 				  "STARTTLS=%s, error: SSL_CTX_new(SSLv23_%s_method()) failed",
1180 				  who, who);
1181 		tlslogerr(LOG_WARNING, 9, who);
1182 		return false;
1183 	}
1184 
1185 # if _FFR_VRFY_TRUSTED_FIRST
1186 	if (!tTd(88, 101))
1187 	{
1188 		X509_STORE *store;
1189 
1190 		/* get a pointer to the current certificate validation store */
1191 		store = SSL_CTX_get_cert_store(*ctx);	/* does not fail */
1192 		SM_ASSERT(store != NULL);
1193 		X509_STORE_set_flags(store, X509_V_FLAG_TRUSTED_FIRST);
1194 	}
1195 # endif
1196 
1197 	if (CRLFile != NULL && !load_crlfile(*ctx, srv, CRLFile))
1198 		return false;
1199 	if (CRLPath != NULL && !load_crlpath(*ctx, srv, CRLPath))
1200 		return false;
1201 
1202 # if defined(SSL_MODE_AUTO_RETRY) && OPENSSL_VERSION_NUMBER >= 0x10100000L && OPENSSL_VERSION_NUMBER < 0x20000000L
1203 	/*
1204 	 *  Turn off blocking I/O handling in OpenSSL: someone turned
1205 	 *  this on by default in 1.1? should we check first?
1206 	 */
1207 #  if _FFR_TESTS
1208 	if (LogLevel > 9) {
1209 		sff = SSL_CTX_get_mode(*ctx);
1210 		if (sff & SSL_MODE_AUTO_RETRY)
1211 			sm_syslog(LOG_WARNING, NOQID,
1212 				"STARTTLS=%s, SSL_MODE_AUTO_RETRY=set, mode=%#lx",
1213 				who, sff);
1214 	}
1215 
1216 	/* hack for testing! */
1217 	if (tTd(96, 101) || getenv("SSL_MODE_AUTO_RETRY") != NULL)
1218 		SSL_CTX_set_mode(*ctx, SSL_MODE_AUTO_RETRY);
1219 	else
1220 #  endif /* _FFR_TESTS */
1221 	/* "else" in #if code above */
1222 	SSL_CTX_clear_mode(*ctx, SSL_MODE_AUTO_RETRY);
1223 # endif /* defined(SSL_MODE_AUTO_RETRY) && OPENSSL_VERSION_NUMBER >= 0x10100000L && OPENSSL_VERSION_NUMBER < 0x20000000L */
1224 
1225 # if TLS_NO_RSA
1226 	/* turn off backward compatibility, required for no-rsa */
1227 	SSL_CTX_set_options(*ctx, SSL_OP_NO_SSLv2);
1228 # endif
1229 
1230 # if !TLS_NO_RSA && MTA_RSA_TMP_CB
1231 	/*
1232 	**  Create a temporary RSA key
1233 	**  XXX  Maybe we shouldn't create this always (even though it
1234 	**  is only at startup).
1235 	**  It is a time-consuming operation and it is not always necessary.
1236 	**  maybe we should do it only on demand...
1237 	*/
1238 
1239 	if (bitset(TLS_I_RSA_TMP, req)
1240 #  if SM_CONF_SHM
1241 	    && ShmId != SM_SHM_NO_ID &&
1242 	    (rsa_tmp = RSA_generate_key(RSA_KEYLENGTH, RSA_F4, NULL,
1243 					NULL)) == NULL
1244 #  else /* SM_CONF_SHM */
1245 	    && 0	/* no shared memory: no need to generate key now */
1246 #  endif /* SM_CONF_SHM */
1247 	   )
1248 	{
1249 		if (LogLevel > 7)
1250 		{
1251 			sm_syslog(LOG_WARNING, NOQID,
1252 				  "STARTTLS=%s, error: RSA_generate_key failed",
1253 				  who);
1254 			tlslogerr(LOG_WARNING, 9, who);
1255 		}
1256 		return false;
1257 	}
1258 # endif /* !TLS_NO_RSA && MTA_RSA_TMP_CB */
1259 
1260 	/*
1261 	**  load private key
1262 	**  XXX change this for DSA-only version
1263 	*/
1264 
1265 	if (bitset(TLS_S_KEY_OK, status) &&
1266 	    SSL_CTX_use_PrivateKey_file(*ctx, keyfile,
1267 					 SSL_FILETYPE_PEM) <= 0)
1268 	{
1269 		if (LogLevel > 7)
1270 		{
1271 			sm_syslog(LOG_WARNING, NOQID,
1272 				  "STARTTLS=%s, error: SSL_CTX_use_PrivateKey_file(%s) failed",
1273 				  who, keyfile);
1274 			tlslogerr(LOG_WARNING, 9, who);
1275 		}
1276 		if (bitset(TLS_I_USE_KEY, req))
1277 			return false;
1278 	}
1279 
1280 # if _FFR_TLS_USE_CERTIFICATE_CHAIN_FILE
1281 #  define SSL_CTX_use_cert(ssl_ctx, certfile) \
1282 	SSL_CTX_use_certificate_chain_file(ssl_ctx, certfile)
1283 #  define SSL_CTX_USE_CERT "SSL_CTX_use_certificate_chain_file"
1284 # else
1285 #  define SSL_CTX_use_cert(ssl_ctx, certfile) \
1286 	SSL_CTX_use_certificate_file(ssl_ctx, certfile, SSL_FILETYPE_PEM)
1287 #  define SSL_CTX_USE_CERT "SSL_CTX_use_certificate_file"
1288 # endif
1289 
1290 	/* get the certificate file */
1291 	if (bitset(TLS_S_CERT_OK, status) &&
1292 	    SSL_CTX_use_cert(*ctx, certfile) <= 0)
1293 	{
1294 		if (LogLevel > 7)
1295 		{
1296 			sm_syslog(LOG_WARNING, NOQID,
1297 				  "STARTTLS=%s, error: %s(%s) failed",
1298 				  who, SSL_CTX_USE_CERT, certfile);
1299 			tlslogerr(LOG_WARNING, 9, who);
1300 		}
1301 		if (bitset(TLS_I_USE_CERT, req))
1302 			return false;
1303 	}
1304 
1305 	/* check the private key */
1306 	if (bitset(TLS_S_KEY_OK, status) &&
1307 	    (r = SSL_CTX_check_private_key(*ctx)) <= 0)
1308 	{
1309 		/* Private key does not match the certificate public key */
1310 		if (LogLevel > 5)
1311 		{
1312 			sm_syslog(LOG_WARNING, NOQID,
1313 				  "STARTTLS=%s, error: SSL_CTX_check_private_key failed(%s): %d",
1314 				  who, keyfile, r);
1315 			tlslogerr(LOG_WARNING, 9, who);
1316 		}
1317 		if (bitset(TLS_I_USE_KEY, req))
1318 			return false;
1319 	}
1320 
1321 	/* XXX this code is pretty much duplicated from above! */
1322 
1323 	/* load private key */
1324 	if (bitset(TLS_S_KEY2_OK, status) &&
1325 	    SSL_CTX_use_PrivateKey_file(*ctx, kf2, SSL_FILETYPE_PEM) <= 0)
1326 	{
1327 		if (LogLevel > 7)
1328 		{
1329 			sm_syslog(LOG_WARNING, NOQID,
1330 				  "STARTTLS=%s, error: SSL_CTX_use_PrivateKey_file(%s) failed",
1331 				  who, kf2);
1332 			tlslogerr(LOG_WARNING, 9, who);
1333 		}
1334 	}
1335 
1336 	/* get the certificate file */
1337 	if (bitset(TLS_S_CERT2_OK, status) &&
1338 	    SSL_CTX_use_cert(*ctx, cf2) <= 0)
1339 	{
1340 		if (LogLevel > 7)
1341 		{
1342 			sm_syslog(LOG_WARNING, NOQID,
1343 				  "STARTTLS=%s, error: %s(%s) failed",
1344 				  who, SSL_CTX_USE_CERT, cf2);
1345 			tlslogerr(LOG_WARNING, 9, who);
1346 		}
1347 	}
1348 
1349 	/* also check the private key */
1350 	if (bitset(TLS_S_KEY2_OK, status) &&
1351 	    (r = SSL_CTX_check_private_key(*ctx)) <= 0)
1352 	{
1353 		/* Private key does not match the certificate public key */
1354 		if (LogLevel > 5)
1355 		{
1356 			sm_syslog(LOG_WARNING, NOQID,
1357 				  "STARTTLS=%s, error: SSL_CTX_check_private_key 2 failed: %d",
1358 				  who, r);
1359 			tlslogerr(LOG_WARNING, 9, who);
1360 		}
1361 	}
1362 
1363 	/* SSL_CTX_set_quiet_shutdown(*ctx, 1); violation of standard? */
1364 
1365 # if SM_SSL_OP_TLS_BLOCK_PADDING_BUG
1366 
1367 	/*
1368 	**  In OpenSSL 0.9.8[ab], enabling zlib compression breaks the
1369 	**  padding bug work-around, leading to false positives and
1370 	**  failed connections. We may not interoperate with systems
1371 	**  with the bug, but this is better than breaking on all 0.9.8[ab]
1372 	**  systems that have zlib support enabled.
1373 	**  Note: this checks the runtime version of the library, not
1374 	**  just the compile time version.
1375 	*/
1376 
1377 	rt_version = TLS_version_num();
1378 	if (rt_version >= 0x00908000L && rt_version <= 0x0090802fL)
1379 	{
1380 		comp_methods = SSL_COMP_get_compression_methods();
1381 		if (comp_methods != NULL && sk_SSL_COMP_num(comp_methods) > 0)
1382 			options &= ~SSL_OP_TLS_BLOCK_PADDING_BUG;
1383 	}
1384 # endif
1385 	SSL_CTX_set_options(*ctx, (long) options);
1386 
1387 # if !NO_DH
1388 	/* Diffie-Hellman initialization */
1389 	if (bitset(TLS_I_TRY_DH, req))
1390 	{
1391 #  if TLS_EC == 1
1392 		EC_KEY *ecdh;
1393 #  endif
1394 
1395 		if (tTd(96, 81))
1396 			sm_dprintf("inittls: where=try_dh, req=%#lx, status=%#lx\n",
1397 				req, status);
1398 		if (bitset(TLS_S_DHPAR_OK, status))
1399 		{
1400 			BIO *bio;
1401 
1402 			if ((bio = BIO_new_file(dhparam, "r")) != NULL)
1403 			{
1404 				dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL);
1405 				BIO_free(bio);
1406 				if (dh == NULL && LogLevel > 7)
1407 				{
1408 					unsigned long err;
1409 
1410 					err = ERR_get_error();
1411 					sm_syslog(LOG_WARNING, NOQID,
1412 						  "STARTTLS=%s, error: cannot read DH parameters(%s): %s",
1413 						  who, dhparam,
1414 						  ERR_error_string(err, NULL));
1415 					tlslogerr(LOG_WARNING, 9, who);
1416 					SET_DH_DFL;
1417 				}
1418 			}
1419 			else
1420 			{
1421 				if (LogLevel > 5)
1422 				{
1423 					sm_syslog(LOG_WARNING, NOQID,
1424 						  "STARTTLS=%s, error: BIO_new_file(%s) failed",
1425 						  who, dhparam);
1426 					tlslogerr(LOG_WARNING, 9, who);
1427 				}
1428 			}
1429 		}
1430 # if MTA_DH_AUTO
1431 		if (dh == NULL && bitset(TLS_I_DHAUTO, req))
1432 			SSL_CTX_set_dh_auto(*ctx, 1);
1433 		else
1434 # endif
1435 		if (dh == NULL && bitset(TLS_I_DH1024|TLS_I_DH2048, req))
1436 		{
1437 			int bits;
1438 			DSA *dsa;
1439 
1440 			bits = bitset(TLS_I_DH2048, req) ? 2048 : 1024;
1441 			if (tTd(96, 2))
1442 				sm_dprintf("inittls: Generating %d bit DH parameters\n", bits);
1443 
1444 #  if MTA_HAVE_DSA_GENERATE_EX
1445 			dsa = DSA_new();
1446 			if (dsa != NULL)
1447 			{
1448 				r = DSA_generate_parameters_ex(dsa, bits, NULL,
1449 							0, NULL, NULL, NULL);
1450 				if (r != 0)
1451 					dh = DSA_dup_DH(dsa);
1452 			}
1453 #  else
1454 			/* this takes a while! */
1455 			dsa = DSA_generate_parameters(bits, NULL, 0, NULL,
1456 						      NULL, 0, NULL);
1457 			dh = DSA_dup_DH(dsa);
1458 #  endif
1459 			DSA_free(dsa);
1460 		}
1461 		else if (dh == NULL && bitset(TLS_I_DHFIXED, req))
1462 		{
1463 			if (tTd(96, 2))
1464 				sm_dprintf("inittls: Using precomputed 2048 bit DH parameters\n");
1465 			dh = get_dh2048();
1466 		}
1467 		else if (dh == NULL && bitset(TLS_I_DH512, req))
1468 		{
1469 			if (tTd(96, 2))
1470 				sm_dprintf("inittls: Using precomputed 512 bit DH parameters\n");
1471 			dh = get_dh512();
1472 		}
1473 		if (dh == NULL && !bitset(TLS_I_DHAUTO, req))
1474 		{
1475 			if (LogLevel > 9)
1476 			{
1477 				unsigned long err;
1478 
1479 				err = ERR_get_error();
1480 				sm_syslog(LOG_WARNING, NOQID,
1481 					  "STARTTLS=%s, error: cannot read or set DH parameters(%s): %s",
1482 					  who, dhparam,
1483 					  ERR_error_string(err, NULL));
1484 			}
1485 			if (bitset(TLS_I_REQ_DH, req))
1486 				return false;
1487 		}
1488 		else if (dh != NULL)
1489 		{
1490 			/* important to avoid small subgroup attacks */
1491 			SSL_CTX_set_options(*ctx, SSL_OP_SINGLE_DH_USE);
1492 
1493 			SSL_CTX_set_tmp_dh(*ctx, dh);
1494 			if (LogLevel > 13)
1495 				sm_syslog(LOG_INFO, NOQID,
1496 					  "STARTTLS=%s, Diffie-Hellman init, key=%d bit (%c)",
1497 					  who, 8 * DH_size(dh), *dhparam);
1498 			DH_free(dh);
1499 		}
1500 
1501 #  if TLS_EC == 2
1502 		SSL_CTX_set_options(*ctx, SSL_OP_SINGLE_ECDH_USE);
1503 		SSL_CTX_set_ecdh_auto(*ctx, 1);
1504 #  elif TLS_EC == 1
1505 		ecdh = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
1506 		if (ecdh != NULL)
1507 		{
1508 			SSL_CTX_set_options(*ctx, SSL_OP_SINGLE_ECDH_USE);
1509 			SSL_CTX_set_tmp_ecdh(*ctx, ecdh);
1510 			EC_KEY_free(ecdh);
1511 		}
1512 		else if (LogLevel > 9)
1513 		{
1514 			sm_syslog(LOG_WARNING, NOQID,
1515 				  "STARTTLS=%s, EC_KEY_new_by_curve_name(NID_X9_62_prime256v1)=failed, error=%s",
1516 				  who, ERR_error_string(ERR_get_error(), NULL));
1517 		}
1518 #  endif /* TLS_EC */
1519 
1520 	}
1521 # endif /* !NO_DH */
1522 
1523 	/* XXX do we need this cache here? */
1524 	if (bitset(TLS_I_CACHE, req))
1525 	{
1526 		SSL_CTX_sess_set_cache_size(*ctx, 1);
1527 		SSL_CTX_set_timeout(*ctx, 1);
1528 		SSL_CTX_set_session_id_context(*ctx,
1529 			(void *) &server_session_id_context,
1530 			sizeof(server_session_id_context));
1531 		(void) SSL_CTX_set_session_cache_mode(*ctx,
1532 				SSL_SESS_CACHE_SERVER);
1533 	}
1534 	else
1535 	{
1536 		(void) SSL_CTX_set_session_cache_mode(*ctx,
1537 				SSL_SESS_CACHE_OFF);
1538 	}
1539 
1540 	/* load certificate locations and default CA paths */
1541 	if (bitset(TLS_S_CERTP_EX, status) && bitset(TLS_S_CERTF_EX, status))
1542 	{
1543 		if ((r = SSL_CTX_load_verify_locations(*ctx, cacertfile,
1544 						       cacertpath)) == 1)
1545 		{
1546 # if !TLS_NO_RSA && MTA_RSA_TMP_CB
1547 			if (bitset(TLS_I_RSA_TMP, req))
1548 				SSL_CTX_set_tmp_rsa_callback(*ctx, tmp_rsa_key);
1549 # endif
1550 
1551 			if (srv)
1552 			{
1553 				SSL_CTX_set_client_CA_list(*ctx,
1554 					SSL_load_client_CA_file(cacertfile));
1555 			}
1556 		}
1557 		else
1558 		{
1559 			/*
1560 			**  can't load CA data; do we care?
1561 			**  the data is necessary to authenticate the client,
1562 			**  which in turn would be necessary
1563 			**  if we want to allow relaying based on it.
1564 			*/
1565 
1566 			if (LogLevel > 5)
1567 			{
1568 				sm_syslog(LOG_WARNING, NOQID,
1569 					  "STARTTLS=%s, error: load verify locs %s, %s failed: %d",
1570 					  who, cacertpath, cacertfile, r);
1571 				tlslogerr(LOG_WARNING,
1572 					bitset(TLS_I_VRFY_LOC, req) ? 8 : 9,
1573 					who);
1574 			}
1575 			if (bitset(TLS_I_VRFY_LOC, req))
1576 				return false;
1577 		}
1578 	}
1579 
1580 	/*
1581 	**  XXX currently we could call tls_set_verify()
1582 	**  but we hope that that function will later on
1583 	**  only set the mode per connection.
1584 	*/
1585 
1586 	SSL_CTX_set_verify(*ctx,
1587 		bitset(TLS_I_NO_VRFY, req) ? SSL_VERIFY_NONE
1588 					   : SSL_VERIFY_PEER,
1589 		NULL);
1590 
1591 	/*
1592 	**  Always use our callback instead of the builtin version.
1593 	**  We have to install our own verify callback:
1594 	**  SSL_VERIFY_PEER requests a client cert but even
1595 	**  though *FAIL_IF* isn't set, the connection
1596 	**  will be aborted if the client presents a cert
1597 	**  that is not "liked" (can't be verified?) by
1598 	**  the TLS library :-(
1599 	*/
1600 
1601 	SSL_CTX_set_cert_verify_callback(*ctx, tls_verify_cb, NULL);
1602 
1603 	/* XXX: make this dependent on an option? */
1604 	if (tTd(96, 9))
1605 		SSL_CTX_set_info_callback(*ctx, apps_ssl_info_cb);
1606 
1607 	/* install our own cipher list */
1608 	if (CipherList != NULL && *CipherList != '\0')
1609 	{
1610 		if (SSL_CTX_set_cipher_list(*ctx, CipherList) <= 0)
1611 		{
1612 			if (LogLevel > 7)
1613 			{
1614 				sm_syslog(LOG_WARNING, NOQID,
1615 					  "STARTTLS=%s, error: SSL_CTX_set_cipher_list(%s) failed, list ignored",
1616 					  who, CipherList);
1617 
1618 				tlslogerr(LOG_WARNING, 9, who);
1619 			}
1620 			/* failure if setting to this list is required? */
1621 		}
1622 	}
1623 
1624 # if MTA_HAVE_TLSv1_3
1625 	/* install our own cipher suites */
1626 	if (!SM_IS_EMPTY(CipherSuites))
1627 	{
1628 		if (SSL_CTX_set_ciphersuites(*ctx, CipherSuites) <= 0)
1629 		{
1630 			if (LogLevel > 7)
1631 			{
1632 				sm_syslog(LOG_WARNING, NOQID,
1633 					  "STARTTLS=%s, error: SSL_CTX_set_ciphersuites(%s) failed, suites ignored",
1634 					  who, CipherSuites);
1635 
1636 				tlslogerr(LOG_WARNING, 9, who);
1637 			}
1638 			/* failure if setting to this suites is required? */
1639 		}
1640 	}
1641 # endif /* MTA_HAVE_TLSv1_3 */
1642 
1643 	if (LogLevel > 12)
1644 		sm_syslog(LOG_INFO, NOQID, "STARTTLS=%s, init=%d", who, ok);
1645 
1646 # if 0
1647 	/*
1648 	**  this label is required if we want to have a "clean" exit
1649 	**  see the comments above at the initialization of cf2
1650 	*/
1651 
1652     endinittls:
1653 # endif /* 0 */
1654 
1655 	/* undo damage to global variables */
1656 	if (cf2 != NULL)
1657 		*--cf2 = ',';
1658 	if (kf2 != NULL)
1659 		*--kf2 = ',';
1660 
1661 	return ok;
1662 }
1663 
1664 /*
1665 **  CERT_FP -- get cert fingerprint
1666 **
1667 **	Parameters:
1668 **		cert -- TLS cert
1669 **		evp_digest -- digest algorithm
1670 **		mac -- macro storage
1671 **		macro -- where to store cert fp
1672 **
1673 **	Returns:
1674 **		<=0: cert fp calculation failed
1675 **		>0: cert fp calculation ok
1676 */
1677 
1678 static int
1679 cert_fp(cert, evp_digest, mac, macro)
1680 	X509 *cert;
1681 	const EVP_MD *evp_digest;
1682 	MACROS_T *mac;
1683 	char *macro;
1684 {
1685 	unsigned int n;
1686 	int r;
1687 	unsigned char md[EVP_MAX_MD_SIZE];
1688 	char md5h[EVP_MAX_MD_SIZE * 3];
1689 	static const char hexcodes[] = "0123456789ABCDEF";
1690 
1691 	n = 0;
1692 	if ((r = X509_digest(cert, evp_digest, md, &n)) == 0 || n <= 0)
1693 	{
1694 		macdefine(mac, A_TEMP, macid(macro), "");
1695 		return (0 == r) ? 0 : n;
1696 	}
1697 
1698 	SM_ASSERT((n * 3) + 2 < sizeof(md5h));
1699 	for (r = 0; r < (int) n; r++)
1700 	{
1701 		md5h[r * 3] = hexcodes[(md[r] & 0xf0) >> 4];
1702 		md5h[(r * 3) + 1] = hexcodes[(md[r] & 0x0f)];
1703 		md5h[(r * 3) + 2] = ':';
1704 	}
1705 	md5h[(n * 3) - 1] = '\0';
1706 	macdefine(mac, A_TEMP, macid(macro), md5h);
1707 	return 1;
1708 }
1709 
1710 /* host for logging */
1711 #define whichhost	host == NULL ? "local" : host
1712 
1713 # if _FFR_TLS_ALTNAMES
1714 
1715 /*
1716 **  CLEARCLASS -- clear the specified class (called from stabapply)
1717 **
1718 **	Parameters:
1719 **		s -- STAB
1720 **		id -- class id
1721 **
1722 **	Returns:
1723 **		none.
1724 */
1725 
1726 static void
1727 clearclass(s, id)
1728 	STAB *s;
1729 	int id;
1730 {
1731 	if (s->s_symtype != ST_CLASS)
1732 		return;
1733 	if (bitnset(bitidx(id), s->s_class))
1734 		clrbitn(bitidx(id), s->s_class);
1735 }
1736 
1737 /*
1738 **  GETALTNAMES -- set subject_alt_name
1739 **
1740 **	Parameters:
1741 **		cert -- cert
1742 **		srv -- server side?
1743 **		host -- hostname of other side
1744 **
1745 **	Returns:
1746 **		none.
1747 */
1748 
1749 static void
1750 getaltnames(cert, srv, host)
1751 	X509 *cert;
1752 	bool srv;
1753 	const char *host;
1754 {
1755 	STACK_OF(GENERAL_NAME) *gens;
1756 	int i, j, len, r;
1757 	const GENERAL_NAME *gn;
1758 	char *dnsname, *who;
1759 
1760 	if (!SetCertAltnames)
1761 		return;
1762 	who = srv ? "server" : "client";
1763 	gens = X509_get_ext_d2i(cert, NID_subject_alt_name, 0, 0);
1764 	if (gens == NULL)
1765 		return;
1766 
1767 	r = sk_GENERAL_NAME_num(gens);
1768 	for (i = 0; i < r; i++)
1769 	{
1770 		gn = sk_GENERAL_NAME_value(gens, i);
1771 		if (gn == NULL || gn->type != GEN_DNS)
1772 			continue;
1773 
1774 		/* Ensure data is IA5 */
1775 		if (ASN1_STRING_type(gn->d.ia5) != V_ASN1_IA5STRING)
1776 		{
1777 			if (LogLevel > 6)
1778 				sm_syslog(LOG_INFO, NOQID,
1779 					"STARTTLS=%s, relay=%.100s, field=AltName, status=value contains non IA5",
1780 					who, whichhost);
1781 			continue;
1782 		}
1783 		dnsname = (char *) MTA_ASN1_STRING_data(gn->d.ia5);
1784 		if (dnsname == NULL)
1785 			continue;
1786 		len = ASN1_STRING_length(gn->d.ia5);
1787 
1788 		/*
1789 		**  "remove" trailing NULs (except for one of course),
1790 		**  those can happen and are OK (not a sign of an attack)
1791 		*/
1792 
1793 		while (len > 0 && '\0' == dnsname[len - 1])
1794 			len--;
1795 
1796 #define ISPRINT(c)	(isascii(c) && isprint(c))
1797 
1798 		/* just check for printable char for now */
1799 		for (j = 0; j < len && ISPRINT(dnsname[j]); j++)
1800 			;
1801 		if (dnsname[j] != '\0' || len != j)
1802 			continue;
1803 
1804 		setclass(macid("{cert_altnames}"), xtextify(dnsname, "<>\")"));
1805 		if (LogLevel > 14)
1806 			sm_syslog(LOG_DEBUG, NOQID,
1807 				"STARTTLS=%s, relay=%.100s, AltName=%s",
1808 				who, whichhost, xtextify(dnsname, "<>\")"));
1809 	}
1810 }
1811 # else
1812 #  define getaltnames(cert, srv, host)
1813 # endif /* _FFR_TLS_ALTNAMES */
1814 
1815 # if DANE
1816 
1817 /*
1818 **  DANE_RES -- get DANE result if possible
1819 **
1820 **	Parameters:
1821 **		ssl -- TLS connection structure
1822 **		dane_vrfy_ctx -- dane verify context
1823 **
1824 **	Returns:
1825 **		SM_SUCCESS: DANE result dane_vrfy_res is valid
1826 **		SM_NOTDONE: DANE checking not enabled
1827 **		<0: some error
1828 */
1829 
1830 static int dane_res __P((SSL *, dane_vrfy_ctx_P));
1831 
1832 static int
1833 dane_res(ssl, dane_vrfy_ctx)
1834 	SSL *ssl;
1835 	dane_vrfy_ctx_P dane_vrfy_ctx;
1836 {
1837 #  if HAVE_SSL_CTX_dane_enable
1838 	int depth, r;
1839 	EVP_PKEY *mspki;
1840 	uint8_t usage, selector, mtype;
1841 	unsigned const char *rr;
1842 	size_t rrlen;
1843 #  endif
1844 
1845 	if (NULL == dane_vrfy_ctx)
1846 	{
1847 		/* can this happen? should it be logged? */
1848 		if (tTd(96, 20))
1849 			sm_dprintf("ERROR: dane_res: dane_vrfy_ctx=NULL\n");
1850 		return SM_NOTDONE;
1851 	}
1852 	if (tTd(96, 20))
1853 		sm_dprintf("dane_res: dane_vrfy_dane_enabled=%d, chk=%#x, res=%d\n",
1854 			dane_vrfy_ctx->dane_vrfy_dane_enabled,
1855 			dane_vrfy_ctx->dane_vrfy_chk,
1856 			dane_vrfy_ctx->dane_vrfy_res);
1857 	if (!VRFY_DANE(dane_vrfy_ctx->dane_vrfy_chk))
1858 	{
1859 		dane_vrfy_ctx->dane_vrfy_res = DANE_VRFY_NONE;
1860 		return SM_NOTDONE;
1861 	}
1862 	if (dane_vrfy_ctx->dane_vrfy_chk & TLSAFLTEMPVRFY)
1863 	{
1864 		dane_vrfy_ctx->dane_vrfy_res = DANE_VRFY_TEMP;
1865 		return SM_SUCCESS;
1866 	}
1867 	if (!dane_vrfy_ctx->dane_vrfy_dane_enabled)
1868 	{
1869 		if (DANE_VRFY_NONE == dane_vrfy_ctx->dane_vrfy_res)
1870 			return SM_NOTDONE;
1871 		return SM_SUCCESS;
1872 	}
1873 
1874 #  if HAVE_SSL_CTX_dane_enable
1875 	mspki = NULL;
1876 	depth = SSL_get0_dane_authority(ssl, NULL, &mspki);
1877 	if (tTd(96, 20))
1878 		sm_dprintf("dane_res: SSL_get0_dane_authority() depth=%d\n", depth);
1879 
1880 	if (depth < 0)
1881 	{
1882 		dane_vrfy_ctx->dane_vrfy_res = DANE_VRFY_FAIL;
1883 		return SM_SUCCESS;
1884 	}
1885 
1886 	dane_vrfy_ctx->dane_vrfy_res = DANE_VRFY_OK;
1887 	r = SSL_get0_dane_tlsa(ssl, &usage, &selector, &mtype, &rr, &rrlen);
1888 	if (tTd(96, 20))
1889 		sm_dprintf("dane_res: SSL_get0_dane_tlsa=%d, status=%s\n", r,
1890 			(mspki != NULL) ? "TA_public_key_verified_certificate"
1891 			: (depth > 0) ? "matched_TA_certificate"
1892 				: "matched_EE_certificate");
1893 
1894 	if (LogLevel > 11)
1895 	{
1896 		/* just for logging */
1897 		if (r >= 0 && rr != NULL && rrlen > 0)
1898 		{
1899 			(void) data2hex((unsigned char *)rr, rrlen,
1900 				(unsigned char *)dane_vrfy_ctx->dane_vrfy_fp,
1901 				sizeof(dane_vrfy_ctx->dane_vrfy_fp));
1902 		}
1903 
1904 		sm_syslog(LOG_DEBUG, NOQID,
1905 			"DANE_depth=%d, DANE_res=%d, SSL_get0_dane_tlsa=%d, fp=%s, status=%s",
1906 			depth, dane_vrfy_ctx->dane_vrfy_res, r,
1907 			dane_vrfy_ctx->dane_vrfy_fp,
1908 			(mspki != NULL) ? "TA_public_key_verified_certificate" :
1909 				(depth > 0) ? "matched_TA_certificate" : "matched_EE_certificate"
1910 		);
1911 	}
1912 #  else
1913 	SM_ASSERT(!dane_vrfy_ctx->dane_vrfy_dane_enabled);
1914 #  endif /* HAVE_SSL_CTX_dane_enable */
1915 	return SM_SUCCESS;
1916 }
1917 # endif /* DANE */
1918 
1919 /*
1920 **  TLS_GET_INFO -- get information about TLS connection
1921 **
1922 **	Parameters:
1923 **		ssl -- TLS session context
1924 **		srv -- server side?
1925 **		host -- hostname of other side
1926 **		mac -- macro storage
1927 **		certreq -- did we ask for a cert?
1928 **
1929 **	Returns:
1930 **		result of authentication.
1931 **
1932 **	Side Effects:
1933 **		sets various TLS related macros.
1934 */
1935 
1936 int
1937 tls_get_info(ssl, srv, host, mac, certreq)
1938 	SSL *ssl;
1939 	bool srv;
1940 	char *host;
1941 	MACROS_T *mac;
1942 	bool certreq;
1943 {
1944 	const SSL_CIPHER *c;
1945 	int b, r;
1946 	long verifyok;
1947 	char *s, *who;
1948 	char bitstr[16];
1949 	X509 *cert;
1950 # if DANE
1951 	dane_vrfy_ctx_P dane_vrfy_ctx;
1952 	dane_tlsa_P dane_tlsa;
1953 # endif
1954 
1955 	c = SSL_get_current_cipher(ssl);
1956 
1957 	/* cast is just workaround for compiler warning */
1958 	macdefine(mac, A_TEMP, macid("{cipher}"),
1959 		  (char *) SSL_CIPHER_get_name(c));
1960 	b = SSL_CIPHER_get_bits(c, &r);
1961 	(void) sm_snprintf(bitstr, sizeof(bitstr), "%d", b);
1962 	macdefine(mac, A_TEMP, macid("{cipher_bits}"), bitstr);
1963 	(void) sm_snprintf(bitstr, sizeof(bitstr), "%d", r);
1964 	macdefine(mac, A_TEMP, macid("{alg_bits}"), bitstr);
1965 	s = (char *) SSL_get_version(ssl);
1966 	if (s == NULL)
1967 		s = "UNKNOWN";
1968 	macdefine(mac, A_TEMP, macid("{tls_version}"), s);
1969 
1970 	who = srv ? "server" : "client";
1971 	cert = MTA_SSL_get_peer_certificate(ssl);
1972 	verifyok = SSL_get_verify_result(ssl);
1973 	if (LogLevel > 14)
1974 		sm_syslog(LOG_INFO, NOQID,
1975 			  "STARTTLS=%s, get_verify: %ld get_peer: 0x%lx",
1976 			  who, verifyok, (unsigned long) cert);
1977 # if _FFR_TLS_ALTNAMES
1978 	stabapply(clearclass, macid("{cert_altnames}"));
1979 # endif
1980 	if (cert != NULL)
1981 	{
1982 		X509_NAME *subj, *issuer;
1983 		char buf[MAXNAME];	/* EAI: not affected */
1984 
1985 		subj = X509_get_subject_name(cert);
1986 		issuer = X509_get_issuer_name(cert);
1987 		X509_NAME_oneline(subj, buf, sizeof(buf));
1988 		macdefine(mac, A_TEMP, macid("{cert_subject}"),
1989 			 xtextify(buf, "<>\")"));
1990 		X509_NAME_oneline(issuer, buf, sizeof(buf));
1991 		macdefine(mac, A_TEMP, macid("{cert_issuer}"),
1992 			 xtextify(buf, "<>\")"));
1993 
1994 #  define LL_BADCERT	8
1995 
1996 #define CERTFPMACRO (CertFingerprintAlgorithm != NULL ? "{cert_fp}" : "{cert_md5}")
1997 
1998 #define CHECK_X509_NAME(which)	\
1999 	do {	\
2000 		if (r == -1)	\
2001 		{		\
2002 			sm_strlcpy(buf, "BadCertificateUnknown", sizeof(buf)); \
2003 			if (LogLevel > LL_BADCERT)	\
2004 				sm_syslog(LOG_INFO, NOQID,	\
2005 					"STARTTLS=%s, relay=%.100s, field=%s, status=failed to extract CN",	\
2006 					who, whichhost,	which);	\
2007 		}		\
2008 		else if ((size_t)r >= sizeof(buf) - 1)	\
2009 		{		\
2010 			sm_strlcpy(buf, "BadCertificateTooLong", sizeof(buf)); \
2011 			if (LogLevel > 7)	\
2012 				sm_syslog(LOG_INFO, NOQID,	\
2013 					"STARTTLS=%s, relay=%.100s, field=%s, status=CN too long",	\
2014 					who, whichhost, which);	\
2015 		}		\
2016 		else if ((size_t)r > strlen(buf))	\
2017 		{		\
2018 			sm_strlcpy(buf, "BadCertificateContainsNUL",	\
2019 				sizeof(buf));	\
2020 			if (LogLevel > 7)	\
2021 				sm_syslog(LOG_INFO, NOQID,	\
2022 					"STARTTLS=%s, relay=%.100s, field=%s, status=CN contains NUL",	\
2023 					who, whichhost, which);	\
2024 		}		\
2025 	} while (0)
2026 
2027 		r = X509_NAME_get_text_by_NID(subj, NID_commonName, buf,
2028 			sizeof buf);
2029 		CHECK_X509_NAME("cn_subject");
2030 		macdefine(mac, A_TEMP, macid("{cn_subject}"),
2031 			 xtextify(buf, "<>\")"));
2032 		r = X509_NAME_get_text_by_NID(issuer, NID_commonName, buf,
2033 			sizeof buf);
2034 		CHECK_X509_NAME("cn_issuer");
2035 		macdefine(mac, A_TEMP, macid("{cn_issuer}"),
2036 			 xtextify(buf, "<>\")"));
2037 		r = cert_fp(cert, EVP_digest, mac, CERTFPMACRO);
2038 		if (r <= 0 && LogLevel > 8)
2039 		{
2040 			sm_syslog(LOG_WARNING, NOQID,
2041 				"STARTTLS=%s, relay=%.100s, X509_digest=%d, CertFingerprintAlgorithm=%s",
2042 				who, whichhost, r,
2043 				(NULL == CertFingerprintAlgorithm) ? "md5" :
2044 				CertFingerprintAlgorithm);
2045 			tlslogerr(LOG_WARNING, 8, who);
2046 		}
2047 		getaltnames(cert, srv, host);
2048 	}
2049 	else
2050 	{
2051 		macdefine(mac, A_PERM, macid("{cert_subject}"), "");
2052 		macdefine(mac, A_PERM, macid("{cert_issuer}"), "");
2053 		macdefine(mac, A_PERM, macid("{cn_subject}"), "");
2054 		macdefine(mac, A_PERM, macid("{cn_issuer}"), "");
2055 		macdefine(mac, A_TEMP, macid(CERTFPMACRO), "");
2056 	}
2057 # if DANE
2058 	dane_vrfy_ctx = NULL;
2059 	dane_tlsa = NULL;
2060 	if (TLSsslidx >= 0)
2061 	{
2062 		tlsi_ctx_T *tlsi_ctx;
2063 
2064 		tlsi_ctx = (tlsi_ctx_P) SSL_get_ex_data(ssl, TLSsslidx);
2065 		if (tlsi_ctx != NULL)
2066 		{
2067 			dane_vrfy_ctx = &(tlsi_ctx->tlsi_dvc);
2068 			dane_tlsa = dane_get_tlsa(dane_vrfy_ctx);
2069 		}
2070 	}
2071 
2072 #  define DANE_VRFY_RES_IS(r) \
2073 	((dane_vrfy_ctx != NULL) && dane_vrfy_ctx->dane_vrfy_res == (r))
2074 
2075 	if (tTd(96, 10))
2076 		sm_dprintf("tls_get_info: verifyok=%d, dane_vrfy_res=%d\n",
2077 			(int)verifyok,
2078 			(dane_vrfy_ctx != NULL) ? dane_vrfy_ctx->dane_vrfy_res : -999);
2079 	if (SM_SUCCESS == dane_res(ssl, dane_vrfy_ctx))
2080 	{
2081 		if (DANE_VRFY_RES_IS(DANE_VRFY_OK))
2082 		{
2083 			s = "TRUSTED";
2084 			r = TLS_AUTH_OK;
2085 		}
2086 		else if (DANE_VRFY_RES_IS(DANE_VRFY_TEMP))
2087 		{
2088 			s = "DANE_TEMP";
2089 			r = TLS_AUTH_TEMP;
2090 		}
2091 		else if (DANE_VRFY_RES_IS(DANE_VRFY_FAIL))
2092 		{
2093 			if (dane_tlsa != NULL &&
2094 			    TLSA_IS_FL(dane_tlsa, TLSAFL2MANY))
2095 			{
2096 				s = "DANE_TEMP";
2097 				r = TLS_AUTH_TEMP;
2098 			}
2099 			else
2100 			{
2101 				s = "DANE_FAIL";
2102 				r = TLS_AUTH_FAIL;
2103 			}
2104 		}
2105 		else {
2106 			s = "BOGUS_DANE_RES";
2107 			r = TLS_AUTH_FAIL;
2108 		}
2109 	}
2110 	else
2111 # endif /* if DANE */
2112 	/* "else" in #if code above */
2113 	switch (verifyok)
2114 	{
2115 	  case X509_V_OK:
2116 		if (cert != NULL)
2117 		{
2118 			s = "OK";
2119 			r = TLS_AUTH_OK;
2120 		}
2121 		else
2122 		{
2123 			s = certreq ? "NO" : "NOT",
2124 			r = TLS_AUTH_NO;
2125 		}
2126 		break;
2127 
2128 	  default:
2129 		s = "FAIL";
2130 		r = TLS_AUTH_FAIL;
2131 		break;
2132 	}
2133 	macdefine(mac, A_PERM, macid("{verify}"), s);
2134 	if (cert != NULL)
2135 		X509_free(cert);
2136 
2137 	/* do some logging */
2138 	if (LogLevel > 8)
2139 	{
2140 		char *vers, *s1, *s2, *cbits, *algbits;
2141 
2142 		vers = macget(mac, macid("{tls_version}"));
2143 		cbits = macget(mac, macid("{cipher_bits}"));
2144 		algbits = macget(mac, macid("{alg_bits}"));
2145 
2146 		/* XXX: use s directly? */
2147 		s1 = macget(mac, macid("{verify}"));
2148 		s2 = macget(mac, macid("{cipher}"));
2149 
2150 # if DANE
2151 #  define LOG_DANE_FP	\
2152 	('\0' != dane_vrfy_ctx->dane_vrfy_fp[0] && DANE_VRFY_RES_IS(DANE_VRFY_FAIL))
2153 # endif
2154 		/* XXX: maybe cut off ident info? */
2155 		sm_syslog(LOG_INFO, NOQID,
2156 			  "STARTTLS=%s, relay=%.100s, version=%.16s, verify=%.16s, cipher=%.64s, bits=%.6s/%.6s%s%s%s%s",
2157 			  who,
2158 			  host == NULL ? "local" : host,
2159 			  vers, s1, s2, /* sm_snprintf() can deal with NULL */
2160 			  algbits == NULL ? "0" : algbits,
2161 			  cbits == NULL ? "0" : cbits
2162 # if DANE
2163 			, LOG_DANE_FP ? ", pubkey_fp=" : ""
2164 			, LOG_DANE_FP ? dane_vrfy_ctx->dane_vrfy_fp : ""
2165 			, (dane_tlsa != NULL
2166 			    && TLSA_IS_FL(dane_tlsa, TLSAFLUNS)
2167 			    && !TLSA_IS_FL(dane_tlsa, TLSAFLSUP)
2168 			   && DANE_VRFY_RES_IS(DANE_VRFY_NONE))
2169 			  ? ONLYUNSUPTLSARR : ""
2170 			, (dane_tlsa != NULL
2171 			   && TLSA_IS_FL(dane_tlsa, TLSAFL2MANY))
2172 			  && DANE_VRFY_RES_IS(DANE_VRFY_FAIL)
2173 			  ? ", note=too many TLSA RRs" : ""
2174 # else
2175 			, "", "", "", ""
2176 # endif
2177 			);
2178 		if (LogLevel > 11)
2179 		{
2180 			/*
2181 			**  Maybe run xuntextify on the strings?
2182 			**  That is easier to read but makes it maybe a bit
2183 			**  more complicated to figure out the right values
2184 			**  for the access map...
2185 			*/
2186 
2187 			s1 = macget(mac, macid("{cert_subject}"));
2188 			s2 = macget(mac, macid("{cert_issuer}"));
2189 			sm_syslog(LOG_INFO, NOQID,
2190 				  "STARTTLS=%s, cert-subject=%.256s, cert-issuer=%.256s, verifymsg=%s",
2191 				  who, s1, s2,
2192 				  X509_verify_cert_error_string(verifyok));
2193 		}
2194 	}
2195 	return r;
2196 }
2197 
2198 /*
2199 **  ENDTLS -- shut down secure connection
2200 **
2201 **	Parameters:
2202 **		pssl -- pointer to TLS session context
2203 **		who -- server/client (for logging).
2204 **
2205 **	Returns:
2206 **		success? (EX_* code)
2207 */
2208 
2209 int
2210 endtls(pssl, who)
2211 	SSL **pssl;
2212 	const char *who;
2213 {
2214 	SSL *ssl;
2215 	int ret, r;
2216 
2217 	SM_REQUIRE(pssl != NULL);
2218 	ret = EX_OK;
2219 	ssl = *pssl;
2220 	if (ssl == NULL)
2221 		return ret;
2222 
2223 	if ((r = SSL_shutdown(ssl)) < 0)
2224 	{
2225 		if (LogLevel > 11)
2226 		{
2227 			sm_syslog(LOG_WARNING, NOQID,
2228 				  "STARTTLS=%s, SSL_shutdown failed: %d",
2229 				  who, r);
2230 			tlslogerr(LOG_WARNING, 11, who);
2231 		}
2232 		ret = EX_SOFTWARE;
2233 	}
2234 
2235 	/*
2236 	**  Bug in OpenSSL (at least up to 0.9.6b):
2237 	**  From: Lutz.Jaenicke@aet.TU-Cottbus.DE
2238 	**  Message-ID: <20010723152244.A13122@serv01.aet.tu-cottbus.de>
2239 	**  To: openssl-users@openssl.org
2240 	**  Subject: Re: SSL_shutdown() woes (fwd)
2241 	**
2242 	**  The side sending the shutdown alert first will
2243 	**  not care about the answer of the peer but will
2244 	**  immediately return with a return value of "0"
2245 	**  (ssl/s3_lib.c:ssl3_shutdown()). SSL_get_error will evaluate
2246 	**  the value of "0" and as the shutdown alert of the peer was
2247 	**  not received (actually, the program did not even wait for
2248 	**  the answer), an SSL_ERROR_SYSCALL is flagged, because this
2249 	**  is the default rule in case everything else does not apply.
2250 	**
2251 	**  For your server the problem is different, because it
2252 	**  receives the shutdown first (setting SSL_RECEIVED_SHUTDOWN),
2253 	**  then sends its response (SSL_SENT_SHUTDOWN), so for the
2254 	**  server the shutdown was successful.
2255 	**
2256 	**  As is by know, you would have to call SSL_shutdown() once
2257 	**  and ignore an SSL_ERROR_SYSCALL returned. Then call
2258 	**  SSL_shutdown() again to actually get the server's response.
2259 	**
2260 	**  In the last discussion, Bodo Moeller concluded that a
2261 	**  rewrite of the shutdown code would be necessary, but
2262 	**  probably with another API, as the change would not be
2263 	**  compatible to the way it is now.  Things do not become
2264 	**  easier as other programs do not follow the shutdown
2265 	**  guidelines anyway, so that a lot error conditions and
2266 	**  compitibility issues would have to be caught.
2267 	**
2268 	**  For now the recommondation is to ignore the error message.
2269 	*/
2270 
2271 	else if (r == 0)
2272 	{
2273 		if (LogLevel > 15)
2274 		{
2275 			sm_syslog(LOG_WARNING, NOQID,
2276 				  "STARTTLS=%s, SSL_shutdown not done",
2277 				  who);
2278 			tlslogerr(LOG_WARNING, 15, who);
2279 		}
2280 		ret = EX_SOFTWARE;
2281 	}
2282 	SM_SSL_FREE(*pssl);
2283 	return ret;
2284 }
2285 
2286 # if !TLS_NO_RSA && MTA_RSA_TMP_CB
2287 /*
2288 **  TMP_RSA_KEY -- return temporary RSA key
2289 **
2290 **	Parameters:
2291 **		ssl -- TLS session context
2292 **		export --
2293 **		keylength --
2294 **
2295 **	Returns:
2296 **		temporary RSA key.
2297 */
2298 
2299 #  ifndef MAX_RSA_TMP_CNT
2300 #   define MAX_RSA_TMP_CNT	1000	/* XXX better value? */
2301 #  endif
2302 
2303 /* ARGUSED0 */
2304 static RSA *
2305 tmp_rsa_key(s, export, keylength)
2306 	SSL *s;
2307 	int export;
2308 	int keylength;
2309 {
2310 #  if SM_CONF_SHM
2311 	extern int ShmId;
2312 	extern int *PRSATmpCnt;
2313 
2314 	if (ShmId != SM_SHM_NO_ID && rsa_tmp != NULL &&
2315 	    ++(*PRSATmpCnt) < MAX_RSA_TMP_CNT)
2316 		return rsa_tmp;
2317 #  endif /* SM_CONF_SHM */
2318 
2319 	if (rsa_tmp != NULL)
2320 		RSA_free(rsa_tmp);
2321 	rsa_tmp = RSA_generate_key(RSA_KEYLENGTH, RSA_F4, NULL, NULL);
2322 	if (rsa_tmp == NULL)
2323 	{
2324 		if (LogLevel > 0)
2325 			sm_syslog(LOG_ERR, NOQID,
2326 				  "STARTTLS=server, tmp_rsa_key: RSA_generate_key failed!");
2327 	}
2328 	else
2329 	{
2330 #  if SM_CONF_SHM
2331 #   if 0
2332 		/*
2333 		**  XXX we can't (yet) share the new key...
2334 		**	The RSA structure contains pointers hence it can't be
2335 		**	easily kept in shared memory.  It must be transformed
2336 		**	into a continuous memory region first, then stored,
2337 		**	and later read out again (each time re-transformed).
2338 		*/
2339 
2340 		if (ShmId != SM_SHM_NO_ID)
2341 			*PRSATmpCnt = 0;
2342 #   endif /* 0 */
2343 #  endif /* SM_CONF_SHM */
2344 		if (LogLevel > 9)
2345 			sm_syslog(LOG_ERR, NOQID,
2346 				  "STARTTLS=server, tmp_rsa_key: new temp RSA key");
2347 	}
2348 	return rsa_tmp;
2349 }
2350 # endif /* !TLS_NO_RSA && MTA_RSA_TMP_CB */
2351 
2352 /*
2353 **  APPS_SSL_INFO_CB -- info callback for TLS connections
2354 **
2355 **	Parameters:
2356 **		ssl -- TLS session context
2357 **		where -- state in handshake
2358 **		ret -- return code of last operation
2359 **
2360 **	Returns:
2361 **		none.
2362 */
2363 
2364 static void
2365 apps_ssl_info_cb(ssl, where, ret)
2366 	const SSL *ssl;
2367 	int where;
2368 	int ret;
2369 {
2370 	int w;
2371 	char *str;
2372 	BIO *bio_err = NULL;
2373 
2374 	if (LogLevel > 14)
2375 		sm_syslog(LOG_INFO, NOQID,
2376 			  "STARTTLS: info_callback where=0x%x, ret=%d",
2377 			  where, ret);
2378 
2379 	w = where & ~SSL_ST_MASK;
2380 	if (bio_err == NULL)
2381 		bio_err = BIO_new_fp(stderr, BIO_NOCLOSE);
2382 
2383 	if (bitset(SSL_ST_CONNECT, w))
2384 		str = "SSL_connect";
2385 	else if (bitset(SSL_ST_ACCEPT, w))
2386 		str = "SSL_accept";
2387 	else
2388 		str = "undefined";
2389 
2390 	if (bitset(SSL_CB_LOOP, where))
2391 	{
2392 		if (LogLevel > 12)
2393 			sm_syslog(LOG_NOTICE, NOQID,
2394 				"STARTTLS: %s:%s",
2395 				str, SSL_state_string_long(ssl));
2396 	}
2397 	else if (bitset(SSL_CB_ALERT, where))
2398 	{
2399 		str = bitset(SSL_CB_READ, where) ? "read" : "write";
2400 		if (LogLevel > 12)
2401 			sm_syslog(LOG_NOTICE, NOQID,
2402 				"STARTTLS: SSL3 alert %s:%s:%s",
2403 				str, SSL_alert_type_string_long(ret),
2404 				SSL_alert_desc_string_long(ret));
2405 	}
2406 	else if (bitset(SSL_CB_EXIT, where))
2407 	{
2408 		if (ret == 0)
2409 		{
2410 			if (LogLevel > 7)
2411 				sm_syslog(LOG_WARNING, NOQID,
2412 					"STARTTLS: %s:failed in %s",
2413 					str, SSL_state_string_long(ssl));
2414 		}
2415 		else if (ret < 0)
2416 		{
2417 			if (LogLevel > 7)
2418 				sm_syslog(LOG_WARNING, NOQID,
2419 					"STARTTLS: %s:error in %s",
2420 					str, SSL_state_string_long(ssl));
2421 		}
2422 	}
2423 }
2424 
2425 /*
2426 **  TLS_VERIFY_LOG -- log verify error for TLS certificates
2427 **
2428 **	Parameters:
2429 **		ok -- verify ok?
2430 **		ctx -- X509 context
2431 **		name -- from where is this called?
2432 **
2433 **	Returns:
2434 **		1 -- ok
2435 */
2436 
2437 static int
2438 tls_verify_log(ok, ctx, name)
2439 	int ok;
2440 	X509_STORE_CTX *ctx;
2441 	const char *name;
2442 {
2443 	X509 *cert;
2444 	int reason, depth;
2445 	char buf[512];
2446 
2447 	cert = X509_STORE_CTX_get_current_cert(ctx);
2448 	reason = X509_STORE_CTX_get_error(ctx);
2449 	depth = X509_STORE_CTX_get_error_depth(ctx);
2450 	X509_NAME_oneline(X509_get_subject_name(cert), buf, sizeof(buf));
2451 	sm_syslog(LOG_INFO, NOQID,
2452 		  "STARTTLS: %s cert verify: depth=%d %s, state=%d, reason=%s",
2453 		  name, depth, buf, ok, X509_verify_cert_error_string(reason));
2454 	return 1;
2455 }
2456 
2457 /*
2458 **  Declaration and access to tlsi_ctx in callbacks.
2459 */
2460 
2461 #define SM_DECTLSI	\
2462 	tlsi_ctx_T *tlsi_ctx;	\
2463 	SSL *ssl
2464 #define SM_GETTLSI	\
2465 	do {		\
2466 		tlsi_ctx = NULL;	\
2467 		if (TLSsslidx >= 0)	\
2468 		{	\
2469 			ssl = (SSL *) X509_STORE_CTX_get_ex_data(ctx,	\
2470 				SSL_get_ex_data_X509_STORE_CTX_idx());	\
2471 			if (ssl != NULL)	\
2472 				tlsi_ctx = (tlsi_ctx_P) SSL_get_ex_data(ssl, TLSsslidx);	\
2473 		}	\
2474 	}	\
2475 	while (0)
2476 
2477 # if DANE
2478 
2479 /*
2480 **  DANE_GET_TLSA -- Retrieve TLSA RR for DANE
2481 **
2482 **	Parameters:
2483 **		dane_vrfy_ctx -- dane verify context
2484 **
2485 **	Returns:
2486 **		dane_tlsa if TLSA RR is available
2487 **		NULL otherwise
2488 */
2489 
2490 dane_tlsa_P
2491 dane_get_tlsa(dane_vrfy_ctx)
2492 	dane_vrfy_ctx_P dane_vrfy_ctx;
2493 {
2494 	STAB *s;
2495 	dane_tlsa_P dane_tlsa;
2496 
2497 	dane_tlsa = NULL;
2498 	if (NULL == dane_vrfy_ctx)
2499 		return NULL;
2500 	if (!CHK_DANE(dane_vrfy_ctx->dane_vrfy_chk) ||
2501 	    dane_vrfy_ctx->dane_vrfy_host == NULL)
2502 		return NULL;
2503 
2504 	gettlsa(dane_vrfy_ctx->dane_vrfy_host, NULL, &s,
2505 		TLSAFLNOEXP, 0, dane_vrfy_ctx->dane_vrfy_port);
2506 	if (NULL == s)
2507 		goto notfound;
2508 	dane_tlsa = s->s_tlsa;
2509 	if (NULL == dane_tlsa)
2510 		goto notfound;
2511 	if (!TLSA_HAS_RRs(dane_tlsa))
2512 		goto notfound;
2513 	if (tTd(96, 4))
2514 		sm_dprintf("dane_get_tlsa: chk=%#x, host=%s, n=%d, stat=entry found\n",
2515 			dane_vrfy_ctx->dane_vrfy_chk,
2516 			dane_vrfy_ctx->dane_vrfy_host, dane_tlsa->dane_tlsa_n);
2517 	return dane_tlsa;
2518 
2519   notfound:
2520 	if (tTd(96, 4))
2521 		sm_dprintf("dane_get_tlsa: chk=%#x, host=%s, stat=no valid entry found\n",
2522 			dane_vrfy_ctx->dane_vrfy_chk,
2523 			dane_vrfy_ctx->dane_vrfy_host);
2524 	return NULL;
2525 }
2526 
2527 /*
2528 **  DANE_VERIFY -- verify callback for TLS certificates
2529 **
2530 **	Parameters:
2531 **		ctx -- X509 context
2532 **		dane_vrfy_ctx -- callback context
2533 **
2534 **	Returns:
2535 **		DANE_VRFY_{OK,NONE,FAIL}
2536 */
2537 
2538 /* NOTE: this only works because the "matching type" is 0, 1, 2 for these! */
2539 static const char *dane_mdalgs[] = { "", "sha256", "sha512" };
2540 
2541 static int
2542 dane_verify(ctx, dane_vrfy_ctx)
2543 	X509_STORE_CTX *ctx;
2544 	dane_vrfy_ctx_P dane_vrfy_ctx;
2545 {
2546 	int r, i, ok, mdalg;
2547 	X509 *cert;
2548 	dane_tlsa_P dane_tlsa;
2549 	unsigned char *fp;
2550 
2551 	dane_tlsa = dane_get_tlsa(dane_vrfy_ctx);
2552 	if (dane_tlsa == NULL)
2553 		return DANE_VRFY_NONE;
2554 
2555 	dane_vrfy_ctx->dane_vrfy_fp[0] = '\0';
2556 	cert = X509_STORE_CTX_get0_cert(ctx);
2557 	if (tTd(96, 8))
2558 		sm_dprintf("dane_verify: cert=%p, supported=%d\n",
2559 			(void *)cert, TLSA_IS_FL(dane_tlsa, TLSAFLSUP));
2560 	if (cert == NULL)
2561 		return DANE_VRFY_FAIL;
2562 
2563 	ok = DANE_VRFY_NONE;
2564 	fp = NULL;
2565 
2566 	/*
2567 	**  If the TLSA RRs would be sorted the two loops below could
2568 	**  be merged into one and simply change mdalg when it changes
2569 	**  in dane_tlsa->dane_tlsa_rr.
2570 	*/
2571 
2572 	/* use a different order? */
2573 	for (mdalg = 0; mdalg < SM_ARRAY_SIZE(dane_mdalgs); mdalg++)
2574 	{
2575 		SM_FREE(fp);
2576 		r = 0;
2577 		for (i = 0; i < dane_tlsa->dane_tlsa_n; i++)
2578 		{
2579 			unsigned char *p;
2580 			int alg;
2581 
2582 			p = dane_tlsa->dane_tlsa_rr[i];
2583 
2584 			/* ignore bogus/unsupported TLSA RRs */
2585 			alg = dane_tlsa_chk(p, dane_tlsa->dane_tlsa_len[i],
2586 					  dane_vrfy_ctx->dane_vrfy_host, false);
2587 			if (tTd(96, 8))
2588 				sm_dprintf("dane_verify: alg=%d, mdalg=%d\n",
2589 					alg, mdalg);
2590 			if (alg != mdalg)
2591 				continue;
2592 
2593 			if (NULL == fp)
2594 			{
2595 				r = pubkey_fp(cert, dane_mdalgs[mdalg], &fp);
2596 				if (NULL == fp)
2597 					return DANE_VRFY_FAIL;
2598 					/* or continue? */
2599 			}
2600 
2601 			/* just for logging */
2602 			if (r > 0 && fp != NULL)
2603 			{
2604 				(void) data2hex((unsigned char *)fp, r,
2605 					(unsigned char *)dane_vrfy_ctx->dane_vrfy_fp,
2606 					sizeof(dane_vrfy_ctx->dane_vrfy_fp));
2607 			}
2608 
2609 			if (tTd(96, 4))
2610 				sm_dprintf("dane_verify: alg=%d, r=%d, len=%d\n",
2611 					alg, r, dane_tlsa->dane_tlsa_len[i]);
2612 			if (r != dane_tlsa->dane_tlsa_len[i] - 3)
2613 				continue;
2614 			ok = DANE_VRFY_FAIL;
2615 
2616 			/*
2617 			**  Note: Type is NOT checked because only 3-1-x
2618 			**  is supported.
2619 			*/
2620 
2621 			if (memcmp(p + 3, fp, r) == 0)
2622 			{
2623 				if (tTd(96, 2))
2624 					sm_dprintf("dane_verify: status=match\n");
2625 				if (tTd(96, 8))
2626 				{
2627 					unsigned char hex[DANE_FP_DBG_LEN];
2628 
2629 					data2hex((unsigned char *)p,
2630 						dane_tlsa->dane_tlsa_len[i],
2631 						hex, sizeof(hex));
2632 					sm_dprintf("dane_verify: pubkey_fp=%s\n"
2633 						, hex);
2634 				}
2635 				dane_vrfy_ctx->dane_vrfy_res = DANE_VRFY_OK;
2636 				SM_FREE(fp);
2637 				return DANE_VRFY_OK;
2638 			}
2639 		}
2640 	}
2641 
2642 	SM_FREE(fp);
2643 	dane_vrfy_ctx->dane_vrfy_res = ok;
2644 	return ok;
2645 }
2646 
2647 /*
2648 **  SSL_DANE_ENABLE -- enable using OpenSSL DANE functions for a session
2649 **
2650 **	Parameters:
2651 **		dane_vrfy_ctx -- dane verify context
2652 **		ssl -- TLS connection structure
2653 **
2654 **	Returns:
2655 **		SM_SUCCESS: OpenSSL DANE checking enabled
2656 **		SM_NOTDONE: OpenSSL DANE checking not enabled
2657 **		<0: some error
2658 */
2659 
2660 int
2661 ssl_dane_enable(dane_vrfy_ctx, ssl)
2662 	dane_vrfy_ctx_P dane_vrfy_ctx;
2663 	SSL *ssl;
2664 {
2665 #  if HAVE_SSL_CTX_dane_enable
2666 	const char *dane_tlsa_domain;
2667 	int r, i, usable;
2668 #  endif
2669 	dane_tlsa_P dane_tlsa;
2670 
2671 	if (tTd(96, 20))
2672 		sm_dprintf("ssl_dane_enable: dane_vrfy_ctx=%p, dane_vrfy_dane_enabled=%d, dane_vrfy_chk=%#x\n",
2673 			dane_vrfy_ctx, dane_vrfy_ctx->dane_vrfy_dane_enabled,
2674 			dane_vrfy_ctx->dane_vrfy_chk);
2675 
2676 	dane_tlsa = dane_get_tlsa(dane_vrfy_ctx);
2677 	if (tTd(96, 20))
2678 		sm_dprintf("ssl_dane_enable: dane_tlsa=%p, n=%d, supported=%d\n",
2679 			dane_tlsa, dane_tlsa != NULL ? dane_tlsa->dane_tlsa_n : -999,
2680 			dane_tlsa != NULL ? TLSA_IS_FL(dane_tlsa, TLSAFLSUP) : -1);
2681 	if (NULL == dane_tlsa || !TLSA_IS_FL(dane_tlsa, TLSAFLSUP))
2682 	{
2683 		/* no DANE verification possible */
2684 		dane_vrfy_ctx->dane_vrfy_chk |= TLSAFLNOVRFY;
2685 		return SM_SUCCESS;
2686 	}
2687 	if (0 == (dane_vrfy_ctx->dane_vrfy_chk & TLSAFLADIP))
2688 	{
2689 		/* no DANE verification possible */
2690 		dane_vrfy_ctx->dane_vrfy_chk |= TLSAFLNOVRFY;
2691 		return SM_SUCCESS;
2692 	}
2693 
2694 	if (!dane_vrfy_ctx->dane_vrfy_dane_enabled)
2695 	{
2696 #  if HAVE_SSL_CTX_dane_enable
2697 		dane_vrfy_ctx->dane_vrfy_chk |= TLSAFLTEMPVRFY;
2698 #  endif
2699 		return SM_NOTDONE;
2700 	}
2701 
2702 #  if HAVE_SSL_CTX_dane_enable
2703 	dane_tlsa_domain = !SM_IS_EMPTY(dane_vrfy_ctx->dane_vrfy_sni)
2704 				? dane_vrfy_ctx->dane_vrfy_sni
2705 				: dane_vrfy_ctx->dane_vrfy_host;
2706 	r = SSL_dane_enable(ssl, dane_tlsa_domain);
2707 #   if _FFR_TESTS
2708 	if (tTd(90, 102))
2709 	{
2710 		sm_dprintf("ssl_dane_enable: test=simulate SSL_dane_enable error\n");
2711 #    ifdef SSL_F_SSL_DANE_ENABLE
2712 		SSLerr(SSL_F_SSL_DANE_ENABLE, ERR_R_MALLOC_FAILURE);
2713 #    endif
2714 		r = -1; /* -ENOMEM; */
2715 	}
2716 #   endif /* _FFR_TESTS */
2717 	if (r <= 0)
2718 	{
2719 #  if HAVE_SSL_CTX_dane_enable
2720 		dane_vrfy_ctx->dane_vrfy_chk |= TLSAFLTEMPVRFY;
2721 #  endif
2722 		if (LogLevel > 1)
2723 			sm_syslog(LOG_ERR, NOQID,
2724 				"STARTTLS=client, SSL_dane_enable=%d", r);
2725 		tlslogerr(LOG_ERR, 7, "client");
2726 
2727 		/* XXX need better error code */
2728 		return (r < 0) ? r : -EINVAL;
2729 	}
2730 	if (LogLevel > 13)
2731 		sm_syslog(LOG_DEBUG, NOQID,
2732 			"STARTTLS=client, SSL_dane_enable=%d, domain=%s",
2733 			r, dane_tlsa_domain);
2734 	(void) SSL_dane_set_flags(ssl, DANE_FLAG_NO_DANE_EE_NAMECHECKS);
2735 
2736 	usable = 0;
2737 	for (i = 0; i < dane_tlsa->dane_tlsa_n; i++)
2738 	{
2739 		const unsigned char *rr;
2740 		const char *chk;
2741 
2742 		rr = (const unsigned char *)dane_tlsa->dane_tlsa_rr[i];
2743 		if (NULL == rr)
2744 			continue;
2745 
2746 		/*
2747 		**  only DANE-TA(2) or DANE-EE(3)
2748 		**  use dane_tlsa_chk() instead?
2749 		*/
2750 
2751 # if _FFR_TESTS
2752 		if (tTd(90, 101) && 3 == rr[0] && 1 == rr[1])
2753 		{
2754 			sm_dprintf("TLSA, type=%d-%d-%d:%02x, status=unsupported_due_to_test",
2755 				  (int)rr[0], (int)rr[1], (int)rr[2],
2756 				  (int)rr[3]);
2757 			r = 0;
2758 			chk = "tlsa_test";
2759 		}
2760 		else
2761 # endif /* _FFR_TESTS */
2762 		if (!(2 == rr[0] || 3 == rr[0]))
2763 		{
2764 			r = 0;
2765 			chk = "tlsa_chk";
2766 		}
2767 		else
2768 		{
2769 			r = SSL_dane_tlsa_add(ssl, rr[0], rr[1], rr[2], rr + 3,
2770 				(size_t) (dane_tlsa->dane_tlsa_len[i] - 3));
2771 			chk = "SSL_dane_tlsa_add";
2772 		}
2773 		if (r > 0)
2774 			usable++;
2775 #  if HAVE_SSL_CTX_dane_enable && 0
2776 /* should an error be ignored or cause a temporary failure? */
2777 		if (r < 0)
2778 			dane_vrfy_ctx->dane_vrfy_chk |= TLSAFLTEMPVRFY;
2779 #  endif
2780 		else if (LogLevel > ((r < 0) ? 10 : 13))
2781 		{
2782 			unsigned char hex[DANE_FP_LOG_LEN];
2783 
2784 			(void) data2hex((unsigned char *)rr + 3,
2785 				dane_tlsa->dane_tlsa_len[i] - 3,
2786 				hex, sizeof(hex));
2787 			sm_syslog(LOG_DEBUG, NOQID,
2788 				"STARTTLS=client, %s=%d, type=%d-%d-%d, fp=%s"
2789 				, chk, r, rr[0], rr[1], rr[2], hex);
2790 			tlslogerr(LOG_DEBUG, (r < 0) ? 13 : 10, "client");
2791 		}
2792 		if (tTd(96, 20))
2793 		{
2794 			unsigned char hex[DANE_FP_DBG_LEN];
2795 
2796 			(void) data2hex((unsigned char *)rr + 3,
2797 				dane_tlsa->dane_tlsa_len[i] - 3,
2798 				hex, sizeof(hex));
2799 			sm_dprintf("ssl_dane_enable: SSL_dane_tlsa_add=%d, u=%d, s=%d, d=%d, len=%d, fp=%s\n"
2800 					, r, rr[0], rr[1], rr[2]
2801 					, dane_tlsa->dane_tlsa_len[i]-3, hex
2802 					);
2803 		}
2804 	}
2805 	if (tTd(96, 20))
2806 		sm_dprintf("ssl_dane_enable: usable=%d\n", usable);
2807 	if (0 == usable)
2808 	{
2809 		/* shouldn't happen - checked above! */
2810 		if (LogLevel > 1)
2811 			sm_syslog(LOG_CRIT, NOQID,
2812 				"ERROR: ssl_dane_enable() INCONSISTENY: %d usable TLSA RRs found but \"supported\" flag is set (%d)\n",
2813 				usable, TLSA_IS_FL(dane_tlsa, TLSAFLSUP));
2814 		dane_vrfy_ctx->dane_vrfy_chk |= TLSAFLNOVRFY;
2815 		return SM_SUCCESS;
2816 	}
2817 #  endif /* HAVE_SSL_CTX_dane_enable */
2818 	return SM_SUCCESS;
2819 }
2820 # endif /* DANE */
2821 
2822 /*
2823 **  TLS_VERIFY_CB -- verify callback for TLS certificates
2824 **
2825 **	Parameters:
2826 **		ctx -- X509 context
2827 **		cb_ctx -- callback context
2828 **
2829 **	Returns:
2830 **		accept connection?
2831 **		currently: always yes.
2832 */
2833 
2834 static int
2835 tls_verify_cb(ctx, cb_ctx)
2836 	X509_STORE_CTX *ctx;
2837 	void *cb_ctx;
2838 {
2839 	int ok;
2840 # if DANE
2841 	SM_DECTLSI;
2842 	dane_vrfy_ctx_P dane_vrfy_ctx;
2843 # endif
2844 
2845 	/*
2846 	**  SSL_CTX_set_cert_verify_callback(3):
2847 	**  callback should return 1 to indicate verification success
2848 	**  and 0 to indicate verification failure.
2849 	*/
2850 
2851 # if DANE
2852 	SM_GETTLSI;
2853 	if (tTd(96, 40))
2854 		sm_dprintf("tls_verify_cb: tlsi_ctx=%p, vrfy_chk=%#x\n", tlsi_ctx,
2855 			(tlsi_ctx != NULL && (dane_vrfy_ctx = &(tlsi_ctx->tlsi_dvc)) != NULL) ?
2856 			dane_vrfy_ctx->dane_vrfy_chk : -1);
2857 	if (tlsi_ctx != NULL && (dane_vrfy_ctx = &(tlsi_ctx->tlsi_dvc)) != NULL
2858 	    && !dane_vrfy_ctx->dane_vrfy_dane_enabled
2859 	    && (0 == (dane_vrfy_ctx->dane_vrfy_chk & TLSAFLTEMPVRFY))
2860 	    && VRFY_DANE(dane_vrfy_ctx->dane_vrfy_chk)
2861 	)
2862 	{
2863 		int depth;
2864 
2865 		depth = X509_STORE_CTX_get_error_depth(ctx);
2866 		if (tTd(96, 20))
2867 			sm_dprintf("tls_verify_cb: enabled=%d, chk=%#x, depth=%d\n",
2868 				dane_vrfy_ctx->dane_vrfy_dane_enabled,
2869 				dane_vrfy_ctx->dane_vrfy_chk, depth);
2870 
2871 		if (0 == depth)
2872 		{
2873 			ok = dane_verify(ctx, dane_vrfy_ctx);
2874 			if (tTd(96, 2))
2875 				sm_dprintf("tls_verify_cb: dane_verify=%d, res=%d\n", ok,
2876 					dane_vrfy_ctx->dane_vrfy_res);
2877 			if (ok != DANE_VRFY_NONE)
2878 				return 1;
2879 		}
2880 	}
2881 
2882 	if (tTd(96, 10))
2883 		sm_dprintf("tls_verify_cb: basic check? enabled=%d, chk=%#x\n",
2884 			(tlsi_ctx != NULL && dane_vrfy_ctx != NULL) ?
2885 				dane_vrfy_ctx->dane_vrfy_dane_enabled : -1,
2886 			(tlsi_ctx != NULL && dane_vrfy_ctx != NULL) ?
2887 				dane_vrfy_ctx->dane_vrfy_chk : -1);
2888 # endif /* DANE */
2889 
2890 	ok = X509_verify_cert(ctx);
2891 	if ((LogLevel > 13 && ok <= 0) || LogLevel > 14)
2892 		(void) tls_verify_log(ok, ctx, "TLS");
2893 	return 1;
2894 }
2895 
2896 /*
2897 **  TLSLOGERR -- log the errors from the TLS error stack
2898 **
2899 **	Parameters:
2900 **		priority -- syslog priority
2901 **		ll -- loglevel
2902 **		who -- server/client (for logging).
2903 **
2904 **	Returns:
2905 **		none.
2906 */
2907 
2908 void
2909 tlslogerr(priority, ll, who)
2910 	int priority;
2911 	int ll;
2912 	const char *who;
2913 {
2914 	unsigned long l;
2915 	int line, flags;
2916 	char *file, *data;
2917 	char buf[256];
2918 
2919 	if (LogLevel <= ll)
2920 		return;
2921 	while ((l = MTA_SSL_ERR_get((const char **) &file, &line,
2922 				    (const char **) &data, &flags, NULL))
2923 		!= 0)
2924 	{
2925 		sm_syslog(priority, NOQID,
2926 			  "STARTTLS=%s: %s:%s:%d:%s", who,
2927 			  ERR_error_string(l, buf),
2928 			  file, line,
2929 			  bitset(ERR_TXT_STRING, flags) ? data : "");
2930 	}
2931 }
2932 
2933 /*
2934 **  X509_VERIFY_CB -- verify callback
2935 **
2936 **	Parameters:
2937 **		ok -- current result
2938 **		ctx -- X509 context
2939 **
2940 **	Returns:
2941 **		accept connection?
2942 **		currently: always yes.
2943 */
2944 
2945 static int
2946 x509_verify_cb(ok, ctx)
2947 	int ok;
2948 	X509_STORE_CTX *ctx;
2949 {
2950 	SM_DECTLSI;
2951 
2952 	if (ok != 0)
2953 		return ok;
2954 
2955 	SM_GETTLSI;
2956 	if (LogLevel > 13)
2957 		tls_verify_log(ok, ctx, "X509");
2958 	if (X509_STORE_CTX_get_error(ctx) == X509_V_ERR_UNABLE_TO_GET_CRL &&
2959 	    !SM_TLSI_IS(tlsi_ctx, TLSI_FL_CRLREQ))
2960 	{
2961 		X509_STORE_CTX_set_error(ctx, 0);
2962 		return 1;	/* override it */
2963 	}
2964 	return ok;
2965 }
2966 
2967 # if !USE_OPENSSL_ENGINE && !defined(OPENSSL_NO_ENGINE)
2968 /*
2969 **  TLS_SET_ENGINE -- set up ENGINE if needed
2970 **
2971 **	Parameters:
2972 **		id -- id for ENGINE
2973 **		isprefork -- called before fork()?
2974 **
2975 **	Returns: (OpenSSL "semantics", reverse it to allow returning error codes)
2976 **		0: failure
2977 **		!=0: ok
2978 */
2979 
2980 int
2981 TLS_set_engine(id, isprefork)
2982 	const char *id;
2983 	bool isprefork;
2984 {
2985 	static bool TLSEngineInitialized = false;
2986 	ENGINE *e;
2987 	char enginepath[MAXPATHLEN];
2988 
2989 	/*
2990 	**  Todo: put error for logging into a string and log it in error:
2991 	*/
2992 
2993 	if (LogLevel > 13)
2994 		sm_syslog(LOG_DEBUG, NOQID,
2995 			"engine=%s, path=%s, ispre=%d, pre=%d, initialized=%d",
2996 			id, SSLEnginePath, isprefork, SSLEngineprefork,
2997 			TLSEngineInitialized);
2998 	if (TLSEngineInitialized)
2999 		return 1;
3000 	if (SM_IS_EMPTY(id))
3001 		return 1;
3002 #  if !defined(ENGINE_METHOD_ALL)
3003 	if (LogLevel > 9)
3004 		sm_syslog(LOG_NOTICE, NOQID,
3005 			"engine=%s, status=engines_not_support", id)
3006 	goto error;
3007 #  endif
3008 
3009 	/* is this the "right time" to initialize the engine? */
3010 	if (isprefork != SSLEngineprefork)
3011 		return 1;
3012 
3013 	e = NULL;
3014 	ENGINE_load_builtin_engines();
3015 
3016 	if (SSLEnginePath != NULL && *SSLEnginePath != '\0')
3017 	{
3018 		if ((e = ENGINE_by_id("dynamic")) == NULL)
3019 		{
3020 			if (LogLevel > 1)
3021 				sm_syslog(LOG_ERR, NOQID,
3022 					"engine=%s, by_id=failed", "dynamic");
3023 			goto error;
3024 		}
3025 		(void) sm_snprintf(enginepath, sizeof(enginepath),
3026 			"%s/lib%s.so", SSLEnginePath, id);
3027 
3028 		if (!ENGINE_ctrl_cmd_string(e, "SO_PATH", enginepath, 0))
3029 		{
3030 			if (LogLevel > 1)
3031 				sm_syslog(LOG_ERR, NOQID,
3032 					"engine=%s, SO_PATH=%s, status=failed",
3033 					id, enginepath);
3034 			goto error;
3035 		}
3036 
3037 		if (!ENGINE_ctrl_cmd_string(e, "ID", id, 0))
3038 		{
3039 			if (LogLevel > 1)
3040 				sm_syslog(LOG_ERR, NOQID,
3041 					"engine=%s, ID=failed", id);
3042 			goto error;
3043 		}
3044 
3045 		if (!ENGINE_ctrl_cmd_string(e, "LOAD", NULL, 0))
3046 		{
3047 			if (LogLevel > 1)
3048 				sm_syslog(LOG_ERR, NOQID,
3049 					"engine=%s, LOAD=failed", id);
3050 			goto error;
3051 		}
3052 	}
3053 	else if ((e = ENGINE_by_id(id)) == NULL)
3054 	{
3055 		if (LogLevel > 1)
3056 			sm_syslog(LOG_ERR, NOQID, "engine=%s, by_id=failed",
3057 				id);
3058 		return 0;
3059 	}
3060 
3061 	if (!ENGINE_init(e))
3062 	{
3063 		if (LogLevel > 1)
3064 			sm_syslog(LOG_ERR, NOQID, "engine=%s, init=failed", id);
3065 		goto error;
3066 	}
3067 	if (!ENGINE_set_default(e, ENGINE_METHOD_ALL))
3068 	{
3069 		if (LogLevel > 1)
3070 			sm_syslog(LOG_ERR, NOQID,
3071 				"engine=%s, set_default=failed", id);
3072 		goto error;
3073 	}
3074 #  ifdef ENGINE_CTRL_CHIL_SET_FORKCHECK
3075 	if (strcmp(id, "chil") == 0)
3076 		ENGINE_ctrl(e, ENGINE_CTRL_CHIL_SET_FORKCHECK, 1, 0, 0);
3077 #  endif
3078 
3079 	/* Free our "structural" reference. */
3080 	ENGINE_free(e);
3081 	if (LogLevel > 10)
3082 		sm_syslog(LOG_INFO, NOQID, "engine=%s, loaded=ok", id);
3083 	TLSEngineInitialized = true;
3084 	return 1;
3085 
3086   error:
3087 	tlslogerr(LOG_WARNING, 7, "init");
3088 	if (e != NULL)
3089 		ENGINE_free(e);
3090 	return 0;
3091 }
3092 # endif /* !USE_OPENSSL_ENGINE && !defined(OPENSSL_NO_ENGINE) */
3093 #endif /* STARTTLS */
3094