aboutsummaryrefslogtreecommitdiffstats
path: root/crypto/objects
diff options
context:
space:
mode:
authorDr. Stephen Henson <steve@openssl.org>1999-01-12 18:40:33 +0000
committerDr. Stephen Henson <steve@openssl.org>1999-01-12 18:40:33 +0000
commit2d723902a0ba83c626f4709b467870a01166b0bf (patch)
tree7c5dedf918fcec09fb60601ae87f409bdc71c40a /crypto/objects
parenta6801a91cdc9a7dc8afae8c1cc2b5a0572dd046c (diff)
downloadopenssl-2d723902a0ba83c626f4709b467870a01166b0bf.tar.gz
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.c77
-rw-r--r--crypto/objects/objects.h2
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();