svn commit: r359081 - stable/12/contrib/sendmail/src

Hiroki Sato hrs at FreeBSD.org
Wed Mar 18 18:22:00 UTC 2020


Author: hrs
Date: Wed Mar 18 18:21:58 2020
New Revision: 359081
URL: https://svnweb.freebsd.org/changeset/base/359081

Log:
  MFC of r358404, r358410, r358412, and r358413:
  
  Fix broken STARTTLS when SharedMemoryKey is enabled.
  
  OpenSSL 1.1 API patch for sendmail had a bug which
  prevented sm_RSA_generate_key() function from working.
  This function is used to generate a temporary RSA key
  for a shared memory region used for TLS processing.
  Note that 12.0 and 12.1-RELEASE include this bug.
  
  This affects only if SM_CONF_SHM compile-time
  option (enabled by default) and SharedMemoryKey
  run-time option (not enabled by default) in a .cf file are
  specified.  The latter corresponds to confSHARED_MEMORY_KEY in
  a .mc file.
  
  Fix style inconsistencies.
  
  Do not free p and g parameters after calling DH_set0_pqg(3).
  
  PR:		242861
  Differential Revision:	https://reviews.freebsd.org/D23734

Modified:
  stable/12/contrib/sendmail/src/tls.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/contrib/sendmail/src/tls.c
==============================================================================
--- stable/12/contrib/sendmail/src/tls.c	Wed Mar 18 18:20:55 2020	(r359080)
+++ stable/12/contrib/sendmail/src/tls.c	Wed Mar 18 18:21:58 2020	(r359081)
@@ -56,10 +56,10 @@ DH_set0_pqg(dh, p, q, g)
 	BIGNUM *q;
 	BIGNUM *g;
 {
-	dh->p=p;
+	dh->p = p;
 	if (q != NULL)
-		dh->q=q;
-	dh->g=g;
+		dh->q = q;
+	dh->g = g;
 	return 1; /* success */
 }
 # endif /* !defined() || OPENSSL_VERSION_NUMBER < 0x00907000L */
@@ -83,20 +83,25 @@ static unsigned char dh512_g[] =
 static DH *
 get_dh512()
 {
-	DH *dh = NULL;
+	DH *dh;
 	BIGNUM *dhp_bn, *dhg_bn;
 
 	if ((dh = DH_new()) == NULL)
 		return NULL;
 	dhp_bn = BN_bin2bn(dh512_p, sizeof(dh512_p), NULL);
 	dhg_bn = BN_bin2bn(dh512_g, sizeof(dh512_g), NULL);
-	if ((dhp_bn == NULL) || (dhg_bn == NULL) || !DH_set0_pqg(dh, dhp_bn, NULL, dhg_bn))
+	if ((dhp_bn == NULL) || (dhg_bn == NULL))
 	{
 		DH_free(dh);
 		BN_free(dhp_bn);
 		BN_free(dhg_bn);
-		return(NULL);
+		return NULL;
 	}
+	if (!DH_set0_pqg(dh, dhp_bn, NULL, dhg_bn))
+	{
+		DH_free(dh);
+		return NULL;
+	}
 	return dh;
 }
 
@@ -117,7 +122,7 @@ oK0jjSXgFyeU4/NfyA+zuNeWzUL6bHmigwIBAg==
 static DH *
 get_dh2048()
 {
-	static unsigned char dh2048_p[]={
+	static unsigned char dh2048_p[] = {
 		0xAC,0x37,0x20,0x70,0xBA,0x71,0x12,0x4B,0x10,0x1C,0xF9,0x68,
 		0x95,0x12,0x82,0x50,0x9D,0xAC,0xCC,0xA4,0x73,0x8A,0xC7,0x96,
 		0x57,0xD7,0x14,0x49,0x03,0x59,0x1B,0x1A,0x06,0xC3,0xB2,0xA4,
@@ -141,22 +146,27 @@ get_dh2048()
 		0xE3,0xF3,0x5F,0xC8,0x0F,0xB3,0xB8,0xD7,0x96,0xCD,0x42,0xFA,
 		0x6C,0x79,0xA2,0x83,
 		};
-	static unsigned char dh2048_g[]={ 0x02, };
+	static unsigned char dh2048_g[] = { 0x02, };
 	DH *dh;
 	BIGNUM *dhp_bn, *dhg_bn;
 
-	if ((dh=DH_new()) == NULL)
-		return(NULL);
-	dhp_bn = BN_bin2bn(dh2048_p,sizeof(dh2048_p),NULL);
-	dhg_bn = BN_bin2bn(dh2048_g,sizeof(dh2048_g),NULL);
-	if ((dhp_bn == NULL) || (dhg_bn == NULL) || !DH_set0_pqg(dh, dhp_bn, NULL, dhg_bn))
+	if ((dh = DH_new()) == NULL)
+		return NULL;
+	dhp_bn = BN_bin2bn(dh2048_p, sizeof(dh2048_p), NULL);
+	dhg_bn = BN_bin2bn(dh2048_g, sizeof(dh2048_g), NULL);
+	if ((dhp_bn == NULL) || (dhg_bn == NULL))
 	{
 		DH_free(dh);
 		BN_free(dhp_bn);
 		BN_free(dhg_bn);
-		return(NULL);
+		return NULL;
 	}
-	return(dh);
+	if (!DH_set0_pqg(dh, dhp_bn, NULL, dhg_bn))
+	{
+		DH_free(dh);
+		return NULL;
+	}
+	return dh;
 }
 # endif /* !NO_DH */
 
@@ -744,19 +754,16 @@ sm_RSA_generate_key(num, e)
 	unsigned long e;
 {
 	RSA *rsa = NULL;
-        BIGNUM *bn_rsa_r4;
-	int rc;
+	BIGNUM *bn_rsa_r4;
 
 	bn_rsa_r4 = BN_new();
-        rc = BN_set_word(bn_rsa_r4, RSA_F4);
-	if ((bn_rsa_r4 != NULL) && BN_set_word(bn_rsa_r4, RSA_F4) && (rsa = RSA_new()) != NULL)
+	if ((bn_rsa_r4 != NULL) && BN_set_word(bn_rsa_r4, e) && (rsa = RSA_new()) != NULL)
 	{
-		if (!RSA_generate_key_ex(rsa, RSA_KEYLENGTH, bn_rsa_r4, NULL))
+		if (!RSA_generate_key_ex(rsa, num, bn_rsa_r4, NULL))
 		{
 			RSA_free(rsa);
 			rsa = NULL;
 		}
-		return NULL;
 	}
 	BN_free(bn_rsa_r4);
 	return rsa;
@@ -1263,7 +1270,7 @@ inittls(ctx, req, options, srv, certfile, keyfile, cac
 			if (tTd(96, 2))
 				sm_dprintf("inittls: Generating %d bit DH parameters\n", bits);
 
-			dsa=DSA_new();
+			dsa = DSA_new();
 			/* this takes a while! */
 			(void)DSA_generate_parameters_ex(dsa, bits, NULL, 0,
 							 NULL, NULL, NULL);


More information about the svn-src-stable mailing list