xref: /freebsd/contrib/sendmail/src/tls.c (revision 3d32dc633c5e21bf15dd0d968734efe72776afdc)
1 /*
2  * Copyright (c) 2000-2006, 2008, 2009, 2011, 2013 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 /* ! HASURANDOMDEV */
22 # if !TLS_NO_RSA
23 static RSA *rsa_tmp = NULL;	/* temporary RSA key */
24 static RSA *tmp_rsa_key __P((SSL *, int, int));
25 # endif /* !TLS_NO_RSA */
26 # if !defined(OPENSSL_VERSION_NUMBER) || OPENSSL_VERSION_NUMBER < 0x00907000L
27 static int	tls_verify_cb __P((X509_STORE_CTX *));
28 # else /* !defined() || OPENSSL_VERSION_NUMBER < 0x00907000L */
29 static int	tls_verify_cb __P((X509_STORE_CTX *, void *));
30 # endif /* !defined() || OPENSSL_VERSION_NUMBER < 0x00907000L */
31 
32 # if OPENSSL_VERSION_NUMBER > 0x00907000L
33 static int x509_verify_cb __P((int, X509_STORE_CTX *));
34 # endif /* OPENSSL_VERSION_NUMBER > 0x00907000L */
35 
36 # if !defined(OPENSSL_VERSION_NUMBER) || OPENSSL_VERSION_NUMBER < 0x00907000L
37 #  define CONST097
38 # else /* !defined() || OPENSSL_VERSION_NUMBER < 0x00907000L */
39 #  define CONST097 const
40 # endif /* !defined() || OPENSSL_VERSION_NUMBER < 0x00907000L */
41 static void	apps_ssl_info_cb __P((CONST097 SSL *, int , int));
42 static bool	tls_ok_f __P((char *, char *, int));
43 static bool	tls_safe_f __P((char *, long, bool));
44 static int	tls_verify_log __P((int, X509_STORE_CTX *, const char *));
45 
46 # if !NO_DH
47 static DH *get_dh512 __P((void));
48 
49 static unsigned char dh512_p[] =
50 {
51 	0xDA,0x58,0x3C,0x16,0xD9,0x85,0x22,0x89,0xD0,0xE4,0xAF,0x75,
52 	0x6F,0x4C,0xCA,0x92,0xDD,0x4B,0xE5,0x33,0xB8,0x04,0xFB,0x0F,
53 	0xED,0x94,0xEF,0x9C,0x8A,0x44,0x03,0xED,0x57,0x46,0x50,0xD3,
54 	0x69,0x99,0xDB,0x29,0xD7,0x76,0x27,0x6B,0xA2,0xD3,0xD4,0x12,
55 	0xE2,0x18,0xF4,0xDD,0x1E,0x08,0x4C,0xF6,0xD8,0x00,0x3E,0x7C,
56 	0x47,0x74,0xE8,0x33
57 };
58 static unsigned char dh512_g[] =
59 {
60 	0x02
61 };
62 
63 #if OPENSSL_VERSION_NUMBER < 0x10100000
64 
65 static inline int DH_set0_pqg(DH *dh, BIGNUM *p, BIGNUM *q, BIGNUM *g)
66 {
67 	/* If the fields p and g in d are NULL, the corresponding input
68 	 * parameters MUST be non-NULL.  q may remain NULL.
69 	 */
70 	if ((dh->p == NULL && p == NULL)
71 	    || (dh->g == NULL && g == NULL))
72 		return 0;
73 
74 	if (p != NULL) {
75 		BN_free(dh->p);
76 		dh->p = p;
77 	}
78 	if (q != NULL) {
79 		BN_free(dh->q);
80 		dh->q = q;
81 	}
82 	if (g != NULL) {
83 		BN_free(dh->g);
84 		dh->g = g;
85 	}
86 
87 	if (q != NULL) {
88 		dh->length = BN_num_bits(q);
89 	}
90 
91 	return 1;
92 }
93 #endif
94 
95 static DH *
96 get_dh512()
97 {
98 	DH *dh = NULL;
99 	BIGNUM *p;
100 	BIGNUM *g;
101 
102 	dh = DH_new();
103 	p = BN_bin2bn(dh512_p, sizeof(dh512_p), NULL);
104 	g = BN_bin2bn(dh512_g, sizeof(dh512_g), NULL);
105 	if (!dh || !p || !g)
106 		goto err;
107 	if (!DH_set0_pqg(dh, p, NULL, g))
108 		goto err;
109 	return dh;
110 err:
111 	DH_free(dh);
112 	BN_free(p);
113 	BN_free(g);
114 	return NULL;
115 }
116 
117 #  if 0
118 
119 This is the data from which the C code has been generated:
120 
121 -----BEGIN DH PARAMETERS-----
122 MIIBCAKCAQEArDcgcLpxEksQHPlolRKCUJ2szKRziseWV9cUSQNZGxoGw7KkROz4
123 HF9QSbg5axyNIG+QbZYtx0jp3l6/GWq1dLOj27yZkgYgaYgFrvKPiZ2jJ5xETQVH
124 UpZwbjRcyjyWkWYJVsx1aF4F/iY4kT0n/+iGEoimI3C9V3KXTJ2S6jIkyJ6M/CrN
125 EtrDynMlUMGlc7S1ouXVOTrtKeqy3S2L9eBLxVI+sChEijGIfELupdVeXihK006p
126 MgnABPDbkTx6OOtYmSZaGQX+OLW2FPmwvcrzgCz9t9cAsuUcBZv1LeHEqZZttyLU
127 oK0jjSXgFyeU4/NfyA+zuNeWzUL6bHmigwIBAg==
128 -----END DH PARAMETERS-----
129 #  endif /* 0 */
130 
131 static DH *
132 get_dh2048()
133 {
134 	static unsigned char dh2048_p[]={
135 		0xAC,0x37,0x20,0x70,0xBA,0x71,0x12,0x4B,0x10,0x1C,0xF9,0x68,
136 		0x95,0x12,0x82,0x50,0x9D,0xAC,0xCC,0xA4,0x73,0x8A,0xC7,0x96,
137 		0x57,0xD7,0x14,0x49,0x03,0x59,0x1B,0x1A,0x06,0xC3,0xB2,0xA4,
138 		0x44,0xEC,0xF8,0x1C,0x5F,0x50,0x49,0xB8,0x39,0x6B,0x1C,0x8D,
139 		0x20,0x6F,0x90,0x6D,0x96,0x2D,0xC7,0x48,0xE9,0xDE,0x5E,0xBF,
140 		0x19,0x6A,0xB5,0x74,0xB3,0xA3,0xDB,0xBC,0x99,0x92,0x06,0x20,
141 		0x69,0x88,0x05,0xAE,0xF2,0x8F,0x89,0x9D,0xA3,0x27,0x9C,0x44,
142 		0x4D,0x05,0x47,0x52,0x96,0x70,0x6E,0x34,0x5C,0xCA,0x3C,0x96,
143 		0x91,0x66,0x09,0x56,0xCC,0x75,0x68,0x5E,0x05,0xFE,0x26,0x38,
144 		0x91,0x3D,0x27,0xFF,0xE8,0x86,0x12,0x88,0xA6,0x23,0x70,0xBD,
145 		0x57,0x72,0x97,0x4C,0x9D,0x92,0xEA,0x32,0x24,0xC8,0x9E,0x8C,
146 		0xFC,0x2A,0xCD,0x12,0xDA,0xC3,0xCA,0x73,0x25,0x50,0xC1,0xA5,
147 		0x73,0xB4,0xB5,0xA2,0xE5,0xD5,0x39,0x3A,0xED,0x29,0xEA,0xB2,
148 		0xDD,0x2D,0x8B,0xF5,0xE0,0x4B,0xC5,0x52,0x3E,0xB0,0x28,0x44,
149 		0x8A,0x31,0x88,0x7C,0x42,0xEE,0xA5,0xD5,0x5E,0x5E,0x28,0x4A,
150 		0xD3,0x4E,0xA9,0x32,0x09,0xC0,0x04,0xF0,0xDB,0x91,0x3C,0x7A,
151 		0x38,0xEB,0x58,0x99,0x26,0x5A,0x19,0x05,0xFE,0x38,0xB5,0xB6,
152 		0x14,0xF9,0xB0,0xBD,0xCA,0xF3,0x80,0x2C,0xFD,0xB7,0xD7,0x00,
153 		0xB2,0xE5,0x1C,0x05,0x9B,0xF5,0x2D,0xE1,0xC4,0xA9,0x96,0x6D,
154 		0xB7,0x22,0xD4,0xA0,0xAD,0x23,0x8D,0x25,0xE0,0x17,0x27,0x94,
155 		0xE3,0xF3,0x5F,0xC8,0x0F,0xB3,0xB8,0xD7,0x96,0xCD,0x42,0xFA,
156 		0x6C,0x79,0xA2,0x83,
157 		};
158 	static unsigned char dh2048_g[]={ 0x02, };
159 	DH *dh;
160 	BIGNUM *p;
161 	BIGNUM *g;
162 
163 	dh = DH_new();
164 	p = BN_bin2bn(dh2048_p,sizeof(dh2048_p),NULL);
165 	g = BN_bin2bn(dh2048_g,sizeof(dh2048_g),NULL);
166 	if (!dh || !p || !g)
167 		goto err;
168 	if (!DH_set0_pqg(dh, p, NULL, g))
169 		goto err;
170 	return(dh);
171 err:
172 	DH_free(dh);
173 	BN_free(p);
174 	BN_free(g);
175 	return NULL;
176 }
177 # endif /* !NO_DH */
178 
179 
180 /*
181 **  TLS_RAND_INIT -- initialize STARTTLS random generator
182 **
183 **	Parameters:
184 **		randfile -- name of file with random data
185 **		logl -- loglevel
186 **
187 **	Returns:
188 **		success/failure
189 **
190 **	Side Effects:
191 **		initializes PRNG for tls library.
192 */
193 
194 # define MIN_RAND_BYTES	128	/* 1024 bits */
195 
196 # define RF_OK		0	/* randfile OK */
197 # define RF_MISS	1	/* randfile == NULL || *randfile == '\0' */
198 # define RF_UNKNOWN	2	/* unknown prefix for randfile */
199 
200 # define RI_NONE	0	/* no init yet */
201 # define RI_SUCCESS	1	/* init was successful */
202 # define RI_FAIL	2	/* init failed */
203 
204 static bool	tls_rand_init __P((char *, int));
205 
206 static bool
207 tls_rand_init(randfile, logl)
208 	char *randfile;
209 	int logl;
210 {
211 # ifndef HASURANDOMDEV
212 	/* not required if /dev/urandom exists, OpenSSL does it internally */
213 
214 	bool ok;
215 	int randdef;
216 	static int done = RI_NONE;
217 
218 	/*
219 	**  initialize PRNG
220 	*/
221 
222 	/* did we try this before? if yes: return old value */
223 	if (done != RI_NONE)
224 		return done == RI_SUCCESS;
225 
226 	/* set default values */
227 	ok = false;
228 	done = RI_FAIL;
229 	randdef = (randfile == NULL || *randfile == '\0') ? RF_MISS : RF_OK;
230 #   if EGD
231 	if (randdef == RF_OK && sm_strncasecmp(randfile, "egd:", 4) == 0)
232 	{
233 		randfile += 4;
234 		if (RAND_egd(randfile) < 0)
235 		{
236 			sm_syslog(LOG_WARNING, NOQID,
237 				  "STARTTLS: RAND_egd(%s) failed: random number generator not seeded",
238 				   randfile);
239 		}
240 		else
241 			ok = true;
242 	}
243 	else
244 #   endif /* EGD */
245 	if (randdef == RF_OK && sm_strncasecmp(randfile, "file:", 5) == 0)
246 	{
247 		int fd;
248 		long sff;
249 		struct stat st;
250 
251 		randfile += 5;
252 		sff = SFF_SAFEDIRPATH | SFF_NOWLINK
253 		      | SFF_NOGWFILES | SFF_NOWWFILES
254 		      | SFF_NOGRFILES | SFF_NOWRFILES
255 		      | SFF_MUSTOWN | SFF_ROOTOK | SFF_OPENASROOT;
256 		if (DontLockReadFiles)
257 			sff |= SFF_NOLOCK;
258 		if ((fd = safeopen(randfile, O_RDONLY, 0, sff)) >= 0)
259 		{
260 			if (fstat(fd, &st) < 0)
261 			{
262 				if (LogLevel > logl)
263 					sm_syslog(LOG_ERR, NOQID,
264 						  "STARTTLS: can't fstat(%s)",
265 						  randfile);
266 			}
267 			else
268 			{
269 				bool use, problem;
270 
271 				use = true;
272 				problem = false;
273 
274 				/* max. age of file: 10 minutes */
275 				if (st.st_mtime + 600 < curtime())
276 				{
277 					use = bitnset(DBS_INSUFFICIENTENTROPY,
278 						      DontBlameSendmail);
279 					problem = true;
280 					if (LogLevel > logl)
281 						sm_syslog(LOG_ERR, NOQID,
282 							  "STARTTLS: RandFile %s too old: %s",
283 							  randfile,
284 							  use ? "unsafe" :
285 								"unusable");
286 				}
287 				if (use && st.st_size < MIN_RAND_BYTES)
288 				{
289 					use = bitnset(DBS_INSUFFICIENTENTROPY,
290 						      DontBlameSendmail);
291 					problem = true;
292 					if (LogLevel > logl)
293 						sm_syslog(LOG_ERR, NOQID,
294 							  "STARTTLS: size(%s) < %d: %s",
295 							  randfile,
296 							  MIN_RAND_BYTES,
297 							  use ? "unsafe" :
298 								"unusable");
299 				}
300 				if (use)
301 					ok = RAND_load_file(randfile, -1) >=
302 					     MIN_RAND_BYTES;
303 				if (use && !ok)
304 				{
305 					if (LogLevel > logl)
306 						sm_syslog(LOG_WARNING, NOQID,
307 							  "STARTTLS: RAND_load_file(%s) failed: random number generator not seeded",
308 							  randfile);
309 				}
310 				if (problem)
311 					ok = false;
312 			}
313 			if (ok || bitnset(DBS_INSUFFICIENTENTROPY,
314 					  DontBlameSendmail))
315 			{
316 				/* add this even if fstat() failed */
317 				RAND_seed((void *) &st, sizeof(st));
318 			}
319 			(void) close(fd);
320 		}
321 		else
322 		{
323 			if (LogLevel > logl)
324 				sm_syslog(LOG_WARNING, NOQID,
325 					  "STARTTLS: Warning: safeopen(%s) failed",
326 					  randfile);
327 		}
328 	}
329 	else if (randdef == RF_OK)
330 	{
331 		if (LogLevel > logl)
332 			sm_syslog(LOG_WARNING, NOQID,
333 				  "STARTTLS: Error: no proper random file definition %s",
334 				  randfile);
335 		randdef = RF_UNKNOWN;
336 	}
337 	if (randdef == RF_MISS)
338 	{
339 		if (LogLevel > logl)
340 			sm_syslog(LOG_WARNING, NOQID,
341 				  "STARTTLS: Error: missing random file definition");
342 	}
343 	if (!ok && bitnset(DBS_INSUFFICIENTENTROPY, DontBlameSendmail))
344 	{
345 		int i;
346 		long r;
347 		unsigned char buf[MIN_RAND_BYTES];
348 
349 		/* assert((MIN_RAND_BYTES % sizeof(long)) == 0); */
350 		for (i = 0; i <= sizeof(buf) - sizeof(long); i += sizeof(long))
351 		{
352 			r = get_random();
353 			(void) memcpy(buf + i, (void *) &r, sizeof(long));
354 		}
355 		RAND_seed(buf, sizeof(buf));
356 		if (LogLevel > logl)
357 			sm_syslog(LOG_WARNING, NOQID,
358 				  "STARTTLS: Warning: random number generator not properly seeded");
359 		ok = true;
360 	}
361 	done = ok ? RI_SUCCESS : RI_FAIL;
362 	return ok;
363 # else /* ! HASURANDOMDEV */
364 	return true;
365 # endif /* ! HASURANDOMDEV */
366 }
367 /*
368 **  INIT_TLS_LIBRARY -- Calls functions which setup TLS library for global use.
369 **
370 **	Parameters:
371 **		fipsmode -- use FIPS?
372 **
373 **	Returns:
374 **		succeeded?
375 */
376 
377 bool
378 init_tls_library(fipsmode)
379 	bool fipsmode;
380 {
381 	bool bv;
382 
383 	/* basic TLS initialization, ignore result for now */
384 	SSL_library_init();
385 	SSL_load_error_strings();
386 	OpenSSL_add_all_algorithms();
387 # if 0
388 	/* this is currently a macro for SSL_library_init */
389 	SSLeay_add_ssl_algorithms();
390 # endif /* 0 */
391 
392 	bv = tls_rand_init(RandFile, 7);
393 # if _FFR_FIPSMODE
394 	if (bv && fipsmode)
395 	{
396 		if (!FIPS_mode_set(1))
397 		{
398 			unsigned long err;
399 
400 			err = ERR_get_error();
401 			if (LogLevel > 0)
402 				sm_syslog(LOG_ERR, NOQID,
403 					"STARTTLS=init, FIPSMode=%s",
404 					ERR_error_string(err, NULL));
405 			return false;
406 		}
407 		else
408 		{
409 			if (LogLevel > 9)
410 				sm_syslog(LOG_INFO, NOQID,
411 					"STARTTLS=init, FIPSMode=ok");
412 		}
413 	}
414 #endif /* _FFR_FIPSMODE  */
415 	if (bv && CertFingerprintAlgorithm != NULL)
416 	{
417 		const EVP_MD *md;
418 
419 		md = EVP_get_digestbyname(CertFingerprintAlgorithm);
420 		if (NULL == md)
421 		{
422 			bv = false;
423 			if (LogLevel > 0)
424 				sm_syslog(LOG_ERR, NOQID,
425 					"STARTTLS=init, CertFingerprintAlgorithm=%s, status=invalid"
426 					, CertFingerprintAlgorithm);
427 		}
428 		else
429 			EVP_digest = md;
430 	}
431 	return bv;
432 }
433 
434 /*
435 **  TLS_SET_VERIFY -- request client certificate?
436 **
437 **	Parameters:
438 **		ctx -- TLS context
439 **		ssl -- TLS structure
440 **		vrfy -- request certificate?
441 **
442 **	Returns:
443 **		none.
444 **
445 **	Side Effects:
446 **		Sets verification state for TLS
447 **
448 # if TLS_VRFY_PER_CTX
449 **	Notice:
450 **		This is per TLS context, not per TLS structure;
451 **		the former is global, the latter per connection.
452 **		It would be nice to do this per connection, but this
453 **		doesn't work in the current TLS libraries :-(
454 # endif * TLS_VRFY_PER_CTX *
455 */
456 
457 void
458 tls_set_verify(ctx, ssl, vrfy)
459 	SSL_CTX *ctx;
460 	SSL *ssl;
461 	bool vrfy;
462 {
463 # if !TLS_VRFY_PER_CTX
464 	SSL_set_verify(ssl, vrfy ? SSL_VERIFY_PEER : SSL_VERIFY_NONE, NULL);
465 # else /* !TLS_VRFY_PER_CTX */
466 	SSL_CTX_set_verify(ctx, vrfy ? SSL_VERIFY_PEER : SSL_VERIFY_NONE,
467 			NULL);
468 # endif /* !TLS_VRFY_PER_CTX */
469 }
470 
471 /*
472 **  status in initialization
473 **  these flags keep track of the status of the initialization
474 **  i.e., whether a file exists (_EX) and whether it can be used (_OK)
475 **  [due to permissions]
476 */
477 
478 # define TLS_S_NONE	0x00000000	/* none yet */
479 # define TLS_S_CERT_EX	0x00000001	/* cert file exists */
480 # define TLS_S_CERT_OK	0x00000002	/* cert file is ok */
481 # define TLS_S_KEY_EX	0x00000004	/* key file exists */
482 # define TLS_S_KEY_OK	0x00000008	/* key file is ok */
483 # define TLS_S_CERTP_EX	0x00000010	/* CA cert path exists */
484 # define TLS_S_CERTP_OK	0x00000020	/* CA cert path is ok */
485 # define TLS_S_CERTF_EX	0x00000040	/* CA cert file exists */
486 # define TLS_S_CERTF_OK	0x00000080	/* CA cert file is ok */
487 # define TLS_S_CRLF_EX	0x00000100	/* CRL file exists */
488 # define TLS_S_CRLF_OK	0x00000200	/* CRL file is ok */
489 
490 # define TLS_S_CERT2_EX	0x00001000	/* 2nd cert file exists */
491 # define TLS_S_CERT2_OK	0x00002000	/* 2nd cert file is ok */
492 # define TLS_S_KEY2_EX	0x00004000	/* 2nd key file exists */
493 # define TLS_S_KEY2_OK	0x00008000	/* 2nd key file is ok */
494 
495 # define TLS_S_DH_OK	0x00200000	/* DH cert is ok */
496 # define TLS_S_DHPAR_EX	0x00400000	/* DH param file exists */
497 # define TLS_S_DHPAR_OK	0x00800000	/* DH param file is ok to use */
498 
499 /* Type of variable */
500 # define TLS_T_OTHER	0
501 # define TLS_T_SRV	1
502 # define TLS_T_CLT	2
503 
504 /*
505 **  TLS_OK_F -- can var be an absolute filename?
506 **
507 **	Parameters:
508 **		var -- filename
509 **		fn -- what is the filename used for?
510 **		type -- type of variable
511 **
512 **	Returns:
513 **		ok?
514 */
515 
516 static bool
517 tls_ok_f(var, fn, type)
518 	char *var;
519 	char *fn;
520 	int type;
521 {
522 	/* must be absolute pathname */
523 	if (var != NULL && *var == '/')
524 		return true;
525 	if (LogLevel > 12)
526 		sm_syslog(LOG_WARNING, NOQID, "STARTTLS: %s%s missing",
527 			  type == TLS_T_SRV ? "Server" :
528 			  (type == TLS_T_CLT ? "Client" : ""), fn);
529 	return false;
530 }
531 /*
532 **  TLS_SAFE_F -- is a file safe to use?
533 **
534 **	Parameters:
535 **		var -- filename
536 **		sff -- flags for safefile()
537 **		srv -- server side?
538 **
539 **	Returns:
540 **		ok?
541 */
542 
543 static bool
544 tls_safe_f(var, sff, srv)
545 	char *var;
546 	long sff;
547 	bool srv;
548 {
549 	int ret;
550 
551 	if ((ret = safefile(var, RunAsUid, RunAsGid, RunAsUserName, sff,
552 			    S_IRUSR, NULL)) == 0)
553 		return true;
554 	if (LogLevel > 7)
555 		sm_syslog(LOG_WARNING, NOQID, "STARTTLS=%s: file %s unsafe: %s",
556 			  srv ? "server" : "client", var, sm_errstring(ret));
557 	return false;
558 }
559 
560 /*
561 **  TLS_OK_F -- macro to simplify calls to tls_ok_f
562 **
563 **	Parameters:
564 **		var -- filename
565 **		fn -- what is the filename used for?
566 **		req -- is the file required?
567 **		st -- status bit to set if ok
568 **		type -- type of variable
569 **
570 **	Side Effects:
571 **		uses r, ok; may change ok and status.
572 **
573 */
574 
575 # define TLS_OK_F(var, fn, req, st, type) if (ok) \
576 	{ \
577 		r = tls_ok_f(var, fn, type); \
578 		if (r) \
579 			status |= st; \
580 		else if (req) \
581 			ok = false; \
582 	}
583 
584 /*
585 **  TLS_UNR -- macro to return whether a file should be unreadable
586 **
587 **	Parameters:
588 **		bit -- flag to test
589 **		req -- flags
590 **
591 **	Returns:
592 **		0/SFF_NORFILES
593 */
594 # define TLS_UNR(bit, req)	(bitset(bit, req) ? SFF_NORFILES : 0)
595 # define TLS_OUNR(bit, req)	(bitset(bit, req) ? SFF_NOWRFILES : 0)
596 # define TLS_KEYSFF(req)	\
597 	(bitnset(DBS_GROUPREADABLEKEYFILE, DontBlameSendmail) ?	\
598 		TLS_OUNR(TLS_I_KEY_OUNR, req) :			\
599 		TLS_UNR(TLS_I_KEY_UNR, req))
600 
601 /*
602 **  TLS_SAFE_F -- macro to simplify calls to tls_safe_f
603 **
604 **	Parameters:
605 **		var -- filename
606 **		sff -- flags for safefile()
607 **		req -- is the file required?
608 **		ex -- does the file exist?
609 **		st -- status bit to set if ok
610 **		srv -- server side?
611 **
612 **	Side Effects:
613 **		uses r, ok, ex; may change ok and status.
614 **
615 */
616 
617 # define TLS_SAFE_F(var, sff, req, ex, st, srv) if (ex && ok) \
618 	{ \
619 		r = tls_safe_f(var, sff, srv); \
620 		if (r) \
621 			status |= st;	\
622 		else if (req) \
623 			ok = false;	\
624 	}
625 
626 # if _FFR_TLS_SE_OPTS
627 /*
628 **  LOAD_CERTKEY -- load cert/key for TLS session
629 **
630 **	Parameters:
631 **		ssl -- TLS session context
632 **		certfile -- filename of certificate
633 **		keyfile -- filename of private key
634 **
635 **	Returns:
636 **		succeeded?
637 */
638 
639 bool
640 load_certkey(ssl, srv, certfile, keyfile)
641 	SSL *ssl;
642 	bool srv;
643 	char *certfile;
644 	char *keyfile;
645 {
646 	bool ok;
647 	int r;
648 	long sff, status;
649 	unsigned long req;
650 	char *who;
651 
652 	ok = true;
653 	who = srv ? "server" : "client";
654 	status = TLS_S_NONE;
655 	req = TLS_I_CERT_EX|TLS_I_KEY_EX;
656 	TLS_OK_F(certfile, "CertFile", bitset(TLS_I_CERT_EX, req),
657 		 TLS_S_CERT_EX, srv ? TLS_T_SRV : TLS_T_CLT);
658 	TLS_OK_F(keyfile, "KeyFile", bitset(TLS_I_KEY_EX, req),
659 		 TLS_S_KEY_EX, srv ? TLS_T_SRV : TLS_T_CLT);
660 
661 	/* certfile etc. must be "safe". */
662 	sff = SFF_REGONLY | SFF_SAFEDIRPATH | SFF_NOWLINK
663 	     | SFF_NOGWFILES | SFF_NOWWFILES
664 	     | SFF_MUSTOWN | SFF_ROOTOK | SFF_OPENASROOT;
665 	if (DontLockReadFiles)
666 		sff |= SFF_NOLOCK;
667 
668 	TLS_SAFE_F(certfile, sff | TLS_UNR(TLS_I_CERT_UNR, req),
669 		   bitset(TLS_I_CERT_EX, req),
670 		   bitset(TLS_S_CERT_EX, status), TLS_S_CERT_OK, srv);
671 	TLS_SAFE_F(keyfile, sff | TLS_KEYSFF(req),
672 		   bitset(TLS_I_KEY_EX, req),
673 		   bitset(TLS_S_KEY_EX, status), TLS_S_KEY_OK, srv);
674 
675 # define SSL_use_cert(ssl, certfile) \
676 	SSL_use_certificate_file(ssl, certfile, SSL_FILETYPE_PEM)
677 # define SSL_USE_CERT "SSL_use_certificate_file"
678 
679 	if (bitset(TLS_S_CERT_OK, status) &&
680 	    SSL_use_cert(ssl, certfile) <= 0)
681 	{
682 		if (LogLevel > 7)
683 		{
684 			sm_syslog(LOG_WARNING, NOQID,
685 				  "STARTTLS=%s, error: %s(%s) failed",
686 				  who, SSL_USE_CERT, certfile);
687 			if (LogLevel > 9)
688 				tlslogerr(LOG_WARNING, who);
689 		}
690 		if (bitset(TLS_I_USE_CERT, req))
691 			return false;
692 	}
693 	if (bitset(TLS_S_KEY_OK, status) &&
694 	    SSL_use_PrivateKey_file(ssl, keyfile, SSL_FILETYPE_PEM) <= 0)
695 	{
696 		if (LogLevel > 7)
697 		{
698 			sm_syslog(LOG_WARNING, NOQID,
699 				  "STARTTLS=%s, error: SSL_use_PrivateKey_file(%s) failed",
700 				  who, keyfile);
701 			if (LogLevel > 9)
702 				tlslogerr(LOG_WARNING, who);
703 		}
704 		if (bitset(TLS_I_USE_KEY, req))
705 			return false;
706 	}
707 
708 	/* check the private key */
709 	if (bitset(TLS_S_KEY_OK, status) &&
710 	    (r = SSL_check_private_key(ssl)) <= 0)
711 	{
712 		/* Private key does not match the certificate public key */
713 		if (LogLevel > 5)
714 		{
715 			sm_syslog(LOG_WARNING, NOQID,
716 				  "STARTTLS=%s, error: SSL_check_private_key failed(%s): %d",
717 				  who, keyfile, r);
718 			if (LogLevel > 9)
719 				tlslogerr(LOG_WARNING, who);
720 		}
721 		if (bitset(TLS_I_USE_KEY, req))
722 			return false;
723 	}
724 
725 	return true;
726 }
727 # endif /* _FFR_TLS_SE_OPTS */
728 
729 /*
730 **  INITTLS -- initialize TLS
731 **
732 **	Parameters:
733 **		ctx -- pointer to context
734 **		req -- requirements for initialization (see sendmail.h)
735 **		options -- options
736 **		srv -- server side?
737 **		certfile -- filename of certificate
738 **		keyfile -- filename of private key
739 **		cacertpath -- path to CAs
740 **		cacertfile -- file with CA(s)
741 **		dhparam -- parameters for DH
742 **
743 **	Returns:
744 **		succeeded?
745 */
746 
747 /*
748 **  The session_id_context identifies the service that created a session.
749 **  This information is used to distinguish between multiple TLS-based
750 **  servers running on the same server. We use the name of the mail system.
751 **  Note: the session cache is not persistent.
752 */
753 
754 static char server_session_id_context[] = "sendmail8";
755 
756 /* 0.9.8a and b have a problem with SSL_OP_TLS_BLOCK_PADDING_BUG */
757 #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL)
758 # define SM_SSL_OP_TLS_BLOCK_PADDING_BUG	1
759 #else
760 # define SM_SSL_OP_TLS_BLOCK_PADDING_BUG	0
761 #endif
762 
763 bool
764 inittls(ctx, req, options, srv, certfile, keyfile, cacertpath, cacertfile, dhparam)
765 	SSL_CTX **ctx;
766 	unsigned long req;
767 	unsigned long options;
768 	bool srv;
769 	char *certfile, *keyfile, *cacertpath, *cacertfile, *dhparam;
770 {
771 # if !NO_DH
772 	static DH *dh = NULL;
773 # endif /* !NO_DH */
774 	int r;
775 	bool ok;
776 	long sff, status;
777 	char *who;
778 	char *cf2, *kf2;
779 # if SM_CONF_SHM
780 	extern int ShmId;
781 # endif /* SM_CONF_SHM */
782 # if OPENSSL_VERSION_NUMBER > 0x00907000L
783 	BIO *crl_file;
784 	X509_CRL *crl;
785 	X509_STORE *store;
786 # endif /* OPENSSL_VERSION_NUMBER > 0x00907000L */
787 #if SM_SSL_OP_TLS_BLOCK_PADDING_BUG
788 	long rt_version;
789 	STACK_OF(SSL_COMP) *comp_methods;
790 #endif
791 
792 	status = TLS_S_NONE;
793 	who = srv ? "server" : "client";
794 	if (ctx == NULL)
795 	{
796 		syserr("STARTTLS=%s, inittls: ctx == NULL", who);
797 		/* NOTREACHED */
798 		SM_ASSERT(ctx != NULL);
799 	}
800 
801 	/* already initialized? (we could re-init...) */
802 	if (*ctx != NULL)
803 		return true;
804 	ok = true;
805 
806 	/*
807 	**  look for a second filename: it must be separated by a ','
808 	**  no blanks allowed (they won't be skipped).
809 	**  we change a global variable here! this change will be undone
810 	**  before return from the function but only if it returns true.
811 	**  this isn't a problem since in a failure case this function
812 	**  won't be called again with the same (overwritten) values.
813 	**  otherwise each return must be replaced with a goto endinittls.
814 	*/
815 
816 	cf2 = NULL;
817 	kf2 = NULL;
818 	if (certfile != NULL && (cf2 = strchr(certfile, ',')) != NULL)
819 	{
820 		*cf2++ = '\0';
821 		if (keyfile != NULL && (kf2 = strchr(keyfile, ',')) != NULL)
822 			*kf2++ = '\0';
823 	}
824 
825 	/*
826 	**  Check whether files/paths are defined
827 	*/
828 
829 	TLS_OK_F(certfile, "CertFile", bitset(TLS_I_CERT_EX, req),
830 		 TLS_S_CERT_EX, srv ? TLS_T_SRV : TLS_T_CLT);
831 	TLS_OK_F(keyfile, "KeyFile", bitset(TLS_I_KEY_EX, req),
832 		 TLS_S_KEY_EX, srv ? TLS_T_SRV : TLS_T_CLT);
833 	TLS_OK_F(cacertpath, "CACertPath", bitset(TLS_I_CERTP_EX, req),
834 		 TLS_S_CERTP_EX, TLS_T_OTHER);
835 	TLS_OK_F(cacertfile, "CACertFile", bitset(TLS_I_CERTF_EX, req),
836 		 TLS_S_CERTF_EX, TLS_T_OTHER);
837 
838 # if OPENSSL_VERSION_NUMBER > 0x00907000L
839 	TLS_OK_F(CRLFile, "CRLFile", bitset(TLS_I_CRLF_EX, req),
840 		 TLS_S_CRLF_EX, TLS_T_OTHER);
841 # endif /* OPENSSL_VERSION_NUMBER > 0x00907000L */
842 
843 	/*
844 	**  if the second file is specified it must exist
845 	**  XXX: it is possible here to define only one of those files
846 	*/
847 
848 	if (cf2 != NULL)
849 	{
850 		TLS_OK_F(cf2, "CertFile", bitset(TLS_I_CERT_EX, req),
851 			 TLS_S_CERT2_EX, srv ? TLS_T_SRV : TLS_T_CLT);
852 	}
853 	if (kf2 != NULL)
854 	{
855 		TLS_OK_F(kf2, "KeyFile", bitset(TLS_I_KEY_EX, req),
856 			 TLS_S_KEY2_EX, srv ? TLS_T_SRV : TLS_T_CLT);
857 	}
858 
859 	/*
860 	**  valid values for dhparam are (only the first char is checked)
861 	**  none	no parameters: don't use DH
862 	**  i		use precomputed 2048 bit parameters
863 	**  512		use precomputed 512 bit parameters
864 	**  1024	generate 1024 bit parameters
865 	**  2048	generate 2048 bit parameters
866 	**  /file/name	read parameters from /file/name
867 	*/
868 
869 #define SET_DH_DFL	\
870 	do {	\
871 		dhparam = "I";	\
872 		req |= TLS_I_DHFIXED;	\
873 	} while (0)
874 
875 	if (bitset(TLS_I_TRY_DH, req))
876 	{
877 		if (dhparam != NULL)
878 		{
879 			char c = *dhparam;
880 
881 			if (c == '1')
882 				req |= TLS_I_DH1024;
883 			else if (c == 'I' || c == 'i')
884 				req |= TLS_I_DHFIXED;
885 			else if (c == '2')
886 				req |= TLS_I_DH2048;
887 			else if (c == '5')
888 				req |= TLS_I_DH512;
889 			else if (c == 'n' || c == 'N')
890 				req &= ~TLS_I_TRY_DH;
891 			else if (c != '/')
892 			{
893 				if (LogLevel > 12)
894 					sm_syslog(LOG_WARNING, NOQID,
895 						  "STARTTLS=%s, error: illegal value '%s' for DHParameters",
896 						  who, dhparam);
897 				dhparam = NULL;
898 			}
899 		}
900 		if (dhparam == NULL)
901 			SET_DH_DFL;
902 		else if (*dhparam == '/')
903 		{
904 			TLS_OK_F(dhparam, "DHParameters",
905 				 bitset(TLS_I_DHPAR_EX, req),
906 				 TLS_S_DHPAR_EX, TLS_T_OTHER);
907 		}
908 	}
909 	if (!ok)
910 		return ok;
911 
912 	/* certfile etc. must be "safe". */
913 	sff = SFF_REGONLY | SFF_SAFEDIRPATH | SFF_NOWLINK
914 	     | SFF_NOGWFILES | SFF_NOWWFILES
915 	     | SFF_MUSTOWN | SFF_ROOTOK | SFF_OPENASROOT;
916 	if (DontLockReadFiles)
917 		sff |= SFF_NOLOCK;
918 
919 	TLS_SAFE_F(certfile, sff | TLS_UNR(TLS_I_CERT_UNR, req),
920 		   bitset(TLS_I_CERT_EX, req),
921 		   bitset(TLS_S_CERT_EX, status), TLS_S_CERT_OK, srv);
922 	TLS_SAFE_F(keyfile, sff | TLS_KEYSFF(req),
923 		   bitset(TLS_I_KEY_EX, req),
924 		   bitset(TLS_S_KEY_EX, status), TLS_S_KEY_OK, srv);
925 	TLS_SAFE_F(cacertfile, sff | TLS_UNR(TLS_I_CERTF_UNR, req),
926 		   bitset(TLS_I_CERTF_EX, req),
927 		   bitset(TLS_S_CERTF_EX, status), TLS_S_CERTF_OK, srv);
928 	if (dhparam != NULL && *dhparam == '/')
929 	{
930 		TLS_SAFE_F(dhparam, sff | TLS_UNR(TLS_I_DHPAR_UNR, req),
931 			   bitset(TLS_I_DHPAR_EX, req),
932 			   bitset(TLS_S_DHPAR_EX, status), TLS_S_DHPAR_OK, srv);
933 		if (!bitset(TLS_S_DHPAR_OK, status))
934 			SET_DH_DFL;
935 	}
936 # if OPENSSL_VERSION_NUMBER > 0x00907000L
937 	TLS_SAFE_F(CRLFile, sff | TLS_UNR(TLS_I_CRLF_UNR, req),
938 		   bitset(TLS_I_CRLF_EX, req),
939 		   bitset(TLS_S_CRLF_EX, status), TLS_S_CRLF_OK, srv);
940 # endif /* OPENSSL_VERSION_NUMBER > 0x00907000L */
941 	if (!ok)
942 		return ok;
943 	if (cf2 != NULL)
944 	{
945 		TLS_SAFE_F(cf2, sff | TLS_UNR(TLS_I_CERT_UNR, req),
946 			   bitset(TLS_I_CERT_EX, req),
947 			   bitset(TLS_S_CERT2_EX, status), TLS_S_CERT2_OK, srv);
948 	}
949 	if (kf2 != NULL)
950 	{
951 		TLS_SAFE_F(kf2, sff | TLS_KEYSFF(req),
952 			   bitset(TLS_I_KEY_EX, req),
953 			   bitset(TLS_S_KEY2_EX, status), TLS_S_KEY2_OK, srv);
954 	}
955 
956 	/* create a method and a new context */
957 	if ((*ctx = SSL_CTX_new(srv ? SSLv23_server_method() :
958 				      SSLv23_client_method())) == NULL)
959 	{
960 		if (LogLevel > 7)
961 			sm_syslog(LOG_WARNING, NOQID,
962 				  "STARTTLS=%s, error: SSL_CTX_new(SSLv23_%s_method()) failed",
963 				  who, who);
964 		if (LogLevel > 9)
965 			tlslogerr(LOG_WARNING, who);
966 		return false;
967 	}
968 
969 # if OPENSSL_VERSION_NUMBER > 0x00907000L
970 	if (CRLFile != NULL)
971 	{
972 		/* get a pointer to the current certificate validation store */
973 		store = SSL_CTX_get_cert_store(*ctx);	/* does not fail */
974 		crl_file = BIO_new(BIO_s_file());
975 		if (crl_file != NULL)
976 		{
977 			if (BIO_read_filename(crl_file, CRLFile) >= 0)
978 			{
979 				crl = PEM_read_bio_X509_CRL(crl_file, NULL,
980 							NULL, NULL);
981 				BIO_free(crl_file);
982 				X509_STORE_add_crl(store, crl);
983 				X509_CRL_free(crl);
984 				X509_STORE_set_flags(store,
985 					X509_V_FLAG_CRL_CHECK|X509_V_FLAG_CRL_CHECK_ALL);
986 				X509_STORE_set_verify_cb_func(store,
987 						x509_verify_cb);
988 			}
989 			else
990 			{
991 				if (LogLevel > 9)
992 				{
993 					sm_syslog(LOG_WARNING, NOQID,
994 						  "STARTTLS=%s, error: PEM_read_bio_X509_CRL(%s)=failed",
995 						  who, CRLFile);
996 				}
997 
998 				/* avoid memory leaks */
999 				BIO_free(crl_file);
1000 				return false;
1001 			}
1002 
1003 		}
1004 		else if (LogLevel > 9)
1005 			sm_syslog(LOG_WARNING, NOQID,
1006 				  "STARTTLS=%s, error: BIO_new=failed", who);
1007 	}
1008 	else
1009 		store = NULL;
1010 #  if _FFR_CRLPATH
1011 	if (CRLPath != NULL && store != NULL)
1012 	{
1013 		X509_LOOKUP *lookup;
1014 
1015 		lookup = X509_STORE_add_lookup(store, X509_LOOKUP_hash_dir());
1016 		if (lookup == NULL)
1017 		{
1018 			if (LogLevel > 9)
1019 			{
1020 				sm_syslog(LOG_WARNING, NOQID,
1021 					  "STARTTLS=%s, error: X509_STORE_add_lookup(hash)=failed",
1022 					  who, CRLFile);
1023 			}
1024 			return false;
1025 		}
1026 		X509_LOOKUP_add_dir(lookup, CRLPath, X509_FILETYPE_PEM);
1027 		X509_STORE_set_flags(store,
1028 			X509_V_FLAG_CRL_CHECK|X509_V_FLAG_CRL_CHECK_ALL);
1029 	}
1030 #  endif /* _FFR_CRLPATH */
1031 # endif /* OPENSSL_VERSION_NUMBER > 0x00907000L */
1032 
1033 # if TLS_NO_RSA
1034 	/* turn off backward compatibility, required for no-rsa */
1035 	SSL_CTX_set_options(*ctx, SSL_OP_NO_SSLv2);
1036 # endif /* TLS_NO_RSA */
1037 
1038 
1039 # if !TLS_NO_RSA
1040 	/*
1041 	**  Create a temporary RSA key
1042 	**  XXX  Maybe we shouldn't create this always (even though it
1043 	**  is only at startup).
1044 	**  It is a time-consuming operation and it is not always necessary.
1045 	**  maybe we should do it only on demand...
1046 	*/
1047 
1048 #  if SM_CONF_SHM
1049 	if (bitset(TLS_I_RSA_TMP, req)
1050 	    && ShmId != SM_SHM_NO_ID)
1051 	{
1052 		BIGNUM *bn;
1053 
1054 		bn = BN_new();
1055 		rsa_tmp = RSA_new();
1056 		if (!bn || !rsa_tmp || !BN_set_word(bn, RSA_F4)) {
1057 			RSA_free(rsa_tmp);
1058 			rsa_tmp = NULL;
1059 		}
1060 		if (rsa_tmp)
1061 		{
1062 			if (!RSA_generate_key_ex(rsa_tmp, RSA_KEYLENGTH, bn, NULL))
1063 			{
1064 				RSA_free(rsa_tmp);
1065 				rsa_tmp = NULL;
1066 			}
1067 		}
1068 		BN_free(bn);
1069 		if (!rsa_tmp)
1070 		{
1071 			if (LogLevel > 7)
1072 			{
1073 				sm_syslog(LOG_WARNING, NOQID,
1074 					  "STARTTLS=%s, error: RSA_generate_key failed",
1075 					  who);
1076 				if (LogLevel > 9)
1077 					tlslogerr(LOG_WARNING, who);
1078 			}
1079 			return false;
1080 		}
1081 	}
1082 #  endif /* SM_CONF_SHM */
1083 # endif /* !TLS_NO_RSA */
1084 
1085 	/*
1086 	**  load private key
1087 	**  XXX change this for DSA-only version
1088 	*/
1089 
1090 	if (bitset(TLS_S_KEY_OK, status) &&
1091 	    SSL_CTX_use_PrivateKey_file(*ctx, keyfile,
1092 					 SSL_FILETYPE_PEM) <= 0)
1093 	{
1094 		if (LogLevel > 7)
1095 		{
1096 			sm_syslog(LOG_WARNING, NOQID,
1097 				  "STARTTLS=%s, error: SSL_CTX_use_PrivateKey_file(%s) failed",
1098 				  who, keyfile);
1099 			if (LogLevel > 9)
1100 				tlslogerr(LOG_WARNING, who);
1101 		}
1102 		if (bitset(TLS_I_USE_KEY, req))
1103 			return false;
1104 	}
1105 
1106 #if _FFR_TLS_USE_CERTIFICATE_CHAIN_FILE
1107 # define SSL_CTX_use_cert(ssl_ctx, certfile) \
1108 	SSL_CTX_use_certificate_chain_file(ssl_ctx, certfile)
1109 # define SSL_CTX_USE_CERT "SSL_CTX_use_certificate_chain_file"
1110 #else
1111 # define SSL_CTX_use_cert(ssl_ctx, certfile) \
1112 	SSL_CTX_use_certificate_file(ssl_ctx, certfile, SSL_FILETYPE_PEM)
1113 # define SSL_CTX_USE_CERT "SSL_CTX_use_certificate_file"
1114 #endif
1115 
1116 	/* get the certificate file */
1117 	if (bitset(TLS_S_CERT_OK, status) &&
1118 	    SSL_CTX_use_cert(*ctx, certfile) <= 0)
1119 	{
1120 		if (LogLevel > 7)
1121 		{
1122 			sm_syslog(LOG_WARNING, NOQID,
1123 				  "STARTTLS=%s, error: %s(%s) failed",
1124 				  who, SSL_CTX_USE_CERT, certfile);
1125 			if (LogLevel > 9)
1126 				tlslogerr(LOG_WARNING, who);
1127 		}
1128 		if (bitset(TLS_I_USE_CERT, req))
1129 			return false;
1130 	}
1131 
1132 	/* check the private key */
1133 	if (bitset(TLS_S_KEY_OK, status) &&
1134 	    (r = SSL_CTX_check_private_key(*ctx)) <= 0)
1135 	{
1136 		/* Private key does not match the certificate public key */
1137 		if (LogLevel > 5)
1138 		{
1139 			sm_syslog(LOG_WARNING, NOQID,
1140 				  "STARTTLS=%s, error: SSL_CTX_check_private_key failed(%s): %d",
1141 				  who, keyfile, r);
1142 			if (LogLevel > 9)
1143 				tlslogerr(LOG_WARNING, who);
1144 		}
1145 		if (bitset(TLS_I_USE_KEY, req))
1146 			return false;
1147 	}
1148 
1149 	/* XXX this code is pretty much duplicated from above! */
1150 
1151 	/* load private key */
1152 	if (bitset(TLS_S_KEY2_OK, status) &&
1153 	    SSL_CTX_use_PrivateKey_file(*ctx, kf2, SSL_FILETYPE_PEM) <= 0)
1154 	{
1155 		if (LogLevel > 7)
1156 		{
1157 			sm_syslog(LOG_WARNING, NOQID,
1158 				  "STARTTLS=%s, error: SSL_CTX_use_PrivateKey_file(%s) failed",
1159 				  who, kf2);
1160 			if (LogLevel > 9)
1161 				tlslogerr(LOG_WARNING, who);
1162 		}
1163 	}
1164 
1165 	/* get the certificate file */
1166 	if (bitset(TLS_S_CERT2_OK, status) &&
1167 	    SSL_CTX_use_cert(*ctx, cf2) <= 0)
1168 	{
1169 		if (LogLevel > 7)
1170 		{
1171 			sm_syslog(LOG_WARNING, NOQID,
1172 				  "STARTTLS=%s, error: %s(%s) failed",
1173 				  who, SSL_CTX_USE_CERT, cf2);
1174 			if (LogLevel > 9)
1175 				tlslogerr(LOG_WARNING, who);
1176 		}
1177 	}
1178 
1179 	/* also check the private key */
1180 	if (bitset(TLS_S_KEY2_OK, status) &&
1181 	    (r = SSL_CTX_check_private_key(*ctx)) <= 0)
1182 	{
1183 		/* Private key does not match the certificate public key */
1184 		if (LogLevel > 5)
1185 		{
1186 			sm_syslog(LOG_WARNING, NOQID,
1187 				  "STARTTLS=%s, error: SSL_CTX_check_private_key 2 failed: %d",
1188 				  who, r);
1189 			if (LogLevel > 9)
1190 				tlslogerr(LOG_WARNING, who);
1191 		}
1192 	}
1193 
1194 	/* SSL_CTX_set_quiet_shutdown(*ctx, 1); violation of standard? */
1195 
1196 #if SM_SSL_OP_TLS_BLOCK_PADDING_BUG
1197 
1198 	/*
1199 	**  In OpenSSL 0.9.8[ab], enabling zlib compression breaks the
1200 	**  padding bug work-around, leading to false positives and
1201 	**  failed connections. We may not interoperate with systems
1202 	**  with the bug, but this is better than breaking on all 0.9.8[ab]
1203 	**  systems that have zlib support enabled.
1204 	**  Note: this checks the runtime version of the library, not
1205 	**  just the compile time version.
1206 	*/
1207 
1208 	rt_version = SSLeay();
1209 	if (rt_version >= 0x00908000L && rt_version <= 0x0090802fL)
1210 	{
1211 		comp_methods = SSL_COMP_get_compression_methods();
1212 		if (comp_methods != NULL && sk_SSL_COMP_num(comp_methods) > 0)
1213 			options &= ~SSL_OP_TLS_BLOCK_PADDING_BUG;
1214 	}
1215 #endif
1216 	SSL_CTX_set_options(*ctx, (long) options);
1217 
1218 # if !NO_DH
1219 	/* Diffie-Hellman initialization */
1220 	if (bitset(TLS_I_TRY_DH, req))
1221 	{
1222 #if _FFR_TLS_EC
1223 		EC_KEY *ecdh;
1224 #endif /* _FFR_TLS_EC */
1225 
1226 		if (tTd(96, 8))
1227 			sm_dprintf("inittls: req=%#lx, status=%#lx\n",
1228 				req, status);
1229 		if (bitset(TLS_S_DHPAR_OK, status))
1230 		{
1231 			BIO *bio;
1232 
1233 			if ((bio = BIO_new_file(dhparam, "r")) != NULL)
1234 			{
1235 				dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL);
1236 				BIO_free(bio);
1237 				if (dh == NULL && LogLevel > 7)
1238 				{
1239 					unsigned long err;
1240 
1241 					err = ERR_get_error();
1242 					sm_syslog(LOG_WARNING, NOQID,
1243 						  "STARTTLS=%s, error: cannot read DH parameters(%s): %s",
1244 						  who, dhparam,
1245 						  ERR_error_string(err, NULL));
1246 					if (LogLevel > 9)
1247 						tlslogerr(LOG_WARNING, who);
1248 					SET_DH_DFL;
1249 				}
1250 			}
1251 			else
1252 			{
1253 				if (LogLevel > 5)
1254 				{
1255 					sm_syslog(LOG_WARNING, NOQID,
1256 						  "STARTTLS=%s, error: BIO_new_file(%s) failed",
1257 						  who, dhparam);
1258 					if (LogLevel > 9)
1259 						tlslogerr(LOG_WARNING, who);
1260 				}
1261 			}
1262 		}
1263 		if (dh == NULL && bitset(TLS_I_DH1024|TLS_I_DH2048, req))
1264 		{
1265 			int bits;
1266 			DSA *dsa;
1267 
1268 			bits = bitset(TLS_I_DH2048, req) ? 2048 : 1024;
1269 			if (tTd(96, 2))
1270 				sm_dprintf("inittls: Generating %d bit DH parameters\n", bits);
1271 
1272 			/* this takes a while! */
1273 			dsa = DSA_new();
1274 			if (dsa) {
1275 				int r;
1276 
1277 				r = DSA_generate_parameters_ex(dsa, bits, NULL, 0,
1278 							    NULL, NULL, NULL);
1279 				if (r != 0)
1280 					dh = DSA_dup_DH(dsa);
1281 			}
1282 			DSA_free(dsa);
1283 		}
1284 		else if (dh == NULL && bitset(TLS_I_DHFIXED, req))
1285 		{
1286 			if (tTd(96, 2))
1287 				sm_dprintf("inittls: Using precomputed 2048 bit DH parameters\n");
1288 			dh = get_dh2048();
1289 		}
1290 		else if (dh == NULL && bitset(TLS_I_DH512, req))
1291 		{
1292 			if (tTd(96, 2))
1293 				sm_dprintf("inittls: Using precomputed 512 bit DH parameters\n");
1294 			dh = get_dh512();
1295 		}
1296 
1297 		if (dh == NULL)
1298 		{
1299 			if (LogLevel > 9)
1300 			{
1301 				unsigned long err;
1302 
1303 				err = ERR_get_error();
1304 				sm_syslog(LOG_WARNING, NOQID,
1305 					  "STARTTLS=%s, error: cannot read or set DH parameters(%s): %s",
1306 					  who, dhparam,
1307 					  ERR_error_string(err, NULL));
1308 			}
1309 			if (bitset(TLS_I_REQ_DH, req))
1310 				return false;
1311 		}
1312 		else
1313 		{
1314 			/* important to avoid small subgroup attacks */
1315 			SSL_CTX_set_options(*ctx, SSL_OP_SINGLE_DH_USE);
1316 
1317 			SSL_CTX_set_tmp_dh(*ctx, dh);
1318 			if (LogLevel > 13)
1319 				sm_syslog(LOG_INFO, NOQID,
1320 					  "STARTTLS=%s, Diffie-Hellman init, key=%d bit (%c)",
1321 					  who, 8 * DH_size(dh), *dhparam);
1322 			DH_free(dh);
1323 		}
1324 
1325 #if _FFR_TLS_EC
1326 		ecdh = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
1327 		if (ecdh != NULL)
1328 		{
1329 			SSL_CTX_set_options(*ctx, SSL_OP_SINGLE_ECDH_USE);
1330 			SSL_CTX_set_tmp_ecdh(*ctx, ecdh);
1331 			EC_KEY_free(ecdh);
1332 		}
1333 #endif /* _FFR_TLS_EC */
1334 
1335 	}
1336 # endif /* !NO_DH */
1337 
1338 
1339 	/* XXX do we need this cache here? */
1340 	if (bitset(TLS_I_CACHE, req))
1341 	{
1342 		SSL_CTX_sess_set_cache_size(*ctx, 1);
1343 		SSL_CTX_set_timeout(*ctx, 1);
1344 		SSL_CTX_set_session_id_context(*ctx,
1345 			(void *) &server_session_id_context,
1346 			sizeof(server_session_id_context));
1347 		(void) SSL_CTX_set_session_cache_mode(*ctx,
1348 				SSL_SESS_CACHE_SERVER);
1349 	}
1350 	else
1351 	{
1352 		(void) SSL_CTX_set_session_cache_mode(*ctx,
1353 				SSL_SESS_CACHE_OFF);
1354 	}
1355 
1356 	/* load certificate locations and default CA paths */
1357 	if (bitset(TLS_S_CERTP_EX, status) && bitset(TLS_S_CERTF_EX, status))
1358 	{
1359 		if ((r = SSL_CTX_load_verify_locations(*ctx, cacertfile,
1360 						       cacertpath)) == 1)
1361 		{
1362 # if !TLS_NO_RSA
1363 			if (bitset(TLS_I_RSA_TMP, req))
1364 				SSL_CTX_set_tmp_rsa_callback(*ctx, tmp_rsa_key);
1365 # endif /* !TLS_NO_RSA */
1366 
1367 			/*
1368 			**  We have to install our own verify callback:
1369 			**  SSL_VERIFY_PEER requests a client cert but even
1370 			**  though *FAIL_IF* isn't set, the connection
1371 			**  will be aborted if the client presents a cert
1372 			**  that is not "liked" (can't be verified?) by
1373 			**  the TLS library :-(
1374 			*/
1375 
1376 			/*
1377 			**  XXX currently we could call tls_set_verify()
1378 			**  but we hope that that function will later on
1379 			**  only set the mode per connection.
1380 			*/
1381 			SSL_CTX_set_verify(*ctx,
1382 				bitset(TLS_I_NO_VRFY, req) ? SSL_VERIFY_NONE
1383 							   : SSL_VERIFY_PEER,
1384 				NULL);
1385 
1386 			/* install verify callback */
1387 			SSL_CTX_set_cert_verify_callback(*ctx, tls_verify_cb,
1388 							 NULL);
1389 			SSL_CTX_set_client_CA_list(*ctx,
1390 				SSL_load_client_CA_file(cacertfile));
1391 		}
1392 		else
1393 		{
1394 			/*
1395 			**  can't load CA data; do we care?
1396 			**  the data is necessary to authenticate the client,
1397 			**  which in turn would be necessary
1398 			**  if we want to allow relaying based on it.
1399 			*/
1400 			if (LogLevel > 5)
1401 			{
1402 				sm_syslog(LOG_WARNING, NOQID,
1403 					  "STARTTLS=%s, error: load verify locs %s, %s failed: %d",
1404 					  who, cacertpath, cacertfile, r);
1405 				if (LogLevel > 9)
1406 					tlslogerr(LOG_WARNING, who);
1407 			}
1408 			if (bitset(TLS_I_VRFY_LOC, req))
1409 				return false;
1410 		}
1411 	}
1412 
1413 	/* XXX: make this dependent on an option? */
1414 	if (tTd(96, 9))
1415 		SSL_CTX_set_info_callback(*ctx, apps_ssl_info_cb);
1416 
1417 	/* install our own cipher list */
1418 	if (CipherList != NULL && *CipherList != '\0')
1419 	{
1420 		if (SSL_CTX_set_cipher_list(*ctx, CipherList) <= 0)
1421 		{
1422 			if (LogLevel > 7)
1423 			{
1424 				sm_syslog(LOG_WARNING, NOQID,
1425 					  "STARTTLS=%s, error: SSL_CTX_set_cipher_list(%s) failed, list ignored",
1426 					  who, CipherList);
1427 
1428 				if (LogLevel > 9)
1429 					tlslogerr(LOG_WARNING, who);
1430 			}
1431 			/* failure if setting to this list is required? */
1432 		}
1433 	}
1434 
1435 	if (LogLevel > 12)
1436 		sm_syslog(LOG_INFO, NOQID, "STARTTLS=%s, init=%d", who, ok);
1437 
1438 # if 0
1439 	/*
1440 	**  this label is required if we want to have a "clean" exit
1441 	**  see the comments above at the initialization of cf2
1442 	*/
1443 
1444     endinittls:
1445 # endif /* 0 */
1446 
1447 	/* undo damage to global variables */
1448 	if (cf2 != NULL)
1449 		*--cf2 = ',';
1450 	if (kf2 != NULL)
1451 		*--kf2 = ',';
1452 
1453 	return ok;
1454 }
1455 
1456 /*
1457 **  CERT_FP -- get cert fingerprint
1458 **
1459 **	Parameters:
1460 **		cert -- TLS cert
1461 **		mac -- macro storage
1462 **		macro -- where to store cert fp
1463 **
1464 **	Returns:
1465 **		<=0: cert fp calculation failed
1466 **		>0: cert fp calculation ok
1467 */
1468 
1469 static int
1470 cert_fp(cert, evp_digest, mac, macro)
1471 	X509 *cert;
1472 	const EVP_MD *evp_digest;
1473 	MACROS_T *mac;
1474 	char *macro;
1475 {
1476 	unsigned int n;
1477 	int r;
1478 	unsigned char md[EVP_MAX_MD_SIZE];
1479 	char md5h[EVP_MAX_MD_SIZE * 3];
1480 	static const char hexcodes[] = "0123456789ABCDEF";
1481 
1482 	n = 0;
1483 	if (X509_digest(cert, EVP_digest, md, &n) == 0 || n <= 0)
1484 	{
1485 		macdefine(mac, A_TEMP, macid(macro), "");
1486 		return 0;
1487 	}
1488 
1489 	SM_ASSERT((n * 3) + 2 < sizeof(md5h));
1490 	for (r = 0; r < (int) n; r++)
1491 	{
1492 		md5h[r * 3] = hexcodes[(md[r] & 0xf0) >> 4];
1493 		md5h[(r * 3) + 1] = hexcodes[(md[r] & 0x0f)];
1494 		md5h[(r * 3) + 2] = ':';
1495 	}
1496 	md5h[(n * 3) - 1] = '\0';
1497 	macdefine(mac, A_TEMP, macid(macro), md5h);
1498 	return 1;
1499 }
1500 
1501 /*
1502 **  TLS_GET_INFO -- get information about TLS connection
1503 **
1504 **	Parameters:
1505 **		ssl -- TLS connection structure
1506 **		srv -- server or client
1507 **		host -- hostname of other side
1508 **		mac -- macro storage
1509 **		certreq -- did we ask for a cert?
1510 **
1511 **	Returns:
1512 **		result of authentication.
1513 **
1514 **	Side Effects:
1515 **		sets various TLS related macros.
1516 */
1517 
1518 int
1519 tls_get_info(ssl, srv, host, mac, certreq)
1520 	SSL *ssl;
1521 	bool srv;
1522 	char *host;
1523 	MACROS_T *mac;
1524 	bool certreq;
1525 {
1526 	const SSL_CIPHER *c;
1527 	int b, r;
1528 	long verifyok;
1529 	char *s, *who;
1530 	char bitstr[16];
1531 	X509 *cert;
1532 
1533 	c = SSL_get_current_cipher(ssl);
1534 
1535 	/* cast is just workaround for compiler warning */
1536 	macdefine(mac, A_TEMP, macid("{cipher}"),
1537 		  (char *) SSL_CIPHER_get_name(c));
1538 	b = SSL_CIPHER_get_bits(c, &r);
1539 	(void) sm_snprintf(bitstr, sizeof(bitstr), "%d", b);
1540 	macdefine(mac, A_TEMP, macid("{cipher_bits}"), bitstr);
1541 	(void) sm_snprintf(bitstr, sizeof(bitstr), "%d", r);
1542 	macdefine(mac, A_TEMP, macid("{alg_bits}"), bitstr);
1543 	s = (char *) SSL_get_version(ssl);
1544 	if (s == NULL)
1545 		s = "UNKNOWN";
1546 	macdefine(mac, A_TEMP, macid("{tls_version}"), s);
1547 
1548 	who = srv ? "server" : "client";
1549 	cert = SSL_get_peer_certificate(ssl);
1550 	verifyok = SSL_get_verify_result(ssl);
1551 	if (LogLevel > 14)
1552 		sm_syslog(LOG_INFO, NOQID,
1553 			  "STARTTLS=%s, get_verify: %ld get_peer: 0x%lx",
1554 			  who, verifyok, (unsigned long) cert);
1555 	if (cert != NULL)
1556 	{
1557 		X509_NAME *subj, *issuer;
1558 		char buf[MAXNAME];
1559 
1560 		subj = X509_get_subject_name(cert);
1561 		issuer = X509_get_issuer_name(cert);
1562 		X509_NAME_oneline(subj, buf, sizeof(buf));
1563 		macdefine(mac, A_TEMP, macid("{cert_subject}"),
1564 			 xtextify(buf, "<>\")"));
1565 		X509_NAME_oneline(issuer, buf, sizeof(buf));
1566 		macdefine(mac, A_TEMP, macid("{cert_issuer}"),
1567 			 xtextify(buf, "<>\")"));
1568 
1569 # define LL_BADCERT	8
1570 
1571 #define CERTFPMACRO (CertFingerprintAlgorithm != NULL ? "{cert_fp}" : "{cert_md5}")
1572 
1573 #define CHECK_X509_NAME(which)	\
1574 	do {	\
1575 		if (r == -1)	\
1576 		{		\
1577 			sm_strlcpy(buf, "BadCertificateUnknown", sizeof(buf)); \
1578 			if (LogLevel > LL_BADCERT)	\
1579 				sm_syslog(LOG_INFO, NOQID,	\
1580 					"STARTTLS=%s, relay=%.100s, field=%s, status=failed to extract CN",	\
1581 					who,	\
1582 					host == NULL ? "local" : host,	\
1583 					which);	\
1584 		}		\
1585 		else if ((size_t)r >= sizeof(buf) - 1)	\
1586 		{		\
1587 			sm_strlcpy(buf, "BadCertificateTooLong", sizeof(buf)); \
1588 			if (LogLevel > 7)	\
1589 				sm_syslog(LOG_INFO, NOQID,	\
1590 					"STARTTLS=%s, relay=%.100s, field=%s, status=CN too long",	\
1591 					who,	\
1592 					host == NULL ? "local" : host,	\
1593 					which);	\
1594 		}		\
1595 		else if ((size_t)r > strlen(buf))	\
1596 		{		\
1597 			sm_strlcpy(buf, "BadCertificateContainsNUL",	\
1598 				sizeof(buf));	\
1599 			if (LogLevel > 7)	\
1600 				sm_syslog(LOG_INFO, NOQID,	\
1601 					"STARTTLS=%s, relay=%.100s, field=%s, status=CN contains NUL",	\
1602 					who,	\
1603 					host == NULL ? "local" : host,	\
1604 					which);	\
1605 		}		\
1606 	} while (0)
1607 
1608 		r = X509_NAME_get_text_by_NID(subj, NID_commonName, buf,
1609 			sizeof buf);
1610 		CHECK_X509_NAME("cn_subject");
1611 		macdefine(mac, A_TEMP, macid("{cn_subject}"),
1612 			 xtextify(buf, "<>\")"));
1613 		r = X509_NAME_get_text_by_NID(issuer, NID_commonName, buf,
1614 			sizeof buf);
1615 		CHECK_X509_NAME("cn_issuer");
1616 		macdefine(mac, A_TEMP, macid("{cn_issuer}"),
1617 			 xtextify(buf, "<>\")"));
1618 		(void) cert_fp(cert, EVP_digest, mac, CERTFPMACRO);
1619 	}
1620 	else
1621 	{
1622 		macdefine(mac, A_PERM, macid("{cert_subject}"), "");
1623 		macdefine(mac, A_PERM, macid("{cert_issuer}"), "");
1624 		macdefine(mac, A_PERM, macid("{cn_subject}"), "");
1625 		macdefine(mac, A_PERM, macid("{cn_issuer}"), "");
1626 		macdefine(mac, A_TEMP, macid(CERTFPMACRO), "");
1627 	}
1628 	switch (verifyok)
1629 	{
1630 	  case X509_V_OK:
1631 		if (cert != NULL)
1632 		{
1633 			s = "OK";
1634 			r = TLS_AUTH_OK;
1635 		}
1636 		else
1637 		{
1638 			s = certreq ? "NO" : "NOT",
1639 			r = TLS_AUTH_NO;
1640 		}
1641 		break;
1642 	  default:
1643 		s = "FAIL";
1644 		r = TLS_AUTH_FAIL;
1645 		break;
1646 	}
1647 	macdefine(mac, A_PERM, macid("{verify}"), s);
1648 	if (cert != NULL)
1649 		X509_free(cert);
1650 
1651 	/* do some logging */
1652 	if (LogLevel > 8)
1653 	{
1654 		char *vers, *s1, *s2, *cbits, *algbits;
1655 
1656 		vers = macget(mac, macid("{tls_version}"));
1657 		cbits = macget(mac, macid("{cipher_bits}"));
1658 		algbits = macget(mac, macid("{alg_bits}"));
1659 		s1 = macget(mac, macid("{verify}"));
1660 		s2 = macget(mac, macid("{cipher}"));
1661 
1662 		/* XXX: maybe cut off ident info? */
1663 		sm_syslog(LOG_INFO, NOQID,
1664 			  "STARTTLS=%s, relay=%.100s, version=%.16s, verify=%.16s, cipher=%.64s, bits=%.6s/%.6s",
1665 			  who,
1666 			  host == NULL ? "local" : host,
1667 			  vers, s1, s2, /* sm_snprintf() can deal with NULL */
1668 			  algbits == NULL ? "0" : algbits,
1669 			  cbits == NULL ? "0" : cbits);
1670 		if (LogLevel > 11)
1671 		{
1672 			/*
1673 			**  Maybe run xuntextify on the strings?
1674 			**  That is easier to read but makes it maybe a bit
1675 			**  more complicated to figure out the right values
1676 			**  for the access map...
1677 			*/
1678 
1679 			s1 = macget(mac, macid("{cert_subject}"));
1680 			s2 = macget(mac, macid("{cert_issuer}"));
1681 			sm_syslog(LOG_INFO, NOQID,
1682 				  "STARTTLS=%s, cert-subject=%.256s, cert-issuer=%.256s, verifymsg=%s",
1683 				  who, s1, s2,
1684 				  X509_verify_cert_error_string(verifyok));
1685 		}
1686 	}
1687 	return r;
1688 }
1689 /*
1690 **  ENDTLS -- shutdown secure connection
1691 **
1692 **	Parameters:
1693 **		ssl -- SSL connection information.
1694 **		side -- server/client (for logging).
1695 **
1696 **	Returns:
1697 **		success? (EX_* code)
1698 */
1699 
1700 int
1701 endtls(ssl, side)
1702 	SSL *ssl;
1703 	char *side;
1704 {
1705 	int ret = EX_OK;
1706 
1707 	if (ssl != NULL)
1708 	{
1709 		int r;
1710 
1711 		if ((r = SSL_shutdown(ssl)) < 0)
1712 		{
1713 			if (LogLevel > 11)
1714 			{
1715 				sm_syslog(LOG_WARNING, NOQID,
1716 					  "STARTTLS=%s, SSL_shutdown failed: %d",
1717 					  side, r);
1718 				tlslogerr(LOG_WARNING, side);
1719 			}
1720 			ret = EX_SOFTWARE;
1721 		}
1722 # if !defined(OPENSSL_VERSION_NUMBER) || OPENSSL_VERSION_NUMBER > 0x0090602fL
1723 
1724 		/*
1725 		**  Bug in OpenSSL (at least up to 0.9.6b):
1726 		**  From: Lutz.Jaenicke@aet.TU-Cottbus.DE
1727 		**  Message-ID: <20010723152244.A13122@serv01.aet.tu-cottbus.de>
1728 		**  To: openssl-users@openssl.org
1729 		**  Subject: Re: SSL_shutdown() woes (fwd)
1730 		**
1731 		**  The side sending the shutdown alert first will
1732 		**  not care about the answer of the peer but will
1733 		**  immediately return with a return value of "0"
1734 		**  (ssl/s3_lib.c:ssl3_shutdown()). SSL_get_error will evaluate
1735 		**  the value of "0" and as the shutdown alert of the peer was
1736 		**  not received (actually, the program did not even wait for
1737 		**  the answer), an SSL_ERROR_SYSCALL is flagged, because this
1738 		**  is the default rule in case everything else does not apply.
1739 		**
1740 		**  For your server the problem is different, because it
1741 		**  receives the shutdown first (setting SSL_RECEIVED_SHUTDOWN),
1742 		**  then sends its response (SSL_SENT_SHUTDOWN), so for the
1743 		**  server the shutdown was successfull.
1744 		**
1745 		**  As is by know, you would have to call SSL_shutdown() once
1746 		**  and ignore an SSL_ERROR_SYSCALL returned. Then call
1747 		**  SSL_shutdown() again to actually get the server's response.
1748 		**
1749 		**  In the last discussion, Bodo Moeller concluded that a
1750 		**  rewrite of the shutdown code would be necessary, but
1751 		**  probably with another API, as the change would not be
1752 		**  compatible to the way it is now.  Things do not become
1753 		**  easier as other programs do not follow the shutdown
1754 		**  guidelines anyway, so that a lot error conditions and
1755 		**  compitibility issues would have to be caught.
1756 		**
1757 		**  For now the recommondation is to ignore the error message.
1758 		*/
1759 
1760 		else if (r == 0)
1761 		{
1762 			if (LogLevel > 15)
1763 			{
1764 				sm_syslog(LOG_WARNING, NOQID,
1765 					  "STARTTLS=%s, SSL_shutdown not done",
1766 					  side);
1767 				tlslogerr(LOG_WARNING, side);
1768 			}
1769 			ret = EX_SOFTWARE;
1770 		}
1771 # endif /* !defined(OPENSSL_VERSION_NUMBER) || OPENSSL_VERSION_NUMBER > 0x0090602fL */
1772 		SSL_free(ssl);
1773 		ssl = NULL;
1774 	}
1775 	return ret;
1776 }
1777 
1778 # if !TLS_NO_RSA
1779 /*
1780 **  TMP_RSA_KEY -- return temporary RSA key
1781 **
1782 **	Parameters:
1783 **		s -- TLS connection structure
1784 **		export --
1785 **		keylength --
1786 **
1787 **	Returns:
1788 **		temporary RSA key.
1789 */
1790 
1791 #   ifndef MAX_RSA_TMP_CNT
1792 #    define MAX_RSA_TMP_CNT	1000	/* XXX better value? */
1793 #   endif /* ! MAX_RSA_TMP_CNT */
1794 
1795 /* ARGUSED0 */
1796 static RSA *
1797 tmp_rsa_key(s, export, keylength)
1798 	SSL *s;
1799 	int export;
1800 	int keylength;
1801 {
1802 	BIGNUM *bn;
1803 	int ret;
1804 
1805 #   if SM_CONF_SHM
1806 	extern int ShmId;
1807 	extern int *PRSATmpCnt;
1808 
1809 	if (ShmId != SM_SHM_NO_ID && rsa_tmp != NULL &&
1810 	    ++(*PRSATmpCnt) < MAX_RSA_TMP_CNT)
1811 		return rsa_tmp;
1812 #   endif /* SM_CONF_SHM */
1813 
1814 	if (rsa_tmp == NULL) {
1815 		rsa_tmp = RSA_new();
1816 		if (!rsa_tmp)
1817 			return NULL;
1818 	}
1819 
1820 	bn = BN_new();
1821 	if (!bn)
1822 		return NULL;
1823 	if (!BN_set_word(bn, RSA_F4)) {
1824 		BN_free(bn);
1825 		return NULL;
1826 	}
1827 	ret = RSA_generate_key_ex(rsa_tmp, RSA_KEYLENGTH, bn, NULL);
1828 	BN_free(bn);
1829 	if (!ret)
1830 	{
1831 		if (LogLevel > 0)
1832 			sm_syslog(LOG_ERR, NOQID,
1833 				  "STARTTLS=server, tmp_rsa_key: RSA_generate_key failed!");
1834 	}
1835 	else
1836 	{
1837 #   if SM_CONF_SHM
1838 #    if 0
1839 		/*
1840 		**  XXX we can't (yet) share the new key...
1841 		**	The RSA structure contains pointers hence it can't be
1842 		**	easily kept in shared memory.  It must be transformed
1843 		**	into a continous memory region first, then stored,
1844 		**	and later read out again (each time re-transformed).
1845 		*/
1846 
1847 		if (ShmId != SM_SHM_NO_ID)
1848 			*PRSATmpCnt = 0;
1849 #    endif /* 0 */
1850 #   endif /* SM_CONF_SHM */
1851 		if (LogLevel > 9)
1852 			sm_syslog(LOG_ERR, NOQID,
1853 				  "STARTTLS=server, tmp_rsa_key: new temp RSA key");
1854 	}
1855 	return rsa_tmp;
1856 }
1857 # endif /* !TLS_NO_RSA */
1858 /*
1859 **  APPS_SSL_INFO_CB -- info callback for TLS connections
1860 **
1861 **	Parameters:
1862 **		s -- TLS connection structure
1863 **		where -- state in handshake
1864 **		ret -- return code of last operation
1865 **
1866 **	Returns:
1867 **		none.
1868 */
1869 
1870 static void
1871 apps_ssl_info_cb(s, where, ret)
1872 	CONST097 SSL *s;
1873 	int where;
1874 	int ret;
1875 {
1876 	int w;
1877 	char *str;
1878 	BIO *bio_err = NULL;
1879 
1880 	if (LogLevel > 14)
1881 		sm_syslog(LOG_INFO, NOQID,
1882 			  "STARTTLS: info_callback where=0x%x, ret=%d",
1883 			  where, ret);
1884 
1885 	w = where & ~SSL_ST_MASK;
1886 	if (bio_err == NULL)
1887 		bio_err = BIO_new_fp(stderr, BIO_NOCLOSE);
1888 
1889 	if (bitset(SSL_ST_CONNECT, w))
1890 		str = "SSL_connect";
1891 	else if (bitset(SSL_ST_ACCEPT, w))
1892 		str = "SSL_accept";
1893 	else
1894 		str = "undefined";
1895 
1896 	if (bitset(SSL_CB_LOOP, where))
1897 	{
1898 		if (LogLevel > 12)
1899 			sm_syslog(LOG_NOTICE, NOQID,
1900 				"STARTTLS: %s:%s",
1901 				str, SSL_state_string_long(s));
1902 	}
1903 	else if (bitset(SSL_CB_ALERT, where))
1904 	{
1905 		str = bitset(SSL_CB_READ, where) ? "read" : "write";
1906 		if (LogLevel > 12)
1907 			sm_syslog(LOG_NOTICE, NOQID,
1908 				"STARTTLS: SSL3 alert %s:%s:%s",
1909 				str, SSL_alert_type_string_long(ret),
1910 				SSL_alert_desc_string_long(ret));
1911 	}
1912 	else if (bitset(SSL_CB_EXIT, where))
1913 	{
1914 		if (ret == 0)
1915 		{
1916 			if (LogLevel > 7)
1917 				sm_syslog(LOG_WARNING, NOQID,
1918 					"STARTTLS: %s:failed in %s",
1919 					str, SSL_state_string_long(s));
1920 		}
1921 		else if (ret < 0)
1922 		{
1923 			if (LogLevel > 7)
1924 				sm_syslog(LOG_WARNING, NOQID,
1925 					"STARTTLS: %s:error in %s",
1926 					str, SSL_state_string_long(s));
1927 		}
1928 	}
1929 }
1930 /*
1931 **  TLS_VERIFY_LOG -- log verify error for TLS certificates
1932 **
1933 **	Parameters:
1934 **		ok -- verify ok?
1935 **		ctx -- x509 context
1936 **		name -- from where is this called?
1937 **
1938 **	Returns:
1939 **		1 -- ok
1940 */
1941 
1942 static int
1943 tls_verify_log(ok, ctx, name)
1944 	int ok;
1945 	X509_STORE_CTX *ctx;
1946 	const char *name;
1947 {
1948 	X509 *cert;
1949 	int reason, depth;
1950 	char buf[512];
1951 
1952 	cert = X509_STORE_CTX_get_current_cert(ctx);
1953 	reason = X509_STORE_CTX_get_error(ctx);
1954 	depth = X509_STORE_CTX_get_error_depth(ctx);
1955 	X509_NAME_oneline(X509_get_subject_name(cert), buf, sizeof(buf));
1956 	sm_syslog(LOG_INFO, NOQID,
1957 		  "STARTTLS: %s cert verify: depth=%d %s, state=%d, reason=%s",
1958 		  name, depth, buf, ok, X509_verify_cert_error_string(reason));
1959 	return 1;
1960 }
1961 
1962 /*
1963 **  TLS_VERIFY_CB -- verify callback for TLS certificates
1964 **
1965 **	Parameters:
1966 **		ctx -- x509 context
1967 **
1968 **	Returns:
1969 **		accept connection?
1970 **		currently: always yes.
1971 */
1972 
1973 static int
1974 #  if !defined(OPENSSL_VERSION_NUMBER) || OPENSSL_VERSION_NUMBER < 0x00907000L
1975 tls_verify_cb(ctx)
1976 	X509_STORE_CTX *ctx;
1977 #  else /* !defined() || OPENSSL_VERSION_NUMBER < 0x00907000L */
1978 tls_verify_cb(ctx, unused)
1979 	X509_STORE_CTX *ctx;
1980 	void *unused;
1981 #  endif /* !defined() || OPENSSL_VERSION_NUMBER < 0x00907000L */
1982 {
1983 	int ok;
1984 
1985 	/*
1986 	**  man SSL_CTX_set_cert_verify_callback():
1987 	**  callback should return 1 to indicate verification success
1988 	**  and 0 to indicate verification failure.
1989 	*/
1990 
1991 	ok = X509_verify_cert(ctx);
1992 	if (ok <= 0)
1993 	{
1994 		if (LogLevel > 13)
1995 			return tls_verify_log(ok, ctx, "TLS");
1996 	}
1997 	return 1;
1998 }
1999 /*
2000 **  TLSLOGERR -- log the errors from the TLS error stack
2001 **
2002 **	Parameters:
2003 **		level -- syslog level
2004 **		who -- server/client (for logging).
2005 **
2006 **	Returns:
2007 **		none.
2008 */
2009 
2010 void
2011 tlslogerr(level, who)
2012 	int level;
2013 	const char *who;
2014 {
2015 	unsigned long l;
2016 	int line, flags;
2017 	unsigned long es;
2018 	char *file, *data;
2019 	char buf[256];
2020 
2021 	es = CRYPTO_thread_id();
2022 	while ((l = ERR_get_error_line_data((const char **) &file, &line,
2023 					    (const char **) &data, &flags))
2024 		!= 0)
2025 	{
2026 		sm_syslog(level, NOQID,
2027 			  "STARTTLS=%s: %lu:%s:%s:%d:%s", who, es,
2028 			  ERR_error_string(l, buf),
2029 			  file, line,
2030 			  bitset(ERR_TXT_STRING, flags) ? data : "");
2031 	}
2032 }
2033 
2034 # if OPENSSL_VERSION_NUMBER > 0x00907000L
2035 /*
2036 **  X509_VERIFY_CB -- verify callback
2037 **
2038 **	Parameters:
2039 **		ctx -- x509 context
2040 **
2041 **	Returns:
2042 **		accept connection?
2043 **		currently: always yes.
2044 */
2045 
2046 static int
2047 x509_verify_cb(ok, ctx)
2048 	int ok;
2049 	X509_STORE_CTX *ctx;
2050 {
2051 	if (ok == 0)
2052 	{
2053 		if (LogLevel > 13)
2054 			tls_verify_log(ok, ctx, "x509");
2055 		if (X509_STORE_CTX_get_error(ctx) == X509_V_ERR_UNABLE_TO_GET_CRL)
2056 		{
2057 			X509_STORE_CTX_set_error(ctx, 0);
2058 			return 1;	/* override it */
2059 		}
2060 	}
2061 	return ok;
2062 }
2063 # endif /* OPENSSL_VERSION_NUMBER > 0x00907000L */
2064 #endif /* STARTTLS */
2065