X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=src%2Fsrc%2Ftlscert-openssl.c;h=0aa65c8861cf3dbee82a676d50c7443f7febffb7;hb=f3ebb786e451da973560f1c9d8cdb151d25108b5;hp=3f0767926f04b37ba634c07c30eb9bb994876c10;hpb=9242a7e8cfa94bbc9dd7eca6bd651b569b871c4e;p=exim.git diff --git a/src/src/tlscert-openssl.c b/src/src/tlscert-openssl.c index 3f0767926..0aa65c886 100644 --- a/src/src/tlscert-openssl.c +++ b/src/src/tlscert-openssl.c @@ -2,7 +2,7 @@ * Exim - an Internet mail transport agent * *************************************************/ -/* Copyright (c) Jeremy Harris 2014 - 2017 */ +/* Copyright (c) Jeremy Harris 2014 - 2019 */ /* This module provides TLS (aka SSL) support for Exim using the OpenSSL library. It is #included into the tls.c file when that library is used. @@ -17,10 +17,19 @@ library. It is #included into the tls.c file when that library is used. #include #include -#if OPENSSL_VERSION_NUMBER >= 0x10100000L -# define EXIM_HAVE_ASN1_MACROS +#ifdef LIBRESSL_VERSION_NUMBER /* LibreSSL */ +# if LIBRESSL_VERSION_NUMBER >= 0x2090000fL +# define EXIM_HAVE_ASN1_MACROS +# endif +#else /* OpenSSL */ +# if OPENSSL_VERSION_NUMBER >= 0x10100000L +# define EXIM_HAVE_ASN1_MACROS +# endif #endif +#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER) +# define ASN1_STRING_get0_data ASN1_STRING_data +#endif /***************************************************** * Export/import a certificate, binary/printable @@ -56,7 +65,7 @@ return fail; int tls_import_cert(const uschar * buf, void ** cert) { -void * reset_point = store_get(0); +rmark reset_point = store_mark(); const uschar * cp = string_unprinting(US buf); BIO * bp; X509 * x = *(X509 **)cert; @@ -153,7 +162,7 @@ else else { - if (!timestamps_utc) /* decoded string in local TZ */ + if (!f.timestamps_utc) /* decoded string in local TZ */ { /* shift to local TZ */ restore_tz(tz); mod_tz = FALSE; @@ -163,7 +172,7 @@ else /* convert to string in our format */ len = 32; - s = store_get(len); + s = store_get(len, FALSE); strftime(CS s, (size_t)len, "%b %e %T %Y %z", tm_p); } } @@ -327,7 +336,7 @@ M_ASN1_OCTET_STRING_print(bp, adata); /* binary data, DER encoded */ /* just dump for now */ len = BIO_get_mem_data(bp, &cp1); -cp3 = cp2 = store_get(len*3+1); +cp3 = cp2 = store_get(len*3+1, TRUE); while(len) { @@ -373,17 +382,17 @@ while (sk_GENERAL_NAME_num(san) > 0) { case GEN_DNS: tag = US"DNS"; - ele = ASN1_STRING_data(namePart->d.dNSName); + ele = US ASN1_STRING_get0_data(namePart->d.dNSName); len = ASN1_STRING_length(namePart->d.dNSName); break; case GEN_URI: tag = US"URI"; - ele = ASN1_STRING_data(namePart->d.uniformResourceIdentifier); + ele = US ASN1_STRING_get0_data(namePart->d.uniformResourceIdentifier); len = ASN1_STRING_length(namePart->d.uniformResourceIdentifier); break; case GEN_EMAIL: tag = US"MAIL"; - ele = ASN1_STRING_data(namePart->d.rfc822Name); + ele = US ASN1_STRING_get0_data(namePart->d.rfc822Name); len = ASN1_STRING_length(namePart->d.rfc822Name); break; default: @@ -407,20 +416,19 @@ tls_cert_ocsp_uri(void * cert, uschar * mod) STACK_OF(ACCESS_DESCRIPTION) * ads = (STACK_OF(ACCESS_DESCRIPTION) *) X509_get_ext_d2i((X509 *)cert, NID_info_access, NULL, NULL); int adsnum = sk_ACCESS_DESCRIPTION_num(ads); -int i; uschar sep = '\n'; gstring * list = NULL; if (mod) if (*mod == '>' && *++mod) sep = *mod++; -for (i = 0; i < adsnum; i++) +for (int i = 0; i < adsnum; i++) { ACCESS_DESCRIPTION * ad = sk_ACCESS_DESCRIPTION_value(ads, i); if (ad && OBJ_obj2nid(ad->method) == NID_ad_OCSP) list = string_append_listele_n(list, sep, - ASN1_STRING_data(ad->location->d.ia5), + US ASN1_STRING_get0_data(ad->location->d.ia5), ASN1_STRING_length(ad->location->d.ia5)); } sk_ACCESS_DESCRIPTION_free(ads); @@ -434,28 +442,24 @@ STACK_OF(DIST_POINT) * dps = (STACK_OF(DIST_POINT) *) X509_get_ext_d2i((X509 *)cert, NID_crl_distribution_points, NULL, NULL); DIST_POINT * dp; -int dpsnum = sk_DIST_POINT_num(dps); -int i; uschar sep = '\n'; gstring * list = NULL; if (mod) if (*mod == '>' && *++mod) sep = *mod++; -if (dps) for (i = 0; i < dpsnum; i++) +if (dps) for (int i = 0, dpsnum = sk_DIST_POINT_num(dps); i < dpsnum; i++) if ((dp = sk_DIST_POINT_value(dps, i))) { STACK_OF(GENERAL_NAME) * names = dp->distpoint->name.fullname; GENERAL_NAME * np; - int nnum = sk_GENERAL_NAME_num(names); - int j; - for (j = 0; j < nnum; j++) + for (int j = 0, nnum = sk_GENERAL_NAME_num(names); j < nnum; j++) if ( (np = sk_GENERAL_NAME_value(names, j)) && np->type == GEN_URI ) list = string_append_listele_n(list, sep, - ASN1_STRING_data(np->d.uniformResourceIdentifier), + US ASN1_STRING_get0_data(np->d.uniformResourceIdentifier), ASN1_STRING_length(np->d.uniformResourceIdentifier)); } sk_DIST_POINT_free(dps); @@ -479,7 +483,7 @@ if (!i2d_X509_bio(bp, (X509 *)cert)) else { long len = BIO_get_mem_data(bp, &cp); - cp = b64encode(cp, (int)len); + cp = b64encode(CUS cp, (int)len); } BIO_free(bp); @@ -490,7 +494,6 @@ return cp; static uschar * fingerprint(X509 * cert, const EVP_MD * fdig) { -int j; unsigned int n; uschar md[EVP_MAX_MD_SIZE]; uschar * cp; @@ -500,8 +503,8 @@ if (!X509_digest(cert,fdig,md,&n)) expand_string_message = US"tls_cert_fprt: out of mem\n"; return NULL; } -cp = store_get(n*2+1); -for (j = 0; j < (int)n; j++) sprintf(CS cp+2*j, "%02X", md[j]); +cp = store_get(n*2+1, TRUE); +for (int j = 0; j < (int)n; j++) sprintf(CS cp+2*j, "%02X", md[j]); return(cp); }