summaryrefslogtreecommitdiff
path: root/crypto/x509/f
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/x509/f')
-rw-r--r--crypto/x509/f465
1 files changed, 465 insertions, 0 deletions
diff --git a/crypto/x509/f b/crypto/x509/f
new file mode 100644
index 0000000000..6ec986db87
--- /dev/null
+++ b/crypto/x509/f
@@ -0,0 +1,465 @@
+*** x509name.c Wed Jul 2 09:35:35 1997
+--- /home/eay/play/x Sat Jul 5 01:39:56 1997
+***************
+*** 1,202 ****
+! /* crypto/x509/x509name.c */
+! /* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
+! * All rights reserved.
+! *
+! * This package is an SSL implementation written
+! * by Eric Young (eay@cryptsoft.com).
+! * The implementation was written so as to conform with Netscapes SSL.
+! *
+! * This library is free for commercial and non-commercial use as long as
+! * the following conditions are aheared to. The following conditions
+! * apply to all code found in this distribution, be it the RC4, RSA,
+! * lhash, DES, etc., code; not just the SSL code. The SSL documentation
+! * included with this distribution is covered by the same copyright terms
+! * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+! *
+! * Copyright remains Eric Young's, and as such any Copyright notices in
+! * the code are not to be removed.
+! * If this package is used in a product, Eric Young should be given attribution
+! * as the author of the parts of the library used.
+! * This can be in the form of a textual message at program startup or
+! * in documentation (online or textual) provided with the package.
+! *
+! * Redistribution and use in source and binary forms, with or without
+! * modification, are permitted provided that the following conditions
+! * are met:
+! * 1. Redistributions of source code must retain the copyright
+! * notice, this list of conditions and the following disclaimer.
+! * 2. Redistributions in binary form must reproduce the above copyright
+! * notice, this list of conditions and the following disclaimer in the
+! * documentation and/or other materials provided with the distribution.
+! * 3. All advertising materials mentioning features or use of this software
+! * must display the following acknowledgement:
+! * "This product includes cryptographic software written by
+! * Eric Young (eay@cryptsoft.com)"
+! * The word 'cryptographic' can be left out if the rouines from the library
+! * being used are not cryptographic related :-).
+! * 4. If you include any Windows specific code (or a derivative thereof) from
+! * the apps directory (application code) you must include an acknowledgement:
+! * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+! *
+! * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+! * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+! * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+! * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+! * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+! * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+! * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+! * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+! * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+! * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+! * SUCH DAMAGE.
+! *
+! * The licence and distribution terms for any publically available version or
+! * derivative of this code cannot be changed. i.e. this code cannot simply be
+! * copied and put under another distribution licence
+! * [including the GNU Public Licence.]
+! */
+!
+! #include <stdio.h>
+! #include "stack.h"
+! #include "cryptlib.h"
+! #include "asn1.h"
+! #include "objects.h"
+! #include "evp.h"
+! #include "x509.h"
+!
+! int X509_NAME_get_text_by_NID(name,nid,buf,len)
+! X509_NAME *name;
+! int nid;
+! char *buf;
+! int len;
+ {
+ ASN1_OBJECT *obj;
+
+ obj=OBJ_nid2obj(nid);
+! if (obj == NULL) return(-1);
+! return(X509_NAME_get_text_by_OBJ(name,obj,buf,len));
+ }
+
+- int X509_NAME_get_text_by_OBJ(name,obj,buf,len)
+- X509_NAME *name;
+- ASN1_OBJECT *obj;
+- char *buf;
+- int len;
+- {
+- int i;
+- ASN1_STRING *data;
+
+! i=X509_NAME_get_index_by_OBJ(name,obj,0);
+! if (i < 0) return(-1);
+! data=X509_NAME_ENTRY_get_data(X509_NAME_get_entry(name,i));
+! i=(data->length > (len-1))?(len-1):data->length;
+! if (buf == NULL) return(data->length);
+! memcpy(buf,data->data,i);
+! buf[i]='\0';
+! return(i);
+! }
+
+! int X509_NAME_entry_count(name)
+! X509_NAME *name;
+ {
+! if (name == NULL) return(0);
+! return(sk_num(name->entries));
+ }
+
+! int X509_NAME_get_index_by_NID(name,nid,oldpos)
+! X509_NAME *name;
+! int nid;
+! int oldpos;
+! {
+! ASN1_OBJECT *obj;
+
+! obj=OBJ_nid2obj(nid);
+! if (obj == NULL) return(-2);
+! return(X509_NAME_get_index_by_OBJ(name,obj,oldpos));
+ }
+
+- int X509_NAME_get_index_by_OBJ(name,obj,oldpos)
+- X509_NAME *name;
+- ASN1_OBJECT *obj;
+- int oldpos;
+- {
+- int n;
+- X509_NAME_ENTRY *ne;
+- STACK *sk;
+
+! if (name == NULL) return(-1);
+! if (oldpos < 0)
+! oldpos= -1;
+! sk=name->entries;
+! n=sk_num(sk);
+! for (oldpos++; oldpos < n; oldpos++)
+ {
+! ne=(X509_NAME_ENTRY *)sk_value(sk,oldpos);
+! if (OBJ_cmp(ne->object,obj) == 0)
+! return(oldpos);
+ }
+! return(-1);
+ }
+
+- X509_NAME_ENTRY *X509_NAME_get_entry(name,loc)
+- X509_NAME *name;
+- int loc;
+- {
+- if ( (name == NULL) || (sk_num(name->entries) <= loc) || (loc < 0))
+- return(NULL);
+- else
+- return((X509_NAME_ENTRY *)sk_value(name->entries,loc));
+- }
+
+! X509_NAME_ENTRY *X509_NAME_delete_entry(name,loc)
+! X509_NAME *name;
+! int loc;
+ {
+! X509_NAME_ENTRY *ret;
+! int i,j,n,set_prev,set_next;
+! STACK *sk;
+!
+! if ((name == NULL) || (sk_num(name->entries) <= loc) || (loc < 0))
+! return(NULL);
+! sk=name->entries;
+! ret=(X509_NAME_ENTRY *)sk_delete(sk,loc);
+! n=sk_num(sk);
+! name->modified=1;
+! if (loc == n) return(ret);
+!
+! /* else we need to fixup the set field */
+! if (loc != 0)
+! set_prev=((X509_NAME_ENTRY *)sk_value(sk,loc-1))->set;
+! else
+! set_prev=ret->set-1;
+! set_next=((X509_NAME_ENTRY *)sk_value(sk,loc))->set;
+
+! /* set_prev is the previous set
+! * set is the current set
+! * set_next is the following
+! * prev 1 1 1 1 1 1 1 1
+! * set 1 1 2 2
+! * next 1 1 2 2 2 2 3 2
+! * so basically only if prev and next differ by 2, then
+! * re-number down by 1 */
+! if (set_prev+1 < set_next)
+! {
+! j=set_next-set_prev-1;
+! for (i=loc; i<n; i++)
+! ((X509_NAME_ENTRY *)sk_value(sk,loc-1))->set-=j;
+! }
+! return(ret);
+ }
+
+ /* if set is -1, append to previous set, 0 'a new one', and 1,
+ * prepend to the guy we are about to stomp on. */
+! int X509_NAME_add_entry(name,ne,loc,set)
+! X509_NAME *name;
+! X509_NAME_ENTRY *ne;
+! int loc;
+! int set;
+ {
+! X509_NAME_ENTRY *new_name=NULL;
+ int n,i,inc;
+ STACK *sk;
+
+--- 1,77 ----
+! X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_NID(X509_NAME_ENTRY **ne, int nid,
+! int type,unsigned char *bytes, int len)
+ {
+ ASN1_OBJECT *obj;
+
+ obj=OBJ_nid2obj(nid);
+! if (obj == NULL)
+! {
+! X509err(X509_F_X509_NAME_ENTRY_CREATE_BY_NID,X509_R_UNKNOWN_NID);
+! return(NULL);
+! }
+! return(X509_NAME_ENTRY_create_by_OBJ(ne,obj,type,bytes,len));
+ }
+
+
+! X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_OBJ(X509_NAME_ENTRY **ne,
+! ASN1_OBJECT *obj, int type,unsigned char *bytes,
+! int len)
+! {
+! X509_NAME_ENTRY *ret;
+
+! if ((ne == NULL) || (*ne == NULL))
+ {
+! if ((ret=X509_NAME_ENTRY_new()) == NULL)
+! return(NULL);
+ }
++ else
++ ret= *ne;
+
+! if (!X509_NAME_ENTRY_set_object(ret,obj))
+! goto err;
+! if (!X509_NAME_ENTRY_set_data(ret,type,bytes,len))
+! goto err;
+
+! if ((ne != NULL) && (*ne == NULL)) *ne=ret;
+! return(ret);
+! err:
+! if ((ne == NULL) || (ret != *ne))
+! X509_NAME_ENTRY_free(ret);
+! return(NULL);
+ }
+
+
+! int X509_NAME_ENTRY_set_object(X509_NAME_ENTRY *ne, ASN1_OBJECT *obj)
+! {
+! if ((ne == NULL) || (obj == NULL))
+ {
+! X509err(X509_F_X509_NAME_ENTRY_SET_OBJECT,ERR_R_PASSED_NULL_PARAMETER);
+! return(0);
+ }
+! ASN1_OBJECT_free(ne->object);
+! ne->object=OBJ_dup(obj);
+! return((ne->object == NULL)?0:1);
+ }
+
+
+! int X509_NAME_ENTRY_set_data(X509_NAME_ENTRY *ne,int type,unsigned char *bytes,int len)
+ {
+! int i;
+
+! if ((ne == NULL) || ((bytes == NULL) && (len != 0))) return(0);
+! if (len < 0) len=strlen((char *)bytes);
+! i=ASN1_STRING_set(ne->value,bytes,len);
+! if (!i) return(0);
+! ne->value->type=ASN1_PRINTABLE_type(bytes,len);
+! return(1);
+ }
+
+ /* if set is -1, append to previous set, 0 'a new one', and 1,
+ * prepend to the guy we are about to stomp on. */
+! int X509_NAME_add_entry(X509_NAME *name,X509_NAME_ENTRY *ne,int loc,int set)
+ {
+! /* ERIC: renamed new to nenew for C++ users --tjh */
+! X509_NAME_ENTRY *nenew;
+ int n,i,inc;
+ STACK *sk;
+
+***************
+*** 206,213 ****
+ if (loc > n) loc=n;
+ else if (loc < 0) loc=n;
+
+- name->modified=1;
+-
+ if (set == -1)
+ {
+ if (loc == 0)
+--- 81,86 ----
+***************
+*** 223,245 ****
+ }
+ else /* if (set >= 0) */
+ {
+- inc=(set == 0)?1:0;
+ if (loc >= n)
+ {
+ if (loc != 0)
+ set=((X509_NAME_ENTRY *)
+! sk_value(sk,n-1))->set+1;
+ else
+ set=0;
+ }
+ else
+ set=((X509_NAME_ENTRY *)sk_value(sk,loc))->set;
+ }
+
+! if ((new_name=X509_NAME_ENTRY_dup(ne)) == NULL)
+ goto err;
+! new_name->set=set;
+! if (!sk_insert(sk,(char *)new_name,loc))
+ {
+ X509err(X509_F_X509_NAME_ADD_ENTRY,ERR_R_MALLOC_FAILURE);
+ goto err;
+--- 96,122 ----
+ }
+ else /* if (set >= 0) */
+ {
+ if (loc >= n)
+ {
+ if (loc != 0)
+ set=((X509_NAME_ENTRY *)
+! sk_value(sk,loc-1))->set+1;
+ else
+ set=0;
+ }
+ else
+ set=((X509_NAME_ENTRY *)sk_value(sk,loc))->set;
++ inc=(set == 0)?1:0;
+ }
+
+! if ((nenew=X509_NAME_ENTRY_dup(ne)) == NULL)
+ goto err;
+! /* eric forgot to put this in when he cut the nice
+! * interface so that I don't have to do the icky things
+! * that req.c does --tjh :-)
+! */
+! nenew->set=set;
+! if (!sk_insert(sk,(char *)nenew,loc))
+ {
+ X509err(X509_F_X509_NAME_ADD_ENTRY,ERR_R_MALLOC_FAILURE);
+ goto err;
+***************
+*** 252,357 ****
+ }
+ return(1);
+ err:
+! if (new_name != NULL)
+ X509_NAME_ENTRY_free(ne);
+ return(0);
+- }
+-
+- X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_NID(ne,nid,type,bytes,len)
+- X509_NAME_ENTRY **ne;
+- int nid;
+- int type;
+- unsigned char *bytes;
+- int len;
+- {
+- ASN1_OBJECT *obj;
+-
+- obj=OBJ_nid2obj(nid);
+- if (obj == NULL)
+- {
+- X509err(X509_F_X509_NAME_ENTRY_CREATE_BY_NID,X509_R_UNKNOWN_NID);
+- return(NULL);
+- }
+- return(X509_NAME_ENTRY_create_by_OBJ(ne,obj,type,bytes,len));
+- }
+-
+- X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_OBJ(ne,obj,type,bytes,len)
+- X509_NAME_ENTRY **ne;
+- ASN1_OBJECT *obj;
+- int type;
+- unsigned char *bytes;
+- int len;
+- {
+- X509_NAME_ENTRY *ret;
+-
+- if ((ne == NULL) || (*ne == NULL))
+- {
+- if ((ret=X509_NAME_ENTRY_new()) == NULL)
+- return(NULL);
+- }
+- else
+- ret= *ne;
+-
+- if (!X509_NAME_ENTRY_set_object(ret,obj))
+- goto err;
+- if (!X509_NAME_ENTRY_set_data(ret,type,bytes,len))
+- goto err;
+-
+- if ((ne != NULL) && (*ne == NULL)) *ne=ret;
+- return(ret);
+- err:
+- if ((ne == NULL) || (ret != *ne))
+- X509_NAME_ENTRY_free(ret);
+- return(NULL);
+- }
+-
+- int X509_NAME_ENTRY_set_object(ne,obj)
+- X509_NAME_ENTRY *ne;
+- ASN1_OBJECT *obj;
+- {
+- if ((ne == NULL) || (obj == NULL))
+- {
+- X509err(X509_F_X509_NAME_ENTRY_SET_OBJECT,ERR_R_PASSED_NULL_PARAMETER);
+- return(0);
+- }
+- ASN1_OBJECT_free(ne->object);
+- ne->object=OBJ_dup(obj);
+- return((ne->object == NULL)?0:1);
+- }
+-
+- int X509_NAME_ENTRY_set_data(ne,type,bytes,len)
+- X509_NAME_ENTRY *ne;
+- int type;
+- unsigned char *bytes;
+- int len;
+- {
+- int i;
+-
+- if ((ne == NULL) || ((bytes == NULL) && (len != 0))) return(0);
+- if (len < 0) len=strlen((char *)bytes);
+- i=ASN1_STRING_set(ne->value,bytes,len);
+- if (!i) return(0);
+- if (type != V_ASN1_UNDEF)
+- {
+- if (type == V_ASN1_APP_CHOOSE)
+- ne->value->type=ASN1_PRINTABLE_type(bytes,len);
+- else
+- ne->value->type=type;
+- }
+- return(1);
+- }
+-
+- ASN1_OBJECT *X509_NAME_ENTRY_get_object(ne)
+- X509_NAME_ENTRY *ne;
+- {
+- if (ne == NULL) return(NULL);
+- return(ne->object);
+- }
+-
+- ASN1_STRING *X509_NAME_ENTRY_get_data(ne)
+- X509_NAME_ENTRY *ne;
+- {
+- if (ne == NULL) return(NULL);
+- return(ne->value);
+ }
+
+--- 129,136 ----
+ }
+ return(1);
+ err:
+! if (nenew != NULL)
+ X509_NAME_ENTRY_free(ne);
+ return(0);
+ }
+