/*
* Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved.
*
- * Licensed under the OpenSSL license (the "License"). You may not use
+ * Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
* in the file LICENSE in the source distribution or at
* https://www.openssl.org/source/license.html
size_t eklen;
pkey = X509_get0_pubkey(ri->cert);
-
- if (!pkey)
+ if (pkey == NULL)
return 0;
pctx = EVP_PKEY_CTX_new(pkey, NULL);
- if (!pctx)
+ if (pctx == NULL)
return 0;
if (EVP_PKEY_encrypt_init(pctx) <= 0)
}
static int pkcs7_decrypt_rinfo(unsigned char **pek, int *peklen,
- PKCS7_RECIP_INFO *ri, EVP_PKEY *pkey)
+ PKCS7_RECIP_INFO *ri, EVP_PKEY *pkey,
+ size_t fixlen)
{
EVP_PKEY_CTX *pctx = NULL;
unsigned char *ek = NULL;
size_t eklen;
-
int ret = -1;
pctx = EVP_PKEY_CTX_new(pkey, NULL);
- if (!pctx)
+ if (pctx == NULL)
return -1;
if (EVP_PKEY_decrypt_init(pctx) <= 0)
}
if (EVP_PKEY_decrypt(pctx, ek, &eklen,
- ri->enc_key->data, ri->enc_key->length) <= 0) {
+ ri->enc_key->data, ri->enc_key->length) <= 0
+ || eklen == 0
+ || (fixlen != 0 && eklen != fixlen)) {
ret = 0;
PKCS7err(PKCS7_F_PKCS7_DECRYPT_RINFO, ERR_R_EVP_LIB);
goto err;
for (i = 0; i < sk_PKCS7_RECIP_INFO_num(rsk); i++) {
ri = sk_PKCS7_RECIP_INFO_value(rsk, i);
- if (pkcs7_decrypt_rinfo(&ek, &eklen, ri, pkey) < 0)
+ if (pkcs7_decrypt_rinfo(&ek, &eklen, ri, pkey,
+ EVP_CIPHER_key_length(evp_cipher)) < 0)
goto err;
ERR_clear_error();
}
} else {
/* Only exit on fatal errors, not decrypt failure */
- if (pkcs7_decrypt_rinfo(&ek, &eklen, ri, pkey) < 0)
+ if (pkcs7_decrypt_rinfo(&ek, &eklen, ri, pkey, 0) < 0)
goto err;
ERR_clear_error();
}
if (EVP_DigestSignInit(mctx, &pctx, md, NULL, si->pkey) <= 0)
goto err;
+ /*
+ * TODO(3.0): This causes problems when providers are in use, so disabled
+ * for now. Can we get rid of this completely? AFAICT this ctrl has never
+ * been used since it was first put in. All internal implementations just
+ * return 1 and ignore this ctrl and have always done so by the looks of
+ * things. To fix this we could convert this ctrl into a param, which would
+ * require us to send all the signer info data as a set of params...but that
+ * is non-trivial and since this isn't used by anything it may be better
+ * just to remove it. The original commit that added it had this
+ * justification in CHANGES:
+ *
+ * "During PKCS7 signing pass the PKCS7 SignerInfo structure to the
+ * EVP_PKEY_METHOD before and after signing via the
+ * EVP_PKEY_CTRL_PKCS7_SIGN ctrl. It can then customise the structure
+ * before and/or after signing if necessary."
+ */
+#if 0
if (EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_SIGN,
EVP_PKEY_CTRL_PKCS7_SIGN, 0, si) <= 0) {
PKCS7err(PKCS7_F_PKCS7_SIGNER_INFO_SIGN, PKCS7_R_CTRL_ERROR);
goto err;
}
+#endif
alen = ASN1_item_i2d((ASN1_VALUE *)si->auth_attr, &abuf,
ASN1_ITEM_rptr(PKCS7_ATTR_SIGN));
if (EVP_DigestSignFinal(mctx, abuf, &siglen) <= 0)
goto err;
+ /*
+ * TODO(3.0): This causes problems when providers are in use, so disabled
+ * for now. Can we get rid of this completely? AFAICT this ctrl has never
+ * been used since it was first put in. All internal implementations just
+ * return 1 and ignore this ctrl and have always done so by the looks of
+ * things. To fix this we could convert this ctrl into a param, which would
+ * require us to send all the signer info data as a set of params...but that
+ * is non-trivial and since this isn't used by anything it may be better
+ * just to remove it. The original commit that added it had this
+ * justification in CHANGES:
+ *
+ * "During PKCS7 signing pass the PKCS7 SignerInfo structure to the
+ * EVP_PKEY_METHOD before and after signing via the
+ * EVP_PKEY_CTRL_PKCS7_SIGN ctrl. It can then customise the structure
+ * before and/or after signing if necessary."
+ */
+#if 0
if (EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_SIGN,
EVP_PKEY_CTRL_PKCS7_SIGN, 1, si) <= 0) {
PKCS7err(PKCS7_F_PKCS7_SIGNER_INFO_SIGN, PKCS7_R_CTRL_ERROR);
goto err;
}
+#endif
EVP_MD_CTX_free(mctx);
os = si->enc_digest;
pkey = X509_get0_pubkey(x509);
- if (!pkey) {
+ if (pkey == NULL) {
ret = -1;
goto err;
}