summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/asn1/x_attrib.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/asn1/x_attrib.c')
-rw-r--r--src/lib/libcrypto/asn1/x_attrib.c128
1 files changed, 47 insertions, 81 deletions
diff --git a/src/lib/libcrypto/asn1/x_attrib.c b/src/lib/libcrypto/asn1/x_attrib.c
index e52ced8627..1e3713f18f 100644
--- a/src/lib/libcrypto/asn1/x_attrib.c
+++ b/src/lib/libcrypto/asn1/x_attrib.c
@@ -58,95 +58,61 @@
58 58
59#include <stdio.h> 59#include <stdio.h>
60#include "cryptlib.h" 60#include "cryptlib.h"
61#include "objects.h" 61#include <openssl/objects.h>
62#include "asn1_mac.h" 62#include <openssl/asn1t.h>
63#include <openssl/x509.h>
63 64
64/* 65/* X509_ATTRIBUTE: this has the following form:
65 * ASN1err(ASN1_F_D2I_X509_ATTRIBUTE,ASN1_R_LENGTH_MISMATCH); 66 *
66 * ASN1err(ASN1_F_X509_ATTRIBUTE_NEW,ASN1_R_UNKNOWN_ATTRIBUTE_TYPE); 67 * typedef struct x509_attributes_st
67 * ASN1err(ASN1_F_I2D_X509_ATTRIBUTE,ASN1_R_UNKNOWN_ATTRIBUTE_TYPE); 68 * {
69 * ASN1_OBJECT *object;
70 * int single;
71 * union {
72 * char *ptr;
73 * STACK_OF(ASN1_TYPE) *set;
74 * ASN1_TYPE *single;
75 * } value;
76 * } X509_ATTRIBUTE;
77 *
78 * this needs some extra thought because the CHOICE type is
79 * merged with the main structure and because the value can
80 * be anything at all we *must* try the SET OF first because
81 * the ASN1_ANY type will swallow anything including the whole
82 * SET OF structure.
68 */ 83 */
69 84
70/* sequence */ 85ASN1_CHOICE(X509_ATTRIBUTE_SET) = {
71int i2d_X509_ATTRIBUTE(a,pp) 86 ASN1_SET_OF(X509_ATTRIBUTE, value.set, ASN1_ANY),
72X509_ATTRIBUTE *a; 87 ASN1_SIMPLE(X509_ATTRIBUTE, value.single, ASN1_ANY)
73unsigned char **pp; 88} ASN1_CHOICE_END_selector(X509_ATTRIBUTE, X509_ATTRIBUTE_SET, single)
74 {
75 int k=0;
76 int r=0,ret=0;
77 unsigned char **p=NULL;
78
79 if (a == NULL) return(0);
80 89
81 p=NULL; 90ASN1_SEQUENCE(X509_ATTRIBUTE) = {
82 for (;;) 91 ASN1_SIMPLE(X509_ATTRIBUTE, object, ASN1_OBJECT),
83 { 92 /* CHOICE type merged with parent */
84 if (k) 93 ASN1_EX_COMBINE(0, 0, X509_ATTRIBUTE_SET)
85 { 94} ASN1_SEQUENCE_END(X509_ATTRIBUTE)
86 r=ASN1_object_size(1,ret,V_ASN1_SEQUENCE);
87 if (pp == NULL) return(r);
88 p=pp;
89 ASN1_put_object(p,1,ret,V_ASN1_SEQUENCE,
90 V_ASN1_UNIVERSAL);
91 }
92 95
93 ret+=i2d_ASN1_OBJECT(a->object,p); 96IMPLEMENT_ASN1_FUNCTIONS(X509_ATTRIBUTE)
94 if (a->set) 97IMPLEMENT_ASN1_DUP_FUNCTION(X509_ATTRIBUTE)
95 ret+=i2d_ASN1_SET(a->value.set,p,i2d_ASN1_TYPE,
96 V_ASN1_SET,V_ASN1_UNIVERSAL);
97 else
98 ret+=i2d_ASN1_TYPE(a->value.single,p);
99 if (k++) return(r);
100 }
101 }
102 98
103X509_ATTRIBUTE *d2i_X509_ATTRIBUTE(a,pp,length) 99X509_ATTRIBUTE *X509_ATTRIBUTE_create(int nid, int atrtype, void *value)
104X509_ATTRIBUTE **a;
105unsigned char **pp;
106long length;
107 {
108 M_ASN1_D2I_vars(a,X509_ATTRIBUTE *,X509_ATTRIBUTE_new);
109
110 M_ASN1_D2I_Init();
111 M_ASN1_D2I_start_sequence();
112 M_ASN1_D2I_get(ret->object,d2i_ASN1_OBJECT);
113
114 if ((c.slen != 0) &&
115 (M_ASN1_next == (V_ASN1_CONSTRUCTED|V_ASN1_UNIVERSAL|V_ASN1_SET)))
116 {
117 ret->set=1;
118 M_ASN1_D2I_get_set(ret->value.set,d2i_ASN1_TYPE);
119 }
120 else
121 {
122 ret->set=0;
123 M_ASN1_D2I_get(ret->value.single,d2i_ASN1_TYPE);
124 }
125
126 M_ASN1_D2I_Finish(a,X509_ATTRIBUTE_free,ASN1_F_D2I_X509_ATTRIBUTE);
127 }
128
129X509_ATTRIBUTE *X509_ATTRIBUTE_new()
130 { 100 {
131 X509_ATTRIBUTE *ret=NULL; 101 X509_ATTRIBUTE *ret=NULL;
102 ASN1_TYPE *val=NULL;
103
104 if ((ret=X509_ATTRIBUTE_new()) == NULL)
105 return(NULL);
106 ret->object=OBJ_nid2obj(nid);
107 ret->single=0;
108 if ((ret->value.set=sk_ASN1_TYPE_new_null()) == NULL) goto err;
109 if ((val=ASN1_TYPE_new()) == NULL) goto err;
110 if (!sk_ASN1_TYPE_push(ret->value.set,val)) goto err;
132 111
133 M_ASN1_New_Malloc(ret,X509_ATTRIBUTE); 112 ASN1_TYPE_set(val,atrtype,value);
134 M_ASN1_New(ret->object,ASN1_OBJECT_new);
135 ret->set=0;
136 ret->value.ptr=NULL;
137 return(ret); 113 return(ret);
138 M_ASN1_New_Error(ASN1_F_X509_ATTRIBUTE_NEW); 114err:
115 if (ret != NULL) X509_ATTRIBUTE_free(ret);
116 if (val != NULL) ASN1_TYPE_free(val);
117 return(NULL);
139 } 118 }
140
141void X509_ATTRIBUTE_free(a)
142X509_ATTRIBUTE *a;
143 {
144 if (a == NULL) return;
145 ASN1_OBJECT_free(a->object);
146 if (a->set)
147 sk_pop_free(a->value.set,ASN1_TYPE_free);
148 else
149 ASN1_TYPE_free(a->value.single);
150 Free((char *)a);
151 }
152