Various S/MIME fixes. Fix for memory leak, recipient list bug

and not excluding parameters with DSA keys.
This commit is contained in:
Dr. Stephen Henson 1999-12-14 02:44:27 +00:00
parent 2449961ab2
commit 55f30198ad
2 changed files with 13 additions and 8 deletions

View File

@ -261,13 +261,13 @@ int MAIN(int argc, char **argv)
if(operation == SMIME_ENCRYPT) { if(operation == SMIME_ENCRYPT) {
if (!cipher) cipher = EVP_rc2_40_cbc(); if (!cipher) cipher = EVP_rc2_40_cbc();
encerts = sk_X509_new_null();
while (*args) { while (*args) {
encerts = sk_X509_new_null();
if(!(cert = load_cert(*args))) { if(!(cert = load_cert(*args))) {
BIO_printf(bio_err, "Can't read recipent certificate file %s\n", *args); BIO_printf(bio_err, "Can't read recipent certificate file %s\n", *args);
goto end; goto end;
} }
sk_X509_push (encerts, cert); sk_X509_push(encerts, cert);
cert = NULL; cert = NULL;
args++; args++;
} }
@ -356,13 +356,13 @@ int MAIN(int argc, char **argv)
} }
} else if(operation == SMIME_VERIFY) { } else if(operation == SMIME_VERIFY) {
STACK_OF(X509) *signers; STACK_OF(X509) *signers;
signers = PKCS7_iget_signers(p7, other, flags);
if(PKCS7_verify(p7, other, store, indata, out, flags)) { if(PKCS7_verify(p7, other, store, indata, out, flags)) {
BIO_printf(bio_err, "Verification Successful\n"); BIO_printf(bio_err, "Verification Successful\n");
} else { } else {
BIO_printf(bio_err, "Verification Failure\n"); BIO_printf(bio_err, "Verification Failure\n");
goto end; goto end;
} }
signers = PKCS7_iget_signers(p7, other, flags);
if(!save_certs(signerfile, signers)) { if(!save_certs(signerfile, signers)) {
BIO_printf(bio_err, "Error writing signers to %s\n", BIO_printf(bio_err, "Error writing signers to %s\n",
signerfile); signerfile);

View File

@ -297,6 +297,9 @@ int PKCS7_add_crl(PKCS7 *p7, X509_CRL *crl)
int PKCS7_SIGNER_INFO_set(PKCS7_SIGNER_INFO *p7i, X509 *x509, EVP_PKEY *pkey, int PKCS7_SIGNER_INFO_set(PKCS7_SIGNER_INFO *p7i, X509 *x509, EVP_PKEY *pkey,
EVP_MD *dgst) EVP_MD *dgst)
{ {
char is_dsa;
if (pkey->type == EVP_PKEY_DSA) is_dsa = 1;
else is_dsa = 0;
/* We now need to add another PKCS7_SIGNER_INFO entry */ /* We now need to add another PKCS7_SIGNER_INFO entry */
ASN1_INTEGER_set(p7i->version,1); ASN1_INTEGER_set(p7i->version,1);
X509_NAME_set(&p7i->issuer_and_serial->issuer, X509_NAME_set(&p7i->issuer_and_serial->issuer,
@ -313,8 +316,7 @@ int PKCS7_SIGNER_INFO_set(PKCS7_SIGNER_INFO *p7i, X509 *x509, EVP_PKEY *pkey,
p7i->pkey=pkey; p7i->pkey=pkey;
/* Set the algorithms */ /* Set the algorithms */
if (pkey->type == EVP_PKEY_DSA) if (is_dsa) p7i->digest_alg->algorithm=OBJ_nid2obj(NID_sha1);
p7i->digest_alg->algorithm=OBJ_nid2obj(NID_sha1);
else else
p7i->digest_alg->algorithm=OBJ_nid2obj(EVP_MD_type(dgst)); p7i->digest_alg->algorithm=OBJ_nid2obj(EVP_MD_type(dgst));
@ -328,9 +330,12 @@ int PKCS7_SIGNER_INFO_set(PKCS7_SIGNER_INFO *p7i, X509 *x509, EVP_PKEY *pkey,
if (p7i->digest_enc_alg->parameter != NULL) if (p7i->digest_enc_alg->parameter != NULL)
ASN1_TYPE_free(p7i->digest_enc_alg->parameter); ASN1_TYPE_free(p7i->digest_enc_alg->parameter);
if ((p7i->digest_enc_alg->parameter=ASN1_TYPE_new()) == NULL) if(is_dsa) p7i->digest_enc_alg->parameter = NULL;
goto err; else {
p7i->digest_enc_alg->parameter->type=V_ASN1_NULL; if (!(p7i->digest_enc_alg->parameter=ASN1_TYPE_new()))
goto err;
p7i->digest_enc_alg->parameter->type=V_ASN1_NULL;
}
return(1); return(1);
err: err: