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().
This commit is contained in:
8
CHANGES
8
CHANGES
@@ -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]
|
||||
|
@@ -397,41 +397,56 @@ ASN1_OBJECT *a;
|
||||
return((*op)->nid);
|
||||
}
|
||||
|
||||
/* 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.
|
||||
*/
|
||||
|
||||
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, j;
|
||||
|
||||
if(!no_name) {
|
||||
if( ((nid = OBJ_sn2nid(s)) != NID_undef) ||
|
||||
((nid = OBJ_ln2nid(s)) != NID_undef) )
|
||||
return OBJ_nid2obj(nid);
|
||||
}
|
||||
|
||||
/* 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);
|
||||
Free(buf);
|
||||
return op;
|
||||
}
|
||||
|
||||
int OBJ_txt2nid(s)
|
||||
char *s;
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret=OBJ_sn2nid(s);
|
||||
if (ret == NID_undef)
|
||||
{
|
||||
ret=OBJ_ln2nid(s);
|
||||
if (ret == NID_undef)
|
||||
{
|
||||
ASN1_OBJECT *op=NULL;
|
||||
unsigned char *buf,*p;
|
||||
int i;
|
||||
|
||||
i=a2d_ASN1_OBJECT(NULL,0,s,-1);
|
||||
if (i <= 0)
|
||||
{
|
||||
/* clear the error */
|
||||
ERR_get_error();
|
||||
return(0);
|
||||
}
|
||||
|
||||
if ((buf=(unsigned char *)Malloc(i)) == NULL)
|
||||
return(NID_undef);
|
||||
a2d_ASN1_OBJECT(buf,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(ret);
|
||||
ASN1_OBJECT *obj;
|
||||
int nid;
|
||||
obj = OBJ_txt2obj(s, 0);
|
||||
nid = OBJ_obj2nid(obj);
|
||||
ASN1_OBJECT_free(obj);
|
||||
return nid;
|
||||
}
|
||||
|
||||
int OBJ_ln2nid(s)
|
||||
|
@@ -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();
|
||||
|
Reference in New Issue
Block a user