X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/c59b09dc16145178a29850e7bda7d6bc6dedbc58..428cdca73df1791fcba048d0f1093725d8288bd6:/src/src/pdkim/signing.c diff --git a/src/src/pdkim/signing.c b/src/src/pdkim/signing.c index 18b357eaa..102e7bf51 100644 --- a/src/src/pdkim/signing.c +++ b/src/src/pdkim/signing.c @@ -28,8 +28,8 @@ features_crypto(void) #ifndef DISABLE_DKIM /* rest of file */ -#ifndef SUPPORT_TLS -# error Need SUPPORT_TLS for DKIM +#ifdef DISABLE_TLS +# error Must no DISABLE_TLS, for DKIM #endif @@ -169,13 +169,13 @@ switch(fmt) { case KEYFMT_DER: if ((rc = gnutls_pubkey_import(verify_ctx->key, &k, GNUTLS_X509_FMT_DER))) - ret = gnutls_strerror(rc); + ret = US gnutls_strerror(rc); break; #ifdef SIGN_HAVE_ED25519 case KEYFMT_ED25519_BARE: if ((rc = gnutls_pubkey_import_ecc_raw(verify_ctx->key, GNUTLS_ECC_CURVE_ED25519, &k, NULL))) - ret = gnutls_strerror(rc); + ret = US gnutls_strerror(rc); break; #endif default: @@ -203,7 +203,7 @@ if (verify_ctx->keytype == KEYTYPE_ED25519) { if ((rc = gnutls_pubkey_verify_data2(verify_ctx->key, GNUTLS_SIGN_EDDSA_ED25519, 0, &k, &s)) < 0) - ret = gnutls_strerror(rc); + ret = US gnutls_strerror(rc); } else #endif @@ -218,7 +218,7 @@ else } if ((rc = gnutls_pubkey_verify_hash2(verify_ctx->key, algo, 0, &k, &s)) < 0) - ret = gnutls_strerror(rc); + ret = US gnutls_strerror(rc); } gnutls_pubkey_deinit(verify_ctx->key); @@ -412,8 +412,9 @@ if ( !(s1 = Ustrstr(CS privkey_pem, "-----BEGIN RSA PRIVATE KEY-----")) *s2 = '\0'; -if ((der.len = b64decode(s1, &der.data)) < 0) +if ((rc = b64decode(s1, &der.data) < 0)) return US"Bad PEM-DER b64 decode"; +der.len = rc; /* untangle asn.1 */ @@ -499,7 +500,7 @@ switch (hash) } #define SIGSPACE 128 -sig->data = store_get(SIGSPACE); +sig->data = store_get(SIGSPACE, FALSE); if (gcry_mpi_cmp (sign_ctx->p, sign_ctx->q) > 0) { @@ -712,7 +713,7 @@ Return: NULL for success, or an error string */ const uschar * exim_dkim_signing_init(const uschar * privkey_pem, es_ctx * sign_ctx) { -BIO * bp = BIO_new_mem_buf(privkey_pem, -1); +BIO * bp = BIO_new_mem_buf((void *)privkey_pem, -1); if (!(sign_ctx->key = PEM_read_bio_PrivateKey(bp, NULL, NULL, NULL))) return string_sprintf("privkey PEM-block import: %s", @@ -755,7 +756,7 @@ switch (hash) if ( (ctx = EVP_MD_CTX_new()) && EVP_DigestSignInit(ctx, NULL, md, NULL, sign_ctx->key) > 0 && EVP_DigestSign(ctx, NULL, &siglen, NULL, 0) > 0 - && (sig->data = store_get(siglen)) + && (sig->data = store_get(siglen, FALSE)) /* Obtain the signature (slen could change here!) */ && EVP_DigestSign(ctx, sig->data, &siglen, data->data, data->len) > 0 @@ -771,7 +772,7 @@ if ( (ctx = EVP_MD_CTX_create()) && EVP_DigestSignInit(ctx, NULL, md, NULL, sign_ctx->key) > 0 && EVP_DigestSignUpdate(ctx, data->data, data->len) > 0 && EVP_DigestSignFinal(ctx, NULL, &siglen) > 0 - && (sig->data = store_get(siglen)) + && (sig->data = store_get(siglen, FALSE)) /* Obtain the signature (slen could change here!) */ && EVP_DigestSignFinal(ctx, sig->data, &siglen) > 0 @@ -846,30 +847,38 @@ if (!md) { EVP_MD_CTX * ctx; - if ( (ctx = EVP_MD_CTX_new()) - && EVP_DigestVerifyInit(ctx, NULL, md, NULL, verify_ctx->key) > 0 - && EVP_DigestVerify(ctx, sig->data, sig->len, data->data, data->len) > 0 - ) - { EVP_MD_CTX_free(ctx); return NULL; } - - if (ctx) EVP_MD_CTX_free(ctx); + if ((ctx = EVP_MD_CTX_new())) + { + if ( EVP_DigestVerifyInit(ctx, NULL, md, NULL, verify_ctx->key) > 0 + && EVP_DigestVerify(ctx, sig->data, sig->len, data->data, data->len) > 0 + ) + { EVP_MD_CTX_free(ctx); return NULL; } + EVP_MD_CTX_free(ctx); + } } else #endif { EVP_PKEY_CTX * ctx; - if ( (ctx = EVP_PKEY_CTX_new(verify_ctx->key, NULL)) - && EVP_PKEY_verify_init(ctx) > 0 - && EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PADDING) > 0 - && EVP_PKEY_CTX_set_signature_md(ctx, md) > 0 - && EVP_PKEY_verify(ctx, sig->data, sig->len, - data->data, data->len) == 1 - ) - { EVP_PKEY_CTX_free(ctx); return NULL; } - - if (ctx) EVP_PKEY_CTX_free(ctx); + if ((ctx = EVP_PKEY_CTX_new(verify_ctx->key, NULL))) + { + if ( EVP_PKEY_verify_init(ctx) > 0 + && EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PADDING) > 0 + && EVP_PKEY_CTX_set_signature_md(ctx, md) > 0 + && EVP_PKEY_verify(ctx, sig->data, sig->len, + data->data, data->len) == 1 + ) + { EVP_PKEY_CTX_free(ctx); return NULL; } + EVP_PKEY_CTX_free(ctx); + + DEBUG(D_tls) + if (Ustrcmp(ERR_reason_error_string(ERR_peek_error()), "wrong signature length") == 0) + debug_printf("sig len (from msg hdr): %d, expected (from dns pubkey) %d\n", + (int) sig->len, EVP_PKEY_size(verify_ctx->key)); + } } + return US ERR_error_string(ERR_get_error(), NULL); }