Add support for raw extensions. This means that you can include the DER encoding
[openssl.git] / crypto / objects / obj_dat.c
index 34866ebbd28b095af2961c8b9c546c4761f1431d..563556e1f867a8a0b7301cc2b85ee71ab351b425 100644 (file)
 #include "objects.h"
 
 /* obj_dat.h is generated from objects.h by obj_dat.pl */
+#ifndef NO_OBJECT
 #include "obj_dat.h"
+#else
+/* You will have to load all the objects needed manually in the application */
+#define NUM_NID 0
+#define NUM_SN 0
+#define NUM_LN 0
+#define NUM_OBJ 0
+static unsigned char lvalues[1];
+static ASN1_OBJECT nid_objs[1];
+static ASN1_OBJECT *sn_objs[1];
+static ASN1_OBJECT *ln_objs[1];
+static ASN1_OBJECT *obj_objs[1];
+#endif
 
 #ifndef NOPROTO
 static int sn_cmp(ASN1_OBJECT **a, ASN1_OBJECT **b);
@@ -163,6 +176,7 @@ ADDED_OBJ *ca,*cb;
        default:
                abort();
                }
+       return(1); /* should not get here */
        }
 
 static int init_added()
@@ -177,7 +191,8 @@ ADDED_OBJ *a;
        {
        a->obj->nid=0;
        a->obj->flags|=ASN1_OBJECT_FLAG_DYNAMIC|
-                       ASN1_OBJECT_FLAG_DYNAMIC_STRINGS;
+                       ASN1_OBJECT_FLAG_DYNAMIC_STRINGS|
+                       ASN1_OBJECT_FLAG_DYNAMIC_DATA;
        }
 
 static void cleanup2(a)
@@ -247,7 +262,9 @@ ASN1_OBJECT *obj;
                                Free(aop);
                        }
                }
-       o->flags&= ~(ASN1_OBJECT_FLAG_DYNAMIC|ASN1_OBJECT_FLAG_DYNAMIC_STRINGS);
+       o->flags&= ~(ASN1_OBJECT_FLAG_DYNAMIC|ASN1_OBJECT_FLAG_DYNAMIC_STRINGS|
+                       ASN1_OBJECT_FLAG_DYNAMIC_DATA);
+
        return(o->nid);
 err:
        for (i=ADDED_DATA; i<=ADDED_NID; i++)
@@ -380,42 +397,61 @@ 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) {
+               /* Clear the error */
+               ERR_get_error();
+               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;
@@ -502,7 +538,7 @@ int OBJ_create_objects(in)
 BIO *in;
        {
        MS_STATIC char buf[512];
-       int i,num= -1;
+       int i,num=0;
        char *o,*s,*l=NULL;
 
        for (;;)
@@ -544,7 +580,7 @@ BIO *in;
                if (!OBJ_create(o,s,l)) return(num);
                num++;
                }
-       return(num);
+       /* return(num); */
        }
 
 int OBJ_create(oid,sn,ln)