Commit 6e6bc352 authored by Dr. Stephen Henson's avatar Dr. Stephen Henson
Browse files

Finish off the X509_ATTRIBUTE string stuff.

parent 77b47b90
Loading
Loading
Loading
Loading
+5 −4
Original line number Original line Diff line number Diff line
@@ -4,6 +4,10 @@


 Changes between 0.9.4 and 0.9.5  [xx XXX 1999]
 Changes between 0.9.4 and 0.9.5  [xx XXX 1999]


  *) Fixes to X509_ATTRIBUTE utilities, change the 'req' program so it uses
     the new code. Add documentation for this stuff.
     [Steve Henson]

  *) Changes to X509_ATTRIBUTE utilities. These have been renamed from
  *) Changes to X509_ATTRIBUTE utilities. These have been renamed from
     X509_*() to X509at_*() on the grounds that they don't handle X509
     X509_*() to X509at_*() on the grounds that they don't handle X509
     structures and behave in an analagous way to the X509v3 functions:
     structures and behave in an analagous way to the X509v3 functions:
@@ -14,10 +18,7 @@
     when passed certificate requests. (TO DO: similar things can be done with
     when passed certificate requests. (TO DO: similar things can be done with
     PKCS#7 signed and unsigned attributes, PKCS#12 attributes and a few other
     PKCS#7 signed and unsigned attributes, PKCS#12 attributes and a few other
     things. Some of these need some d2i or i2d and print functionality
     things. Some of these need some d2i or i2d and print functionality
     because they handle more complex structures. Also need to modify things
     because they handle more complex structures.)
     like 'req' so it actually calls this stuff instead of the evil hacks it
     currently uses.)

     [Steve Henson]
     [Steve Henson]


  *) Add missing #ifndefs that caused missing symbols when building libssl
  *) Add missing #ifndefs that caused missing symbols when building libssl
+1 −0
Original line number Original line Diff line number Diff line
@@ -103,6 +103,7 @@ my %table=(
"debug-rse","cc:-DTERMIOS -DL_ENDIAN -pipe -O -g -ggdb3 -Wall::(unknown)::BN_LLONG $x86_gcc_des $x86_gcc_opts:$x86_elf_asm",
"debug-rse","cc:-DTERMIOS -DL_ENDIAN -pipe -O -g -ggdb3 -Wall::(unknown)::BN_LLONG $x86_gcc_des $x86_gcc_opts:$x86_elf_asm",
"debug-bodo",	"gcc:-DBIO_PAIR_DEBUG -DL_ENDIAN -DREF_CHECK -DCRYPTO_MDEBUG_ALL -g -m486 -pedantic -Wshadow -Wall::-D_REENTRANT::BN_LLONG $x86_gcc_des $x86_gcc_opts:$x86_elf_asm",
"debug-bodo",	"gcc:-DBIO_PAIR_DEBUG -DL_ENDIAN -DREF_CHECK -DCRYPTO_MDEBUG_ALL -g -m486 -pedantic -Wshadow -Wall::-D_REENTRANT::BN_LLONG $x86_gcc_des $x86_gcc_opts:$x86_elf_asm",
"debug-ulf",	"gcc:-DL_ENDIAN -DREF_CHECK -DCRYPTO_MDEBUG_ALL -g -O2 -m486 -Wall -Werror -Wshadow -pipe::-D_REENTRANT::$x86_gcc_des $x86_gcc_opts:$x86_elf_asm",
"debug-ulf",	"gcc:-DL_ENDIAN -DREF_CHECK -DCRYPTO_MDEBUG_ALL -g -O2 -m486 -Wall -Werror -Wshadow -pipe::-D_REENTRANT::$x86_gcc_des $x86_gcc_opts:$x86_elf_asm",
"debug-steve",	"gcc:-DL_ENDIAN -DREF_CHECK -DCRYPTO_MDEBUG_ALL -DPEDANTIC -g -O2 -m486 -pedantic -Wall -Wshadow -pipe::-D_REENTRANT::$x86_gcc_des $x86_gcc_opts:$x86_elf_asm",
"dist",		"cc:-O::(unknown):::::",
"dist",		"cc:-O::(unknown):::::",


# Basic configs that should work on any box
# Basic configs that should work on any box
+18 −1
Original line number Original line Diff line number Diff line
@@ -765,9 +765,26 @@ $rc4_obj =
$rmd160_obj   = 
$rmd160_obj   = 
$rc5_obj      = 
$rc5_obj      = 


*** debug-steve
$cc           = gcc
$cflags       = -DL_ENDIAN -DREF_CHECK -DCRYPTO_MDEBUG_ALL -DPEDANTIC -g -O2 -m486 -pedantic -Wall -Wshadow -pipe
$unistd       = 
$thread_cflag = -D_REENTRANT
$lflags       = 
$bn_ops       = DES_PTR DES_RISC1 DES_UNROLL RC4_INDEX MD2_INT
$bn_obj       = asm/bn86-elf.o asm/co86-elf.o
$des_obj      = asm/dx86-elf.o asm/yx86-elf.o
$bf_obj       = asm/bx86-elf.o
$md5_obj      = asm/mx86-elf.o
$sha1_obj     = asm/sx86-elf.o
$cast_obj     = asm/cx86-elf.o
$rc4_obj      = asm/rx86-elf.o
$rmd160_obj   = asm/rm86-elf.o
$rc5_obj      = asm/r586-elf.o

*** debug-ulf
*** debug-ulf
$cc           = gcc
$cc           = gcc
$cflags       = -DL_ENDIAN -DREF_CHECK -DCRYPTO_MDEBUG_ALL -DPEDANTIC -g -O2 -m486 -Wall  -pedantic -Wall -Wshadow -pipe
$cflags       = -DL_ENDIAN -DREF_CHECK -DCRYPTO_MDEBUG_ALL -g -O2 -m486 -Wall -Werror -Wshadow -pipe
$unistd       = 
$unistd       = 
$thread_cflag = -D_REENTRANT
$thread_cflag = -D_REENTRANT
$lflags       = 
$lflags       = 
+17 −217
Original line number Original line Diff line number Diff line
@@ -115,7 +115,7 @@ static int prompt_info(X509_REQ *req,
		STACK_OF(CONF_VALUE) *attr_sk, char *attr_sect, int attribs);
		STACK_OF(CONF_VALUE) *attr_sk, char *attr_sect, int attribs);
static int auto_info(X509_REQ *req, STACK_OF(CONF_VALUE) *sk,
static int auto_info(X509_REQ *req, STACK_OF(CONF_VALUE) *sk,
				STACK_OF(CONF_VALUE) *attr, int attribs);
				STACK_OF(CONF_VALUE) *attr, int attribs);
static int add_attribute_object(STACK_OF(X509_ATTRIBUTE) *n, char *text,
static int add_attribute_object(X509_REQ *req, char *text,
				char *def, char *value, int nid, int min,
				char *def, char *value, int nid, int min,
				int max);
				int max);
static int add_DN_object(X509_NAME *n, char *text, char *def, char *value,
static int add_DN_object(X509_NAME *n, char *text, char *def, char *value,
@@ -123,7 +123,7 @@ static int add_DN_object(X509_NAME *n, char *text, char *def, char *value,
#ifndef NO_RSA
#ifndef NO_RSA
static void MS_CALLBACK req_cb(int p,int n,void *arg);
static void MS_CALLBACK req_cb(int p,int n,void *arg);
#endif
#endif
static int req_fix_data(int nid,int *type,int len,int min,int max);
static int req_check_len(int len,int min,int max);
static int check_end(char *str, char *end);
static int check_end(char *str, char *end);
static int add_oid_section(LHASH *conf);
static int add_oid_section(LHASH *conf);
#ifndef MONOLITH
#ifndef MONOLITH
@@ -940,115 +940,7 @@ static int make_REQ(X509_REQ *req, EVP_PKEY *pkey, int attribs)
	if(no_prompt) i = auto_info(req, dn_sk, attr_sk, attribs);
	if(no_prompt) i = auto_info(req, dn_sk, attr_sk, attribs);
	else i = prompt_info(req, dn_sk, dn_sect, attr_sk, attr_sect, attribs);
	else i = prompt_info(req, dn_sk, dn_sect, attr_sk, attr_sect, attribs);
	if(!i) goto err;
	if(!i) goto err;
#if 0
	BIO_printf(bio_err,"You are about to be asked to enter information that will be incorporated\n");
	BIO_printf(bio_err,"into your certificate request.\n");
	BIO_printf(bio_err,"What you are about to enter is what is called a Distinguished Name or a DN.\n");
	BIO_printf(bio_err,"There are quite a few fields but you can leave some blank\n");
	BIO_printf(bio_err,"For some fields there will be a default value,\n");
	BIO_printf(bio_err,"If you enter '.', the field will be left blank.\n");
	BIO_printf(bio_err,"-----\n");


	if (sk_CONF_VALUE_num(sk))
		{
		i= -1;
start:		for (;;)
			{
			i++;
			if (sk_CONF_VALUE_num(sk) <= i) break;

			v=sk_CONF_VALUE_value(sk,i);
			p=q=NULL;
			type=v->name;
			if(!check_end(type,"_min") || !check_end(type,"_max") ||
				!check_end(type,"_default") ||
					 !check_end(type,"_value")) continue;
			/* Skip past any leading X. X: X, etc to allow for
			 * multiple instances 
			 */
			for(p = v->name; *p ; p++) 
				if ((*p == ':') || (*p == ',') ||
							 (*p == '.')) {
					p++;
					if(*p) type = p;
					break;
				}
			/* If OBJ not recognised ignore it */
			if ((nid=OBJ_txt2nid(type)) == NID_undef) goto start;
			sprintf(buf,"%s_default",v->name);
			if ((def=CONF_get_string(req_conf,tmp,buf)) == NULL)
				def="";


			sprintf(buf,"%s_value",v->name);
			if ((value=CONF_get_string(req_conf,tmp,buf)) == NULL)
				value=NULL;

			sprintf(buf,"%s_min",v->name);
			min=(int)CONF_get_number(req_conf,tmp,buf);

			sprintf(buf,"%s_max",v->name);
			max=(int)CONF_get_number(req_conf,tmp,buf);

			if (!add_DN_object(ri->subject,v->value,def,value,nid,
				min,max))
				goto err;
			}
		if (sk_X509_NAME_ENTRY_num(ri->subject->entries) == 0)
			{
			BIO_printf(bio_err,"error, no objects specified in config file\n");
			goto err;
			}

		if (attribs)
			{
			if ((attr != NULL) && (sk_CONF_VALUE_num(attr) > 0))
				{
				BIO_printf(bio_err,"\nPlease enter the following 'extra' attributes\n");
				BIO_printf(bio_err,"to be sent with your certificate request\n");
				}

			i= -1;
start2:			for (;;)
				{
				i++;
				if ((attr == NULL) ||
					    (sk_CONF_VALUE_num(attr) <= i))
					break;

				v=sk_CONF_VALUE_value(attr,i);
				type=v->name;
				if ((nid=OBJ_txt2nid(type)) == NID_undef)
					goto start2;

				sprintf(buf,"%s_default",type);
				if ((def=CONF_get_string(req_conf,tmp_attr,buf))
					== NULL)
					def="";
				
				sprintf(buf,"%s_value",type);
				if ((value=CONF_get_string(req_conf,tmp_attr,buf))
					== NULL)
					value=NULL;

				sprintf(buf,"%s_min",type);
				min=(int)CONF_get_number(req_conf,tmp_attr,buf);

				sprintf(buf,"%s_max",type);
				max=(int)CONF_get_number(req_conf,tmp_attr,buf);

				if (!add_attribute_object(ri->attributes,
					v->value,def,value,nid,min,max))
					goto err;
				}
			}
		}
	else
		{
		BIO_printf(bio_err,"No template, please set one up.\n");
		goto err;
		}
#endif
	X509_REQ_set_pubkey(req,pkey);
	X509_REQ_set_pubkey(req,pkey);


	ret=1;
	ret=1;
@@ -1165,7 +1057,7 @@ start2: for (;;)
				sprintf(buf,"%s_max",type);
				sprintf(buf,"%s_max",type);
				max=(int)CONF_get_number(req_conf,attr_sect,buf);
				max=(int)CONF_get_number(req_conf,attr_sect,buf);


				if (!add_attribute_object(req->req_info->attributes,
				if (!add_attribute_object(req,
					v->value,def,value,nid,min,max))
					v->value,def,value,nid,min,max))
					return 0;
					return 0;
				}
				}
@@ -1216,56 +1108,15 @@ static int auto_info(X509_REQ *req, STACK_OF(CONF_VALUE) *dn_sk,
			BIO_printf(bio_err,"error, no objects specified in config file\n");
			BIO_printf(bio_err,"error, no objects specified in config file\n");
			return 0;
			return 0;
			}
			}
#if 0
		if (attribs)
		if (attribs)
			{
			{
			if ((attr_sk != NULL) && (sk_CONF_VALUE_num(attr_sk) > 0))
			for (i = 0; i < sk_CONF_VALUE_num(attr_sk); i++)
				{
				{
				BIO_printf(bio_err,"\nPlease enter the following 'extra' attributes\n");
				BIO_printf(bio_err,"to be sent with your certificate request\n");
				}

			i= -1;
start2:			for (;;)
				{
				i++;
				if ((attr_sk == NULL) ||
					    (sk_CONF_VALUE_num(attr_sk) <= i))
					break;

				v=sk_CONF_VALUE_value(attr_sk,i);
				v=sk_CONF_VALUE_value(attr_sk,i);
				type=v->name;
				if(!X509_REQ_radd_attr_by_txt(req, v->name, MBSTRING_ASC,
				if ((nid=OBJ_txt2nid(type)) == NID_undef)
					(unsigned char *)v->value, -1)) return 0;
					goto start2;

				sprintf(buf,"%s_default",type);
				if ((def=CONF_get_string(req_conf,attr_sect,buf))
					== NULL)
					def="";
				
				sprintf(buf,"%s_value",type);
				if ((value=CONF_get_string(req_conf,attr_sect,buf))
					== NULL)
					value=NULL;

				sprintf(buf,"%s_min",type);
				min=(int)CONF_get_number(req_conf,attr_sect,buf);

				sprintf(buf,"%s_max",type);
				max=(int)CONF_get_number(req_conf,attr_sect,buf);

				if (!add_attribute_object(ri->attributes,
					v->value,def,value,nid,min,max))
					return 0;
				}
				}
				}
			}
			}
	else
		{
		BIO_printf(bio_err,"No template, please set one up.\n");
		return 0;
		}
#endif
	return 1;
	return 1;
	}
	}


@@ -1275,7 +1126,7 @@ static int add_DN_object(X509_NAME *n, char *text, char *def, char *value,
	{
	{
	int i,ret=0;
	int i,ret=0;
	MS_STATIC char buf[1024];
	MS_STATIC char buf[1024];

start:
	BIO_printf(bio_err,"%s [%s]:",text,def);
	BIO_printf(bio_err,"%s [%s]:",text,def);
	(void)BIO_flush(bio_err);
	(void)BIO_flush(bio_err);
	if (value != NULL)
	if (value != NULL)
@@ -1311,7 +1162,7 @@ static int add_DN_object(X509_NAME *n, char *text, char *def, char *value,
#ifdef CHARSET_EBCDIC
#ifdef CHARSET_EBCDIC
	ebcdic2ascii(buf, buf, i);
	ebcdic2ascii(buf, buf, i);
#endif
#endif
	if(!req_fix_data(-1, NULL, i, min, max)) goto err;
	if(!req_check_len(i, min, max)) goto start;
	if (!X509_NAME_add_entry_by_NID(n,nid, MBSTRING_ASC,
	if (!X509_NAME_add_entry_by_NID(n,nid, MBSTRING_ASC,
				(unsigned char *) buf, -1,-1,0)) goto err;
				(unsigned char *) buf, -1,-1,0)) goto err;
	ret=1;
	ret=1;
@@ -1319,15 +1170,12 @@ err:
	return(ret);
	return(ret);
	}
	}


static int add_attribute_object(STACK_OF(X509_ATTRIBUTE) *n, char *text,
static int add_attribute_object(X509_REQ *req, char *text,
				char *def, char *value, int nid, int min,
				char *def, char *value, int nid, int min,
				int max)
				int max)
	{
	{
	int i,z;
	int i;
	X509_ATTRIBUTE *xa=NULL;
	static char buf[1024];
	static char buf[1024];
	ASN1_BIT_STRING *bs=NULL;
	ASN1_TYPE *at=NULL;


start:
start:
	BIO_printf(bio_err,"%s [%s]:",text,def);
	BIO_printf(bio_err,"%s [%s]:",text,def);
@@ -1361,47 +1209,17 @@ start:
		return(0);
		return(0);
		}
		}
	buf[--i]='\0';
	buf[--i]='\0';
	if(!req_check_len(i, min, max)) goto start;


	/* add object plus value */
	if(!X509_REQ_radd_attr_by_NID(req, nid, MBSTRING_ASC,
	if ((xa=X509_ATTRIBUTE_new()) == NULL)
					(unsigned char *)buf, -1)) {
		goto err;
		BIO_printf(bio_err, "Error adding attribute\n");
	if ((xa->value.set=sk_ASN1_TYPE_new_null()) == NULL)
		ERR_print_errors(bio_err);
		goto err;
		goto err;
	xa->set=1;

	if (xa->object != NULL) ASN1_OBJECT_free(xa->object);
	xa->object=OBJ_nid2obj(nid);

	if ((bs=ASN1_BIT_STRING_new()) == NULL) goto err;

	bs->type=ASN1_PRINTABLE_type((unsigned char *)buf,-1);

	z=req_fix_data(nid,&bs->type,i,min,max);
	if (z == 0)
		{
		if (value == NULL)
			goto start;
		else	goto err;
	}
	}


	if (!ASN1_STRING_set(bs,(unsigned char *)buf,i))
		{ BIO_printf(bio_err,"Malloc failure\n"); goto err; }

	if ((at=ASN1_TYPE_new()) == NULL)
		{ BIO_printf(bio_err,"Malloc failure\n"); goto err; }

	ASN1_TYPE_set(at,bs->type,(char *)bs);
	sk_ASN1_TYPE_push(xa->value.set,at);
	bs=NULL;
	at=NULL;
	/* only one item per attribute */

	if (!sk_X509_ATTRIBUTE_push(n,xa)) goto err;
	return(1);
	return(1);
err:
err:
	if (xa != NULL) X509_ATTRIBUTE_free(xa);
	if (at != NULL) ASN1_TYPE_free(at);
	if (bs != NULL) ASN1_BIT_STRING_free(bs);
	return(0);
	return(0);
	}
	}


@@ -1422,26 +1240,8 @@ static void MS_CALLBACK req_cb(int p, int n, void *arg)
	}
	}
#endif
#endif


static int req_fix_data(int nid, int *type, int len, int min, int max)
static int req_check_len(int len, int min, int max)
	{
	{
	if(type) {
		if (nid == NID_pkcs9_emailAddress)
			*type=V_ASN1_IA5STRING;
		if ((nid == NID_commonName) && (*type == V_ASN1_IA5STRING))
			*type=V_ASN1_T61STRING;
		if ((nid == NID_pkcs9_challengePassword) &&
			(*type == V_ASN1_IA5STRING))
			*type=V_ASN1_T61STRING;

		if ((nid == NID_pkcs9_unstructuredName) &&
			(*type == V_ASN1_T61STRING))
			{
			BIO_printf(bio_err,"invalid characters in string, please re-enter the string\n");
			return(0);
			}
		if (nid == NID_pkcs9_unstructuredName)
			*type=V_ASN1_IA5STRING;
	}
	if (len < min)
	if (len < min)
		{
		{
		BIO_printf(bio_err,"string is too short, it needs to be at least %d bytes long\n",min);
		BIO_printf(bio_err,"string is too short, it needs to be at least %d bytes long\n",min);
+2 −2
Original line number Original line Diff line number Diff line
@@ -142,14 +142,14 @@ int ASN1_mbstring_ncopy(ASN1_STRING **out, const unsigned char *in, int len,
		return -1;
		return -1;
	}
	}


	if(minsize && (nchar < minsize)) {
	if((minsize > 0) && (nchar < minsize)) {
		ASN1err(ASN1_F_ASN1_MBSTRING_COPY, ASN1_R_STRING_TOO_SHORT);
		ASN1err(ASN1_F_ASN1_MBSTRING_COPY, ASN1_R_STRING_TOO_SHORT);
		sprintf(strbuf, "%ld", minsize);
		sprintf(strbuf, "%ld", minsize);
		ERR_add_error_data(2, "minsize=", strbuf);
		ERR_add_error_data(2, "minsize=", strbuf);
		return -1;
		return -1;
	}
	}


	if(maxsize && (nchar > maxsize)) {
	if((maxsize > 0) && (nchar > maxsize)) {
		ASN1err(ASN1_F_ASN1_MBSTRING_COPY, ASN1_R_STRING_TOO_LONG);
		ASN1err(ASN1_F_ASN1_MBSTRING_COPY, ASN1_R_STRING_TOO_LONG);
		sprintf(strbuf, "%ld", maxsize);
		sprintf(strbuf, "%ld", maxsize);
		ERR_add_error_data(2, "maxsize=", strbuf);
		ERR_add_error_data(2, "maxsize=", strbuf);
Loading