diff options
Diffstat (limited to 'src/lib/libcrypto/asn1/x_crl.c')
-rw-r--r-- | src/lib/libcrypto/asn1/x_crl.c | 371 |
1 files changed, 90 insertions, 281 deletions
diff --git a/src/lib/libcrypto/asn1/x_crl.c b/src/lib/libcrypto/asn1/x_crl.c index 13acdab427..11fce96825 100644 --- a/src/lib/libcrypto/asn1/x_crl.c +++ b/src/lib/libcrypto/asn1/x_crl.c | |||
@@ -58,296 +58,105 @@ | |||
58 | 58 | ||
59 | #include <stdio.h> | 59 | #include <stdio.h> |
60 | #include "cryptlib.h" | 60 | #include "cryptlib.h" |
61 | #include "asn1_mac.h" | 61 | #include <openssl/asn1t.h> |
62 | #include "x509.h" | 62 | #include <openssl/x509.h> |
63 | 63 | ||
64 | /* | 64 | static int X509_REVOKED_cmp(const X509_REVOKED * const *a, |
65 | * ASN1err(ASN1_F_D2I_X509_CRL,ASN1_R_LENGTH_MISMATCH); | 65 | const X509_REVOKED * const *b); |
66 | * ASN1err(ASN1_F_D2I_X509_CRL_INFO,ASN1_R_EXPECTING_A_SEQUENCE); | 66 | static int X509_REVOKED_seq_cmp(const X509_REVOKED * const *a, |
67 | * ASN1err(ASN1_F_D2I_X509_REVOKED,ASN1_R_LENGTH_MISMATCH); | 67 | const X509_REVOKED * const *b); |
68 | * ASN1err(ASN1_F_X509_CRL_NEW,ASN1_R_LENGTH_MISMATCH); | 68 | |
69 | * ASN1err(ASN1_F_X509_CRL_INFO_NEW,ASN1_R_EXPECTING_A_SEQUENCE); | 69 | ASN1_SEQUENCE(X509_REVOKED) = { |
70 | * ASN1err(ASN1_F_X509_REVOKED_NEW,ASN1_R_LENGTH_MISMATCH); | 70 | ASN1_SIMPLE(X509_REVOKED,serialNumber, ASN1_INTEGER), |
71 | ASN1_SIMPLE(X509_REVOKED,revocationDate, ASN1_TIME), | ||
72 | ASN1_SEQUENCE_OF_OPT(X509_REVOKED,extensions, X509_EXTENSION) | ||
73 | } ASN1_SEQUENCE_END(X509_REVOKED) | ||
74 | |||
75 | /* The X509_CRL_INFO structure needs a bit of customisation. This is actually | ||
76 | * mirroring the old behaviour: its purpose is to allow the use of | ||
77 | * sk_X509_REVOKED_find to lookup revoked certificates. Unfortunately | ||
78 | * this will zap the original order and the signature so we keep a copy | ||
79 | * of the original positions and reorder appropriately before encoding. | ||
80 | * | ||
81 | * Might want to see if there's a better way of doing this later... | ||
71 | */ | 82 | */ |
72 | 83 | static int crl_inf_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it) | |
73 | #ifndef NOPROTO | 84 | { |
74 | static int X509_REVOKED_cmp(X509_REVOKED **a,X509_REVOKED **b); | 85 | X509_CRL_INFO *a = (X509_CRL_INFO *)*pval; |
75 | static int X509_REVOKED_seq_cmp(X509_REVOKED **a,X509_REVOKED **b); | ||
76 | #else | ||
77 | static int X509_REVOKED_cmp(); | ||
78 | static int X509_REVOKED_seq_cmp(); | ||
79 | #endif | ||
80 | |||
81 | int i2d_X509_REVOKED(a,pp) | ||
82 | X509_REVOKED *a; | ||
83 | unsigned char **pp; | ||
84 | { | ||
85 | M_ASN1_I2D_vars(a); | ||
86 | |||
87 | M_ASN1_I2D_len(a->serialNumber,i2d_ASN1_INTEGER); | ||
88 | M_ASN1_I2D_len(a->revocationDate,i2d_ASN1_UTCTIME); | ||
89 | M_ASN1_I2D_len_SEQ_opt(a->extensions,i2d_X509_EXTENSION); | ||
90 | |||
91 | M_ASN1_I2D_seq_total(); | ||
92 | |||
93 | M_ASN1_I2D_put(a->serialNumber,i2d_ASN1_INTEGER); | ||
94 | M_ASN1_I2D_put(a->revocationDate,i2d_ASN1_UTCTIME); | ||
95 | M_ASN1_I2D_put_SEQ_opt(a->extensions,i2d_X509_EXTENSION); | ||
96 | |||
97 | M_ASN1_I2D_finish(); | ||
98 | } | ||
99 | |||
100 | X509_REVOKED *d2i_X509_REVOKED(a,pp,length) | ||
101 | X509_REVOKED **a; | ||
102 | unsigned char **pp; | ||
103 | long length; | ||
104 | { | ||
105 | M_ASN1_D2I_vars(a,X509_REVOKED *,X509_REVOKED_new); | ||
106 | |||
107 | M_ASN1_D2I_Init(); | ||
108 | M_ASN1_D2I_start_sequence(); | ||
109 | M_ASN1_D2I_get(ret->serialNumber,d2i_ASN1_INTEGER); | ||
110 | M_ASN1_D2I_get(ret->revocationDate,d2i_ASN1_UTCTIME); | ||
111 | M_ASN1_D2I_get_seq_opt(ret->extensions,d2i_X509_EXTENSION); | ||
112 | M_ASN1_D2I_Finish(a,X509_REVOKED_free,ASN1_F_D2I_X509_REVOKED); | ||
113 | } | ||
114 | |||
115 | int i2d_X509_CRL_INFO(a,pp) | ||
116 | X509_CRL_INFO *a; | ||
117 | unsigned char **pp; | ||
118 | { | ||
119 | int v1=0; | ||
120 | long l=0; | ||
121 | M_ASN1_I2D_vars(a); | ||
122 | |||
123 | if (sk_num(a->revoked) != 0) | ||
124 | qsort((char *)a->revoked->data,sk_num(a->revoked), | ||
125 | sizeof(X509_REVOKED *),(int (*)(P_CC_CC))X509_REVOKED_seq_cmp); | ||
126 | if ((a->version != NULL) && ((l=ASN1_INTEGER_get(a->version)) != 0)) | ||
127 | { | ||
128 | M_ASN1_I2D_len(a->version,i2d_ASN1_INTEGER); | ||
129 | } | ||
130 | M_ASN1_I2D_len(a->sig_alg,i2d_X509_ALGOR); | ||
131 | M_ASN1_I2D_len(a->issuer,i2d_X509_NAME); | ||
132 | M_ASN1_I2D_len(a->lastUpdate,i2d_ASN1_UTCTIME); | ||
133 | if (a->nextUpdate != NULL) | ||
134 | { M_ASN1_I2D_len(a->nextUpdate,i2d_ASN1_UTCTIME); } | ||
135 | M_ASN1_I2D_len_SEQ_opt(a->revoked,i2d_X509_REVOKED); | ||
136 | M_ASN1_I2D_len_EXP_set_opt(a->extensions,i2d_X509_EXTENSION,0, | ||
137 | V_ASN1_SEQUENCE,v1); | ||
138 | |||
139 | M_ASN1_I2D_seq_total(); | ||
140 | |||
141 | if ((a->version != NULL) && (l != 0)) | ||
142 | { | ||
143 | M_ASN1_I2D_put(a->version,i2d_ASN1_INTEGER); | ||
144 | } | ||
145 | M_ASN1_I2D_put(a->sig_alg,i2d_X509_ALGOR); | ||
146 | M_ASN1_I2D_put(a->issuer,i2d_X509_NAME); | ||
147 | M_ASN1_I2D_put(a->lastUpdate,i2d_ASN1_UTCTIME); | ||
148 | if (a->nextUpdate != NULL) | ||
149 | { M_ASN1_I2D_put(a->nextUpdate,i2d_ASN1_UTCTIME); } | ||
150 | M_ASN1_I2D_put_SEQ_opt(a->revoked,i2d_X509_REVOKED); | ||
151 | M_ASN1_I2D_put_EXP_set_opt(a->extensions,i2d_X509_EXTENSION,0, | ||
152 | V_ASN1_SEQUENCE,v1); | ||
153 | |||
154 | M_ASN1_I2D_finish(); | ||
155 | } | ||
156 | |||
157 | X509_CRL_INFO *d2i_X509_CRL_INFO(a,pp,length) | ||
158 | X509_CRL_INFO **a; | ||
159 | unsigned char **pp; | ||
160 | long length; | ||
161 | { | ||
162 | int i,ver=0; | ||
163 | M_ASN1_D2I_vars(a,X509_CRL_INFO *,X509_CRL_INFO_new); | ||
164 | |||
165 | |||
166 | M_ASN1_D2I_Init(); | ||
167 | M_ASN1_D2I_start_sequence(); | ||
168 | M_ASN1_D2I_get_opt(ret->version,d2i_ASN1_INTEGER,V_ASN1_INTEGER); | ||
169 | if (ret->version != NULL) | ||
170 | ver=ret->version->data[0]; | ||
171 | |||
172 | if ((ver == 0) && (ret->version != NULL)) | ||
173 | { | ||
174 | ASN1_INTEGER_free(ret->version); | ||
175 | ret->version=NULL; | ||
176 | } | ||
177 | M_ASN1_D2I_get(ret->sig_alg,d2i_X509_ALGOR); | ||
178 | M_ASN1_D2I_get(ret->issuer,d2i_X509_NAME); | ||
179 | M_ASN1_D2I_get(ret->lastUpdate,d2i_ASN1_UTCTIME); | ||
180 | M_ASN1_D2I_get_opt(ret->nextUpdate,d2i_ASN1_UTCTIME,V_ASN1_UTCTIME); | ||
181 | if (ret->revoked != NULL) | ||
182 | { | ||
183 | while (sk_num(ret->revoked)) | ||
184 | X509_REVOKED_free((X509_REVOKED *)sk_pop(ret->revoked)); | ||
185 | } | ||
186 | M_ASN1_D2I_get_seq_opt(ret->revoked,d2i_X509_REVOKED); | ||
187 | |||
188 | if (ret->revoked != NULL) | ||
189 | { | ||
190 | for (i=0; i<sk_num(ret->revoked); i++) | ||
191 | { | ||
192 | ((X509_REVOKED *)sk_value(ret->revoked,i))->sequence=i; | ||
193 | } | ||
194 | } | ||
195 | |||
196 | if (ver >= 1) | ||
197 | { | ||
198 | if (ret->extensions != NULL) | ||
199 | { | ||
200 | while (sk_num(ret->extensions)) | ||
201 | X509_EXTENSION_free((X509_EXTENSION *) | ||
202 | sk_pop(ret->extensions)); | ||
203 | } | ||
204 | |||
205 | M_ASN1_D2I_get_EXP_set_opt(ret->extensions,d2i_X509_EXTENSION, | ||
206 | 0,V_ASN1_SEQUENCE); | ||
207 | } | ||
208 | |||
209 | M_ASN1_D2I_Finish(a,X509_CRL_INFO_free,ASN1_F_D2I_X509_CRL_INFO); | ||
210 | } | ||
211 | |||
212 | int i2d_X509_CRL(a,pp) | ||
213 | X509_CRL *a; | ||
214 | unsigned char **pp; | ||
215 | { | ||
216 | M_ASN1_I2D_vars(a); | ||
217 | |||
218 | M_ASN1_I2D_len(a->crl,i2d_X509_CRL_INFO); | ||
219 | M_ASN1_I2D_len(a->sig_alg,i2d_X509_ALGOR); | ||
220 | M_ASN1_I2D_len(a->signature,i2d_ASN1_BIT_STRING); | ||
221 | |||
222 | M_ASN1_I2D_seq_total(); | ||
223 | |||
224 | M_ASN1_I2D_put(a->crl,i2d_X509_CRL_INFO); | ||
225 | M_ASN1_I2D_put(a->sig_alg,i2d_X509_ALGOR); | ||
226 | M_ASN1_I2D_put(a->signature,i2d_ASN1_BIT_STRING); | ||
227 | |||
228 | M_ASN1_I2D_finish(); | ||
229 | } | ||
230 | |||
231 | X509_CRL *d2i_X509_CRL(a,pp,length) | ||
232 | X509_CRL **a; | ||
233 | unsigned char **pp; | ||
234 | long length; | ||
235 | { | ||
236 | M_ASN1_D2I_vars(a,X509_CRL *,X509_CRL_new); | ||
237 | |||
238 | M_ASN1_D2I_Init(); | ||
239 | M_ASN1_D2I_start_sequence(); | ||
240 | M_ASN1_D2I_get(ret->crl,d2i_X509_CRL_INFO); | ||
241 | M_ASN1_D2I_get(ret->sig_alg,d2i_X509_ALGOR); | ||
242 | M_ASN1_D2I_get(ret->signature,d2i_ASN1_BIT_STRING); | ||
243 | |||
244 | M_ASN1_D2I_Finish(a,X509_CRL_free,ASN1_F_D2I_X509_CRL); | ||
245 | } | ||
246 | |||
247 | |||
248 | X509_REVOKED *X509_REVOKED_new() | ||
249 | { | ||
250 | X509_REVOKED *ret=NULL; | ||
251 | |||
252 | M_ASN1_New_Malloc(ret,X509_REVOKED); | ||
253 | M_ASN1_New(ret->serialNumber,ASN1_INTEGER_new); | ||
254 | M_ASN1_New(ret->revocationDate,ASN1_UTCTIME_new); | ||
255 | ret->extensions=NULL; | ||
256 | return(ret); | ||
257 | M_ASN1_New_Error(ASN1_F_X509_REVOKED_NEW); | ||
258 | } | ||
259 | |||
260 | X509_CRL_INFO *X509_CRL_INFO_new() | ||
261 | { | ||
262 | X509_CRL_INFO *ret=NULL; | ||
263 | |||
264 | M_ASN1_New_Malloc(ret,X509_CRL_INFO); | ||
265 | ret->version=NULL; | ||
266 | M_ASN1_New(ret->sig_alg,X509_ALGOR_new); | ||
267 | M_ASN1_New(ret->issuer,X509_NAME_new); | ||
268 | M_ASN1_New(ret->lastUpdate,ASN1_UTCTIME_new); | ||
269 | ret->nextUpdate=NULL; | ||
270 | M_ASN1_New(ret->revoked,sk_new_null); | ||
271 | M_ASN1_New(ret->extensions,sk_new_null); | ||
272 | ret->revoked->comp=(int (*)())X509_REVOKED_cmp; | ||
273 | return(ret); | ||
274 | M_ASN1_New_Error(ASN1_F_X509_CRL_INFO_NEW); | ||
275 | } | ||
276 | |||
277 | X509_CRL *X509_CRL_new() | ||
278 | { | ||
279 | X509_CRL *ret=NULL; | ||
280 | |||
281 | M_ASN1_New_Malloc(ret,X509_CRL); | ||
282 | ret->references=1; | ||
283 | M_ASN1_New(ret->crl,X509_CRL_INFO_new); | ||
284 | M_ASN1_New(ret->sig_alg,X509_ALGOR_new); | ||
285 | M_ASN1_New(ret->signature,ASN1_BIT_STRING_new); | ||
286 | return(ret); | ||
287 | M_ASN1_New_Error(ASN1_F_X509_CRL_NEW); | ||
288 | } | ||
289 | |||
290 | void X509_REVOKED_free(a) | ||
291 | X509_REVOKED *a; | ||
292 | { | ||
293 | if (a == NULL) return; | ||
294 | ASN1_INTEGER_free(a->serialNumber); | ||
295 | ASN1_UTCTIME_free(a->revocationDate); | ||
296 | sk_pop_free(a->extensions,X509_EXTENSION_free); | ||
297 | Free((char *)a); | ||
298 | } | ||
299 | |||
300 | void X509_CRL_INFO_free(a) | ||
301 | X509_CRL_INFO *a; | ||
302 | { | ||
303 | if (a == NULL) return; | ||
304 | ASN1_INTEGER_free(a->version); | ||
305 | X509_ALGOR_free(a->sig_alg); | ||
306 | X509_NAME_free(a->issuer); | ||
307 | ASN1_UTCTIME_free(a->lastUpdate); | ||
308 | if (a->nextUpdate) | ||
309 | ASN1_UTCTIME_free(a->nextUpdate); | ||
310 | sk_pop_free(a->revoked,X509_REVOKED_free); | ||
311 | sk_pop_free(a->extensions,X509_EXTENSION_free); | ||
312 | Free((char *)a); | ||
313 | } | ||
314 | |||
315 | void X509_CRL_free(a) | ||
316 | X509_CRL *a; | ||
317 | { | ||
318 | int i; | 86 | int i; |
319 | 87 | int (*old_cmp)(const X509_REVOKED * const *, | |
320 | if (a == NULL) return; | 88 | const X509_REVOKED * const *); |
321 | 89 | ||
322 | i=CRYPTO_add(&a->references,-1,CRYPTO_LOCK_X509_CRL); | 90 | if(!a || !a->revoked) return 1; |
323 | #ifdef REF_PRINT | 91 | switch(operation) { |
324 | REF_PRINT("X509_CRL",a); | 92 | |
325 | #endif | 93 | /* Save original order */ |
326 | if (i > 0) return; | 94 | case ASN1_OP_D2I_POST: |
327 | #ifdef REF_CHECK | 95 | for (i=0; i<sk_X509_REVOKED_num(a->revoked); i++) |
328 | if (i < 0) | 96 | sk_X509_REVOKED_value(a->revoked,i)->sequence=i; |
329 | { | 97 | sk_X509_REVOKED_set_cmp_func(a->revoked,X509_REVOKED_cmp); |
330 | fprintf(stderr,"X509_CRL_free, bad reference count\n"); | 98 | break; |
331 | abort(); | 99 | |
332 | } | 100 | /* Restore original order */ |
333 | #endif | 101 | case ASN1_OP_I2D_PRE: |
334 | 102 | old_cmp=sk_X509_REVOKED_set_cmp_func(a->revoked,X509_REVOKED_seq_cmp); | |
335 | X509_CRL_INFO_free(a->crl); | 103 | sk_X509_REVOKED_sort(a->revoked); |
336 | X509_ALGOR_free(a->sig_alg); | 104 | sk_X509_REVOKED_set_cmp_func(a->revoked,old_cmp); |
337 | ASN1_BIT_STRING_free(a->signature); | 105 | break; |
338 | Free((char *)a); | ||
339 | } | 106 | } |
340 | 107 | return 1; | |
341 | static int X509_REVOKED_cmp(a,b) | 108 | } |
342 | X509_REVOKED **a,**b; | 109 | |
110 | |||
111 | ASN1_SEQUENCE_cb(X509_CRL_INFO, crl_inf_cb) = { | ||
112 | ASN1_OPT(X509_CRL_INFO, version, ASN1_INTEGER), | ||
113 | ASN1_SIMPLE(X509_CRL_INFO, sig_alg, X509_ALGOR), | ||
114 | ASN1_SIMPLE(X509_CRL_INFO, issuer, X509_NAME), | ||
115 | ASN1_SIMPLE(X509_CRL_INFO, lastUpdate, ASN1_TIME), | ||
116 | ASN1_OPT(X509_CRL_INFO, nextUpdate, ASN1_TIME), | ||
117 | ASN1_SEQUENCE_OF_OPT(X509_CRL_INFO, revoked, X509_REVOKED), | ||
118 | ASN1_EXP_SEQUENCE_OF_OPT(X509_CRL_INFO, extensions, X509_EXTENSION, 0) | ||
119 | } ASN1_SEQUENCE_END_cb(X509_CRL_INFO, X509_CRL_INFO) | ||
120 | |||
121 | ASN1_SEQUENCE_ref(X509_CRL, 0, CRYPTO_LOCK_X509_CRL) = { | ||
122 | ASN1_SIMPLE(X509_CRL, crl, X509_CRL_INFO), | ||
123 | ASN1_SIMPLE(X509_CRL, sig_alg, X509_ALGOR), | ||
124 | ASN1_SIMPLE(X509_CRL, signature, ASN1_BIT_STRING) | ||
125 | } ASN1_SEQUENCE_END_ref(X509_CRL, X509_CRL) | ||
126 | |||
127 | IMPLEMENT_ASN1_FUNCTIONS(X509_REVOKED) | ||
128 | IMPLEMENT_ASN1_FUNCTIONS(X509_CRL_INFO) | ||
129 | IMPLEMENT_ASN1_FUNCTIONS(X509_CRL) | ||
130 | IMPLEMENT_ASN1_DUP_FUNCTION(X509_CRL) | ||
131 | |||
132 | static int X509_REVOKED_cmp(const X509_REVOKED * const *a, | ||
133 | const X509_REVOKED * const *b) | ||
343 | { | 134 | { |
344 | return(ASN1_STRING_cmp( | 135 | return(ASN1_STRING_cmp( |
345 | (ASN1_STRING *)(*a)->serialNumber, | 136 | (ASN1_STRING *)(*a)->serialNumber, |
346 | (ASN1_STRING *)(*b)->serialNumber)); | 137 | (ASN1_STRING *)(*b)->serialNumber)); |
347 | } | 138 | } |
348 | 139 | ||
349 | static int X509_REVOKED_seq_cmp(a,b) | 140 | static int X509_REVOKED_seq_cmp(const X509_REVOKED * const *a, |
350 | X509_REVOKED **a,**b; | 141 | const X509_REVOKED * const *b) |
351 | { | 142 | { |
352 | return((*a)->sequence-(*b)->sequence); | 143 | return((*a)->sequence-(*b)->sequence); |
353 | } | 144 | } |
145 | |||
146 | int X509_CRL_add0_revoked(X509_CRL *crl, X509_REVOKED *rev) | ||
147 | { | ||
148 | X509_CRL_INFO *inf; | ||
149 | inf = crl->crl; | ||
150 | if(!inf->revoked) | ||
151 | inf->revoked = sk_X509_REVOKED_new(X509_REVOKED_cmp); | ||
152 | if(!inf->revoked || !sk_X509_REVOKED_push(inf->revoked, rev)) { | ||
153 | ASN1err(ASN1_F_X509_CRL_ADD0_REVOKED, ERR_R_MALLOC_FAILURE); | ||
154 | return 0; | ||
155 | } | ||
156 | return 1; | ||
157 | } | ||
158 | |||
159 | IMPLEMENT_STACK_OF(X509_REVOKED) | ||
160 | IMPLEMENT_ASN1_SET_OF(X509_REVOKED) | ||
161 | IMPLEMENT_STACK_OF(X509_CRL) | ||
162 | IMPLEMENT_ASN1_SET_OF(X509_CRL) | ||