OpenSSL CVS Repository
http://cvs.openssl.org/
____________________________________________________________
________________
Server: cvs.openssl.org Name: Dr.
Stephen Henson
Root: /v/openssl/cvs Email: steve openssl.org
Module: openssl Date:
26-Mar-2008 18:40:22
Branch: HEAD Handle:
2008032617402101
Modified files:
openssl/apps cms.c
openssl/crypto/cms cms.h cms_env.c cms_err.c
cms_ess.c
Log:
Add support for signed receipt request printout and
generation.
Summary:
Revision Changes Path
1.14 +130 -8 openssl/apps/cms.c
1.19 +10 -2 openssl/crypto/cms/cms.h
1.12 +0 -3 openssl/crypto/cms/cms_env.c
1.15 +2 -1 openssl/crypto/cms/cms_err.c
1.2 +29 -20 openssl/crypto/cms/cms_ess.c
____________________________________________________________
________________
patch -p0 <<' .'
Index: openssl/apps/cms.c
============================================================
================
$ cvs diff -u -r1.13 -r1.14 cms.c
--- openssl/apps/cms.c 26 Mar 2008 13:10:19 -0000 1.13
+++ openssl/apps/cms.c 26 Mar 2008 17:40:21 -0000 1.14
 -71,6 +71,8 
static int save_certs(char *signerfile, STACK_OF(X509)
*signers);
static int smime_cb(int ok, X509_STORE_CTX *ctx);
static void receipt_request_print(BIO *out,
CMS_ContentInfo *cms);
+static CMS_ReceiptRequest *make_receipt_request(STACK
*rr_to, int rr_allorfirst,
+ STACK *rr_from);
#define SMIME_OP 0x10
#define SMIME_IP 0x20
 -112,7 +114,9 
BIO *in = NULL, *out = NULL, *indata = NULL;
int badarg = 0;
int flags = CMS_DETACHED, noout = 0, print = 0;
- int rr_print = 0;
+ int rr_print = 0, rr_allorfirst = -1;
+ STACK *rr_to = NULL, *rr_from = NULL;
+ CMS_ReceiptRequest *rr = NULL;
char *to = NULL, *from = NULL, *subject = NULL;
char *CAfile = NULL, *CApath = NULL;
char *passargin = NULL, *passin = NULL;
 -248,6 +252,28 
noout = 1;
else if (!strcmp (*args,
"-receipt_request_print"))
rr_print = 1;
+ else if (!strcmp (*args,
"-receipt_request_all"))
+ rr_allorfirst = 0;
+ else if (!strcmp (*args,
"-receipt_request_first"))
+ rr_allorfirst = 1;
+ else if
(!strcmp(*args,"-receipt_request_from"))
+ {
+ if (!args[1])
+ goto argerr;
+ args++;
+ if (!rr_from)
+ rr_from = sk_new_null();
+ sk_push(rr_from, *args);
+ }
+ else if
(!strcmp(*args,"-receipt_request_to"))
+ {
+ if (!args[1])
+ goto argerr;
+ args++;
+ if (!rr_to)
+ rr_to = sk_new_null();
+ sk_push(rr_to, *args);
+ }
else if (!strcmp (*args, "-print"))
{
noout = 1;
 -454,6 +480,17 
args++;
}
+ if (((rr_allorfirst != -1) || rr_from) &&
!rr_to)
+ {
+ BIO_puts(bio_err, "No Signed Receipts
Recipientsn");
+ goto argerr;
+ }
+
+ if (!(operation & SMIME_SIGNERS) && (rr_to
|| rr_from))
+ {
+ BIO_puts(bio_err, "Signed receipts only allowed
with -signn");
+ goto argerr;
+ }
if (!(operation & SMIME_SIGNERS) && (skkeys
|| sksigners))
{
BIO_puts(bio_err, "Multiple signers or keys not
allowedn");
 -462,12 +499,12 
if (operation & SMIME_SIGNERS)
{
- /* Check to see if any final signer needs to be
appended */
if (keyfile && !signerfile)
{
BIO_puts(bio_err, "Illegal -inkey without
-signern");
goto argerr;
}
+ /* Check to see if any final signer needs to be
appended */
if (signerfile)
{
if (!sksigners)
 -810,27 +847,41 
else if (operation & SMIME_SIGNERS)
{
int i;
- /* If detached data content we only enable streaming
if
+ /* If detached data content we enable streaming if
* S/MIME output format.
*/
if (operation == SMIME_SIGN)
{
+
if (flags & CMS_DETACHED)
{
- if (outformat != FORMAT_SMIME)
- flags &= ~CMS_STREAM;
+ if (outformat == FORMAT_SMIME)
+ flags |= CMS_STREAM;
}
flags |= CMS_PARTIAL;
cms = CMS_sign(NULL, NULL, other, in, flags);
- if (econtent_type)
- CMS_set1_eContentType(cms, econtent_type);
if (!cms)
goto end;
+ if (econtent_type)
+ CMS_set1_eContentType(cms, econtent_type);
+
+ if (rr_to)
+ {
+ rr = make_receipt_request(rr_to, rr_allorfirst,
+ rr_from);
+ if (!rr)
+ {
+ BIO_puts(bio_err,
+ "Signed Receipt Request Creation
Errorn");
+ goto end;
+ }
+ }
}
else
flags |= CMS_REUSE_DIGEST;
for (i = 0; i < sk_num(sksigners); i++)
{
+ CMS_SignerInfo *si;
signerfile = sk_value(sksigners, i);
keyfile = sk_value(skkeys, i);
signer = load_cert(bio_err, signerfile,FORMAT_PEM,
NULL,
 -841,7 +892,10 
"signing key file");
if (!key)
goto end;
- if (!CMS_add1_signer(cms, signer, key, sign_md,
flags))
+ si = CMS_add1_signer(cms, signer, key, sign_md,
flags);
+ if (!si)
+ goto end;
+ if (rr && !CMS_add1_ReceiptRequest(si, rr))
goto end;
X509_free(signer);
signer = NULL;
 -1002,6 +1056,12 
OPENSSL_free(secret_keyid);
if (econtent_type)
ASN1_OBJECT_free(econtent_type);
+ if (rr)
+ CMS_ReceiptRequest_free(rr);
+ if (rr_to)
+ sk_free(rr_to);
+ if (rr_from)
+ sk_free(rr_from);
X509_STORE_free(store);
X509_free(cert);
X509_free(recip);
 -1119,4 +1179,66 
}
}
+static STACK_OF(GENERAL_NAMES) *make_names_stack(STACK
*ns)
+ {
+ int i;
+ STACK_OF(GENERAL_NAMES) *ret;
+ GENERAL_NAMES *gens = NULL;
+ GENERAL_NAME *gen = NULL;
+ ret = sk_GENERAL_NAMES_new_null();
+ if (!ret)
+ goto err;
+ for (i = 0; i < sk_num(ns); i++)
+ {
+ char *str = sk_value(ns, i);
+ gen = a2i_GENERAL_NAME(NULL, NULL, NULL, GEN_EMAIL,
str, 0);
+ if (!gen)
+ goto err;
+ gens = GENERAL_NAMES_new();
+ if (!gens)
+ goto err;
+ if (!sk_GENERAL_NAME_push(gens, gen))
+ goto err;
+ gen = NULL;
+ if (!sk_GENERAL_NAMES_push(ret, gens))
+ goto err;
+ gens = NULL;
+ }
+
+ return ret;
+
+ err:
+ if (ret)
+ sk_GENERAL_NAMES_pop_free(ret, GENERAL_NAMES_free);
+ if (gens)
+ GENERAL_NAMES_free(gens);
+ if (gen)
+ GENERAL_NAME_free(gen);
+ return NULL;
+ }
+
+
+static CMS_ReceiptRequest *make_receipt_request(STACK
*rr_to, int rr_allorfirst,
+ STACK *rr_from)
+ {
+ STACK_OF(GENERAL_NAMES) *rct_to, *rct_from;
+ CMS_ReceiptRequest *rr;
+ rct_to = make_names_stack(rr_to);
+ if (!rct_to)
+ goto err;
+ if (rr_from)
+ {
+ rct_from = make_names_stack(rr_from);
+ if (!rct_from)
+ goto err;
+ }
+ else
+ rct_from = NULL;
+ rr = CMS_ReceiptRequest_create0(NULL, -1, rr_allorfirst,
rct_from,
+ rct_to);
+ return rr;
+ err:
+ return NULL;
+ }
+
#endif
 .
patch -p0 <<' .'
Index: openssl/crypto/cms/cms.h
============================================================
================
$ cvs diff -u -r1.18 -r1.19 cms.h
--- openssl/crypto/cms/cms.h 26 Mar 2008 13:10:20
-0000 1.18
+++ openssl/crypto/cms/cms.h 26 Mar 2008 17:40:21
-0000 1.19
 -197,6 +197,13 
ASN1_OBJECT *otherTypeId,
ASN1_TYPE *otherType);
+int CMS_RecipientInfo_kekri_get0_id(CMS_RecipientInfo
*ri,
+ X509_ALGOR **palg,
+ ASN1_OCTET_STRING **pid,
+ ASN1_GENERALIZEDTIME **pdate,
+ ASN1_OBJECT **potherid,
+ ASN1_TYPE **pothertype);
+
int CMS_RecipientInfo_set0_key(CMS_RecipientInfo *ri,
unsigned char *key, size_t keylen);
 -288,11 +295,11 
#ifdef HEADER_X509V3_H
int CMS_get1_ReceiptRequest(CMS_SignerInfo *si,
CMS_ReceiptRequest **prr);
-int CMS_add1_ReceiptRequest(CMS_SignerInfo *si,
- unsigned char *id, int idlen,
+CMS_ReceiptRequest *CMS_ReceiptRequest_create0(unsigned
char *id, int idlen,
int allorfirst,
STACK_OF(GENERAL_NAMES) *receiptList,
STACK_OF(GENERAL_NAMES) *receiptsTo);
+int CMS_add1_ReceiptRequest(CMS_SignerInfo *si,
CMS_ReceiptRequest *rr);
void CMS_ReceiptRequest_get0_values(CMS_ReceiptRequest
*rr,
ASN1_STRING **pcid,
int *pallorfirst,
 -346,6 +353,7 
#define CMS_F_CMS_GET0_ENVELOPED 131
#define CMS_F_CMS_GET0_REVOCATION_CHOICES 132
#define CMS_F_CMS_GET0_SIGNED 133
+#define CMS_F_CMS_RECEIPTREQUEST_CREATE0 159
#define CMS_F_CMS_RECIPIENTINFO_DECRYPT 134
#define CMS_F_CMS_RECIPIENTINFO_KEKRI_DECRYPT 135
#define CMS_F_CMS_RECIPIENTINFO_KEKRI_ENCRYPT 136
 .
patch -p0 <<' .'
Index: openssl/crypto/cms/cms_env.c
============================================================
================
$ cvs diff -u -r1.11 -r1.12 cms_env.c
--- openssl/crypto/cms/cms_env.c 19 Mar 2008 23:08:20
-0000 1.11
+++ openssl/crypto/cms/cms_env.c 26 Mar 2008 17:40:22
-0000 1.12
 -581,7 +581,6 
}
-#if 0
int CMS_RecipientInfo_kekri_get0_id(CMS_RecipientInfo
*ri,
X509_ALGOR **palg,
ASN1_OCTET_STRING **pid,
 -618,8 +617,6 
}
return 1;
}
-#endif
-
int CMS_RecipientInfo_set0_key(CMS_RecipientInfo *ri,
unsigned char *key, size_t keylen)
 .
patch -p0 <<' .'
Index: openssl/crypto/cms/cms_err.c
============================================================
================
$ cvs diff -u -r1.14 -r1.15 cms_err.c
--- openssl/crypto/cms/cms_err.c 26 Mar 2008 13:10:20
-0000 1.14
+++ openssl/crypto/cms/cms_err.c 26 Mar 2008 17:40:22
-0000 1.15
 -72,7 +72,7 
{
{ERR_FUNC(CMS_F_CHECK_CONTENT), "CHECK_CONTENT"},
{ERR_FUNC(CMS_F_CMS_ADD0_RECIPIENT_KEY), "CMS_add0_reci
pient_key"},
-{ERR_FUNC(CMS_F_CMS_ADD1_RECEIPTREQUEST), "CMS_ADD1_RE
CEIPTREQUEST"},
+{ERR_FUNC(CMS_F_CMS_ADD1_RECEIPTREQUEST), "CMS_add1_Re
ceiptRequest"},
{ERR_FUNC(CMS_F_CMS_ADD1_RECIPIENT_CERT), "CMS_add1_rec
ipient_cert"},
{ERR_FUNC(CMS_F_CMS_ADD1_SIGNER), "CMS_add1_signer"
;},
{ERR_FUNC(CMS_F_CMS_ADD1_SIGNINGTIME), "CMS_ADD1_SIGNIN
GTIME"},
 -106,6 +106,7 
{ERR_FUNC(CMS_F_CMS_GET0_ENVELOPED), "CMS_GET0_ENVELOPE
D"},
{ERR_FUNC(CMS_F_CMS_GET0_REVOCATION_CHOICES), "CMS_GET0
_REVOCATION_CHOICES"},
{ERR_FUNC(CMS_F_CMS_GET0_SIGNED), "CMS_GET0_SIGNED"
;},
+{ERR_FUNC(CMS_F_CMS_RECEIPTREQUEST_CREATE0), "CMS_Rece
iptRequest_create0"},
{ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_DECRYPT), "CMS_Recipi
entInfo_decrypt"},
{ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_KEKRI_DECRYPT), "CMS_
RECIPIENTINFO_KEKRI_DECRYPT"},
{ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_KEKRI_ENCRYPT), "CMS_
RECIPIENTINFO_KEKRI_ENCRYPT"},
 .
patch -p0 <<' .'
Index: openssl/crypto/cms/cms_ess.c
============================================================
================
$ cvs diff -u -r1.1 -r1.2 cms_ess.c
--- openssl/crypto/cms/cms_ess.c 26 Mar 2008 13:10:20
-0000 1.1
+++ openssl/crypto/cms/cms_ess.c 26 Mar 2008 17:40:22
-0000 1.2
 -89,26 +89,18 
return 1;
}
-int CMS_add1_ReceiptRequest(CMS_SignerInfo *si,
- unsigned char *id, int idlen,
+CMS_ReceiptRequest *CMS_ReceiptRequest_create0(unsigned
char *id, int idlen,
int allorfirst,
STACK_OF(GENERAL_NAMES) *receiptList,
STACK_OF(GENERAL_NAMES) *receiptsTo)
{
CMS_ReceiptRequest *rr = NULL;
- STACK_OF(GENERAL_NAMES) *tmpto = NULL;
- unsigned char *rrder = NULL;
- int rrderlen;
- int r = 0;
rr = CMS_ReceiptRequest_new();
if (!rr)
goto merr;
if (id)
- {
- if (!ASN1_STRING_set(rr->signedContentIdentifier,
id, idlen))
- goto merr;
- }
+ ASN1_STRING_set0(rr->signedContentIdentifier, id,
idlen);
else
{
if (!ASN1_STRING_set(rr->signedContentIdentifier,
NULL, 32))
 -118,7 +110,7 
goto err;
}
- tmpto = rr->receiptsTo;
+ sk_GENERAL_NAMES_pop_free(rr->receiptsTo,
GENERAL_NAMES_free);
rr->receiptsTo = receiptsTo;
if (receiptList)
 -132,21 +124,38 
rr->receiptsFrom->d.allOrFirstTier = allorfirst;
}
- rrderlen = i2d_CMS_ReceiptRequest(rr, &rrder);
-
- r = CMS_signed_add1_attr_by_NID(si,
NID_id_smime_aa_receiptRequest,
- V_ASN1_SEQUENCE, rrder, rrderlen);
+ return rr;
merr:
- CMSerr(CMS_F_CMS_ADD1_RECEIPTREQUEST,
ERR_R_MALLOC_FAILURE);
+ CMSerr(CMS_F_CMS_RECEIPTREQUEST_CREATE0,
ERR_R_MALLOC_FAILURE);
err:
if (rr)
- {
- rr->receiptsTo = tmpto;
- rr->receiptsFrom->type = 0;
CMS_ReceiptRequest_free(rr);
- }
+
+ return NULL;
+
+ }
+
+int CMS_add1_ReceiptRequest(CMS_SignerInfo *si,
CMS_ReceiptRequest *rr)
+ {
+ unsigned char *rrder = NULL;
+ int rrderlen, r = 0;
+
+ rrderlen = i2d_CMS_ReceiptRequest(rr, &rrder);
+ if (rrderlen < 0)
+ goto merr;
+
+ if (!CMS_signed_add1_attr_by_NID(si,
NID_id_smime_aa_receiptRequest,
+ V_ASN1_SEQUENCE, rrder, rrderlen))
+ goto merr;
+
+ r = 1;
+
+ merr:
+ if (!r)
+ CMSerr(CMS_F_CMS_ADD1_RECEIPTREQUEST,
ERR_R_MALLOC_FAILURE);
+
if (rrder)
OPENSSL_free(rrder);
 .
____________________________________________________________
__________
OpenSSL Project http://www.openssl.org
CVS Repository Commit List
openssl-cvs openssl.org
Automated List Manager
majordomo openssl.org
|