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.c111
1 files changed, 32 insertions, 79 deletions
diff --git a/src/lib/libcrypto/asn1/x_attrib.c b/src/lib/libcrypto/asn1/x_attrib.c
index 14e5ea27aa..1e3713f18f 100644
--- a/src/lib/libcrypto/asn1/x_attrib.c
+++ b/src/lib/libcrypto/asn1/x_attrib.c
@@ -59,64 +59,42 @@
59#include <stdio.h> 59#include <stdio.h>
60#include "cryptlib.h" 60#include "cryptlib.h"
61#include <openssl/objects.h> 61#include <openssl/objects.h>
62#include <openssl/asn1_mac.h> 62#include <openssl/asn1t.h>
63#include <openssl/x509.h> 63#include <openssl/x509.h>
64 64
65/* sequence */ 65/* X509_ATTRIBUTE: this has the following form:
66int i2d_X509_ATTRIBUTE(X509_ATTRIBUTE *a, unsigned char **pp) 66 *
67 { 67 * typedef struct x509_attributes_st
68 int k=0; 68 * {
69 int r=0,ret=0; 69 * ASN1_OBJECT *object;
70 unsigned char **p=NULL; 70 * int single;
71 71 * union {
72 if (a == NULL) return(0); 72 * char *ptr;
73 73 * STACK_OF(ASN1_TYPE) *set;
74 p=NULL; 74 * ASN1_TYPE *single;
75 for (;;) 75 * } value;
76 { 76 * } X509_ATTRIBUTE;
77 if (k) 77 *
78 { 78 * this needs some extra thought because the CHOICE type is
79 r=ASN1_object_size(1,ret,V_ASN1_SEQUENCE); 79 * merged with the main structure and because the value can
80 if (pp == NULL) return(r); 80 * be anything at all we *must* try the SET OF first because
81 p=pp; 81 * the ASN1_ANY type will swallow anything including the whole
82 ASN1_put_object(p,1,ret,V_ASN1_SEQUENCE, 82 * SET OF structure.
83 V_ASN1_UNIVERSAL); 83 */
84 }
85
86 ret+=i2d_ASN1_OBJECT(a->object,p);
87 if (a->set)
88 ret+=i2d_ASN1_SET_OF_ASN1_TYPE(a->value.set,p,i2d_ASN1_TYPE,
89 V_ASN1_SET,V_ASN1_UNIVERSAL,IS_SET);
90 else
91 ret+=i2d_ASN1_TYPE(a->value.single,p);
92 if (k++) return(r);
93 }
94 }
95
96X509_ATTRIBUTE *d2i_X509_ATTRIBUTE(X509_ATTRIBUTE **a, unsigned char **pp,
97 long length)
98 {
99 M_ASN1_D2I_vars(a,X509_ATTRIBUTE *,X509_ATTRIBUTE_new);
100 84
101 M_ASN1_D2I_Init(); 85ASN1_CHOICE(X509_ATTRIBUTE_SET) = {
102 M_ASN1_D2I_start_sequence(); 86 ASN1_SET_OF(X509_ATTRIBUTE, value.set, ASN1_ANY),
103 M_ASN1_D2I_get(ret->object,d2i_ASN1_OBJECT); 87 ASN1_SIMPLE(X509_ATTRIBUTE, value.single, ASN1_ANY)
88} ASN1_CHOICE_END_selector(X509_ATTRIBUTE, X509_ATTRIBUTE_SET, single)
104 89
105 if ((c.slen != 0) && 90ASN1_SEQUENCE(X509_ATTRIBUTE) = {
106 (M_ASN1_next == (V_ASN1_CONSTRUCTED|V_ASN1_UNIVERSAL|V_ASN1_SET))) 91 ASN1_SIMPLE(X509_ATTRIBUTE, object, ASN1_OBJECT),
107 { 92 /* CHOICE type merged with parent */
108 ret->set=1; 93 ASN1_EX_COMBINE(0, 0, X509_ATTRIBUTE_SET)
109 M_ASN1_D2I_get_set_type(ASN1_TYPE,ret->value.set,d2i_ASN1_TYPE, 94} ASN1_SEQUENCE_END(X509_ATTRIBUTE)
110 ASN1_TYPE_free);
111 }
112 else
113 {
114 ret->set=0;
115 M_ASN1_D2I_get(ret->value.single,d2i_ASN1_TYPE);
116 }
117 95
118 M_ASN1_D2I_Finish(a,X509_ATTRIBUTE_free,ASN1_F_D2I_X509_ATTRIBUTE); 96IMPLEMENT_ASN1_FUNCTIONS(X509_ATTRIBUTE)
119 } 97IMPLEMENT_ASN1_DUP_FUNCTION(X509_ATTRIBUTE)
120 98
121X509_ATTRIBUTE *X509_ATTRIBUTE_create(int nid, int atrtype, void *value) 99X509_ATTRIBUTE *X509_ATTRIBUTE_create(int nid, int atrtype, void *value)
122 { 100 {
@@ -126,7 +104,7 @@ X509_ATTRIBUTE *X509_ATTRIBUTE_create(int nid, int atrtype, void *value)
126 if ((ret=X509_ATTRIBUTE_new()) == NULL) 104 if ((ret=X509_ATTRIBUTE_new()) == NULL)
127 return(NULL); 105 return(NULL);
128 ret->object=OBJ_nid2obj(nid); 106 ret->object=OBJ_nid2obj(nid);
129 ret->set=1; 107 ret->single=0;
130 if ((ret->value.set=sk_ASN1_TYPE_new_null()) == NULL) goto err; 108 if ((ret->value.set=sk_ASN1_TYPE_new_null()) == NULL) goto err;
131 if ((val=ASN1_TYPE_new()) == NULL) goto err; 109 if ((val=ASN1_TYPE_new()) == NULL) goto err;
132 if (!sk_ASN1_TYPE_push(ret->value.set,val)) goto err; 110 if (!sk_ASN1_TYPE_push(ret->value.set,val)) goto err;
@@ -138,28 +116,3 @@ err:
138 if (val != NULL) ASN1_TYPE_free(val); 116 if (val != NULL) ASN1_TYPE_free(val);
139 return(NULL); 117 return(NULL);
140 } 118 }
141
142X509_ATTRIBUTE *X509_ATTRIBUTE_new(void)
143 {
144 X509_ATTRIBUTE *ret=NULL;
145 ASN1_CTX c;
146
147 M_ASN1_New_Malloc(ret,X509_ATTRIBUTE);
148 ret->object=OBJ_nid2obj(NID_undef);
149 ret->set=0;
150 ret->value.ptr=NULL;
151 return(ret);
152 M_ASN1_New_Error(ASN1_F_X509_ATTRIBUTE_NEW);
153 }
154
155void X509_ATTRIBUTE_free(X509_ATTRIBUTE *a)
156 {
157 if (a == NULL) return;
158 ASN1_OBJECT_free(a->object);
159 if (a->set)
160 sk_ASN1_TYPE_pop_free(a->value.set,ASN1_TYPE_free);
161 else
162 ASN1_TYPE_free(a->value.single);
163 OPENSSL_free(a);
164 }
165