From 922180d794873b3aa6fac3412a73c829b1dbd27c Mon Sep 17 00:00:00 2001 From: "Dr. Stephen Henson" Date: Fri, 30 Jul 1999 01:12:46 +0000 Subject: [PATCH] Allow the PKCS#7 (S/MIME encrypt) application to support more than one recipient. --- CHANGES | 4 ++++ crypto/pkcs7/enc.c | 21 +++++++++++++++------ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/CHANGES b/CHANGES index 8ae1483db4..049d7818a0 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,10 @@ Changes between 0.9.3a and 0.9.4 [xx Jul/Aug/...? 1999] + *) Allow the -k option to be used more than once in the enc program: + this allows the same encrypted message to be read by multiple recipients. + [Steve Henson] + *) New function OBJ_obj2txt(buf, buf_len, a, no_name), this converts an ASN1_OBJECT to a text string. If the "no_name" parameter is set then it will always use the numerical form of the OID, even if it has a short diff --git a/crypto/pkcs7/enc.c b/crypto/pkcs7/enc.c index 22bf9b04b5..43bfd10a23 100644 --- a/crypto/pkcs7/enc.c +++ b/crypto/pkcs7/enc.c @@ -74,6 +74,7 @@ char *argv[]; int nodetach=1; char *keyfile = NULL; const EVP_CIPHER *cipher=NULL; + STACK_OF(X509) *recips=NULL; SSLeay_add_all_algorithms(); @@ -96,13 +97,20 @@ char *argv[]; keyfile = argv[2]; argc-=2; argv+=2; + if (!(in=BIO_new_file(keyfile,"r"))) goto err; + if (!(x509=PEM_read_bio_X509(in,NULL,NULL))) goto err; + if(!recips) recips = sk_X509_new_null(); + sk_X509_push(recips, x509); + BIO_free(in); } else break; } - if (!BIO_read_filename(data,argv[1])) goto err; + if(!recips) { + fprintf(stderr, "No recipients\n"); + goto err; + } - if ((in=BIO_new_file(keyfile,"r")) == NULL) goto err; - if ((x509=PEM_read_bio_X509(in,NULL,NULL)) == NULL) goto err; + if (!BIO_read_filename(data,argv[1])) goto err; p7=PKCS7_new(); #if 0 @@ -120,9 +128,10 @@ char *argv[]; if(!cipher) cipher = EVP_des_ede3_cbc(); if (!PKCS7_set_cipher(p7,cipher)) goto err; - if (PKCS7_add_recipient(p7,x509) == NULL) goto err; - - + for(i = 0; i < sk_X509_num(recips); i++) { + if (!PKCS7_add_recipient(p7,sk_X509_value(recips, i))) goto err; + } + sk_X509_pop_free(recips, X509_free); /* Set the content of the signed to 'data' */ /* PKCS7_content_new(p7,NID_pkcs7_data); not used in envelope */ -- GitLab