diff options
author | Dr. Stephen Henson <steve@openssl.org> | 1999-01-12 18:40:33 +0000 |
---|---|---|
committer | Dr. Stephen Henson <steve@openssl.org> | 1999-01-12 18:40:33 +0000 |
commit | 2d723902a0ba83c626f4709b467870a01166b0bf (patch) | |
tree | 7c5dedf918fcec09fb60601ae87f409bdc71c40a /crypto/objects | |
parent | a6801a91cdc9a7dc8afae8c1cc2b5a0572dd046c (diff) |
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().
Diffstat (limited to 'crypto/objects')
-rw-r--r-- | crypto/objects/obj_dat.c | 77 | ||||
-rw-r--r-- | crypto/objects/objects.h | 2 |
2 files changed, 48 insertions, 31 deletions
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(); |