Commit 2d723902 authored by Dr. Stephen Henson's avatar Dr. Stephen Henson
Browse files

Fix OBJ_txt2nid(): old function was broken when input used the "dot" form, e.g.

1.2.3.4 . Also added new function OBJ_txt2obj().
parent a6801a91
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -5,6 +5,14 @@

 Changes between 0.9.1c and 0.9.2

  *) The function OBJ_txt2nid was broken. It was supposed to return a nid
     based on a text string, looking up short and long names and finally
     "dot" format. The "dot" format stuff didn't work. Added new function
     OBJ_txt2obj to do the same but return an ASN1_OBJECT and rewrote 
     OBJ_txt2nid to use it. OBJ_txt2obj can also return objects even if the
     OID is not part of the table.
     [Steve Henson]

  *) Add prototypes to X509 lookup/verify methods, fixing a bug in
     X509_LOOKUP_by_alias().
     [Ben Laurie]
+46 −31
Original line number Diff line number Diff line
@@ -397,41 +397,56 @@ ASN1_OBJECT *a;
	return((*op)->nid);
	}

int OBJ_txt2nid(s)
char *s;
	{
	int ret;
/* Convert an object name into an ASN1_OBJECT
 * if "noname" is not set then search for short and long names first.
 * This will convert the "dotted" form into an object: unlike OBJ_txt2nid
 * it can be used with any objects, not just registered ones.
 */

	ret=OBJ_sn2nid(s);
	if (ret == NID_undef)
		{
		ret=OBJ_ln2nid(s);
		if (ret == NID_undef)
ASN1_OBJECT *OBJ_txt2obj(s, no_name)
char *s;
int no_name;
	{
	int nid = NID_undef;
	ASN1_OBJECT *op=NULL;
	unsigned char *buf,*p;
			int i;
	int i, j;

			i=a2d_ASN1_OBJECT(NULL,0,s,-1);
			if (i <= 0)
				{
				/* clear the error */
				ERR_get_error();
				return(0);
	if(!no_name) {
		if( ((nid = OBJ_sn2nid(s)) != NID_undef) ||
			((nid = OBJ_ln2nid(s)) != NID_undef) ) 
					return OBJ_nid2obj(nid);
	}

			if ((buf=(unsigned char *)Malloc(i)) == NULL)
				return(NID_undef);
			a2d_ASN1_OBJECT(buf,i,s,-1);
	/* Work out size of content octets */
	i=a2d_ASN1_OBJECT(NULL,0,s,-1);
	if (i <= 0) return NULL;
	/* Work out total size */
	j = ASN1_object_size(0,i,V_ASN1_OBJECT);

	if((buf=(unsigned char *)Malloc(j)) == NULL) return NULL;

	p = buf;
	/* Write out tag+length */
	ASN1_put_object(&p,0,i,V_ASN1_OBJECT,V_ASN1_UNIVERSAL);
	/* Write out contents */
	a2d_ASN1_OBJECT(p,i,s,-1);
	
	p=buf;
	op=d2i_ASN1_OBJECT(NULL,&p,i);
			if (op == NULL) return(NID_undef);
			ret=OBJ_obj2nid(op);
			ASN1_OBJECT_free(op);
	Free(buf);
	return op;
	}
		}
	return(ret);

int OBJ_txt2nid(s)
char *s;
{
	ASN1_OBJECT *obj;
	int nid;
	obj = OBJ_txt2obj(s, 0);
	nid = OBJ_obj2nid(obj);
	ASN1_OBJECT_free(obj);
	return nid;
}

int OBJ_ln2nid(s)
+2 −0
Original line number Diff line number Diff line
@@ -708,6 +708,7 @@ ASN1_OBJECT * OBJ_nid2obj(int n);
char *		OBJ_nid2ln(int n);
char *		OBJ_nid2sn(int n);
int		OBJ_obj2nid(ASN1_OBJECT *o);
ASN1_OBJECT *	OBJ_txt2obj(char *s, int no_name);
int		OBJ_txt2nid(char *s);
int		OBJ_ln2nid(char *s);
int		OBJ_sn2nid(char *s);
@@ -736,6 +737,7 @@ ASN1_OBJECT * OBJ_nid2obj();
char *		OBJ_nid2ln();
char *		OBJ_nid2sn();
int		OBJ_obj2nid();
ASN1_OBJECT *	OBJ_txt2obj();
int		OBJ_txt2nid();
int		OBJ_ln2nid();
int		OBJ_sn2nid();