Fix OBJ_txt2nid(): old function was broken when input used the "dot" form, e.g.
authorDr. Stephen Henson <steve@openssl.org>
Tue, 12 Jan 1999 18:40:33 +0000 (18:40 +0000)
committerDr. Stephen Henson <steve@openssl.org>
Tue, 12 Jan 1999 18:40:33 +0000 (18:40 +0000)
1.2.3.4 . Also added new function OBJ_txt2obj().

CHANGES
crypto/objects/obj_dat.c
crypto/objects/objects.h

diff --git a/CHANGES b/CHANGES
index 8849c86..57c9a01 100644 (file)
--- 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]
index 93424a3..3df5cdd 100644 (file)
@@ -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;
        {
index fffdda7..9f934c2 100644 (file)
@@ -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();