From 2d723902a0ba83c626f4709b467870a01166b0bf Mon Sep 17 00:00:00 2001 From: "Dr. Stephen Henson" Date: Tue, 12 Jan 1999 18:40:33 +0000 Subject: [PATCH] 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(). --- CHANGES | 8 +++++ crypto/objects/obj_dat.c | 77 ++++++++++++++++++++++++---------------- crypto/objects/objects.h | 2 ++ 3 files changed, 56 insertions(+), 31 deletions(-) diff --git a/CHANGES b/CHANGES index 8849c86756..57c9a0162a 100644 --- a/CHANGES +++ b/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] diff --git a/crypto/objects/obj_dat.c b/crypto/objects/obj_dat.c index 93424a373f..3df5cdd97b 100644 --- a/crypto/objects/obj_dat.c +++ b/crypto/objects/obj_dat.c @@ -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; { diff --git a/crypto/objects/objects.h b/crypto/objects/objects.h index fffdda729f..9f934c2742 100644 --- a/crypto/objects/objects.h +++ b/crypto/objects/objects.h @@ -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(); -- 2.34.1