List Info

Thread: OpenSSL: openssl/apps/ cms.c openssl/crypto/cms/ cms.h cms_env.c...




OpenSSL: openssl/apps/ cms.c openssl/crypto/cms/ cms.h cms_env.c...
country flaguser name
Germany
2008-03-26 12:40:22
  OpenSSL CVS Repository
  http://cvs.openssl.org/
 
____________________________________________________________
________________

  Server: cvs.openssl.org                  Name:   Dr.
Stephen Henson
  Root:   /v/openssl/cvs                   Email:  steveopenssl.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-cvsopenssl.org
Automated List Manager                          
majordomoopenssl.org

[1]

about | contact  Other archives ( Real Estate discussion Medical topics )