提交 2d723902 编写于 作者: D Dr. Stephen Henson

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().
上级 a6801a91
......@@ -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,43 +397,58 @@ ASN1_OBJECT *a;
return((*op)->nid);
}
int OBJ_txt2nid(s)
/* 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 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;
int nid = NID_undef;
ASN1_OBJECT *op=NULL;
unsigned char *buf,*p;
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);
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);
/* 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;
{
ASN1_OBJECT *obj;
int nid;
obj = OBJ_txt2obj(s, 0);
nid = OBJ_obj2nid(obj);
ASN1_OBJECT_free(obj);
return nid;
}
int OBJ_ln2nid(s)
char *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();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册