Line data Source code
1 : #include "config.h"
2 : /* Generated from /builds/samba-team/devel/samba/source4/heimdal/lib/asn1/krb5.asn1 */
3 : /* Do not edit */
4 :
5 : #define ASN1_LIB
6 :
7 : #include <stdio.h>
8 : #include <stdlib.h>
9 : #include <time.h>
10 : #include <string.h>
11 : #include <errno.h>
12 : #include <limits.h>
13 : #include <krb5-types.h>
14 : #include <krb5_asn1.h>
15 : #include <krb5_asn1-priv.h>
16 : #include <asn1_err.h>
17 : #include <der.h>
18 : #include <der-private.h>
19 : #include <asn1-template.h>
20 : #include <parse_units.h>
21 :
22 : int ASN1CALL
23 905256 : encode_NAME_TYPE(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const NAME_TYPE *data, size_t *size)
24 : {
25 905256 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
26 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
27 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
28 :
29 : {
30 905256 : int enumint = (int)*data;
31 905256 : e = der_put_integer(p, len, &enumint, &l);
32 905256 : if (e) return e;
33 905256 : p -= l; len -= l; ret += l;
34 :
35 : }
36 905256 : ;e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_Integer, &l);
37 905256 : if (e) return e;
38 905256 : p -= l; len -= l; ret += l;
39 :
40 905256 : *size = ret;
41 905256 : return 0;
42 : }
43 :
44 : int ASN1CALL
45 773741 : decode_NAME_TYPE(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, NAME_TYPE *data, size_t *size)
46 : {
47 773741 : size_t ret = 0;
48 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
49 : int e HEIMDAL_UNUSED_ATTRIBUTE;
50 :
51 773741 : memset(data, 0, sizeof(*data));
52 : {
53 : size_t Top_datalen, Top_oldlen;
54 : Der_type Top_type;
55 773741 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Integer, &Top_datalen, &l);
56 773741 : if (e == 0 && Top_type != PRIM) { e = ASN1_BAD_ID; }
57 773741 : if(e) goto fail;
58 773741 : p += l; len -= l; ret += l;
59 773741 : Top_oldlen = len;
60 773741 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
61 773741 : len = Top_datalen;
62 : {
63 : int enumint;
64 773741 : e = der_get_integer(p, len, &enumint, &l);
65 773741 : if(e) goto fail;
66 773741 : p += l; len -= l; ret += l;
67 773741 : *data = enumint;
68 : }
69 773741 : len = Top_oldlen - Top_datalen;
70 : }
71 1547482 : if(size) *size = ret;
72 754676 : return 0;
73 0 : fail:
74 0 : free_NAME_TYPE(data);
75 0 : return e;
76 : }
77 :
78 : void ASN1CALL
79 5306644 : free_NAME_TYPE(NAME_TYPE *data)
80 : {
81 5306644 : }
82 :
83 : size_t ASN1CALL
84 905256 : length_NAME_TYPE(const NAME_TYPE *data)
85 : {
86 905256 : size_t ret = 0;
87 : {
88 905256 : int enumint = *data;
89 905256 : ret += der_length_integer(&enumint);
90 : }
91 905256 : ret += 1 + der_length_len (ret);
92 905256 : return ret;
93 : }
94 :
95 : int ASN1CALL
96 3344991 : copy_NAME_TYPE(const NAME_TYPE *from, NAME_TYPE *to)
97 : {
98 3344991 : memset(to, 0, sizeof(*to));
99 3344991 : *(to) = *(from);
100 3344991 : return 0;
101 : }
102 :
103 : int ASN1CALL
104 293398 : encode_MESSAGE_TYPE(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const MESSAGE_TYPE *data, size_t *size)
105 : {
106 293398 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
107 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
108 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
109 :
110 : {
111 293398 : int enumint = (int)*data;
112 293398 : e = der_put_integer(p, len, &enumint, &l);
113 293398 : if (e) return e;
114 293398 : p -= l; len -= l; ret += l;
115 :
116 : }
117 293398 : ;e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_Integer, &l);
118 293398 : if (e) return e;
119 293398 : p -= l; len -= l; ret += l;
120 :
121 293398 : *size = ret;
122 293398 : return 0;
123 : }
124 :
125 : int ASN1CALL
126 326666 : decode_MESSAGE_TYPE(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, MESSAGE_TYPE *data, size_t *size)
127 : {
128 326666 : size_t ret = 0;
129 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
130 : int e HEIMDAL_UNUSED_ATTRIBUTE;
131 :
132 326666 : memset(data, 0, sizeof(*data));
133 : {
134 : size_t Top_datalen, Top_oldlen;
135 : Der_type Top_type;
136 326666 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Integer, &Top_datalen, &l);
137 326666 : if (e == 0 && Top_type != PRIM) { e = ASN1_BAD_ID; }
138 326666 : if(e) goto fail;
139 326666 : p += l; len -= l; ret += l;
140 326666 : Top_oldlen = len;
141 326666 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
142 326666 : len = Top_datalen;
143 : {
144 : int enumint;
145 326666 : e = der_get_integer(p, len, &enumint, &l);
146 326666 : if(e) goto fail;
147 326666 : p += l; len -= l; ret += l;
148 326666 : *data = enumint;
149 : }
150 326666 : len = Top_oldlen - Top_datalen;
151 : }
152 653332 : if(size) *size = ret;
153 319024 : return 0;
154 0 : fail:
155 0 : free_MESSAGE_TYPE(data);
156 0 : return e;
157 : }
158 :
159 : void ASN1CALL
160 781327 : free_MESSAGE_TYPE(MESSAGE_TYPE *data)
161 : {
162 781327 : }
163 :
164 : size_t ASN1CALL
165 293398 : length_MESSAGE_TYPE(const MESSAGE_TYPE *data)
166 : {
167 293398 : size_t ret = 0;
168 : {
169 293398 : int enumint = *data;
170 293398 : ret += der_length_integer(&enumint);
171 : }
172 293398 : ret += 1 + der_length_len (ret);
173 293398 : return ret;
174 : }
175 :
176 : int ASN1CALL
177 0 : copy_MESSAGE_TYPE(const MESSAGE_TYPE *from, MESSAGE_TYPE *to)
178 : {
179 0 : memset(to, 0, sizeof(*to));
180 0 : *(to) = *(from);
181 0 : return 0;
182 : }
183 :
184 : int ASN1CALL
185 144479 : encode_PADATA_TYPE(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const PADATA_TYPE *data, size_t *size)
186 : {
187 144479 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
188 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
189 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
190 :
191 : {
192 144479 : int enumint = (int)*data;
193 144479 : e = der_put_integer(p, len, &enumint, &l);
194 144479 : if (e) return e;
195 144479 : p -= l; len -= l; ret += l;
196 :
197 : }
198 144479 : ;e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_Integer, &l);
199 144479 : if (e) return e;
200 144479 : p -= l; len -= l; ret += l;
201 :
202 144479 : *size = ret;
203 144479 : return 0;
204 : }
205 :
206 : int ASN1CALL
207 155916 : decode_PADATA_TYPE(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, PADATA_TYPE *data, size_t *size)
208 : {
209 155916 : size_t ret = 0;
210 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
211 : int e HEIMDAL_UNUSED_ATTRIBUTE;
212 :
213 155916 : memset(data, 0, sizeof(*data));
214 : {
215 : size_t Top_datalen, Top_oldlen;
216 : Der_type Top_type;
217 155916 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Integer, &Top_datalen, &l);
218 155916 : if (e == 0 && Top_type != PRIM) { e = ASN1_BAD_ID; }
219 155916 : if(e) goto fail;
220 155916 : p += l; len -= l; ret += l;
221 155916 : Top_oldlen = len;
222 155916 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
223 155916 : len = Top_datalen;
224 : {
225 : int enumint;
226 155916 : e = der_get_integer(p, len, &enumint, &l);
227 155916 : if(e) goto fail;
228 155916 : p += l; len -= l; ret += l;
229 155916 : *data = enumint;
230 : }
231 155916 : len = Top_oldlen - Top_datalen;
232 : }
233 311832 : if(size) *size = ret;
234 152762 : return 0;
235 0 : fail:
236 0 : free_PADATA_TYPE(data);
237 0 : return e;
238 : }
239 :
240 : void ASN1CALL
241 292474 : free_PADATA_TYPE(PADATA_TYPE *data)
242 : {
243 292474 : }
244 :
245 : size_t ASN1CALL
246 144479 : length_PADATA_TYPE(const PADATA_TYPE *data)
247 : {
248 144479 : size_t ret = 0;
249 : {
250 144479 : int enumint = *data;
251 144479 : ret += der_length_integer(&enumint);
252 : }
253 144479 : ret += 1 + der_length_len (ret);
254 144479 : return ret;
255 : }
256 :
257 : int ASN1CALL
258 1356 : copy_PADATA_TYPE(const PADATA_TYPE *from, PADATA_TYPE *to)
259 : {
260 1356 : memset(to, 0, sizeof(*to));
261 1356 : *(to) = *(from);
262 1356 : return 0;
263 : }
264 :
265 : int ASN1CALL
266 0 : encode_AUTHDATA_TYPE(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const AUTHDATA_TYPE *data, size_t *size)
267 : {
268 0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
269 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
270 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
271 :
272 : {
273 0 : int enumint = (int)*data;
274 0 : e = der_put_integer(p, len, &enumint, &l);
275 0 : if (e) return e;
276 0 : p -= l; len -= l; ret += l;
277 :
278 : }
279 0 : ;e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_Integer, &l);
280 0 : if (e) return e;
281 0 : p -= l; len -= l; ret += l;
282 :
283 0 : *size = ret;
284 0 : return 0;
285 : }
286 :
287 : int ASN1CALL
288 0 : decode_AUTHDATA_TYPE(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, AUTHDATA_TYPE *data, size_t *size)
289 : {
290 0 : size_t ret = 0;
291 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
292 : int e HEIMDAL_UNUSED_ATTRIBUTE;
293 :
294 0 : memset(data, 0, sizeof(*data));
295 : {
296 : size_t Top_datalen, Top_oldlen;
297 : Der_type Top_type;
298 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Integer, &Top_datalen, &l);
299 0 : if (e == 0 && Top_type != PRIM) { e = ASN1_BAD_ID; }
300 0 : if(e) goto fail;
301 0 : p += l; len -= l; ret += l;
302 0 : Top_oldlen = len;
303 0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
304 0 : len = Top_datalen;
305 : {
306 : int enumint;
307 0 : e = der_get_integer(p, len, &enumint, &l);
308 0 : if(e) goto fail;
309 0 : p += l; len -= l; ret += l;
310 0 : *data = enumint;
311 : }
312 0 : len = Top_oldlen - Top_datalen;
313 : }
314 0 : if(size) *size = ret;
315 0 : return 0;
316 0 : fail:
317 0 : free_AUTHDATA_TYPE(data);
318 0 : return e;
319 : }
320 :
321 : void ASN1CALL
322 0 : free_AUTHDATA_TYPE(AUTHDATA_TYPE *data)
323 : {
324 0 : }
325 :
326 : size_t ASN1CALL
327 0 : length_AUTHDATA_TYPE(const AUTHDATA_TYPE *data)
328 : {
329 0 : size_t ret = 0;
330 : {
331 0 : int enumint = *data;
332 0 : ret += der_length_integer(&enumint);
333 : }
334 0 : ret += 1 + der_length_len (ret);
335 0 : return ret;
336 : }
337 :
338 : int ASN1CALL
339 0 : copy_AUTHDATA_TYPE(const AUTHDATA_TYPE *from, AUTHDATA_TYPE *to)
340 : {
341 0 : memset(to, 0, sizeof(*to));
342 0 : *(to) = *(from);
343 0 : return 0;
344 : }
345 :
346 : int ASN1CALL
347 133666 : encode_CKSUMTYPE(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const CKSUMTYPE *data, size_t *size)
348 : {
349 133666 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
350 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
351 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
352 :
353 : {
354 133666 : int enumint = (int)*data;
355 133666 : e = der_put_integer(p, len, &enumint, &l);
356 133666 : if (e) return e;
357 133666 : p -= l; len -= l; ret += l;
358 :
359 : }
360 133666 : ;e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_Integer, &l);
361 133666 : if (e) return e;
362 133666 : p -= l; len -= l; ret += l;
363 :
364 133666 : *size = ret;
365 133666 : return 0;
366 : }
367 :
368 : int ASN1CALL
369 102319 : decode_CKSUMTYPE(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, CKSUMTYPE *data, size_t *size)
370 : {
371 102319 : size_t ret = 0;
372 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
373 : int e HEIMDAL_UNUSED_ATTRIBUTE;
374 :
375 102319 : memset(data, 0, sizeof(*data));
376 : {
377 : size_t Top_datalen, Top_oldlen;
378 : Der_type Top_type;
379 102319 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Integer, &Top_datalen, &l);
380 102319 : if (e == 0 && Top_type != PRIM) { e = ASN1_BAD_ID; }
381 102319 : if(e) goto fail;
382 102319 : p += l; len -= l; ret += l;
383 102319 : Top_oldlen = len;
384 102319 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
385 102319 : len = Top_datalen;
386 : {
387 : int enumint;
388 102319 : e = der_get_integer(p, len, &enumint, &l);
389 102319 : if(e) goto fail;
390 102319 : p += l; len -= l; ret += l;
391 102319 : *data = enumint;
392 : }
393 102319 : len = Top_oldlen - Top_datalen;
394 : }
395 204638 : if(size) *size = ret;
396 99403 : return 0;
397 0 : fail:
398 0 : free_CKSUMTYPE(data);
399 0 : return e;
400 : }
401 :
402 : void ASN1CALL
403 1632769 : free_CKSUMTYPE(CKSUMTYPE *data)
404 : {
405 1632769 : }
406 :
407 : size_t ASN1CALL
408 133666 : length_CKSUMTYPE(const CKSUMTYPE *data)
409 : {
410 133666 : size_t ret = 0;
411 : {
412 133666 : int enumint = *data;
413 133666 : ret += der_length_integer(&enumint);
414 : }
415 133666 : ret += 1 + der_length_len (ret);
416 133666 : return ret;
417 : }
418 :
419 : int ASN1CALL
420 169376 : copy_CKSUMTYPE(const CKSUMTYPE *from, CKSUMTYPE *to)
421 : {
422 169376 : memset(to, 0, sizeof(*to));
423 169376 : *(to) = *(from);
424 169376 : return 0;
425 : }
426 :
427 : int ASN1CALL
428 1388298 : encode_ENCTYPE(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const ENCTYPE *data, size_t *size)
429 : {
430 1388298 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
431 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
432 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
433 :
434 : {
435 1388298 : int enumint = (int)*data;
436 1388298 : e = der_put_integer(p, len, &enumint, &l);
437 1388298 : if (e) return e;
438 1388298 : p -= l; len -= l; ret += l;
439 :
440 : }
441 1388298 : ;e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_Integer, &l);
442 1388298 : if (e) return e;
443 1388298 : p -= l; len -= l; ret += l;
444 :
445 1388298 : *size = ret;
446 1388298 : return 0;
447 : }
448 :
449 : int ASN1CALL
450 1066664 : decode_ENCTYPE(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, ENCTYPE *data, size_t *size)
451 : {
452 1066664 : size_t ret = 0;
453 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
454 : int e HEIMDAL_UNUSED_ATTRIBUTE;
455 :
456 1066664 : memset(data, 0, sizeof(*data));
457 : {
458 : size_t Top_datalen, Top_oldlen;
459 : Der_type Top_type;
460 1066664 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Integer, &Top_datalen, &l);
461 1066664 : if (e == 0 && Top_type != PRIM) { e = ASN1_BAD_ID; }
462 1066664 : if(e) goto fail;
463 1066664 : p += l; len -= l; ret += l;
464 1066664 : Top_oldlen = len;
465 1066664 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
466 1066664 : len = Top_datalen;
467 : {
468 : int enumint;
469 1066664 : e = der_get_integer(p, len, &enumint, &l);
470 1066664 : if(e) goto fail;
471 1066664 : p += l; len -= l; ret += l;
472 1066664 : *data = enumint;
473 : }
474 1066664 : len = Top_oldlen - Top_datalen;
475 : }
476 2133328 : if(size) *size = ret;
477 1039809 : return 0;
478 0 : fail:
479 0 : free_ENCTYPE(data);
480 0 : return e;
481 : }
482 :
483 : void ASN1CALL
484 1903729 : free_ENCTYPE(ENCTYPE *data)
485 : {
486 1903729 : }
487 :
488 : size_t ASN1CALL
489 1388298 : length_ENCTYPE(const ENCTYPE *data)
490 : {
491 1388298 : size_t ret = 0;
492 : {
493 1388298 : int enumint = *data;
494 1388298 : ret += der_length_integer(&enumint);
495 : }
496 1388298 : ret += 1 + der_length_len (ret);
497 1388298 : return ret;
498 : }
499 :
500 : int ASN1CALL
501 68152 : copy_ENCTYPE(const ENCTYPE *from, ENCTYPE *to)
502 : {
503 68152 : memset(to, 0, sizeof(*to));
504 68152 : *(to) = *(from);
505 68152 : return 0;
506 : }
507 :
508 : int ASN1CALL
509 45375 : encode_krb5uint32(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const krb5uint32 *data, size_t *size)
510 : {
511 45375 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
512 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
513 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
514 :
515 45375 : e = der_put_unsigned(p, len, data, &l);
516 45375 : if (e) return e;
517 45375 : p -= l; len -= l; ret += l;
518 :
519 45375 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_Integer, &l);
520 45375 : if (e) return e;
521 45375 : p -= l; len -= l; ret += l;
522 :
523 45375 : *size = ret;
524 45375 : return 0;
525 : }
526 :
527 : int ASN1CALL
528 43318 : decode_krb5uint32(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, krb5uint32 *data, size_t *size)
529 : {
530 43318 : size_t ret = 0;
531 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
532 : int e HEIMDAL_UNUSED_ATTRIBUTE;
533 :
534 43318 : memset(data, 0, sizeof(*data));
535 : {
536 : size_t Top_datalen, Top_oldlen;
537 : Der_type Top_type;
538 43318 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Integer, &Top_datalen, &l);
539 43318 : if (e == 0 && Top_type != PRIM) { e = ASN1_BAD_ID; }
540 43318 : if(e) goto fail;
541 43318 : p += l; len -= l; ret += l;
542 43318 : Top_oldlen = len;
543 43318 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
544 43318 : len = Top_datalen;
545 43318 : e = der_get_unsigned(p, len, data, &l);
546 43318 : if(e) goto fail;
547 43318 : p += l; len -= l; ret += l;
548 43318 : len = Top_oldlen - Top_datalen;
549 : }
550 86636 : if(size) *size = ret;
551 41746 : return 0;
552 0 : fail:
553 0 : free_krb5uint32(data);
554 0 : return e;
555 : }
556 :
557 : void ASN1CALL
558 108742 : free_krb5uint32(krb5uint32 *data)
559 : {
560 108742 : }
561 :
562 : size_t ASN1CALL
563 45375 : length_krb5uint32(const krb5uint32 *data)
564 : {
565 45375 : size_t ret = 0;
566 45375 : ret += der_length_unsigned(data);
567 45375 : ret += 1 + der_length_len (ret);
568 45375 : return ret;
569 : }
570 :
571 : int ASN1CALL
572 20134 : copy_krb5uint32(const krb5uint32 *from, krb5uint32 *to)
573 : {
574 20134 : memset(to, 0, sizeof(*to));
575 20134 : *(to) = *(from);
576 20134 : return 0;
577 : }
578 :
579 : int ASN1CALL
580 1859251 : encode_krb5int32(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const krb5int32 *data, size_t *size)
581 : {
582 1859251 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
583 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
584 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
585 :
586 1859251 : e = der_put_integer(p, len, data, &l);
587 1859251 : if (e) return e;
588 1859251 : p -= l; len -= l; ret += l;
589 :
590 1859251 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_Integer, &l);
591 1859251 : if (e) return e;
592 1859251 : p -= l; len -= l; ret += l;
593 :
594 1859251 : *size = ret;
595 1859251 : return 0;
596 : }
597 :
598 : int ASN1CALL
599 1875666 : decode_krb5int32(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, krb5int32 *data, size_t *size)
600 : {
601 1875666 : size_t ret = 0;
602 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
603 : int e HEIMDAL_UNUSED_ATTRIBUTE;
604 :
605 1875666 : memset(data, 0, sizeof(*data));
606 : {
607 : size_t Top_datalen, Top_oldlen;
608 : Der_type Top_type;
609 1875666 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Integer, &Top_datalen, &l);
610 1875666 : if (e == 0 && Top_type != PRIM) { e = ASN1_BAD_ID; }
611 1875666 : if(e) goto fail;
612 1875666 : p += l; len -= l; ret += l;
613 1875666 : Top_oldlen = len;
614 1875666 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
615 1875666 : len = Top_datalen;
616 1875666 : e = der_get_integer(p, len, data, &l);
617 1875666 : if(e) goto fail;
618 1875666 : p += l; len -= l; ret += l;
619 1875666 : len = Top_oldlen - Top_datalen;
620 : }
621 3751332 : if(size) *size = ret;
622 1825108 : return 0;
623 0 : fail:
624 0 : free_krb5int32(data);
625 0 : return e;
626 : }
627 :
628 : void ASN1CALL
629 5290166 : free_krb5int32(krb5int32 *data)
630 : {
631 5290166 : }
632 :
633 : size_t ASN1CALL
634 1859251 : length_krb5int32(const krb5int32 *data)
635 : {
636 1859251 : size_t ret = 0;
637 1859251 : ret += der_length_integer(data);
638 1859251 : ret += 1 + der_length_len (ret);
639 1859251 : return ret;
640 : }
641 :
642 : int ASN1CALL
643 4535013 : copy_krb5int32(const krb5int32 *from, krb5int32 *to)
644 : {
645 4535013 : memset(to, 0, sizeof(*to));
646 4535013 : *(to) = *(from);
647 4535013 : return 0;
648 : }
649 :
650 : int ASN1CALL
651 9804 : encode_KerberosString(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const KerberosString *data, size_t *size)
652 : {
653 9804 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
654 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
655 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
656 :
657 9804 : e = der_put_general_string(p, len, data, &l);
658 9804 : if (e) return e;
659 9804 : p -= l; len -= l; ret += l;
660 :
661 9804 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_GeneralString, &l);
662 9804 : if (e) return e;
663 9804 : p -= l; len -= l; ret += l;
664 :
665 9804 : *size = ret;
666 9804 : return 0;
667 : }
668 :
669 : int ASN1CALL
670 9336 : decode_KerberosString(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, KerberosString *data, size_t *size)
671 : {
672 9336 : size_t ret = 0;
673 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
674 : int e HEIMDAL_UNUSED_ATTRIBUTE;
675 :
676 9336 : memset(data, 0, sizeof(*data));
677 : {
678 : size_t Top_datalen, Top_oldlen;
679 : Der_type Top_type;
680 9336 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_GeneralString, &Top_datalen, &l);
681 9336 : if (e == 0 && Top_type != PRIM) { e = ASN1_BAD_ID; }
682 9336 : if(e) goto fail;
683 9336 : p += l; len -= l; ret += l;
684 9336 : Top_oldlen = len;
685 9336 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
686 9336 : len = Top_datalen;
687 9336 : e = der_get_general_string(p, len, data, &l);
688 9336 : if(e) goto fail;
689 9336 : p += l; len -= l; ret += l;
690 9336 : len = Top_oldlen - Top_datalen;
691 : }
692 18672 : if(size) *size = ret;
693 9123 : return 0;
694 0 : fail:
695 0 : free_KerberosString(data);
696 0 : return e;
697 : }
698 :
699 : void ASN1CALL
700 19140 : free_KerberosString(KerberosString *data)
701 : {
702 19140 : der_free_general_string(data);
703 19140 : }
704 :
705 : size_t ASN1CALL
706 9804 : length_KerberosString(const KerberosString *data)
707 : {
708 9804 : size_t ret = 0;
709 9804 : ret += der_length_general_string(data);
710 9804 : ret += 1 + der_length_len (ret);
711 9804 : return ret;
712 : }
713 :
714 : int ASN1CALL
715 0 : copy_KerberosString(const KerberosString *from, KerberosString *to)
716 : {
717 0 : memset(to, 0, sizeof(*to));
718 0 : if(der_copy_general_string(from, to)) goto fail;
719 0 : return 0;
720 0 : fail:
721 0 : free_KerberosString(to);
722 0 : return ENOMEM;
723 : }
724 :
725 : int ASN1CALL
726 860762 : encode_Realm(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const Realm *data, size_t *size)
727 : {
728 860762 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
729 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
730 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
731 :
732 860762 : e = der_put_general_string(p, len, data, &l);
733 860762 : if (e) return e;
734 860762 : p -= l; len -= l; ret += l;
735 :
736 860762 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_GeneralString, &l);
737 860762 : if (e) return e;
738 860762 : p -= l; len -= l; ret += l;
739 :
740 860762 : *size = ret;
741 860762 : return 0;
742 : }
743 :
744 : int ASN1CALL
745 720783 : decode_Realm(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, Realm *data, size_t *size)
746 : {
747 720783 : size_t ret = 0;
748 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
749 : int e HEIMDAL_UNUSED_ATTRIBUTE;
750 :
751 720783 : memset(data, 0, sizeof(*data));
752 : {
753 : size_t Top_datalen, Top_oldlen;
754 : Der_type Top_type;
755 720783 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_GeneralString, &Top_datalen, &l);
756 720783 : if (e == 0 && Top_type != PRIM) { e = ASN1_BAD_ID; }
757 720783 : if(e) goto fail;
758 720783 : p += l; len -= l; ret += l;
759 720783 : Top_oldlen = len;
760 720783 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
761 720783 : len = Top_datalen;
762 720783 : e = der_get_general_string(p, len, data, &l);
763 720783 : if(e) goto fail;
764 720783 : p += l; len -= l; ret += l;
765 720783 : len = Top_oldlen - Top_datalen;
766 : }
767 1441566 : if(size) *size = ret;
768 702603 : return 0;
769 0 : fail:
770 0 : free_Realm(data);
771 0 : return e;
772 : }
773 :
774 : void ASN1CALL
775 5273936 : free_Realm(Realm *data)
776 : {
777 5273936 : der_free_general_string(data);
778 5273936 : }
779 :
780 : size_t ASN1CALL
781 860762 : length_Realm(const Realm *data)
782 : {
783 860762 : size_t ret = 0;
784 860762 : ret += der_length_general_string(data);
785 860762 : ret += 1 + der_length_len (ret);
786 860762 : return ret;
787 : }
788 :
789 : int ASN1CALL
790 2695965 : copy_Realm(const Realm *from, Realm *to)
791 : {
792 2695965 : memset(to, 0, sizeof(*to));
793 2695965 : if(der_copy_general_string(from, to)) goto fail;
794 2623407 : return 0;
795 0 : fail:
796 0 : free_Realm(to);
797 0 : return ENOMEM;
798 : }
799 :
800 : int ASN1CALL
801 905256 : encode_PrincipalName(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const PrincipalName *data, size_t *size)
802 : {
803 905256 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
804 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
805 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
806 :
807 : /* name-string */
808 : {
809 905256 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
810 905256 : ret = 0;
811 2291888 : for(i = (int)(&(data)->name_string)->len - 1; i >= 0; --i) {
812 1386632 : size_t name_string_tag_tag_for_oldret = ret;
813 1386632 : ret = 0;
814 1386632 : e = der_put_general_string(p, len, &(&(data)->name_string)->val[i], &l);
815 1386632 : if (e) return e;
816 1386632 : p -= l; len -= l; ret += l;
817 :
818 1386632 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_GeneralString, &l);
819 1386632 : if (e) return e;
820 1386632 : p -= l; len -= l; ret += l;
821 :
822 1386632 : ret += name_string_tag_tag_for_oldret;
823 : }
824 905256 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
825 905256 : if (e) return e;
826 905256 : p -= l; len -= l; ret += l;
827 :
828 905256 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
829 905256 : if (e) return e;
830 905256 : p -= l; len -= l; ret += l;
831 :
832 905256 : ret += Top_tag_oldret;
833 : }
834 : /* name-type */
835 : {
836 905256 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
837 905256 : ret = 0;
838 905256 : e = encode_NAME_TYPE(p, len, &(data)->name_type, &l);
839 905256 : if (e) return e;
840 905256 : p -= l; len -= l; ret += l;
841 :
842 905256 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
843 905256 : if (e) return e;
844 905256 : p -= l; len -= l; ret += l;
845 :
846 905256 : ret += Top_tag_oldret;
847 : }
848 905256 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
849 905256 : if (e) return e;
850 905256 : p -= l; len -= l; ret += l;
851 :
852 905256 : *size = ret;
853 905256 : return 0;
854 : }
855 :
856 : int ASN1CALL
857 773741 : decode_PrincipalName(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, PrincipalName *data, size_t *size)
858 : {
859 773741 : size_t ret = 0;
860 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
861 : int e HEIMDAL_UNUSED_ATTRIBUTE;
862 :
863 773741 : memset(data, 0, sizeof(*data));
864 : {
865 : size_t Top_datalen, Top_oldlen;
866 : Der_type Top_type;
867 773741 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
868 773741 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
869 773741 : if(e) goto fail;
870 773741 : p += l; len -= l; ret += l;
871 773741 : Top_oldlen = len;
872 773741 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
873 773741 : len = Top_datalen;
874 : {
875 : size_t name_type_datalen, name_type_oldlen;
876 : Der_type name_type_type;
877 773741 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &name_type_type, 0, &name_type_datalen, &l);
878 773741 : if (e == 0 && name_type_type != CONS) { e = ASN1_BAD_ID; }
879 773741 : if(e) goto fail;
880 773741 : p += l; len -= l; ret += l;
881 773741 : name_type_oldlen = len;
882 773741 : if (name_type_datalen > len) { e = ASN1_OVERRUN; goto fail; }
883 773741 : len = name_type_datalen;
884 773741 : e = decode_NAME_TYPE(p, len, &(data)->name_type, &l);
885 773741 : if(e) goto fail;
886 773741 : p += l; len -= l; ret += l;
887 773741 : len = name_type_oldlen - name_type_datalen;
888 : }
889 : {
890 : size_t name_string_datalen, name_string_oldlen;
891 : Der_type name_string_type;
892 773741 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &name_string_type, 1, &name_string_datalen, &l);
893 1528417 : if (e == 0 && name_string_type != CONS) { e = ASN1_BAD_ID; }
894 773741 : if(e) goto fail;
895 773741 : p += l; len -= l; ret += l;
896 773741 : name_string_oldlen = len;
897 773741 : if (name_string_datalen > len) { e = ASN1_OVERRUN; goto fail; }
898 773741 : len = name_string_datalen;
899 : {
900 : size_t name_string_Tag_datalen, name_string_Tag_oldlen;
901 : Der_type name_string_Tag_type;
902 773741 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &name_string_Tag_type, UT_Sequence, &name_string_Tag_datalen, &l);
903 773741 : if (e == 0 && name_string_Tag_type != CONS) { e = ASN1_BAD_ID; }
904 773741 : if(e) goto fail;
905 773741 : p += l; len -= l; ret += l;
906 773741 : name_string_Tag_oldlen = len;
907 773741 : if (name_string_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
908 773741 : len = name_string_Tag_datalen;
909 : {
910 773741 : size_t name_string_Tag_Tag_origlen = len;
911 773741 : size_t name_string_Tag_Tag_oldret = ret;
912 773741 : size_t name_string_Tag_Tag_olen = 0;
913 : void *name_string_Tag_Tag_tmp;
914 773741 : ret = 0;
915 773741 : (&(data)->name_string)->len = 0;
916 773741 : (&(data)->name_string)->val = NULL;
917 2752064 : while(ret < name_string_Tag_Tag_origlen) {
918 1204582 : size_t name_string_Tag_Tag_nlen = name_string_Tag_Tag_olen + sizeof(*((&(data)->name_string)->val));
919 1204582 : if (name_string_Tag_Tag_olen > name_string_Tag_Tag_nlen) { e = ASN1_OVERFLOW; goto fail; }
920 1204582 : name_string_Tag_Tag_olen = name_string_Tag_Tag_nlen;
921 1204582 : name_string_Tag_Tag_tmp = realloc((&(data)->name_string)->val, name_string_Tag_Tag_olen);
922 1204582 : if (name_string_Tag_Tag_tmp == NULL) { e = ENOMEM; goto fail; }
923 1204582 : (&(data)->name_string)->val = name_string_Tag_Tag_tmp;
924 : {
925 : size_t name_string_Tag_Tag_s_of_datalen, name_string_Tag_Tag_s_of_oldlen;
926 : Der_type name_string_Tag_Tag_s_of_type;
927 1204582 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &name_string_Tag_Tag_s_of_type, UT_GeneralString, &name_string_Tag_Tag_s_of_datalen, &l);
928 1204582 : if (e == 0 && name_string_Tag_Tag_s_of_type != PRIM) { e = ASN1_BAD_ID; }
929 1204582 : if(e) goto fail;
930 1204582 : p += l; len -= l; ret += l;
931 1204582 : name_string_Tag_Tag_s_of_oldlen = len;
932 1204582 : if (name_string_Tag_Tag_s_of_datalen > len) { e = ASN1_OVERRUN; goto fail; }
933 1204582 : len = name_string_Tag_Tag_s_of_datalen;
934 1204582 : e = der_get_general_string(p, len, &(&(data)->name_string)->val[(&(data)->name_string)->len], &l);
935 1204582 : if(e) goto fail;
936 1204582 : p += l; len -= l; ret += l;
937 1204582 : len = name_string_Tag_Tag_s_of_oldlen - name_string_Tag_Tag_s_of_datalen;
938 : }
939 1204582 : (&(data)->name_string)->len++;
940 1204582 : len = name_string_Tag_Tag_origlen - ret;
941 : }
942 773741 : ret += name_string_Tag_Tag_oldret;
943 : }
944 773741 : len = name_string_Tag_oldlen - name_string_Tag_datalen;
945 : }
946 773741 : len = name_string_oldlen - name_string_datalen;
947 : }
948 773741 : len = Top_oldlen - Top_datalen;
949 : }
950 1547482 : if(size) *size = ret;
951 754676 : return 0;
952 0 : fail:
953 0 : free_PrincipalName(data);
954 0 : return e;
955 : }
956 :
957 : void ASN1CALL
958 5306644 : free_PrincipalName(PrincipalName *data)
959 : {
960 5306644 : free_NAME_TYPE(&(data)->name_type);
961 17785449 : while((&(data)->name_string)->len){
962 7172161 : der_free_general_string(&(&(data)->name_string)->val[(&(data)->name_string)->len-1]);
963 7172161 : (&(data)->name_string)->len--;
964 : }
965 5306644 : free((&(data)->name_string)->val);
966 5306644 : (&(data)->name_string)->val = NULL;
967 5306644 : }
968 :
969 : size_t ASN1CALL
970 905256 : length_PrincipalName(const PrincipalName *data)
971 : {
972 905256 : size_t ret = 0;
973 : {
974 905256 : size_t Top_tag_oldret = ret;
975 905256 : ret = 0;
976 905256 : ret += length_NAME_TYPE(&(data)->name_type);
977 905256 : ret += 1 + der_length_len (ret);
978 905256 : ret += Top_tag_oldret;
979 : }
980 : {
981 905256 : size_t Top_tag_oldret = ret;
982 905256 : ret = 0;
983 : {
984 905256 : size_t name_string_tag_tag_oldret = ret;
985 : int i;
986 905256 : ret = 0;
987 2291888 : for(i = (&(data)->name_string)->len - 1; i >= 0; --i){
988 1386632 : size_t name_string_tag_tag_for_oldret = ret;
989 1386632 : ret = 0;
990 1386632 : ret += der_length_general_string(&(&(data)->name_string)->val[i]);
991 1386632 : ret += 1 + der_length_len (ret);
992 1386632 : ret += name_string_tag_tag_for_oldret;
993 : }
994 905256 : ret += name_string_tag_tag_oldret;
995 : }
996 905256 : ret += 1 + der_length_len (ret);
997 905256 : ret += 1 + der_length_len (ret);
998 905256 : ret += Top_tag_oldret;
999 : }
1000 905256 : ret += 1 + der_length_len (ret);
1001 905256 : return ret;
1002 : }
1003 :
1004 : int ASN1CALL
1005 3344991 : copy_PrincipalName(const PrincipalName *from, PrincipalName *to)
1006 : {
1007 3344991 : memset(to, 0, sizeof(*to));
1008 3344991 : if(copy_NAME_TYPE(&(from)->name_type, &(to)->name_type)) goto fail;
1009 3344991 : if(((&(to)->name_string)->val = malloc((&(from)->name_string)->len * sizeof(*(&(to)->name_string)->val))) == NULL && (&(from)->name_string)->len != 0)
1010 0 : goto fail;
1011 8137027 : for((&(to)->name_string)->len = 0; (&(to)->name_string)->len < (&(from)->name_string)->len; (&(to)->name_string)->len++){
1012 4792036 : if(der_copy_general_string(&(&(from)->name_string)->val[(&(to)->name_string)->len], &(&(to)->name_string)->val[(&(to)->name_string)->len])) goto fail;
1013 : }
1014 3254811 : return 0;
1015 0 : fail:
1016 0 : free_PrincipalName(to);
1017 0 : return ENOMEM;
1018 : }
1019 :
1020 : int ASN1CALL
1021 104469 : encode_Principal(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const Principal *data, size_t *size)
1022 : {
1023 104469 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
1024 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
1025 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
1026 :
1027 : /* realm */
1028 : {
1029 104469 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
1030 104469 : ret = 0;
1031 104469 : e = encode_Realm(p, len, &(data)->realm, &l);
1032 104469 : if (e) return e;
1033 104469 : p -= l; len -= l; ret += l;
1034 :
1035 104469 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
1036 104469 : if (e) return e;
1037 104469 : p -= l; len -= l; ret += l;
1038 :
1039 104469 : ret += Top_tag_oldret;
1040 : }
1041 : /* name */
1042 : {
1043 104469 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
1044 104469 : ret = 0;
1045 104469 : e = encode_PrincipalName(p, len, &(data)->name, &l);
1046 104469 : if (e) return e;
1047 104469 : p -= l; len -= l; ret += l;
1048 :
1049 104469 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
1050 104469 : if (e) return e;
1051 104469 : p -= l; len -= l; ret += l;
1052 :
1053 104469 : ret += Top_tag_oldret;
1054 : }
1055 104469 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
1056 104469 : if (e) return e;
1057 104469 : p -= l; len -= l; ret += l;
1058 :
1059 104469 : *size = ret;
1060 104469 : return 0;
1061 : }
1062 :
1063 : int ASN1CALL
1064 0 : decode_Principal(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, Principal *data, size_t *size)
1065 : {
1066 0 : size_t ret = 0;
1067 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
1068 : int e HEIMDAL_UNUSED_ATTRIBUTE;
1069 :
1070 0 : memset(data, 0, sizeof(*data));
1071 : {
1072 : size_t Top_datalen, Top_oldlen;
1073 : Der_type Top_type;
1074 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
1075 0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
1076 0 : if(e) goto fail;
1077 0 : p += l; len -= l; ret += l;
1078 0 : Top_oldlen = len;
1079 0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
1080 0 : len = Top_datalen;
1081 : {
1082 : size_t name_datalen, name_oldlen;
1083 : Der_type name_type;
1084 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &name_type, 0, &name_datalen, &l);
1085 0 : if (e == 0 && name_type != CONS) { e = ASN1_BAD_ID; }
1086 0 : if(e) goto fail;
1087 0 : p += l; len -= l; ret += l;
1088 0 : name_oldlen = len;
1089 0 : if (name_datalen > len) { e = ASN1_OVERRUN; goto fail; }
1090 0 : len = name_datalen;
1091 0 : e = decode_PrincipalName(p, len, &(data)->name, &l);
1092 0 : if(e) goto fail;
1093 0 : p += l; len -= l; ret += l;
1094 0 : len = name_oldlen - name_datalen;
1095 : }
1096 : {
1097 : size_t realm_datalen, realm_oldlen;
1098 : Der_type realm_type;
1099 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &realm_type, 1, &realm_datalen, &l);
1100 0 : if (e == 0 && realm_type != CONS) { e = ASN1_BAD_ID; }
1101 0 : if(e) goto fail;
1102 0 : p += l; len -= l; ret += l;
1103 0 : realm_oldlen = len;
1104 0 : if (realm_datalen > len) { e = ASN1_OVERRUN; goto fail; }
1105 0 : len = realm_datalen;
1106 0 : e = decode_Realm(p, len, &(data)->realm, &l);
1107 0 : if(e) goto fail;
1108 0 : p += l; len -= l; ret += l;
1109 0 : len = realm_oldlen - realm_datalen;
1110 : }
1111 0 : len = Top_oldlen - Top_datalen;
1112 : }
1113 0 : if(size) *size = ret;
1114 0 : return 0;
1115 0 : fail:
1116 0 : free_Principal(data);
1117 0 : return e;
1118 : }
1119 :
1120 : void ASN1CALL
1121 3535288 : free_Principal(Principal *data)
1122 : {
1123 3535288 : free_PrincipalName(&(data)->name);
1124 3535288 : free_Realm(&(data)->realm);
1125 3535288 : }
1126 :
1127 : size_t ASN1CALL
1128 104469 : length_Principal(const Principal *data)
1129 : {
1130 104469 : size_t ret = 0;
1131 : {
1132 104469 : size_t Top_tag_oldret = ret;
1133 104469 : ret = 0;
1134 104469 : ret += length_PrincipalName(&(data)->name);
1135 104469 : ret += 1 + der_length_len (ret);
1136 104469 : ret += Top_tag_oldret;
1137 : }
1138 : {
1139 104469 : size_t Top_tag_oldret = ret;
1140 104469 : ret = 0;
1141 104469 : ret += length_Realm(&(data)->realm);
1142 104469 : ret += 1 + der_length_len (ret);
1143 104469 : ret += Top_tag_oldret;
1144 : }
1145 104469 : ret += 1 + der_length_len (ret);
1146 104469 : return ret;
1147 : }
1148 :
1149 : int ASN1CALL
1150 2137672 : copy_Principal(const Principal *from, Principal *to)
1151 : {
1152 2137672 : memset(to, 0, sizeof(*to));
1153 2137672 : if(copy_PrincipalName(&(from)->name, &(to)->name)) goto fail;
1154 2137672 : if(copy_Realm(&(from)->realm, &(to)->realm)) goto fail;
1155 2080163 : return 0;
1156 0 : fail:
1157 0 : free_Principal(to);
1158 0 : return ENOMEM;
1159 : }
1160 :
1161 : int ASN1CALL
1162 0 : encode_Principals(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const Principals *data, size_t *size)
1163 : {
1164 0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
1165 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
1166 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
1167 :
1168 0 : for(i = (int)(data)->len - 1; i >= 0; --i) {
1169 0 : size_t Top_tag_for_oldret = ret;
1170 0 : ret = 0;
1171 0 : e = encode_Principal(p, len, &(data)->val[i], &l);
1172 0 : if (e) return e;
1173 0 : p -= l; len -= l; ret += l;
1174 :
1175 0 : ret += Top_tag_for_oldret;
1176 : }
1177 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
1178 0 : if (e) return e;
1179 0 : p -= l; len -= l; ret += l;
1180 :
1181 0 : *size = ret;
1182 0 : return 0;
1183 : }
1184 :
1185 : int ASN1CALL
1186 0 : decode_Principals(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, Principals *data, size_t *size)
1187 : {
1188 0 : size_t ret = 0;
1189 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
1190 : int e HEIMDAL_UNUSED_ATTRIBUTE;
1191 :
1192 0 : memset(data, 0, sizeof(*data));
1193 : {
1194 : size_t Top_datalen, Top_oldlen;
1195 : Der_type Top_type;
1196 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
1197 0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
1198 0 : if(e) goto fail;
1199 0 : p += l; len -= l; ret += l;
1200 0 : Top_oldlen = len;
1201 0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
1202 0 : len = Top_datalen;
1203 : {
1204 0 : size_t Top_Tag_origlen = len;
1205 0 : size_t Top_Tag_oldret = ret;
1206 0 : size_t Top_Tag_olen = 0;
1207 : void *Top_Tag_tmp;
1208 0 : ret = 0;
1209 0 : (data)->len = 0;
1210 0 : (data)->val = NULL;
1211 0 : while(ret < Top_Tag_origlen) {
1212 0 : size_t Top_Tag_nlen = Top_Tag_olen + sizeof(*((data)->val));
1213 0 : if (Top_Tag_olen > Top_Tag_nlen) { e = ASN1_OVERFLOW; goto fail; }
1214 0 : Top_Tag_olen = Top_Tag_nlen;
1215 0 : Top_Tag_tmp = realloc((data)->val, Top_Tag_olen);
1216 0 : if (Top_Tag_tmp == NULL) { e = ENOMEM; goto fail; }
1217 0 : (data)->val = Top_Tag_tmp;
1218 0 : e = decode_Principal(p, len, &(data)->val[(data)->len], &l);
1219 0 : if(e) goto fail;
1220 0 : p += l; len -= l; ret += l;
1221 0 : (data)->len++;
1222 0 : len = Top_Tag_origlen - ret;
1223 : }
1224 0 : ret += Top_Tag_oldret;
1225 : }
1226 0 : len = Top_oldlen - Top_datalen;
1227 : }
1228 0 : if(size) *size = ret;
1229 0 : return 0;
1230 0 : fail:
1231 0 : free_Principals(data);
1232 0 : return e;
1233 : }
1234 :
1235 : void ASN1CALL
1236 0 : free_Principals(Principals *data)
1237 : {
1238 0 : while((data)->len){
1239 0 : free_Principal(&(data)->val[(data)->len-1]);
1240 0 : (data)->len--;
1241 : }
1242 0 : free((data)->val);
1243 0 : (data)->val = NULL;
1244 0 : }
1245 :
1246 : size_t ASN1CALL
1247 0 : length_Principals(const Principals *data)
1248 : {
1249 0 : size_t ret = 0;
1250 : {
1251 0 : size_t Top_tag_oldret = ret;
1252 : int i;
1253 0 : ret = 0;
1254 0 : for(i = (data)->len - 1; i >= 0; --i){
1255 0 : size_t Top_tag_for_oldret = ret;
1256 0 : ret = 0;
1257 0 : ret += length_Principal(&(data)->val[i]);
1258 0 : ret += Top_tag_for_oldret;
1259 : }
1260 0 : ret += Top_tag_oldret;
1261 : }
1262 0 : ret += 1 + der_length_len (ret);
1263 0 : return ret;
1264 : }
1265 :
1266 : int ASN1CALL
1267 0 : copy_Principals(const Principals *from, Principals *to)
1268 : {
1269 0 : memset(to, 0, sizeof(*to));
1270 0 : if(((to)->val = malloc((from)->len * sizeof(*(to)->val))) == NULL && (from)->len != 0)
1271 0 : goto fail;
1272 0 : for((to)->len = 0; (to)->len < (from)->len; (to)->len++){
1273 0 : if(copy_Principal(&(from)->val[(to)->len], &(to)->val[(to)->len])) goto fail;
1274 : }
1275 0 : return 0;
1276 0 : fail:
1277 0 : free_Principals(to);
1278 0 : return ENOMEM;
1279 : }
1280 :
1281 : int ASN1CALL
1282 0 : add_Principals(Principals *data, const Principal *element)
1283 : {
1284 : int ret;
1285 : void *ptr;
1286 :
1287 0 : ptr = realloc(data->val,
1288 0 : (data->len + 1) * sizeof(data->val[0]));
1289 0 : if (ptr == NULL) return ENOMEM;
1290 0 : data->val = ptr;
1291 :
1292 0 : ret = copy_Principal(element, &data->val[data->len]);
1293 0 : if (ret) return ret;
1294 0 : data->len++;
1295 0 : return 0;
1296 : }
1297 :
1298 : int ASN1CALL
1299 0 : remove_Principals(Principals *data, unsigned int element)
1300 : {
1301 : void *ptr;
1302 :
1303 0 : if (data->len == 0 || element >= data->len)
1304 0 : return ASN1_OVERRUN;
1305 0 : free_Principal(&data->val[element]);
1306 0 : data->len--;
1307 0 : if (element < data->len)
1308 0 : memmove(&data->val[element], &data->val[element + 1],
1309 0 : sizeof(data->val[0]) * data->len);
1310 0 : ptr = realloc(data->val, data->len * sizeof(data->val[0]));
1311 0 : if (ptr != NULL || data->len == 0) data->val = ptr;
1312 0 : return 0;
1313 : }
1314 :
1315 : int ASN1CALL
1316 482 : encode_HostAddress(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const HostAddress *data, size_t *size)
1317 : {
1318 482 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
1319 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
1320 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
1321 :
1322 : /* address */
1323 : {
1324 482 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
1325 482 : ret = 0;
1326 482 : e = der_put_octet_string(p, len, &(data)->address, &l);
1327 482 : if (e) return e;
1328 482 : p -= l; len -= l; ret += l;
1329 :
1330 482 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_OctetString, &l);
1331 482 : if (e) return e;
1332 482 : p -= l; len -= l; ret += l;
1333 :
1334 482 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
1335 482 : if (e) return e;
1336 482 : p -= l; len -= l; ret += l;
1337 :
1338 482 : ret += Top_tag_oldret;
1339 : }
1340 : /* addr-type */
1341 : {
1342 482 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
1343 482 : ret = 0;
1344 482 : e = encode_krb5int32(p, len, &(data)->addr_type, &l);
1345 482 : if (e) return e;
1346 482 : p -= l; len -= l; ret += l;
1347 :
1348 482 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
1349 482 : if (e) return e;
1350 482 : p -= l; len -= l; ret += l;
1351 :
1352 482 : ret += Top_tag_oldret;
1353 : }
1354 482 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
1355 482 : if (e) return e;
1356 482 : p -= l; len -= l; ret += l;
1357 :
1358 482 : *size = ret;
1359 482 : return 0;
1360 : }
1361 :
1362 : int ASN1CALL
1363 506 : decode_HostAddress(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, HostAddress *data, size_t *size)
1364 : {
1365 506 : size_t ret = 0;
1366 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
1367 : int e HEIMDAL_UNUSED_ATTRIBUTE;
1368 :
1369 506 : memset(data, 0, sizeof(*data));
1370 : {
1371 : size_t Top_datalen, Top_oldlen;
1372 : Der_type Top_type;
1373 506 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
1374 506 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
1375 506 : if(e) goto fail;
1376 506 : p += l; len -= l; ret += l;
1377 506 : Top_oldlen = len;
1378 506 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
1379 506 : len = Top_datalen;
1380 : {
1381 : size_t addr_type_datalen, addr_type_oldlen;
1382 : Der_type addr_type_type;
1383 506 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &addr_type_type, 0, &addr_type_datalen, &l);
1384 506 : if (e == 0 && addr_type_type != CONS) { e = ASN1_BAD_ID; }
1385 506 : if(e) goto fail;
1386 506 : p += l; len -= l; ret += l;
1387 506 : addr_type_oldlen = len;
1388 506 : if (addr_type_datalen > len) { e = ASN1_OVERRUN; goto fail; }
1389 506 : len = addr_type_datalen;
1390 506 : e = decode_krb5int32(p, len, &(data)->addr_type, &l);
1391 506 : if(e) goto fail;
1392 506 : p += l; len -= l; ret += l;
1393 506 : len = addr_type_oldlen - addr_type_datalen;
1394 : }
1395 : {
1396 : size_t address_datalen, address_oldlen;
1397 : Der_type address_type;
1398 506 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &address_type, 1, &address_datalen, &l);
1399 1012 : if (e == 0 && address_type != CONS) { e = ASN1_BAD_ID; }
1400 506 : if(e) goto fail;
1401 506 : p += l; len -= l; ret += l;
1402 506 : address_oldlen = len;
1403 506 : if (address_datalen > len) { e = ASN1_OVERRUN; goto fail; }
1404 506 : len = address_datalen;
1405 : {
1406 : size_t address_Tag_datalen, address_Tag_oldlen;
1407 : Der_type address_Tag_type;
1408 506 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &address_Tag_type, UT_OctetString, &address_Tag_datalen, &l);
1409 506 : if (e == 0 && address_Tag_type != PRIM) { e = ASN1_BAD_ID; }
1410 506 : if(e) goto fail;
1411 506 : p += l; len -= l; ret += l;
1412 506 : address_Tag_oldlen = len;
1413 506 : if (address_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
1414 506 : len = address_Tag_datalen;
1415 506 : e = der_get_octet_string(p, len, &(data)->address, &l);
1416 506 : if(e) goto fail;
1417 506 : p += l; len -= l; ret += l;
1418 506 : len = address_Tag_oldlen - address_Tag_datalen;
1419 : }
1420 506 : len = address_oldlen - address_datalen;
1421 : }
1422 506 : len = Top_oldlen - Top_datalen;
1423 : }
1424 1012 : if(size) *size = ret;
1425 506 : return 0;
1426 0 : fail:
1427 0 : free_HostAddress(data);
1428 0 : return e;
1429 : }
1430 :
1431 : void ASN1CALL
1432 782 : free_HostAddress(HostAddress *data)
1433 : {
1434 782 : free_krb5int32(&(data)->addr_type);
1435 782 : der_free_octet_string(&(data)->address);
1436 782 : }
1437 :
1438 : size_t ASN1CALL
1439 482 : length_HostAddress(const HostAddress *data)
1440 : {
1441 482 : size_t ret = 0;
1442 : {
1443 482 : size_t Top_tag_oldret = ret;
1444 482 : ret = 0;
1445 482 : ret += length_krb5int32(&(data)->addr_type);
1446 482 : ret += 1 + der_length_len (ret);
1447 482 : ret += Top_tag_oldret;
1448 : }
1449 : {
1450 482 : size_t Top_tag_oldret = ret;
1451 482 : ret = 0;
1452 482 : ret += der_length_octet_string(&(data)->address);
1453 482 : ret += 1 + der_length_len (ret);
1454 482 : ret += 1 + der_length_len (ret);
1455 482 : ret += Top_tag_oldret;
1456 : }
1457 482 : ret += 1 + der_length_len (ret);
1458 482 : return ret;
1459 : }
1460 :
1461 : int ASN1CALL
1462 282 : copy_HostAddress(const HostAddress *from, HostAddress *to)
1463 : {
1464 282 : memset(to, 0, sizeof(*to));
1465 282 : if(copy_krb5int32(&(from)->addr_type, &(to)->addr_type)) goto fail;
1466 282 : if(der_copy_octet_string(&(from)->address, &(to)->address)) goto fail;
1467 282 : return 0;
1468 0 : fail:
1469 0 : free_HostAddress(to);
1470 0 : return ENOMEM;
1471 : }
1472 :
1473 : int ASN1CALL
1474 19525 : encode_HostAddresses(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const HostAddresses *data, size_t *size)
1475 : {
1476 19525 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
1477 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
1478 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
1479 :
1480 19939 : for(i = (int)(data)->len - 1; i >= 0; --i) {
1481 414 : size_t Top_tag_for_oldret = ret;
1482 414 : ret = 0;
1483 414 : e = encode_HostAddress(p, len, &(data)->val[i], &l);
1484 414 : if (e) return e;
1485 414 : p -= l; len -= l; ret += l;
1486 :
1487 414 : ret += Top_tag_for_oldret;
1488 : }
1489 19525 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
1490 19525 : if (e) return e;
1491 19525 : p -= l; len -= l; ret += l;
1492 :
1493 19525 : *size = ret;
1494 19525 : return 0;
1495 : }
1496 :
1497 : int ASN1CALL
1498 19389 : decode_HostAddresses(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, HostAddresses *data, size_t *size)
1499 : {
1500 19389 : size_t ret = 0;
1501 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
1502 : int e HEIMDAL_UNUSED_ATTRIBUTE;
1503 :
1504 19389 : memset(data, 0, sizeof(*data));
1505 : {
1506 : size_t Top_datalen, Top_oldlen;
1507 : Der_type Top_type;
1508 19389 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
1509 19389 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
1510 19389 : if(e) goto fail;
1511 19389 : p += l; len -= l; ret += l;
1512 19389 : Top_oldlen = len;
1513 19389 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
1514 19389 : len = Top_datalen;
1515 : {
1516 19389 : size_t Top_Tag_origlen = len;
1517 19389 : size_t Top_Tag_oldret = ret;
1518 19389 : size_t Top_Tag_olen = 0;
1519 : void *Top_Tag_tmp;
1520 19389 : ret = 0;
1521 19389 : (data)->len = 0;
1522 19389 : (data)->val = NULL;
1523 39216 : while(ret < Top_Tag_origlen) {
1524 438 : size_t Top_Tag_nlen = Top_Tag_olen + sizeof(*((data)->val));
1525 438 : if (Top_Tag_olen > Top_Tag_nlen) { e = ASN1_OVERFLOW; goto fail; }
1526 438 : Top_Tag_olen = Top_Tag_nlen;
1527 438 : Top_Tag_tmp = realloc((data)->val, Top_Tag_olen);
1528 438 : if (Top_Tag_tmp == NULL) { e = ENOMEM; goto fail; }
1529 438 : (data)->val = Top_Tag_tmp;
1530 438 : e = decode_HostAddress(p, len, &(data)->val[(data)->len], &l);
1531 438 : if(e) goto fail;
1532 438 : p += l; len -= l; ret += l;
1533 438 : (data)->len++;
1534 438 : len = Top_Tag_origlen - ret;
1535 : }
1536 19389 : ret += Top_Tag_oldret;
1537 : }
1538 19389 : len = Top_oldlen - Top_datalen;
1539 : }
1540 38778 : if(size) *size = ret;
1541 18651 : return 0;
1542 0 : fail:
1543 0 : free_HostAddresses(data);
1544 0 : return e;
1545 : }
1546 :
1547 : void ASN1CALL
1548 38778 : free_HostAddresses(HostAddresses *data)
1549 : {
1550 78202 : while((data)->len){
1551 646 : free_HostAddress(&(data)->val[(data)->len-1]);
1552 646 : (data)->len--;
1553 : }
1554 38778 : free((data)->val);
1555 38778 : (data)->val = NULL;
1556 38778 : }
1557 :
1558 : size_t ASN1CALL
1559 19525 : length_HostAddresses(const HostAddresses *data)
1560 : {
1561 19525 : size_t ret = 0;
1562 : {
1563 19525 : size_t Top_tag_oldret = ret;
1564 : int i;
1565 19525 : ret = 0;
1566 19939 : for(i = (data)->len - 1; i >= 0; --i){
1567 414 : size_t Top_tag_for_oldret = ret;
1568 414 : ret = 0;
1569 414 : ret += length_HostAddress(&(data)->val[i]);
1570 414 : ret += Top_tag_for_oldret;
1571 : }
1572 19525 : ret += Top_tag_oldret;
1573 : }
1574 19525 : ret += 1 + der_length_len (ret);
1575 19525 : return ret;
1576 : }
1577 :
1578 : int ASN1CALL
1579 19386 : copy_HostAddresses(const HostAddresses *from, HostAddresses *to)
1580 : {
1581 19386 : memset(to, 0, sizeof(*to));
1582 19386 : if(((to)->val = malloc((from)->len * sizeof(*(to)->val))) == NULL && (from)->len != 0)
1583 0 : goto fail;
1584 19591 : for((to)->len = 0; (to)->len < (from)->len; (to)->len++){
1585 205 : if(copy_HostAddress(&(from)->val[(to)->len], &(to)->val[(to)->len])) goto fail;
1586 : }
1587 18636 : return 0;
1588 0 : fail:
1589 0 : free_HostAddresses(to);
1590 0 : return ENOMEM;
1591 : }
1592 :
1593 : int ASN1CALL
1594 935551 : encode_KerberosTime(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const KerberosTime *data, size_t *size)
1595 : {
1596 935551 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
1597 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
1598 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
1599 :
1600 935551 : e = der_put_generalized_time(p, len, data, &l);
1601 935551 : if (e) return e;
1602 935551 : p -= l; len -= l; ret += l;
1603 :
1604 935551 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_GeneralizedTime, &l);
1605 935551 : if (e) return e;
1606 935551 : p -= l; len -= l; ret += l;
1607 :
1608 935551 : *size = ret;
1609 935551 : return 0;
1610 : }
1611 :
1612 : int ASN1CALL
1613 728595 : decode_KerberosTime(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, KerberosTime *data, size_t *size)
1614 : {
1615 728595 : size_t ret = 0;
1616 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
1617 : int e HEIMDAL_UNUSED_ATTRIBUTE;
1618 :
1619 728595 : memset(data, 0, sizeof(*data));
1620 : {
1621 : size_t Top_datalen, Top_oldlen;
1622 : Der_type Top_type;
1623 728595 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_GeneralizedTime, &Top_datalen, &l);
1624 728595 : if (e == 0 && Top_type != PRIM) { e = ASN1_BAD_ID; }
1625 728595 : if(e) goto fail;
1626 728595 : p += l; len -= l; ret += l;
1627 728595 : Top_oldlen = len;
1628 728595 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
1629 728595 : len = Top_datalen;
1630 728595 : e = der_get_generalized_time(p, len, data, &l);
1631 728595 : if(e) goto fail;
1632 728595 : p += l; len -= l; ret += l;
1633 728595 : len = Top_oldlen - Top_datalen;
1634 : }
1635 1457190 : if(size) *size = ret;
1636 708949 : return 0;
1637 0 : fail:
1638 0 : free_KerberosTime(data);
1639 0 : return e;
1640 : }
1641 :
1642 : void ASN1CALL
1643 2090317 : free_KerberosTime(KerberosTime *data)
1644 : {
1645 2090317 : }
1646 :
1647 : size_t ASN1CALL
1648 935551 : length_KerberosTime(const KerberosTime *data)
1649 : {
1650 935551 : size_t ret = 0;
1651 935551 : ret += der_length_generalized_time(data);
1652 935551 : ret += 1 + der_length_len (ret);
1653 935551 : return ret;
1654 : }
1655 :
1656 : int ASN1CALL
1657 216347 : copy_KerberosTime(const KerberosTime *from, KerberosTime *to)
1658 : {
1659 216347 : memset(to, 0, sizeof(*to));
1660 216347 : *(to) = *(from);
1661 216347 : return 0;
1662 : }
1663 :
1664 : int ASN1CALL
1665 302482 : encode_AuthorizationDataElement(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const AuthorizationDataElement *data, size_t *size)
1666 : {
1667 302482 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
1668 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
1669 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
1670 :
1671 : /* ad-data */
1672 : {
1673 302482 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
1674 302482 : ret = 0;
1675 302482 : e = der_put_octet_string(p, len, &(data)->ad_data, &l);
1676 302482 : if (e) return e;
1677 302482 : p -= l; len -= l; ret += l;
1678 :
1679 302482 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_OctetString, &l);
1680 302482 : if (e) return e;
1681 302482 : p -= l; len -= l; ret += l;
1682 :
1683 302482 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
1684 302482 : if (e) return e;
1685 302482 : p -= l; len -= l; ret += l;
1686 :
1687 302482 : ret += Top_tag_oldret;
1688 : }
1689 : /* ad-type */
1690 : {
1691 302482 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
1692 302482 : ret = 0;
1693 302482 : e = encode_krb5int32(p, len, &(data)->ad_type, &l);
1694 302482 : if (e) return e;
1695 302482 : p -= l; len -= l; ret += l;
1696 :
1697 302482 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
1698 302482 : if (e) return e;
1699 302482 : p -= l; len -= l; ret += l;
1700 :
1701 302482 : ret += Top_tag_oldret;
1702 : }
1703 302482 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
1704 302482 : if (e) return e;
1705 302482 : p -= l; len -= l; ret += l;
1706 :
1707 302482 : *size = ret;
1708 302482 : return 0;
1709 : }
1710 :
1711 : int ASN1CALL
1712 329378 : decode_AuthorizationDataElement(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, AuthorizationDataElement *data, size_t *size)
1713 : {
1714 329378 : size_t ret = 0;
1715 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
1716 : int e HEIMDAL_UNUSED_ATTRIBUTE;
1717 :
1718 329378 : memset(data, 0, sizeof(*data));
1719 : {
1720 : size_t Top_datalen, Top_oldlen;
1721 : Der_type Top_type;
1722 329378 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
1723 329378 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
1724 329378 : if(e) goto fail;
1725 329378 : p += l; len -= l; ret += l;
1726 329378 : Top_oldlen = len;
1727 329378 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
1728 329378 : len = Top_datalen;
1729 : {
1730 : size_t ad_type_datalen, ad_type_oldlen;
1731 : Der_type ad_type_type;
1732 329378 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &ad_type_type, 0, &ad_type_datalen, &l);
1733 329378 : if (e == 0 && ad_type_type != CONS) { e = ASN1_BAD_ID; }
1734 329378 : if(e) goto fail;
1735 329378 : p += l; len -= l; ret += l;
1736 329378 : ad_type_oldlen = len;
1737 329378 : if (ad_type_datalen > len) { e = ASN1_OVERRUN; goto fail; }
1738 329378 : len = ad_type_datalen;
1739 329378 : e = decode_krb5int32(p, len, &(data)->ad_type, &l);
1740 329378 : if(e) goto fail;
1741 329378 : p += l; len -= l; ret += l;
1742 329378 : len = ad_type_oldlen - ad_type_datalen;
1743 : }
1744 : {
1745 : size_t ad_data_datalen, ad_data_oldlen;
1746 : Der_type ad_data_type;
1747 329378 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &ad_data_type, 1, &ad_data_datalen, &l);
1748 648496 : if (e == 0 && ad_data_type != CONS) { e = ASN1_BAD_ID; }
1749 329378 : if(e) goto fail;
1750 329378 : p += l; len -= l; ret += l;
1751 329378 : ad_data_oldlen = len;
1752 329378 : if (ad_data_datalen > len) { e = ASN1_OVERRUN; goto fail; }
1753 329378 : len = ad_data_datalen;
1754 : {
1755 : size_t ad_data_Tag_datalen, ad_data_Tag_oldlen;
1756 : Der_type ad_data_Tag_type;
1757 329378 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &ad_data_Tag_type, UT_OctetString, &ad_data_Tag_datalen, &l);
1758 329378 : if (e == 0 && ad_data_Tag_type != PRIM) { e = ASN1_BAD_ID; }
1759 329378 : if(e) goto fail;
1760 329378 : p += l; len -= l; ret += l;
1761 329378 : ad_data_Tag_oldlen = len;
1762 329378 : if (ad_data_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
1763 329378 : len = ad_data_Tag_datalen;
1764 329378 : e = der_get_octet_string(p, len, &(data)->ad_data, &l);
1765 329378 : if(e) goto fail;
1766 329378 : p += l; len -= l; ret += l;
1767 329378 : len = ad_data_Tag_oldlen - ad_data_Tag_datalen;
1768 : }
1769 329378 : len = ad_data_oldlen - ad_data_datalen;
1770 : }
1771 329378 : len = Top_oldlen - Top_datalen;
1772 : }
1773 658756 : if(size) *size = ret;
1774 319118 : return 0;
1775 0 : fail:
1776 0 : free_AuthorizationDataElement(data);
1777 0 : return e;
1778 : }
1779 :
1780 : void ASN1CALL
1781 694709 : free_AuthorizationDataElement(AuthorizationDataElement *data)
1782 : {
1783 694709 : free_krb5int32(&(data)->ad_type);
1784 694709 : der_free_octet_string(&(data)->ad_data);
1785 694709 : }
1786 :
1787 : size_t ASN1CALL
1788 302482 : length_AuthorizationDataElement(const AuthorizationDataElement *data)
1789 : {
1790 302482 : size_t ret = 0;
1791 : {
1792 302482 : size_t Top_tag_oldret = ret;
1793 302482 : ret = 0;
1794 302482 : ret += length_krb5int32(&(data)->ad_type);
1795 302482 : ret += 1 + der_length_len (ret);
1796 302482 : ret += Top_tag_oldret;
1797 : }
1798 : {
1799 302482 : size_t Top_tag_oldret = ret;
1800 302482 : ret = 0;
1801 302482 : ret += der_length_octet_string(&(data)->ad_data);
1802 302482 : ret += 1 + der_length_len (ret);
1803 302482 : ret += 1 + der_length_len (ret);
1804 302482 : ret += Top_tag_oldret;
1805 : }
1806 302482 : ret += 1 + der_length_len (ret);
1807 302482 : return ret;
1808 : }
1809 :
1810 : int ASN1CALL
1811 324628 : copy_AuthorizationDataElement(const AuthorizationDataElement *from, AuthorizationDataElement *to)
1812 : {
1813 324628 : memset(to, 0, sizeof(*to));
1814 324628 : if(copy_krb5int32(&(from)->ad_type, &(to)->ad_type)) goto fail;
1815 324628 : if(der_copy_octet_string(&(from)->ad_data, &(to)->ad_data)) goto fail;
1816 315698 : return 0;
1817 0 : fail:
1818 0 : free_AuthorizationDataElement(to);
1819 0 : return ENOMEM;
1820 : }
1821 :
1822 : int ASN1CALL
1823 237586 : encode_AuthorizationData(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const AuthorizationData *data, size_t *size)
1824 : {
1825 237586 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
1826 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
1827 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
1828 :
1829 540068 : for(i = (int)(data)->len - 1; i >= 0; --i) {
1830 302482 : size_t Top_tag_for_oldret = ret;
1831 302482 : ret = 0;
1832 302482 : e = encode_AuthorizationDataElement(p, len, &(data)->val[i], &l);
1833 302482 : if (e) return e;
1834 302482 : p -= l; len -= l; ret += l;
1835 :
1836 302482 : ret += Top_tag_for_oldret;
1837 : }
1838 237586 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
1839 237586 : if (e) return e;
1840 237586 : p -= l; len -= l; ret += l;
1841 :
1842 237586 : *size = ret;
1843 237586 : return 0;
1844 : }
1845 :
1846 : int ASN1CALL
1847 267516 : decode_AuthorizationData(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, AuthorizationData *data, size_t *size)
1848 : {
1849 267516 : size_t ret = 0;
1850 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
1851 : int e HEIMDAL_UNUSED_ATTRIBUTE;
1852 :
1853 267516 : memset(data, 0, sizeof(*data));
1854 : {
1855 : size_t Top_datalen, Top_oldlen;
1856 : Der_type Top_type;
1857 267516 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
1858 267516 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
1859 267516 : if(e) goto fail;
1860 267516 : p += l; len -= l; ret += l;
1861 267516 : Top_oldlen = len;
1862 267516 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
1863 267516 : len = Top_datalen;
1864 : {
1865 267516 : size_t Top_Tag_origlen = len;
1866 267516 : size_t Top_Tag_oldret = ret;
1867 267516 : size_t Top_Tag_olen = 0;
1868 : void *Top_Tag_tmp;
1869 267516 : ret = 0;
1870 267516 : (data)->len = 0;
1871 267516 : (data)->val = NULL;
1872 864410 : while(ret < Top_Tag_origlen) {
1873 329378 : size_t Top_Tag_nlen = Top_Tag_olen + sizeof(*((data)->val));
1874 329378 : if (Top_Tag_olen > Top_Tag_nlen) { e = ASN1_OVERFLOW; goto fail; }
1875 329378 : Top_Tag_olen = Top_Tag_nlen;
1876 329378 : Top_Tag_tmp = realloc((data)->val, Top_Tag_olen);
1877 329378 : if (Top_Tag_tmp == NULL) { e = ENOMEM; goto fail; }
1878 329378 : (data)->val = Top_Tag_tmp;
1879 329378 : e = decode_AuthorizationDataElement(p, len, &(data)->val[(data)->len], &l);
1880 329378 : if(e) goto fail;
1881 329378 : p += l; len -= l; ret += l;
1882 329378 : (data)->len++;
1883 329378 : len = Top_Tag_origlen - ret;
1884 : }
1885 267516 : ret += Top_Tag_oldret;
1886 : }
1887 267516 : len = Top_oldlen - Top_datalen;
1888 : }
1889 369356 : if(size) *size = ret;
1890 259083 : return 0;
1891 0 : fail:
1892 0 : free_AuthorizationData(data);
1893 0 : return e;
1894 : }
1895 :
1896 : void ASN1CALL
1897 1272923 : free_AuthorizationData(AuthorizationData *data)
1898 : {
1899 3240555 : while((data)->len){
1900 694709 : free_AuthorizationDataElement(&(data)->val[(data)->len-1]);
1901 694709 : (data)->len--;
1902 : }
1903 1272923 : free((data)->val);
1904 1272923 : (data)->val = NULL;
1905 1272923 : }
1906 :
1907 : size_t ASN1CALL
1908 237586 : length_AuthorizationData(const AuthorizationData *data)
1909 : {
1910 237586 : size_t ret = 0;
1911 : {
1912 237586 : size_t Top_tag_oldret = ret;
1913 : int i;
1914 237586 : ret = 0;
1915 540068 : for(i = (data)->len - 1; i >= 0; --i){
1916 302482 : size_t Top_tag_for_oldret = ret;
1917 302482 : ret = 0;
1918 302482 : ret += length_AuthorizationDataElement(&(data)->val[i]);
1919 302482 : ret += Top_tag_for_oldret;
1920 : }
1921 237586 : ret += Top_tag_oldret;
1922 : }
1923 237586 : ret += 1 + der_length_len (ret);
1924 237586 : return ret;
1925 : }
1926 :
1927 : int ASN1CALL
1928 595678 : copy_AuthorizationData(const AuthorizationData *from, AuthorizationData *to)
1929 : {
1930 595678 : memset(to, 0, sizeof(*to));
1931 595678 : if(((to)->val = malloc((from)->len * sizeof(*(to)->val))) == NULL && (from)->len != 0)
1932 0 : goto fail;
1933 658482 : for((to)->len = 0; (to)->len < (from)->len; (to)->len++){
1934 62804 : if(copy_AuthorizationDataElement(&(from)->val[(to)->len], &(to)->val[(to)->len])) goto fail;
1935 : }
1936 580523 : return 0;
1937 0 : fail:
1938 0 : free_AuthorizationData(to);
1939 0 : return ENOMEM;
1940 : }
1941 :
1942 : int ASN1CALL
1943 261824 : add_AuthorizationData(AuthorizationData *data, const AuthorizationDataElement *element)
1944 : {
1945 : int ret;
1946 : void *ptr;
1947 :
1948 261824 : ptr = realloc(data->val,
1949 261824 : (data->len + 1) * sizeof(data->val[0]));
1950 261824 : if (ptr == NULL) return ENOMEM;
1951 261824 : data->val = ptr;
1952 :
1953 261824 : ret = copy_AuthorizationDataElement(element, &data->val[data->len]);
1954 261824 : if (ret) return ret;
1955 261824 : data->len++;
1956 261824 : return 0;
1957 : }
1958 :
1959 : int ASN1CALL
1960 0 : remove_AuthorizationData(AuthorizationData *data, unsigned int element)
1961 : {
1962 : void *ptr;
1963 :
1964 0 : if (data->len == 0 || element >= data->len)
1965 0 : return ASN1_OVERRUN;
1966 0 : free_AuthorizationDataElement(&data->val[element]);
1967 0 : data->len--;
1968 0 : if (element < data->len)
1969 0 : memmove(&data->val[element], &data->val[element + 1],
1970 0 : sizeof(data->val[0]) * data->len);
1971 0 : ptr = realloc(data->val, data->len * sizeof(data->val[0]));
1972 0 : if (ptr != NULL || data->len == 0) data->val = ptr;
1973 0 : return 0;
1974 : }
1975 :
1976 : int ASN1CALL
1977 68110 : encode_APOptions(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const APOptions *data, size_t *size)
1978 : {
1979 68110 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
1980 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
1981 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
1982 :
1983 : {
1984 68110 : unsigned char c = 0;
1985 68110 : if (len < 1) return ASN1_OVERFLOW;
1986 68110 : *p-- = c; len--; ret++;
1987 68110 : c = 0;
1988 68110 : if (len < 1) return ASN1_OVERFLOW;
1989 68110 : *p-- = c; len--; ret++;
1990 68110 : c = 0;
1991 68110 : if (len < 1) return ASN1_OVERFLOW;
1992 68110 : *p-- = c; len--; ret++;
1993 68110 : c = 0;
1994 68110 : if((data)->mutual_required) {
1995 20366 : c |= 1<<5;
1996 : }
1997 68110 : if((data)->use_session_key) {
1998 0 : c |= 1<<6;
1999 : }
2000 68110 : if((data)->reserved) {
2001 0 : c |= 1<<7;
2002 : }
2003 68110 : if (len < 1) return ASN1_OVERFLOW;
2004 68110 : *p-- = c; len--; ret++;
2005 68110 : if (len < 1) return ASN1_OVERFLOW;
2006 68110 : *p-- = 0;
2007 68110 : len -= 1;
2008 68110 : ret += 1;
2009 : }
2010 :
2011 68110 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_BitString, &l);
2012 68110 : if (e) return e;
2013 68110 : p -= l; len -= l; ret += l;
2014 :
2015 68110 : *size = ret;
2016 68110 : return 0;
2017 : }
2018 :
2019 : int ASN1CALL
2020 63408 : decode_APOptions(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, APOptions *data, size_t *size)
2021 : {
2022 63408 : size_t ret = 0;
2023 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
2024 : int e HEIMDAL_UNUSED_ATTRIBUTE;
2025 :
2026 63408 : memset(data, 0, sizeof(*data));
2027 : {
2028 : size_t Top_datalen, Top_oldlen;
2029 : Der_type Top_type;
2030 63408 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_BitString, &Top_datalen, &l);
2031 63408 : if (e == 0 && Top_type != PRIM) { e = ASN1_BAD_ID; }
2032 63408 : if(e) goto fail;
2033 63408 : p += l; len -= l; ret += l;
2034 63408 : Top_oldlen = len;
2035 63408 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
2036 63408 : len = Top_datalen;
2037 63408 : if (len < 1) return ASN1_OVERRUN;
2038 63408 : p++; len--; ret++;
2039 : do {
2040 63408 : if (len < 1) break;
2041 63408 : (data)->reserved = (*p >> 7) & 1;
2042 63408 : (data)->use_session_key = (*p >> 6) & 1;
2043 63408 : (data)->mutual_required = (*p >> 5) & 1;
2044 : } while(0);
2045 63408 : p += len; ret += len;
2046 63408 : len = Top_oldlen - Top_datalen;
2047 : }
2048 126816 : if(size) *size = ret;
2049 61581 : return 0;
2050 0 : fail:
2051 0 : free_APOptions(data);
2052 0 : return e;
2053 : }
2054 :
2055 : void ASN1CALL
2056 131518 : free_APOptions(APOptions *data)
2057 : {
2058 131518 : }
2059 :
2060 : size_t ASN1CALL
2061 68110 : length_APOptions(const APOptions *data)
2062 : {
2063 68110 : size_t ret = 0;
2064 68110 : ret += 5;
2065 68110 : ret += 1 + der_length_len (ret);
2066 68110 : return ret;
2067 : }
2068 :
2069 : int ASN1CALL
2070 0 : copy_APOptions(const APOptions *from, APOptions *to)
2071 : {
2072 0 : memset(to, 0, sizeof(*to));
2073 0 : *(to) = *(from);
2074 0 : return 0;
2075 : }
2076 :
2077 0 : unsigned APOptions2int(APOptions f)
2078 : {
2079 0 : unsigned r = 0;
2080 0 : if(f.reserved) r |= (1U << 0);
2081 0 : if(f.use_session_key) r |= (1U << 1);
2082 0 : if(f.mutual_required) r |= (1U << 2);
2083 0 : return r;
2084 : }
2085 :
2086 0 : APOptions int2APOptions(unsigned n)
2087 : {
2088 : APOptions flags;
2089 :
2090 0 : memset(&flags, 0, sizeof(flags));
2091 :
2092 0 : flags.reserved = (n >> 0) & 1;
2093 0 : flags.use_session_key = (n >> 1) & 1;
2094 0 : flags.mutual_required = (n >> 2) & 1;
2095 0 : return flags;
2096 : }
2097 :
2098 : static struct units APOptions_units[] = {
2099 : {"mutual-required", 1U << 2},
2100 : {"use-session-key", 1U << 1},
2101 : {"reserved", 1U << 0},
2102 : {NULL, 0}
2103 : };
2104 :
2105 0 : const struct units * asn1_APOptions_units(void){
2106 0 : return APOptions_units;
2107 : }
2108 :
2109 : int ASN1CALL
2110 151213 : encode_TicketFlags(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const TicketFlags *data, size_t *size)
2111 : {
2112 151213 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
2113 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
2114 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
2115 :
2116 : {
2117 151213 : unsigned char c = 0;
2118 151213 : if (len < 1) return ASN1_OVERFLOW;
2119 151213 : *p-- = c; len--; ret++;
2120 151213 : c = 0;
2121 151213 : if (len < 1) return ASN1_OVERFLOW;
2122 151213 : *p-- = c; len--; ret++;
2123 151213 : c = 0;
2124 151213 : if((data)->enc_pa_rep) {
2125 0 : c |= 1<<0;
2126 : }
2127 151213 : if((data)->anonymous) {
2128 0 : c |= 1<<1;
2129 : }
2130 151213 : if((data)->ok_as_delegate) {
2131 89004 : c |= 1<<2;
2132 : }
2133 151213 : if((data)->transited_policy_checked) {
2134 98527 : c |= 1<<3;
2135 : }
2136 151213 : if((data)->hw_authent) {
2137 0 : c |= 1<<4;
2138 : }
2139 151213 : if((data)->pre_authent) {
2140 151213 : c |= 1<<5;
2141 : }
2142 151213 : if((data)->initial) {
2143 52686 : c |= 1<<6;
2144 : }
2145 151213 : if((data)->renewable) {
2146 340 : c |= 1<<7;
2147 : }
2148 151213 : if (len < 1) return ASN1_OVERFLOW;
2149 151213 : *p-- = c; len--; ret++;
2150 151213 : c = 0;
2151 151213 : if((data)->invalid) {
2152 0 : c |= 1<<0;
2153 : }
2154 151213 : if((data)->postdated) {
2155 0 : c |= 1<<1;
2156 : }
2157 151213 : if((data)->may_postdate) {
2158 0 : c |= 1<<2;
2159 : }
2160 151213 : if((data)->proxy) {
2161 0 : c |= 1<<3;
2162 : }
2163 151213 : if((data)->proxiable) {
2164 0 : c |= 1<<4;
2165 : }
2166 151213 : if((data)->forwarded) {
2167 57935 : c |= 1<<5;
2168 : }
2169 151213 : if((data)->forwardable) {
2170 98703 : c |= 1<<6;
2171 : }
2172 151213 : if((data)->reserved) {
2173 0 : c |= 1<<7;
2174 : }
2175 151213 : if (len < 1) return ASN1_OVERFLOW;
2176 151213 : *p-- = c; len--; ret++;
2177 151213 : if (len < 1) return ASN1_OVERFLOW;
2178 151213 : *p-- = 0;
2179 151213 : len -= 1;
2180 151213 : ret += 1;
2181 : }
2182 :
2183 151213 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_BitString, &l);
2184 151213 : if (e) return e;
2185 151213 : p -= l; len -= l; ret += l;
2186 :
2187 151213 : *size = ret;
2188 151213 : return 0;
2189 : }
2190 :
2191 : int ASN1CALL
2192 134139 : decode_TicketFlags(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, TicketFlags *data, size_t *size)
2193 : {
2194 134139 : size_t ret = 0;
2195 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
2196 : int e HEIMDAL_UNUSED_ATTRIBUTE;
2197 :
2198 134139 : memset(data, 0, sizeof(*data));
2199 : {
2200 : size_t Top_datalen, Top_oldlen;
2201 : Der_type Top_type;
2202 134139 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_BitString, &Top_datalen, &l);
2203 134139 : if (e == 0 && Top_type != PRIM) { e = ASN1_BAD_ID; }
2204 134139 : if(e) goto fail;
2205 134139 : p += l; len -= l; ret += l;
2206 134139 : Top_oldlen = len;
2207 134139 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
2208 134139 : len = Top_datalen;
2209 134139 : if (len < 1) return ASN1_OVERRUN;
2210 134139 : p++; len--; ret++;
2211 : do {
2212 134139 : if (len < 1) break;
2213 134139 : (data)->reserved = (*p >> 7) & 1;
2214 134139 : (data)->forwardable = (*p >> 6) & 1;
2215 134139 : (data)->forwarded = (*p >> 5) & 1;
2216 134139 : (data)->proxiable = (*p >> 4) & 1;
2217 134139 : (data)->proxy = (*p >> 3) & 1;
2218 134139 : (data)->may_postdate = (*p >> 2) & 1;
2219 134139 : (data)->postdated = (*p >> 1) & 1;
2220 134139 : (data)->invalid = (*p >> 0) & 1;
2221 134139 : p++; len--; ret++;
2222 134139 : if (len < 1) break;
2223 134139 : (data)->renewable = (*p >> 7) & 1;
2224 134139 : (data)->initial = (*p >> 6) & 1;
2225 134139 : (data)->pre_authent = (*p >> 5) & 1;
2226 134139 : (data)->hw_authent = (*p >> 4) & 1;
2227 134139 : (data)->transited_policy_checked = (*p >> 3) & 1;
2228 134139 : (data)->ok_as_delegate = (*p >> 2) & 1;
2229 134139 : (data)->anonymous = (*p >> 1) & 1;
2230 134139 : (data)->enc_pa_rep = (*p >> 0) & 1;
2231 : } while(0);
2232 134139 : p += len; ret += len;
2233 134139 : len = Top_oldlen - Top_datalen;
2234 : }
2235 268278 : if(size) *size = ret;
2236 130190 : return 0;
2237 0 : fail:
2238 0 : free_TicketFlags(data);
2239 0 : return e;
2240 : }
2241 :
2242 : void ASN1CALL
2243 329157 : free_TicketFlags(TicketFlags *data)
2244 : {
2245 329157 : }
2246 :
2247 : size_t ASN1CALL
2248 151213 : length_TicketFlags(const TicketFlags *data)
2249 : {
2250 151213 : size_t ret = 0;
2251 151213 : ret += 5;
2252 151213 : ret += 1 + der_length_len (ret);
2253 151213 : return ret;
2254 : }
2255 :
2256 : int ASN1CALL
2257 34879 : copy_TicketFlags(const TicketFlags *from, TicketFlags *to)
2258 : {
2259 34879 : memset(to, 0, sizeof(*to));
2260 34879 : *(to) = *(from);
2261 34879 : return 0;
2262 : }
2263 :
2264 1349 : unsigned TicketFlags2int(TicketFlags f)
2265 : {
2266 1349 : unsigned r = 0;
2267 1349 : if(f.reserved) r |= (1U << 0);
2268 1349 : if(f.forwardable) r |= (1U << 1);
2269 1349 : if(f.forwarded) r |= (1U << 2);
2270 1349 : if(f.proxiable) r |= (1U << 3);
2271 1349 : if(f.proxy) r |= (1U << 4);
2272 1349 : if(f.may_postdate) r |= (1U << 5);
2273 1349 : if(f.postdated) r |= (1U << 6);
2274 1349 : if(f.invalid) r |= (1U << 7);
2275 1349 : if(f.renewable) r |= (1U << 8);
2276 1349 : if(f.initial) r |= (1U << 9);
2277 1349 : if(f.pre_authent) r |= (1U << 10);
2278 1349 : if(f.hw_authent) r |= (1U << 11);
2279 1349 : if(f.transited_policy_checked) r |= (1U << 12);
2280 1349 : if(f.ok_as_delegate) r |= (1U << 13);
2281 1349 : if(f.anonymous) r |= (1U << 14);
2282 1349 : if(f.enc_pa_rep) r |= (1U << 15);
2283 1349 : return r;
2284 : }
2285 :
2286 0 : TicketFlags int2TicketFlags(unsigned n)
2287 : {
2288 : TicketFlags flags;
2289 :
2290 0 : memset(&flags, 0, sizeof(flags));
2291 :
2292 0 : flags.reserved = (n >> 0) & 1;
2293 0 : flags.forwardable = (n >> 1) & 1;
2294 0 : flags.forwarded = (n >> 2) & 1;
2295 0 : flags.proxiable = (n >> 3) & 1;
2296 0 : flags.proxy = (n >> 4) & 1;
2297 0 : flags.may_postdate = (n >> 5) & 1;
2298 0 : flags.postdated = (n >> 6) & 1;
2299 0 : flags.invalid = (n >> 7) & 1;
2300 0 : flags.renewable = (n >> 8) & 1;
2301 0 : flags.initial = (n >> 9) & 1;
2302 0 : flags.pre_authent = (n >> 10) & 1;
2303 0 : flags.hw_authent = (n >> 11) & 1;
2304 0 : flags.transited_policy_checked = (n >> 12) & 1;
2305 0 : flags.ok_as_delegate = (n >> 13) & 1;
2306 0 : flags.anonymous = (n >> 14) & 1;
2307 0 : flags.enc_pa_rep = (n >> 15) & 1;
2308 0 : return flags;
2309 : }
2310 :
2311 : static struct units TicketFlags_units[] = {
2312 : {"enc-pa-rep", 1U << 15},
2313 : {"anonymous", 1U << 14},
2314 : {"ok-as-delegate", 1U << 13},
2315 : {"transited-policy-checked", 1U << 12},
2316 : {"hw-authent", 1U << 11},
2317 : {"pre-authent", 1U << 10},
2318 : {"initial", 1U << 9},
2319 : {"renewable", 1U << 8},
2320 : {"invalid", 1U << 7},
2321 : {"postdated", 1U << 6},
2322 : {"may-postdate", 1U << 5},
2323 : {"proxy", 1U << 4},
2324 : {"proxiable", 1U << 3},
2325 : {"forwarded", 1U << 2},
2326 : {"forwardable", 1U << 1},
2327 : {"reserved", 1U << 0},
2328 : {NULL, 0}
2329 : };
2330 :
2331 0 : const struct units * asn1_TicketFlags_units(void){
2332 0 : return TicketFlags_units;
2333 : }
2334 :
2335 : int ASN1CALL
2336 167372 : encode_KDCOptions(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const KDCOptions *data, size_t *size)
2337 : {
2338 167372 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
2339 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
2340 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
2341 :
2342 : {
2343 167372 : unsigned char c = 0;
2344 167372 : if((data)->validate) {
2345 0 : c |= 1<<0;
2346 : }
2347 167372 : if((data)->renew) {
2348 90 : c |= 1<<1;
2349 : }
2350 167372 : if((data)->enc_tkt_in_skey) {
2351 0 : c |= 1<<3;
2352 : }
2353 167372 : if((data)->renewable_ok) {
2354 17 : c |= 1<<4;
2355 : }
2356 167372 : if((data)->disable_transited_check) {
2357 0 : c |= 1<<5;
2358 : }
2359 167372 : if (len < 1) return ASN1_OVERFLOW;
2360 167372 : *p-- = c; len--; ret++;
2361 167372 : c = 0;
2362 167372 : if((data)->constrained_delegation) {
2363 67 : c |= 1<<7;
2364 : }
2365 167372 : if (len < 1) return ASN1_OVERFLOW;
2366 167372 : *p-- = c; len--; ret++;
2367 167372 : c = 0;
2368 167372 : if((data)->canonicalize) {
2369 97082 : c |= 1<<0;
2370 : }
2371 167372 : if((data)->request_anonymous) {
2372 67 : c |= 1<<1;
2373 : }
2374 167372 : if((data)->renewable) {
2375 240 : c |= 1<<7;
2376 : }
2377 167372 : if (len < 1) return ASN1_OVERFLOW;
2378 167372 : *p-- = c; len--; ret++;
2379 167372 : c = 0;
2380 167372 : if((data)->postdated) {
2381 1 : c |= 1<<1;
2382 : }
2383 167372 : if((data)->allow_postdate) {
2384 1 : c |= 1<<2;
2385 : }
2386 167372 : if((data)->proxy) {
2387 1 : c |= 1<<3;
2388 : }
2389 167372 : if((data)->proxiable) {
2390 1 : c |= 1<<4;
2391 : }
2392 167372 : if((data)->forwarded) {
2393 58150 : c |= 1<<5;
2394 : }
2395 167372 : if((data)->forwardable) {
2396 85821 : c |= 1<<6;
2397 : }
2398 167372 : if((data)->reserved) {
2399 1 : c |= 1<<7;
2400 : }
2401 167372 : if (len < 1) return ASN1_OVERFLOW;
2402 167372 : *p-- = c; len--; ret++;
2403 167372 : if (len < 1) return ASN1_OVERFLOW;
2404 167372 : *p-- = 0;
2405 167372 : len -= 1;
2406 167372 : ret += 1;
2407 : }
2408 :
2409 167372 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_BitString, &l);
2410 167372 : if (e) return e;
2411 167372 : p -= l; len -= l; ret += l;
2412 :
2413 167372 : *size = ret;
2414 167372 : return 0;
2415 : }
2416 :
2417 : int ASN1CALL
2418 104664 : decode_KDCOptions(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, KDCOptions *data, size_t *size)
2419 : {
2420 104664 : size_t ret = 0;
2421 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
2422 : int e HEIMDAL_UNUSED_ATTRIBUTE;
2423 :
2424 104664 : memset(data, 0, sizeof(*data));
2425 : {
2426 : size_t Top_datalen, Top_oldlen;
2427 : Der_type Top_type;
2428 104664 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_BitString, &Top_datalen, &l);
2429 104664 : if (e == 0 && Top_type != PRIM) { e = ASN1_BAD_ID; }
2430 104664 : if(e) goto fail;
2431 104664 : p += l; len -= l; ret += l;
2432 104664 : Top_oldlen = len;
2433 104664 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
2434 104664 : len = Top_datalen;
2435 104664 : if (len < 1) return ASN1_OVERRUN;
2436 104664 : p++; len--; ret++;
2437 : do {
2438 104664 : if (len < 1) break;
2439 104664 : (data)->reserved = (*p >> 7) & 1;
2440 104664 : (data)->forwardable = (*p >> 6) & 1;
2441 104664 : (data)->forwarded = (*p >> 5) & 1;
2442 104664 : (data)->proxiable = (*p >> 4) & 1;
2443 104664 : (data)->proxy = (*p >> 3) & 1;
2444 104664 : (data)->allow_postdate = (*p >> 2) & 1;
2445 104664 : (data)->postdated = (*p >> 1) & 1;
2446 104664 : p++; len--; ret++;
2447 104664 : if (len < 1) break;
2448 104664 : (data)->renewable = (*p >> 7) & 1;
2449 104664 : (data)->request_anonymous = (*p >> 1) & 1;
2450 104664 : (data)->canonicalize = (*p >> 0) & 1;
2451 104664 : p++; len--; ret++;
2452 104664 : if (len < 1) break;
2453 104664 : (data)->constrained_delegation = (*p >> 7) & 1;
2454 104664 : p++; len--; ret++;
2455 104664 : if (len < 1) break;
2456 104664 : (data)->disable_transited_check = (*p >> 5) & 1;
2457 104664 : (data)->renewable_ok = (*p >> 4) & 1;
2458 104664 : (data)->enc_tkt_in_skey = (*p >> 3) & 1;
2459 104664 : (data)->renew = (*p >> 1) & 1;
2460 104664 : (data)->validate = (*p >> 0) & 1;
2461 : } while(0);
2462 104664 : p += len; ret += len;
2463 104664 : len = Top_oldlen - Top_datalen;
2464 : }
2465 209328 : if(size) *size = ret;
2466 102690 : return 0;
2467 0 : fail:
2468 0 : free_KDCOptions(data);
2469 0 : return e;
2470 : }
2471 :
2472 : void ASN1CALL
2473 205672 : free_KDCOptions(KDCOptions *data)
2474 : {
2475 205672 : }
2476 :
2477 : size_t ASN1CALL
2478 167372 : length_KDCOptions(const KDCOptions *data)
2479 : {
2480 167372 : size_t ret = 0;
2481 167372 : ret += 5;
2482 167372 : ret += 1 + der_length_len (ret);
2483 167372 : return ret;
2484 : }
2485 :
2486 : int ASN1CALL
2487 0 : copy_KDCOptions(const KDCOptions *from, KDCOptions *to)
2488 : {
2489 0 : memset(to, 0, sizeof(*to));
2490 0 : *(to) = *(from);
2491 0 : return 0;
2492 : }
2493 :
2494 86360 : unsigned KDCOptions2int(KDCOptions f)
2495 : {
2496 86360 : unsigned r = 0;
2497 86360 : if(f.reserved) r |= (1U << 0);
2498 86360 : if(f.forwardable) r |= (1U << 1);
2499 86360 : if(f.forwarded) r |= (1U << 2);
2500 86360 : if(f.proxiable) r |= (1U << 3);
2501 86360 : if(f.proxy) r |= (1U << 4);
2502 86360 : if(f.allow_postdate) r |= (1U << 5);
2503 86360 : if(f.postdated) r |= (1U << 6);
2504 86360 : if(f.renewable) r |= (1U << 8);
2505 86360 : if(f.request_anonymous) r |= (1U << 14);
2506 86360 : if(f.canonicalize) r |= (1U << 15);
2507 86360 : if(f.constrained_delegation) r |= (1U << 16);
2508 86360 : if(f.disable_transited_check) r |= (1U << 26);
2509 86360 : if(f.renewable_ok) r |= (1U << 27);
2510 86360 : if(f.enc_tkt_in_skey) r |= (1U << 28);
2511 86360 : if(f.renew) r |= (1U << 30);
2512 86360 : if(f.validate) r |= (1U << 31);
2513 86360 : return r;
2514 : }
2515 :
2516 19370 : KDCOptions int2KDCOptions(unsigned n)
2517 : {
2518 : KDCOptions flags;
2519 :
2520 19370 : memset(&flags, 0, sizeof(flags));
2521 :
2522 19370 : flags.reserved = (n >> 0) & 1;
2523 19370 : flags.forwardable = (n >> 1) & 1;
2524 19370 : flags.forwarded = (n >> 2) & 1;
2525 19370 : flags.proxiable = (n >> 3) & 1;
2526 19370 : flags.proxy = (n >> 4) & 1;
2527 19370 : flags.allow_postdate = (n >> 5) & 1;
2528 19370 : flags.postdated = (n >> 6) & 1;
2529 19370 : flags.renewable = (n >> 8) & 1;
2530 19370 : flags.request_anonymous = (n >> 14) & 1;
2531 19370 : flags.canonicalize = (n >> 15) & 1;
2532 19370 : flags.constrained_delegation = (n >> 16) & 1;
2533 19370 : flags.disable_transited_check = (n >> 26) & 1;
2534 19370 : flags.renewable_ok = (n >> 27) & 1;
2535 19370 : flags.enc_tkt_in_skey = (n >> 28) & 1;
2536 19370 : flags.renew = (n >> 30) & 1;
2537 19370 : flags.validate = (n >> 31) & 1;
2538 19370 : return flags;
2539 : }
2540 :
2541 : static struct units KDCOptions_units[] = {
2542 : {"validate", 1U << 31},
2543 : {"renew", 1U << 30},
2544 : {"enc-tkt-in-skey", 1U << 28},
2545 : {"renewable-ok", 1U << 27},
2546 : {"disable-transited-check", 1U << 26},
2547 : {"constrained-delegation", 1U << 16},
2548 : {"canonicalize", 1U << 15},
2549 : {"request-anonymous", 1U << 14},
2550 : {"renewable", 1U << 8},
2551 : {"postdated", 1U << 6},
2552 : {"allow-postdate", 1U << 5},
2553 : {"proxy", 1U << 4},
2554 : {"proxiable", 1U << 3},
2555 : {"forwarded", 1U << 2},
2556 : {"forwardable", 1U << 1},
2557 : {"reserved", 1U << 0},
2558 : {NULL, 0}
2559 : };
2560 :
2561 66990 : const struct units * asn1_KDCOptions_units(void){
2562 66990 : return KDCOptions_units;
2563 : }
2564 :
2565 : int ASN1CALL
2566 66016 : encode_LR_TYPE(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const LR_TYPE *data, size_t *size)
2567 : {
2568 66016 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
2569 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
2570 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
2571 :
2572 : {
2573 66016 : int enumint = (int)*data;
2574 66016 : e = der_put_integer(p, len, &enumint, &l);
2575 66016 : if (e) return e;
2576 66016 : p -= l; len -= l; ret += l;
2577 :
2578 : }
2579 66016 : ;e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_Integer, &l);
2580 66016 : if (e) return e;
2581 66016 : p -= l; len -= l; ret += l;
2582 :
2583 66016 : *size = ret;
2584 66016 : return 0;
2585 : }
2586 :
2587 : int ASN1CALL
2588 52862 : decode_LR_TYPE(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, LR_TYPE *data, size_t *size)
2589 : {
2590 52862 : size_t ret = 0;
2591 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
2592 : int e HEIMDAL_UNUSED_ATTRIBUTE;
2593 :
2594 52862 : memset(data, 0, sizeof(*data));
2595 : {
2596 : size_t Top_datalen, Top_oldlen;
2597 : Der_type Top_type;
2598 52862 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Integer, &Top_datalen, &l);
2599 52862 : if (e == 0 && Top_type != PRIM) { e = ASN1_BAD_ID; }
2600 52862 : if(e) goto fail;
2601 52862 : p += l; len -= l; ret += l;
2602 52862 : Top_oldlen = len;
2603 52862 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
2604 52862 : len = Top_datalen;
2605 : {
2606 : int enumint;
2607 52862 : e = der_get_integer(p, len, &enumint, &l);
2608 52862 : if(e) goto fail;
2609 52862 : p += l; len -= l; ret += l;
2610 52862 : *data = enumint;
2611 : }
2612 52862 : len = Top_oldlen - Top_datalen;
2613 : }
2614 105724 : if(size) *size = ret;
2615 51478 : return 0;
2616 0 : fail:
2617 0 : free_LR_TYPE(data);
2618 0 : return e;
2619 : }
2620 :
2621 : void ASN1CALL
2622 132252 : free_LR_TYPE(LR_TYPE *data)
2623 : {
2624 132252 : }
2625 :
2626 : size_t ASN1CALL
2627 66016 : length_LR_TYPE(const LR_TYPE *data)
2628 : {
2629 66016 : size_t ret = 0;
2630 : {
2631 66016 : int enumint = *data;
2632 66016 : ret += der_length_integer(&enumint);
2633 : }
2634 66016 : ret += 1 + der_length_len (ret);
2635 66016 : return ret;
2636 : }
2637 :
2638 : int ASN1CALL
2639 13374 : copy_LR_TYPE(const LR_TYPE *from, LR_TYPE *to)
2640 : {
2641 13374 : memset(to, 0, sizeof(*to));
2642 13374 : *(to) = *(from);
2643 13374 : return 0;
2644 : }
2645 :
2646 : int ASN1CALL
2647 66016 : encode_LastReq(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const LastReq *data, size_t *size)
2648 : {
2649 66016 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
2650 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
2651 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
2652 :
2653 132032 : for(i = (int)(data)->len - 1; i >= 0; --i) {
2654 66016 : size_t Top_tag_for_oldret = ret;
2655 66016 : ret = 0;
2656 : /* lr-value */
2657 : {
2658 66016 : size_t Top_tag_S_Of_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
2659 66016 : ret = 0;
2660 66016 : e = encode_KerberosTime(p, len, &(&(data)->val[i])->lr_value, &l);
2661 66016 : if (e) return e;
2662 66016 : p -= l; len -= l; ret += l;
2663 :
2664 66016 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
2665 66016 : if (e) return e;
2666 66016 : p -= l; len -= l; ret += l;
2667 :
2668 66016 : ret += Top_tag_S_Of_tag_oldret;
2669 : }
2670 : /* lr-type */
2671 : {
2672 66016 : size_t Top_tag_S_Of_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
2673 66016 : ret = 0;
2674 66016 : e = encode_LR_TYPE(p, len, &(&(data)->val[i])->lr_type, &l);
2675 66016 : if (e) return e;
2676 66016 : p -= l; len -= l; ret += l;
2677 :
2678 66016 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
2679 66016 : if (e) return e;
2680 66016 : p -= l; len -= l; ret += l;
2681 :
2682 66016 : ret += Top_tag_S_Of_tag_oldret;
2683 : }
2684 66016 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
2685 66016 : if (e) return e;
2686 66016 : p -= l; len -= l; ret += l;
2687 :
2688 66016 : ret += Top_tag_for_oldret;
2689 : }
2690 66016 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
2691 66016 : if (e) return e;
2692 66016 : p -= l; len -= l; ret += l;
2693 :
2694 66016 : *size = ret;
2695 66016 : return 0;
2696 : }
2697 :
2698 : int ASN1CALL
2699 52862 : decode_LastReq(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, LastReq *data, size_t *size)
2700 : {
2701 52862 : size_t ret = 0;
2702 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
2703 : int e HEIMDAL_UNUSED_ATTRIBUTE;
2704 :
2705 52862 : memset(data, 0, sizeof(*data));
2706 : {
2707 : size_t Top_datalen, Top_oldlen;
2708 : Der_type Top_type;
2709 52862 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
2710 52862 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
2711 52862 : if(e) goto fail;
2712 52862 : p += l; len -= l; ret += l;
2713 52862 : Top_oldlen = len;
2714 52862 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
2715 52862 : len = Top_datalen;
2716 : {
2717 52862 : size_t Top_Tag_origlen = len;
2718 52862 : size_t Top_Tag_oldret = ret;
2719 52862 : size_t Top_Tag_olen = 0;
2720 : void *Top_Tag_tmp;
2721 52862 : ret = 0;
2722 52862 : (data)->len = 0;
2723 52862 : (data)->val = NULL;
2724 158586 : while(ret < Top_Tag_origlen) {
2725 52862 : size_t Top_Tag_nlen = Top_Tag_olen + sizeof(*((data)->val));
2726 52862 : if (Top_Tag_olen > Top_Tag_nlen) { e = ASN1_OVERFLOW; goto fail; }
2727 52862 : Top_Tag_olen = Top_Tag_nlen;
2728 52862 : Top_Tag_tmp = realloc((data)->val, Top_Tag_olen);
2729 52862 : if (Top_Tag_tmp == NULL) { e = ENOMEM; goto fail; }
2730 52862 : (data)->val = Top_Tag_tmp;
2731 : {
2732 : size_t Top_Tag_s_of_datalen, Top_Tag_s_of_oldlen;
2733 : Der_type Top_Tag_s_of_type;
2734 52862 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_Tag_s_of_type, UT_Sequence, &Top_Tag_s_of_datalen, &l);
2735 52862 : if (e == 0 && Top_Tag_s_of_type != CONS) { e = ASN1_BAD_ID; }
2736 52862 : if(e) goto fail;
2737 52862 : p += l; len -= l; ret += l;
2738 52862 : Top_Tag_s_of_oldlen = len;
2739 52862 : if (Top_Tag_s_of_datalen > len) { e = ASN1_OVERRUN; goto fail; }
2740 52862 : len = Top_Tag_s_of_datalen;
2741 : {
2742 : size_t lr_type_datalen, lr_type_oldlen;
2743 : Der_type lr_type_type;
2744 52862 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &lr_type_type, 0, &lr_type_datalen, &l);
2745 52862 : if (e == 0 && lr_type_type != CONS) { e = ASN1_BAD_ID; }
2746 52862 : if(e) goto fail;
2747 52862 : p += l; len -= l; ret += l;
2748 52862 : lr_type_oldlen = len;
2749 52862 : if (lr_type_datalen > len) { e = ASN1_OVERRUN; goto fail; }
2750 52862 : len = lr_type_datalen;
2751 52862 : e = decode_LR_TYPE(p, len, &(&(data)->val[(data)->len])->lr_type, &l);
2752 52862 : if(e) goto fail;
2753 52862 : p += l; len -= l; ret += l;
2754 52862 : len = lr_type_oldlen - lr_type_datalen;
2755 : }
2756 : {
2757 : size_t lr_value_datalen, lr_value_oldlen;
2758 : Der_type lr_value_type;
2759 52862 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &lr_value_type, 1, &lr_value_datalen, &l);
2760 104340 : if (e == 0 && lr_value_type != CONS) { e = ASN1_BAD_ID; }
2761 52862 : if(e) goto fail;
2762 52862 : p += l; len -= l; ret += l;
2763 52862 : lr_value_oldlen = len;
2764 52862 : if (lr_value_datalen > len) { e = ASN1_OVERRUN; goto fail; }
2765 52862 : len = lr_value_datalen;
2766 52862 : e = decode_KerberosTime(p, len, &(&(data)->val[(data)->len])->lr_value, &l);
2767 52862 : if(e) goto fail;
2768 52862 : p += l; len -= l; ret += l;
2769 52862 : len = lr_value_oldlen - lr_value_datalen;
2770 : }
2771 52862 : len = Top_Tag_s_of_oldlen - Top_Tag_s_of_datalen;
2772 : }
2773 52862 : (data)->len++;
2774 52862 : len = Top_Tag_origlen - ret;
2775 : }
2776 52862 : ret += Top_Tag_oldret;
2777 : }
2778 52862 : len = Top_oldlen - Top_datalen;
2779 : }
2780 105724 : if(size) *size = ret;
2781 51478 : return 0;
2782 0 : fail:
2783 0 : free_LastReq(data);
2784 0 : return e;
2785 : }
2786 :
2787 : void ASN1CALL
2788 180046 : free_LastReq(LastReq *data)
2789 : {
2790 492344 : while((data)->len){
2791 132252 : free_LR_TYPE(&(&(data)->val[(data)->len-1])->lr_type);
2792 132252 : free_KerberosTime(&(&(data)->val[(data)->len-1])->lr_value);
2793 132252 : (data)->len--;
2794 : }
2795 180046 : free((data)->val);
2796 180046 : (data)->val = NULL;
2797 180046 : }
2798 :
2799 : size_t ASN1CALL
2800 66016 : length_LastReq(const LastReq *data)
2801 : {
2802 66016 : size_t ret = 0;
2803 : {
2804 66016 : size_t Top_tag_oldret = ret;
2805 : int i;
2806 66016 : ret = 0;
2807 132032 : for(i = (data)->len - 1; i >= 0; --i){
2808 66016 : size_t Top_tag_for_oldret = ret;
2809 66016 : ret = 0;
2810 : {
2811 66016 : size_t Top_tag_S_Of_tag_oldret = ret;
2812 66016 : ret = 0;
2813 66016 : ret += length_LR_TYPE(&(&(data)->val[i])->lr_type);
2814 66016 : ret += 1 + der_length_len (ret);
2815 66016 : ret += Top_tag_S_Of_tag_oldret;
2816 : }
2817 : {
2818 66016 : size_t Top_tag_S_Of_tag_oldret = ret;
2819 66016 : ret = 0;
2820 66016 : ret += length_KerberosTime(&(&(data)->val[i])->lr_value);
2821 66016 : ret += 1 + der_length_len (ret);
2822 66016 : ret += Top_tag_S_Of_tag_oldret;
2823 : }
2824 66016 : ret += 1 + der_length_len (ret);
2825 66016 : ret += Top_tag_for_oldret;
2826 : }
2827 66016 : ret += Top_tag_oldret;
2828 : }
2829 66016 : ret += 1 + der_length_len (ret);
2830 66016 : return ret;
2831 : }
2832 :
2833 : int ASN1CALL
2834 13374 : copy_LastReq(const LastReq *from, LastReq *to)
2835 : {
2836 13374 : memset(to, 0, sizeof(*to));
2837 13374 : if(((to)->val = malloc((from)->len * sizeof(*(to)->val))) == NULL && (from)->len != 0)
2838 0 : goto fail;
2839 26748 : for((to)->len = 0; (to)->len < (from)->len; (to)->len++){
2840 13374 : if(copy_LR_TYPE(&(&(from)->val[(to)->len])->lr_type, &(&(to)->val[(to)->len])->lr_type)) goto fail;
2841 13374 : if(copy_KerberosTime(&(&(from)->val[(to)->len])->lr_value, &(&(to)->val[(to)->len])->lr_value)) goto fail;
2842 : }
2843 13079 : return 0;
2844 0 : fail:
2845 0 : free_LastReq(to);
2846 0 : return ENOMEM;
2847 : }
2848 :
2849 : int ASN1CALL
2850 417436 : encode_EncryptedData(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const EncryptedData *data, size_t *size)
2851 : {
2852 417436 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
2853 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
2854 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
2855 :
2856 : /* cipher */
2857 : {
2858 417436 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
2859 417436 : ret = 0;
2860 417436 : e = der_put_octet_string(p, len, &(data)->cipher, &l);
2861 417436 : if (e) return e;
2862 417436 : p -= l; len -= l; ret += l;
2863 :
2864 417436 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_OctetString, &l);
2865 417436 : if (e) return e;
2866 417436 : p -= l; len -= l; ret += l;
2867 :
2868 417436 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
2869 417436 : if (e) return e;
2870 417436 : p -= l; len -= l; ret += l;
2871 :
2872 417436 : ret += Top_tag_oldret;
2873 : }
2874 : /* kvno */
2875 417436 : if((data)->kvno) {
2876 250416 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
2877 250416 : ret = 0;
2878 250416 : e = encode_krb5int32(p, len, (data)->kvno, &l);
2879 250416 : if (e) return e;
2880 250416 : p -= l; len -= l; ret += l;
2881 :
2882 250416 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
2883 250416 : if (e) return e;
2884 250416 : p -= l; len -= l; ret += l;
2885 :
2886 250416 : ret += Top_tag_oldret;
2887 : }
2888 : /* etype */
2889 : {
2890 417436 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
2891 417436 : ret = 0;
2892 417436 : e = encode_ENCTYPE(p, len, &(data)->etype, &l);
2893 417436 : if (e) return e;
2894 417436 : p -= l; len -= l; ret += l;
2895 :
2896 417436 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
2897 417436 : if (e) return e;
2898 417436 : p -= l; len -= l; ret += l;
2899 :
2900 417436 : ret += Top_tag_oldret;
2901 : }
2902 417436 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
2903 417436 : if (e) return e;
2904 417436 : p -= l; len -= l; ret += l;
2905 :
2906 417436 : *size = ret;
2907 417436 : return 0;
2908 : }
2909 :
2910 : int ASN1CALL
2911 430982 : decode_EncryptedData(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, EncryptedData *data, size_t *size)
2912 : {
2913 430982 : size_t ret = 0;
2914 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
2915 : int e HEIMDAL_UNUSED_ATTRIBUTE;
2916 :
2917 430982 : memset(data, 0, sizeof(*data));
2918 : {
2919 : size_t Top_datalen, Top_oldlen;
2920 : Der_type Top_type;
2921 430982 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
2922 430982 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
2923 430982 : if(e) goto fail;
2924 430982 : p += l; len -= l; ret += l;
2925 430982 : Top_oldlen = len;
2926 430982 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
2927 430982 : len = Top_datalen;
2928 : {
2929 : size_t etype_datalen, etype_oldlen;
2930 : Der_type etype_type;
2931 430982 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &etype_type, 0, &etype_datalen, &l);
2932 430982 : if (e == 0 && etype_type != CONS) { e = ASN1_BAD_ID; }
2933 430982 : if(e) goto fail;
2934 430982 : p += l; len -= l; ret += l;
2935 430982 : etype_oldlen = len;
2936 430982 : if (etype_datalen > len) { e = ASN1_OVERRUN; goto fail; }
2937 430982 : len = etype_datalen;
2938 430982 : e = decode_ENCTYPE(p, len, &(data)->etype, &l);
2939 430982 : if(e) goto fail;
2940 430982 : p += l; len -= l; ret += l;
2941 430982 : len = etype_oldlen - etype_datalen;
2942 : }
2943 : {
2944 : size_t kvno_datalen, kvno_oldlen;
2945 : Der_type kvno_type;
2946 430982 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &kvno_type, 1, &kvno_datalen, &l);
2947 674097 : if (e == 0 && kvno_type != CONS) { e = ASN1_BAD_ID; }
2948 430982 : if(e) {
2949 181034 : (data)->kvno = NULL;
2950 : } else {
2951 249948 : (data)->kvno = calloc(1, sizeof(*(data)->kvno));
2952 249948 : if ((data)->kvno == NULL) { e = ENOMEM; goto fail; }
2953 249948 : p += l; len -= l; ret += l;
2954 249948 : kvno_oldlen = len;
2955 249948 : if (kvno_datalen > len) { e = ASN1_OVERRUN; goto fail; }
2956 249948 : len = kvno_datalen;
2957 249948 : e = decode_krb5int32(p, len, (data)->kvno, &l);
2958 249948 : if(e) goto fail;
2959 249948 : p += l; len -= l; ret += l;
2960 249948 : len = kvno_oldlen - kvno_datalen;
2961 : }
2962 : }
2963 : {
2964 : size_t cipher_datalen, cipher_oldlen;
2965 : Der_type cipher_type;
2966 430982 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &cipher_type, 2, &cipher_datalen, &l);
2967 861964 : if (e == 0 && cipher_type != CONS) { e = ASN1_BAD_ID; }
2968 430982 : if(e) goto fail;
2969 430982 : p += l; len -= l; ret += l;
2970 430982 : cipher_oldlen = len;
2971 430982 : if (cipher_datalen > len) { e = ASN1_OVERRUN; goto fail; }
2972 430982 : len = cipher_datalen;
2973 : {
2974 : size_t cipher_Tag_datalen, cipher_Tag_oldlen;
2975 : Der_type cipher_Tag_type;
2976 430982 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &cipher_Tag_type, UT_OctetString, &cipher_Tag_datalen, &l);
2977 430982 : if (e == 0 && cipher_Tag_type != PRIM) { e = ASN1_BAD_ID; }
2978 430982 : if(e) goto fail;
2979 430982 : p += l; len -= l; ret += l;
2980 430982 : cipher_Tag_oldlen = len;
2981 430982 : if (cipher_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
2982 430982 : len = cipher_Tag_datalen;
2983 430982 : e = der_get_octet_string(p, len, &(data)->cipher, &l);
2984 430982 : if(e) goto fail;
2985 430982 : p += l; len -= l; ret += l;
2986 430982 : len = cipher_Tag_oldlen - cipher_Tag_datalen;
2987 : }
2988 430982 : len = cipher_oldlen - cipher_datalen;
2989 : }
2990 430982 : len = Top_oldlen - Top_datalen;
2991 : }
2992 861964 : if(size) *size = ret;
2993 419071 : return 0;
2994 0 : fail:
2995 0 : free_EncryptedData(data);
2996 0 : return e;
2997 : }
2998 :
2999 : void ASN1CALL
3000 868225 : free_EncryptedData(EncryptedData *data)
3001 : {
3002 868225 : free_ENCTYPE(&(data)->etype);
3003 868225 : if((data)->kvno) {
3004 409589 : free_krb5int32((data)->kvno);
3005 409589 : free((data)->kvno);
3006 409589 : (data)->kvno = NULL;
3007 : }
3008 868225 : der_free_octet_string(&(data)->cipher);
3009 868225 : }
3010 :
3011 : size_t ASN1CALL
3012 417436 : length_EncryptedData(const EncryptedData *data)
3013 : {
3014 417436 : size_t ret = 0;
3015 : {
3016 417436 : size_t Top_tag_oldret = ret;
3017 417436 : ret = 0;
3018 417436 : ret += length_ENCTYPE(&(data)->etype);
3019 417436 : ret += 1 + der_length_len (ret);
3020 417436 : ret += Top_tag_oldret;
3021 : }
3022 417436 : if((data)->kvno){
3023 250416 : size_t Top_tag_oldret = ret;
3024 250416 : ret = 0;
3025 250416 : ret += length_krb5int32((data)->kvno);
3026 250416 : ret += 1 + der_length_len (ret);
3027 250416 : ret += Top_tag_oldret;
3028 : }
3029 : {
3030 417436 : size_t Top_tag_oldret = ret;
3031 417436 : ret = 0;
3032 417436 : ret += der_length_octet_string(&(data)->cipher);
3033 417436 : ret += 1 + der_length_len (ret);
3034 417436 : ret += 1 + der_length_len (ret);
3035 417436 : ret += Top_tag_oldret;
3036 : }
3037 417436 : ret += 1 + der_length_len (ret);
3038 417436 : return ret;
3039 : }
3040 :
3041 : int ASN1CALL
3042 68152 : copy_EncryptedData(const EncryptedData *from, EncryptedData *to)
3043 : {
3044 68152 : memset(to, 0, sizeof(*to));
3045 68152 : if(copy_ENCTYPE(&(from)->etype, &(to)->etype)) goto fail;
3046 68152 : if((from)->kvno) {
3047 67834 : (to)->kvno = malloc(sizeof(*(to)->kvno));
3048 67834 : if((to)->kvno == NULL) goto fail;
3049 67834 : if(copy_krb5int32((from)->kvno, (to)->kvno)) goto fail;
3050 : }else
3051 318 : (to)->kvno = NULL;
3052 68152 : if(der_copy_octet_string(&(from)->cipher, &(to)->cipher)) goto fail;
3053 66313 : return 0;
3054 0 : fail:
3055 0 : free_EncryptedData(to);
3056 0 : return ENOMEM;
3057 : }
3058 :
3059 : int ASN1CALL
3060 234017 : encode_EncryptionKey(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const EncryptionKey *data, size_t *size)
3061 : {
3062 234017 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
3063 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
3064 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
3065 :
3066 : /* keyvalue */
3067 : {
3068 234017 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
3069 234017 : ret = 0;
3070 234017 : e = der_put_octet_string(p, len, &(data)->keyvalue, &l);
3071 234017 : if (e) return e;
3072 234017 : p -= l; len -= l; ret += l;
3073 :
3074 234017 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_OctetString, &l);
3075 234017 : if (e) return e;
3076 234017 : p -= l; len -= l; ret += l;
3077 :
3078 234017 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
3079 234017 : if (e) return e;
3080 234017 : p -= l; len -= l; ret += l;
3081 :
3082 234017 : ret += Top_tag_oldret;
3083 : }
3084 : /* keytype */
3085 : {
3086 234017 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
3087 234017 : ret = 0;
3088 234017 : e = encode_krb5int32(p, len, &(data)->keytype, &l);
3089 234017 : if (e) return e;
3090 234017 : p -= l; len -= l; ret += l;
3091 :
3092 234017 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
3093 234017 : if (e) return e;
3094 234017 : p -= l; len -= l; ret += l;
3095 :
3096 234017 : ret += Top_tag_oldret;
3097 : }
3098 234017 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
3099 234017 : if (e) return e;
3100 234017 : p -= l; len -= l; ret += l;
3101 :
3102 234017 : *size = ret;
3103 234017 : return 0;
3104 : }
3105 :
3106 : int ASN1CALL
3107 215972 : decode_EncryptionKey(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, EncryptionKey *data, size_t *size)
3108 : {
3109 215972 : size_t ret = 0;
3110 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
3111 : int e HEIMDAL_UNUSED_ATTRIBUTE;
3112 :
3113 215972 : memset(data, 0, sizeof(*data));
3114 : {
3115 : size_t Top_datalen, Top_oldlen;
3116 : Der_type Top_type;
3117 215972 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
3118 215972 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
3119 215972 : if(e) goto fail;
3120 215972 : p += l; len -= l; ret += l;
3121 215972 : Top_oldlen = len;
3122 215972 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
3123 215972 : len = Top_datalen;
3124 : {
3125 : size_t keytype_datalen, keytype_oldlen;
3126 : Der_type keytype_type;
3127 215972 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &keytype_type, 0, &keytype_datalen, &l);
3128 215972 : if (e == 0 && keytype_type != CONS) { e = ASN1_BAD_ID; }
3129 215972 : if(e) goto fail;
3130 215972 : p += l; len -= l; ret += l;
3131 215972 : keytype_oldlen = len;
3132 215972 : if (keytype_datalen > len) { e = ASN1_OVERRUN; goto fail; }
3133 215972 : len = keytype_datalen;
3134 215972 : e = decode_krb5int32(p, len, &(data)->keytype, &l);
3135 215972 : if(e) goto fail;
3136 215972 : p += l; len -= l; ret += l;
3137 215972 : len = keytype_oldlen - keytype_datalen;
3138 : }
3139 : {
3140 : size_t keyvalue_datalen, keyvalue_oldlen;
3141 : Der_type keyvalue_type;
3142 215972 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &keyvalue_type, 1, &keyvalue_datalen, &l);
3143 425430 : if (e == 0 && keyvalue_type != CONS) { e = ASN1_BAD_ID; }
3144 215972 : if(e) goto fail;
3145 215972 : p += l; len -= l; ret += l;
3146 215972 : keyvalue_oldlen = len;
3147 215972 : if (keyvalue_datalen > len) { e = ASN1_OVERRUN; goto fail; }
3148 215972 : len = keyvalue_datalen;
3149 : {
3150 : size_t keyvalue_Tag_datalen, keyvalue_Tag_oldlen;
3151 : Der_type keyvalue_Tag_type;
3152 215972 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &keyvalue_Tag_type, UT_OctetString, &keyvalue_Tag_datalen, &l);
3153 215972 : if (e == 0 && keyvalue_Tag_type != PRIM) { e = ASN1_BAD_ID; }
3154 215972 : if(e) goto fail;
3155 215972 : p += l; len -= l; ret += l;
3156 215972 : keyvalue_Tag_oldlen = len;
3157 215972 : if (keyvalue_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
3158 215972 : len = keyvalue_Tag_datalen;
3159 215972 : e = der_get_octet_string(p, len, &(data)->keyvalue, &l);
3160 215972 : if(e) goto fail;
3161 215972 : p += l; len -= l; ret += l;
3162 215972 : len = keyvalue_Tag_oldlen - keyvalue_Tag_datalen;
3163 : }
3164 215972 : len = keyvalue_oldlen - keyvalue_datalen;
3165 : }
3166 215972 : len = Top_oldlen - Top_datalen;
3167 : }
3168 431944 : if(size) *size = ret;
3169 209458 : return 0;
3170 0 : fail:
3171 0 : free_EncryptionKey(data);
3172 0 : return e;
3173 : }
3174 :
3175 : void ASN1CALL
3176 1318378 : free_EncryptionKey(EncryptionKey *data)
3177 : {
3178 1318378 : free_krb5int32(&(data)->keytype);
3179 1318378 : der_free_octet_string(&(data)->keyvalue);
3180 1318378 : }
3181 :
3182 : size_t ASN1CALL
3183 234017 : length_EncryptionKey(const EncryptionKey *data)
3184 : {
3185 234017 : size_t ret = 0;
3186 : {
3187 234017 : size_t Top_tag_oldret = ret;
3188 234017 : ret = 0;
3189 234017 : ret += length_krb5int32(&(data)->keytype);
3190 234017 : ret += 1 + der_length_len (ret);
3191 234017 : ret += Top_tag_oldret;
3192 : }
3193 : {
3194 234017 : size_t Top_tag_oldret = ret;
3195 234017 : ret = 0;
3196 234017 : ret += der_length_octet_string(&(data)->keyvalue);
3197 234017 : ret += 1 + der_length_len (ret);
3198 234017 : ret += 1 + der_length_len (ret);
3199 234017 : ret += Top_tag_oldret;
3200 : }
3201 234017 : ret += 1 + der_length_len (ret);
3202 234017 : return ret;
3203 : }
3204 :
3205 : int ASN1CALL
3206 3904620 : copy_EncryptionKey(const EncryptionKey *from, EncryptionKey *to)
3207 : {
3208 3904620 : memset(to, 0, sizeof(*to));
3209 3904620 : if(copy_krb5int32(&(from)->keytype, &(to)->keytype)) goto fail;
3210 3904620 : if(der_copy_octet_string(&(from)->keyvalue, &(to)->keyvalue)) goto fail;
3211 3799989 : return 0;
3212 0 : fail:
3213 0 : free_EncryptionKey(to);
3214 0 : return ENOMEM;
3215 : }
3216 :
3217 : int ASN1CALL
3218 66016 : encode_TransitedEncoding(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const TransitedEncoding *data, size_t *size)
3219 : {
3220 66016 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
3221 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
3222 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
3223 :
3224 : /* contents */
3225 : {
3226 66016 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
3227 66016 : ret = 0;
3228 66016 : e = der_put_octet_string(p, len, &(data)->contents, &l);
3229 66016 : if (e) return e;
3230 66016 : p -= l; len -= l; ret += l;
3231 :
3232 66016 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_OctetString, &l);
3233 66016 : if (e) return e;
3234 66016 : p -= l; len -= l; ret += l;
3235 :
3236 66016 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
3237 66016 : if (e) return e;
3238 66016 : p -= l; len -= l; ret += l;
3239 :
3240 66016 : ret += Top_tag_oldret;
3241 : }
3242 : /* tr-type */
3243 : {
3244 66016 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
3245 66016 : ret = 0;
3246 66016 : e = encode_krb5int32(p, len, &(data)->tr_type, &l);
3247 66016 : if (e) return e;
3248 66016 : p -= l; len -= l; ret += l;
3249 :
3250 66016 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
3251 66016 : if (e) return e;
3252 66016 : p -= l; len -= l; ret += l;
3253 :
3254 66016 : ret += Top_tag_oldret;
3255 : }
3256 66016 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
3257 66016 : if (e) return e;
3258 66016 : p -= l; len -= l; ret += l;
3259 :
3260 66016 : *size = ret;
3261 66016 : return 0;
3262 : }
3263 :
3264 : int ASN1CALL
3265 62255 : decode_TransitedEncoding(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, TransitedEncoding *data, size_t *size)
3266 : {
3267 62255 : size_t ret = 0;
3268 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
3269 : int e HEIMDAL_UNUSED_ATTRIBUTE;
3270 :
3271 62255 : memset(data, 0, sizeof(*data));
3272 : {
3273 : size_t Top_datalen, Top_oldlen;
3274 : Der_type Top_type;
3275 62255 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
3276 62255 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
3277 62255 : if(e) goto fail;
3278 62255 : p += l; len -= l; ret += l;
3279 62255 : Top_oldlen = len;
3280 62255 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
3281 62255 : len = Top_datalen;
3282 : {
3283 : size_t tr_type_datalen, tr_type_oldlen;
3284 : Der_type tr_type_type;
3285 62255 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &tr_type_type, 0, &tr_type_datalen, &l);
3286 62255 : if (e == 0 && tr_type_type != CONS) { e = ASN1_BAD_ID; }
3287 62255 : if(e) goto fail;
3288 62255 : p += l; len -= l; ret += l;
3289 62255 : tr_type_oldlen = len;
3290 62255 : if (tr_type_datalen > len) { e = ASN1_OVERRUN; goto fail; }
3291 62255 : len = tr_type_datalen;
3292 62255 : e = decode_krb5int32(p, len, &(data)->tr_type, &l);
3293 62255 : if(e) goto fail;
3294 62255 : p += l; len -= l; ret += l;
3295 62255 : len = tr_type_oldlen - tr_type_datalen;
3296 : }
3297 : {
3298 : size_t contents_datalen, contents_oldlen;
3299 : Der_type contents_type;
3300 62255 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &contents_type, 1, &contents_datalen, &l);
3301 122683 : if (e == 0 && contents_type != CONS) { e = ASN1_BAD_ID; }
3302 62255 : if(e) goto fail;
3303 62255 : p += l; len -= l; ret += l;
3304 62255 : contents_oldlen = len;
3305 62255 : if (contents_datalen > len) { e = ASN1_OVERRUN; goto fail; }
3306 62255 : len = contents_datalen;
3307 : {
3308 : size_t contents_Tag_datalen, contents_Tag_oldlen;
3309 : Der_type contents_Tag_type;
3310 62255 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &contents_Tag_type, UT_OctetString, &contents_Tag_datalen, &l);
3311 62255 : if (e == 0 && contents_Tag_type != PRIM) { e = ASN1_BAD_ID; }
3312 62255 : if(e) goto fail;
3313 62255 : p += l; len -= l; ret += l;
3314 62255 : contents_Tag_oldlen = len;
3315 62255 : if (contents_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
3316 62255 : len = contents_Tag_datalen;
3317 62255 : e = der_get_octet_string(p, len, &(data)->contents, &l);
3318 62255 : if(e) goto fail;
3319 62255 : p += l; len -= l; ret += l;
3320 62255 : len = contents_Tag_oldlen - contents_Tag_datalen;
3321 : }
3322 62255 : len = contents_oldlen - contents_datalen;
3323 : }
3324 62255 : len = Top_oldlen - Top_datalen;
3325 : }
3326 124510 : if(size) *size = ret;
3327 60428 : return 0;
3328 0 : fail:
3329 0 : free_TransitedEncoding(data);
3330 0 : return e;
3331 : }
3332 :
3333 : void ASN1CALL
3334 190650 : free_TransitedEncoding(TransitedEncoding *data)
3335 : {
3336 190650 : free_krb5int32(&(data)->tr_type);
3337 190650 : der_free_octet_string(&(data)->contents);
3338 190650 : }
3339 :
3340 : size_t ASN1CALL
3341 66016 : length_TransitedEncoding(const TransitedEncoding *data)
3342 : {
3343 66016 : size_t ret = 0;
3344 : {
3345 66016 : size_t Top_tag_oldret = ret;
3346 66016 : ret = 0;
3347 66016 : ret += length_krb5int32(&(data)->tr_type);
3348 66016 : ret += 1 + der_length_len (ret);
3349 66016 : ret += Top_tag_oldret;
3350 : }
3351 : {
3352 66016 : size_t Top_tag_oldret = ret;
3353 66016 : ret = 0;
3354 66016 : ret += der_length_octet_string(&(data)->contents);
3355 66016 : ret += 1 + der_length_len (ret);
3356 66016 : ret += 1 + der_length_len (ret);
3357 66016 : ret += Top_tag_oldret;
3358 : }
3359 66016 : ret += 1 + der_length_len (ret);
3360 66016 : return ret;
3361 : }
3362 :
3363 : int ASN1CALL
3364 21505 : copy_TransitedEncoding(const TransitedEncoding *from, TransitedEncoding *to)
3365 : {
3366 21505 : memset(to, 0, sizeof(*to));
3367 21505 : if(copy_krb5int32(&(from)->tr_type, &(to)->tr_type)) goto fail;
3368 21505 : if(der_copy_octet_string(&(from)->contents, &(to)->contents)) goto fail;
3369 20767 : return 0;
3370 0 : fail:
3371 0 : free_TransitedEncoding(to);
3372 0 : return ENOMEM;
3373 : }
3374 :
3375 : int ASN1CALL
3376 225273 : encode_Ticket(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const Ticket *data, size_t *size)
3377 : {
3378 225273 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
3379 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
3380 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
3381 :
3382 : /* enc-part */
3383 : {
3384 225273 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
3385 225273 : ret = 0;
3386 225273 : e = encode_EncryptedData(p, len, &(data)->enc_part, &l);
3387 225273 : if (e) return e;
3388 225273 : p -= l; len -= l; ret += l;
3389 :
3390 225273 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 3, &l);
3391 225273 : if (e) return e;
3392 225273 : p -= l; len -= l; ret += l;
3393 :
3394 225273 : ret += Top_tag_tag_oldret;
3395 : }
3396 : /* sname */
3397 : {
3398 225273 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
3399 225273 : ret = 0;
3400 225273 : e = encode_PrincipalName(p, len, &(data)->sname, &l);
3401 225273 : if (e) return e;
3402 225273 : p -= l; len -= l; ret += l;
3403 :
3404 225273 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
3405 225273 : if (e) return e;
3406 225273 : p -= l; len -= l; ret += l;
3407 :
3408 225273 : ret += Top_tag_tag_oldret;
3409 : }
3410 : /* realm */
3411 : {
3412 225273 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
3413 225273 : ret = 0;
3414 225273 : e = encode_Realm(p, len, &(data)->realm, &l);
3415 225273 : if (e) return e;
3416 225273 : p -= l; len -= l; ret += l;
3417 :
3418 225273 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
3419 225273 : if (e) return e;
3420 225273 : p -= l; len -= l; ret += l;
3421 :
3422 225273 : ret += Top_tag_tag_oldret;
3423 : }
3424 : /* tkt-vno */
3425 : {
3426 225273 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
3427 225273 : ret = 0;
3428 225273 : e = encode_krb5int32(p, len, &(data)->tkt_vno, &l);
3429 225273 : if (e) return e;
3430 225273 : p -= l; len -= l; ret += l;
3431 :
3432 225273 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
3433 225273 : if (e) return e;
3434 225273 : p -= l; len -= l; ret += l;
3435 :
3436 225273 : ret += Top_tag_tag_oldret;
3437 : }
3438 225273 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
3439 225273 : if (e) return e;
3440 225273 : p -= l; len -= l; ret += l;
3441 :
3442 225273 : e = der_put_length_and_tag (p, len, ret, ASN1_C_APPL, CONS, 1, &l);
3443 225273 : if (e) return e;
3444 225273 : p -= l; len -= l; ret += l;
3445 :
3446 225273 : *size = ret;
3447 225273 : return 0;
3448 : }
3449 :
3450 : int ASN1CALL
3451 234293 : decode_Ticket(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, Ticket *data, size_t *size)
3452 : {
3453 234293 : size_t ret = 0;
3454 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
3455 : int e HEIMDAL_UNUSED_ATTRIBUTE;
3456 :
3457 234293 : memset(data, 0, sizeof(*data));
3458 : {
3459 : size_t Top_datalen, Top_oldlen;
3460 : Der_type Top_type;
3461 234293 : e = der_match_tag_and_length(p, len, ASN1_C_APPL, &Top_type, 1, &Top_datalen, &l);
3462 234293 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
3463 234293 : if(e) goto fail;
3464 234293 : p += l; len -= l; ret += l;
3465 234293 : Top_oldlen = len;
3466 234293 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
3467 234293 : len = Top_datalen;
3468 : {
3469 : size_t Top_Tag_datalen, Top_Tag_oldlen;
3470 : Der_type Top_Tag_type;
3471 234293 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_Tag_type, UT_Sequence, &Top_Tag_datalen, &l);
3472 234293 : if (e == 0 && Top_Tag_type != CONS) { e = ASN1_BAD_ID; }
3473 234293 : if(e) goto fail;
3474 234293 : p += l; len -= l; ret += l;
3475 234293 : Top_Tag_oldlen = len;
3476 234293 : if (Top_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
3477 234293 : len = Top_Tag_datalen;
3478 : {
3479 : size_t tkt_vno_datalen, tkt_vno_oldlen;
3480 : Der_type tkt_vno_type;
3481 234293 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &tkt_vno_type, 0, &tkt_vno_datalen, &l);
3482 234293 : if (e == 0 && tkt_vno_type != CONS) { e = ASN1_BAD_ID; }
3483 234293 : if(e) goto fail;
3484 234293 : p += l; len -= l; ret += l;
3485 234293 : tkt_vno_oldlen = len;
3486 234293 : if (tkt_vno_datalen > len) { e = ASN1_OVERRUN; goto fail; }
3487 234293 : len = tkt_vno_datalen;
3488 234293 : e = decode_krb5int32(p, len, &(data)->tkt_vno, &l);
3489 234293 : if(e) goto fail;
3490 234293 : p += l; len -= l; ret += l;
3491 234293 : len = tkt_vno_oldlen - tkt_vno_datalen;
3492 : }
3493 : {
3494 : size_t realm_datalen, realm_oldlen;
3495 : Der_type realm_type;
3496 234293 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &realm_type, 1, &realm_datalen, &l);
3497 462048 : if (e == 0 && realm_type != CONS) { e = ASN1_BAD_ID; }
3498 234293 : if(e) goto fail;
3499 234293 : p += l; len -= l; ret += l;
3500 234293 : realm_oldlen = len;
3501 234293 : if (realm_datalen > len) { e = ASN1_OVERRUN; goto fail; }
3502 234293 : len = realm_datalen;
3503 234293 : e = decode_Realm(p, len, &(data)->realm, &l);
3504 234293 : if(e) goto fail;
3505 234293 : p += l; len -= l; ret += l;
3506 234293 : len = realm_oldlen - realm_datalen;
3507 : }
3508 : {
3509 : size_t sname_datalen, sname_oldlen;
3510 : Der_type sname_type;
3511 234293 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &sname_type, 2, &sname_datalen, &l);
3512 462048 : if (e == 0 && sname_type != CONS) { e = ASN1_BAD_ID; }
3513 234293 : if(e) goto fail;
3514 234293 : p += l; len -= l; ret += l;
3515 234293 : sname_oldlen = len;
3516 234293 : if (sname_datalen > len) { e = ASN1_OVERRUN; goto fail; }
3517 234293 : len = sname_datalen;
3518 234293 : e = decode_PrincipalName(p, len, &(data)->sname, &l);
3519 234293 : if(e) goto fail;
3520 234293 : p += l; len -= l; ret += l;
3521 234293 : len = sname_oldlen - sname_datalen;
3522 : }
3523 : {
3524 : size_t enc_part_datalen, enc_part_oldlen;
3525 : Der_type enc_part_type;
3526 234293 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &enc_part_type, 3, &enc_part_datalen, &l);
3527 462048 : if (e == 0 && enc_part_type != CONS) { e = ASN1_BAD_ID; }
3528 234293 : if(e) goto fail;
3529 234293 : p += l; len -= l; ret += l;
3530 234293 : enc_part_oldlen = len;
3531 234293 : if (enc_part_datalen > len) { e = ASN1_OVERRUN; goto fail; }
3532 234293 : len = enc_part_datalen;
3533 234293 : e = decode_EncryptedData(p, len, &(data)->enc_part, &l);
3534 234293 : if(e) goto fail;
3535 234293 : p += l; len -= l; ret += l;
3536 234293 : len = enc_part_oldlen - enc_part_datalen;
3537 : }
3538 234293 : len = Top_Tag_oldlen - Top_Tag_datalen;
3539 : }
3540 234293 : len = Top_oldlen - Top_datalen;
3541 : }
3542 468508 : if(size) *size = ret;
3543 227755 : return 0;
3544 0 : fail:
3545 0 : free_Ticket(data);
3546 0 : return e;
3547 : }
3548 :
3549 : void ASN1CALL
3550 423964 : free_Ticket(Ticket *data)
3551 : {
3552 423964 : free_krb5int32(&(data)->tkt_vno);
3553 423964 : free_Realm(&(data)->realm);
3554 423964 : free_PrincipalName(&(data)->sname);
3555 423964 : free_EncryptedData(&(data)->enc_part);
3556 423964 : }
3557 :
3558 : size_t ASN1CALL
3559 225273 : length_Ticket(const Ticket *data)
3560 : {
3561 225273 : size_t ret = 0;
3562 : {
3563 225273 : size_t Top_tag_tag_oldret = ret;
3564 225273 : ret = 0;
3565 225273 : ret += length_krb5int32(&(data)->tkt_vno);
3566 225273 : ret += 1 + der_length_len (ret);
3567 225273 : ret += Top_tag_tag_oldret;
3568 : }
3569 : {
3570 225273 : size_t Top_tag_tag_oldret = ret;
3571 225273 : ret = 0;
3572 225273 : ret += length_Realm(&(data)->realm);
3573 225273 : ret += 1 + der_length_len (ret);
3574 225273 : ret += Top_tag_tag_oldret;
3575 : }
3576 : {
3577 225273 : size_t Top_tag_tag_oldret = ret;
3578 225273 : ret = 0;
3579 225273 : ret += length_PrincipalName(&(data)->sname);
3580 225273 : ret += 1 + der_length_len (ret);
3581 225273 : ret += Top_tag_tag_oldret;
3582 : }
3583 : {
3584 225273 : size_t Top_tag_tag_oldret = ret;
3585 225273 : ret = 0;
3586 225273 : ret += length_EncryptedData(&(data)->enc_part);
3587 225273 : ret += 1 + der_length_len (ret);
3588 225273 : ret += Top_tag_tag_oldret;
3589 : }
3590 225273 : ret += 1 + der_length_len (ret);
3591 225273 : ret += 1 + der_length_len (ret);
3592 225273 : return ret;
3593 : }
3594 :
3595 : int ASN1CALL
3596 42 : copy_Ticket(const Ticket *from, Ticket *to)
3597 : {
3598 42 : memset(to, 0, sizeof(*to));
3599 42 : if(copy_krb5int32(&(from)->tkt_vno, &(to)->tkt_vno)) goto fail;
3600 42 : if(copy_Realm(&(from)->realm, &(to)->realm)) goto fail;
3601 42 : if(copy_PrincipalName(&(from)->sname, &(to)->sname)) goto fail;
3602 42 : if(copy_EncryptedData(&(from)->enc_part, &(to)->enc_part)) goto fail;
3603 42 : return 0;
3604 0 : fail:
3605 0 : free_Ticket(to);
3606 0 : return ENOMEM;
3607 : }
3608 :
3609 : int ASN1CALL
3610 66016 : encode_EncTicketPart(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const EncTicketPart *data, size_t *size)
3611 : {
3612 66016 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
3613 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
3614 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
3615 :
3616 : /* authorization-data */
3617 66016 : if((data)->authorization_data) {
3618 66016 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
3619 66016 : ret = 0;
3620 66016 : e = encode_AuthorizationData(p, len, (data)->authorization_data, &l);
3621 66016 : if (e) return e;
3622 66016 : p -= l; len -= l; ret += l;
3623 :
3624 66016 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 10, &l);
3625 66016 : if (e) return e;
3626 66016 : p -= l; len -= l; ret += l;
3627 :
3628 66016 : ret += Top_tag_tag_oldret;
3629 : }
3630 : /* caddr */
3631 66016 : if((data)->caddr) {
3632 169 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
3633 169 : ret = 0;
3634 169 : e = encode_HostAddresses(p, len, (data)->caddr, &l);
3635 169 : if (e) return e;
3636 169 : p -= l; len -= l; ret += l;
3637 :
3638 169 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 9, &l);
3639 169 : if (e) return e;
3640 169 : p -= l; len -= l; ret += l;
3641 :
3642 169 : ret += Top_tag_tag_oldret;
3643 : }
3644 : /* renew-till */
3645 66016 : if((data)->renew_till) {
3646 170 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
3647 170 : ret = 0;
3648 170 : e = encode_KerberosTime(p, len, (data)->renew_till, &l);
3649 170 : if (e) return e;
3650 170 : p -= l; len -= l; ret += l;
3651 :
3652 170 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 8, &l);
3653 170 : if (e) return e;
3654 170 : p -= l; len -= l; ret += l;
3655 :
3656 170 : ret += Top_tag_tag_oldret;
3657 : }
3658 : /* endtime */
3659 : {
3660 66016 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
3661 66016 : ret = 0;
3662 66016 : e = encode_KerberosTime(p, len, &(data)->endtime, &l);
3663 66016 : if (e) return e;
3664 66016 : p -= l; len -= l; ret += l;
3665 :
3666 66016 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 7, &l);
3667 66016 : if (e) return e;
3668 66016 : p -= l; len -= l; ret += l;
3669 :
3670 66016 : ret += Top_tag_tag_oldret;
3671 : }
3672 : /* starttime */
3673 66016 : if((data)->starttime) {
3674 39673 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
3675 39673 : ret = 0;
3676 39673 : e = encode_KerberosTime(p, len, (data)->starttime, &l);
3677 39673 : if (e) return e;
3678 39673 : p -= l; len -= l; ret += l;
3679 :
3680 39673 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 6, &l);
3681 39673 : if (e) return e;
3682 39673 : p -= l; len -= l; ret += l;
3683 :
3684 39673 : ret += Top_tag_tag_oldret;
3685 : }
3686 : /* authtime */
3687 : {
3688 66016 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
3689 66016 : ret = 0;
3690 66016 : e = encode_KerberosTime(p, len, &(data)->authtime, &l);
3691 66016 : if (e) return e;
3692 66016 : p -= l; len -= l; ret += l;
3693 :
3694 66016 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 5, &l);
3695 66016 : if (e) return e;
3696 66016 : p -= l; len -= l; ret += l;
3697 :
3698 66016 : ret += Top_tag_tag_oldret;
3699 : }
3700 : /* transited */
3701 : {
3702 66016 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
3703 66016 : ret = 0;
3704 66016 : e = encode_TransitedEncoding(p, len, &(data)->transited, &l);
3705 66016 : if (e) return e;
3706 66016 : p -= l; len -= l; ret += l;
3707 :
3708 66016 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 4, &l);
3709 66016 : if (e) return e;
3710 66016 : p -= l; len -= l; ret += l;
3711 :
3712 66016 : ret += Top_tag_tag_oldret;
3713 : }
3714 : /* cname */
3715 : {
3716 66016 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
3717 66016 : ret = 0;
3718 66016 : e = encode_PrincipalName(p, len, &(data)->cname, &l);
3719 66016 : if (e) return e;
3720 66016 : p -= l; len -= l; ret += l;
3721 :
3722 66016 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 3, &l);
3723 66016 : if (e) return e;
3724 66016 : p -= l; len -= l; ret += l;
3725 :
3726 66016 : ret += Top_tag_tag_oldret;
3727 : }
3728 : /* crealm */
3729 : {
3730 66016 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
3731 66016 : ret = 0;
3732 66016 : e = encode_Realm(p, len, &(data)->crealm, &l);
3733 66016 : if (e) return e;
3734 66016 : p -= l; len -= l; ret += l;
3735 :
3736 66016 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
3737 66016 : if (e) return e;
3738 66016 : p -= l; len -= l; ret += l;
3739 :
3740 66016 : ret += Top_tag_tag_oldret;
3741 : }
3742 : /* key */
3743 : {
3744 66016 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
3745 66016 : ret = 0;
3746 66016 : e = encode_EncryptionKey(p, len, &(data)->key, &l);
3747 66016 : if (e) return e;
3748 66016 : p -= l; len -= l; ret += l;
3749 :
3750 66016 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
3751 66016 : if (e) return e;
3752 66016 : p -= l; len -= l; ret += l;
3753 :
3754 66016 : ret += Top_tag_tag_oldret;
3755 : }
3756 : /* flags */
3757 : {
3758 66016 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
3759 66016 : ret = 0;
3760 66016 : e = encode_TicketFlags(p, len, &(data)->flags, &l);
3761 66016 : if (e) return e;
3762 66016 : p -= l; len -= l; ret += l;
3763 :
3764 66016 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
3765 66016 : if (e) return e;
3766 66016 : p -= l; len -= l; ret += l;
3767 :
3768 66016 : ret += Top_tag_tag_oldret;
3769 : }
3770 66016 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
3771 66016 : if (e) return e;
3772 66016 : p -= l; len -= l; ret += l;
3773 :
3774 66016 : e = der_put_length_and_tag (p, len, ret, ASN1_C_APPL, CONS, 3, &l);
3775 66016 : if (e) return e;
3776 66016 : p -= l; len -= l; ret += l;
3777 :
3778 66016 : *size = ret;
3779 66016 : return 0;
3780 : }
3781 :
3782 : int ASN1CALL
3783 62255 : decode_EncTicketPart(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, EncTicketPart *data, size_t *size)
3784 : {
3785 62255 : size_t ret = 0;
3786 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
3787 : int e HEIMDAL_UNUSED_ATTRIBUTE;
3788 :
3789 62255 : memset(data, 0, sizeof(*data));
3790 : {
3791 : size_t Top_datalen, Top_oldlen;
3792 : Der_type Top_type;
3793 62255 : e = der_match_tag_and_length(p, len, ASN1_C_APPL, &Top_type, 3, &Top_datalen, &l);
3794 62255 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
3795 62255 : if(e) goto fail;
3796 62255 : p += l; len -= l; ret += l;
3797 62255 : Top_oldlen = len;
3798 62255 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
3799 62255 : len = Top_datalen;
3800 : {
3801 : size_t Top_Tag_datalen, Top_Tag_oldlen;
3802 : Der_type Top_Tag_type;
3803 62255 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_Tag_type, UT_Sequence, &Top_Tag_datalen, &l);
3804 62255 : if (e == 0 && Top_Tag_type != CONS) { e = ASN1_BAD_ID; }
3805 62255 : if(e) goto fail;
3806 62255 : p += l; len -= l; ret += l;
3807 62255 : Top_Tag_oldlen = len;
3808 62255 : if (Top_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
3809 62255 : len = Top_Tag_datalen;
3810 : {
3811 : size_t flags_datalen, flags_oldlen;
3812 : Der_type flags_type;
3813 62255 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &flags_type, 0, &flags_datalen, &l);
3814 62255 : if (e == 0 && flags_type != CONS) { e = ASN1_BAD_ID; }
3815 62255 : if(e) goto fail;
3816 62255 : p += l; len -= l; ret += l;
3817 62255 : flags_oldlen = len;
3818 62255 : if (flags_datalen > len) { e = ASN1_OVERRUN; goto fail; }
3819 62255 : len = flags_datalen;
3820 62255 : e = decode_TicketFlags(p, len, &(data)->flags, &l);
3821 62255 : if(e) goto fail;
3822 62255 : p += l; len -= l; ret += l;
3823 62255 : len = flags_oldlen - flags_datalen;
3824 : }
3825 : {
3826 : size_t key_datalen, key_oldlen;
3827 : Der_type key_type;
3828 62255 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &key_type, 1, &key_datalen, &l);
3829 122683 : if (e == 0 && key_type != CONS) { e = ASN1_BAD_ID; }
3830 62255 : if(e) goto fail;
3831 62255 : p += l; len -= l; ret += l;
3832 62255 : key_oldlen = len;
3833 62255 : if (key_datalen > len) { e = ASN1_OVERRUN; goto fail; }
3834 62255 : len = key_datalen;
3835 62255 : e = decode_EncryptionKey(p, len, &(data)->key, &l);
3836 62255 : if(e) goto fail;
3837 62255 : p += l; len -= l; ret += l;
3838 62255 : len = key_oldlen - key_datalen;
3839 : }
3840 : {
3841 : size_t crealm_datalen, crealm_oldlen;
3842 : Der_type crealm_type;
3843 62255 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &crealm_type, 2, &crealm_datalen, &l);
3844 122683 : if (e == 0 && crealm_type != CONS) { e = ASN1_BAD_ID; }
3845 62255 : if(e) goto fail;
3846 62255 : p += l; len -= l; ret += l;
3847 62255 : crealm_oldlen = len;
3848 62255 : if (crealm_datalen > len) { e = ASN1_OVERRUN; goto fail; }
3849 62255 : len = crealm_datalen;
3850 62255 : e = decode_Realm(p, len, &(data)->crealm, &l);
3851 62255 : if(e) goto fail;
3852 62255 : p += l; len -= l; ret += l;
3853 62255 : len = crealm_oldlen - crealm_datalen;
3854 : }
3855 : {
3856 : size_t cname_datalen, cname_oldlen;
3857 : Der_type cname_type;
3858 62255 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &cname_type, 3, &cname_datalen, &l);
3859 122683 : if (e == 0 && cname_type != CONS) { e = ASN1_BAD_ID; }
3860 62255 : if(e) goto fail;
3861 62255 : p += l; len -= l; ret += l;
3862 62255 : cname_oldlen = len;
3863 62255 : if (cname_datalen > len) { e = ASN1_OVERRUN; goto fail; }
3864 62255 : len = cname_datalen;
3865 62255 : e = decode_PrincipalName(p, len, &(data)->cname, &l);
3866 62255 : if(e) goto fail;
3867 62255 : p += l; len -= l; ret += l;
3868 62255 : len = cname_oldlen - cname_datalen;
3869 : }
3870 : {
3871 : size_t transited_datalen, transited_oldlen;
3872 : Der_type transited_type;
3873 62255 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &transited_type, 4, &transited_datalen, &l);
3874 122683 : if (e == 0 && transited_type != CONS) { e = ASN1_BAD_ID; }
3875 62255 : if(e) goto fail;
3876 62255 : p += l; len -= l; ret += l;
3877 62255 : transited_oldlen = len;
3878 62255 : if (transited_datalen > len) { e = ASN1_OVERRUN; goto fail; }
3879 62255 : len = transited_datalen;
3880 62255 : e = decode_TransitedEncoding(p, len, &(data)->transited, &l);
3881 62255 : if(e) goto fail;
3882 62255 : p += l; len -= l; ret += l;
3883 62255 : len = transited_oldlen - transited_datalen;
3884 : }
3885 : {
3886 : size_t authtime_datalen, authtime_oldlen;
3887 : Der_type authtime_type;
3888 62255 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &authtime_type, 5, &authtime_datalen, &l);
3889 122683 : if (e == 0 && authtime_type != CONS) { e = ASN1_BAD_ID; }
3890 62255 : if(e) goto fail;
3891 62255 : p += l; len -= l; ret += l;
3892 62255 : authtime_oldlen = len;
3893 62255 : if (authtime_datalen > len) { e = ASN1_OVERRUN; goto fail; }
3894 62255 : len = authtime_datalen;
3895 62255 : e = decode_KerberosTime(p, len, &(data)->authtime, &l);
3896 62255 : if(e) goto fail;
3897 62255 : p += l; len -= l; ret += l;
3898 62255 : len = authtime_oldlen - authtime_datalen;
3899 : }
3900 : {
3901 : size_t starttime_datalen, starttime_oldlen;
3902 : Der_type starttime_type;
3903 62255 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &starttime_type, 6, &starttime_datalen, &l);
3904 90846 : if (e == 0 && starttime_type != CONS) { e = ASN1_BAD_ID; }
3905 62255 : if(e) {
3906 32926 : (data)->starttime = NULL;
3907 : } else {
3908 29329 : (data)->starttime = calloc(1, sizeof(*(data)->starttime));
3909 29329 : if ((data)->starttime == NULL) { e = ENOMEM; goto fail; }
3910 29329 : p += l; len -= l; ret += l;
3911 29329 : starttime_oldlen = len;
3912 29329 : if (starttime_datalen > len) { e = ASN1_OVERRUN; goto fail; }
3913 29329 : len = starttime_datalen;
3914 29329 : e = decode_KerberosTime(p, len, (data)->starttime, &l);
3915 29329 : if(e) goto fail;
3916 29329 : p += l; len -= l; ret += l;
3917 29329 : len = starttime_oldlen - starttime_datalen;
3918 : }
3919 : }
3920 : {
3921 : size_t endtime_datalen, endtime_oldlen;
3922 : Der_type endtime_type;
3923 62255 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &endtime_type, 7, &endtime_datalen, &l);
3924 124510 : if (e == 0 && endtime_type != CONS) { e = ASN1_BAD_ID; }
3925 62255 : if(e) goto fail;
3926 62255 : p += l; len -= l; ret += l;
3927 62255 : endtime_oldlen = len;
3928 62255 : if (endtime_datalen > len) { e = ASN1_OVERRUN; goto fail; }
3929 62255 : len = endtime_datalen;
3930 62255 : e = decode_KerberosTime(p, len, &(data)->endtime, &l);
3931 62255 : if(e) goto fail;
3932 62255 : p += l; len -= l; ret += l;
3933 62255 : len = endtime_oldlen - endtime_datalen;
3934 : }
3935 : {
3936 : size_t renew_till_datalen, renew_till_oldlen;
3937 : Der_type renew_till_type;
3938 62255 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &renew_till_type, 8, &renew_till_datalen, &l);
3939 62443 : if (e == 0 && renew_till_type != CONS) { e = ASN1_BAD_ID; }
3940 62255 : if(e) {
3941 62067 : (data)->renew_till = NULL;
3942 : } else {
3943 188 : (data)->renew_till = calloc(1, sizeof(*(data)->renew_till));
3944 188 : if ((data)->renew_till == NULL) { e = ENOMEM; goto fail; }
3945 188 : p += l; len -= l; ret += l;
3946 188 : renew_till_oldlen = len;
3947 188 : if (renew_till_datalen > len) { e = ASN1_OVERRUN; goto fail; }
3948 188 : len = renew_till_datalen;
3949 188 : e = decode_KerberosTime(p, len, (data)->renew_till, &l);
3950 188 : if(e) goto fail;
3951 188 : p += l; len -= l; ret += l;
3952 188 : len = renew_till_oldlen - renew_till_datalen;
3953 : }
3954 : }
3955 : {
3956 : size_t caddr_datalen, caddr_oldlen;
3957 : Der_type caddr_type;
3958 62255 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &caddr_type, 9, &caddr_datalen, &l);
3959 62332 : if (e == 0 && caddr_type != CONS) { e = ASN1_BAD_ID; }
3960 62255 : if(e) {
3961 62178 : (data)->caddr = NULL;
3962 : } else {
3963 77 : (data)->caddr = calloc(1, sizeof(*(data)->caddr));
3964 77 : if ((data)->caddr == NULL) { e = ENOMEM; goto fail; }
3965 77 : p += l; len -= l; ret += l;
3966 77 : caddr_oldlen = len;
3967 77 : if (caddr_datalen > len) { e = ASN1_OVERRUN; goto fail; }
3968 77 : len = caddr_datalen;
3969 77 : e = decode_HostAddresses(p, len, (data)->caddr, &l);
3970 77 : if(e) goto fail;
3971 77 : p += l; len -= l; ret += l;
3972 77 : len = caddr_oldlen - caddr_datalen;
3973 : }
3974 : }
3975 : {
3976 : size_t authorization_data_datalen, authorization_data_oldlen;
3977 : Der_type authorization_data_type;
3978 62255 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &authorization_data_type, 10, &authorization_data_datalen, &l);
3979 124510 : if (e == 0 && authorization_data_type != CONS) { e = ASN1_BAD_ID; }
3980 62255 : if(e) {
3981 0 : (data)->authorization_data = NULL;
3982 : } else {
3983 62255 : (data)->authorization_data = calloc(1, sizeof(*(data)->authorization_data));
3984 62255 : if ((data)->authorization_data == NULL) { e = ENOMEM; goto fail; }
3985 62255 : p += l; len -= l; ret += l;
3986 62255 : authorization_data_oldlen = len;
3987 62255 : if (authorization_data_datalen > len) { e = ASN1_OVERRUN; goto fail; }
3988 62255 : len = authorization_data_datalen;
3989 62255 : e = decode_AuthorizationData(p, len, (data)->authorization_data, &l);
3990 62255 : if(e) goto fail;
3991 62255 : p += l; len -= l; ret += l;
3992 62255 : len = authorization_data_oldlen - authorization_data_datalen;
3993 : }
3994 : }
3995 62255 : len = Top_Tag_oldlen - Top_Tag_datalen;
3996 : }
3997 62255 : len = Top_oldlen - Top_datalen;
3998 : }
3999 124510 : if(size) *size = ret;
4000 60428 : return 0;
4001 0 : fail:
4002 0 : free_EncTicketPart(data);
4003 0 : return e;
4004 : }
4005 :
4006 : void ASN1CALL
4007 150779 : free_EncTicketPart(EncTicketPart *data)
4008 : {
4009 150779 : free_TicketFlags(&(data)->flags);
4010 150779 : free_EncryptionKey(&(data)->key);
4011 150779 : free_Realm(&(data)->crealm);
4012 150779 : free_PrincipalName(&(data)->cname);
4013 150779 : free_TransitedEncoding(&(data)->transited);
4014 150779 : free_KerberosTime(&(data)->authtime);
4015 150779 : if((data)->starttime) {
4016 50823 : free_KerberosTime((data)->starttime);
4017 50823 : free((data)->starttime);
4018 50823 : (data)->starttime = NULL;
4019 : }
4020 150779 : free_KerberosTime(&(data)->endtime);
4021 150779 : if((data)->renew_till) {
4022 328 : free_KerberosTime((data)->renew_till);
4023 328 : free((data)->renew_till);
4024 328 : (data)->renew_till = NULL;
4025 : }
4026 150779 : if((data)->caddr) {
4027 181 : free_HostAddresses((data)->caddr);
4028 181 : free((data)->caddr);
4029 181 : (data)->caddr = NULL;
4030 : }
4031 150779 : if((data)->authorization_data) {
4032 110118 : free_AuthorizationData((data)->authorization_data);
4033 110118 : free((data)->authorization_data);
4034 110118 : (data)->authorization_data = NULL;
4035 : }
4036 150779 : }
4037 :
4038 : size_t ASN1CALL
4039 66016 : length_EncTicketPart(const EncTicketPart *data)
4040 : {
4041 66016 : size_t ret = 0;
4042 : {
4043 66016 : size_t Top_tag_tag_oldret = ret;
4044 66016 : ret = 0;
4045 66016 : ret += length_TicketFlags(&(data)->flags);
4046 66016 : ret += 1 + der_length_len (ret);
4047 66016 : ret += Top_tag_tag_oldret;
4048 : }
4049 : {
4050 66016 : size_t Top_tag_tag_oldret = ret;
4051 66016 : ret = 0;
4052 66016 : ret += length_EncryptionKey(&(data)->key);
4053 66016 : ret += 1 + der_length_len (ret);
4054 66016 : ret += Top_tag_tag_oldret;
4055 : }
4056 : {
4057 66016 : size_t Top_tag_tag_oldret = ret;
4058 66016 : ret = 0;
4059 66016 : ret += length_Realm(&(data)->crealm);
4060 66016 : ret += 1 + der_length_len (ret);
4061 66016 : ret += Top_tag_tag_oldret;
4062 : }
4063 : {
4064 66016 : size_t Top_tag_tag_oldret = ret;
4065 66016 : ret = 0;
4066 66016 : ret += length_PrincipalName(&(data)->cname);
4067 66016 : ret += 1 + der_length_len (ret);
4068 66016 : ret += Top_tag_tag_oldret;
4069 : }
4070 : {
4071 66016 : size_t Top_tag_tag_oldret = ret;
4072 66016 : ret = 0;
4073 66016 : ret += length_TransitedEncoding(&(data)->transited);
4074 66016 : ret += 1 + der_length_len (ret);
4075 66016 : ret += Top_tag_tag_oldret;
4076 : }
4077 : {
4078 66016 : size_t Top_tag_tag_oldret = ret;
4079 66016 : ret = 0;
4080 66016 : ret += length_KerberosTime(&(data)->authtime);
4081 66016 : ret += 1 + der_length_len (ret);
4082 66016 : ret += Top_tag_tag_oldret;
4083 : }
4084 66016 : if((data)->starttime){
4085 39673 : size_t Top_tag_tag_oldret = ret;
4086 39673 : ret = 0;
4087 39673 : ret += length_KerberosTime((data)->starttime);
4088 39673 : ret += 1 + der_length_len (ret);
4089 39673 : ret += Top_tag_tag_oldret;
4090 : }
4091 : {
4092 66016 : size_t Top_tag_tag_oldret = ret;
4093 66016 : ret = 0;
4094 66016 : ret += length_KerberosTime(&(data)->endtime);
4095 66016 : ret += 1 + der_length_len (ret);
4096 66016 : ret += Top_tag_tag_oldret;
4097 : }
4098 66016 : if((data)->renew_till){
4099 170 : size_t Top_tag_tag_oldret = ret;
4100 170 : ret = 0;
4101 170 : ret += length_KerberosTime((data)->renew_till);
4102 170 : ret += 1 + der_length_len (ret);
4103 170 : ret += Top_tag_tag_oldret;
4104 : }
4105 66016 : if((data)->caddr){
4106 169 : size_t Top_tag_tag_oldret = ret;
4107 169 : ret = 0;
4108 169 : ret += length_HostAddresses((data)->caddr);
4109 169 : ret += 1 + der_length_len (ret);
4110 169 : ret += Top_tag_tag_oldret;
4111 : }
4112 66016 : if((data)->authorization_data){
4113 66016 : size_t Top_tag_tag_oldret = ret;
4114 66016 : ret = 0;
4115 66016 : ret += length_AuthorizationData((data)->authorization_data);
4116 66016 : ret += 1 + der_length_len (ret);
4117 66016 : ret += Top_tag_tag_oldret;
4118 : }
4119 66016 : ret += 1 + der_length_len (ret);
4120 66016 : ret += 1 + der_length_len (ret);
4121 66016 : return ret;
4122 : }
4123 :
4124 : int ASN1CALL
4125 21505 : copy_EncTicketPart(const EncTicketPart *from, EncTicketPart *to)
4126 : {
4127 21505 : memset(to, 0, sizeof(*to));
4128 21505 : if(copy_TicketFlags(&(from)->flags, &(to)->flags)) goto fail;
4129 21505 : if(copy_EncryptionKey(&(from)->key, &(to)->key)) goto fail;
4130 21505 : if(copy_Realm(&(from)->crealm, &(to)->crealm)) goto fail;
4131 21505 : if(copy_PrincipalName(&(from)->cname, &(to)->cname)) goto fail;
4132 21505 : if(copy_TransitedEncoding(&(from)->transited, &(to)->transited)) goto fail;
4133 21505 : if(copy_KerberosTime(&(from)->authtime, &(to)->authtime)) goto fail;
4134 21505 : if((from)->starttime) {
4135 21479 : (to)->starttime = malloc(sizeof(*(to)->starttime));
4136 21479 : if((to)->starttime == NULL) goto fail;
4137 21479 : if(copy_KerberosTime((from)->starttime, (to)->starttime)) goto fail;
4138 : }else
4139 26 : (to)->starttime = NULL;
4140 21505 : if(copy_KerberosTime(&(from)->endtime, &(to)->endtime)) goto fail;
4141 21505 : if((from)->renew_till) {
4142 0 : (to)->renew_till = malloc(sizeof(*(to)->renew_till));
4143 0 : if((to)->renew_till == NULL) goto fail;
4144 0 : if(copy_KerberosTime((from)->renew_till, (to)->renew_till)) goto fail;
4145 : }else
4146 21505 : (to)->renew_till = NULL;
4147 21505 : if((from)->caddr) {
4148 6 : (to)->caddr = malloc(sizeof(*(to)->caddr));
4149 6 : if((to)->caddr == NULL) goto fail;
4150 6 : if(copy_HostAddresses((from)->caddr, (to)->caddr)) goto fail;
4151 : }else
4152 21499 : (to)->caddr = NULL;
4153 21505 : if((from)->authorization_data) {
4154 21505 : (to)->authorization_data = malloc(sizeof(*(to)->authorization_data));
4155 21505 : if((to)->authorization_data == NULL) goto fail;
4156 21505 : if(copy_AuthorizationData((from)->authorization_data, (to)->authorization_data)) goto fail;
4157 : }else
4158 0 : (to)->authorization_data = NULL;
4159 20767 : return 0;
4160 0 : fail:
4161 0 : free_EncTicketPart(to);
4162 0 : return ENOMEM;
4163 : }
4164 :
4165 : int ASN1CALL
4166 133666 : encode_Checksum(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const Checksum *data, size_t *size)
4167 : {
4168 133666 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
4169 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
4170 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
4171 :
4172 : /* checksum */
4173 : {
4174 133666 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
4175 133666 : ret = 0;
4176 133666 : e = der_put_octet_string(p, len, &(data)->checksum, &l);
4177 133666 : if (e) return e;
4178 133666 : p -= l; len -= l; ret += l;
4179 :
4180 133666 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_OctetString, &l);
4181 133666 : if (e) return e;
4182 133666 : p -= l; len -= l; ret += l;
4183 :
4184 133666 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
4185 133666 : if (e) return e;
4186 133666 : p -= l; len -= l; ret += l;
4187 :
4188 133666 : ret += Top_tag_oldret;
4189 : }
4190 : /* cksumtype */
4191 : {
4192 133666 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
4193 133666 : ret = 0;
4194 133666 : e = encode_CKSUMTYPE(p, len, &(data)->cksumtype, &l);
4195 133666 : if (e) return e;
4196 133666 : p -= l; len -= l; ret += l;
4197 :
4198 133666 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
4199 133666 : if (e) return e;
4200 133666 : p -= l; len -= l; ret += l;
4201 :
4202 133666 : ret += Top_tag_oldret;
4203 : }
4204 133666 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
4205 133666 : if (e) return e;
4206 133666 : p -= l; len -= l; ret += l;
4207 :
4208 133666 : *size = ret;
4209 133666 : return 0;
4210 : }
4211 :
4212 : int ASN1CALL
4213 102319 : decode_Checksum(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, Checksum *data, size_t *size)
4214 : {
4215 102319 : size_t ret = 0;
4216 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
4217 : int e HEIMDAL_UNUSED_ATTRIBUTE;
4218 :
4219 102319 : memset(data, 0, sizeof(*data));
4220 : {
4221 : size_t Top_datalen, Top_oldlen;
4222 : Der_type Top_type;
4223 102319 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
4224 102319 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
4225 102319 : if(e) goto fail;
4226 102319 : p += l; len -= l; ret += l;
4227 102319 : Top_oldlen = len;
4228 102319 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
4229 102319 : len = Top_datalen;
4230 : {
4231 : size_t cksumtype_datalen, cksumtype_oldlen;
4232 : Der_type cksumtype_type;
4233 102319 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &cksumtype_type, 0, &cksumtype_datalen, &l);
4234 102319 : if (e == 0 && cksumtype_type != CONS) { e = ASN1_BAD_ID; }
4235 102319 : if(e) goto fail;
4236 102319 : p += l; len -= l; ret += l;
4237 102319 : cksumtype_oldlen = len;
4238 102319 : if (cksumtype_datalen > len) { e = ASN1_OVERRUN; goto fail; }
4239 102319 : len = cksumtype_datalen;
4240 102319 : e = decode_CKSUMTYPE(p, len, &(data)->cksumtype, &l);
4241 102319 : if(e) goto fail;
4242 102319 : p += l; len -= l; ret += l;
4243 102319 : len = cksumtype_oldlen - cksumtype_datalen;
4244 : }
4245 : {
4246 : size_t checksum_datalen, checksum_oldlen;
4247 : Der_type checksum_type;
4248 102319 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &checksum_type, 1, &checksum_datalen, &l);
4249 201722 : if (e == 0 && checksum_type != CONS) { e = ASN1_BAD_ID; }
4250 102319 : if(e) goto fail;
4251 102319 : p += l; len -= l; ret += l;
4252 102319 : checksum_oldlen = len;
4253 102319 : if (checksum_datalen > len) { e = ASN1_OVERRUN; goto fail; }
4254 102319 : len = checksum_datalen;
4255 : {
4256 : size_t checksum_Tag_datalen, checksum_Tag_oldlen;
4257 : Der_type checksum_Tag_type;
4258 102319 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &checksum_Tag_type, UT_OctetString, &checksum_Tag_datalen, &l);
4259 102319 : if (e == 0 && checksum_Tag_type != PRIM) { e = ASN1_BAD_ID; }
4260 102319 : if(e) goto fail;
4261 102319 : p += l; len -= l; ret += l;
4262 102319 : checksum_Tag_oldlen = len;
4263 102319 : if (checksum_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
4264 102319 : len = checksum_Tag_datalen;
4265 102319 : e = der_get_octet_string(p, len, &(data)->checksum, &l);
4266 102319 : if(e) goto fail;
4267 102319 : p += l; len -= l; ret += l;
4268 102319 : len = checksum_Tag_oldlen - checksum_Tag_datalen;
4269 : }
4270 102319 : len = checksum_oldlen - checksum_datalen;
4271 : }
4272 102319 : len = Top_oldlen - Top_datalen;
4273 : }
4274 204638 : if(size) *size = ret;
4275 99403 : return 0;
4276 0 : fail:
4277 0 : free_Checksum(data);
4278 0 : return e;
4279 : }
4280 :
4281 : void ASN1CALL
4282 1632769 : free_Checksum(Checksum *data)
4283 : {
4284 1632769 : free_CKSUMTYPE(&(data)->cksumtype);
4285 1632769 : der_free_octet_string(&(data)->checksum);
4286 1632769 : }
4287 :
4288 : size_t ASN1CALL
4289 133666 : length_Checksum(const Checksum *data)
4290 : {
4291 133666 : size_t ret = 0;
4292 : {
4293 133666 : size_t Top_tag_oldret = ret;
4294 133666 : ret = 0;
4295 133666 : ret += length_CKSUMTYPE(&(data)->cksumtype);
4296 133666 : ret += 1 + der_length_len (ret);
4297 133666 : ret += Top_tag_oldret;
4298 : }
4299 : {
4300 133666 : size_t Top_tag_oldret = ret;
4301 133666 : ret = 0;
4302 133666 : ret += der_length_octet_string(&(data)->checksum);
4303 133666 : ret += 1 + der_length_len (ret);
4304 133666 : ret += 1 + der_length_len (ret);
4305 133666 : ret += Top_tag_oldret;
4306 : }
4307 133666 : ret += 1 + der_length_len (ret);
4308 133666 : return ret;
4309 : }
4310 :
4311 : int ASN1CALL
4312 169376 : copy_Checksum(const Checksum *from, Checksum *to)
4313 : {
4314 169376 : memset(to, 0, sizeof(*to));
4315 169376 : if(copy_CKSUMTYPE(&(from)->cksumtype, &(to)->cksumtype)) goto fail;
4316 169376 : if(der_copy_octet_string(&(from)->checksum, &(to)->checksum)) goto fail;
4317 164621 : return 0;
4318 0 : fail:
4319 0 : free_Checksum(to);
4320 0 : return ENOMEM;
4321 : }
4322 :
4323 : int ASN1CALL
4324 68110 : encode_Authenticator(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const Authenticator *data, size_t *size)
4325 : {
4326 68110 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
4327 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
4328 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
4329 :
4330 : /* authorization-data */
4331 68110 : if((data)->authorization_data) {
4332 20329 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
4333 20329 : ret = 0;
4334 20329 : e = encode_AuthorizationData(p, len, (data)->authorization_data, &l);
4335 20329 : if (e) return e;
4336 20329 : p -= l; len -= l; ret += l;
4337 :
4338 20329 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 8, &l);
4339 20329 : if (e) return e;
4340 20329 : p -= l; len -= l; ret += l;
4341 :
4342 20329 : ret += Top_tag_tag_oldret;
4343 : }
4344 : /* seq-number */
4345 68110 : if((data)->seq_number) {
4346 20464 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
4347 20464 : ret = 0;
4348 20464 : e = encode_krb5uint32(p, len, (data)->seq_number, &l);
4349 20464 : if (e) return e;
4350 20464 : p -= l; len -= l; ret += l;
4351 :
4352 20464 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 7, &l);
4353 20464 : if (e) return e;
4354 20464 : p -= l; len -= l; ret += l;
4355 :
4356 20464 : ret += Top_tag_tag_oldret;
4357 : }
4358 : /* subkey */
4359 68110 : if((data)->subkey) {
4360 62842 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
4361 62842 : ret = 0;
4362 62842 : e = encode_EncryptionKey(p, len, (data)->subkey, &l);
4363 62842 : if (e) return e;
4364 62842 : p -= l; len -= l; ret += l;
4365 :
4366 62842 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 6, &l);
4367 62842 : if (e) return e;
4368 62842 : p -= l; len -= l; ret += l;
4369 :
4370 62842 : ret += Top_tag_tag_oldret;
4371 : }
4372 : /* ctime */
4373 : {
4374 68110 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
4375 68110 : ret = 0;
4376 68110 : e = encode_KerberosTime(p, len, &(data)->ctime, &l);
4377 68110 : if (e) return e;
4378 68110 : p -= l; len -= l; ret += l;
4379 :
4380 68110 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 5, &l);
4381 68110 : if (e) return e;
4382 68110 : p -= l; len -= l; ret += l;
4383 :
4384 68110 : ret += Top_tag_tag_oldret;
4385 : }
4386 : /* cusec */
4387 : {
4388 68110 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
4389 68110 : ret = 0;
4390 68110 : e = encode_krb5int32(p, len, &(data)->cusec, &l);
4391 68110 : if (e) return e;
4392 68110 : p -= l; len -= l; ret += l;
4393 :
4394 68110 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 4, &l);
4395 68110 : if (e) return e;
4396 68110 : p -= l; len -= l; ret += l;
4397 :
4398 68110 : ret += Top_tag_tag_oldret;
4399 : }
4400 : /* cksum */
4401 68110 : if((data)->cksum) {
4402 68044 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
4403 68044 : ret = 0;
4404 68044 : e = encode_Checksum(p, len, (data)->cksum, &l);
4405 68044 : if (e) return e;
4406 68044 : p -= l; len -= l; ret += l;
4407 :
4408 68044 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 3, &l);
4409 68044 : if (e) return e;
4410 68044 : p -= l; len -= l; ret += l;
4411 :
4412 68044 : ret += Top_tag_tag_oldret;
4413 : }
4414 : /* cname */
4415 : {
4416 68110 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
4417 68110 : ret = 0;
4418 68110 : e = encode_PrincipalName(p, len, &(data)->cname, &l);
4419 68110 : if (e) return e;
4420 68110 : p -= l; len -= l; ret += l;
4421 :
4422 68110 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
4423 68110 : if (e) return e;
4424 68110 : p -= l; len -= l; ret += l;
4425 :
4426 68110 : ret += Top_tag_tag_oldret;
4427 : }
4428 : /* crealm */
4429 : {
4430 68110 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
4431 68110 : ret = 0;
4432 68110 : e = encode_Realm(p, len, &(data)->crealm, &l);
4433 68110 : if (e) return e;
4434 68110 : p -= l; len -= l; ret += l;
4435 :
4436 68110 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
4437 68110 : if (e) return e;
4438 68110 : p -= l; len -= l; ret += l;
4439 :
4440 68110 : ret += Top_tag_tag_oldret;
4441 : }
4442 : /* authenticator-vno */
4443 : {
4444 68110 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
4445 68110 : ret = 0;
4446 68110 : e = encode_krb5int32(p, len, &(data)->authenticator_vno, &l);
4447 68110 : if (e) return e;
4448 68110 : p -= l; len -= l; ret += l;
4449 :
4450 68110 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
4451 68110 : if (e) return e;
4452 68110 : p -= l; len -= l; ret += l;
4453 :
4454 68110 : ret += Top_tag_tag_oldret;
4455 : }
4456 68110 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
4457 68110 : if (e) return e;
4458 68110 : p -= l; len -= l; ret += l;
4459 :
4460 68110 : e = der_put_length_and_tag (p, len, ret, ASN1_C_APPL, CONS, 2, &l);
4461 68110 : if (e) return e;
4462 68110 : p -= l; len -= l; ret += l;
4463 :
4464 68110 : *size = ret;
4465 68110 : return 0;
4466 : }
4467 :
4468 : int ASN1CALL
4469 62161 : decode_Authenticator(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, Authenticator *data, size_t *size)
4470 : {
4471 62161 : size_t ret = 0;
4472 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
4473 : int e HEIMDAL_UNUSED_ATTRIBUTE;
4474 :
4475 62161 : memset(data, 0, sizeof(*data));
4476 : {
4477 : size_t Top_datalen, Top_oldlen;
4478 : Der_type Top_type;
4479 62161 : e = der_match_tag_and_length(p, len, ASN1_C_APPL, &Top_type, 2, &Top_datalen, &l);
4480 62161 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
4481 62161 : if(e) goto fail;
4482 62161 : p += l; len -= l; ret += l;
4483 62161 : Top_oldlen = len;
4484 62161 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
4485 62161 : len = Top_datalen;
4486 : {
4487 : size_t Top_Tag_datalen, Top_Tag_oldlen;
4488 : Der_type Top_Tag_type;
4489 62161 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_Tag_type, UT_Sequence, &Top_Tag_datalen, &l);
4490 62161 : if (e == 0 && Top_Tag_type != CONS) { e = ASN1_BAD_ID; }
4491 62161 : if(e) goto fail;
4492 62161 : p += l; len -= l; ret += l;
4493 62161 : Top_Tag_oldlen = len;
4494 62161 : if (Top_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
4495 62161 : len = Top_Tag_datalen;
4496 : {
4497 : size_t authenticator_vno_datalen, authenticator_vno_oldlen;
4498 : Der_type authenticator_vno_type;
4499 62161 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &authenticator_vno_type, 0, &authenticator_vno_datalen, &l);
4500 62161 : if (e == 0 && authenticator_vno_type != CONS) { e = ASN1_BAD_ID; }
4501 62161 : if(e) goto fail;
4502 62161 : p += l; len -= l; ret += l;
4503 62161 : authenticator_vno_oldlen = len;
4504 62161 : if (authenticator_vno_datalen > len) { e = ASN1_OVERRUN; goto fail; }
4505 62161 : len = authenticator_vno_datalen;
4506 62161 : e = decode_krb5int32(p, len, &(data)->authenticator_vno, &l);
4507 62161 : if(e) goto fail;
4508 62161 : p += l; len -= l; ret += l;
4509 62161 : len = authenticator_vno_oldlen - authenticator_vno_datalen;
4510 : }
4511 : {
4512 : size_t crealm_datalen, crealm_oldlen;
4513 : Der_type crealm_type;
4514 62161 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &crealm_type, 1, &crealm_datalen, &l);
4515 122495 : if (e == 0 && crealm_type != CONS) { e = ASN1_BAD_ID; }
4516 62161 : if(e) goto fail;
4517 62161 : p += l; len -= l; ret += l;
4518 62161 : crealm_oldlen = len;
4519 62161 : if (crealm_datalen > len) { e = ASN1_OVERRUN; goto fail; }
4520 62161 : len = crealm_datalen;
4521 62161 : e = decode_Realm(p, len, &(data)->crealm, &l);
4522 62161 : if(e) goto fail;
4523 62161 : p += l; len -= l; ret += l;
4524 62161 : len = crealm_oldlen - crealm_datalen;
4525 : }
4526 : {
4527 : size_t cname_datalen, cname_oldlen;
4528 : Der_type cname_type;
4529 62161 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &cname_type, 2, &cname_datalen, &l);
4530 122495 : if (e == 0 && cname_type != CONS) { e = ASN1_BAD_ID; }
4531 62161 : if(e) goto fail;
4532 62161 : p += l; len -= l; ret += l;
4533 62161 : cname_oldlen = len;
4534 62161 : if (cname_datalen > len) { e = ASN1_OVERRUN; goto fail; }
4535 62161 : len = cname_datalen;
4536 62161 : e = decode_PrincipalName(p, len, &(data)->cname, &l);
4537 62161 : if(e) goto fail;
4538 62161 : p += l; len -= l; ret += l;
4539 62161 : len = cname_oldlen - cname_datalen;
4540 : }
4541 : {
4542 : size_t cksum_datalen, cksum_oldlen;
4543 : Der_type cksum_type;
4544 62161 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &cksum_type, 3, &cksum_datalen, &l);
4545 122429 : if (e == 0 && cksum_type != CONS) { e = ASN1_BAD_ID; }
4546 62161 : if(e) {
4547 66 : (data)->cksum = NULL;
4548 : } else {
4549 62095 : (data)->cksum = calloc(1, sizeof(*(data)->cksum));
4550 62095 : if ((data)->cksum == NULL) { e = ENOMEM; goto fail; }
4551 62095 : p += l; len -= l; ret += l;
4552 62095 : cksum_oldlen = len;
4553 62095 : if (cksum_datalen > len) { e = ASN1_OVERRUN; goto fail; }
4554 62095 : len = cksum_datalen;
4555 62095 : e = decode_Checksum(p, len, (data)->cksum, &l);
4556 62095 : if(e) goto fail;
4557 62095 : p += l; len -= l; ret += l;
4558 62095 : len = cksum_oldlen - cksum_datalen;
4559 : }
4560 : }
4561 : {
4562 : size_t cusec_datalen, cusec_oldlen;
4563 : Der_type cusec_type;
4564 62161 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &cusec_type, 4, &cusec_datalen, &l);
4565 124322 : if (e == 0 && cusec_type != CONS) { e = ASN1_BAD_ID; }
4566 62161 : if(e) goto fail;
4567 62161 : p += l; len -= l; ret += l;
4568 62161 : cusec_oldlen = len;
4569 62161 : if (cusec_datalen > len) { e = ASN1_OVERRUN; goto fail; }
4570 62161 : len = cusec_datalen;
4571 62161 : e = decode_krb5int32(p, len, &(data)->cusec, &l);
4572 62161 : if(e) goto fail;
4573 62161 : p += l; len -= l; ret += l;
4574 62161 : len = cusec_oldlen - cusec_datalen;
4575 : }
4576 : {
4577 : size_t ctime_datalen, ctime_oldlen;
4578 : Der_type ctime_type;
4579 62161 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &ctime_type, 5, &ctime_datalen, &l);
4580 122495 : if (e == 0 && ctime_type != CONS) { e = ASN1_BAD_ID; }
4581 62161 : if(e) goto fail;
4582 62161 : p += l; len -= l; ret += l;
4583 62161 : ctime_oldlen = len;
4584 62161 : if (ctime_datalen > len) { e = ASN1_OVERRUN; goto fail; }
4585 62161 : len = ctime_datalen;
4586 62161 : e = decode_KerberosTime(p, len, &(data)->ctime, &l);
4587 62161 : if(e) goto fail;
4588 62161 : p += l; len -= l; ret += l;
4589 62161 : len = ctime_oldlen - ctime_datalen;
4590 : }
4591 : {
4592 : size_t subkey_datalen, subkey_oldlen;
4593 : Der_type subkey_type;
4594 62161 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &subkey_type, 6, &subkey_datalen, &l);
4595 122493 : if (e == 0 && subkey_type != CONS) { e = ASN1_BAD_ID; }
4596 62161 : if(e) {
4597 2 : (data)->subkey = NULL;
4598 : } else {
4599 62159 : (data)->subkey = calloc(1, sizeof(*(data)->subkey));
4600 62159 : if ((data)->subkey == NULL) { e = ENOMEM; goto fail; }
4601 62159 : p += l; len -= l; ret += l;
4602 62159 : subkey_oldlen = len;
4603 62159 : if (subkey_datalen > len) { e = ASN1_OVERRUN; goto fail; }
4604 62159 : len = subkey_datalen;
4605 62159 : e = decode_EncryptionKey(p, len, (data)->subkey, &l);
4606 62159 : if(e) goto fail;
4607 62159 : p += l; len -= l; ret += l;
4608 62159 : len = subkey_oldlen - subkey_datalen;
4609 : }
4610 : }
4611 : {
4612 : size_t seq_number_datalen, seq_number_oldlen;
4613 : Der_type seq_number_type;
4614 62161 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &seq_number_type, 7, &seq_number_datalen, &l);
4615 82299 : if (e == 0 && seq_number_type != CONS) { e = ASN1_BAD_ID; }
4616 62161 : if(e) {
4617 42023 : (data)->seq_number = NULL;
4618 : } else {
4619 20138 : (data)->seq_number = calloc(1, sizeof(*(data)->seq_number));
4620 20138 : if ((data)->seq_number == NULL) { e = ENOMEM; goto fail; }
4621 20138 : p += l; len -= l; ret += l;
4622 20138 : seq_number_oldlen = len;
4623 20138 : if (seq_number_datalen > len) { e = ASN1_OVERRUN; goto fail; }
4624 20138 : len = seq_number_datalen;
4625 20138 : e = decode_krb5uint32(p, len, (data)->seq_number, &l);
4626 20138 : if(e) goto fail;
4627 20138 : p += l; len -= l; ret += l;
4628 20138 : len = seq_number_oldlen - seq_number_datalen;
4629 : }
4630 : }
4631 : {
4632 : size_t authorization_data_datalen, authorization_data_oldlen;
4633 : Der_type authorization_data_type;
4634 62161 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &authorization_data_type, 8, &authorization_data_datalen, &l);
4635 81954 : if (e == 0 && authorization_data_type != CONS) { e = ASN1_BAD_ID; }
4636 62161 : if(e) {
4637 42368 : (data)->authorization_data = NULL;
4638 : } else {
4639 19793 : (data)->authorization_data = calloc(1, sizeof(*(data)->authorization_data));
4640 19793 : if ((data)->authorization_data == NULL) { e = ENOMEM; goto fail; }
4641 19793 : p += l; len -= l; ret += l;
4642 19793 : authorization_data_oldlen = len;
4643 19793 : if (authorization_data_datalen > len) { e = ASN1_OVERRUN; goto fail; }
4644 19793 : len = authorization_data_datalen;
4645 19793 : e = decode_AuthorizationData(p, len, (data)->authorization_data, &l);
4646 19793 : if(e) goto fail;
4647 19793 : p += l; len -= l; ret += l;
4648 19793 : len = authorization_data_oldlen - authorization_data_datalen;
4649 : }
4650 : }
4651 62161 : len = Top_Tag_oldlen - Top_Tag_datalen;
4652 : }
4653 62161 : len = Top_oldlen - Top_datalen;
4654 : }
4655 124322 : if(size) *size = ret;
4656 60334 : return 0;
4657 0 : fail:
4658 0 : free_Authenticator(data);
4659 0 : return e;
4660 : }
4661 :
4662 : void ASN1CALL
4663 333330 : free_Authenticator(Authenticator *data)
4664 : {
4665 333330 : free_krb5int32(&(data)->authenticator_vno);
4666 333330 : free_Realm(&(data)->crealm);
4667 333330 : free_PrincipalName(&(data)->cname);
4668 333330 : if((data)->cksum) {
4669 231486 : free_Checksum((data)->cksum);
4670 231486 : free((data)->cksum);
4671 231486 : (data)->cksum = NULL;
4672 : }
4673 333330 : free_krb5int32(&(data)->cusec);
4674 333330 : free_KerberosTime(&(data)->ctime);
4675 333330 : if((data)->subkey) {
4676 226344 : free_EncryptionKey((data)->subkey);
4677 226344 : free((data)->subkey);
4678 226344 : (data)->subkey = NULL;
4679 : }
4680 333330 : if((data)->seq_number) {
4681 60719 : free_krb5uint32((data)->seq_number);
4682 60719 : free((data)->seq_number);
4683 60719 : (data)->seq_number = NULL;
4684 : }
4685 333330 : if((data)->authorization_data) {
4686 59931 : free_AuthorizationData((data)->authorization_data);
4687 59931 : free((data)->authorization_data);
4688 59931 : (data)->authorization_data = NULL;
4689 : }
4690 333330 : }
4691 :
4692 : size_t ASN1CALL
4693 68110 : length_Authenticator(const Authenticator *data)
4694 : {
4695 68110 : size_t ret = 0;
4696 : {
4697 68110 : size_t Top_tag_tag_oldret = ret;
4698 68110 : ret = 0;
4699 68110 : ret += length_krb5int32(&(data)->authenticator_vno);
4700 68110 : ret += 1 + der_length_len (ret);
4701 68110 : ret += Top_tag_tag_oldret;
4702 : }
4703 : {
4704 68110 : size_t Top_tag_tag_oldret = ret;
4705 68110 : ret = 0;
4706 68110 : ret += length_Realm(&(data)->crealm);
4707 68110 : ret += 1 + der_length_len (ret);
4708 68110 : ret += Top_tag_tag_oldret;
4709 : }
4710 : {
4711 68110 : size_t Top_tag_tag_oldret = ret;
4712 68110 : ret = 0;
4713 68110 : ret += length_PrincipalName(&(data)->cname);
4714 68110 : ret += 1 + der_length_len (ret);
4715 68110 : ret += Top_tag_tag_oldret;
4716 : }
4717 68110 : if((data)->cksum){
4718 68044 : size_t Top_tag_tag_oldret = ret;
4719 68044 : ret = 0;
4720 68044 : ret += length_Checksum((data)->cksum);
4721 68044 : ret += 1 + der_length_len (ret);
4722 68044 : ret += Top_tag_tag_oldret;
4723 : }
4724 : {
4725 68110 : size_t Top_tag_tag_oldret = ret;
4726 68110 : ret = 0;
4727 68110 : ret += length_krb5int32(&(data)->cusec);
4728 68110 : ret += 1 + der_length_len (ret);
4729 68110 : ret += Top_tag_tag_oldret;
4730 : }
4731 : {
4732 68110 : size_t Top_tag_tag_oldret = ret;
4733 68110 : ret = 0;
4734 68110 : ret += length_KerberosTime(&(data)->ctime);
4735 68110 : ret += 1 + der_length_len (ret);
4736 68110 : ret += Top_tag_tag_oldret;
4737 : }
4738 68110 : if((data)->subkey){
4739 62842 : size_t Top_tag_tag_oldret = ret;
4740 62842 : ret = 0;
4741 62842 : ret += length_EncryptionKey((data)->subkey);
4742 62842 : ret += 1 + der_length_len (ret);
4743 62842 : ret += Top_tag_tag_oldret;
4744 : }
4745 68110 : if((data)->seq_number){
4746 20464 : size_t Top_tag_tag_oldret = ret;
4747 20464 : ret = 0;
4748 20464 : ret += length_krb5uint32((data)->seq_number);
4749 20464 : ret += 1 + der_length_len (ret);
4750 20464 : ret += Top_tag_tag_oldret;
4751 : }
4752 68110 : if((data)->authorization_data){
4753 20329 : size_t Top_tag_tag_oldret = ret;
4754 20329 : ret = 0;
4755 20329 : ret += length_AuthorizationData((data)->authorization_data);
4756 20329 : ret += 1 + der_length_len (ret);
4757 20329 : ret += Top_tag_tag_oldret;
4758 : }
4759 68110 : ret += 1 + der_length_len (ret);
4760 68110 : ret += 1 + der_length_len (ret);
4761 68110 : return ret;
4762 : }
4763 :
4764 : int ASN1CALL
4765 101364 : copy_Authenticator(const Authenticator *from, Authenticator *to)
4766 : {
4767 101364 : memset(to, 0, sizeof(*to));
4768 101364 : if(copy_krb5int32(&(from)->authenticator_vno, &(to)->authenticator_vno)) goto fail;
4769 101364 : if(copy_Realm(&(from)->crealm, &(to)->crealm)) goto fail;
4770 101364 : if(copy_PrincipalName(&(from)->cname, &(to)->cname)) goto fail;
4771 101364 : if((from)->cksum) {
4772 101332 : (to)->cksum = malloc(sizeof(*(to)->cksum));
4773 101332 : if((to)->cksum == NULL) goto fail;
4774 101332 : if(copy_Checksum((from)->cksum, (to)->cksum)) goto fail;
4775 : }else
4776 32 : (to)->cksum = NULL;
4777 101364 : if(copy_krb5int32(&(from)->cusec, &(to)->cusec)) goto fail;
4778 101364 : if(copy_KerberosTime(&(from)->ctime, &(to)->ctime)) goto fail;
4779 101364 : if((from)->subkey) {
4780 101360 : (to)->subkey = malloc(sizeof(*(to)->subkey));
4781 101360 : if((to)->subkey == NULL) goto fail;
4782 101360 : if(copy_EncryptionKey((from)->subkey, (to)->subkey)) goto fail;
4783 : }else
4784 4 : (to)->subkey = NULL;
4785 101364 : if((from)->seq_number) {
4786 20134 : (to)->seq_number = malloc(sizeof(*(to)->seq_number));
4787 20134 : if((to)->seq_number == NULL) goto fail;
4788 20134 : if(copy_krb5uint32((from)->seq_number, (to)->seq_number)) goto fail;
4789 : }else
4790 81230 : (to)->seq_number = NULL;
4791 101364 : if((from)->authorization_data) {
4792 19794 : (to)->authorization_data = malloc(sizeof(*(to)->authorization_data));
4793 19794 : if((to)->authorization_data == NULL) goto fail;
4794 19794 : if(copy_AuthorizationData((from)->authorization_data, (to)->authorization_data)) goto fail;
4795 : }else
4796 81570 : (to)->authorization_data = NULL;
4797 98448 : return 0;
4798 0 : fail:
4799 0 : free_Authenticator(to);
4800 0 : return ENOMEM;
4801 : }
4802 :
4803 : int ASN1CALL
4804 144479 : encode_PA_DATA(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const PA_DATA *data, size_t *size)
4805 : {
4806 144479 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
4807 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
4808 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
4809 :
4810 : /* padata-value */
4811 : {
4812 144479 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
4813 144479 : ret = 0;
4814 144479 : e = der_put_octet_string(p, len, &(data)->padata_value, &l);
4815 144479 : if (e) return e;
4816 144479 : p -= l; len -= l; ret += l;
4817 :
4818 144479 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_OctetString, &l);
4819 144479 : if (e) return e;
4820 144479 : p -= l; len -= l; ret += l;
4821 :
4822 144479 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
4823 144479 : if (e) return e;
4824 144479 : p -= l; len -= l; ret += l;
4825 :
4826 144479 : ret += Top_tag_oldret;
4827 : }
4828 : /* padata-type */
4829 : {
4830 144479 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
4831 144479 : ret = 0;
4832 144479 : e = encode_PADATA_TYPE(p, len, &(data)->padata_type, &l);
4833 144479 : if (e) return e;
4834 144479 : p -= l; len -= l; ret += l;
4835 :
4836 144479 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
4837 144479 : if (e) return e;
4838 144479 : p -= l; len -= l; ret += l;
4839 :
4840 144479 : ret += Top_tag_oldret;
4841 : }
4842 144479 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
4843 144479 : if (e) return e;
4844 144479 : p -= l; len -= l; ret += l;
4845 :
4846 144479 : *size = ret;
4847 144479 : return 0;
4848 : }
4849 :
4850 : int ASN1CALL
4851 155916 : decode_PA_DATA(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, PA_DATA *data, size_t *size)
4852 : {
4853 155916 : size_t ret = 0;
4854 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
4855 : int e HEIMDAL_UNUSED_ATTRIBUTE;
4856 :
4857 155916 : memset(data, 0, sizeof(*data));
4858 : {
4859 : size_t Top_datalen, Top_oldlen;
4860 : Der_type Top_type;
4861 155916 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
4862 155916 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
4863 155916 : if(e) goto fail;
4864 155916 : p += l; len -= l; ret += l;
4865 155916 : Top_oldlen = len;
4866 155916 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
4867 155916 : len = Top_datalen;
4868 : {
4869 : size_t padata_type_datalen, padata_type_oldlen;
4870 : Der_type padata_type_type;
4871 155916 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &padata_type_type, 1, &padata_type_datalen, &l);
4872 155916 : if (e == 0 && padata_type_type != CONS) { e = ASN1_BAD_ID; }
4873 155916 : if(e) goto fail;
4874 155916 : p += l; len -= l; ret += l;
4875 155916 : padata_type_oldlen = len;
4876 155916 : if (padata_type_datalen > len) { e = ASN1_OVERRUN; goto fail; }
4877 155916 : len = padata_type_datalen;
4878 155916 : e = decode_PADATA_TYPE(p, len, &(data)->padata_type, &l);
4879 155916 : if(e) goto fail;
4880 155916 : p += l; len -= l; ret += l;
4881 155916 : len = padata_type_oldlen - padata_type_datalen;
4882 : }
4883 : {
4884 : size_t padata_value_datalen, padata_value_oldlen;
4885 : Der_type padata_value_type;
4886 155916 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &padata_value_type, 2, &padata_value_datalen, &l);
4887 308678 : if (e == 0 && padata_value_type != CONS) { e = ASN1_BAD_ID; }
4888 155916 : if(e) goto fail;
4889 155916 : p += l; len -= l; ret += l;
4890 155916 : padata_value_oldlen = len;
4891 155916 : if (padata_value_datalen > len) { e = ASN1_OVERRUN; goto fail; }
4892 155916 : len = padata_value_datalen;
4893 : {
4894 : size_t padata_value_Tag_datalen, padata_value_Tag_oldlen;
4895 : Der_type padata_value_Tag_type;
4896 155916 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &padata_value_Tag_type, UT_OctetString, &padata_value_Tag_datalen, &l);
4897 155916 : if (e == 0 && padata_value_Tag_type != PRIM) { e = ASN1_BAD_ID; }
4898 155916 : if(e) goto fail;
4899 155916 : p += l; len -= l; ret += l;
4900 155916 : padata_value_Tag_oldlen = len;
4901 155916 : if (padata_value_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
4902 155916 : len = padata_value_Tag_datalen;
4903 155916 : e = der_get_octet_string(p, len, &(data)->padata_value, &l);
4904 155916 : if(e) goto fail;
4905 155916 : p += l; len -= l; ret += l;
4906 155916 : len = padata_value_Tag_oldlen - padata_value_Tag_datalen;
4907 : }
4908 155916 : len = padata_value_oldlen - padata_value_datalen;
4909 : }
4910 155916 : len = Top_oldlen - Top_datalen;
4911 : }
4912 311832 : if(size) *size = ret;
4913 152762 : return 0;
4914 0 : fail:
4915 0 : free_PA_DATA(data);
4916 0 : return e;
4917 : }
4918 :
4919 : void ASN1CALL
4920 292474 : free_PA_DATA(PA_DATA *data)
4921 : {
4922 292474 : free_PADATA_TYPE(&(data)->padata_type);
4923 292474 : der_free_octet_string(&(data)->padata_value);
4924 292474 : }
4925 :
4926 : size_t ASN1CALL
4927 144479 : length_PA_DATA(const PA_DATA *data)
4928 : {
4929 144479 : size_t ret = 0;
4930 : {
4931 144479 : size_t Top_tag_oldret = ret;
4932 144479 : ret = 0;
4933 144479 : ret += length_PADATA_TYPE(&(data)->padata_type);
4934 144479 : ret += 1 + der_length_len (ret);
4935 144479 : ret += Top_tag_oldret;
4936 : }
4937 : {
4938 144479 : size_t Top_tag_oldret = ret;
4939 144479 : ret = 0;
4940 144479 : ret += der_length_octet_string(&(data)->padata_value);
4941 144479 : ret += 1 + der_length_len (ret);
4942 144479 : ret += 1 + der_length_len (ret);
4943 144479 : ret += Top_tag_oldret;
4944 : }
4945 144479 : ret += 1 + der_length_len (ret);
4946 144479 : return ret;
4947 : }
4948 :
4949 : int ASN1CALL
4950 1356 : copy_PA_DATA(const PA_DATA *from, PA_DATA *to)
4951 : {
4952 1356 : memset(to, 0, sizeof(*to));
4953 1356 : if(copy_PADATA_TYPE(&(from)->padata_type, &(to)->padata_type)) goto fail;
4954 1356 : if(der_copy_octet_string(&(from)->padata_value, &(to)->padata_value)) goto fail;
4955 1356 : return 0;
4956 0 : fail:
4957 0 : free_PA_DATA(to);
4958 0 : return ENOMEM;
4959 : }
4960 :
4961 : int ASN1CALL
4962 4900 : encode_ETYPE_INFO_ENTRY(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const ETYPE_INFO_ENTRY *data, size_t *size)
4963 : {
4964 4900 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
4965 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
4966 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
4967 :
4968 : /* salttype */
4969 4900 : if((data)->salttype) {
4970 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
4971 0 : ret = 0;
4972 0 : e = encode_krb5int32(p, len, (data)->salttype, &l);
4973 0 : if (e) return e;
4974 0 : p -= l; len -= l; ret += l;
4975 :
4976 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
4977 0 : if (e) return e;
4978 0 : p -= l; len -= l; ret += l;
4979 :
4980 0 : ret += Top_tag_oldret;
4981 : }
4982 : /* salt */
4983 4900 : if((data)->salt) {
4984 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
4985 0 : ret = 0;
4986 0 : e = der_put_octet_string(p, len, (data)->salt, &l);
4987 0 : if (e) return e;
4988 0 : p -= l; len -= l; ret += l;
4989 :
4990 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_OctetString, &l);
4991 0 : if (e) return e;
4992 0 : p -= l; len -= l; ret += l;
4993 :
4994 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
4995 0 : if (e) return e;
4996 0 : p -= l; len -= l; ret += l;
4997 :
4998 0 : ret += Top_tag_oldret;
4999 : }
5000 : /* etype */
5001 : {
5002 4900 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
5003 4900 : ret = 0;
5004 4900 : e = encode_ENCTYPE(p, len, &(data)->etype, &l);
5005 4900 : if (e) return e;
5006 4900 : p -= l; len -= l; ret += l;
5007 :
5008 4900 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
5009 4900 : if (e) return e;
5010 4900 : p -= l; len -= l; ret += l;
5011 :
5012 4900 : ret += Top_tag_oldret;
5013 : }
5014 4900 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
5015 4900 : if (e) return e;
5016 4900 : p -= l; len -= l; ret += l;
5017 :
5018 4900 : *size = ret;
5019 4900 : return 0;
5020 : }
5021 :
5022 : int ASN1CALL
5023 0 : decode_ETYPE_INFO_ENTRY(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, ETYPE_INFO_ENTRY *data, size_t *size)
5024 : {
5025 0 : size_t ret = 0;
5026 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
5027 : int e HEIMDAL_UNUSED_ATTRIBUTE;
5028 :
5029 0 : memset(data, 0, sizeof(*data));
5030 : {
5031 : size_t Top_datalen, Top_oldlen;
5032 : Der_type Top_type;
5033 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
5034 0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
5035 0 : if(e) goto fail;
5036 0 : p += l; len -= l; ret += l;
5037 0 : Top_oldlen = len;
5038 0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
5039 0 : len = Top_datalen;
5040 : {
5041 : size_t etype_datalen, etype_oldlen;
5042 : Der_type etype_type;
5043 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &etype_type, 0, &etype_datalen, &l);
5044 0 : if (e == 0 && etype_type != CONS) { e = ASN1_BAD_ID; }
5045 0 : if(e) goto fail;
5046 0 : p += l; len -= l; ret += l;
5047 0 : etype_oldlen = len;
5048 0 : if (etype_datalen > len) { e = ASN1_OVERRUN; goto fail; }
5049 0 : len = etype_datalen;
5050 0 : e = decode_ENCTYPE(p, len, &(data)->etype, &l);
5051 0 : if(e) goto fail;
5052 0 : p += l; len -= l; ret += l;
5053 0 : len = etype_oldlen - etype_datalen;
5054 : }
5055 : {
5056 : size_t salt_datalen, salt_oldlen;
5057 : Der_type salt_type;
5058 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &salt_type, 1, &salt_datalen, &l);
5059 0 : if (e == 0 && salt_type != CONS) { e = ASN1_BAD_ID; }
5060 0 : if(e) {
5061 0 : (data)->salt = NULL;
5062 : } else {
5063 0 : (data)->salt = calloc(1, sizeof(*(data)->salt));
5064 0 : if ((data)->salt == NULL) { e = ENOMEM; goto fail; }
5065 0 : p += l; len -= l; ret += l;
5066 0 : salt_oldlen = len;
5067 0 : if (salt_datalen > len) { e = ASN1_OVERRUN; goto fail; }
5068 0 : len = salt_datalen;
5069 : {
5070 : size_t salt_Tag_datalen, salt_Tag_oldlen;
5071 : Der_type salt_Tag_type;
5072 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &salt_Tag_type, UT_OctetString, &salt_Tag_datalen, &l);
5073 0 : if (e == 0 && salt_Tag_type != PRIM) { e = ASN1_BAD_ID; }
5074 0 : if(e) goto fail;
5075 0 : p += l; len -= l; ret += l;
5076 0 : salt_Tag_oldlen = len;
5077 0 : if (salt_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
5078 0 : len = salt_Tag_datalen;
5079 0 : e = der_get_octet_string(p, len, (data)->salt, &l);
5080 0 : if(e) goto fail;
5081 0 : p += l; len -= l; ret += l;
5082 0 : len = salt_Tag_oldlen - salt_Tag_datalen;
5083 : }
5084 0 : len = salt_oldlen - salt_datalen;
5085 : }
5086 : }
5087 : {
5088 : size_t salttype_datalen, salttype_oldlen;
5089 : Der_type salttype_type;
5090 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &salttype_type, 2, &salttype_datalen, &l);
5091 0 : if (e == 0 && salttype_type != CONS) { e = ASN1_BAD_ID; }
5092 0 : if(e) {
5093 0 : (data)->salttype = NULL;
5094 : } else {
5095 0 : (data)->salttype = calloc(1, sizeof(*(data)->salttype));
5096 0 : if ((data)->salttype == NULL) { e = ENOMEM; goto fail; }
5097 0 : p += l; len -= l; ret += l;
5098 0 : salttype_oldlen = len;
5099 0 : if (salttype_datalen > len) { e = ASN1_OVERRUN; goto fail; }
5100 0 : len = salttype_datalen;
5101 0 : e = decode_krb5int32(p, len, (data)->salttype, &l);
5102 0 : if(e) goto fail;
5103 0 : p += l; len -= l; ret += l;
5104 0 : len = salttype_oldlen - salttype_datalen;
5105 : }
5106 : }
5107 0 : len = Top_oldlen - Top_datalen;
5108 : }
5109 0 : if(size) *size = ret;
5110 0 : return 0;
5111 0 : fail:
5112 0 : free_ETYPE_INFO_ENTRY(data);
5113 0 : return e;
5114 : }
5115 :
5116 : void ASN1CALL
5117 4900 : free_ETYPE_INFO_ENTRY(ETYPE_INFO_ENTRY *data)
5118 : {
5119 4900 : free_ENCTYPE(&(data)->etype);
5120 4900 : if((data)->salt) {
5121 0 : der_free_octet_string((data)->salt);
5122 0 : free((data)->salt);
5123 0 : (data)->salt = NULL;
5124 : }
5125 4900 : if((data)->salttype) {
5126 0 : free_krb5int32((data)->salttype);
5127 0 : free((data)->salttype);
5128 0 : (data)->salttype = NULL;
5129 : }
5130 4900 : }
5131 :
5132 : size_t ASN1CALL
5133 4900 : length_ETYPE_INFO_ENTRY(const ETYPE_INFO_ENTRY *data)
5134 : {
5135 4900 : size_t ret = 0;
5136 : {
5137 4900 : size_t Top_tag_oldret = ret;
5138 4900 : ret = 0;
5139 4900 : ret += length_ENCTYPE(&(data)->etype);
5140 4900 : ret += 1 + der_length_len (ret);
5141 4900 : ret += Top_tag_oldret;
5142 : }
5143 4900 : if((data)->salt){
5144 0 : size_t Top_tag_oldret = ret;
5145 0 : ret = 0;
5146 0 : ret += der_length_octet_string((data)->salt);
5147 0 : ret += 1 + der_length_len (ret);
5148 0 : ret += 1 + der_length_len (ret);
5149 0 : ret += Top_tag_oldret;
5150 : }
5151 4900 : if((data)->salttype){
5152 0 : size_t Top_tag_oldret = ret;
5153 0 : ret = 0;
5154 0 : ret += length_krb5int32((data)->salttype);
5155 0 : ret += 1 + der_length_len (ret);
5156 0 : ret += Top_tag_oldret;
5157 : }
5158 4900 : ret += 1 + der_length_len (ret);
5159 4900 : return ret;
5160 : }
5161 :
5162 : int ASN1CALL
5163 0 : copy_ETYPE_INFO_ENTRY(const ETYPE_INFO_ENTRY *from, ETYPE_INFO_ENTRY *to)
5164 : {
5165 0 : memset(to, 0, sizeof(*to));
5166 0 : if(copy_ENCTYPE(&(from)->etype, &(to)->etype)) goto fail;
5167 0 : if((from)->salt) {
5168 0 : (to)->salt = malloc(sizeof(*(to)->salt));
5169 0 : if((to)->salt == NULL) goto fail;
5170 0 : if(der_copy_octet_string((from)->salt, (to)->salt)) goto fail;
5171 : }else
5172 0 : (to)->salt = NULL;
5173 0 : if((from)->salttype) {
5174 0 : (to)->salttype = malloc(sizeof(*(to)->salttype));
5175 0 : if((to)->salttype == NULL) goto fail;
5176 0 : if(copy_krb5int32((from)->salttype, (to)->salttype)) goto fail;
5177 : }else
5178 0 : (to)->salttype = NULL;
5179 0 : return 0;
5180 0 : fail:
5181 0 : free_ETYPE_INFO_ENTRY(to);
5182 0 : return ENOMEM;
5183 : }
5184 :
5185 : int ASN1CALL
5186 4900 : encode_ETYPE_INFO(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const ETYPE_INFO *data, size_t *size)
5187 : {
5188 4900 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
5189 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
5190 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
5191 :
5192 9800 : for(i = (int)(data)->len - 1; i >= 0; --i) {
5193 4900 : size_t Top_tag_for_oldret = ret;
5194 4900 : ret = 0;
5195 4900 : e = encode_ETYPE_INFO_ENTRY(p, len, &(data)->val[i], &l);
5196 4900 : if (e) return e;
5197 4900 : p -= l; len -= l; ret += l;
5198 :
5199 4900 : ret += Top_tag_for_oldret;
5200 : }
5201 4900 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
5202 4900 : if (e) return e;
5203 4900 : p -= l; len -= l; ret += l;
5204 :
5205 4900 : *size = ret;
5206 4900 : return 0;
5207 : }
5208 :
5209 : int ASN1CALL
5210 0 : decode_ETYPE_INFO(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, ETYPE_INFO *data, size_t *size)
5211 : {
5212 0 : size_t ret = 0;
5213 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
5214 : int e HEIMDAL_UNUSED_ATTRIBUTE;
5215 :
5216 0 : memset(data, 0, sizeof(*data));
5217 : {
5218 : size_t Top_datalen, Top_oldlen;
5219 : Der_type Top_type;
5220 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
5221 0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
5222 0 : if(e) goto fail;
5223 0 : p += l; len -= l; ret += l;
5224 0 : Top_oldlen = len;
5225 0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
5226 0 : len = Top_datalen;
5227 : {
5228 0 : size_t Top_Tag_origlen = len;
5229 0 : size_t Top_Tag_oldret = ret;
5230 0 : size_t Top_Tag_olen = 0;
5231 : void *Top_Tag_tmp;
5232 0 : ret = 0;
5233 0 : (data)->len = 0;
5234 0 : (data)->val = NULL;
5235 0 : while(ret < Top_Tag_origlen) {
5236 0 : size_t Top_Tag_nlen = Top_Tag_olen + sizeof(*((data)->val));
5237 0 : if (Top_Tag_olen > Top_Tag_nlen) { e = ASN1_OVERFLOW; goto fail; }
5238 0 : Top_Tag_olen = Top_Tag_nlen;
5239 0 : Top_Tag_tmp = realloc((data)->val, Top_Tag_olen);
5240 0 : if (Top_Tag_tmp == NULL) { e = ENOMEM; goto fail; }
5241 0 : (data)->val = Top_Tag_tmp;
5242 0 : e = decode_ETYPE_INFO_ENTRY(p, len, &(data)->val[(data)->len], &l);
5243 0 : if(e) goto fail;
5244 0 : p += l; len -= l; ret += l;
5245 0 : (data)->len++;
5246 0 : len = Top_Tag_origlen - ret;
5247 : }
5248 0 : ret += Top_Tag_oldret;
5249 : }
5250 0 : len = Top_oldlen - Top_datalen;
5251 : }
5252 0 : if(size) *size = ret;
5253 0 : return 0;
5254 0 : fail:
5255 0 : free_ETYPE_INFO(data);
5256 0 : return e;
5257 : }
5258 :
5259 : void ASN1CALL
5260 4900 : free_ETYPE_INFO(ETYPE_INFO *data)
5261 : {
5262 14700 : while((data)->len){
5263 4900 : free_ETYPE_INFO_ENTRY(&(data)->val[(data)->len-1]);
5264 4900 : (data)->len--;
5265 : }
5266 4900 : free((data)->val);
5267 4900 : (data)->val = NULL;
5268 4900 : }
5269 :
5270 : size_t ASN1CALL
5271 4900 : length_ETYPE_INFO(const ETYPE_INFO *data)
5272 : {
5273 4900 : size_t ret = 0;
5274 : {
5275 4900 : size_t Top_tag_oldret = ret;
5276 : int i;
5277 4900 : ret = 0;
5278 9800 : for(i = (data)->len - 1; i >= 0; --i){
5279 4900 : size_t Top_tag_for_oldret = ret;
5280 4900 : ret = 0;
5281 4900 : ret += length_ETYPE_INFO_ENTRY(&(data)->val[i]);
5282 4900 : ret += Top_tag_for_oldret;
5283 : }
5284 4900 : ret += Top_tag_oldret;
5285 : }
5286 4900 : ret += 1 + der_length_len (ret);
5287 4900 : return ret;
5288 : }
5289 :
5290 : int ASN1CALL
5291 0 : copy_ETYPE_INFO(const ETYPE_INFO *from, ETYPE_INFO *to)
5292 : {
5293 0 : memset(to, 0, sizeof(*to));
5294 0 : if(((to)->val = malloc((from)->len * sizeof(*(to)->val))) == NULL && (from)->len != 0)
5295 0 : goto fail;
5296 0 : for((to)->len = 0; (to)->len < (from)->len; (to)->len++){
5297 0 : if(copy_ETYPE_INFO_ENTRY(&(from)->val[(to)->len], &(to)->val[(to)->len])) goto fail;
5298 : }
5299 0 : return 0;
5300 0 : fail:
5301 0 : free_ETYPE_INFO(to);
5302 0 : return ENOMEM;
5303 : }
5304 :
5305 : int ASN1CALL
5306 0 : add_ETYPE_INFO(ETYPE_INFO *data, const ETYPE_INFO_ENTRY *element)
5307 : {
5308 : int ret;
5309 : void *ptr;
5310 :
5311 0 : ptr = realloc(data->val,
5312 0 : (data->len + 1) * sizeof(data->val[0]));
5313 0 : if (ptr == NULL) return ENOMEM;
5314 0 : data->val = ptr;
5315 :
5316 0 : ret = copy_ETYPE_INFO_ENTRY(element, &data->val[data->len]);
5317 0 : if (ret) return ret;
5318 0 : data->len++;
5319 0 : return 0;
5320 : }
5321 :
5322 : int ASN1CALL
5323 0 : remove_ETYPE_INFO(ETYPE_INFO *data, unsigned int element)
5324 : {
5325 : void *ptr;
5326 :
5327 0 : if (data->len == 0 || element >= data->len)
5328 0 : return ASN1_OVERRUN;
5329 0 : free_ETYPE_INFO_ENTRY(&data->val[element]);
5330 0 : data->len--;
5331 0 : if (element < data->len)
5332 0 : memmove(&data->val[element], &data->val[element + 1],
5333 0 : sizeof(data->val[0]) * data->len);
5334 0 : ptr = realloc(data->val, data->len * sizeof(data->val[0]));
5335 0 : if (ptr != NULL || data->len == 0) data->val = ptr;
5336 0 : return 0;
5337 : }
5338 :
5339 : int ASN1CALL
5340 14736 : encode_ETYPE_INFO2_ENTRY(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const ETYPE_INFO2_ENTRY *data, size_t *size)
5341 : {
5342 14736 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
5343 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
5344 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
5345 :
5346 : /* s2kparams */
5347 14736 : if((data)->s2kparams) {
5348 9836 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
5349 9836 : ret = 0;
5350 9836 : e = der_put_octet_string(p, len, (data)->s2kparams, &l);
5351 9836 : if (e) return e;
5352 9836 : p -= l; len -= l; ret += l;
5353 :
5354 9836 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_OctetString, &l);
5355 9836 : if (e) return e;
5356 9836 : p -= l; len -= l; ret += l;
5357 :
5358 9836 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
5359 9836 : if (e) return e;
5360 9836 : p -= l; len -= l; ret += l;
5361 :
5362 9836 : ret += Top_tag_oldret;
5363 : }
5364 : /* salt */
5365 14736 : if((data)->salt) {
5366 9804 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
5367 9804 : ret = 0;
5368 9804 : e = encode_KerberosString(p, len, (data)->salt, &l);
5369 9804 : if (e) return e;
5370 9804 : p -= l; len -= l; ret += l;
5371 :
5372 9804 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
5373 9804 : if (e) return e;
5374 9804 : p -= l; len -= l; ret += l;
5375 :
5376 9804 : ret += Top_tag_oldret;
5377 : }
5378 : /* etype */
5379 : {
5380 14736 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
5381 14736 : ret = 0;
5382 14736 : e = encode_ENCTYPE(p, len, &(data)->etype, &l);
5383 14736 : if (e) return e;
5384 14736 : p -= l; len -= l; ret += l;
5385 :
5386 14736 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
5387 14736 : if (e) return e;
5388 14736 : p -= l; len -= l; ret += l;
5389 :
5390 14736 : ret += Top_tag_oldret;
5391 : }
5392 14736 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
5393 14736 : if (e) return e;
5394 14736 : p -= l; len -= l; ret += l;
5395 :
5396 14736 : *size = ret;
5397 14736 : return 0;
5398 : }
5399 :
5400 : int ASN1CALL
5401 13627 : decode_ETYPE_INFO2_ENTRY(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, ETYPE_INFO2_ENTRY *data, size_t *size)
5402 : {
5403 13627 : size_t ret = 0;
5404 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
5405 : int e HEIMDAL_UNUSED_ATTRIBUTE;
5406 :
5407 13627 : memset(data, 0, sizeof(*data));
5408 : {
5409 : size_t Top_datalen, Top_oldlen;
5410 : Der_type Top_type;
5411 13627 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
5412 13627 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
5413 13627 : if(e) goto fail;
5414 13627 : p += l; len -= l; ret += l;
5415 13627 : Top_oldlen = len;
5416 13627 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
5417 13627 : len = Top_datalen;
5418 : {
5419 : size_t etype_datalen, etype_oldlen;
5420 : Der_type etype_type;
5421 13627 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &etype_type, 0, &etype_datalen, &l);
5422 13627 : if (e == 0 && etype_type != CONS) { e = ASN1_BAD_ID; }
5423 13627 : if(e) goto fail;
5424 13627 : p += l; len -= l; ret += l;
5425 13627 : etype_oldlen = len;
5426 13627 : if (etype_datalen > len) { e = ASN1_OVERRUN; goto fail; }
5427 13627 : len = etype_datalen;
5428 13627 : e = decode_ENCTYPE(p, len, &(data)->etype, &l);
5429 13627 : if(e) goto fail;
5430 13627 : p += l; len -= l; ret += l;
5431 13627 : len = etype_oldlen - etype_datalen;
5432 : }
5433 : {
5434 : size_t salt_datalen, salt_oldlen;
5435 : Der_type salt_type;
5436 13627 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &salt_type, 1, &salt_datalen, &l);
5437 22750 : if (e == 0 && salt_type != CONS) { e = ASN1_BAD_ID; }
5438 13627 : if(e) {
5439 4291 : (data)->salt = NULL;
5440 : } else {
5441 9336 : (data)->salt = calloc(1, sizeof(*(data)->salt));
5442 9336 : if ((data)->salt == NULL) { e = ENOMEM; goto fail; }
5443 9336 : p += l; len -= l; ret += l;
5444 9336 : salt_oldlen = len;
5445 9336 : if (salt_datalen > len) { e = ASN1_OVERRUN; goto fail; }
5446 9336 : len = salt_datalen;
5447 9336 : e = decode_KerberosString(p, len, (data)->salt, &l);
5448 9336 : if(e) goto fail;
5449 9336 : p += l; len -= l; ret += l;
5450 9336 : len = salt_oldlen - salt_datalen;
5451 : }
5452 : }
5453 : {
5454 : size_t s2kparams_datalen, s2kparams_oldlen;
5455 : Der_type s2kparams_type;
5456 13627 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &s2kparams_type, 2, &s2kparams_datalen, &l);
5457 22979 : if (e == 0 && s2kparams_type != CONS) { e = ASN1_BAD_ID; }
5458 13627 : if(e) {
5459 4275 : (data)->s2kparams = NULL;
5460 : } else {
5461 9352 : (data)->s2kparams = calloc(1, sizeof(*(data)->s2kparams));
5462 9352 : if ((data)->s2kparams == NULL) { e = ENOMEM; goto fail; }
5463 9352 : p += l; len -= l; ret += l;
5464 9352 : s2kparams_oldlen = len;
5465 9352 : if (s2kparams_datalen > len) { e = ASN1_OVERRUN; goto fail; }
5466 9352 : len = s2kparams_datalen;
5467 : {
5468 : size_t s2kparams_Tag_datalen, s2kparams_Tag_oldlen;
5469 : Der_type s2kparams_Tag_type;
5470 9352 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &s2kparams_Tag_type, UT_OctetString, &s2kparams_Tag_datalen, &l);
5471 9352 : if (e == 0 && s2kparams_Tag_type != PRIM) { e = ASN1_BAD_ID; }
5472 9352 : if(e) goto fail;
5473 9352 : p += l; len -= l; ret += l;
5474 9352 : s2kparams_Tag_oldlen = len;
5475 9352 : if (s2kparams_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
5476 9352 : len = s2kparams_Tag_datalen;
5477 9352 : e = der_get_octet_string(p, len, (data)->s2kparams, &l);
5478 9352 : if(e) goto fail;
5479 9352 : p += l; len -= l; ret += l;
5480 9352 : len = s2kparams_Tag_oldlen - s2kparams_Tag_datalen;
5481 : }
5482 9352 : len = s2kparams_oldlen - s2kparams_datalen;
5483 : }
5484 : }
5485 13627 : len = Top_oldlen - Top_datalen;
5486 : }
5487 27254 : if(size) *size = ret;
5488 13332 : return 0;
5489 0 : fail:
5490 0 : free_ETYPE_INFO2_ENTRY(data);
5491 0 : return e;
5492 : }
5493 :
5494 : void ASN1CALL
5495 28363 : free_ETYPE_INFO2_ENTRY(ETYPE_INFO2_ENTRY *data)
5496 : {
5497 28363 : free_ENCTYPE(&(data)->etype);
5498 28363 : if((data)->salt) {
5499 19140 : free_KerberosString((data)->salt);
5500 19140 : free((data)->salt);
5501 19140 : (data)->salt = NULL;
5502 : }
5503 28363 : if((data)->s2kparams) {
5504 19188 : der_free_octet_string((data)->s2kparams);
5505 19188 : free((data)->s2kparams);
5506 19188 : (data)->s2kparams = NULL;
5507 : }
5508 28363 : }
5509 :
5510 : size_t ASN1CALL
5511 14736 : length_ETYPE_INFO2_ENTRY(const ETYPE_INFO2_ENTRY *data)
5512 : {
5513 14736 : size_t ret = 0;
5514 : {
5515 14736 : size_t Top_tag_oldret = ret;
5516 14736 : ret = 0;
5517 14736 : ret += length_ENCTYPE(&(data)->etype);
5518 14736 : ret += 1 + der_length_len (ret);
5519 14736 : ret += Top_tag_oldret;
5520 : }
5521 14736 : if((data)->salt){
5522 9804 : size_t Top_tag_oldret = ret;
5523 9804 : ret = 0;
5524 9804 : ret += length_KerberosString((data)->salt);
5525 9804 : ret += 1 + der_length_len (ret);
5526 9804 : ret += Top_tag_oldret;
5527 : }
5528 14736 : if((data)->s2kparams){
5529 9836 : size_t Top_tag_oldret = ret;
5530 9836 : ret = 0;
5531 9836 : ret += der_length_octet_string((data)->s2kparams);
5532 9836 : ret += 1 + der_length_len (ret);
5533 9836 : ret += 1 + der_length_len (ret);
5534 9836 : ret += Top_tag_oldret;
5535 : }
5536 14736 : ret += 1 + der_length_len (ret);
5537 14736 : return ret;
5538 : }
5539 :
5540 : int ASN1CALL
5541 0 : copy_ETYPE_INFO2_ENTRY(const ETYPE_INFO2_ENTRY *from, ETYPE_INFO2_ENTRY *to)
5542 : {
5543 0 : memset(to, 0, sizeof(*to));
5544 0 : if(copy_ENCTYPE(&(from)->etype, &(to)->etype)) goto fail;
5545 0 : if((from)->salt) {
5546 0 : (to)->salt = malloc(sizeof(*(to)->salt));
5547 0 : if((to)->salt == NULL) goto fail;
5548 0 : if(copy_KerberosString((from)->salt, (to)->salt)) goto fail;
5549 : }else
5550 0 : (to)->salt = NULL;
5551 0 : if((from)->s2kparams) {
5552 0 : (to)->s2kparams = malloc(sizeof(*(to)->s2kparams));
5553 0 : if((to)->s2kparams == NULL) goto fail;
5554 0 : if(der_copy_octet_string((from)->s2kparams, (to)->s2kparams)) goto fail;
5555 : }else
5556 0 : (to)->s2kparams = NULL;
5557 0 : return 0;
5558 0 : fail:
5559 0 : free_ETYPE_INFO2_ENTRY(to);
5560 0 : return ENOMEM;
5561 : }
5562 :
5563 : int ASN1CALL
5564 14736 : encode_ETYPE_INFO2(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const ETYPE_INFO2 *data, size_t *size)
5565 : {
5566 14736 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
5567 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
5568 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
5569 :
5570 29472 : for(i = (int)(data)->len - 1; i >= 0; --i) {
5571 14736 : size_t Top_tag_for_oldret = ret;
5572 14736 : ret = 0;
5573 14736 : e = encode_ETYPE_INFO2_ENTRY(p, len, &(data)->val[i], &l);
5574 14736 : if (e) return e;
5575 14736 : p -= l; len -= l; ret += l;
5576 :
5577 14736 : ret += Top_tag_for_oldret;
5578 : }
5579 14736 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
5580 14736 : if (e) return e;
5581 14736 : p -= l; len -= l; ret += l;
5582 :
5583 14736 : *size = ret;
5584 14736 : return 0;
5585 : }
5586 :
5587 : int ASN1CALL
5588 13627 : decode_ETYPE_INFO2(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, ETYPE_INFO2 *data, size_t *size)
5589 : {
5590 13627 : size_t ret = 0;
5591 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
5592 : int e HEIMDAL_UNUSED_ATTRIBUTE;
5593 :
5594 13627 : memset(data, 0, sizeof(*data));
5595 : {
5596 : size_t Top_datalen, Top_oldlen;
5597 : Der_type Top_type;
5598 13627 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
5599 13627 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
5600 13627 : if(e) goto fail;
5601 13627 : p += l; len -= l; ret += l;
5602 13627 : Top_oldlen = len;
5603 13627 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
5604 13627 : len = Top_datalen;
5605 : {
5606 13627 : size_t Top_Tag_origlen = len;
5607 13627 : size_t Top_Tag_oldret = ret;
5608 13627 : size_t Top_Tag_olen = 0;
5609 : void *Top_Tag_tmp;
5610 13627 : ret = 0;
5611 13627 : (data)->len = 0;
5612 13627 : (data)->val = NULL;
5613 40881 : while(ret < Top_Tag_origlen) {
5614 13627 : size_t Top_Tag_nlen = Top_Tag_olen + sizeof(*((data)->val));
5615 13627 : if (Top_Tag_olen > Top_Tag_nlen) { e = ASN1_OVERFLOW; goto fail; }
5616 13627 : Top_Tag_olen = Top_Tag_nlen;
5617 13627 : Top_Tag_tmp = realloc((data)->val, Top_Tag_olen);
5618 13627 : if (Top_Tag_tmp == NULL) { e = ENOMEM; goto fail; }
5619 13627 : (data)->val = Top_Tag_tmp;
5620 13627 : e = decode_ETYPE_INFO2_ENTRY(p, len, &(data)->val[(data)->len], &l);
5621 13627 : if(e) goto fail;
5622 13627 : p += l; len -= l; ret += l;
5623 13627 : (data)->len++;
5624 13627 : len = Top_Tag_origlen - ret;
5625 : }
5626 13627 : ret += Top_Tag_oldret;
5627 : }
5628 13627 : if ((data)->len < 1) {
5629 0 : e = ASN1_MIN_CONSTRAINT; goto fail;
5630 : }
5631 13627 : len = Top_oldlen - Top_datalen;
5632 : }
5633 27254 : if(size) *size = ret;
5634 13332 : return 0;
5635 0 : fail:
5636 0 : free_ETYPE_INFO2(data);
5637 0 : return e;
5638 : }
5639 :
5640 : void ASN1CALL
5641 28363 : free_ETYPE_INFO2(ETYPE_INFO2 *data)
5642 : {
5643 85089 : while((data)->len){
5644 28363 : free_ETYPE_INFO2_ENTRY(&(data)->val[(data)->len-1]);
5645 28363 : (data)->len--;
5646 : }
5647 28363 : free((data)->val);
5648 28363 : (data)->val = NULL;
5649 28363 : }
5650 :
5651 : size_t ASN1CALL
5652 14736 : length_ETYPE_INFO2(const ETYPE_INFO2 *data)
5653 : {
5654 14736 : size_t ret = 0;
5655 : {
5656 14736 : size_t Top_tag_oldret = ret;
5657 : int i;
5658 14736 : ret = 0;
5659 29472 : for(i = (data)->len - 1; i >= 0; --i){
5660 14736 : size_t Top_tag_for_oldret = ret;
5661 14736 : ret = 0;
5662 14736 : ret += length_ETYPE_INFO2_ENTRY(&(data)->val[i]);
5663 14736 : ret += Top_tag_for_oldret;
5664 : }
5665 14736 : ret += Top_tag_oldret;
5666 : }
5667 14736 : ret += 1 + der_length_len (ret);
5668 14736 : return ret;
5669 : }
5670 :
5671 : int ASN1CALL
5672 0 : copy_ETYPE_INFO2(const ETYPE_INFO2 *from, ETYPE_INFO2 *to)
5673 : {
5674 0 : memset(to, 0, sizeof(*to));
5675 0 : if(((to)->val = malloc((from)->len * sizeof(*(to)->val))) == NULL && (from)->len != 0)
5676 0 : goto fail;
5677 0 : for((to)->len = 0; (to)->len < (from)->len; (to)->len++){
5678 0 : if(copy_ETYPE_INFO2_ENTRY(&(from)->val[(to)->len], &(to)->val[(to)->len])) goto fail;
5679 : }
5680 0 : return 0;
5681 0 : fail:
5682 0 : free_ETYPE_INFO2(to);
5683 0 : return ENOMEM;
5684 : }
5685 :
5686 : int ASN1CALL
5687 0 : add_ETYPE_INFO2(ETYPE_INFO2 *data, const ETYPE_INFO2_ENTRY *element)
5688 : {
5689 : int ret;
5690 : void *ptr;
5691 :
5692 0 : ptr = realloc(data->val,
5693 0 : (data->len + 1) * sizeof(data->val[0]));
5694 0 : if (ptr == NULL) return ENOMEM;
5695 0 : data->val = ptr;
5696 :
5697 0 : ret = copy_ETYPE_INFO2_ENTRY(element, &data->val[data->len]);
5698 0 : if (ret) return ret;
5699 0 : data->len++;
5700 0 : return 0;
5701 : }
5702 :
5703 : int ASN1CALL
5704 0 : remove_ETYPE_INFO2(ETYPE_INFO2 *data, unsigned int element)
5705 : {
5706 : void *ptr;
5707 :
5708 0 : if (data->len == 0 || element >= data->len)
5709 0 : return ASN1_OVERRUN;
5710 0 : free_ETYPE_INFO2_ENTRY(&data->val[element]);
5711 0 : data->len--;
5712 0 : if (element < data->len)
5713 0 : memmove(&data->val[element], &data->val[element + 1],
5714 0 : sizeof(data->val[0]) * data->len);
5715 0 : ptr = realloc(data->val, data->len * sizeof(data->val[0]));
5716 0 : if (ptr != NULL || data->len == 0) data->val = ptr;
5717 0 : return 0;
5718 : }
5719 :
5720 : int ASN1CALL
5721 94297 : encode_METHOD_DATA(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const METHOD_DATA *data, size_t *size)
5722 : {
5723 94297 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
5724 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
5725 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
5726 :
5727 238766 : for(i = (int)(data)->len - 1; i >= 0; --i) {
5728 144469 : size_t Top_tag_for_oldret = ret;
5729 144469 : ret = 0;
5730 144469 : e = encode_PA_DATA(p, len, &(data)->val[i], &l);
5731 144469 : if (e) return e;
5732 144469 : p -= l; len -= l; ret += l;
5733 :
5734 144469 : ret += Top_tag_for_oldret;
5735 : }
5736 94297 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
5737 94297 : if (e) return e;
5738 94297 : p -= l; len -= l; ret += l;
5739 :
5740 94297 : *size = ret;
5741 94297 : return 0;
5742 : }
5743 :
5744 : int ASN1CALL
5745 108630 : decode_METHOD_DATA(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, METHOD_DATA *data, size_t *size)
5746 : {
5747 108630 : size_t ret = 0;
5748 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
5749 : int e HEIMDAL_UNUSED_ATTRIBUTE;
5750 :
5751 108630 : memset(data, 0, sizeof(*data));
5752 : {
5753 : size_t Top_datalen, Top_oldlen;
5754 : Der_type Top_type;
5755 108630 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
5756 108630 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
5757 108630 : if(e) goto fail;
5758 108630 : p += l; len -= l; ret += l;
5759 108630 : Top_oldlen = len;
5760 108630 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
5761 108630 : len = Top_datalen;
5762 : {
5763 108630 : size_t Top_Tag_origlen = len;
5764 108630 : size_t Top_Tag_oldret = ret;
5765 108630 : size_t Top_Tag_olen = 0;
5766 : void *Top_Tag_tmp;
5767 108630 : ret = 0;
5768 108630 : (data)->len = 0;
5769 108630 : (data)->val = NULL;
5770 373176 : while(ret < Top_Tag_origlen) {
5771 155916 : size_t Top_Tag_nlen = Top_Tag_olen + sizeof(*((data)->val));
5772 155916 : if (Top_Tag_olen > Top_Tag_nlen) { e = ASN1_OVERFLOW; goto fail; }
5773 155916 : Top_Tag_olen = Top_Tag_nlen;
5774 155916 : Top_Tag_tmp = realloc((data)->val, Top_Tag_olen);
5775 155916 : if (Top_Tag_tmp == NULL) { e = ENOMEM; goto fail; }
5776 155916 : (data)->val = Top_Tag_tmp;
5777 155916 : e = decode_PA_DATA(p, len, &(data)->val[(data)->len], &l);
5778 155916 : if(e) goto fail;
5779 155916 : p += l; len -= l; ret += l;
5780 155916 : (data)->len++;
5781 155916 : len = Top_Tag_origlen - ret;
5782 : }
5783 108630 : ret += Top_Tag_oldret;
5784 : }
5785 108630 : len = Top_oldlen - Top_datalen;
5786 : }
5787 203633 : if(size) *size = ret;
5788 106443 : return 0;
5789 0 : fail:
5790 0 : free_METHOD_DATA(data);
5791 0 : return e;
5792 : }
5793 :
5794 : void ASN1CALL
5795 314957 : free_METHOD_DATA(METHOD_DATA *data)
5796 : {
5797 922388 : while((data)->len){
5798 292474 : free_PA_DATA(&(data)->val[(data)->len-1]);
5799 292474 : (data)->len--;
5800 : }
5801 314957 : free((data)->val);
5802 314957 : (data)->val = NULL;
5803 314957 : }
5804 :
5805 : size_t ASN1CALL
5806 94297 : length_METHOD_DATA(const METHOD_DATA *data)
5807 : {
5808 94297 : size_t ret = 0;
5809 : {
5810 94297 : size_t Top_tag_oldret = ret;
5811 : int i;
5812 94297 : ret = 0;
5813 238766 : for(i = (data)->len - 1; i >= 0; --i){
5814 144469 : size_t Top_tag_for_oldret = ret;
5815 144469 : ret = 0;
5816 144469 : ret += length_PA_DATA(&(data)->val[i]);
5817 144469 : ret += Top_tag_for_oldret;
5818 : }
5819 94297 : ret += Top_tag_oldret;
5820 : }
5821 94297 : ret += 1 + der_length_len (ret);
5822 94297 : return ret;
5823 : }
5824 :
5825 : int ASN1CALL
5826 302 : copy_METHOD_DATA(const METHOD_DATA *from, METHOD_DATA *to)
5827 : {
5828 302 : memset(to, 0, sizeof(*to));
5829 302 : if(((to)->val = malloc((from)->len * sizeof(*(to)->val))) == NULL && (from)->len != 0)
5830 0 : goto fail;
5831 604 : for((to)->len = 0; (to)->len < (from)->len; (to)->len++){
5832 302 : if(copy_PA_DATA(&(from)->val[(to)->len], &(to)->val[(to)->len])) goto fail;
5833 : }
5834 302 : return 0;
5835 0 : fail:
5836 0 : free_METHOD_DATA(to);
5837 0 : return ENOMEM;
5838 : }
5839 :
5840 : int ASN1CALL
5841 302 : add_METHOD_DATA(METHOD_DATA *data, const PA_DATA *element)
5842 : {
5843 : int ret;
5844 : void *ptr;
5845 :
5846 302 : ptr = realloc(data->val,
5847 302 : (data->len + 1) * sizeof(data->val[0]));
5848 302 : if (ptr == NULL) return ENOMEM;
5849 302 : data->val = ptr;
5850 :
5851 302 : ret = copy_PA_DATA(element, &data->val[data->len]);
5852 302 : if (ret) return ret;
5853 302 : data->len++;
5854 302 : return 0;
5855 : }
5856 :
5857 : int ASN1CALL
5858 0 : remove_METHOD_DATA(METHOD_DATA *data, unsigned int element)
5859 : {
5860 : void *ptr;
5861 :
5862 0 : if (data->len == 0 || element >= data->len)
5863 0 : return ASN1_OVERRUN;
5864 0 : free_PA_DATA(&data->val[element]);
5865 0 : data->len--;
5866 0 : if (element < data->len)
5867 0 : memmove(&data->val[element], &data->val[element + 1],
5868 0 : sizeof(data->val[0]) * data->len);
5869 0 : ptr = realloc(data->val, data->len * sizeof(data->val[0]));
5870 0 : if (ptr != NULL || data->len == 0) data->val = ptr;
5871 0 : return 0;
5872 : }
5873 :
5874 : int ASN1CALL
5875 0 : encode_TypedData(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const TypedData *data, size_t *size)
5876 : {
5877 0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
5878 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
5879 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
5880 :
5881 : /* data-value */
5882 0 : if((data)->data_value) {
5883 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
5884 0 : ret = 0;
5885 0 : e = der_put_octet_string(p, len, (data)->data_value, &l);
5886 0 : if (e) return e;
5887 0 : p -= l; len -= l; ret += l;
5888 :
5889 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_OctetString, &l);
5890 0 : if (e) return e;
5891 0 : p -= l; len -= l; ret += l;
5892 :
5893 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
5894 0 : if (e) return e;
5895 0 : p -= l; len -= l; ret += l;
5896 :
5897 0 : ret += Top_tag_oldret;
5898 : }
5899 : /* data-type */
5900 : {
5901 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
5902 0 : ret = 0;
5903 0 : e = encode_krb5int32(p, len, &(data)->data_type, &l);
5904 0 : if (e) return e;
5905 0 : p -= l; len -= l; ret += l;
5906 :
5907 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
5908 0 : if (e) return e;
5909 0 : p -= l; len -= l; ret += l;
5910 :
5911 0 : ret += Top_tag_oldret;
5912 : }
5913 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
5914 0 : if (e) return e;
5915 0 : p -= l; len -= l; ret += l;
5916 :
5917 0 : *size = ret;
5918 0 : return 0;
5919 : }
5920 :
5921 : int ASN1CALL
5922 0 : decode_TypedData(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, TypedData *data, size_t *size)
5923 : {
5924 0 : size_t ret = 0;
5925 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
5926 : int e HEIMDAL_UNUSED_ATTRIBUTE;
5927 :
5928 0 : memset(data, 0, sizeof(*data));
5929 : {
5930 : size_t Top_datalen, Top_oldlen;
5931 : Der_type Top_type;
5932 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
5933 0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
5934 0 : if(e) goto fail;
5935 0 : p += l; len -= l; ret += l;
5936 0 : Top_oldlen = len;
5937 0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
5938 0 : len = Top_datalen;
5939 : {
5940 : size_t data_type_datalen, data_type_oldlen;
5941 : Der_type data_type_type;
5942 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &data_type_type, 0, &data_type_datalen, &l);
5943 0 : if (e == 0 && data_type_type != CONS) { e = ASN1_BAD_ID; }
5944 0 : if(e) goto fail;
5945 0 : p += l; len -= l; ret += l;
5946 0 : data_type_oldlen = len;
5947 0 : if (data_type_datalen > len) { e = ASN1_OVERRUN; goto fail; }
5948 0 : len = data_type_datalen;
5949 0 : e = decode_krb5int32(p, len, &(data)->data_type, &l);
5950 0 : if(e) goto fail;
5951 0 : p += l; len -= l; ret += l;
5952 0 : len = data_type_oldlen - data_type_datalen;
5953 : }
5954 : {
5955 : size_t data_value_datalen, data_value_oldlen;
5956 : Der_type data_value_type;
5957 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &data_value_type, 1, &data_value_datalen, &l);
5958 0 : if (e == 0 && data_value_type != CONS) { e = ASN1_BAD_ID; }
5959 0 : if(e) {
5960 0 : (data)->data_value = NULL;
5961 : } else {
5962 0 : (data)->data_value = calloc(1, sizeof(*(data)->data_value));
5963 0 : if ((data)->data_value == NULL) { e = ENOMEM; goto fail; }
5964 0 : p += l; len -= l; ret += l;
5965 0 : data_value_oldlen = len;
5966 0 : if (data_value_datalen > len) { e = ASN1_OVERRUN; goto fail; }
5967 0 : len = data_value_datalen;
5968 : {
5969 : size_t data_value_Tag_datalen, data_value_Tag_oldlen;
5970 : Der_type data_value_Tag_type;
5971 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &data_value_Tag_type, UT_OctetString, &data_value_Tag_datalen, &l);
5972 0 : if (e == 0 && data_value_Tag_type != PRIM) { e = ASN1_BAD_ID; }
5973 0 : if(e) goto fail;
5974 0 : p += l; len -= l; ret += l;
5975 0 : data_value_Tag_oldlen = len;
5976 0 : if (data_value_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
5977 0 : len = data_value_Tag_datalen;
5978 0 : e = der_get_octet_string(p, len, (data)->data_value, &l);
5979 0 : if(e) goto fail;
5980 0 : p += l; len -= l; ret += l;
5981 0 : len = data_value_Tag_oldlen - data_value_Tag_datalen;
5982 : }
5983 0 : len = data_value_oldlen - data_value_datalen;
5984 : }
5985 : }
5986 0 : len = Top_oldlen - Top_datalen;
5987 : }
5988 0 : if(size) *size = ret;
5989 0 : return 0;
5990 0 : fail:
5991 0 : free_TypedData(data);
5992 0 : return e;
5993 : }
5994 :
5995 : void ASN1CALL
5996 0 : free_TypedData(TypedData *data)
5997 : {
5998 0 : free_krb5int32(&(data)->data_type);
5999 0 : if((data)->data_value) {
6000 0 : der_free_octet_string((data)->data_value);
6001 0 : free((data)->data_value);
6002 0 : (data)->data_value = NULL;
6003 : }
6004 0 : }
6005 :
6006 : size_t ASN1CALL
6007 0 : length_TypedData(const TypedData *data)
6008 : {
6009 0 : size_t ret = 0;
6010 : {
6011 0 : size_t Top_tag_oldret = ret;
6012 0 : ret = 0;
6013 0 : ret += length_krb5int32(&(data)->data_type);
6014 0 : ret += 1 + der_length_len (ret);
6015 0 : ret += Top_tag_oldret;
6016 : }
6017 0 : if((data)->data_value){
6018 0 : size_t Top_tag_oldret = ret;
6019 0 : ret = 0;
6020 0 : ret += der_length_octet_string((data)->data_value);
6021 0 : ret += 1 + der_length_len (ret);
6022 0 : ret += 1 + der_length_len (ret);
6023 0 : ret += Top_tag_oldret;
6024 : }
6025 0 : ret += 1 + der_length_len (ret);
6026 0 : return ret;
6027 : }
6028 :
6029 : int ASN1CALL
6030 0 : copy_TypedData(const TypedData *from, TypedData *to)
6031 : {
6032 0 : memset(to, 0, sizeof(*to));
6033 0 : if(copy_krb5int32(&(from)->data_type, &(to)->data_type)) goto fail;
6034 0 : if((from)->data_value) {
6035 0 : (to)->data_value = malloc(sizeof(*(to)->data_value));
6036 0 : if((to)->data_value == NULL) goto fail;
6037 0 : if(der_copy_octet_string((from)->data_value, (to)->data_value)) goto fail;
6038 : }else
6039 0 : (to)->data_value = NULL;
6040 0 : return 0;
6041 0 : fail:
6042 0 : free_TypedData(to);
6043 0 : return ENOMEM;
6044 : }
6045 :
6046 : int ASN1CALL
6047 0 : encode_TYPED_DATA(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const TYPED_DATA *data, size_t *size)
6048 : {
6049 0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
6050 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
6051 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
6052 :
6053 0 : for(i = (int)(data)->len - 1; i >= 0; --i) {
6054 0 : size_t Top_tag_for_oldret = ret;
6055 0 : ret = 0;
6056 0 : e = encode_TypedData(p, len, &(data)->val[i], &l);
6057 0 : if (e) return e;
6058 0 : p -= l; len -= l; ret += l;
6059 :
6060 0 : ret += Top_tag_for_oldret;
6061 : }
6062 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
6063 0 : if (e) return e;
6064 0 : p -= l; len -= l; ret += l;
6065 :
6066 0 : *size = ret;
6067 0 : return 0;
6068 : }
6069 :
6070 : int ASN1CALL
6071 0 : decode_TYPED_DATA(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, TYPED_DATA *data, size_t *size)
6072 : {
6073 0 : size_t ret = 0;
6074 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
6075 : int e HEIMDAL_UNUSED_ATTRIBUTE;
6076 :
6077 0 : memset(data, 0, sizeof(*data));
6078 : {
6079 : size_t Top_datalen, Top_oldlen;
6080 : Der_type Top_type;
6081 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
6082 0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
6083 0 : if(e) goto fail;
6084 0 : p += l; len -= l; ret += l;
6085 0 : Top_oldlen = len;
6086 0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
6087 0 : len = Top_datalen;
6088 : {
6089 0 : size_t Top_Tag_origlen = len;
6090 0 : size_t Top_Tag_oldret = ret;
6091 0 : size_t Top_Tag_olen = 0;
6092 : void *Top_Tag_tmp;
6093 0 : ret = 0;
6094 0 : (data)->len = 0;
6095 0 : (data)->val = NULL;
6096 0 : while(ret < Top_Tag_origlen) {
6097 0 : size_t Top_Tag_nlen = Top_Tag_olen + sizeof(*((data)->val));
6098 0 : if (Top_Tag_olen > Top_Tag_nlen) { e = ASN1_OVERFLOW; goto fail; }
6099 0 : Top_Tag_olen = Top_Tag_nlen;
6100 0 : Top_Tag_tmp = realloc((data)->val, Top_Tag_olen);
6101 0 : if (Top_Tag_tmp == NULL) { e = ENOMEM; goto fail; }
6102 0 : (data)->val = Top_Tag_tmp;
6103 0 : e = decode_TypedData(p, len, &(data)->val[(data)->len], &l);
6104 0 : if(e) goto fail;
6105 0 : p += l; len -= l; ret += l;
6106 0 : (data)->len++;
6107 0 : len = Top_Tag_origlen - ret;
6108 : }
6109 0 : ret += Top_Tag_oldret;
6110 : }
6111 0 : if ((data)->len < 1) {
6112 0 : e = ASN1_MIN_CONSTRAINT; goto fail;
6113 : }
6114 0 : len = Top_oldlen - Top_datalen;
6115 : }
6116 0 : if(size) *size = ret;
6117 0 : return 0;
6118 0 : fail:
6119 0 : free_TYPED_DATA(data);
6120 0 : return e;
6121 : }
6122 :
6123 : void ASN1CALL
6124 0 : free_TYPED_DATA(TYPED_DATA *data)
6125 : {
6126 0 : while((data)->len){
6127 0 : free_TypedData(&(data)->val[(data)->len-1]);
6128 0 : (data)->len--;
6129 : }
6130 0 : free((data)->val);
6131 0 : (data)->val = NULL;
6132 0 : }
6133 :
6134 : size_t ASN1CALL
6135 0 : length_TYPED_DATA(const TYPED_DATA *data)
6136 : {
6137 0 : size_t ret = 0;
6138 : {
6139 0 : size_t Top_tag_oldret = ret;
6140 : int i;
6141 0 : ret = 0;
6142 0 : for(i = (data)->len - 1; i >= 0; --i){
6143 0 : size_t Top_tag_for_oldret = ret;
6144 0 : ret = 0;
6145 0 : ret += length_TypedData(&(data)->val[i]);
6146 0 : ret += Top_tag_for_oldret;
6147 : }
6148 0 : ret += Top_tag_oldret;
6149 : }
6150 0 : ret += 1 + der_length_len (ret);
6151 0 : return ret;
6152 : }
6153 :
6154 : int ASN1CALL
6155 0 : copy_TYPED_DATA(const TYPED_DATA *from, TYPED_DATA *to)
6156 : {
6157 0 : memset(to, 0, sizeof(*to));
6158 0 : if(((to)->val = malloc((from)->len * sizeof(*(to)->val))) == NULL && (from)->len != 0)
6159 0 : goto fail;
6160 0 : for((to)->len = 0; (to)->len < (from)->len; (to)->len++){
6161 0 : if(copy_TypedData(&(from)->val[(to)->len], &(to)->val[(to)->len])) goto fail;
6162 : }
6163 0 : return 0;
6164 0 : fail:
6165 0 : free_TYPED_DATA(to);
6166 0 : return ENOMEM;
6167 : }
6168 :
6169 : int ASN1CALL
6170 167372 : encode_KDC_REQ_BODY(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const KDC_REQ_BODY *data, size_t *size)
6171 : {
6172 167372 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
6173 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
6174 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
6175 :
6176 : /* additional-tickets */
6177 167372 : if((data)->additional_tickets) {
6178 66 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
6179 66 : ret = 0;
6180 132 : for(i = (int)((data)->additional_tickets)->len - 1; i >= 0; --i) {
6181 66 : size_t additional_tickets_tag_tag_for_oldret = ret;
6182 66 : ret = 0;
6183 66 : e = encode_Ticket(p, len, &((data)->additional_tickets)->val[i], &l);
6184 66 : if (e) return e;
6185 66 : p -= l; len -= l; ret += l;
6186 :
6187 66 : ret += additional_tickets_tag_tag_for_oldret;
6188 : }
6189 66 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
6190 66 : if (e) return e;
6191 66 : p -= l; len -= l; ret += l;
6192 :
6193 66 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 11, &l);
6194 66 : if (e) return e;
6195 66 : p -= l; len -= l; ret += l;
6196 :
6197 66 : ret += Top_tag_oldret;
6198 : }
6199 : /* enc-authorization-data */
6200 167372 : if((data)->enc_authorization_data) {
6201 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
6202 0 : ret = 0;
6203 0 : e = encode_EncryptedData(p, len, (data)->enc_authorization_data, &l);
6204 0 : if (e) return e;
6205 0 : p -= l; len -= l; ret += l;
6206 :
6207 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 10, &l);
6208 0 : if (e) return e;
6209 0 : p -= l; len -= l; ret += l;
6210 :
6211 0 : ret += Top_tag_oldret;
6212 : }
6213 : /* addresses */
6214 167372 : if((data)->addresses) {
6215 77 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
6216 77 : ret = 0;
6217 77 : e = encode_HostAddresses(p, len, (data)->addresses, &l);
6218 77 : if (e) return e;
6219 77 : p -= l; len -= l; ret += l;
6220 :
6221 77 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 9, &l);
6222 77 : if (e) return e;
6223 77 : p -= l; len -= l; ret += l;
6224 :
6225 77 : ret += Top_tag_oldret;
6226 : }
6227 : /* etype */
6228 : {
6229 167372 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
6230 167372 : ret = 0;
6231 956637 : for(i = (int)(&(data)->etype)->len - 1; i >= 0; --i) {
6232 789265 : size_t etype_tag_tag_for_oldret = ret;
6233 789265 : ret = 0;
6234 789265 : e = encode_ENCTYPE(p, len, &(&(data)->etype)->val[i], &l);
6235 789265 : if (e) return e;
6236 789265 : p -= l; len -= l; ret += l;
6237 :
6238 789265 : ret += etype_tag_tag_for_oldret;
6239 : }
6240 167372 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
6241 167372 : if (e) return e;
6242 167372 : p -= l; len -= l; ret += l;
6243 :
6244 167372 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 8, &l);
6245 167372 : if (e) return e;
6246 167372 : p -= l; len -= l; ret += l;
6247 :
6248 167372 : ret += Top_tag_oldret;
6249 : }
6250 : /* nonce */
6251 : {
6252 167372 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
6253 167372 : ret = 0;
6254 167372 : e = encode_krb5int32(p, len, &(data)->nonce, &l);
6255 167372 : if (e) return e;
6256 167372 : p -= l; len -= l; ret += l;
6257 :
6258 167372 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 7, &l);
6259 167372 : if (e) return e;
6260 167372 : p -= l; len -= l; ret += l;
6261 :
6262 167372 : ret += Top_tag_oldret;
6263 : }
6264 : /* rtime */
6265 167372 : if((data)->rtime) {
6266 132 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
6267 132 : ret = 0;
6268 132 : e = encode_KerberosTime(p, len, (data)->rtime, &l);
6269 132 : if (e) return e;
6270 132 : p -= l; len -= l; ret += l;
6271 :
6272 132 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 6, &l);
6273 132 : if (e) return e;
6274 132 : p -= l; len -= l; ret += l;
6275 :
6276 132 : ret += Top_tag_oldret;
6277 : }
6278 : /* till */
6279 167372 : if((data)->till) {
6280 167372 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
6281 167372 : ret = 0;
6282 167372 : e = encode_KerberosTime(p, len, (data)->till, &l);
6283 167372 : if (e) return e;
6284 167372 : p -= l; len -= l; ret += l;
6285 :
6286 167372 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 5, &l);
6287 167372 : if (e) return e;
6288 167372 : p -= l; len -= l; ret += l;
6289 :
6290 167372 : ret += Top_tag_oldret;
6291 : }
6292 : /* from */
6293 167372 : if((data)->from) {
6294 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
6295 0 : ret = 0;
6296 0 : e = encode_KerberosTime(p, len, (data)->from, &l);
6297 0 : if (e) return e;
6298 0 : p -= l; len -= l; ret += l;
6299 :
6300 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 4, &l);
6301 0 : if (e) return e;
6302 0 : p -= l; len -= l; ret += l;
6303 :
6304 0 : ret += Top_tag_oldret;
6305 : }
6306 : /* sname */
6307 167372 : if((data)->sname) {
6308 167369 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
6309 167369 : ret = 0;
6310 167369 : e = encode_PrincipalName(p, len, (data)->sname, &l);
6311 167369 : if (e) return e;
6312 167369 : p -= l; len -= l; ret += l;
6313 :
6314 167369 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 3, &l);
6315 167369 : if (e) return e;
6316 167369 : p -= l; len -= l; ret += l;
6317 :
6318 167369 : ret += Top_tag_oldret;
6319 : }
6320 : /* realm */
6321 : {
6322 167372 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
6323 167372 : ret = 0;
6324 167372 : e = encode_Realm(p, len, &(data)->realm, &l);
6325 167372 : if (e) return e;
6326 167372 : p -= l; len -= l; ret += l;
6327 :
6328 167372 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
6329 167372 : if (e) return e;
6330 167372 : p -= l; len -= l; ret += l;
6331 :
6332 167372 : ret += Top_tag_oldret;
6333 : }
6334 : /* cname */
6335 167372 : if((data)->cname) {
6336 44780 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
6337 44780 : ret = 0;
6338 44780 : e = encode_PrincipalName(p, len, (data)->cname, &l);
6339 44780 : if (e) return e;
6340 44780 : p -= l; len -= l; ret += l;
6341 :
6342 44780 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
6343 44780 : if (e) return e;
6344 44780 : p -= l; len -= l; ret += l;
6345 :
6346 44780 : ret += Top_tag_oldret;
6347 : }
6348 : /* kdc-options */
6349 : {
6350 167372 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
6351 167372 : ret = 0;
6352 167372 : e = encode_KDCOptions(p, len, &(data)->kdc_options, &l);
6353 167372 : if (e) return e;
6354 167372 : p -= l; len -= l; ret += l;
6355 :
6356 167372 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
6357 167372 : if (e) return e;
6358 167372 : p -= l; len -= l; ret += l;
6359 :
6360 167372 : ret += Top_tag_oldret;
6361 : }
6362 167372 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
6363 167372 : if (e) return e;
6364 167372 : p -= l; len -= l; ret += l;
6365 :
6366 167372 : *size = ret;
6367 167372 : return 0;
6368 : }
6369 :
6370 : int ASN1CALL
6371 104664 : decode_KDC_REQ_BODY(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, KDC_REQ_BODY *data, size_t *size)
6372 : {
6373 104664 : size_t ret = 0;
6374 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
6375 : int e HEIMDAL_UNUSED_ATTRIBUTE;
6376 :
6377 104664 : memset(data, 0, sizeof(*data));
6378 : {
6379 : size_t Top_datalen, Top_oldlen;
6380 : Der_type Top_type;
6381 104664 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
6382 104664 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
6383 104664 : if(e) goto fail;
6384 104664 : p += l; len -= l; ret += l;
6385 104664 : Top_oldlen = len;
6386 104664 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
6387 104664 : len = Top_datalen;
6388 : {
6389 : size_t kdc_options_datalen, kdc_options_oldlen;
6390 : Der_type kdc_options_type;
6391 104664 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &kdc_options_type, 0, &kdc_options_datalen, &l);
6392 104664 : if (e == 0 && kdc_options_type != CONS) { e = ASN1_BAD_ID; }
6393 104664 : if(e) goto fail;
6394 104664 : p += l; len -= l; ret += l;
6395 104664 : kdc_options_oldlen = len;
6396 104664 : if (kdc_options_datalen > len) { e = ASN1_OVERRUN; goto fail; }
6397 104664 : len = kdc_options_datalen;
6398 104664 : e = decode_KDCOptions(p, len, &(data)->kdc_options, &l);
6399 104664 : if(e) goto fail;
6400 104664 : p += l; len -= l; ret += l;
6401 104664 : len = kdc_options_oldlen - kdc_options_datalen;
6402 : }
6403 : {
6404 : size_t cname_datalen, cname_oldlen;
6405 : Der_type cname_type;
6406 104664 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &cname_type, 1, &cname_datalen, &l);
6407 157505 : if (e == 0 && cname_type != CONS) { e = ASN1_BAD_ID; }
6408 104664 : if(e) {
6409 50938 : (data)->cname = NULL;
6410 : } else {
6411 53726 : (data)->cname = calloc(1, sizeof(*(data)->cname));
6412 53726 : if ((data)->cname == NULL) { e = ENOMEM; goto fail; }
6413 53726 : p += l; len -= l; ret += l;
6414 53726 : cname_oldlen = len;
6415 53726 : if (cname_datalen > len) { e = ASN1_OVERRUN; goto fail; }
6416 53726 : len = cname_datalen;
6417 53726 : e = decode_PrincipalName(p, len, (data)->cname, &l);
6418 53726 : if(e) goto fail;
6419 53726 : p += l; len -= l; ret += l;
6420 53726 : len = cname_oldlen - cname_datalen;
6421 : }
6422 : }
6423 : {
6424 : size_t realm_datalen, realm_oldlen;
6425 : Der_type realm_type;
6426 104664 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &realm_type, 2, &realm_datalen, &l);
6427 209328 : if (e == 0 && realm_type != CONS) { e = ASN1_BAD_ID; }
6428 104664 : if(e) goto fail;
6429 104664 : p += l; len -= l; ret += l;
6430 104664 : realm_oldlen = len;
6431 104664 : if (realm_datalen > len) { e = ASN1_OVERRUN; goto fail; }
6432 104664 : len = realm_datalen;
6433 104664 : e = decode_Realm(p, len, &(data)->realm, &l);
6434 104664 : if(e) goto fail;
6435 104664 : p += l; len -= l; ret += l;
6436 104664 : len = realm_oldlen - realm_datalen;
6437 : }
6438 : {
6439 : size_t sname_datalen, sname_oldlen;
6440 : Der_type sname_type;
6441 104664 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &sname_type, 3, &sname_datalen, &l);
6442 207350 : if (e == 0 && sname_type != CONS) { e = ASN1_BAD_ID; }
6443 104664 : if(e) {
6444 4 : (data)->sname = NULL;
6445 : } else {
6446 104660 : (data)->sname = calloc(1, sizeof(*(data)->sname));
6447 104660 : if ((data)->sname == NULL) { e = ENOMEM; goto fail; }
6448 104660 : p += l; len -= l; ret += l;
6449 104660 : sname_oldlen = len;
6450 104660 : if (sname_datalen > len) { e = ASN1_OVERRUN; goto fail; }
6451 104660 : len = sname_datalen;
6452 104660 : e = decode_PrincipalName(p, len, (data)->sname, &l);
6453 104660 : if(e) goto fail;
6454 104660 : p += l; len -= l; ret += l;
6455 104660 : len = sname_oldlen - sname_datalen;
6456 : }
6457 : }
6458 : {
6459 : size_t from_datalen, from_oldlen;
6460 : Der_type from_type;
6461 104664 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &from_type, 4, &from_datalen, &l);
6462 104664 : if (e == 0 && from_type != CONS) { e = ASN1_BAD_ID; }
6463 104664 : if(e) {
6464 104664 : (data)->from = NULL;
6465 : } else {
6466 0 : (data)->from = calloc(1, sizeof(*(data)->from));
6467 0 : if ((data)->from == NULL) { e = ENOMEM; goto fail; }
6468 0 : p += l; len -= l; ret += l;
6469 0 : from_oldlen = len;
6470 0 : if (from_datalen > len) { e = ASN1_OVERRUN; goto fail; }
6471 0 : len = from_datalen;
6472 0 : e = decode_KerberosTime(p, len, (data)->from, &l);
6473 0 : if(e) goto fail;
6474 0 : p += l; len -= l; ret += l;
6475 0 : len = from_oldlen - from_datalen;
6476 : }
6477 : }
6478 : {
6479 : size_t till_datalen, till_oldlen;
6480 : Der_type till_type;
6481 104664 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &till_type, 5, &till_datalen, &l);
6482 209328 : if (e == 0 && till_type != CONS) { e = ASN1_BAD_ID; }
6483 104664 : if(e) {
6484 0 : (data)->till = NULL;
6485 : } else {
6486 104664 : (data)->till = calloc(1, sizeof(*(data)->till));
6487 104664 : if ((data)->till == NULL) { e = ENOMEM; goto fail; }
6488 104664 : p += l; len -= l; ret += l;
6489 104664 : till_oldlen = len;
6490 104664 : if (till_datalen > len) { e = ASN1_OVERRUN; goto fail; }
6491 104664 : len = till_datalen;
6492 104664 : e = decode_KerberosTime(p, len, (data)->till, &l);
6493 104664 : if(e) goto fail;
6494 104664 : p += l; len -= l; ret += l;
6495 104664 : len = till_oldlen - till_datalen;
6496 : }
6497 : }
6498 : {
6499 : size_t rtime_datalen, rtime_oldlen;
6500 : Der_type rtime_type;
6501 104664 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &rtime_type, 6, &rtime_datalen, &l);
6502 104943 : if (e == 0 && rtime_type != CONS) { e = ASN1_BAD_ID; }
6503 104664 : if(e) {
6504 104385 : (data)->rtime = NULL;
6505 : } else {
6506 279 : (data)->rtime = calloc(1, sizeof(*(data)->rtime));
6507 279 : if ((data)->rtime == NULL) { e = ENOMEM; goto fail; }
6508 279 : p += l; len -= l; ret += l;
6509 279 : rtime_oldlen = len;
6510 279 : if (rtime_datalen > len) { e = ASN1_OVERRUN; goto fail; }
6511 279 : len = rtime_datalen;
6512 279 : e = decode_KerberosTime(p, len, (data)->rtime, &l);
6513 279 : if(e) goto fail;
6514 279 : p += l; len -= l; ret += l;
6515 279 : len = rtime_oldlen - rtime_datalen;
6516 : }
6517 : }
6518 : {
6519 : size_t nonce_datalen, nonce_oldlen;
6520 : Der_type nonce_type;
6521 104664 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &nonce_type, 7, &nonce_datalen, &l);
6522 209328 : if (e == 0 && nonce_type != CONS) { e = ASN1_BAD_ID; }
6523 104664 : if(e) goto fail;
6524 104664 : p += l; len -= l; ret += l;
6525 104664 : nonce_oldlen = len;
6526 104664 : if (nonce_datalen > len) { e = ASN1_OVERRUN; goto fail; }
6527 104664 : len = nonce_datalen;
6528 104664 : e = decode_krb5int32(p, len, &(data)->nonce, &l);
6529 104664 : if(e) goto fail;
6530 104664 : p += l; len -= l; ret += l;
6531 104664 : len = nonce_oldlen - nonce_datalen;
6532 : }
6533 : {
6534 : size_t etype_datalen, etype_oldlen;
6535 : Der_type etype_type;
6536 104664 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &etype_type, 8, &etype_datalen, &l);
6537 207354 : if (e == 0 && etype_type != CONS) { e = ASN1_BAD_ID; }
6538 104664 : if(e) goto fail;
6539 104664 : p += l; len -= l; ret += l;
6540 104664 : etype_oldlen = len;
6541 104664 : if (etype_datalen > len) { e = ASN1_OVERRUN; goto fail; }
6542 104664 : len = etype_datalen;
6543 : {
6544 : size_t etype_Tag_datalen, etype_Tag_oldlen;
6545 : Der_type etype_Tag_type;
6546 104664 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &etype_Tag_type, UT_Sequence, &etype_Tag_datalen, &l);
6547 104664 : if (e == 0 && etype_Tag_type != CONS) { e = ASN1_BAD_ID; }
6548 104664 : if(e) goto fail;
6549 104664 : p += l; len -= l; ret += l;
6550 104664 : etype_Tag_oldlen = len;
6551 104664 : if (etype_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
6552 104664 : len = etype_Tag_datalen;
6553 : {
6554 104664 : size_t etype_Tag_Tag_origlen = len;
6555 104664 : size_t etype_Tag_Tag_oldret = ret;
6556 104664 : size_t etype_Tag_Tag_olen = 0;
6557 : void *etype_Tag_Tag_tmp;
6558 104664 : ret = 0;
6559 104664 : (&(data)->etype)->len = 0;
6560 104664 : (&(data)->etype)->val = NULL;
6561 697191 : while(ret < etype_Tag_Tag_origlen) {
6562 487863 : size_t etype_Tag_Tag_nlen = etype_Tag_Tag_olen + sizeof(*((&(data)->etype)->val));
6563 487863 : if (etype_Tag_Tag_olen > etype_Tag_Tag_nlen) { e = ASN1_OVERFLOW; goto fail; }
6564 487863 : etype_Tag_Tag_olen = etype_Tag_Tag_nlen;
6565 487863 : etype_Tag_Tag_tmp = realloc((&(data)->etype)->val, etype_Tag_Tag_olen);
6566 487863 : if (etype_Tag_Tag_tmp == NULL) { e = ENOMEM; goto fail; }
6567 487863 : (&(data)->etype)->val = etype_Tag_Tag_tmp;
6568 487863 : e = decode_ENCTYPE(p, len, &(&(data)->etype)->val[(&(data)->etype)->len], &l);
6569 487863 : if(e) goto fail;
6570 487863 : p += l; len -= l; ret += l;
6571 487863 : (&(data)->etype)->len++;
6572 487863 : len = etype_Tag_Tag_origlen - ret;
6573 : }
6574 104664 : ret += etype_Tag_Tag_oldret;
6575 : }
6576 104664 : len = etype_Tag_oldlen - etype_Tag_datalen;
6577 : }
6578 104664 : len = etype_oldlen - etype_datalen;
6579 : }
6580 : {
6581 : size_t addresses_datalen, addresses_oldlen;
6582 : Der_type addresses_type;
6583 104664 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &addresses_type, 9, &addresses_datalen, &l);
6584 104951 : if (e == 0 && addresses_type != CONS) { e = ASN1_BAD_ID; }
6585 104664 : if(e) {
6586 104377 : (data)->addresses = NULL;
6587 : } else {
6588 287 : (data)->addresses = calloc(1, sizeof(*(data)->addresses));
6589 287 : if ((data)->addresses == NULL) { e = ENOMEM; goto fail; }
6590 287 : p += l; len -= l; ret += l;
6591 287 : addresses_oldlen = len;
6592 287 : if (addresses_datalen > len) { e = ASN1_OVERRUN; goto fail; }
6593 287 : len = addresses_datalen;
6594 287 : e = decode_HostAddresses(p, len, (data)->addresses, &l);
6595 287 : if(e) goto fail;
6596 287 : p += l; len -= l; ret += l;
6597 287 : len = addresses_oldlen - addresses_datalen;
6598 : }
6599 : }
6600 : {
6601 : size_t enc_authorization_data_datalen, enc_authorization_data_oldlen;
6602 : Der_type enc_authorization_data_type;
6603 104664 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &enc_authorization_data_type, 10, &enc_authorization_data_datalen, &l);
6604 104664 : if (e == 0 && enc_authorization_data_type != CONS) { e = ASN1_BAD_ID; }
6605 104664 : if(e) {
6606 104664 : (data)->enc_authorization_data = NULL;
6607 : } else {
6608 0 : (data)->enc_authorization_data = calloc(1, sizeof(*(data)->enc_authorization_data));
6609 0 : if ((data)->enc_authorization_data == NULL) { e = ENOMEM; goto fail; }
6610 0 : p += l; len -= l; ret += l;
6611 0 : enc_authorization_data_oldlen = len;
6612 0 : if (enc_authorization_data_datalen > len) { e = ASN1_OVERRUN; goto fail; }
6613 0 : len = enc_authorization_data_datalen;
6614 0 : e = decode_EncryptedData(p, len, (data)->enc_authorization_data, &l);
6615 0 : if(e) goto fail;
6616 0 : p += l; len -= l; ret += l;
6617 0 : len = enc_authorization_data_oldlen - enc_authorization_data_datalen;
6618 : }
6619 : }
6620 : {
6621 : size_t additional_tickets_datalen, additional_tickets_oldlen;
6622 : Der_type additional_tickets_type;
6623 104664 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &additional_tickets_type, 11, &additional_tickets_datalen, &l);
6624 104686 : if (e == 0 && additional_tickets_type != CONS) { e = ASN1_BAD_ID; }
6625 104664 : if(e) {
6626 104642 : (data)->additional_tickets = NULL;
6627 : } else {
6628 22 : (data)->additional_tickets = calloc(1, sizeof(*(data)->additional_tickets));
6629 22 : if ((data)->additional_tickets == NULL) { e = ENOMEM; goto fail; }
6630 22 : p += l; len -= l; ret += l;
6631 22 : additional_tickets_oldlen = len;
6632 22 : if (additional_tickets_datalen > len) { e = ASN1_OVERRUN; goto fail; }
6633 22 : len = additional_tickets_datalen;
6634 : {
6635 : size_t additional_tickets_Tag_datalen, additional_tickets_Tag_oldlen;
6636 : Der_type additional_tickets_Tag_type;
6637 22 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &additional_tickets_Tag_type, UT_Sequence, &additional_tickets_Tag_datalen, &l);
6638 22 : if (e == 0 && additional_tickets_Tag_type != CONS) { e = ASN1_BAD_ID; }
6639 22 : if(e) goto fail;
6640 22 : p += l; len -= l; ret += l;
6641 22 : additional_tickets_Tag_oldlen = len;
6642 22 : if (additional_tickets_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
6643 22 : len = additional_tickets_Tag_datalen;
6644 : {
6645 22 : size_t additional_tickets_Tag_Tag_origlen = len;
6646 22 : size_t additional_tickets_Tag_Tag_oldret = ret;
6647 22 : size_t additional_tickets_Tag_Tag_olen = 0;
6648 : void *additional_tickets_Tag_Tag_tmp;
6649 22 : ret = 0;
6650 22 : ((data)->additional_tickets)->len = 0;
6651 22 : ((data)->additional_tickets)->val = NULL;
6652 66 : while(ret < additional_tickets_Tag_Tag_origlen) {
6653 22 : size_t additional_tickets_Tag_Tag_nlen = additional_tickets_Tag_Tag_olen + sizeof(*(((data)->additional_tickets)->val));
6654 22 : if (additional_tickets_Tag_Tag_olen > additional_tickets_Tag_Tag_nlen) { e = ASN1_OVERFLOW; goto fail; }
6655 22 : additional_tickets_Tag_Tag_olen = additional_tickets_Tag_Tag_nlen;
6656 22 : additional_tickets_Tag_Tag_tmp = realloc(((data)->additional_tickets)->val, additional_tickets_Tag_Tag_olen);
6657 22 : if (additional_tickets_Tag_Tag_tmp == NULL) { e = ENOMEM; goto fail; }
6658 22 : ((data)->additional_tickets)->val = additional_tickets_Tag_Tag_tmp;
6659 22 : e = decode_Ticket(p, len, &((data)->additional_tickets)->val[((data)->additional_tickets)->len], &l);
6660 22 : if(e) goto fail;
6661 22 : p += l; len -= l; ret += l;
6662 22 : ((data)->additional_tickets)->len++;
6663 22 : len = additional_tickets_Tag_Tag_origlen - ret;
6664 : }
6665 22 : ret += additional_tickets_Tag_Tag_oldret;
6666 : }
6667 22 : len = additional_tickets_Tag_oldlen - additional_tickets_Tag_datalen;
6668 : }
6669 22 : len = additional_tickets_oldlen - additional_tickets_datalen;
6670 : }
6671 : }
6672 104664 : len = Top_oldlen - Top_datalen;
6673 : }
6674 209328 : if(size) *size = ret;
6675 102690 : return 0;
6676 0 : fail:
6677 0 : free_KDC_REQ_BODY(data);
6678 0 : return e;
6679 : }
6680 :
6681 : void ASN1CALL
6682 205672 : free_KDC_REQ_BODY(KDC_REQ_BODY *data)
6683 : {
6684 205672 : free_KDCOptions(&(data)->kdc_options);
6685 205672 : if((data)->cname) {
6686 75366 : free_PrincipalName((data)->cname);
6687 75366 : free((data)->cname);
6688 75366 : (data)->cname = NULL;
6689 : }
6690 205672 : free_Realm(&(data)->realm);
6691 205672 : if((data)->sname) {
6692 163778 : free_PrincipalName((data)->sname);
6693 163778 : free((data)->sname);
6694 163778 : (data)->sname = NULL;
6695 : }
6696 205672 : if((data)->from) {
6697 0 : free_KerberosTime((data)->from);
6698 0 : free((data)->from);
6699 0 : (data)->from = NULL;
6700 : }
6701 205672 : if((data)->till) {
6702 163782 : free_KerberosTime((data)->till);
6703 163782 : free((data)->till);
6704 163782 : (data)->till = NULL;
6705 : }
6706 205672 : if((data)->rtime) {
6707 358 : free_KerberosTime((data)->rtime);
6708 358 : free((data)->rtime);
6709 358 : (data)->rtime = NULL;
6710 : }
6711 205672 : free_krb5int32(&(data)->nonce);
6712 1182302 : while((&(data)->etype)->len){
6713 770958 : free_ENCTYPE(&(&(data)->etype)->val[(&(data)->etype)->len-1]);
6714 770958 : (&(data)->etype)->len--;
6715 : }
6716 205672 : free((&(data)->etype)->val);
6717 205672 : (&(data)->etype)->val = NULL;
6718 205672 : if((data)->addresses) {
6719 290 : free_HostAddresses((data)->addresses);
6720 290 : free((data)->addresses);
6721 290 : (data)->addresses = NULL;
6722 : }
6723 205672 : if((data)->enc_authorization_data) {
6724 0 : free_EncryptedData((data)->enc_authorization_data);
6725 0 : free((data)->enc_authorization_data);
6726 0 : (data)->enc_authorization_data = NULL;
6727 : }
6728 205672 : if((data)->additional_tickets) {
6729 132 : while(((data)->additional_tickets)->len){
6730 44 : free_Ticket(&((data)->additional_tickets)->val[((data)->additional_tickets)->len-1]);
6731 44 : ((data)->additional_tickets)->len--;
6732 : }
6733 44 : free(((data)->additional_tickets)->val);
6734 44 : ((data)->additional_tickets)->val = NULL;
6735 44 : free((data)->additional_tickets);
6736 44 : (data)->additional_tickets = NULL;
6737 : }
6738 205672 : }
6739 :
6740 : size_t ASN1CALL
6741 167372 : length_KDC_REQ_BODY(const KDC_REQ_BODY *data)
6742 : {
6743 167372 : size_t ret = 0;
6744 : {
6745 167372 : size_t Top_tag_oldret = ret;
6746 167372 : ret = 0;
6747 167372 : ret += length_KDCOptions(&(data)->kdc_options);
6748 167372 : ret += 1 + der_length_len (ret);
6749 167372 : ret += Top_tag_oldret;
6750 : }
6751 167372 : if((data)->cname){
6752 44780 : size_t Top_tag_oldret = ret;
6753 44780 : ret = 0;
6754 44780 : ret += length_PrincipalName((data)->cname);
6755 44780 : ret += 1 + der_length_len (ret);
6756 44780 : ret += Top_tag_oldret;
6757 : }
6758 : {
6759 167372 : size_t Top_tag_oldret = ret;
6760 167372 : ret = 0;
6761 167372 : ret += length_Realm(&(data)->realm);
6762 167372 : ret += 1 + der_length_len (ret);
6763 167372 : ret += Top_tag_oldret;
6764 : }
6765 167372 : if((data)->sname){
6766 167369 : size_t Top_tag_oldret = ret;
6767 167369 : ret = 0;
6768 167369 : ret += length_PrincipalName((data)->sname);
6769 167369 : ret += 1 + der_length_len (ret);
6770 167369 : ret += Top_tag_oldret;
6771 : }
6772 167372 : if((data)->from){
6773 0 : size_t Top_tag_oldret = ret;
6774 0 : ret = 0;
6775 0 : ret += length_KerberosTime((data)->from);
6776 0 : ret += 1 + der_length_len (ret);
6777 0 : ret += Top_tag_oldret;
6778 : }
6779 167372 : if((data)->till){
6780 167372 : size_t Top_tag_oldret = ret;
6781 167372 : ret = 0;
6782 167372 : ret += length_KerberosTime((data)->till);
6783 167372 : ret += 1 + der_length_len (ret);
6784 167372 : ret += Top_tag_oldret;
6785 : }
6786 167372 : if((data)->rtime){
6787 132 : size_t Top_tag_oldret = ret;
6788 132 : ret = 0;
6789 132 : ret += length_KerberosTime((data)->rtime);
6790 132 : ret += 1 + der_length_len (ret);
6791 132 : ret += Top_tag_oldret;
6792 : }
6793 : {
6794 167372 : size_t Top_tag_oldret = ret;
6795 167372 : ret = 0;
6796 167372 : ret += length_krb5int32(&(data)->nonce);
6797 167372 : ret += 1 + der_length_len (ret);
6798 167372 : ret += Top_tag_oldret;
6799 : }
6800 : {
6801 167372 : size_t Top_tag_oldret = ret;
6802 167372 : ret = 0;
6803 : {
6804 167372 : size_t etype_tag_tag_oldret = ret;
6805 : int i;
6806 167372 : ret = 0;
6807 956637 : for(i = (&(data)->etype)->len - 1; i >= 0; --i){
6808 789265 : size_t etype_tag_tag_for_oldret = ret;
6809 789265 : ret = 0;
6810 789265 : ret += length_ENCTYPE(&(&(data)->etype)->val[i]);
6811 789265 : ret += etype_tag_tag_for_oldret;
6812 : }
6813 167372 : ret += etype_tag_tag_oldret;
6814 : }
6815 167372 : ret += 1 + der_length_len (ret);
6816 167372 : ret += 1 + der_length_len (ret);
6817 167372 : ret += Top_tag_oldret;
6818 : }
6819 167372 : if((data)->addresses){
6820 77 : size_t Top_tag_oldret = ret;
6821 77 : ret = 0;
6822 77 : ret += length_HostAddresses((data)->addresses);
6823 77 : ret += 1 + der_length_len (ret);
6824 77 : ret += Top_tag_oldret;
6825 : }
6826 167372 : if((data)->enc_authorization_data){
6827 0 : size_t Top_tag_oldret = ret;
6828 0 : ret = 0;
6829 0 : ret += length_EncryptedData((data)->enc_authorization_data);
6830 0 : ret += 1 + der_length_len (ret);
6831 0 : ret += Top_tag_oldret;
6832 : }
6833 167372 : if((data)->additional_tickets){
6834 66 : size_t Top_tag_oldret = ret;
6835 66 : ret = 0;
6836 : {
6837 66 : size_t additional_tickets_tag_tag_oldret = ret;
6838 : int i;
6839 66 : ret = 0;
6840 132 : for(i = ((data)->additional_tickets)->len - 1; i >= 0; --i){
6841 66 : size_t additional_tickets_tag_tag_for_oldret = ret;
6842 66 : ret = 0;
6843 66 : ret += length_Ticket(&((data)->additional_tickets)->val[i]);
6844 66 : ret += additional_tickets_tag_tag_for_oldret;
6845 : }
6846 66 : ret += additional_tickets_tag_tag_oldret;
6847 : }
6848 66 : ret += 1 + der_length_len (ret);
6849 66 : ret += 1 + der_length_len (ret);
6850 66 : ret += Top_tag_oldret;
6851 : }
6852 167372 : ret += 1 + der_length_len (ret);
6853 167372 : return ret;
6854 : }
6855 :
6856 : int ASN1CALL
6857 0 : copy_KDC_REQ_BODY(const KDC_REQ_BODY *from, KDC_REQ_BODY *to)
6858 : {
6859 0 : memset(to, 0, sizeof(*to));
6860 0 : if(copy_KDCOptions(&(from)->kdc_options, &(to)->kdc_options)) goto fail;
6861 0 : if((from)->cname) {
6862 0 : (to)->cname = malloc(sizeof(*(to)->cname));
6863 0 : if((to)->cname == NULL) goto fail;
6864 0 : if(copy_PrincipalName((from)->cname, (to)->cname)) goto fail;
6865 : }else
6866 0 : (to)->cname = NULL;
6867 0 : if(copy_Realm(&(from)->realm, &(to)->realm)) goto fail;
6868 0 : if((from)->sname) {
6869 0 : (to)->sname = malloc(sizeof(*(to)->sname));
6870 0 : if((to)->sname == NULL) goto fail;
6871 0 : if(copy_PrincipalName((from)->sname, (to)->sname)) goto fail;
6872 : }else
6873 0 : (to)->sname = NULL;
6874 0 : if((from)->from) {
6875 0 : (to)->from = malloc(sizeof(*(to)->from));
6876 0 : if((to)->from == NULL) goto fail;
6877 0 : if(copy_KerberosTime((from)->from, (to)->from)) goto fail;
6878 : }else
6879 0 : (to)->from = NULL;
6880 0 : if((from)->till) {
6881 0 : (to)->till = malloc(sizeof(*(to)->till));
6882 0 : if((to)->till == NULL) goto fail;
6883 0 : if(copy_KerberosTime((from)->till, (to)->till)) goto fail;
6884 : }else
6885 0 : (to)->till = NULL;
6886 0 : if((from)->rtime) {
6887 0 : (to)->rtime = malloc(sizeof(*(to)->rtime));
6888 0 : if((to)->rtime == NULL) goto fail;
6889 0 : if(copy_KerberosTime((from)->rtime, (to)->rtime)) goto fail;
6890 : }else
6891 0 : (to)->rtime = NULL;
6892 0 : if(copy_krb5int32(&(from)->nonce, &(to)->nonce)) goto fail;
6893 0 : if(((&(to)->etype)->val = malloc((&(from)->etype)->len * sizeof(*(&(to)->etype)->val))) == NULL && (&(from)->etype)->len != 0)
6894 0 : goto fail;
6895 0 : for((&(to)->etype)->len = 0; (&(to)->etype)->len < (&(from)->etype)->len; (&(to)->etype)->len++){
6896 0 : if(copy_ENCTYPE(&(&(from)->etype)->val[(&(to)->etype)->len], &(&(to)->etype)->val[(&(to)->etype)->len])) goto fail;
6897 : }
6898 0 : if((from)->addresses) {
6899 0 : (to)->addresses = malloc(sizeof(*(to)->addresses));
6900 0 : if((to)->addresses == NULL) goto fail;
6901 0 : if(copy_HostAddresses((from)->addresses, (to)->addresses)) goto fail;
6902 : }else
6903 0 : (to)->addresses = NULL;
6904 0 : if((from)->enc_authorization_data) {
6905 0 : (to)->enc_authorization_data = malloc(sizeof(*(to)->enc_authorization_data));
6906 0 : if((to)->enc_authorization_data == NULL) goto fail;
6907 0 : if(copy_EncryptedData((from)->enc_authorization_data, (to)->enc_authorization_data)) goto fail;
6908 : }else
6909 0 : (to)->enc_authorization_data = NULL;
6910 0 : if((from)->additional_tickets) {
6911 0 : (to)->additional_tickets = malloc(sizeof(*(to)->additional_tickets));
6912 0 : if((to)->additional_tickets == NULL) goto fail;
6913 0 : if((((to)->additional_tickets)->val = malloc(((from)->additional_tickets)->len * sizeof(*((to)->additional_tickets)->val))) == NULL && ((from)->additional_tickets)->len != 0)
6914 0 : goto fail;
6915 0 : for(((to)->additional_tickets)->len = 0; ((to)->additional_tickets)->len < ((from)->additional_tickets)->len; ((to)->additional_tickets)->len++){
6916 0 : if(copy_Ticket(&((from)->additional_tickets)->val[((to)->additional_tickets)->len], &((to)->additional_tickets)->val[((to)->additional_tickets)->len])) goto fail;
6917 : }
6918 : }else
6919 0 : (to)->additional_tickets = NULL;
6920 0 : return 0;
6921 0 : fail:
6922 0 : free_KDC_REQ_BODY(to);
6923 0 : return ENOMEM;
6924 : }
6925 :
6926 : int ASN1CALL
6927 85676 : encode_KDC_REQ(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const KDC_REQ *data, size_t *size)
6928 : {
6929 85676 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
6930 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
6931 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
6932 :
6933 : /* req-body */
6934 : {
6935 85676 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
6936 85676 : ret = 0;
6937 85676 : e = encode_KDC_REQ_BODY(p, len, &(data)->req_body, &l);
6938 85676 : if (e) return e;
6939 85676 : p -= l; len -= l; ret += l;
6940 :
6941 85676 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 4, &l);
6942 85676 : if (e) return e;
6943 85676 : p -= l; len -= l; ret += l;
6944 :
6945 85676 : ret += Top_tag_oldret;
6946 : }
6947 : /* padata */
6948 85676 : if((data)->padata) {
6949 60738 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
6950 60738 : ret = 0;
6951 60738 : e = encode_METHOD_DATA(p, len, (data)->padata, &l);
6952 60738 : if (e) return e;
6953 60738 : p -= l; len -= l; ret += l;
6954 :
6955 60738 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 3, &l);
6956 60738 : if (e) return e;
6957 60738 : p -= l; len -= l; ret += l;
6958 :
6959 60738 : ret += Top_tag_oldret;
6960 : }
6961 : /* msg-type */
6962 : {
6963 85676 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
6964 85676 : ret = 0;
6965 85676 : e = encode_MESSAGE_TYPE(p, len, &(data)->msg_type, &l);
6966 85676 : if (e) return e;
6967 85676 : p -= l; len -= l; ret += l;
6968 :
6969 85676 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
6970 85676 : if (e) return e;
6971 85676 : p -= l; len -= l; ret += l;
6972 :
6973 85676 : ret += Top_tag_oldret;
6974 : }
6975 : /* pvno */
6976 : {
6977 85676 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
6978 85676 : ret = 0;
6979 85676 : e = encode_krb5int32(p, len, &(data)->pvno, &l);
6980 85676 : if (e) return e;
6981 85676 : p -= l; len -= l; ret += l;
6982 :
6983 85676 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
6984 85676 : if (e) return e;
6985 85676 : p -= l; len -= l; ret += l;
6986 :
6987 85676 : ret += Top_tag_oldret;
6988 : }
6989 85676 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
6990 85676 : if (e) return e;
6991 85676 : p -= l; len -= l; ret += l;
6992 :
6993 85676 : *size = ret;
6994 85676 : return 0;
6995 : }
6996 :
6997 : int ASN1CALL
6998 104664 : decode_KDC_REQ(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, KDC_REQ *data, size_t *size)
6999 : {
7000 104664 : size_t ret = 0;
7001 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
7002 : int e HEIMDAL_UNUSED_ATTRIBUTE;
7003 :
7004 104664 : memset(data, 0, sizeof(*data));
7005 : {
7006 : size_t Top_datalen, Top_oldlen;
7007 : Der_type Top_type;
7008 104664 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
7009 104664 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
7010 104664 : if(e) goto fail;
7011 104664 : p += l; len -= l; ret += l;
7012 104664 : Top_oldlen = len;
7013 104664 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
7014 104664 : len = Top_datalen;
7015 : {
7016 : size_t pvno_datalen, pvno_oldlen;
7017 : Der_type pvno_type;
7018 104664 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &pvno_type, 1, &pvno_datalen, &l);
7019 104664 : if (e == 0 && pvno_type != CONS) { e = ASN1_BAD_ID; }
7020 104664 : if(e) goto fail;
7021 104664 : p += l; len -= l; ret += l;
7022 104664 : pvno_oldlen = len;
7023 104664 : if (pvno_datalen > len) { e = ASN1_OVERRUN; goto fail; }
7024 104664 : len = pvno_datalen;
7025 104664 : e = decode_krb5int32(p, len, &(data)->pvno, &l);
7026 104664 : if(e) goto fail;
7027 104664 : p += l; len -= l; ret += l;
7028 104664 : len = pvno_oldlen - pvno_datalen;
7029 : }
7030 : {
7031 : size_t msg_type_datalen, msg_type_oldlen;
7032 : Der_type msg_type_type;
7033 104664 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &msg_type_type, 2, &msg_type_datalen, &l);
7034 207354 : if (e == 0 && msg_type_type != CONS) { e = ASN1_BAD_ID; }
7035 104664 : if(e) goto fail;
7036 104664 : p += l; len -= l; ret += l;
7037 104664 : msg_type_oldlen = len;
7038 104664 : if (msg_type_datalen > len) { e = ASN1_OVERRUN; goto fail; }
7039 104664 : len = msg_type_datalen;
7040 104664 : e = decode_MESSAGE_TYPE(p, len, &(data)->msg_type, &l);
7041 104664 : if(e) goto fail;
7042 104664 : p += l; len -= l; ret += l;
7043 104664 : len = msg_type_oldlen - msg_type_datalen;
7044 : }
7045 : {
7046 : size_t padata_datalen, padata_oldlen;
7047 : Der_type padata_type;
7048 104664 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &padata_type, 3, &padata_datalen, &l);
7049 188045 : if (e == 0 && padata_type != CONS) { e = ASN1_BAD_ID; }
7050 104664 : if(e) {
7051 19604 : (data)->padata = NULL;
7052 : } else {
7053 85060 : (data)->padata = calloc(1, sizeof(*(data)->padata));
7054 85060 : if ((data)->padata == NULL) { e = ENOMEM; goto fail; }
7055 85060 : p += l; len -= l; ret += l;
7056 85060 : padata_oldlen = len;
7057 85060 : if (padata_datalen > len) { e = ASN1_OVERRUN; goto fail; }
7058 85060 : len = padata_datalen;
7059 85060 : e = decode_METHOD_DATA(p, len, (data)->padata, &l);
7060 85060 : if(e) goto fail;
7061 85060 : p += l; len -= l; ret += l;
7062 85060 : len = padata_oldlen - padata_datalen;
7063 : }
7064 : }
7065 : {
7066 : size_t req_body_datalen, req_body_oldlen;
7067 : Der_type req_body_type;
7068 104664 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &req_body_type, 4, &req_body_datalen, &l);
7069 209328 : if (e == 0 && req_body_type != CONS) { e = ASN1_BAD_ID; }
7070 104664 : if(e) goto fail;
7071 104664 : p += l; len -= l; ret += l;
7072 104664 : req_body_oldlen = len;
7073 104664 : if (req_body_datalen > len) { e = ASN1_OVERRUN; goto fail; }
7074 104664 : len = req_body_datalen;
7075 104664 : e = decode_KDC_REQ_BODY(p, len, &(data)->req_body, &l);
7076 104664 : if(e) goto fail;
7077 104664 : p += l; len -= l; ret += l;
7078 104664 : len = req_body_oldlen - req_body_datalen;
7079 : }
7080 104664 : len = Top_oldlen - Top_datalen;
7081 : }
7082 209328 : if(size) *size = ret;
7083 102690 : return 0;
7084 0 : fail:
7085 0 : free_KDC_REQ(data);
7086 0 : return e;
7087 : }
7088 :
7089 : void ASN1CALL
7090 205672 : free_KDC_REQ(KDC_REQ *data)
7091 : {
7092 205672 : free_krb5int32(&(data)->pvno);
7093 205672 : free_MESSAGE_TYPE(&(data)->msg_type);
7094 205672 : if((data)->padata) {
7095 136657 : free_METHOD_DATA((data)->padata);
7096 136657 : free((data)->padata);
7097 136657 : (data)->padata = NULL;
7098 : }
7099 205672 : free_KDC_REQ_BODY(&(data)->req_body);
7100 205672 : }
7101 :
7102 : size_t ASN1CALL
7103 85676 : length_KDC_REQ(const KDC_REQ *data)
7104 : {
7105 85676 : size_t ret = 0;
7106 : {
7107 85676 : size_t Top_tag_oldret = ret;
7108 85676 : ret = 0;
7109 85676 : ret += length_krb5int32(&(data)->pvno);
7110 85676 : ret += 1 + der_length_len (ret);
7111 85676 : ret += Top_tag_oldret;
7112 : }
7113 : {
7114 85676 : size_t Top_tag_oldret = ret;
7115 85676 : ret = 0;
7116 85676 : ret += length_MESSAGE_TYPE(&(data)->msg_type);
7117 85676 : ret += 1 + der_length_len (ret);
7118 85676 : ret += Top_tag_oldret;
7119 : }
7120 85676 : if((data)->padata){
7121 60738 : size_t Top_tag_oldret = ret;
7122 60738 : ret = 0;
7123 60738 : ret += length_METHOD_DATA((data)->padata);
7124 60738 : ret += 1 + der_length_len (ret);
7125 60738 : ret += Top_tag_oldret;
7126 : }
7127 : {
7128 85676 : size_t Top_tag_oldret = ret;
7129 85676 : ret = 0;
7130 85676 : ret += length_KDC_REQ_BODY(&(data)->req_body);
7131 85676 : ret += 1 + der_length_len (ret);
7132 85676 : ret += Top_tag_oldret;
7133 : }
7134 85676 : ret += 1 + der_length_len (ret);
7135 85676 : return ret;
7136 : }
7137 :
7138 : int ASN1CALL
7139 0 : copy_KDC_REQ(const KDC_REQ *from, KDC_REQ *to)
7140 : {
7141 0 : memset(to, 0, sizeof(*to));
7142 0 : if(copy_krb5int32(&(from)->pvno, &(to)->pvno)) goto fail;
7143 0 : if(copy_MESSAGE_TYPE(&(from)->msg_type, &(to)->msg_type)) goto fail;
7144 0 : if((from)->padata) {
7145 0 : (to)->padata = malloc(sizeof(*(to)->padata));
7146 0 : if((to)->padata == NULL) goto fail;
7147 0 : if(copy_METHOD_DATA((from)->padata, (to)->padata)) goto fail;
7148 : }else
7149 0 : (to)->padata = NULL;
7150 0 : if(copy_KDC_REQ_BODY(&(from)->req_body, &(to)->req_body)) goto fail;
7151 0 : return 0;
7152 0 : fail:
7153 0 : free_KDC_REQ(to);
7154 0 : return ENOMEM;
7155 : }
7156 :
7157 : int ASN1CALL
7158 44706 : encode_AS_REQ(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const AS_REQ *data, size_t *size)
7159 : {
7160 44706 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
7161 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
7162 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
7163 :
7164 44706 : e = encode_KDC_REQ(p, len, data, &l);
7165 44706 : if (e) return e;
7166 44706 : p -= l; len -= l; ret += l;
7167 :
7168 44706 : e = der_put_length_and_tag (p, len, ret, ASN1_C_APPL, CONS, 10, &l);
7169 44706 : if (e) return e;
7170 44706 : p -= l; len -= l; ret += l;
7171 :
7172 44706 : *size = ret;
7173 44706 : return 0;
7174 : }
7175 :
7176 : int ASN1CALL
7177 95616 : decode_AS_REQ(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, AS_REQ *data, size_t *size)
7178 : {
7179 95616 : size_t ret = 0;
7180 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
7181 : int e HEIMDAL_UNUSED_ATTRIBUTE;
7182 :
7183 95616 : memset(data, 0, sizeof(*data));
7184 : {
7185 : size_t Top_datalen, Top_oldlen;
7186 : Der_type Top_type;
7187 95616 : e = der_match_tag_and_length(p, len, ASN1_C_APPL, &Top_type, 10, &Top_datalen, &l);
7188 95616 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
7189 136417 : if(e) goto fail;
7190 53726 : p += l; len -= l; ret += l;
7191 53726 : Top_oldlen = len;
7192 53726 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
7193 53726 : len = Top_datalen;
7194 53726 : e = decode_KDC_REQ(p, len, data, &l);
7195 53726 : if(e) goto fail;
7196 53726 : p += l; len -= l; ret += l;
7197 53726 : len = Top_oldlen - Top_datalen;
7198 : }
7199 107452 : if(size) *size = ret;
7200 52841 : return 0;
7201 41890 : fail:
7202 41890 : free_AS_REQ(data);
7203 41890 : return e;
7204 : }
7205 :
7206 : void ASN1CALL
7207 117256 : free_AS_REQ(AS_REQ *data)
7208 : {
7209 117256 : free_KDC_REQ(data);
7210 117256 : }
7211 :
7212 : size_t ASN1CALL
7213 44706 : length_AS_REQ(const AS_REQ *data)
7214 : {
7215 44706 : size_t ret = 0;
7216 44706 : ret += length_KDC_REQ(data);
7217 44706 : ret += 1 + der_length_len (ret);
7218 44706 : return ret;
7219 : }
7220 :
7221 : int ASN1CALL
7222 0 : copy_AS_REQ(const AS_REQ *from, AS_REQ *to)
7223 : {
7224 0 : memset(to, 0, sizeof(*to));
7225 0 : if(copy_KDC_REQ(from, to)) goto fail;
7226 0 : return 0;
7227 0 : fail:
7228 0 : free_AS_REQ(to);
7229 0 : return ENOMEM;
7230 : }
7231 :
7232 : int ASN1CALL
7233 40970 : encode_TGS_REQ(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const TGS_REQ *data, size_t *size)
7234 : {
7235 40970 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
7236 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
7237 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
7238 :
7239 40970 : e = encode_KDC_REQ(p, len, data, &l);
7240 40970 : if (e) return e;
7241 40970 : p -= l; len -= l; ret += l;
7242 :
7243 40970 : e = der_put_length_and_tag (p, len, ret, ASN1_C_APPL, CONS, 12, &l);
7244 40970 : if (e) return e;
7245 40970 : p -= l; len -= l; ret += l;
7246 :
7247 40970 : *size = ret;
7248 40970 : return 0;
7249 : }
7250 :
7251 : int ASN1CALL
7252 50938 : decode_TGS_REQ(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, TGS_REQ *data, size_t *size)
7253 : {
7254 50938 : size_t ret = 0;
7255 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
7256 : int e HEIMDAL_UNUSED_ATTRIBUTE;
7257 :
7258 50938 : memset(data, 0, sizeof(*data));
7259 : {
7260 : size_t Top_datalen, Top_oldlen;
7261 : Der_type Top_type;
7262 50938 : e = der_match_tag_and_length(p, len, ASN1_C_APPL, &Top_type, 12, &Top_datalen, &l);
7263 50938 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
7264 50938 : if(e) goto fail;
7265 50938 : p += l; len -= l; ret += l;
7266 50938 : Top_oldlen = len;
7267 50938 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
7268 50938 : len = Top_datalen;
7269 50938 : e = decode_KDC_REQ(p, len, data, &l);
7270 50938 : if(e) goto fail;
7271 50938 : p += l; len -= l; ret += l;
7272 50938 : len = Top_oldlen - Top_datalen;
7273 : }
7274 101876 : if(size) *size = ret;
7275 49849 : return 0;
7276 0 : fail:
7277 0 : free_TGS_REQ(data);
7278 0 : return e;
7279 : }
7280 :
7281 : void ASN1CALL
7282 88416 : free_TGS_REQ(TGS_REQ *data)
7283 : {
7284 88416 : free_KDC_REQ(data);
7285 88416 : }
7286 :
7287 : size_t ASN1CALL
7288 40970 : length_TGS_REQ(const TGS_REQ *data)
7289 : {
7290 40970 : size_t ret = 0;
7291 40970 : ret += length_KDC_REQ(data);
7292 40970 : ret += 1 + der_length_len (ret);
7293 40970 : return ret;
7294 : }
7295 :
7296 : int ASN1CALL
7297 0 : copy_TGS_REQ(const TGS_REQ *from, TGS_REQ *to)
7298 : {
7299 0 : memset(to, 0, sizeof(*to));
7300 0 : if(copy_KDC_REQ(from, to)) goto fail;
7301 0 : return 0;
7302 0 : fail:
7303 0 : free_TGS_REQ(to);
7304 0 : return ENOMEM;
7305 : }
7306 :
7307 : int ASN1CALL
7308 13627 : encode_PA_ENC_TS_ENC(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const PA_ENC_TS_ENC *data, size_t *size)
7309 : {
7310 13627 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
7311 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
7312 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
7313 :
7314 : /* pausec */
7315 13627 : if((data)->pausec) {
7316 13627 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
7317 13627 : ret = 0;
7318 13627 : e = encode_krb5int32(p, len, (data)->pausec, &l);
7319 13627 : if (e) return e;
7320 13627 : p -= l; len -= l; ret += l;
7321 :
7322 13627 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
7323 13627 : if (e) return e;
7324 13627 : p -= l; len -= l; ret += l;
7325 :
7326 13627 : ret += Top_tag_oldret;
7327 : }
7328 : /* patimestamp */
7329 : {
7330 13627 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
7331 13627 : ret = 0;
7332 13627 : e = encode_KerberosTime(p, len, &(data)->patimestamp, &l);
7333 13627 : if (e) return e;
7334 13627 : p -= l; len -= l; ret += l;
7335 :
7336 13627 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
7337 13627 : if (e) return e;
7338 13627 : p -= l; len -= l; ret += l;
7339 :
7340 13627 : ret += Top_tag_oldret;
7341 : }
7342 13627 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
7343 13627 : if (e) return e;
7344 13627 : p -= l; len -= l; ret += l;
7345 :
7346 13627 : *size = ret;
7347 13627 : return 0;
7348 : }
7349 :
7350 : int ASN1CALL
7351 26330 : decode_PA_ENC_TS_ENC(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, PA_ENC_TS_ENC *data, size_t *size)
7352 : {
7353 26330 : size_t ret = 0;
7354 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
7355 : int e HEIMDAL_UNUSED_ATTRIBUTE;
7356 :
7357 26330 : memset(data, 0, sizeof(*data));
7358 : {
7359 : size_t Top_datalen, Top_oldlen;
7360 : Der_type Top_type;
7361 26330 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
7362 26330 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
7363 26330 : if(e) goto fail;
7364 26330 : p += l; len -= l; ret += l;
7365 26330 : Top_oldlen = len;
7366 26330 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
7367 26330 : len = Top_datalen;
7368 : {
7369 : size_t patimestamp_datalen, patimestamp_oldlen;
7370 : Der_type patimestamp_type;
7371 26330 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &patimestamp_type, 0, &patimestamp_datalen, &l);
7372 26330 : if (e == 0 && patimestamp_type != CONS) { e = ASN1_BAD_ID; }
7373 26330 : if(e) goto fail;
7374 26330 : p += l; len -= l; ret += l;
7375 26330 : patimestamp_oldlen = len;
7376 26330 : if (patimestamp_datalen > len) { e = ASN1_OVERRUN; goto fail; }
7377 26330 : len = patimestamp_datalen;
7378 26330 : e = decode_KerberosTime(p, len, &(data)->patimestamp, &l);
7379 26330 : if(e) goto fail;
7380 26330 : p += l; len -= l; ret += l;
7381 26330 : len = patimestamp_oldlen - patimestamp_datalen;
7382 : }
7383 : {
7384 : size_t pausec_datalen, pausec_oldlen;
7385 : Der_type pausec_type;
7386 26330 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &pausec_type, 1, &pausec_datalen, &l);
7387 52070 : if (e == 0 && pausec_type != CONS) { e = ASN1_BAD_ID; }
7388 26330 : if(e) {
7389 0 : (data)->pausec = NULL;
7390 : } else {
7391 26330 : (data)->pausec = calloc(1, sizeof(*(data)->pausec));
7392 26330 : if ((data)->pausec == NULL) { e = ENOMEM; goto fail; }
7393 26330 : p += l; len -= l; ret += l;
7394 26330 : pausec_oldlen = len;
7395 26330 : if (pausec_datalen > len) { e = ASN1_OVERRUN; goto fail; }
7396 26330 : len = pausec_datalen;
7397 26330 : e = decode_krb5int32(p, len, (data)->pausec, &l);
7398 26330 : if(e) goto fail;
7399 26330 : p += l; len -= l; ret += l;
7400 26330 : len = pausec_oldlen - pausec_datalen;
7401 : }
7402 : }
7403 26330 : len = Top_oldlen - Top_datalen;
7404 : }
7405 52660 : if(size) *size = ret;
7406 25740 : return 0;
7407 0 : fail:
7408 0 : free_PA_ENC_TS_ENC(data);
7409 0 : return e;
7410 : }
7411 :
7412 : void ASN1CALL
7413 26330 : free_PA_ENC_TS_ENC(PA_ENC_TS_ENC *data)
7414 : {
7415 26330 : free_KerberosTime(&(data)->patimestamp);
7416 26330 : if((data)->pausec) {
7417 26330 : free_krb5int32((data)->pausec);
7418 26330 : free((data)->pausec);
7419 26330 : (data)->pausec = NULL;
7420 : }
7421 26330 : }
7422 :
7423 : size_t ASN1CALL
7424 13627 : length_PA_ENC_TS_ENC(const PA_ENC_TS_ENC *data)
7425 : {
7426 13627 : size_t ret = 0;
7427 : {
7428 13627 : size_t Top_tag_oldret = ret;
7429 13627 : ret = 0;
7430 13627 : ret += length_KerberosTime(&(data)->patimestamp);
7431 13627 : ret += 1 + der_length_len (ret);
7432 13627 : ret += Top_tag_oldret;
7433 : }
7434 13627 : if((data)->pausec){
7435 13627 : size_t Top_tag_oldret = ret;
7436 13627 : ret = 0;
7437 13627 : ret += length_krb5int32((data)->pausec);
7438 13627 : ret += 1 + der_length_len (ret);
7439 13627 : ret += Top_tag_oldret;
7440 : }
7441 13627 : ret += 1 + der_length_len (ret);
7442 13627 : return ret;
7443 : }
7444 :
7445 : int ASN1CALL
7446 0 : copy_PA_ENC_TS_ENC(const PA_ENC_TS_ENC *from, PA_ENC_TS_ENC *to)
7447 : {
7448 0 : memset(to, 0, sizeof(*to));
7449 0 : if(copy_KerberosTime(&(from)->patimestamp, &(to)->patimestamp)) goto fail;
7450 0 : if((from)->pausec) {
7451 0 : (to)->pausec = malloc(sizeof(*(to)->pausec));
7452 0 : if((to)->pausec == NULL) goto fail;
7453 0 : if(copy_krb5int32((from)->pausec, (to)->pausec)) goto fail;
7454 : }else
7455 0 : (to)->pausec = NULL;
7456 0 : return 0;
7457 0 : fail:
7458 0 : free_PA_ENC_TS_ENC(to);
7459 0 : return ENOMEM;
7460 : }
7461 :
7462 : int ASN1CALL
7463 1012 : encode_PA_PAC_REQUEST(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const PA_PAC_REQUEST *data, size_t *size)
7464 : {
7465 1012 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
7466 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
7467 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
7468 :
7469 : /* include-pac */
7470 : {
7471 1012 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
7472 1012 : ret = 0;
7473 1012 : e = der_put_boolean(p, len, &(data)->include_pac, &l);
7474 1012 : if (e) return e;
7475 1012 : p -= l; len -= l; ret += l;
7476 :
7477 1012 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_Boolean, &l);
7478 1012 : if (e) return e;
7479 1012 : p -= l; len -= l; ret += l;
7480 :
7481 1012 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
7482 1012 : if (e) return e;
7483 1012 : p -= l; len -= l; ret += l;
7484 :
7485 1012 : ret += Top_tag_oldret;
7486 : }
7487 1012 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
7488 1012 : if (e) return e;
7489 1012 : p -= l; len -= l; ret += l;
7490 :
7491 1012 : *size = ret;
7492 1012 : return 0;
7493 : }
7494 :
7495 : int ASN1CALL
7496 324 : decode_PA_PAC_REQUEST(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, PA_PAC_REQUEST *data, size_t *size)
7497 : {
7498 324 : size_t ret = 0;
7499 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
7500 : int e HEIMDAL_UNUSED_ATTRIBUTE;
7501 :
7502 324 : memset(data, 0, sizeof(*data));
7503 : {
7504 : size_t Top_datalen, Top_oldlen;
7505 : Der_type Top_type;
7506 324 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
7507 324 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
7508 324 : if(e) goto fail;
7509 324 : p += l; len -= l; ret += l;
7510 324 : Top_oldlen = len;
7511 324 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
7512 324 : len = Top_datalen;
7513 : {
7514 : size_t include_pac_datalen, include_pac_oldlen;
7515 : Der_type include_pac_type;
7516 324 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &include_pac_type, 0, &include_pac_datalen, &l);
7517 324 : if (e == 0 && include_pac_type != CONS) { e = ASN1_BAD_ID; }
7518 324 : if(e) goto fail;
7519 324 : p += l; len -= l; ret += l;
7520 324 : include_pac_oldlen = len;
7521 324 : if (include_pac_datalen > len) { e = ASN1_OVERRUN; goto fail; }
7522 324 : len = include_pac_datalen;
7523 : {
7524 : size_t include_pac_Tag_datalen, include_pac_Tag_oldlen;
7525 : Der_type include_pac_Tag_type;
7526 324 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &include_pac_Tag_type, UT_Boolean, &include_pac_Tag_datalen, &l);
7527 324 : if (e == 0 && include_pac_Tag_type != PRIM) { e = ASN1_BAD_ID; }
7528 324 : if(e) goto fail;
7529 324 : p += l; len -= l; ret += l;
7530 324 : include_pac_Tag_oldlen = len;
7531 324 : if (include_pac_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
7532 324 : len = include_pac_Tag_datalen;
7533 324 : e = der_get_boolean(p, len, &(data)->include_pac, &l);
7534 324 : if(e) goto fail;
7535 324 : p += l; len -= l; ret += l;
7536 324 : len = include_pac_Tag_oldlen - include_pac_Tag_datalen;
7537 : }
7538 324 : len = include_pac_oldlen - include_pac_datalen;
7539 : }
7540 324 : len = Top_oldlen - Top_datalen;
7541 : }
7542 324 : if(size) *size = ret;
7543 324 : return 0;
7544 0 : fail:
7545 0 : free_PA_PAC_REQUEST(data);
7546 0 : return e;
7547 : }
7548 :
7549 : void ASN1CALL
7550 324 : free_PA_PAC_REQUEST(PA_PAC_REQUEST *data)
7551 : {
7552 324 : }
7553 :
7554 : size_t ASN1CALL
7555 1012 : length_PA_PAC_REQUEST(const PA_PAC_REQUEST *data)
7556 : {
7557 1012 : size_t ret = 0;
7558 : {
7559 1012 : size_t Top_tag_oldret = ret;
7560 1012 : ret = 0;
7561 1012 : ret += 1;
7562 1012 : ret += 1 + der_length_len (ret);
7563 1012 : ret += 1 + der_length_len (ret);
7564 1012 : ret += Top_tag_oldret;
7565 : }
7566 1012 : ret += 1 + der_length_len (ret);
7567 1012 : return ret;
7568 : }
7569 :
7570 : int ASN1CALL
7571 0 : copy_PA_PAC_REQUEST(const PA_PAC_REQUEST *from, PA_PAC_REQUEST *to)
7572 : {
7573 0 : memset(to, 0, sizeof(*to));
7574 0 : *(&(to)->include_pac) = *(&(from)->include_pac);
7575 0 : return 0;
7576 : }
7577 :
7578 : int ASN1CALL
7579 0 : encode_PROV_SRV_LOCATION(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const PROV_SRV_LOCATION *data, size_t *size)
7580 : {
7581 0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
7582 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
7583 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
7584 :
7585 0 : e = der_put_general_string(p, len, data, &l);
7586 0 : if (e) return e;
7587 0 : p -= l; len -= l; ret += l;
7588 :
7589 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_GeneralString, &l);
7590 0 : if (e) return e;
7591 0 : p -= l; len -= l; ret += l;
7592 :
7593 0 : *size = ret;
7594 0 : return 0;
7595 : }
7596 :
7597 : int ASN1CALL
7598 0 : decode_PROV_SRV_LOCATION(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, PROV_SRV_LOCATION *data, size_t *size)
7599 : {
7600 0 : size_t ret = 0;
7601 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
7602 : int e HEIMDAL_UNUSED_ATTRIBUTE;
7603 :
7604 0 : memset(data, 0, sizeof(*data));
7605 : {
7606 : size_t Top_datalen, Top_oldlen;
7607 : Der_type Top_type;
7608 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_GeneralString, &Top_datalen, &l);
7609 0 : if (e == 0 && Top_type != PRIM) { e = ASN1_BAD_ID; }
7610 0 : if(e) goto fail;
7611 0 : p += l; len -= l; ret += l;
7612 0 : Top_oldlen = len;
7613 0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
7614 0 : len = Top_datalen;
7615 0 : e = der_get_general_string(p, len, data, &l);
7616 0 : if(e) goto fail;
7617 0 : p += l; len -= l; ret += l;
7618 0 : len = Top_oldlen - Top_datalen;
7619 : }
7620 0 : if(size) *size = ret;
7621 0 : return 0;
7622 0 : fail:
7623 0 : free_PROV_SRV_LOCATION(data);
7624 0 : return e;
7625 : }
7626 :
7627 : void ASN1CALL
7628 0 : free_PROV_SRV_LOCATION(PROV_SRV_LOCATION *data)
7629 : {
7630 0 : der_free_general_string(data);
7631 0 : }
7632 :
7633 : size_t ASN1CALL
7634 0 : length_PROV_SRV_LOCATION(const PROV_SRV_LOCATION *data)
7635 : {
7636 0 : size_t ret = 0;
7637 0 : ret += der_length_general_string(data);
7638 0 : ret += 1 + der_length_len (ret);
7639 0 : return ret;
7640 : }
7641 :
7642 : int ASN1CALL
7643 0 : copy_PROV_SRV_LOCATION(const PROV_SRV_LOCATION *from, PROV_SRV_LOCATION *to)
7644 : {
7645 0 : memset(to, 0, sizeof(*to));
7646 0 : if(der_copy_general_string(from, to)) goto fail;
7647 0 : return 0;
7648 0 : fail:
7649 0 : free_PROV_SRV_LOCATION(to);
7650 0 : return ENOMEM;
7651 : }
7652 :
7653 : int ASN1CALL
7654 66032 : encode_KDC_REP(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const KDC_REP *data, size_t *size)
7655 : {
7656 66032 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
7657 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
7658 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
7659 :
7660 : /* enc-part */
7661 : {
7662 66032 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
7663 66032 : ret = 0;
7664 66032 : e = encode_EncryptedData(p, len, &(data)->enc_part, &l);
7665 66032 : if (e) return e;
7666 66032 : p -= l; len -= l; ret += l;
7667 :
7668 66032 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 6, &l);
7669 66032 : if (e) return e;
7670 66032 : p -= l; len -= l; ret += l;
7671 :
7672 66032 : ret += Top_tag_oldret;
7673 : }
7674 : /* ticket */
7675 : {
7676 66032 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
7677 66032 : ret = 0;
7678 66032 : e = encode_Ticket(p, len, &(data)->ticket, &l);
7679 66032 : if (e) return e;
7680 66032 : p -= l; len -= l; ret += l;
7681 :
7682 66032 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 5, &l);
7683 66032 : if (e) return e;
7684 66032 : p -= l; len -= l; ret += l;
7685 :
7686 66032 : ret += Top_tag_oldret;
7687 : }
7688 : /* cname */
7689 : {
7690 66032 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
7691 66032 : ret = 0;
7692 66032 : e = encode_PrincipalName(p, len, &(data)->cname, &l);
7693 66032 : if (e) return e;
7694 66032 : p -= l; len -= l; ret += l;
7695 :
7696 66032 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 4, &l);
7697 66032 : if (e) return e;
7698 66032 : p -= l; len -= l; ret += l;
7699 :
7700 66032 : ret += Top_tag_oldret;
7701 : }
7702 : /* crealm */
7703 : {
7704 66032 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
7705 66032 : ret = 0;
7706 66032 : e = encode_Realm(p, len, &(data)->crealm, &l);
7707 66032 : if (e) return e;
7708 66032 : p -= l; len -= l; ret += l;
7709 :
7710 66032 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 3, &l);
7711 66032 : if (e) return e;
7712 66032 : p -= l; len -= l; ret += l;
7713 :
7714 66032 : ret += Top_tag_oldret;
7715 : }
7716 : /* padata */
7717 66032 : if((data)->padata) {
7718 18823 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
7719 18823 : ret = 0;
7720 18823 : e = encode_METHOD_DATA(p, len, (data)->padata, &l);
7721 18823 : if (e) return e;
7722 18823 : p -= l; len -= l; ret += l;
7723 :
7724 18823 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
7725 18823 : if (e) return e;
7726 18823 : p -= l; len -= l; ret += l;
7727 :
7728 18823 : ret += Top_tag_oldret;
7729 : }
7730 : /* msg-type */
7731 : {
7732 66032 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
7733 66032 : ret = 0;
7734 66032 : e = encode_MESSAGE_TYPE(p, len, &(data)->msg_type, &l);
7735 66032 : if (e) return e;
7736 66032 : p -= l; len -= l; ret += l;
7737 :
7738 66032 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
7739 66032 : if (e) return e;
7740 66032 : p -= l; len -= l; ret += l;
7741 :
7742 66032 : ret += Top_tag_oldret;
7743 : }
7744 : /* pvno */
7745 : {
7746 66032 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
7747 66032 : ret = 0;
7748 66032 : e = encode_krb5int32(p, len, &(data)->pvno, &l);
7749 66032 : if (e) return e;
7750 66032 : p -= l; len -= l; ret += l;
7751 :
7752 66032 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
7753 66032 : if (e) return e;
7754 66032 : p -= l; len -= l; ret += l;
7755 :
7756 66032 : ret += Top_tag_oldret;
7757 : }
7758 66032 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
7759 66032 : if (e) return e;
7760 66032 : p -= l; len -= l; ret += l;
7761 :
7762 66032 : *size = ret;
7763 66032 : return 0;
7764 : }
7765 :
7766 : int ASN1CALL
7767 64458 : decode_KDC_REP(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, KDC_REP *data, size_t *size)
7768 : {
7769 64458 : size_t ret = 0;
7770 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
7771 : int e HEIMDAL_UNUSED_ATTRIBUTE;
7772 :
7773 64458 : memset(data, 0, sizeof(*data));
7774 : {
7775 : size_t Top_datalen, Top_oldlen;
7776 : Der_type Top_type;
7777 64458 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
7778 64458 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
7779 64458 : if(e) goto fail;
7780 64458 : p += l; len -= l; ret += l;
7781 64458 : Top_oldlen = len;
7782 64458 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
7783 64458 : len = Top_datalen;
7784 : {
7785 : size_t pvno_datalen, pvno_oldlen;
7786 : Der_type pvno_type;
7787 64458 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &pvno_type, 0, &pvno_datalen, &l);
7788 64458 : if (e == 0 && pvno_type != CONS) { e = ASN1_BAD_ID; }
7789 64458 : if(e) goto fail;
7790 64458 : p += l; len -= l; ret += l;
7791 64458 : pvno_oldlen = len;
7792 64458 : if (pvno_datalen > len) { e = ASN1_OVERRUN; goto fail; }
7793 64458 : len = pvno_datalen;
7794 64458 : e = decode_krb5int32(p, len, &(data)->pvno, &l);
7795 64458 : if(e) goto fail;
7796 64458 : p += l; len -= l; ret += l;
7797 64458 : len = pvno_oldlen - pvno_datalen;
7798 : }
7799 : {
7800 : size_t msg_type_datalen, msg_type_oldlen;
7801 : Der_type msg_type_type;
7802 64458 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &msg_type_type, 1, &msg_type_datalen, &l);
7803 127532 : if (e == 0 && msg_type_type != CONS) { e = ASN1_BAD_ID; }
7804 64458 : if(e) goto fail;
7805 64458 : p += l; len -= l; ret += l;
7806 64458 : msg_type_oldlen = len;
7807 64458 : if (msg_type_datalen > len) { e = ASN1_OVERRUN; goto fail; }
7808 64458 : len = msg_type_datalen;
7809 64458 : e = decode_MESSAGE_TYPE(p, len, &(data)->msg_type, &l);
7810 64458 : if(e) goto fail;
7811 64458 : p += l; len -= l; ret += l;
7812 64458 : len = msg_type_oldlen - msg_type_datalen;
7813 : }
7814 : {
7815 : size_t padata_datalen, padata_oldlen;
7816 : Der_type padata_type;
7817 64458 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &padata_type, 2, &padata_datalen, &l);
7818 74180 : if (e == 0 && padata_type != CONS) { e = ASN1_BAD_ID; }
7819 64458 : if(e) {
7820 54523 : (data)->padata = NULL;
7821 : } else {
7822 9935 : (data)->padata = calloc(1, sizeof(*(data)->padata));
7823 9935 : if ((data)->padata == NULL) { e = ENOMEM; goto fail; }
7824 9935 : p += l; len -= l; ret += l;
7825 9935 : padata_oldlen = len;
7826 9935 : if (padata_datalen > len) { e = ASN1_OVERRUN; goto fail; }
7827 9935 : len = padata_datalen;
7828 9935 : e = decode_METHOD_DATA(p, len, (data)->padata, &l);
7829 9935 : if(e) goto fail;
7830 9935 : p += l; len -= l; ret += l;
7831 9935 : len = padata_oldlen - padata_datalen;
7832 : }
7833 : }
7834 : {
7835 : size_t crealm_datalen, crealm_oldlen;
7836 : Der_type crealm_type;
7837 64458 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &crealm_type, 3, &crealm_datalen, &l);
7838 128916 : if (e == 0 && crealm_type != CONS) { e = ASN1_BAD_ID; }
7839 64458 : if(e) goto fail;
7840 64458 : p += l; len -= l; ret += l;
7841 64458 : crealm_oldlen = len;
7842 64458 : if (crealm_datalen > len) { e = ASN1_OVERRUN; goto fail; }
7843 64458 : len = crealm_datalen;
7844 64458 : e = decode_Realm(p, len, &(data)->crealm, &l);
7845 64458 : if(e) goto fail;
7846 64458 : p += l; len -= l; ret += l;
7847 64458 : len = crealm_oldlen - crealm_datalen;
7848 : }
7849 : {
7850 : size_t cname_datalen, cname_oldlen;
7851 : Der_type cname_type;
7852 64458 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &cname_type, 4, &cname_datalen, &l);
7853 127532 : if (e == 0 && cname_type != CONS) { e = ASN1_BAD_ID; }
7854 64458 : if(e) goto fail;
7855 64458 : p += l; len -= l; ret += l;
7856 64458 : cname_oldlen = len;
7857 64458 : if (cname_datalen > len) { e = ASN1_OVERRUN; goto fail; }
7858 64458 : len = cname_datalen;
7859 64458 : e = decode_PrincipalName(p, len, &(data)->cname, &l);
7860 64458 : if(e) goto fail;
7861 64458 : p += l; len -= l; ret += l;
7862 64458 : len = cname_oldlen - cname_datalen;
7863 : }
7864 : {
7865 : size_t ticket_datalen, ticket_oldlen;
7866 : Der_type ticket_type;
7867 64458 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &ticket_type, 5, &ticket_datalen, &l);
7868 127532 : if (e == 0 && ticket_type != CONS) { e = ASN1_BAD_ID; }
7869 64458 : if(e) goto fail;
7870 64458 : p += l; len -= l; ret += l;
7871 64458 : ticket_oldlen = len;
7872 64458 : if (ticket_datalen > len) { e = ASN1_OVERRUN; goto fail; }
7873 64458 : len = ticket_datalen;
7874 64458 : e = decode_Ticket(p, len, &(data)->ticket, &l);
7875 64458 : if(e) goto fail;
7876 64458 : p += l; len -= l; ret += l;
7877 64458 : len = ticket_oldlen - ticket_datalen;
7878 : }
7879 : {
7880 : size_t enc_part_datalen, enc_part_oldlen;
7881 : Der_type enc_part_type;
7882 64458 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &enc_part_type, 6, &enc_part_datalen, &l);
7883 127532 : if (e == 0 && enc_part_type != CONS) { e = ASN1_BAD_ID; }
7884 64458 : if(e) goto fail;
7885 64458 : p += l; len -= l; ret += l;
7886 64458 : enc_part_oldlen = len;
7887 64458 : if (enc_part_datalen > len) { e = ASN1_OVERRUN; goto fail; }
7888 64458 : len = enc_part_datalen;
7889 64458 : e = decode_EncryptedData(p, len, &(data)->enc_part, &l);
7890 64458 : if(e) goto fail;
7891 64458 : p += l; len -= l; ret += l;
7892 64458 : len = enc_part_oldlen - enc_part_datalen;
7893 : }
7894 64458 : len = Top_oldlen - Top_datalen;
7895 : }
7896 128916 : if(size) *size = ret;
7897 63074 : return 0;
7898 0 : fail:
7899 0 : free_KDC_REP(data);
7900 0 : return e;
7901 : }
7902 :
7903 : void ASN1CALL
7904 185967 : free_KDC_REP(KDC_REP *data)
7905 : {
7906 185967 : free_krb5int32(&(data)->pvno);
7907 185967 : free_MESSAGE_TYPE(&(data)->msg_type);
7908 185967 : if((data)->padata) {
7909 46603 : free_METHOD_DATA((data)->padata);
7910 46603 : free((data)->padata);
7911 46603 : (data)->padata = NULL;
7912 : }
7913 185967 : free_Realm(&(data)->crealm);
7914 185967 : free_PrincipalName(&(data)->cname);
7915 185967 : free_Ticket(&(data)->ticket);
7916 185967 : free_EncryptedData(&(data)->enc_part);
7917 185967 : }
7918 :
7919 : size_t ASN1CALL
7920 66032 : length_KDC_REP(const KDC_REP *data)
7921 : {
7922 66032 : size_t ret = 0;
7923 : {
7924 66032 : size_t Top_tag_oldret = ret;
7925 66032 : ret = 0;
7926 66032 : ret += length_krb5int32(&(data)->pvno);
7927 66032 : ret += 1 + der_length_len (ret);
7928 66032 : ret += Top_tag_oldret;
7929 : }
7930 : {
7931 66032 : size_t Top_tag_oldret = ret;
7932 66032 : ret = 0;
7933 66032 : ret += length_MESSAGE_TYPE(&(data)->msg_type);
7934 66032 : ret += 1 + der_length_len (ret);
7935 66032 : ret += Top_tag_oldret;
7936 : }
7937 66032 : if((data)->padata){
7938 18823 : size_t Top_tag_oldret = ret;
7939 18823 : ret = 0;
7940 18823 : ret += length_METHOD_DATA((data)->padata);
7941 18823 : ret += 1 + der_length_len (ret);
7942 18823 : ret += Top_tag_oldret;
7943 : }
7944 : {
7945 66032 : size_t Top_tag_oldret = ret;
7946 66032 : ret = 0;
7947 66032 : ret += length_Realm(&(data)->crealm);
7948 66032 : ret += 1 + der_length_len (ret);
7949 66032 : ret += Top_tag_oldret;
7950 : }
7951 : {
7952 66032 : size_t Top_tag_oldret = ret;
7953 66032 : ret = 0;
7954 66032 : ret += length_PrincipalName(&(data)->cname);
7955 66032 : ret += 1 + der_length_len (ret);
7956 66032 : ret += Top_tag_oldret;
7957 : }
7958 : {
7959 66032 : size_t Top_tag_oldret = ret;
7960 66032 : ret = 0;
7961 66032 : ret += length_Ticket(&(data)->ticket);
7962 66032 : ret += 1 + der_length_len (ret);
7963 66032 : ret += Top_tag_oldret;
7964 : }
7965 : {
7966 66032 : size_t Top_tag_oldret = ret;
7967 66032 : ret = 0;
7968 66032 : ret += length_EncryptedData(&(data)->enc_part);
7969 66032 : ret += 1 + der_length_len (ret);
7970 66032 : ret += Top_tag_oldret;
7971 : }
7972 66032 : ret += 1 + der_length_len (ret);
7973 66032 : return ret;
7974 : }
7975 :
7976 : int ASN1CALL
7977 0 : copy_KDC_REP(const KDC_REP *from, KDC_REP *to)
7978 : {
7979 0 : memset(to, 0, sizeof(*to));
7980 0 : if(copy_krb5int32(&(from)->pvno, &(to)->pvno)) goto fail;
7981 0 : if(copy_MESSAGE_TYPE(&(from)->msg_type, &(to)->msg_type)) goto fail;
7982 0 : if((from)->padata) {
7983 0 : (to)->padata = malloc(sizeof(*(to)->padata));
7984 0 : if((to)->padata == NULL) goto fail;
7985 0 : if(copy_METHOD_DATA((from)->padata, (to)->padata)) goto fail;
7986 : }else
7987 0 : (to)->padata = NULL;
7988 0 : if(copy_Realm(&(from)->crealm, &(to)->crealm)) goto fail;
7989 0 : if(copy_PrincipalName(&(from)->cname, &(to)->cname)) goto fail;
7990 0 : if(copy_Ticket(&(from)->ticket, &(to)->ticket)) goto fail;
7991 0 : if(copy_EncryptedData(&(from)->enc_part, &(to)->enc_part)) goto fail;
7992 0 : return 0;
7993 0 : fail:
7994 0 : free_KDC_REP(to);
7995 0 : return ENOMEM;
7996 : }
7997 :
7998 : int ASN1CALL
7999 26359 : encode_AS_REP(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const AS_REP *data, size_t *size)
8000 : {
8001 26359 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
8002 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
8003 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
8004 :
8005 26359 : e = encode_KDC_REP(p, len, data, &l);
8006 26359 : if (e) return e;
8007 26359 : p -= l; len -= l; ret += l;
8008 :
8009 26359 : e = der_put_length_and_tag (p, len, ret, ASN1_C_APPL, CONS, 11, &l);
8010 26359 : if (e) return e;
8011 26359 : p -= l; len -= l; ret += l;
8012 :
8013 26359 : *size = ret;
8014 26359 : return 0;
8015 : }
8016 :
8017 : int ASN1CALL
8018 31585 : decode_AS_REP(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, AS_REP *data, size_t *size)
8019 : {
8020 31585 : size_t ret = 0;
8021 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
8022 : int e HEIMDAL_UNUSED_ATTRIBUTE;
8023 :
8024 31585 : memset(data, 0, sizeof(*data));
8025 : {
8026 : size_t Top_datalen, Top_oldlen;
8027 : Der_type Top_type;
8028 31585 : e = der_match_tag_and_length(p, len, ASN1_C_APPL, &Top_type, 11, &Top_datalen, &l);
8029 31585 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
8030 46369 : if(e) goto fail;
8031 16506 : p += l; len -= l; ret += l;
8032 16506 : Top_oldlen = len;
8033 16506 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
8034 16506 : len = Top_datalen;
8035 16506 : e = decode_KDC_REP(p, len, data, &l);
8036 16506 : if(e) goto fail;
8037 16506 : p += l; len -= l; ret += l;
8038 16506 : len = Top_oldlen - Top_datalen;
8039 : }
8040 33012 : if(size) *size = ret;
8041 16211 : return 0;
8042 15079 : fail:
8043 15079 : free_AS_REP(data);
8044 15079 : return e;
8045 : }
8046 :
8047 : void ASN1CALL
8048 97238 : free_AS_REP(AS_REP *data)
8049 : {
8050 97238 : free_KDC_REP(data);
8051 97238 : }
8052 :
8053 : size_t ASN1CALL
8054 26359 : length_AS_REP(const AS_REP *data)
8055 : {
8056 26359 : size_t ret = 0;
8057 26359 : ret += length_KDC_REP(data);
8058 26359 : ret += 1 + der_length_len (ret);
8059 26359 : return ret;
8060 : }
8061 :
8062 : int ASN1CALL
8063 0 : copy_AS_REP(const AS_REP *from, AS_REP *to)
8064 : {
8065 0 : memset(to, 0, sizeof(*to));
8066 0 : if(copy_KDC_REP(from, to)) goto fail;
8067 0 : return 0;
8068 0 : fail:
8069 0 : free_AS_REP(to);
8070 0 : return ENOMEM;
8071 : }
8072 :
8073 : int ASN1CALL
8074 39673 : encode_TGS_REP(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const TGS_REP *data, size_t *size)
8075 : {
8076 39673 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
8077 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
8078 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
8079 :
8080 39673 : e = encode_KDC_REP(p, len, data, &l);
8081 39673 : if (e) return e;
8082 39673 : p -= l; len -= l; ret += l;
8083 :
8084 39673 : e = der_put_length_and_tag (p, len, ret, ASN1_C_APPL, CONS, 13, &l);
8085 39673 : if (e) return e;
8086 39673 : p -= l; len -= l; ret += l;
8087 :
8088 39673 : *size = ret;
8089 39673 : return 0;
8090 : }
8091 :
8092 : int ASN1CALL
8093 48858 : decode_TGS_REP(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, TGS_REP *data, size_t *size)
8094 : {
8095 48858 : size_t ret = 0;
8096 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
8097 : int e HEIMDAL_UNUSED_ATTRIBUTE;
8098 :
8099 48858 : memset(data, 0, sizeof(*data));
8100 : {
8101 : size_t Top_datalen, Top_oldlen;
8102 : Der_type Top_type;
8103 48858 : e = der_match_tag_and_length(p, len, ASN1_C_APPL, &Top_type, 13, &Top_datalen, &l);
8104 48858 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
8105 49764 : if(e) goto fail;
8106 47952 : p += l; len -= l; ret += l;
8107 47952 : Top_oldlen = len;
8108 47952 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
8109 47952 : len = Top_datalen;
8110 47952 : e = decode_KDC_REP(p, len, data, &l);
8111 47952 : if(e) goto fail;
8112 47952 : p += l; len -= l; ret += l;
8113 47952 : len = Top_oldlen - Top_datalen;
8114 : }
8115 95904 : if(size) *size = ret;
8116 46863 : return 0;
8117 906 : fail:
8118 906 : free_TGS_REP(data);
8119 906 : return e;
8120 : }
8121 :
8122 : void ASN1CALL
8123 49241 : free_TGS_REP(TGS_REP *data)
8124 : {
8125 49241 : free_KDC_REP(data);
8126 49241 : }
8127 :
8128 : size_t ASN1CALL
8129 39673 : length_TGS_REP(const TGS_REP *data)
8130 : {
8131 39673 : size_t ret = 0;
8132 39673 : ret += length_KDC_REP(data);
8133 39673 : ret += 1 + der_length_len (ret);
8134 39673 : return ret;
8135 : }
8136 :
8137 : int ASN1CALL
8138 0 : copy_TGS_REP(const TGS_REP *from, TGS_REP *to)
8139 : {
8140 0 : memset(to, 0, sizeof(*to));
8141 0 : if(copy_KDC_REP(from, to)) goto fail;
8142 0 : return 0;
8143 0 : fail:
8144 0 : free_TGS_REP(to);
8145 0 : return ENOMEM;
8146 : }
8147 :
8148 : int ASN1CALL
8149 66016 : encode_EncKDCRepPart(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const EncKDCRepPart *data, size_t *size)
8150 : {
8151 66016 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
8152 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
8153 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
8154 :
8155 : /* encrypted-pa-data */
8156 66016 : if((data)->encrypted_pa_data) {
8157 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
8158 0 : ret = 0;
8159 0 : e = encode_METHOD_DATA(p, len, (data)->encrypted_pa_data, &l);
8160 0 : if (e) return e;
8161 0 : p -= l; len -= l; ret += l;
8162 :
8163 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 12, &l);
8164 0 : if (e) return e;
8165 0 : p -= l; len -= l; ret += l;
8166 :
8167 0 : ret += Top_tag_oldret;
8168 : }
8169 : /* caddr */
8170 66016 : if((data)->caddr) {
8171 98 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
8172 98 : ret = 0;
8173 98 : e = encode_HostAddresses(p, len, (data)->caddr, &l);
8174 98 : if (e) return e;
8175 98 : p -= l; len -= l; ret += l;
8176 :
8177 98 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 11, &l);
8178 98 : if (e) return e;
8179 98 : p -= l; len -= l; ret += l;
8180 :
8181 98 : ret += Top_tag_oldret;
8182 : }
8183 : /* sname */
8184 : {
8185 66016 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
8186 66016 : ret = 0;
8187 66016 : e = encode_PrincipalName(p, len, &(data)->sname, &l);
8188 66016 : if (e) return e;
8189 66016 : p -= l; len -= l; ret += l;
8190 :
8191 66016 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 10, &l);
8192 66016 : if (e) return e;
8193 66016 : p -= l; len -= l; ret += l;
8194 :
8195 66016 : ret += Top_tag_oldret;
8196 : }
8197 : /* srealm */
8198 : {
8199 66016 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
8200 66016 : ret = 0;
8201 66016 : e = encode_Realm(p, len, &(data)->srealm, &l);
8202 66016 : if (e) return e;
8203 66016 : p -= l; len -= l; ret += l;
8204 :
8205 66016 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 9, &l);
8206 66016 : if (e) return e;
8207 66016 : p -= l; len -= l; ret += l;
8208 :
8209 66016 : ret += Top_tag_oldret;
8210 : }
8211 : /* renew-till */
8212 66016 : if((data)->renew_till) {
8213 170 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
8214 170 : ret = 0;
8215 170 : e = encode_KerberosTime(p, len, (data)->renew_till, &l);
8216 170 : if (e) return e;
8217 170 : p -= l; len -= l; ret += l;
8218 :
8219 170 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 8, &l);
8220 170 : if (e) return e;
8221 170 : p -= l; len -= l; ret += l;
8222 :
8223 170 : ret += Top_tag_oldret;
8224 : }
8225 : /* endtime */
8226 : {
8227 66016 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
8228 66016 : ret = 0;
8229 66016 : e = encode_KerberosTime(p, len, &(data)->endtime, &l);
8230 66016 : if (e) return e;
8231 66016 : p -= l; len -= l; ret += l;
8232 :
8233 66016 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 7, &l);
8234 66016 : if (e) return e;
8235 66016 : p -= l; len -= l; ret += l;
8236 :
8237 66016 : ret += Top_tag_oldret;
8238 : }
8239 : /* starttime */
8240 66016 : if((data)->starttime) {
8241 39673 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
8242 39673 : ret = 0;
8243 39673 : e = encode_KerberosTime(p, len, (data)->starttime, &l);
8244 39673 : if (e) return e;
8245 39673 : p -= l; len -= l; ret += l;
8246 :
8247 39673 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 6, &l);
8248 39673 : if (e) return e;
8249 39673 : p -= l; len -= l; ret += l;
8250 :
8251 39673 : ret += Top_tag_oldret;
8252 : }
8253 : /* authtime */
8254 : {
8255 66016 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
8256 66016 : ret = 0;
8257 66016 : e = encode_KerberosTime(p, len, &(data)->authtime, &l);
8258 66016 : if (e) return e;
8259 66016 : p -= l; len -= l; ret += l;
8260 :
8261 66016 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 5, &l);
8262 66016 : if (e) return e;
8263 66016 : p -= l; len -= l; ret += l;
8264 :
8265 66016 : ret += Top_tag_oldret;
8266 : }
8267 : /* flags */
8268 : {
8269 66016 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
8270 66016 : ret = 0;
8271 66016 : e = encode_TicketFlags(p, len, &(data)->flags, &l);
8272 66016 : if (e) return e;
8273 66016 : p -= l; len -= l; ret += l;
8274 :
8275 66016 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 4, &l);
8276 66016 : if (e) return e;
8277 66016 : p -= l; len -= l; ret += l;
8278 :
8279 66016 : ret += Top_tag_oldret;
8280 : }
8281 : /* key-expiration */
8282 66016 : if((data)->key_expiration) {
8283 20867 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
8284 20867 : ret = 0;
8285 20867 : e = encode_KerberosTime(p, len, (data)->key_expiration, &l);
8286 20867 : if (e) return e;
8287 20867 : p -= l; len -= l; ret += l;
8288 :
8289 20867 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 3, &l);
8290 20867 : if (e) return e;
8291 20867 : p -= l; len -= l; ret += l;
8292 :
8293 20867 : ret += Top_tag_oldret;
8294 : }
8295 : /* nonce */
8296 : {
8297 66016 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
8298 66016 : ret = 0;
8299 66016 : e = encode_krb5int32(p, len, &(data)->nonce, &l);
8300 66016 : if (e) return e;
8301 66016 : p -= l; len -= l; ret += l;
8302 :
8303 66016 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
8304 66016 : if (e) return e;
8305 66016 : p -= l; len -= l; ret += l;
8306 :
8307 66016 : ret += Top_tag_oldret;
8308 : }
8309 : /* last-req */
8310 : {
8311 66016 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
8312 66016 : ret = 0;
8313 66016 : e = encode_LastReq(p, len, &(data)->last_req, &l);
8314 66016 : if (e) return e;
8315 66016 : p -= l; len -= l; ret += l;
8316 :
8317 66016 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
8318 66016 : if (e) return e;
8319 66016 : p -= l; len -= l; ret += l;
8320 :
8321 66016 : ret += Top_tag_oldret;
8322 : }
8323 : /* key */
8324 : {
8325 66016 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
8326 66016 : ret = 0;
8327 66016 : e = encode_EncryptionKey(p, len, &(data)->key, &l);
8328 66016 : if (e) return e;
8329 66016 : p -= l; len -= l; ret += l;
8330 :
8331 66016 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
8332 66016 : if (e) return e;
8333 66016 : p -= l; len -= l; ret += l;
8334 :
8335 66016 : ret += Top_tag_oldret;
8336 : }
8337 66016 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
8338 66016 : if (e) return e;
8339 66016 : p -= l; len -= l; ret += l;
8340 :
8341 66016 : *size = ret;
8342 66016 : return 0;
8343 : }
8344 :
8345 : int ASN1CALL
8346 52862 : decode_EncKDCRepPart(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, EncKDCRepPart *data, size_t *size)
8347 : {
8348 52862 : size_t ret = 0;
8349 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
8350 : int e HEIMDAL_UNUSED_ATTRIBUTE;
8351 :
8352 52862 : memset(data, 0, sizeof(*data));
8353 : {
8354 : size_t Top_datalen, Top_oldlen;
8355 : Der_type Top_type;
8356 52862 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
8357 52862 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
8358 52862 : if(e) goto fail;
8359 52862 : p += l; len -= l; ret += l;
8360 52862 : Top_oldlen = len;
8361 52862 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
8362 52862 : len = Top_datalen;
8363 : {
8364 : size_t key_datalen, key_oldlen;
8365 : Der_type key_type;
8366 52862 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &key_type, 0, &key_datalen, &l);
8367 52862 : if (e == 0 && key_type != CONS) { e = ASN1_BAD_ID; }
8368 52862 : if(e) goto fail;
8369 52862 : p += l; len -= l; ret += l;
8370 52862 : key_oldlen = len;
8371 52862 : if (key_datalen > len) { e = ASN1_OVERRUN; goto fail; }
8372 52862 : len = key_datalen;
8373 52862 : e = decode_EncryptionKey(p, len, &(data)->key, &l);
8374 52862 : if(e) goto fail;
8375 52862 : p += l; len -= l; ret += l;
8376 52862 : len = key_oldlen - key_datalen;
8377 : }
8378 : {
8379 : size_t last_req_datalen, last_req_oldlen;
8380 : Der_type last_req_type;
8381 52862 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &last_req_type, 1, &last_req_datalen, &l);
8382 104340 : if (e == 0 && last_req_type != CONS) { e = ASN1_BAD_ID; }
8383 52862 : if(e) goto fail;
8384 52862 : p += l; len -= l; ret += l;
8385 52862 : last_req_oldlen = len;
8386 52862 : if (last_req_datalen > len) { e = ASN1_OVERRUN; goto fail; }
8387 52862 : len = last_req_datalen;
8388 52862 : e = decode_LastReq(p, len, &(data)->last_req, &l);
8389 52862 : if(e) goto fail;
8390 52862 : p += l; len -= l; ret += l;
8391 52862 : len = last_req_oldlen - last_req_datalen;
8392 : }
8393 : {
8394 : size_t nonce_datalen, nonce_oldlen;
8395 : Der_type nonce_type;
8396 52862 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &nonce_type, 2, &nonce_datalen, &l);
8397 104340 : if (e == 0 && nonce_type != CONS) { e = ASN1_BAD_ID; }
8398 52862 : if(e) goto fail;
8399 52862 : p += l; len -= l; ret += l;
8400 52862 : nonce_oldlen = len;
8401 52862 : if (nonce_datalen > len) { e = ASN1_OVERRUN; goto fail; }
8402 52862 : len = nonce_datalen;
8403 52862 : e = decode_krb5int32(p, len, &(data)->nonce, &l);
8404 52862 : if(e) goto fail;
8405 52862 : p += l; len -= l; ret += l;
8406 52862 : len = nonce_oldlen - nonce_datalen;
8407 : }
8408 : {
8409 : size_t key_expiration_datalen, key_expiration_oldlen;
8410 : Der_type key_expiration_type;
8411 52862 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &key_expiration_type, 3, &key_expiration_datalen, &l);
8412 62986 : if (e == 0 && key_expiration_type != CONS) { e = ASN1_BAD_ID; }
8413 52862 : if(e) {
8414 42525 : (data)->key_expiration = NULL;
8415 : } else {
8416 10337 : (data)->key_expiration = calloc(1, sizeof(*(data)->key_expiration));
8417 10337 : if ((data)->key_expiration == NULL) { e = ENOMEM; goto fail; }
8418 10337 : p += l; len -= l; ret += l;
8419 10337 : key_expiration_oldlen = len;
8420 10337 : if (key_expiration_datalen > len) { e = ASN1_OVERRUN; goto fail; }
8421 10337 : len = key_expiration_datalen;
8422 10337 : e = decode_KerberosTime(p, len, (data)->key_expiration, &l);
8423 10337 : if(e) goto fail;
8424 10337 : p += l; len -= l; ret += l;
8425 10337 : len = key_expiration_oldlen - key_expiration_datalen;
8426 : }
8427 : }
8428 : {
8429 : size_t flags_datalen, flags_oldlen;
8430 : Der_type flags_type;
8431 52862 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &flags_type, 4, &flags_datalen, &l);
8432 105724 : if (e == 0 && flags_type != CONS) { e = ASN1_BAD_ID; }
8433 52862 : if(e) goto fail;
8434 52862 : p += l; len -= l; ret += l;
8435 52862 : flags_oldlen = len;
8436 52862 : if (flags_datalen > len) { e = ASN1_OVERRUN; goto fail; }
8437 52862 : len = flags_datalen;
8438 52862 : e = decode_TicketFlags(p, len, &(data)->flags, &l);
8439 52862 : if(e) goto fail;
8440 52862 : p += l; len -= l; ret += l;
8441 52862 : len = flags_oldlen - flags_datalen;
8442 : }
8443 : {
8444 : size_t authtime_datalen, authtime_oldlen;
8445 : Der_type authtime_type;
8446 52862 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &authtime_type, 5, &authtime_datalen, &l);
8447 104340 : if (e == 0 && authtime_type != CONS) { e = ASN1_BAD_ID; }
8448 52862 : if(e) goto fail;
8449 52862 : p += l; len -= l; ret += l;
8450 52862 : authtime_oldlen = len;
8451 52862 : if (authtime_datalen > len) { e = ASN1_OVERRUN; goto fail; }
8452 52862 : len = authtime_datalen;
8453 52862 : e = decode_KerberosTime(p, len, &(data)->authtime, &l);
8454 52862 : if(e) goto fail;
8455 52862 : p += l; len -= l; ret += l;
8456 52862 : len = authtime_oldlen - authtime_datalen;
8457 : }
8458 : {
8459 : size_t starttime_datalen, starttime_oldlen;
8460 : Der_type starttime_type;
8461 52862 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &starttime_type, 6, &starttime_datalen, &l);
8462 91261 : if (e == 0 && starttime_type != CONS) { e = ASN1_BAD_ID; }
8463 52862 : if(e) {
8464 13374 : (data)->starttime = NULL;
8465 : } else {
8466 39488 : (data)->starttime = calloc(1, sizeof(*(data)->starttime));
8467 39488 : if ((data)->starttime == NULL) { e = ENOMEM; goto fail; }
8468 39488 : p += l; len -= l; ret += l;
8469 39488 : starttime_oldlen = len;
8470 39488 : if (starttime_datalen > len) { e = ASN1_OVERRUN; goto fail; }
8471 39488 : len = starttime_datalen;
8472 39488 : e = decode_KerberosTime(p, len, (data)->starttime, &l);
8473 39488 : if(e) goto fail;
8474 39488 : p += l; len -= l; ret += l;
8475 39488 : len = starttime_oldlen - starttime_datalen;
8476 : }
8477 : }
8478 : {
8479 : size_t endtime_datalen, endtime_oldlen;
8480 : Der_type endtime_type;
8481 52862 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &endtime_type, 7, &endtime_datalen, &l);
8482 105724 : if (e == 0 && endtime_type != CONS) { e = ASN1_BAD_ID; }
8483 52862 : if(e) goto fail;
8484 52862 : p += l; len -= l; ret += l;
8485 52862 : endtime_oldlen = len;
8486 52862 : if (endtime_datalen > len) { e = ASN1_OVERRUN; goto fail; }
8487 52862 : len = endtime_datalen;
8488 52862 : e = decode_KerberosTime(p, len, &(data)->endtime, &l);
8489 52862 : if(e) goto fail;
8490 52862 : p += l; len -= l; ret += l;
8491 52862 : len = endtime_oldlen - endtime_datalen;
8492 : }
8493 : {
8494 : size_t renew_till_datalen, renew_till_oldlen;
8495 : Der_type renew_till_type;
8496 52862 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &renew_till_type, 8, &renew_till_datalen, &l);
8497 52927 : if (e == 0 && renew_till_type != CONS) { e = ASN1_BAD_ID; }
8498 52862 : if(e) {
8499 52797 : (data)->renew_till = NULL;
8500 : } else {
8501 65 : (data)->renew_till = calloc(1, sizeof(*(data)->renew_till));
8502 65 : if ((data)->renew_till == NULL) { e = ENOMEM; goto fail; }
8503 65 : p += l; len -= l; ret += l;
8504 65 : renew_till_oldlen = len;
8505 65 : if (renew_till_datalen > len) { e = ASN1_OVERRUN; goto fail; }
8506 65 : len = renew_till_datalen;
8507 65 : e = decode_KerberosTime(p, len, (data)->renew_till, &l);
8508 65 : if(e) goto fail;
8509 65 : p += l; len -= l; ret += l;
8510 65 : len = renew_till_oldlen - renew_till_datalen;
8511 : }
8512 : }
8513 : {
8514 : size_t srealm_datalen, srealm_oldlen;
8515 : Der_type srealm_type;
8516 52862 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &srealm_type, 9, &srealm_datalen, &l);
8517 105724 : if (e == 0 && srealm_type != CONS) { e = ASN1_BAD_ID; }
8518 52862 : if(e) goto fail;
8519 52862 : p += l; len -= l; ret += l;
8520 52862 : srealm_oldlen = len;
8521 52862 : if (srealm_datalen > len) { e = ASN1_OVERRUN; goto fail; }
8522 52862 : len = srealm_datalen;
8523 52862 : e = decode_Realm(p, len, &(data)->srealm, &l);
8524 52862 : if(e) goto fail;
8525 52862 : p += l; len -= l; ret += l;
8526 52862 : len = srealm_oldlen - srealm_datalen;
8527 : }
8528 : {
8529 : size_t sname_datalen, sname_oldlen;
8530 : Der_type sname_type;
8531 52862 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &sname_type, 10, &sname_datalen, &l);
8532 104340 : if (e == 0 && sname_type != CONS) { e = ASN1_BAD_ID; }
8533 52862 : if(e) goto fail;
8534 52862 : p += l; len -= l; ret += l;
8535 52862 : sname_oldlen = len;
8536 52862 : if (sname_datalen > len) { e = ASN1_OVERRUN; goto fail; }
8537 52862 : len = sname_datalen;
8538 52862 : e = decode_PrincipalName(p, len, &(data)->sname, &l);
8539 52862 : if(e) goto fail;
8540 52862 : p += l; len -= l; ret += l;
8541 52862 : len = sname_oldlen - sname_datalen;
8542 : }
8543 : {
8544 : size_t caddr_datalen, caddr_oldlen;
8545 : Der_type caddr_type;
8546 52862 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &caddr_type, 11, &caddr_datalen, &l);
8547 52865 : if (e == 0 && caddr_type != CONS) { e = ASN1_BAD_ID; }
8548 52862 : if(e) {
8549 52859 : (data)->caddr = NULL;
8550 : } else {
8551 3 : (data)->caddr = calloc(1, sizeof(*(data)->caddr));
8552 3 : if ((data)->caddr == NULL) { e = ENOMEM; goto fail; }
8553 3 : p += l; len -= l; ret += l;
8554 3 : caddr_oldlen = len;
8555 3 : if (caddr_datalen > len) { e = ASN1_OVERRUN; goto fail; }
8556 3 : len = caddr_datalen;
8557 3 : e = decode_HostAddresses(p, len, (data)->caddr, &l);
8558 3 : if(e) goto fail;
8559 3 : p += l; len -= l; ret += l;
8560 3 : len = caddr_oldlen - caddr_datalen;
8561 : }
8562 : }
8563 : {
8564 : size_t encrypted_pa_data_datalen, encrypted_pa_data_oldlen;
8565 : Der_type encrypted_pa_data_type;
8566 52862 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &encrypted_pa_data_type, 12, &encrypted_pa_data_datalen, &l);
8567 52862 : if (e == 0 && encrypted_pa_data_type != CONS) { e = ASN1_BAD_ID; }
8568 52862 : if(e) {
8569 52862 : (data)->encrypted_pa_data = NULL;
8570 : } else {
8571 0 : (data)->encrypted_pa_data = calloc(1, sizeof(*(data)->encrypted_pa_data));
8572 0 : if ((data)->encrypted_pa_data == NULL) { e = ENOMEM; goto fail; }
8573 0 : p += l; len -= l; ret += l;
8574 0 : encrypted_pa_data_oldlen = len;
8575 0 : if (encrypted_pa_data_datalen > len) { e = ASN1_OVERRUN; goto fail; }
8576 0 : len = encrypted_pa_data_datalen;
8577 0 : e = decode_METHOD_DATA(p, len, (data)->encrypted_pa_data, &l);
8578 0 : if(e) goto fail;
8579 0 : p += l; len -= l; ret += l;
8580 0 : len = encrypted_pa_data_oldlen - encrypted_pa_data_datalen;
8581 : }
8582 : }
8583 52862 : len = Top_oldlen - Top_datalen;
8584 : }
8585 105724 : if(size) *size = ret;
8586 51478 : return 0;
8587 0 : fail:
8588 0 : free_EncKDCRepPart(data);
8589 0 : return e;
8590 : }
8591 :
8592 : void ASN1CALL
8593 140175 : free_EncKDCRepPart(EncKDCRepPart *data)
8594 : {
8595 140175 : free_EncryptionKey(&(data)->key);
8596 140175 : free_LastReq(&(data)->last_req);
8597 140175 : free_krb5int32(&(data)->nonce);
8598 140175 : if((data)->key_expiration) {
8599 41541 : free_KerberosTime((data)->key_expiration);
8600 41541 : free((data)->key_expiration);
8601 41541 : (data)->key_expiration = NULL;
8602 : }
8603 140175 : free_TicketFlags(&(data)->flags);
8604 140175 : free_KerberosTime(&(data)->authtime);
8605 140175 : if((data)->starttime) {
8606 39488 : free_KerberosTime((data)->starttime);
8607 39488 : free((data)->starttime);
8608 39488 : (data)->starttime = NULL;
8609 : }
8610 140175 : free_KerberosTime(&(data)->endtime);
8611 140175 : if((data)->renew_till) {
8612 240 : free_KerberosTime((data)->renew_till);
8613 240 : free((data)->renew_till);
8614 240 : (data)->renew_till = NULL;
8615 : }
8616 140175 : free_Realm(&(data)->srealm);
8617 140175 : free_PrincipalName(&(data)->sname);
8618 140175 : if((data)->caddr) {
8619 104 : free_HostAddresses((data)->caddr);
8620 104 : free((data)->caddr);
8621 104 : (data)->caddr = NULL;
8622 : }
8623 140175 : if((data)->encrypted_pa_data) {
8624 0 : free_METHOD_DATA((data)->encrypted_pa_data);
8625 0 : free((data)->encrypted_pa_data);
8626 0 : (data)->encrypted_pa_data = NULL;
8627 : }
8628 140175 : }
8629 :
8630 : size_t ASN1CALL
8631 66016 : length_EncKDCRepPart(const EncKDCRepPart *data)
8632 : {
8633 66016 : size_t ret = 0;
8634 : {
8635 66016 : size_t Top_tag_oldret = ret;
8636 66016 : ret = 0;
8637 66016 : ret += length_EncryptionKey(&(data)->key);
8638 66016 : ret += 1 + der_length_len (ret);
8639 66016 : ret += Top_tag_oldret;
8640 : }
8641 : {
8642 66016 : size_t Top_tag_oldret = ret;
8643 66016 : ret = 0;
8644 66016 : ret += length_LastReq(&(data)->last_req);
8645 66016 : ret += 1 + der_length_len (ret);
8646 66016 : ret += Top_tag_oldret;
8647 : }
8648 : {
8649 66016 : size_t Top_tag_oldret = ret;
8650 66016 : ret = 0;
8651 66016 : ret += length_krb5int32(&(data)->nonce);
8652 66016 : ret += 1 + der_length_len (ret);
8653 66016 : ret += Top_tag_oldret;
8654 : }
8655 66016 : if((data)->key_expiration){
8656 20867 : size_t Top_tag_oldret = ret;
8657 20867 : ret = 0;
8658 20867 : ret += length_KerberosTime((data)->key_expiration);
8659 20867 : ret += 1 + der_length_len (ret);
8660 20867 : ret += Top_tag_oldret;
8661 : }
8662 : {
8663 66016 : size_t Top_tag_oldret = ret;
8664 66016 : ret = 0;
8665 66016 : ret += length_TicketFlags(&(data)->flags);
8666 66016 : ret += 1 + der_length_len (ret);
8667 66016 : ret += Top_tag_oldret;
8668 : }
8669 : {
8670 66016 : size_t Top_tag_oldret = ret;
8671 66016 : ret = 0;
8672 66016 : ret += length_KerberosTime(&(data)->authtime);
8673 66016 : ret += 1 + der_length_len (ret);
8674 66016 : ret += Top_tag_oldret;
8675 : }
8676 66016 : if((data)->starttime){
8677 39673 : size_t Top_tag_oldret = ret;
8678 39673 : ret = 0;
8679 39673 : ret += length_KerberosTime((data)->starttime);
8680 39673 : ret += 1 + der_length_len (ret);
8681 39673 : ret += Top_tag_oldret;
8682 : }
8683 : {
8684 66016 : size_t Top_tag_oldret = ret;
8685 66016 : ret = 0;
8686 66016 : ret += length_KerberosTime(&(data)->endtime);
8687 66016 : ret += 1 + der_length_len (ret);
8688 66016 : ret += Top_tag_oldret;
8689 : }
8690 66016 : if((data)->renew_till){
8691 170 : size_t Top_tag_oldret = ret;
8692 170 : ret = 0;
8693 170 : ret += length_KerberosTime((data)->renew_till);
8694 170 : ret += 1 + der_length_len (ret);
8695 170 : ret += Top_tag_oldret;
8696 : }
8697 : {
8698 66016 : size_t Top_tag_oldret = ret;
8699 66016 : ret = 0;
8700 66016 : ret += length_Realm(&(data)->srealm);
8701 66016 : ret += 1 + der_length_len (ret);
8702 66016 : ret += Top_tag_oldret;
8703 : }
8704 : {
8705 66016 : size_t Top_tag_oldret = ret;
8706 66016 : ret = 0;
8707 66016 : ret += length_PrincipalName(&(data)->sname);
8708 66016 : ret += 1 + der_length_len (ret);
8709 66016 : ret += Top_tag_oldret;
8710 : }
8711 66016 : if((data)->caddr){
8712 98 : size_t Top_tag_oldret = ret;
8713 98 : ret = 0;
8714 98 : ret += length_HostAddresses((data)->caddr);
8715 98 : ret += 1 + der_length_len (ret);
8716 98 : ret += Top_tag_oldret;
8717 : }
8718 66016 : if((data)->encrypted_pa_data){
8719 0 : size_t Top_tag_oldret = ret;
8720 0 : ret = 0;
8721 0 : ret += length_METHOD_DATA((data)->encrypted_pa_data);
8722 0 : ret += 1 + der_length_len (ret);
8723 0 : ret += Top_tag_oldret;
8724 : }
8725 66016 : ret += 1 + der_length_len (ret);
8726 66016 : return ret;
8727 : }
8728 :
8729 : int ASN1CALL
8730 13374 : copy_EncKDCRepPart(const EncKDCRepPart *from, EncKDCRepPart *to)
8731 : {
8732 13374 : memset(to, 0, sizeof(*to));
8733 13374 : if(copy_EncryptionKey(&(from)->key, &(to)->key)) goto fail;
8734 13374 : if(copy_LastReq(&(from)->last_req, &(to)->last_req)) goto fail;
8735 13374 : if(copy_krb5int32(&(from)->nonce, &(to)->nonce)) goto fail;
8736 13374 : if((from)->key_expiration) {
8737 10337 : (to)->key_expiration = malloc(sizeof(*(to)->key_expiration));
8738 10337 : if((to)->key_expiration == NULL) goto fail;
8739 10337 : if(copy_KerberosTime((from)->key_expiration, (to)->key_expiration)) goto fail;
8740 : }else
8741 3037 : (to)->key_expiration = NULL;
8742 13374 : if(copy_TicketFlags(&(from)->flags, &(to)->flags)) goto fail;
8743 13374 : if(copy_KerberosTime(&(from)->authtime, &(to)->authtime)) goto fail;
8744 13374 : if((from)->starttime) {
8745 0 : (to)->starttime = malloc(sizeof(*(to)->starttime));
8746 0 : if((to)->starttime == NULL) goto fail;
8747 0 : if(copy_KerberosTime((from)->starttime, (to)->starttime)) goto fail;
8748 : }else
8749 13374 : (to)->starttime = NULL;
8750 13374 : if(copy_KerberosTime(&(from)->endtime, &(to)->endtime)) goto fail;
8751 13374 : if((from)->renew_till) {
8752 35 : (to)->renew_till = malloc(sizeof(*(to)->renew_till));
8753 35 : if((to)->renew_till == NULL) goto fail;
8754 35 : if(copy_KerberosTime((from)->renew_till, (to)->renew_till)) goto fail;
8755 : }else
8756 13339 : (to)->renew_till = NULL;
8757 13374 : if(copy_Realm(&(from)->srealm, &(to)->srealm)) goto fail;
8758 13374 : if(copy_PrincipalName(&(from)->sname, &(to)->sname)) goto fail;
8759 13374 : if((from)->caddr) {
8760 3 : (to)->caddr = malloc(sizeof(*(to)->caddr));
8761 3 : if((to)->caddr == NULL) goto fail;
8762 3 : if(copy_HostAddresses((from)->caddr, (to)->caddr)) goto fail;
8763 : }else
8764 13371 : (to)->caddr = NULL;
8765 13374 : if((from)->encrypted_pa_data) {
8766 0 : (to)->encrypted_pa_data = malloc(sizeof(*(to)->encrypted_pa_data));
8767 0 : if((to)->encrypted_pa_data == NULL) goto fail;
8768 0 : if(copy_METHOD_DATA((from)->encrypted_pa_data, (to)->encrypted_pa_data)) goto fail;
8769 : }else
8770 13374 : (to)->encrypted_pa_data = NULL;
8771 13079 : return 0;
8772 0 : fail:
8773 0 : free_EncKDCRepPart(to);
8774 0 : return ENOMEM;
8775 : }
8776 :
8777 : int ASN1CALL
8778 26343 : encode_EncASRepPart(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const EncASRepPart *data, size_t *size)
8779 : {
8780 26343 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
8781 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
8782 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
8783 :
8784 26343 : e = encode_EncKDCRepPart(p, len, data, &l);
8785 26343 : if (e) return e;
8786 26343 : p -= l; len -= l; ret += l;
8787 :
8788 26343 : e = der_put_length_and_tag (p, len, ret, ASN1_C_APPL, CONS, 25, &l);
8789 26343 : if (e) return e;
8790 26343 : p -= l; len -= l; ret += l;
8791 :
8792 26343 : *size = ret;
8793 26343 : return 0;
8794 : }
8795 :
8796 : int ASN1CALL
8797 52862 : decode_EncASRepPart(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, EncASRepPart *data, size_t *size)
8798 : {
8799 52862 : size_t ret = 0;
8800 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
8801 : int e HEIMDAL_UNUSED_ATTRIBUTE;
8802 :
8803 52862 : memset(data, 0, sizeof(*data));
8804 : {
8805 : size_t Top_datalen, Top_oldlen;
8806 : Der_type Top_type;
8807 52862 : e = der_match_tag_and_length(p, len, ASN1_C_APPL, &Top_type, 25, &Top_datalen, &l);
8808 52862 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
8809 91261 : if(e) goto fail;
8810 13374 : p += l; len -= l; ret += l;
8811 13374 : Top_oldlen = len;
8812 13374 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
8813 13374 : len = Top_datalen;
8814 13374 : e = decode_EncKDCRepPart(p, len, data, &l);
8815 13374 : if(e) goto fail;
8816 13374 : p += l; len -= l; ret += l;
8817 13374 : len = Top_oldlen - Top_datalen;
8818 : }
8819 26748 : if(size) *size = ret;
8820 13079 : return 0;
8821 39488 : fail:
8822 39488 : free_EncASRepPart(data);
8823 39488 : return e;
8824 : }
8825 :
8826 : void ASN1CALL
8827 52862 : free_EncASRepPart(EncASRepPart *data)
8828 : {
8829 52862 : free_EncKDCRepPart(data);
8830 52862 : }
8831 :
8832 : size_t ASN1CALL
8833 26343 : length_EncASRepPart(const EncASRepPart *data)
8834 : {
8835 26343 : size_t ret = 0;
8836 26343 : ret += length_EncKDCRepPart(data);
8837 26343 : ret += 1 + der_length_len (ret);
8838 26343 : return ret;
8839 : }
8840 :
8841 : int ASN1CALL
8842 0 : copy_EncASRepPart(const EncASRepPart *from, EncASRepPart *to)
8843 : {
8844 0 : memset(to, 0, sizeof(*to));
8845 0 : if(copy_EncKDCRepPart(from, to)) goto fail;
8846 0 : return 0;
8847 0 : fail:
8848 0 : free_EncASRepPart(to);
8849 0 : return ENOMEM;
8850 : }
8851 :
8852 : int ASN1CALL
8853 39673 : encode_EncTGSRepPart(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const EncTGSRepPart *data, size_t *size)
8854 : {
8855 39673 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
8856 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
8857 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
8858 :
8859 39673 : e = encode_EncKDCRepPart(p, len, data, &l);
8860 39673 : if (e) return e;
8861 39673 : p -= l; len -= l; ret += l;
8862 :
8863 39673 : e = der_put_length_and_tag (p, len, ret, ASN1_C_APPL, CONS, 26, &l);
8864 39673 : if (e) return e;
8865 39673 : p -= l; len -= l; ret += l;
8866 :
8867 39673 : *size = ret;
8868 39673 : return 0;
8869 : }
8870 :
8871 : int ASN1CALL
8872 39488 : decode_EncTGSRepPart(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, EncTGSRepPart *data, size_t *size)
8873 : {
8874 39488 : size_t ret = 0;
8875 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
8876 : int e HEIMDAL_UNUSED_ATTRIBUTE;
8877 :
8878 39488 : memset(data, 0, sizeof(*data));
8879 : {
8880 : size_t Top_datalen, Top_oldlen;
8881 : Der_type Top_type;
8882 39488 : e = der_match_tag_and_length(p, len, ASN1_C_APPL, &Top_type, 26, &Top_datalen, &l);
8883 39488 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
8884 39488 : if(e) goto fail;
8885 39488 : p += l; len -= l; ret += l;
8886 39488 : Top_oldlen = len;
8887 39488 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
8888 39488 : len = Top_datalen;
8889 39488 : e = decode_EncKDCRepPart(p, len, data, &l);
8890 39488 : if(e) goto fail;
8891 39488 : p += l; len -= l; ret += l;
8892 39488 : len = Top_oldlen - Top_datalen;
8893 : }
8894 78976 : if(size) *size = ret;
8895 38399 : return 0;
8896 0 : fail:
8897 0 : free_EncTGSRepPart(data);
8898 0 : return e;
8899 : }
8900 :
8901 : void ASN1CALL
8902 39488 : free_EncTGSRepPart(EncTGSRepPart *data)
8903 : {
8904 39488 : free_EncKDCRepPart(data);
8905 39488 : }
8906 :
8907 : size_t ASN1CALL
8908 39673 : length_EncTGSRepPart(const EncTGSRepPart *data)
8909 : {
8910 39673 : size_t ret = 0;
8911 39673 : ret += length_EncKDCRepPart(data);
8912 39673 : ret += 1 + der_length_len (ret);
8913 39673 : return ret;
8914 : }
8915 :
8916 : int ASN1CALL
8917 0 : copy_EncTGSRepPart(const EncTGSRepPart *from, EncTGSRepPart *to)
8918 : {
8919 0 : memset(to, 0, sizeof(*to));
8920 0 : if(copy_EncKDCRepPart(from, to)) goto fail;
8921 0 : return 0;
8922 0 : fail:
8923 0 : free_EncTGSRepPart(to);
8924 0 : return ENOMEM;
8925 : }
8926 :
8927 : int ASN1CALL
8928 68110 : encode_AP_REQ(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const AP_REQ *data, size_t *size)
8929 : {
8930 68110 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
8931 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
8932 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
8933 :
8934 : /* authenticator */
8935 : {
8936 68110 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
8937 68110 : ret = 0;
8938 68110 : e = encode_EncryptedData(p, len, &(data)->authenticator, &l);
8939 68110 : if (e) return e;
8940 68110 : p -= l; len -= l; ret += l;
8941 :
8942 68110 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 4, &l);
8943 68110 : if (e) return e;
8944 68110 : p -= l; len -= l; ret += l;
8945 :
8946 68110 : ret += Top_tag_tag_oldret;
8947 : }
8948 : /* ticket */
8949 : {
8950 68110 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
8951 68110 : ret = 0;
8952 68110 : e = encode_Ticket(p, len, &(data)->ticket, &l);
8953 68110 : if (e) return e;
8954 68110 : p -= l; len -= l; ret += l;
8955 :
8956 68110 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 3, &l);
8957 68110 : if (e) return e;
8958 68110 : p -= l; len -= l; ret += l;
8959 :
8960 68110 : ret += Top_tag_tag_oldret;
8961 : }
8962 : /* ap-options */
8963 : {
8964 68110 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
8965 68110 : ret = 0;
8966 68110 : e = encode_APOptions(p, len, &(data)->ap_options, &l);
8967 68110 : if (e) return e;
8968 68110 : p -= l; len -= l; ret += l;
8969 :
8970 68110 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
8971 68110 : if (e) return e;
8972 68110 : p -= l; len -= l; ret += l;
8973 :
8974 68110 : ret += Top_tag_tag_oldret;
8975 : }
8976 : /* msg-type */
8977 : {
8978 68110 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
8979 68110 : ret = 0;
8980 68110 : e = encode_MESSAGE_TYPE(p, len, &(data)->msg_type, &l);
8981 68110 : if (e) return e;
8982 68110 : p -= l; len -= l; ret += l;
8983 :
8984 68110 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
8985 68110 : if (e) return e;
8986 68110 : p -= l; len -= l; ret += l;
8987 :
8988 68110 : ret += Top_tag_tag_oldret;
8989 : }
8990 : /* pvno */
8991 : {
8992 68110 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
8993 68110 : ret = 0;
8994 68110 : e = encode_krb5int32(p, len, &(data)->pvno, &l);
8995 68110 : if (e) return e;
8996 68110 : p -= l; len -= l; ret += l;
8997 :
8998 68110 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
8999 68110 : if (e) return e;
9000 68110 : p -= l; len -= l; ret += l;
9001 :
9002 68110 : ret += Top_tag_tag_oldret;
9003 : }
9004 68110 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
9005 68110 : if (e) return e;
9006 68110 : p -= l; len -= l; ret += l;
9007 :
9008 68110 : e = der_put_length_and_tag (p, len, ret, ASN1_C_APPL, CONS, 14, &l);
9009 68110 : if (e) return e;
9010 68110 : p -= l; len -= l; ret += l;
9011 :
9012 68110 : *size = ret;
9013 68110 : return 0;
9014 : }
9015 :
9016 : int ASN1CALL
9017 63408 : decode_AP_REQ(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, AP_REQ *data, size_t *size)
9018 : {
9019 63408 : size_t ret = 0;
9020 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
9021 : int e HEIMDAL_UNUSED_ATTRIBUTE;
9022 :
9023 63408 : memset(data, 0, sizeof(*data));
9024 : {
9025 : size_t Top_datalen, Top_oldlen;
9026 : Der_type Top_type;
9027 63408 : e = der_match_tag_and_length(p, len, ASN1_C_APPL, &Top_type, 14, &Top_datalen, &l);
9028 63408 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
9029 63408 : if(e) goto fail;
9030 63408 : p += l; len -= l; ret += l;
9031 63408 : Top_oldlen = len;
9032 63408 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
9033 63408 : len = Top_datalen;
9034 : {
9035 : size_t Top_Tag_datalen, Top_Tag_oldlen;
9036 : Der_type Top_Tag_type;
9037 63408 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_Tag_type, UT_Sequence, &Top_Tag_datalen, &l);
9038 63408 : if (e == 0 && Top_Tag_type != CONS) { e = ASN1_BAD_ID; }
9039 63408 : if(e) goto fail;
9040 63408 : p += l; len -= l; ret += l;
9041 63408 : Top_Tag_oldlen = len;
9042 63408 : if (Top_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
9043 63408 : len = Top_Tag_datalen;
9044 : {
9045 : size_t pvno_datalen, pvno_oldlen;
9046 : Der_type pvno_type;
9047 63408 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &pvno_type, 0, &pvno_datalen, &l);
9048 63408 : if (e == 0 && pvno_type != CONS) { e = ASN1_BAD_ID; }
9049 63408 : if(e) goto fail;
9050 63408 : p += l; len -= l; ret += l;
9051 63408 : pvno_oldlen = len;
9052 63408 : if (pvno_datalen > len) { e = ASN1_OVERRUN; goto fail; }
9053 63408 : len = pvno_datalen;
9054 63408 : e = decode_krb5int32(p, len, &(data)->pvno, &l);
9055 63408 : if(e) goto fail;
9056 63408 : p += l; len -= l; ret += l;
9057 63408 : len = pvno_oldlen - pvno_datalen;
9058 : }
9059 : {
9060 : size_t msg_type_datalen, msg_type_oldlen;
9061 : Der_type msg_type_type;
9062 63408 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &msg_type_type, 1, &msg_type_datalen, &l);
9063 124989 : if (e == 0 && msg_type_type != CONS) { e = ASN1_BAD_ID; }
9064 63408 : if(e) goto fail;
9065 63408 : p += l; len -= l; ret += l;
9066 63408 : msg_type_oldlen = len;
9067 63408 : if (msg_type_datalen > len) { e = ASN1_OVERRUN; goto fail; }
9068 63408 : len = msg_type_datalen;
9069 63408 : e = decode_MESSAGE_TYPE(p, len, &(data)->msg_type, &l);
9070 63408 : if(e) goto fail;
9071 63408 : p += l; len -= l; ret += l;
9072 63408 : len = msg_type_oldlen - msg_type_datalen;
9073 : }
9074 : {
9075 : size_t ap_options_datalen, ap_options_oldlen;
9076 : Der_type ap_options_type;
9077 63408 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &ap_options_type, 2, &ap_options_datalen, &l);
9078 124989 : if (e == 0 && ap_options_type != CONS) { e = ASN1_BAD_ID; }
9079 63408 : if(e) goto fail;
9080 63408 : p += l; len -= l; ret += l;
9081 63408 : ap_options_oldlen = len;
9082 63408 : if (ap_options_datalen > len) { e = ASN1_OVERRUN; goto fail; }
9083 63408 : len = ap_options_datalen;
9084 63408 : e = decode_APOptions(p, len, &(data)->ap_options, &l);
9085 63408 : if(e) goto fail;
9086 63408 : p += l; len -= l; ret += l;
9087 63408 : len = ap_options_oldlen - ap_options_datalen;
9088 : }
9089 : {
9090 : size_t ticket_datalen, ticket_oldlen;
9091 : Der_type ticket_type;
9092 63408 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &ticket_type, 3, &ticket_datalen, &l);
9093 124989 : if (e == 0 && ticket_type != CONS) { e = ASN1_BAD_ID; }
9094 63408 : if(e) goto fail;
9095 63408 : p += l; len -= l; ret += l;
9096 63408 : ticket_oldlen = len;
9097 63408 : if (ticket_datalen > len) { e = ASN1_OVERRUN; goto fail; }
9098 63408 : len = ticket_datalen;
9099 63408 : e = decode_Ticket(p, len, &(data)->ticket, &l);
9100 63408 : if(e) goto fail;
9101 63408 : p += l; len -= l; ret += l;
9102 63408 : len = ticket_oldlen - ticket_datalen;
9103 : }
9104 : {
9105 : size_t authenticator_datalen, authenticator_oldlen;
9106 : Der_type authenticator_type;
9107 63408 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &authenticator_type, 4, &authenticator_datalen, &l);
9108 124989 : if (e == 0 && authenticator_type != CONS) { e = ASN1_BAD_ID; }
9109 63408 : if(e) goto fail;
9110 63408 : p += l; len -= l; ret += l;
9111 63408 : authenticator_oldlen = len;
9112 63408 : if (authenticator_datalen > len) { e = ASN1_OVERRUN; goto fail; }
9113 63408 : len = authenticator_datalen;
9114 63408 : e = decode_EncryptedData(p, len, &(data)->authenticator, &l);
9115 63408 : if(e) goto fail;
9116 63408 : p += l; len -= l; ret += l;
9117 63408 : len = authenticator_oldlen - authenticator_datalen;
9118 : }
9119 63408 : len = Top_Tag_oldlen - Top_Tag_datalen;
9120 : }
9121 63408 : len = Top_oldlen - Top_datalen;
9122 : }
9123 126816 : if(size) *size = ret;
9124 61581 : return 0;
9125 0 : fail:
9126 0 : free_AP_REQ(data);
9127 0 : return e;
9128 : }
9129 :
9130 : void ASN1CALL
9131 131518 : free_AP_REQ(AP_REQ *data)
9132 : {
9133 131518 : free_krb5int32(&(data)->pvno);
9134 131518 : free_MESSAGE_TYPE(&(data)->msg_type);
9135 131518 : free_APOptions(&(data)->ap_options);
9136 131518 : free_Ticket(&(data)->ticket);
9137 131518 : free_EncryptedData(&(data)->authenticator);
9138 131518 : }
9139 :
9140 : size_t ASN1CALL
9141 68110 : length_AP_REQ(const AP_REQ *data)
9142 : {
9143 68110 : size_t ret = 0;
9144 : {
9145 68110 : size_t Top_tag_tag_oldret = ret;
9146 68110 : ret = 0;
9147 68110 : ret += length_krb5int32(&(data)->pvno);
9148 68110 : ret += 1 + der_length_len (ret);
9149 68110 : ret += Top_tag_tag_oldret;
9150 : }
9151 : {
9152 68110 : size_t Top_tag_tag_oldret = ret;
9153 68110 : ret = 0;
9154 68110 : ret += length_MESSAGE_TYPE(&(data)->msg_type);
9155 68110 : ret += 1 + der_length_len (ret);
9156 68110 : ret += Top_tag_tag_oldret;
9157 : }
9158 : {
9159 68110 : size_t Top_tag_tag_oldret = ret;
9160 68110 : ret = 0;
9161 68110 : ret += length_APOptions(&(data)->ap_options);
9162 68110 : ret += 1 + der_length_len (ret);
9163 68110 : ret += Top_tag_tag_oldret;
9164 : }
9165 : {
9166 68110 : size_t Top_tag_tag_oldret = ret;
9167 68110 : ret = 0;
9168 68110 : ret += length_Ticket(&(data)->ticket);
9169 68110 : ret += 1 + der_length_len (ret);
9170 68110 : ret += Top_tag_tag_oldret;
9171 : }
9172 : {
9173 68110 : size_t Top_tag_tag_oldret = ret;
9174 68110 : ret = 0;
9175 68110 : ret += length_EncryptedData(&(data)->authenticator);
9176 68110 : ret += 1 + der_length_len (ret);
9177 68110 : ret += Top_tag_tag_oldret;
9178 : }
9179 68110 : ret += 1 + der_length_len (ret);
9180 68110 : ret += 1 + der_length_len (ret);
9181 68110 : return ret;
9182 : }
9183 :
9184 : int ASN1CALL
9185 0 : copy_AP_REQ(const AP_REQ *from, AP_REQ *to)
9186 : {
9187 0 : memset(to, 0, sizeof(*to));
9188 0 : if(copy_krb5int32(&(from)->pvno, &(to)->pvno)) goto fail;
9189 0 : if(copy_MESSAGE_TYPE(&(from)->msg_type, &(to)->msg_type)) goto fail;
9190 0 : if(copy_APOptions(&(from)->ap_options, &(to)->ap_options)) goto fail;
9191 0 : if(copy_Ticket(&(from)->ticket, &(to)->ticket)) goto fail;
9192 0 : if(copy_EncryptedData(&(from)->authenticator, &(to)->authenticator)) goto fail;
9193 0 : return 0;
9194 0 : fail:
9195 0 : free_AP_REQ(to);
9196 0 : return ENOMEM;
9197 : }
9198 :
9199 : int ASN1CALL
9200 24843 : encode_AP_REP(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const AP_REP *data, size_t *size)
9201 : {
9202 24843 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
9203 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
9204 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
9205 :
9206 : /* enc-part */
9207 : {
9208 24843 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
9209 24843 : ret = 0;
9210 24843 : e = encode_EncryptedData(p, len, &(data)->enc_part, &l);
9211 24843 : if (e) return e;
9212 24843 : p -= l; len -= l; ret += l;
9213 :
9214 24843 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
9215 24843 : if (e) return e;
9216 24843 : p -= l; len -= l; ret += l;
9217 :
9218 24843 : ret += Top_tag_tag_oldret;
9219 : }
9220 : /* msg-type */
9221 : {
9222 24843 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
9223 24843 : ret = 0;
9224 24843 : e = encode_MESSAGE_TYPE(p, len, &(data)->msg_type, &l);
9225 24843 : if (e) return e;
9226 24843 : p -= l; len -= l; ret += l;
9227 :
9228 24843 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
9229 24843 : if (e) return e;
9230 24843 : p -= l; len -= l; ret += l;
9231 :
9232 24843 : ret += Top_tag_tag_oldret;
9233 : }
9234 : /* pvno */
9235 : {
9236 24843 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
9237 24843 : ret = 0;
9238 24843 : e = encode_krb5int32(p, len, &(data)->pvno, &l);
9239 24843 : if (e) return e;
9240 24843 : p -= l; len -= l; ret += l;
9241 :
9242 24843 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
9243 24843 : if (e) return e;
9244 24843 : p -= l; len -= l; ret += l;
9245 :
9246 24843 : ret += Top_tag_tag_oldret;
9247 : }
9248 24843 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
9249 24843 : if (e) return e;
9250 24843 : p -= l; len -= l; ret += l;
9251 :
9252 24843 : e = der_put_length_and_tag (p, len, ret, ASN1_C_APPL, CONS, 15, &l);
9253 24843 : if (e) return e;
9254 24843 : p -= l; len -= l; ret += l;
9255 :
9256 24843 : *size = ret;
9257 24843 : return 0;
9258 : }
9259 :
9260 : int ASN1CALL
9261 23112 : decode_AP_REP(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, AP_REP *data, size_t *size)
9262 : {
9263 23112 : size_t ret = 0;
9264 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
9265 : int e HEIMDAL_UNUSED_ATTRIBUTE;
9266 :
9267 23112 : memset(data, 0, sizeof(*data));
9268 : {
9269 : size_t Top_datalen, Top_oldlen;
9270 : Der_type Top_type;
9271 23112 : e = der_match_tag_and_length(p, len, ASN1_C_APPL, &Top_type, 15, &Top_datalen, &l);
9272 23112 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
9273 23112 : if(e) goto fail;
9274 23112 : p += l; len -= l; ret += l;
9275 23112 : Top_oldlen = len;
9276 23112 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
9277 23112 : len = Top_datalen;
9278 : {
9279 : size_t Top_Tag_datalen, Top_Tag_oldlen;
9280 : Der_type Top_Tag_type;
9281 23112 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_Tag_type, UT_Sequence, &Top_Tag_datalen, &l);
9282 23112 : if (e == 0 && Top_Tag_type != CONS) { e = ASN1_BAD_ID; }
9283 23112 : if(e) goto fail;
9284 23112 : p += l; len -= l; ret += l;
9285 23112 : Top_Tag_oldlen = len;
9286 23112 : if (Top_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
9287 23112 : len = Top_Tag_datalen;
9288 : {
9289 : size_t pvno_datalen, pvno_oldlen;
9290 : Der_type pvno_type;
9291 23112 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &pvno_type, 0, &pvno_datalen, &l);
9292 23112 : if (e == 0 && pvno_type != CONS) { e = ASN1_BAD_ID; }
9293 23112 : if(e) goto fail;
9294 23112 : p += l; len -= l; ret += l;
9295 23112 : pvno_oldlen = len;
9296 23112 : if (pvno_datalen > len) { e = ASN1_OVERRUN; goto fail; }
9297 23112 : len = pvno_datalen;
9298 23112 : e = decode_krb5int32(p, len, &(data)->pvno, &l);
9299 23112 : if(e) goto fail;
9300 23112 : p += l; len -= l; ret += l;
9301 23112 : len = pvno_oldlen - pvno_datalen;
9302 : }
9303 : {
9304 : size_t msg_type_datalen, msg_type_oldlen;
9305 : Der_type msg_type_type;
9306 23112 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &msg_type_type, 1, &msg_type_datalen, &l);
9307 45390 : if (e == 0 && msg_type_type != CONS) { e = ASN1_BAD_ID; }
9308 23112 : if(e) goto fail;
9309 23112 : p += l; len -= l; ret += l;
9310 23112 : msg_type_oldlen = len;
9311 23112 : if (msg_type_datalen > len) { e = ASN1_OVERRUN; goto fail; }
9312 23112 : len = msg_type_datalen;
9313 23112 : e = decode_MESSAGE_TYPE(p, len, &(data)->msg_type, &l);
9314 23112 : if(e) goto fail;
9315 23112 : p += l; len -= l; ret += l;
9316 23112 : len = msg_type_oldlen - msg_type_datalen;
9317 : }
9318 : {
9319 : size_t enc_part_datalen, enc_part_oldlen;
9320 : Der_type enc_part_type;
9321 23112 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &enc_part_type, 2, &enc_part_datalen, &l);
9322 45390 : if (e == 0 && enc_part_type != CONS) { e = ASN1_BAD_ID; }
9323 23112 : if(e) goto fail;
9324 23112 : p += l; len -= l; ret += l;
9325 23112 : enc_part_oldlen = len;
9326 23112 : if (enc_part_datalen > len) { e = ASN1_OVERRUN; goto fail; }
9327 23112 : len = enc_part_datalen;
9328 23112 : e = decode_EncryptedData(p, len, &(data)->enc_part, &l);
9329 23112 : if(e) goto fail;
9330 23112 : p += l; len -= l; ret += l;
9331 23112 : len = enc_part_oldlen - enc_part_datalen;
9332 : }
9333 23112 : len = Top_Tag_oldlen - Top_Tag_datalen;
9334 : }
9335 23112 : len = Top_oldlen - Top_datalen;
9336 : }
9337 46224 : if(size) *size = ret;
9338 22278 : return 0;
9339 0 : fail:
9340 0 : free_AP_REP(data);
9341 0 : return e;
9342 : }
9343 :
9344 : void ASN1CALL
9345 47955 : free_AP_REP(AP_REP *data)
9346 : {
9347 47955 : free_krb5int32(&(data)->pvno);
9348 47955 : free_MESSAGE_TYPE(&(data)->msg_type);
9349 47955 : free_EncryptedData(&(data)->enc_part);
9350 47955 : }
9351 :
9352 : size_t ASN1CALL
9353 24843 : length_AP_REP(const AP_REP *data)
9354 : {
9355 24843 : size_t ret = 0;
9356 : {
9357 24843 : size_t Top_tag_tag_oldret = ret;
9358 24843 : ret = 0;
9359 24843 : ret += length_krb5int32(&(data)->pvno);
9360 24843 : ret += 1 + der_length_len (ret);
9361 24843 : ret += Top_tag_tag_oldret;
9362 : }
9363 : {
9364 24843 : size_t Top_tag_tag_oldret = ret;
9365 24843 : ret = 0;
9366 24843 : ret += length_MESSAGE_TYPE(&(data)->msg_type);
9367 24843 : ret += 1 + der_length_len (ret);
9368 24843 : ret += Top_tag_tag_oldret;
9369 : }
9370 : {
9371 24843 : size_t Top_tag_tag_oldret = ret;
9372 24843 : ret = 0;
9373 24843 : ret += length_EncryptedData(&(data)->enc_part);
9374 24843 : ret += 1 + der_length_len (ret);
9375 24843 : ret += Top_tag_tag_oldret;
9376 : }
9377 24843 : ret += 1 + der_length_len (ret);
9378 24843 : ret += 1 + der_length_len (ret);
9379 24843 : return ret;
9380 : }
9381 :
9382 : int ASN1CALL
9383 0 : copy_AP_REP(const AP_REP *from, AP_REP *to)
9384 : {
9385 0 : memset(to, 0, sizeof(*to));
9386 0 : if(copy_krb5int32(&(from)->pvno, &(to)->pvno)) goto fail;
9387 0 : if(copy_MESSAGE_TYPE(&(from)->msg_type, &(to)->msg_type)) goto fail;
9388 0 : if(copy_EncryptedData(&(from)->enc_part, &(to)->enc_part)) goto fail;
9389 0 : return 0;
9390 0 : fail:
9391 0 : free_AP_REP(to);
9392 0 : return ENOMEM;
9393 : }
9394 :
9395 : int ASN1CALL
9396 24843 : encode_EncAPRepPart(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const EncAPRepPart *data, size_t *size)
9397 : {
9398 24843 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
9399 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
9400 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
9401 :
9402 : /* seq-number */
9403 24843 : if((data)->seq_number) {
9404 24843 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
9405 24843 : ret = 0;
9406 24843 : e = encode_krb5uint32(p, len, (data)->seq_number, &l);
9407 24843 : if (e) return e;
9408 24843 : p -= l; len -= l; ret += l;
9409 :
9410 24843 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 3, &l);
9411 24843 : if (e) return e;
9412 24843 : p -= l; len -= l; ret += l;
9413 :
9414 24843 : ret += Top_tag_tag_oldret;
9415 : }
9416 : /* subkey */
9417 24843 : if((data)->subkey) {
9418 19962 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
9419 19962 : ret = 0;
9420 19962 : e = encode_EncryptionKey(p, len, (data)->subkey, &l);
9421 19962 : if (e) return e;
9422 19962 : p -= l; len -= l; ret += l;
9423 :
9424 19962 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
9425 19962 : if (e) return e;
9426 19962 : p -= l; len -= l; ret += l;
9427 :
9428 19962 : ret += Top_tag_tag_oldret;
9429 : }
9430 : /* cusec */
9431 : {
9432 24843 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
9433 24843 : ret = 0;
9434 24843 : e = encode_krb5int32(p, len, &(data)->cusec, &l);
9435 24843 : if (e) return e;
9436 24843 : p -= l; len -= l; ret += l;
9437 :
9438 24843 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
9439 24843 : if (e) return e;
9440 24843 : p -= l; len -= l; ret += l;
9441 :
9442 24843 : ret += Top_tag_tag_oldret;
9443 : }
9444 : /* ctime */
9445 : {
9446 24843 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
9447 24843 : ret = 0;
9448 24843 : e = encode_KerberosTime(p, len, &(data)->ctime, &l);
9449 24843 : if (e) return e;
9450 24843 : p -= l; len -= l; ret += l;
9451 :
9452 24843 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
9453 24843 : if (e) return e;
9454 24843 : p -= l; len -= l; ret += l;
9455 :
9456 24843 : ret += Top_tag_tag_oldret;
9457 : }
9458 24843 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
9459 24843 : if (e) return e;
9460 24843 : p -= l; len -= l; ret += l;
9461 :
9462 24843 : e = der_put_length_and_tag (p, len, ret, ASN1_C_APPL, CONS, 27, &l);
9463 24843 : if (e) return e;
9464 24843 : p -= l; len -= l; ret += l;
9465 :
9466 24843 : *size = ret;
9467 24843 : return 0;
9468 : }
9469 :
9470 : int ASN1CALL
9471 23112 : decode_EncAPRepPart(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, EncAPRepPart *data, size_t *size)
9472 : {
9473 23112 : size_t ret = 0;
9474 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
9475 : int e HEIMDAL_UNUSED_ATTRIBUTE;
9476 :
9477 23112 : memset(data, 0, sizeof(*data));
9478 : {
9479 : size_t Top_datalen, Top_oldlen;
9480 : Der_type Top_type;
9481 23112 : e = der_match_tag_and_length(p, len, ASN1_C_APPL, &Top_type, 27, &Top_datalen, &l);
9482 23112 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
9483 23112 : if(e) goto fail;
9484 23112 : p += l; len -= l; ret += l;
9485 23112 : Top_oldlen = len;
9486 23112 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
9487 23112 : len = Top_datalen;
9488 : {
9489 : size_t Top_Tag_datalen, Top_Tag_oldlen;
9490 : Der_type Top_Tag_type;
9491 23112 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_Tag_type, UT_Sequence, &Top_Tag_datalen, &l);
9492 23112 : if (e == 0 && Top_Tag_type != CONS) { e = ASN1_BAD_ID; }
9493 23112 : if(e) goto fail;
9494 23112 : p += l; len -= l; ret += l;
9495 23112 : Top_Tag_oldlen = len;
9496 23112 : if (Top_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
9497 23112 : len = Top_Tag_datalen;
9498 : {
9499 : size_t ctime_datalen, ctime_oldlen;
9500 : Der_type ctime_type;
9501 23112 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &ctime_type, 0, &ctime_datalen, &l);
9502 23112 : if (e == 0 && ctime_type != CONS) { e = ASN1_BAD_ID; }
9503 23112 : if(e) goto fail;
9504 23112 : p += l; len -= l; ret += l;
9505 23112 : ctime_oldlen = len;
9506 23112 : if (ctime_datalen > len) { e = ASN1_OVERRUN; goto fail; }
9507 23112 : len = ctime_datalen;
9508 23112 : e = decode_KerberosTime(p, len, &(data)->ctime, &l);
9509 23112 : if(e) goto fail;
9510 23112 : p += l; len -= l; ret += l;
9511 23112 : len = ctime_oldlen - ctime_datalen;
9512 : }
9513 : {
9514 : size_t cusec_datalen, cusec_oldlen;
9515 : Der_type cusec_type;
9516 23112 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &cusec_type, 1, &cusec_datalen, &l);
9517 45390 : if (e == 0 && cusec_type != CONS) { e = ASN1_BAD_ID; }
9518 23112 : if(e) goto fail;
9519 23112 : p += l; len -= l; ret += l;
9520 23112 : cusec_oldlen = len;
9521 23112 : if (cusec_datalen > len) { e = ASN1_OVERRUN; goto fail; }
9522 23112 : len = cusec_datalen;
9523 23112 : e = decode_krb5int32(p, len, &(data)->cusec, &l);
9524 23112 : if(e) goto fail;
9525 23112 : p += l; len -= l; ret += l;
9526 23112 : len = cusec_oldlen - cusec_datalen;
9527 : }
9528 : {
9529 : size_t subkey_datalen, subkey_oldlen;
9530 : Der_type subkey_type;
9531 23112 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &subkey_type, 2, &subkey_datalen, &l);
9532 42048 : if (e == 0 && subkey_type != CONS) { e = ASN1_BAD_ID; }
9533 23112 : if(e) {
9534 3438 : (data)->subkey = NULL;
9535 : } else {
9536 19674 : (data)->subkey = calloc(1, sizeof(*(data)->subkey));
9537 19674 : if ((data)->subkey == NULL) { e = ENOMEM; goto fail; }
9538 19674 : p += l; len -= l; ret += l;
9539 19674 : subkey_oldlen = len;
9540 19674 : if (subkey_datalen > len) { e = ASN1_OVERRUN; goto fail; }
9541 19674 : len = subkey_datalen;
9542 19674 : e = decode_EncryptionKey(p, len, (data)->subkey, &l);
9543 19674 : if(e) goto fail;
9544 19674 : p += l; len -= l; ret += l;
9545 19674 : len = subkey_oldlen - subkey_datalen;
9546 : }
9547 : }
9548 : {
9549 : size_t seq_number_datalen, seq_number_oldlen;
9550 : Der_type seq_number_type;
9551 23112 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &seq_number_type, 3, &seq_number_datalen, &l);
9552 46224 : if (e == 0 && seq_number_type != CONS) { e = ASN1_BAD_ID; }
9553 23112 : if(e) {
9554 0 : (data)->seq_number = NULL;
9555 : } else {
9556 23112 : (data)->seq_number = calloc(1, sizeof(*(data)->seq_number));
9557 23112 : if ((data)->seq_number == NULL) { e = ENOMEM; goto fail; }
9558 23112 : p += l; len -= l; ret += l;
9559 23112 : seq_number_oldlen = len;
9560 23112 : if (seq_number_datalen > len) { e = ASN1_OVERRUN; goto fail; }
9561 23112 : len = seq_number_datalen;
9562 23112 : e = decode_krb5uint32(p, len, (data)->seq_number, &l);
9563 23112 : if(e) goto fail;
9564 23112 : p += l; len -= l; ret += l;
9565 23112 : len = seq_number_oldlen - seq_number_datalen;
9566 : }
9567 : }
9568 23112 : len = Top_Tag_oldlen - Top_Tag_datalen;
9569 : }
9570 23112 : len = Top_oldlen - Top_datalen;
9571 : }
9572 46224 : if(size) *size = ret;
9573 22278 : return 0;
9574 0 : fail:
9575 0 : free_EncAPRepPart(data);
9576 0 : return e;
9577 : }
9578 :
9579 : void ASN1CALL
9580 47955 : free_EncAPRepPart(EncAPRepPart *data)
9581 : {
9582 47955 : free_KerberosTime(&(data)->ctime);
9583 47955 : free_krb5int32(&(data)->cusec);
9584 47955 : if((data)->subkey) {
9585 39636 : free_EncryptionKey((data)->subkey);
9586 39636 : free((data)->subkey);
9587 39636 : (data)->subkey = NULL;
9588 : }
9589 47955 : if((data)->seq_number) {
9590 47955 : free_krb5uint32((data)->seq_number);
9591 47955 : free((data)->seq_number);
9592 47955 : (data)->seq_number = NULL;
9593 : }
9594 47955 : }
9595 :
9596 : size_t ASN1CALL
9597 24843 : length_EncAPRepPart(const EncAPRepPart *data)
9598 : {
9599 24843 : size_t ret = 0;
9600 : {
9601 24843 : size_t Top_tag_tag_oldret = ret;
9602 24843 : ret = 0;
9603 24843 : ret += length_KerberosTime(&(data)->ctime);
9604 24843 : ret += 1 + der_length_len (ret);
9605 24843 : ret += Top_tag_tag_oldret;
9606 : }
9607 : {
9608 24843 : size_t Top_tag_tag_oldret = ret;
9609 24843 : ret = 0;
9610 24843 : ret += length_krb5int32(&(data)->cusec);
9611 24843 : ret += 1 + der_length_len (ret);
9612 24843 : ret += Top_tag_tag_oldret;
9613 : }
9614 24843 : if((data)->subkey){
9615 19962 : size_t Top_tag_tag_oldret = ret;
9616 19962 : ret = 0;
9617 19962 : ret += length_EncryptionKey((data)->subkey);
9618 19962 : ret += 1 + der_length_len (ret);
9619 19962 : ret += Top_tag_tag_oldret;
9620 : }
9621 24843 : if((data)->seq_number){
9622 24843 : size_t Top_tag_tag_oldret = ret;
9623 24843 : ret = 0;
9624 24843 : ret += length_krb5uint32((data)->seq_number);
9625 24843 : ret += 1 + der_length_len (ret);
9626 24843 : ret += Top_tag_tag_oldret;
9627 : }
9628 24843 : ret += 1 + der_length_len (ret);
9629 24843 : ret += 1 + der_length_len (ret);
9630 24843 : return ret;
9631 : }
9632 :
9633 : int ASN1CALL
9634 0 : copy_EncAPRepPart(const EncAPRepPart *from, EncAPRepPart *to)
9635 : {
9636 0 : memset(to, 0, sizeof(*to));
9637 0 : if(copy_KerberosTime(&(from)->ctime, &(to)->ctime)) goto fail;
9638 0 : if(copy_krb5int32(&(from)->cusec, &(to)->cusec)) goto fail;
9639 0 : if((from)->subkey) {
9640 0 : (to)->subkey = malloc(sizeof(*(to)->subkey));
9641 0 : if((to)->subkey == NULL) goto fail;
9642 0 : if(copy_EncryptionKey((from)->subkey, (to)->subkey)) goto fail;
9643 : }else
9644 0 : (to)->subkey = NULL;
9645 0 : if((from)->seq_number) {
9646 0 : (to)->seq_number = malloc(sizeof(*(to)->seq_number));
9647 0 : if((to)->seq_number == NULL) goto fail;
9648 0 : if(copy_krb5uint32((from)->seq_number, (to)->seq_number)) goto fail;
9649 : }else
9650 0 : (to)->seq_number = NULL;
9651 0 : return 0;
9652 0 : fail:
9653 0 : free_EncAPRepPart(to);
9654 0 : return ENOMEM;
9655 : }
9656 :
9657 : int ASN1CALL
9658 0 : encode_KRB_SAFE_BODY(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const KRB_SAFE_BODY *data, size_t *size)
9659 : {
9660 0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
9661 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
9662 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
9663 :
9664 : /* r-address */
9665 0 : if((data)->r_address) {
9666 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
9667 0 : ret = 0;
9668 0 : e = encode_HostAddress(p, len, (data)->r_address, &l);
9669 0 : if (e) return e;
9670 0 : p -= l; len -= l; ret += l;
9671 :
9672 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 5, &l);
9673 0 : if (e) return e;
9674 0 : p -= l; len -= l; ret += l;
9675 :
9676 0 : ret += Top_tag_oldret;
9677 : }
9678 : /* s-address */
9679 0 : if((data)->s_address) {
9680 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
9681 0 : ret = 0;
9682 0 : e = encode_HostAddress(p, len, (data)->s_address, &l);
9683 0 : if (e) return e;
9684 0 : p -= l; len -= l; ret += l;
9685 :
9686 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 4, &l);
9687 0 : if (e) return e;
9688 0 : p -= l; len -= l; ret += l;
9689 :
9690 0 : ret += Top_tag_oldret;
9691 : }
9692 : /* seq-number */
9693 0 : if((data)->seq_number) {
9694 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
9695 0 : ret = 0;
9696 0 : e = encode_krb5uint32(p, len, (data)->seq_number, &l);
9697 0 : if (e) return e;
9698 0 : p -= l; len -= l; ret += l;
9699 :
9700 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 3, &l);
9701 0 : if (e) return e;
9702 0 : p -= l; len -= l; ret += l;
9703 :
9704 0 : ret += Top_tag_oldret;
9705 : }
9706 : /* usec */
9707 0 : if((data)->usec) {
9708 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
9709 0 : ret = 0;
9710 0 : e = encode_krb5int32(p, len, (data)->usec, &l);
9711 0 : if (e) return e;
9712 0 : p -= l; len -= l; ret += l;
9713 :
9714 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
9715 0 : if (e) return e;
9716 0 : p -= l; len -= l; ret += l;
9717 :
9718 0 : ret += Top_tag_oldret;
9719 : }
9720 : /* timestamp */
9721 0 : if((data)->timestamp) {
9722 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
9723 0 : ret = 0;
9724 0 : e = encode_KerberosTime(p, len, (data)->timestamp, &l);
9725 0 : if (e) return e;
9726 0 : p -= l; len -= l; ret += l;
9727 :
9728 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
9729 0 : if (e) return e;
9730 0 : p -= l; len -= l; ret += l;
9731 :
9732 0 : ret += Top_tag_oldret;
9733 : }
9734 : /* user-data */
9735 : {
9736 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
9737 0 : ret = 0;
9738 0 : e = der_put_octet_string(p, len, &(data)->user_data, &l);
9739 0 : if (e) return e;
9740 0 : p -= l; len -= l; ret += l;
9741 :
9742 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_OctetString, &l);
9743 0 : if (e) return e;
9744 0 : p -= l; len -= l; ret += l;
9745 :
9746 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
9747 0 : if (e) return e;
9748 0 : p -= l; len -= l; ret += l;
9749 :
9750 0 : ret += Top_tag_oldret;
9751 : }
9752 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
9753 0 : if (e) return e;
9754 0 : p -= l; len -= l; ret += l;
9755 :
9756 0 : *size = ret;
9757 0 : return 0;
9758 : }
9759 :
9760 : int ASN1CALL
9761 0 : decode_KRB_SAFE_BODY(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, KRB_SAFE_BODY *data, size_t *size)
9762 : {
9763 0 : size_t ret = 0;
9764 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
9765 : int e HEIMDAL_UNUSED_ATTRIBUTE;
9766 :
9767 0 : memset(data, 0, sizeof(*data));
9768 : {
9769 : size_t Top_datalen, Top_oldlen;
9770 : Der_type Top_type;
9771 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
9772 0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
9773 0 : if(e) goto fail;
9774 0 : p += l; len -= l; ret += l;
9775 0 : Top_oldlen = len;
9776 0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
9777 0 : len = Top_datalen;
9778 : {
9779 : size_t user_data_datalen, user_data_oldlen;
9780 : Der_type user_data_type;
9781 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &user_data_type, 0, &user_data_datalen, &l);
9782 0 : if (e == 0 && user_data_type != CONS) { e = ASN1_BAD_ID; }
9783 0 : if(e) goto fail;
9784 0 : p += l; len -= l; ret += l;
9785 0 : user_data_oldlen = len;
9786 0 : if (user_data_datalen > len) { e = ASN1_OVERRUN; goto fail; }
9787 0 : len = user_data_datalen;
9788 : {
9789 : size_t user_data_Tag_datalen, user_data_Tag_oldlen;
9790 : Der_type user_data_Tag_type;
9791 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &user_data_Tag_type, UT_OctetString, &user_data_Tag_datalen, &l);
9792 0 : if (e == 0 && user_data_Tag_type != PRIM) { e = ASN1_BAD_ID; }
9793 0 : if(e) goto fail;
9794 0 : p += l; len -= l; ret += l;
9795 0 : user_data_Tag_oldlen = len;
9796 0 : if (user_data_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
9797 0 : len = user_data_Tag_datalen;
9798 0 : e = der_get_octet_string(p, len, &(data)->user_data, &l);
9799 0 : if(e) goto fail;
9800 0 : p += l; len -= l; ret += l;
9801 0 : len = user_data_Tag_oldlen - user_data_Tag_datalen;
9802 : }
9803 0 : len = user_data_oldlen - user_data_datalen;
9804 : }
9805 : {
9806 : size_t timestamp_datalen, timestamp_oldlen;
9807 : Der_type timestamp_type;
9808 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, ×tamp_type, 1, ×tamp_datalen, &l);
9809 0 : if (e == 0 && timestamp_type != CONS) { e = ASN1_BAD_ID; }
9810 0 : if(e) {
9811 0 : (data)->timestamp = NULL;
9812 : } else {
9813 0 : (data)->timestamp = calloc(1, sizeof(*(data)->timestamp));
9814 0 : if ((data)->timestamp == NULL) { e = ENOMEM; goto fail; }
9815 0 : p += l; len -= l; ret += l;
9816 0 : timestamp_oldlen = len;
9817 0 : if (timestamp_datalen > len) { e = ASN1_OVERRUN; goto fail; }
9818 0 : len = timestamp_datalen;
9819 0 : e = decode_KerberosTime(p, len, (data)->timestamp, &l);
9820 0 : if(e) goto fail;
9821 0 : p += l; len -= l; ret += l;
9822 0 : len = timestamp_oldlen - timestamp_datalen;
9823 : }
9824 : }
9825 : {
9826 : size_t usec_datalen, usec_oldlen;
9827 : Der_type usec_type;
9828 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &usec_type, 2, &usec_datalen, &l);
9829 0 : if (e == 0 && usec_type != CONS) { e = ASN1_BAD_ID; }
9830 0 : if(e) {
9831 0 : (data)->usec = NULL;
9832 : } else {
9833 0 : (data)->usec = calloc(1, sizeof(*(data)->usec));
9834 0 : if ((data)->usec == NULL) { e = ENOMEM; goto fail; }
9835 0 : p += l; len -= l; ret += l;
9836 0 : usec_oldlen = len;
9837 0 : if (usec_datalen > len) { e = ASN1_OVERRUN; goto fail; }
9838 0 : len = usec_datalen;
9839 0 : e = decode_krb5int32(p, len, (data)->usec, &l);
9840 0 : if(e) goto fail;
9841 0 : p += l; len -= l; ret += l;
9842 0 : len = usec_oldlen - usec_datalen;
9843 : }
9844 : }
9845 : {
9846 : size_t seq_number_datalen, seq_number_oldlen;
9847 : Der_type seq_number_type;
9848 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &seq_number_type, 3, &seq_number_datalen, &l);
9849 0 : if (e == 0 && seq_number_type != CONS) { e = ASN1_BAD_ID; }
9850 0 : if(e) {
9851 0 : (data)->seq_number = NULL;
9852 : } else {
9853 0 : (data)->seq_number = calloc(1, sizeof(*(data)->seq_number));
9854 0 : if ((data)->seq_number == NULL) { e = ENOMEM; goto fail; }
9855 0 : p += l; len -= l; ret += l;
9856 0 : seq_number_oldlen = len;
9857 0 : if (seq_number_datalen > len) { e = ASN1_OVERRUN; goto fail; }
9858 0 : len = seq_number_datalen;
9859 0 : e = decode_krb5uint32(p, len, (data)->seq_number, &l);
9860 0 : if(e) goto fail;
9861 0 : p += l; len -= l; ret += l;
9862 0 : len = seq_number_oldlen - seq_number_datalen;
9863 : }
9864 : }
9865 : {
9866 : size_t s_address_datalen, s_address_oldlen;
9867 : Der_type s_address_type;
9868 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &s_address_type, 4, &s_address_datalen, &l);
9869 0 : if (e == 0 && s_address_type != CONS) { e = ASN1_BAD_ID; }
9870 0 : if(e) {
9871 0 : (data)->s_address = NULL;
9872 : } else {
9873 0 : (data)->s_address = calloc(1, sizeof(*(data)->s_address));
9874 0 : if ((data)->s_address == NULL) { e = ENOMEM; goto fail; }
9875 0 : p += l; len -= l; ret += l;
9876 0 : s_address_oldlen = len;
9877 0 : if (s_address_datalen > len) { e = ASN1_OVERRUN; goto fail; }
9878 0 : len = s_address_datalen;
9879 0 : e = decode_HostAddress(p, len, (data)->s_address, &l);
9880 0 : if(e) goto fail;
9881 0 : p += l; len -= l; ret += l;
9882 0 : len = s_address_oldlen - s_address_datalen;
9883 : }
9884 : }
9885 : {
9886 : size_t r_address_datalen, r_address_oldlen;
9887 : Der_type r_address_type;
9888 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &r_address_type, 5, &r_address_datalen, &l);
9889 0 : if (e == 0 && r_address_type != CONS) { e = ASN1_BAD_ID; }
9890 0 : if(e) {
9891 0 : (data)->r_address = NULL;
9892 : } else {
9893 0 : (data)->r_address = calloc(1, sizeof(*(data)->r_address));
9894 0 : if ((data)->r_address == NULL) { e = ENOMEM; goto fail; }
9895 0 : p += l; len -= l; ret += l;
9896 0 : r_address_oldlen = len;
9897 0 : if (r_address_datalen > len) { e = ASN1_OVERRUN; goto fail; }
9898 0 : len = r_address_datalen;
9899 0 : e = decode_HostAddress(p, len, (data)->r_address, &l);
9900 0 : if(e) goto fail;
9901 0 : p += l; len -= l; ret += l;
9902 0 : len = r_address_oldlen - r_address_datalen;
9903 : }
9904 : }
9905 0 : len = Top_oldlen - Top_datalen;
9906 : }
9907 0 : if(size) *size = ret;
9908 0 : return 0;
9909 0 : fail:
9910 0 : free_KRB_SAFE_BODY(data);
9911 0 : return e;
9912 : }
9913 :
9914 : void ASN1CALL
9915 0 : free_KRB_SAFE_BODY(KRB_SAFE_BODY *data)
9916 : {
9917 0 : der_free_octet_string(&(data)->user_data);
9918 0 : if((data)->timestamp) {
9919 0 : free_KerberosTime((data)->timestamp);
9920 0 : free((data)->timestamp);
9921 0 : (data)->timestamp = NULL;
9922 : }
9923 0 : if((data)->usec) {
9924 0 : free_krb5int32((data)->usec);
9925 0 : free((data)->usec);
9926 0 : (data)->usec = NULL;
9927 : }
9928 0 : if((data)->seq_number) {
9929 0 : free_krb5uint32((data)->seq_number);
9930 0 : free((data)->seq_number);
9931 0 : (data)->seq_number = NULL;
9932 : }
9933 0 : if((data)->s_address) {
9934 0 : free_HostAddress((data)->s_address);
9935 0 : free((data)->s_address);
9936 0 : (data)->s_address = NULL;
9937 : }
9938 0 : if((data)->r_address) {
9939 0 : free_HostAddress((data)->r_address);
9940 0 : free((data)->r_address);
9941 0 : (data)->r_address = NULL;
9942 : }
9943 0 : }
9944 :
9945 : size_t ASN1CALL
9946 0 : length_KRB_SAFE_BODY(const KRB_SAFE_BODY *data)
9947 : {
9948 0 : size_t ret = 0;
9949 : {
9950 0 : size_t Top_tag_oldret = ret;
9951 0 : ret = 0;
9952 0 : ret += der_length_octet_string(&(data)->user_data);
9953 0 : ret += 1 + der_length_len (ret);
9954 0 : ret += 1 + der_length_len (ret);
9955 0 : ret += Top_tag_oldret;
9956 : }
9957 0 : if((data)->timestamp){
9958 0 : size_t Top_tag_oldret = ret;
9959 0 : ret = 0;
9960 0 : ret += length_KerberosTime((data)->timestamp);
9961 0 : ret += 1 + der_length_len (ret);
9962 0 : ret += Top_tag_oldret;
9963 : }
9964 0 : if((data)->usec){
9965 0 : size_t Top_tag_oldret = ret;
9966 0 : ret = 0;
9967 0 : ret += length_krb5int32((data)->usec);
9968 0 : ret += 1 + der_length_len (ret);
9969 0 : ret += Top_tag_oldret;
9970 : }
9971 0 : if((data)->seq_number){
9972 0 : size_t Top_tag_oldret = ret;
9973 0 : ret = 0;
9974 0 : ret += length_krb5uint32((data)->seq_number);
9975 0 : ret += 1 + der_length_len (ret);
9976 0 : ret += Top_tag_oldret;
9977 : }
9978 0 : if((data)->s_address){
9979 0 : size_t Top_tag_oldret = ret;
9980 0 : ret = 0;
9981 0 : ret += length_HostAddress((data)->s_address);
9982 0 : ret += 1 + der_length_len (ret);
9983 0 : ret += Top_tag_oldret;
9984 : }
9985 0 : if((data)->r_address){
9986 0 : size_t Top_tag_oldret = ret;
9987 0 : ret = 0;
9988 0 : ret += length_HostAddress((data)->r_address);
9989 0 : ret += 1 + der_length_len (ret);
9990 0 : ret += Top_tag_oldret;
9991 : }
9992 0 : ret += 1 + der_length_len (ret);
9993 0 : return ret;
9994 : }
9995 :
9996 : int ASN1CALL
9997 0 : copy_KRB_SAFE_BODY(const KRB_SAFE_BODY *from, KRB_SAFE_BODY *to)
9998 : {
9999 0 : memset(to, 0, sizeof(*to));
10000 0 : if(der_copy_octet_string(&(from)->user_data, &(to)->user_data)) goto fail;
10001 0 : if((from)->timestamp) {
10002 0 : (to)->timestamp = malloc(sizeof(*(to)->timestamp));
10003 0 : if((to)->timestamp == NULL) goto fail;
10004 0 : if(copy_KerberosTime((from)->timestamp, (to)->timestamp)) goto fail;
10005 : }else
10006 0 : (to)->timestamp = NULL;
10007 0 : if((from)->usec) {
10008 0 : (to)->usec = malloc(sizeof(*(to)->usec));
10009 0 : if((to)->usec == NULL) goto fail;
10010 0 : if(copy_krb5int32((from)->usec, (to)->usec)) goto fail;
10011 : }else
10012 0 : (to)->usec = NULL;
10013 0 : if((from)->seq_number) {
10014 0 : (to)->seq_number = malloc(sizeof(*(to)->seq_number));
10015 0 : if((to)->seq_number == NULL) goto fail;
10016 0 : if(copy_krb5uint32((from)->seq_number, (to)->seq_number)) goto fail;
10017 : }else
10018 0 : (to)->seq_number = NULL;
10019 0 : if((from)->s_address) {
10020 0 : (to)->s_address = malloc(sizeof(*(to)->s_address));
10021 0 : if((to)->s_address == NULL) goto fail;
10022 0 : if(copy_HostAddress((from)->s_address, (to)->s_address)) goto fail;
10023 : }else
10024 0 : (to)->s_address = NULL;
10025 0 : if((from)->r_address) {
10026 0 : (to)->r_address = malloc(sizeof(*(to)->r_address));
10027 0 : if((to)->r_address == NULL) goto fail;
10028 0 : if(copy_HostAddress((from)->r_address, (to)->r_address)) goto fail;
10029 : }else
10030 0 : (to)->r_address = NULL;
10031 0 : return 0;
10032 0 : fail:
10033 0 : free_KRB_SAFE_BODY(to);
10034 0 : return ENOMEM;
10035 : }
10036 :
10037 : int ASN1CALL
10038 0 : encode_KRB_SAFE(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const KRB_SAFE *data, size_t *size)
10039 : {
10040 0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
10041 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
10042 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
10043 :
10044 : /* cksum */
10045 : {
10046 0 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
10047 0 : ret = 0;
10048 0 : e = encode_Checksum(p, len, &(data)->cksum, &l);
10049 0 : if (e) return e;
10050 0 : p -= l; len -= l; ret += l;
10051 :
10052 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 3, &l);
10053 0 : if (e) return e;
10054 0 : p -= l; len -= l; ret += l;
10055 :
10056 0 : ret += Top_tag_tag_oldret;
10057 : }
10058 : /* safe-body */
10059 : {
10060 0 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
10061 0 : ret = 0;
10062 0 : e = encode_KRB_SAFE_BODY(p, len, &(data)->safe_body, &l);
10063 0 : if (e) return e;
10064 0 : p -= l; len -= l; ret += l;
10065 :
10066 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
10067 0 : if (e) return e;
10068 0 : p -= l; len -= l; ret += l;
10069 :
10070 0 : ret += Top_tag_tag_oldret;
10071 : }
10072 : /* msg-type */
10073 : {
10074 0 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
10075 0 : ret = 0;
10076 0 : e = encode_MESSAGE_TYPE(p, len, &(data)->msg_type, &l);
10077 0 : if (e) return e;
10078 0 : p -= l; len -= l; ret += l;
10079 :
10080 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
10081 0 : if (e) return e;
10082 0 : p -= l; len -= l; ret += l;
10083 :
10084 0 : ret += Top_tag_tag_oldret;
10085 : }
10086 : /* pvno */
10087 : {
10088 0 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
10089 0 : ret = 0;
10090 0 : e = encode_krb5int32(p, len, &(data)->pvno, &l);
10091 0 : if (e) return e;
10092 0 : p -= l; len -= l; ret += l;
10093 :
10094 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
10095 0 : if (e) return e;
10096 0 : p -= l; len -= l; ret += l;
10097 :
10098 0 : ret += Top_tag_tag_oldret;
10099 : }
10100 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
10101 0 : if (e) return e;
10102 0 : p -= l; len -= l; ret += l;
10103 :
10104 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_APPL, CONS, 20, &l);
10105 0 : if (e) return e;
10106 0 : p -= l; len -= l; ret += l;
10107 :
10108 0 : *size = ret;
10109 0 : return 0;
10110 : }
10111 :
10112 : int ASN1CALL
10113 0 : decode_KRB_SAFE(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, KRB_SAFE *data, size_t *size)
10114 : {
10115 0 : size_t ret = 0;
10116 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
10117 : int e HEIMDAL_UNUSED_ATTRIBUTE;
10118 :
10119 0 : memset(data, 0, sizeof(*data));
10120 : {
10121 : size_t Top_datalen, Top_oldlen;
10122 : Der_type Top_type;
10123 0 : e = der_match_tag_and_length(p, len, ASN1_C_APPL, &Top_type, 20, &Top_datalen, &l);
10124 0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
10125 0 : if(e) goto fail;
10126 0 : p += l; len -= l; ret += l;
10127 0 : Top_oldlen = len;
10128 0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
10129 0 : len = Top_datalen;
10130 : {
10131 : size_t Top_Tag_datalen, Top_Tag_oldlen;
10132 : Der_type Top_Tag_type;
10133 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_Tag_type, UT_Sequence, &Top_Tag_datalen, &l);
10134 0 : if (e == 0 && Top_Tag_type != CONS) { e = ASN1_BAD_ID; }
10135 0 : if(e) goto fail;
10136 0 : p += l; len -= l; ret += l;
10137 0 : Top_Tag_oldlen = len;
10138 0 : if (Top_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
10139 0 : len = Top_Tag_datalen;
10140 : {
10141 : size_t pvno_datalen, pvno_oldlen;
10142 : Der_type pvno_type;
10143 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &pvno_type, 0, &pvno_datalen, &l);
10144 0 : if (e == 0 && pvno_type != CONS) { e = ASN1_BAD_ID; }
10145 0 : if(e) goto fail;
10146 0 : p += l; len -= l; ret += l;
10147 0 : pvno_oldlen = len;
10148 0 : if (pvno_datalen > len) { e = ASN1_OVERRUN; goto fail; }
10149 0 : len = pvno_datalen;
10150 0 : e = decode_krb5int32(p, len, &(data)->pvno, &l);
10151 0 : if(e) goto fail;
10152 0 : p += l; len -= l; ret += l;
10153 0 : len = pvno_oldlen - pvno_datalen;
10154 : }
10155 : {
10156 : size_t msg_type_datalen, msg_type_oldlen;
10157 : Der_type msg_type_type;
10158 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &msg_type_type, 1, &msg_type_datalen, &l);
10159 0 : if (e == 0 && msg_type_type != CONS) { e = ASN1_BAD_ID; }
10160 0 : if(e) goto fail;
10161 0 : p += l; len -= l; ret += l;
10162 0 : msg_type_oldlen = len;
10163 0 : if (msg_type_datalen > len) { e = ASN1_OVERRUN; goto fail; }
10164 0 : len = msg_type_datalen;
10165 0 : e = decode_MESSAGE_TYPE(p, len, &(data)->msg_type, &l);
10166 0 : if(e) goto fail;
10167 0 : p += l; len -= l; ret += l;
10168 0 : len = msg_type_oldlen - msg_type_datalen;
10169 : }
10170 : {
10171 : size_t safe_body_datalen, safe_body_oldlen;
10172 : Der_type safe_body_type;
10173 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &safe_body_type, 2, &safe_body_datalen, &l);
10174 0 : if (e == 0 && safe_body_type != CONS) { e = ASN1_BAD_ID; }
10175 0 : if(e) goto fail;
10176 0 : p += l; len -= l; ret += l;
10177 0 : safe_body_oldlen = len;
10178 0 : if (safe_body_datalen > len) { e = ASN1_OVERRUN; goto fail; }
10179 0 : len = safe_body_datalen;
10180 0 : e = decode_KRB_SAFE_BODY(p, len, &(data)->safe_body, &l);
10181 0 : if(e) goto fail;
10182 0 : p += l; len -= l; ret += l;
10183 0 : len = safe_body_oldlen - safe_body_datalen;
10184 : }
10185 : {
10186 : size_t cksum_datalen, cksum_oldlen;
10187 : Der_type cksum_type;
10188 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &cksum_type, 3, &cksum_datalen, &l);
10189 0 : if (e == 0 && cksum_type != CONS) { e = ASN1_BAD_ID; }
10190 0 : if(e) goto fail;
10191 0 : p += l; len -= l; ret += l;
10192 0 : cksum_oldlen = len;
10193 0 : if (cksum_datalen > len) { e = ASN1_OVERRUN; goto fail; }
10194 0 : len = cksum_datalen;
10195 0 : e = decode_Checksum(p, len, &(data)->cksum, &l);
10196 0 : if(e) goto fail;
10197 0 : p += l; len -= l; ret += l;
10198 0 : len = cksum_oldlen - cksum_datalen;
10199 : }
10200 0 : len = Top_Tag_oldlen - Top_Tag_datalen;
10201 : }
10202 0 : len = Top_oldlen - Top_datalen;
10203 : }
10204 0 : if(size) *size = ret;
10205 0 : return 0;
10206 0 : fail:
10207 0 : free_KRB_SAFE(data);
10208 0 : return e;
10209 : }
10210 :
10211 : void ASN1CALL
10212 0 : free_KRB_SAFE(KRB_SAFE *data)
10213 : {
10214 0 : free_krb5int32(&(data)->pvno);
10215 0 : free_MESSAGE_TYPE(&(data)->msg_type);
10216 0 : free_KRB_SAFE_BODY(&(data)->safe_body);
10217 0 : free_Checksum(&(data)->cksum);
10218 0 : }
10219 :
10220 : size_t ASN1CALL
10221 0 : length_KRB_SAFE(const KRB_SAFE *data)
10222 : {
10223 0 : size_t ret = 0;
10224 : {
10225 0 : size_t Top_tag_tag_oldret = ret;
10226 0 : ret = 0;
10227 0 : ret += length_krb5int32(&(data)->pvno);
10228 0 : ret += 1 + der_length_len (ret);
10229 0 : ret += Top_tag_tag_oldret;
10230 : }
10231 : {
10232 0 : size_t Top_tag_tag_oldret = ret;
10233 0 : ret = 0;
10234 0 : ret += length_MESSAGE_TYPE(&(data)->msg_type);
10235 0 : ret += 1 + der_length_len (ret);
10236 0 : ret += Top_tag_tag_oldret;
10237 : }
10238 : {
10239 0 : size_t Top_tag_tag_oldret = ret;
10240 0 : ret = 0;
10241 0 : ret += length_KRB_SAFE_BODY(&(data)->safe_body);
10242 0 : ret += 1 + der_length_len (ret);
10243 0 : ret += Top_tag_tag_oldret;
10244 : }
10245 : {
10246 0 : size_t Top_tag_tag_oldret = ret;
10247 0 : ret = 0;
10248 0 : ret += length_Checksum(&(data)->cksum);
10249 0 : ret += 1 + der_length_len (ret);
10250 0 : ret += Top_tag_tag_oldret;
10251 : }
10252 0 : ret += 1 + der_length_len (ret);
10253 0 : ret += 1 + der_length_len (ret);
10254 0 : return ret;
10255 : }
10256 :
10257 : int ASN1CALL
10258 0 : copy_KRB_SAFE(const KRB_SAFE *from, KRB_SAFE *to)
10259 : {
10260 0 : memset(to, 0, sizeof(*to));
10261 0 : if(copy_krb5int32(&(from)->pvno, &(to)->pvno)) goto fail;
10262 0 : if(copy_MESSAGE_TYPE(&(from)->msg_type, &(to)->msg_type)) goto fail;
10263 0 : if(copy_KRB_SAFE_BODY(&(from)->safe_body, &(to)->safe_body)) goto fail;
10264 0 : if(copy_Checksum(&(from)->cksum, &(to)->cksum)) goto fail;
10265 0 : return 0;
10266 0 : fail:
10267 0 : free_KRB_SAFE(to);
10268 0 : return ENOMEM;
10269 : }
10270 :
10271 : int ASN1CALL
10272 68 : encode_KRB_PRIV(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const KRB_PRIV *data, size_t *size)
10273 : {
10274 68 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
10275 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
10276 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
10277 :
10278 : /* enc-part */
10279 : {
10280 68 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
10281 68 : ret = 0;
10282 68 : e = encode_EncryptedData(p, len, &(data)->enc_part, &l);
10283 68 : if (e) return e;
10284 68 : p -= l; len -= l; ret += l;
10285 :
10286 68 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 3, &l);
10287 68 : if (e) return e;
10288 68 : p -= l; len -= l; ret += l;
10289 :
10290 68 : ret += Top_tag_tag_oldret;
10291 : }
10292 : /* msg-type */
10293 : {
10294 68 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
10295 68 : ret = 0;
10296 68 : e = encode_MESSAGE_TYPE(p, len, &(data)->msg_type, &l);
10297 68 : if (e) return e;
10298 68 : p -= l; len -= l; ret += l;
10299 :
10300 68 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
10301 68 : if (e) return e;
10302 68 : p -= l; len -= l; ret += l;
10303 :
10304 68 : ret += Top_tag_tag_oldret;
10305 : }
10306 : /* pvno */
10307 : {
10308 68 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
10309 68 : ret = 0;
10310 68 : e = encode_krb5int32(p, len, &(data)->pvno, &l);
10311 68 : if (e) return e;
10312 68 : p -= l; len -= l; ret += l;
10313 :
10314 68 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
10315 68 : if (e) return e;
10316 68 : p -= l; len -= l; ret += l;
10317 :
10318 68 : ret += Top_tag_tag_oldret;
10319 : }
10320 68 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
10321 68 : if (e) return e;
10322 68 : p -= l; len -= l; ret += l;
10323 :
10324 68 : e = der_put_length_and_tag (p, len, ret, ASN1_C_APPL, CONS, 21, &l);
10325 68 : if (e) return e;
10326 68 : p -= l; len -= l; ret += l;
10327 :
10328 68 : *size = ret;
10329 68 : return 0;
10330 : }
10331 :
10332 : int ASN1CALL
10333 68 : decode_KRB_PRIV(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, KRB_PRIV *data, size_t *size)
10334 : {
10335 68 : size_t ret = 0;
10336 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
10337 : int e HEIMDAL_UNUSED_ATTRIBUTE;
10338 :
10339 68 : memset(data, 0, sizeof(*data));
10340 : {
10341 : size_t Top_datalen, Top_oldlen;
10342 : Der_type Top_type;
10343 68 : e = der_match_tag_and_length(p, len, ASN1_C_APPL, &Top_type, 21, &Top_datalen, &l);
10344 68 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
10345 68 : if(e) goto fail;
10346 68 : p += l; len -= l; ret += l;
10347 68 : Top_oldlen = len;
10348 68 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
10349 68 : len = Top_datalen;
10350 : {
10351 : size_t Top_Tag_datalen, Top_Tag_oldlen;
10352 : Der_type Top_Tag_type;
10353 68 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_Tag_type, UT_Sequence, &Top_Tag_datalen, &l);
10354 68 : if (e == 0 && Top_Tag_type != CONS) { e = ASN1_BAD_ID; }
10355 68 : if(e) goto fail;
10356 68 : p += l; len -= l; ret += l;
10357 68 : Top_Tag_oldlen = len;
10358 68 : if (Top_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
10359 68 : len = Top_Tag_datalen;
10360 : {
10361 : size_t pvno_datalen, pvno_oldlen;
10362 : Der_type pvno_type;
10363 68 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &pvno_type, 0, &pvno_datalen, &l);
10364 68 : if (e == 0 && pvno_type != CONS) { e = ASN1_BAD_ID; }
10365 68 : if(e) goto fail;
10366 68 : p += l; len -= l; ret += l;
10367 68 : pvno_oldlen = len;
10368 68 : if (pvno_datalen > len) { e = ASN1_OVERRUN; goto fail; }
10369 68 : len = pvno_datalen;
10370 68 : e = decode_krb5int32(p, len, &(data)->pvno, &l);
10371 68 : if(e) goto fail;
10372 68 : p += l; len -= l; ret += l;
10373 68 : len = pvno_oldlen - pvno_datalen;
10374 : }
10375 : {
10376 : size_t msg_type_datalen, msg_type_oldlen;
10377 : Der_type msg_type_type;
10378 68 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &msg_type_type, 1, &msg_type_datalen, &l);
10379 136 : if (e == 0 && msg_type_type != CONS) { e = ASN1_BAD_ID; }
10380 68 : if(e) goto fail;
10381 68 : p += l; len -= l; ret += l;
10382 68 : msg_type_oldlen = len;
10383 68 : if (msg_type_datalen > len) { e = ASN1_OVERRUN; goto fail; }
10384 68 : len = msg_type_datalen;
10385 68 : e = decode_MESSAGE_TYPE(p, len, &(data)->msg_type, &l);
10386 68 : if(e) goto fail;
10387 68 : p += l; len -= l; ret += l;
10388 68 : len = msg_type_oldlen - msg_type_datalen;
10389 : }
10390 : {
10391 : size_t enc_part_datalen, enc_part_oldlen;
10392 : Der_type enc_part_type;
10393 68 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &enc_part_type, 3, &enc_part_datalen, &l);
10394 136 : if (e == 0 && enc_part_type != CONS) { e = ASN1_BAD_ID; }
10395 68 : if(e) goto fail;
10396 68 : p += l; len -= l; ret += l;
10397 68 : enc_part_oldlen = len;
10398 68 : if (enc_part_datalen > len) { e = ASN1_OVERRUN; goto fail; }
10399 68 : len = enc_part_datalen;
10400 68 : e = decode_EncryptedData(p, len, &(data)->enc_part, &l);
10401 68 : if(e) goto fail;
10402 68 : p += l; len -= l; ret += l;
10403 68 : len = enc_part_oldlen - enc_part_datalen;
10404 : }
10405 68 : len = Top_Tag_oldlen - Top_Tag_datalen;
10406 : }
10407 68 : len = Top_oldlen - Top_datalen;
10408 : }
10409 136 : if(size) *size = ret;
10410 68 : return 0;
10411 0 : fail:
10412 0 : free_KRB_PRIV(data);
10413 0 : return e;
10414 : }
10415 :
10416 : void ASN1CALL
10417 68 : free_KRB_PRIV(KRB_PRIV *data)
10418 : {
10419 68 : free_krb5int32(&(data)->pvno);
10420 68 : free_MESSAGE_TYPE(&(data)->msg_type);
10421 68 : free_EncryptedData(&(data)->enc_part);
10422 68 : }
10423 :
10424 : size_t ASN1CALL
10425 68 : length_KRB_PRIV(const KRB_PRIV *data)
10426 : {
10427 68 : size_t ret = 0;
10428 : {
10429 68 : size_t Top_tag_tag_oldret = ret;
10430 68 : ret = 0;
10431 68 : ret += length_krb5int32(&(data)->pvno);
10432 68 : ret += 1 + der_length_len (ret);
10433 68 : ret += Top_tag_tag_oldret;
10434 : }
10435 : {
10436 68 : size_t Top_tag_tag_oldret = ret;
10437 68 : ret = 0;
10438 68 : ret += length_MESSAGE_TYPE(&(data)->msg_type);
10439 68 : ret += 1 + der_length_len (ret);
10440 68 : ret += Top_tag_tag_oldret;
10441 : }
10442 : {
10443 68 : size_t Top_tag_tag_oldret = ret;
10444 68 : ret = 0;
10445 68 : ret += length_EncryptedData(&(data)->enc_part);
10446 68 : ret += 1 + der_length_len (ret);
10447 68 : ret += Top_tag_tag_oldret;
10448 : }
10449 68 : ret += 1 + der_length_len (ret);
10450 68 : ret += 1 + der_length_len (ret);
10451 68 : return ret;
10452 : }
10453 :
10454 : int ASN1CALL
10455 0 : copy_KRB_PRIV(const KRB_PRIV *from, KRB_PRIV *to)
10456 : {
10457 0 : memset(to, 0, sizeof(*to));
10458 0 : if(copy_krb5int32(&(from)->pvno, &(to)->pvno)) goto fail;
10459 0 : if(copy_MESSAGE_TYPE(&(from)->msg_type, &(to)->msg_type)) goto fail;
10460 0 : if(copy_EncryptedData(&(from)->enc_part, &(to)->enc_part)) goto fail;
10461 0 : return 0;
10462 0 : fail:
10463 0 : free_KRB_PRIV(to);
10464 0 : return ENOMEM;
10465 : }
10466 :
10467 : int ASN1CALL
10468 68 : encode_EncKrbPrivPart(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const EncKrbPrivPart *data, size_t *size)
10469 : {
10470 68 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
10471 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
10472 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
10473 :
10474 : /* r-address */
10475 68 : if((data)->r_address) {
10476 0 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
10477 0 : ret = 0;
10478 0 : e = encode_HostAddress(p, len, (data)->r_address, &l);
10479 0 : if (e) return e;
10480 0 : p -= l; len -= l; ret += l;
10481 :
10482 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 5, &l);
10483 0 : if (e) return e;
10484 0 : p -= l; len -= l; ret += l;
10485 :
10486 0 : ret += Top_tag_tag_oldret;
10487 : }
10488 : /* s-address */
10489 68 : if((data)->s_address) {
10490 68 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
10491 68 : ret = 0;
10492 68 : e = encode_HostAddress(p, len, (data)->s_address, &l);
10493 68 : if (e) return e;
10494 68 : p -= l; len -= l; ret += l;
10495 :
10496 68 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 4, &l);
10497 68 : if (e) return e;
10498 68 : p -= l; len -= l; ret += l;
10499 :
10500 68 : ret += Top_tag_tag_oldret;
10501 : }
10502 : /* seq-number */
10503 68 : if((data)->seq_number) {
10504 68 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
10505 68 : ret = 0;
10506 68 : e = encode_krb5uint32(p, len, (data)->seq_number, &l);
10507 68 : if (e) return e;
10508 68 : p -= l; len -= l; ret += l;
10509 :
10510 68 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 3, &l);
10511 68 : if (e) return e;
10512 68 : p -= l; len -= l; ret += l;
10513 :
10514 68 : ret += Top_tag_tag_oldret;
10515 : }
10516 : /* usec */
10517 68 : if((data)->usec) {
10518 0 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
10519 0 : ret = 0;
10520 0 : e = encode_krb5int32(p, len, (data)->usec, &l);
10521 0 : if (e) return e;
10522 0 : p -= l; len -= l; ret += l;
10523 :
10524 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
10525 0 : if (e) return e;
10526 0 : p -= l; len -= l; ret += l;
10527 :
10528 0 : ret += Top_tag_tag_oldret;
10529 : }
10530 : /* timestamp */
10531 68 : if((data)->timestamp) {
10532 0 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
10533 0 : ret = 0;
10534 0 : e = encode_KerberosTime(p, len, (data)->timestamp, &l);
10535 0 : if (e) return e;
10536 0 : p -= l; len -= l; ret += l;
10537 :
10538 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
10539 0 : if (e) return e;
10540 0 : p -= l; len -= l; ret += l;
10541 :
10542 0 : ret += Top_tag_tag_oldret;
10543 : }
10544 : /* user-data */
10545 : {
10546 68 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
10547 68 : ret = 0;
10548 68 : e = der_put_octet_string(p, len, &(data)->user_data, &l);
10549 68 : if (e) return e;
10550 68 : p -= l; len -= l; ret += l;
10551 :
10552 68 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_OctetString, &l);
10553 68 : if (e) return e;
10554 68 : p -= l; len -= l; ret += l;
10555 :
10556 68 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
10557 68 : if (e) return e;
10558 68 : p -= l; len -= l; ret += l;
10559 :
10560 68 : ret += Top_tag_tag_oldret;
10561 : }
10562 68 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
10563 68 : if (e) return e;
10564 68 : p -= l; len -= l; ret += l;
10565 :
10566 68 : e = der_put_length_and_tag (p, len, ret, ASN1_C_APPL, CONS, 28, &l);
10567 68 : if (e) return e;
10568 68 : p -= l; len -= l; ret += l;
10569 :
10570 68 : *size = ret;
10571 68 : return 0;
10572 : }
10573 :
10574 : int ASN1CALL
10575 68 : decode_EncKrbPrivPart(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, EncKrbPrivPart *data, size_t *size)
10576 : {
10577 68 : size_t ret = 0;
10578 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
10579 : int e HEIMDAL_UNUSED_ATTRIBUTE;
10580 :
10581 68 : memset(data, 0, sizeof(*data));
10582 : {
10583 : size_t Top_datalen, Top_oldlen;
10584 : Der_type Top_type;
10585 68 : e = der_match_tag_and_length(p, len, ASN1_C_APPL, &Top_type, 28, &Top_datalen, &l);
10586 68 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
10587 68 : if(e) goto fail;
10588 68 : p += l; len -= l; ret += l;
10589 68 : Top_oldlen = len;
10590 68 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
10591 68 : len = Top_datalen;
10592 : {
10593 : size_t Top_Tag_datalen, Top_Tag_oldlen;
10594 : Der_type Top_Tag_type;
10595 68 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_Tag_type, UT_Sequence, &Top_Tag_datalen, &l);
10596 68 : if (e == 0 && Top_Tag_type != CONS) { e = ASN1_BAD_ID; }
10597 68 : if(e) goto fail;
10598 68 : p += l; len -= l; ret += l;
10599 68 : Top_Tag_oldlen = len;
10600 68 : if (Top_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
10601 68 : len = Top_Tag_datalen;
10602 : {
10603 : size_t user_data_datalen, user_data_oldlen;
10604 : Der_type user_data_type;
10605 68 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &user_data_type, 0, &user_data_datalen, &l);
10606 68 : if (e == 0 && user_data_type != CONS) { e = ASN1_BAD_ID; }
10607 68 : if(e) goto fail;
10608 68 : p += l; len -= l; ret += l;
10609 68 : user_data_oldlen = len;
10610 68 : if (user_data_datalen > len) { e = ASN1_OVERRUN; goto fail; }
10611 68 : len = user_data_datalen;
10612 : {
10613 : size_t user_data_Tag_datalen, user_data_Tag_oldlen;
10614 : Der_type user_data_Tag_type;
10615 68 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &user_data_Tag_type, UT_OctetString, &user_data_Tag_datalen, &l);
10616 68 : if (e == 0 && user_data_Tag_type != PRIM) { e = ASN1_BAD_ID; }
10617 68 : if(e) goto fail;
10618 68 : p += l; len -= l; ret += l;
10619 68 : user_data_Tag_oldlen = len;
10620 68 : if (user_data_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
10621 68 : len = user_data_Tag_datalen;
10622 68 : e = der_get_octet_string(p, len, &(data)->user_data, &l);
10623 68 : if(e) goto fail;
10624 68 : p += l; len -= l; ret += l;
10625 68 : len = user_data_Tag_oldlen - user_data_Tag_datalen;
10626 : }
10627 68 : len = user_data_oldlen - user_data_datalen;
10628 : }
10629 : {
10630 : size_t timestamp_datalen, timestamp_oldlen;
10631 : Der_type timestamp_type;
10632 68 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, ×tamp_type, 1, ×tamp_datalen, &l);
10633 68 : if (e == 0 && timestamp_type != CONS) { e = ASN1_BAD_ID; }
10634 68 : if(e) {
10635 68 : (data)->timestamp = NULL;
10636 : } else {
10637 0 : (data)->timestamp = calloc(1, sizeof(*(data)->timestamp));
10638 0 : if ((data)->timestamp == NULL) { e = ENOMEM; goto fail; }
10639 0 : p += l; len -= l; ret += l;
10640 0 : timestamp_oldlen = len;
10641 0 : if (timestamp_datalen > len) { e = ASN1_OVERRUN; goto fail; }
10642 0 : len = timestamp_datalen;
10643 0 : e = decode_KerberosTime(p, len, (data)->timestamp, &l);
10644 0 : if(e) goto fail;
10645 0 : p += l; len -= l; ret += l;
10646 0 : len = timestamp_oldlen - timestamp_datalen;
10647 : }
10648 : }
10649 : {
10650 : size_t usec_datalen, usec_oldlen;
10651 : Der_type usec_type;
10652 68 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &usec_type, 2, &usec_datalen, &l);
10653 68 : if (e == 0 && usec_type != CONS) { e = ASN1_BAD_ID; }
10654 68 : if(e) {
10655 68 : (data)->usec = NULL;
10656 : } else {
10657 0 : (data)->usec = calloc(1, sizeof(*(data)->usec));
10658 0 : if ((data)->usec == NULL) { e = ENOMEM; goto fail; }
10659 0 : p += l; len -= l; ret += l;
10660 0 : usec_oldlen = len;
10661 0 : if (usec_datalen > len) { e = ASN1_OVERRUN; goto fail; }
10662 0 : len = usec_datalen;
10663 0 : e = decode_krb5int32(p, len, (data)->usec, &l);
10664 0 : if(e) goto fail;
10665 0 : p += l; len -= l; ret += l;
10666 0 : len = usec_oldlen - usec_datalen;
10667 : }
10668 : }
10669 : {
10670 : size_t seq_number_datalen, seq_number_oldlen;
10671 : Der_type seq_number_type;
10672 68 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &seq_number_type, 3, &seq_number_datalen, &l);
10673 136 : if (e == 0 && seq_number_type != CONS) { e = ASN1_BAD_ID; }
10674 68 : if(e) {
10675 0 : (data)->seq_number = NULL;
10676 : } else {
10677 68 : (data)->seq_number = calloc(1, sizeof(*(data)->seq_number));
10678 68 : if ((data)->seq_number == NULL) { e = ENOMEM; goto fail; }
10679 68 : p += l; len -= l; ret += l;
10680 68 : seq_number_oldlen = len;
10681 68 : if (seq_number_datalen > len) { e = ASN1_OVERRUN; goto fail; }
10682 68 : len = seq_number_datalen;
10683 68 : e = decode_krb5uint32(p, len, (data)->seq_number, &l);
10684 68 : if(e) goto fail;
10685 68 : p += l; len -= l; ret += l;
10686 68 : len = seq_number_oldlen - seq_number_datalen;
10687 : }
10688 : }
10689 : {
10690 : size_t s_address_datalen, s_address_oldlen;
10691 : Der_type s_address_type;
10692 68 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &s_address_type, 4, &s_address_datalen, &l);
10693 136 : if (e == 0 && s_address_type != CONS) { e = ASN1_BAD_ID; }
10694 68 : if(e) {
10695 0 : (data)->s_address = NULL;
10696 : } else {
10697 68 : (data)->s_address = calloc(1, sizeof(*(data)->s_address));
10698 68 : if ((data)->s_address == NULL) { e = ENOMEM; goto fail; }
10699 68 : p += l; len -= l; ret += l;
10700 68 : s_address_oldlen = len;
10701 68 : if (s_address_datalen > len) { e = ASN1_OVERRUN; goto fail; }
10702 68 : len = s_address_datalen;
10703 68 : e = decode_HostAddress(p, len, (data)->s_address, &l);
10704 68 : if(e) goto fail;
10705 68 : p += l; len -= l; ret += l;
10706 68 : len = s_address_oldlen - s_address_datalen;
10707 : }
10708 : }
10709 : {
10710 : size_t r_address_datalen, r_address_oldlen;
10711 : Der_type r_address_type;
10712 68 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &r_address_type, 5, &r_address_datalen, &l);
10713 68 : if (e == 0 && r_address_type != CONS) { e = ASN1_BAD_ID; }
10714 68 : if(e) {
10715 68 : (data)->r_address = NULL;
10716 : } else {
10717 0 : (data)->r_address = calloc(1, sizeof(*(data)->r_address));
10718 0 : if ((data)->r_address == NULL) { e = ENOMEM; goto fail; }
10719 0 : p += l; len -= l; ret += l;
10720 0 : r_address_oldlen = len;
10721 0 : if (r_address_datalen > len) { e = ASN1_OVERRUN; goto fail; }
10722 0 : len = r_address_datalen;
10723 0 : e = decode_HostAddress(p, len, (data)->r_address, &l);
10724 0 : if(e) goto fail;
10725 0 : p += l; len -= l; ret += l;
10726 0 : len = r_address_oldlen - r_address_datalen;
10727 : }
10728 : }
10729 68 : len = Top_Tag_oldlen - Top_Tag_datalen;
10730 : }
10731 68 : len = Top_oldlen - Top_datalen;
10732 : }
10733 136 : if(size) *size = ret;
10734 68 : return 0;
10735 0 : fail:
10736 0 : free_EncKrbPrivPart(data);
10737 0 : return e;
10738 : }
10739 :
10740 : void ASN1CALL
10741 68 : free_EncKrbPrivPart(EncKrbPrivPart *data)
10742 : {
10743 68 : der_free_octet_string(&(data)->user_data);
10744 68 : if((data)->timestamp) {
10745 0 : free_KerberosTime((data)->timestamp);
10746 0 : free((data)->timestamp);
10747 0 : (data)->timestamp = NULL;
10748 : }
10749 68 : if((data)->usec) {
10750 0 : free_krb5int32((data)->usec);
10751 0 : free((data)->usec);
10752 0 : (data)->usec = NULL;
10753 : }
10754 68 : if((data)->seq_number) {
10755 68 : free_krb5uint32((data)->seq_number);
10756 68 : free((data)->seq_number);
10757 68 : (data)->seq_number = NULL;
10758 : }
10759 68 : if((data)->s_address) {
10760 68 : free_HostAddress((data)->s_address);
10761 68 : free((data)->s_address);
10762 68 : (data)->s_address = NULL;
10763 : }
10764 68 : if((data)->r_address) {
10765 0 : free_HostAddress((data)->r_address);
10766 0 : free((data)->r_address);
10767 0 : (data)->r_address = NULL;
10768 : }
10769 68 : }
10770 :
10771 : size_t ASN1CALL
10772 68 : length_EncKrbPrivPart(const EncKrbPrivPart *data)
10773 : {
10774 68 : size_t ret = 0;
10775 : {
10776 68 : size_t Top_tag_tag_oldret = ret;
10777 68 : ret = 0;
10778 68 : ret += der_length_octet_string(&(data)->user_data);
10779 68 : ret += 1 + der_length_len (ret);
10780 68 : ret += 1 + der_length_len (ret);
10781 68 : ret += Top_tag_tag_oldret;
10782 : }
10783 68 : if((data)->timestamp){
10784 0 : size_t Top_tag_tag_oldret = ret;
10785 0 : ret = 0;
10786 0 : ret += length_KerberosTime((data)->timestamp);
10787 0 : ret += 1 + der_length_len (ret);
10788 0 : ret += Top_tag_tag_oldret;
10789 : }
10790 68 : if((data)->usec){
10791 0 : size_t Top_tag_tag_oldret = ret;
10792 0 : ret = 0;
10793 0 : ret += length_krb5int32((data)->usec);
10794 0 : ret += 1 + der_length_len (ret);
10795 0 : ret += Top_tag_tag_oldret;
10796 : }
10797 68 : if((data)->seq_number){
10798 68 : size_t Top_tag_tag_oldret = ret;
10799 68 : ret = 0;
10800 68 : ret += length_krb5uint32((data)->seq_number);
10801 68 : ret += 1 + der_length_len (ret);
10802 68 : ret += Top_tag_tag_oldret;
10803 : }
10804 68 : if((data)->s_address){
10805 68 : size_t Top_tag_tag_oldret = ret;
10806 68 : ret = 0;
10807 68 : ret += length_HostAddress((data)->s_address);
10808 68 : ret += 1 + der_length_len (ret);
10809 68 : ret += Top_tag_tag_oldret;
10810 : }
10811 68 : if((data)->r_address){
10812 0 : size_t Top_tag_tag_oldret = ret;
10813 0 : ret = 0;
10814 0 : ret += length_HostAddress((data)->r_address);
10815 0 : ret += 1 + der_length_len (ret);
10816 0 : ret += Top_tag_tag_oldret;
10817 : }
10818 68 : ret += 1 + der_length_len (ret);
10819 68 : ret += 1 + der_length_len (ret);
10820 68 : return ret;
10821 : }
10822 :
10823 : int ASN1CALL
10824 0 : copy_EncKrbPrivPart(const EncKrbPrivPart *from, EncKrbPrivPart *to)
10825 : {
10826 0 : memset(to, 0, sizeof(*to));
10827 0 : if(der_copy_octet_string(&(from)->user_data, &(to)->user_data)) goto fail;
10828 0 : if((from)->timestamp) {
10829 0 : (to)->timestamp = malloc(sizeof(*(to)->timestamp));
10830 0 : if((to)->timestamp == NULL) goto fail;
10831 0 : if(copy_KerberosTime((from)->timestamp, (to)->timestamp)) goto fail;
10832 : }else
10833 0 : (to)->timestamp = NULL;
10834 0 : if((from)->usec) {
10835 0 : (to)->usec = malloc(sizeof(*(to)->usec));
10836 0 : if((to)->usec == NULL) goto fail;
10837 0 : if(copy_krb5int32((from)->usec, (to)->usec)) goto fail;
10838 : }else
10839 0 : (to)->usec = NULL;
10840 0 : if((from)->seq_number) {
10841 0 : (to)->seq_number = malloc(sizeof(*(to)->seq_number));
10842 0 : if((to)->seq_number == NULL) goto fail;
10843 0 : if(copy_krb5uint32((from)->seq_number, (to)->seq_number)) goto fail;
10844 : }else
10845 0 : (to)->seq_number = NULL;
10846 0 : if((from)->s_address) {
10847 0 : (to)->s_address = malloc(sizeof(*(to)->s_address));
10848 0 : if((to)->s_address == NULL) goto fail;
10849 0 : if(copy_HostAddress((from)->s_address, (to)->s_address)) goto fail;
10850 : }else
10851 0 : (to)->s_address = NULL;
10852 0 : if((from)->r_address) {
10853 0 : (to)->r_address = malloc(sizeof(*(to)->r_address));
10854 0 : if((to)->r_address == NULL) goto fail;
10855 0 : if(copy_HostAddress((from)->r_address, (to)->r_address)) goto fail;
10856 : }else
10857 0 : (to)->r_address = NULL;
10858 0 : return 0;
10859 0 : fail:
10860 0 : free_EncKrbPrivPart(to);
10861 0 : return ENOMEM;
10862 : }
10863 :
10864 : int ASN1CALL
10865 19181 : encode_KRB_CRED(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const KRB_CRED *data, size_t *size)
10866 : {
10867 19181 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
10868 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
10869 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
10870 :
10871 : /* enc-part */
10872 : {
10873 19181 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
10874 19181 : ret = 0;
10875 19181 : e = encode_EncryptedData(p, len, &(data)->enc_part, &l);
10876 19181 : if (e) return e;
10877 19181 : p -= l; len -= l; ret += l;
10878 :
10879 19181 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 3, &l);
10880 19181 : if (e) return e;
10881 19181 : p -= l; len -= l; ret += l;
10882 :
10883 19181 : ret += Top_tag_tag_oldret;
10884 : }
10885 : /* tickets */
10886 : {
10887 19181 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
10888 19181 : ret = 0;
10889 38362 : for(i = (int)(&(data)->tickets)->len - 1; i >= 0; --i) {
10890 19181 : size_t tickets_tag_tag_for_oldret = ret;
10891 19181 : ret = 0;
10892 19181 : e = encode_Ticket(p, len, &(&(data)->tickets)->val[i], &l);
10893 19181 : if (e) return e;
10894 19181 : p -= l; len -= l; ret += l;
10895 :
10896 19181 : ret += tickets_tag_tag_for_oldret;
10897 : }
10898 19181 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
10899 19181 : if (e) return e;
10900 19181 : p -= l; len -= l; ret += l;
10901 :
10902 19181 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
10903 19181 : if (e) return e;
10904 19181 : p -= l; len -= l; ret += l;
10905 :
10906 19181 : ret += Top_tag_tag_oldret;
10907 : }
10908 : /* msg-type */
10909 : {
10910 19181 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
10911 19181 : ret = 0;
10912 19181 : e = encode_MESSAGE_TYPE(p, len, &(data)->msg_type, &l);
10913 19181 : if (e) return e;
10914 19181 : p -= l; len -= l; ret += l;
10915 :
10916 19181 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
10917 19181 : if (e) return e;
10918 19181 : p -= l; len -= l; ret += l;
10919 :
10920 19181 : ret += Top_tag_tag_oldret;
10921 : }
10922 : /* pvno */
10923 : {
10924 19181 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
10925 19181 : ret = 0;
10926 19181 : e = encode_krb5int32(p, len, &(data)->pvno, &l);
10927 19181 : if (e) return e;
10928 19181 : p -= l; len -= l; ret += l;
10929 :
10930 19181 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
10931 19181 : if (e) return e;
10932 19181 : p -= l; len -= l; ret += l;
10933 :
10934 19181 : ret += Top_tag_tag_oldret;
10935 : }
10936 19181 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
10937 19181 : if (e) return e;
10938 19181 : p -= l; len -= l; ret += l;
10939 :
10940 19181 : e = der_put_length_and_tag (p, len, ret, ASN1_C_APPL, CONS, 22, &l);
10941 19181 : if (e) return e;
10942 19181 : p -= l; len -= l; ret += l;
10943 :
10944 19181 : *size = ret;
10945 19181 : return 0;
10946 : }
10947 :
10948 : int ASN1CALL
10949 19022 : decode_KRB_CRED(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, KRB_CRED *data, size_t *size)
10950 : {
10951 19022 : size_t ret = 0;
10952 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
10953 : int e HEIMDAL_UNUSED_ATTRIBUTE;
10954 :
10955 19022 : memset(data, 0, sizeof(*data));
10956 : {
10957 : size_t Top_datalen, Top_oldlen;
10958 : Der_type Top_type;
10959 19022 : e = der_match_tag_and_length(p, len, ASN1_C_APPL, &Top_type, 22, &Top_datalen, &l);
10960 19022 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
10961 19022 : if(e) goto fail;
10962 19022 : p += l; len -= l; ret += l;
10963 19022 : Top_oldlen = len;
10964 19022 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
10965 19022 : len = Top_datalen;
10966 : {
10967 : size_t Top_Tag_datalen, Top_Tag_oldlen;
10968 : Der_type Top_Tag_type;
10969 19022 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_Tag_type, UT_Sequence, &Top_Tag_datalen, &l);
10970 19022 : if (e == 0 && Top_Tag_type != CONS) { e = ASN1_BAD_ID; }
10971 19022 : if(e) goto fail;
10972 19022 : p += l; len -= l; ret += l;
10973 19022 : Top_Tag_oldlen = len;
10974 19022 : if (Top_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
10975 19022 : len = Top_Tag_datalen;
10976 : {
10977 : size_t pvno_datalen, pvno_oldlen;
10978 : Der_type pvno_type;
10979 19022 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &pvno_type, 0, &pvno_datalen, &l);
10980 19022 : if (e == 0 && pvno_type != CONS) { e = ASN1_BAD_ID; }
10981 19022 : if(e) goto fail;
10982 19022 : p += l; len -= l; ret += l;
10983 19022 : pvno_oldlen = len;
10984 19022 : if (pvno_datalen > len) { e = ASN1_OVERRUN; goto fail; }
10985 19022 : len = pvno_datalen;
10986 19022 : e = decode_krb5int32(p, len, &(data)->pvno, &l);
10987 19022 : if(e) goto fail;
10988 19022 : p += l; len -= l; ret += l;
10989 19022 : len = pvno_oldlen - pvno_datalen;
10990 : }
10991 : {
10992 : size_t msg_type_datalen, msg_type_oldlen;
10993 : Der_type msg_type_type;
10994 19022 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &msg_type_type, 1, &msg_type_datalen, &l);
10995 37306 : if (e == 0 && msg_type_type != CONS) { e = ASN1_BAD_ID; }
10996 19022 : if(e) goto fail;
10997 19022 : p += l; len -= l; ret += l;
10998 19022 : msg_type_oldlen = len;
10999 19022 : if (msg_type_datalen > len) { e = ASN1_OVERRUN; goto fail; }
11000 19022 : len = msg_type_datalen;
11001 19022 : e = decode_MESSAGE_TYPE(p, len, &(data)->msg_type, &l);
11002 19022 : if(e) goto fail;
11003 19022 : p += l; len -= l; ret += l;
11004 19022 : len = msg_type_oldlen - msg_type_datalen;
11005 : }
11006 : {
11007 : size_t tickets_datalen, tickets_oldlen;
11008 : Der_type tickets_type;
11009 19022 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &tickets_type, 2, &tickets_datalen, &l);
11010 37306 : if (e == 0 && tickets_type != CONS) { e = ASN1_BAD_ID; }
11011 19022 : if(e) goto fail;
11012 19022 : p += l; len -= l; ret += l;
11013 19022 : tickets_oldlen = len;
11014 19022 : if (tickets_datalen > len) { e = ASN1_OVERRUN; goto fail; }
11015 19022 : len = tickets_datalen;
11016 : {
11017 : size_t tickets_Tag_datalen, tickets_Tag_oldlen;
11018 : Der_type tickets_Tag_type;
11019 19022 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &tickets_Tag_type, UT_Sequence, &tickets_Tag_datalen, &l);
11020 19022 : if (e == 0 && tickets_Tag_type != CONS) { e = ASN1_BAD_ID; }
11021 19022 : if(e) goto fail;
11022 19022 : p += l; len -= l; ret += l;
11023 19022 : tickets_Tag_oldlen = len;
11024 19022 : if (tickets_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
11025 19022 : len = tickets_Tag_datalen;
11026 : {
11027 19022 : size_t tickets_Tag_Tag_origlen = len;
11028 19022 : size_t tickets_Tag_Tag_oldret = ret;
11029 19022 : size_t tickets_Tag_Tag_olen = 0;
11030 : void *tickets_Tag_Tag_tmp;
11031 19022 : ret = 0;
11032 19022 : (&(data)->tickets)->len = 0;
11033 19022 : (&(data)->tickets)->val = NULL;
11034 57066 : while(ret < tickets_Tag_Tag_origlen) {
11035 19022 : size_t tickets_Tag_Tag_nlen = tickets_Tag_Tag_olen + sizeof(*((&(data)->tickets)->val));
11036 19022 : if (tickets_Tag_Tag_olen > tickets_Tag_Tag_nlen) { e = ASN1_OVERFLOW; goto fail; }
11037 19022 : tickets_Tag_Tag_olen = tickets_Tag_Tag_nlen;
11038 19022 : tickets_Tag_Tag_tmp = realloc((&(data)->tickets)->val, tickets_Tag_Tag_olen);
11039 19022 : if (tickets_Tag_Tag_tmp == NULL) { e = ENOMEM; goto fail; }
11040 19022 : (&(data)->tickets)->val = tickets_Tag_Tag_tmp;
11041 19022 : e = decode_Ticket(p, len, &(&(data)->tickets)->val[(&(data)->tickets)->len], &l);
11042 19022 : if(e) goto fail;
11043 19022 : p += l; len -= l; ret += l;
11044 19022 : (&(data)->tickets)->len++;
11045 19022 : len = tickets_Tag_Tag_origlen - ret;
11046 : }
11047 19022 : ret += tickets_Tag_Tag_oldret;
11048 : }
11049 19022 : len = tickets_Tag_oldlen - tickets_Tag_datalen;
11050 : }
11051 19022 : len = tickets_oldlen - tickets_datalen;
11052 : }
11053 : {
11054 : size_t enc_part_datalen, enc_part_oldlen;
11055 : Der_type enc_part_type;
11056 19022 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &enc_part_type, 3, &enc_part_datalen, &l);
11057 37306 : if (e == 0 && enc_part_type != CONS) { e = ASN1_BAD_ID; }
11058 19022 : if(e) goto fail;
11059 19022 : p += l; len -= l; ret += l;
11060 19022 : enc_part_oldlen = len;
11061 19022 : if (enc_part_datalen > len) { e = ASN1_OVERRUN; goto fail; }
11062 19022 : len = enc_part_datalen;
11063 19022 : e = decode_EncryptedData(p, len, &(data)->enc_part, &l);
11064 19022 : if(e) goto fail;
11065 19022 : p += l; len -= l; ret += l;
11066 19022 : len = enc_part_oldlen - enc_part_datalen;
11067 : }
11068 19022 : len = Top_Tag_oldlen - Top_Tag_datalen;
11069 : }
11070 19022 : len = Top_oldlen - Top_datalen;
11071 : }
11072 38044 : if(size) *size = ret;
11073 18284 : return 0;
11074 0 : fail:
11075 0 : free_KRB_CRED(data);
11076 0 : return e;
11077 : }
11078 :
11079 : void ASN1CALL
11080 38203 : free_KRB_CRED(KRB_CRED *data)
11081 : {
11082 38203 : free_krb5int32(&(data)->pvno);
11083 38203 : free_MESSAGE_TYPE(&(data)->msg_type);
11084 114609 : while((&(data)->tickets)->len){
11085 38203 : free_Ticket(&(&(data)->tickets)->val[(&(data)->tickets)->len-1]);
11086 38203 : (&(data)->tickets)->len--;
11087 : }
11088 38203 : free((&(data)->tickets)->val);
11089 38203 : (&(data)->tickets)->val = NULL;
11090 38203 : free_EncryptedData(&(data)->enc_part);
11091 38203 : }
11092 :
11093 : size_t ASN1CALL
11094 19181 : length_KRB_CRED(const KRB_CRED *data)
11095 : {
11096 19181 : size_t ret = 0;
11097 : {
11098 19181 : size_t Top_tag_tag_oldret = ret;
11099 19181 : ret = 0;
11100 19181 : ret += length_krb5int32(&(data)->pvno);
11101 19181 : ret += 1 + der_length_len (ret);
11102 19181 : ret += Top_tag_tag_oldret;
11103 : }
11104 : {
11105 19181 : size_t Top_tag_tag_oldret = ret;
11106 19181 : ret = 0;
11107 19181 : ret += length_MESSAGE_TYPE(&(data)->msg_type);
11108 19181 : ret += 1 + der_length_len (ret);
11109 19181 : ret += Top_tag_tag_oldret;
11110 : }
11111 : {
11112 19181 : size_t Top_tag_tag_oldret = ret;
11113 19181 : ret = 0;
11114 : {
11115 19181 : size_t tickets_tag_tag_oldret = ret;
11116 : int i;
11117 19181 : ret = 0;
11118 38362 : for(i = (&(data)->tickets)->len - 1; i >= 0; --i){
11119 19181 : size_t tickets_tag_tag_for_oldret = ret;
11120 19181 : ret = 0;
11121 19181 : ret += length_Ticket(&(&(data)->tickets)->val[i]);
11122 19181 : ret += tickets_tag_tag_for_oldret;
11123 : }
11124 19181 : ret += tickets_tag_tag_oldret;
11125 : }
11126 19181 : ret += 1 + der_length_len (ret);
11127 19181 : ret += 1 + der_length_len (ret);
11128 19181 : ret += Top_tag_tag_oldret;
11129 : }
11130 : {
11131 19181 : size_t Top_tag_tag_oldret = ret;
11132 19181 : ret = 0;
11133 19181 : ret += length_EncryptedData(&(data)->enc_part);
11134 19181 : ret += 1 + der_length_len (ret);
11135 19181 : ret += Top_tag_tag_oldret;
11136 : }
11137 19181 : ret += 1 + der_length_len (ret);
11138 19181 : ret += 1 + der_length_len (ret);
11139 19181 : return ret;
11140 : }
11141 :
11142 : int ASN1CALL
11143 0 : copy_KRB_CRED(const KRB_CRED *from, KRB_CRED *to)
11144 : {
11145 0 : memset(to, 0, sizeof(*to));
11146 0 : if(copy_krb5int32(&(from)->pvno, &(to)->pvno)) goto fail;
11147 0 : if(copy_MESSAGE_TYPE(&(from)->msg_type, &(to)->msg_type)) goto fail;
11148 0 : if(((&(to)->tickets)->val = malloc((&(from)->tickets)->len * sizeof(*(&(to)->tickets)->val))) == NULL && (&(from)->tickets)->len != 0)
11149 0 : goto fail;
11150 0 : for((&(to)->tickets)->len = 0; (&(to)->tickets)->len < (&(from)->tickets)->len; (&(to)->tickets)->len++){
11151 0 : if(copy_Ticket(&(&(from)->tickets)->val[(&(to)->tickets)->len], &(&(to)->tickets)->val[(&(to)->tickets)->len])) goto fail;
11152 : }
11153 0 : if(copy_EncryptedData(&(from)->enc_part, &(to)->enc_part)) goto fail;
11154 0 : return 0;
11155 0 : fail:
11156 0 : free_KRB_CRED(to);
11157 0 : return ENOMEM;
11158 : }
11159 :
11160 : int ASN1CALL
11161 19181 : encode_KrbCredInfo(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const KrbCredInfo *data, size_t *size)
11162 : {
11163 19181 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
11164 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
11165 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
11166 :
11167 : /* caddr */
11168 19181 : if((data)->caddr) {
11169 19181 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
11170 19181 : ret = 0;
11171 19181 : e = encode_HostAddresses(p, len, (data)->caddr, &l);
11172 19181 : if (e) return e;
11173 19181 : p -= l; len -= l; ret += l;
11174 :
11175 19181 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 10, &l);
11176 19181 : if (e) return e;
11177 19181 : p -= l; len -= l; ret += l;
11178 :
11179 19181 : ret += Top_tag_oldret;
11180 : }
11181 : /* sname */
11182 19181 : if((data)->sname) {
11183 19181 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
11184 19181 : ret = 0;
11185 19181 : e = encode_PrincipalName(p, len, (data)->sname, &l);
11186 19181 : if (e) return e;
11187 19181 : p -= l; len -= l; ret += l;
11188 :
11189 19181 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 9, &l);
11190 19181 : if (e) return e;
11191 19181 : p -= l; len -= l; ret += l;
11192 :
11193 19181 : ret += Top_tag_oldret;
11194 : }
11195 : /* srealm */
11196 19181 : if((data)->srealm) {
11197 19181 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
11198 19181 : ret = 0;
11199 19181 : e = encode_Realm(p, len, (data)->srealm, &l);
11200 19181 : if (e) return e;
11201 19181 : p -= l; len -= l; ret += l;
11202 :
11203 19181 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 8, &l);
11204 19181 : if (e) return e;
11205 19181 : p -= l; len -= l; ret += l;
11206 :
11207 19181 : ret += Top_tag_oldret;
11208 : }
11209 : /* renew-till */
11210 19181 : if((data)->renew_till) {
11211 19181 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
11212 19181 : ret = 0;
11213 19181 : e = encode_KerberosTime(p, len, (data)->renew_till, &l);
11214 19181 : if (e) return e;
11215 19181 : p -= l; len -= l; ret += l;
11216 :
11217 19181 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 7, &l);
11218 19181 : if (e) return e;
11219 19181 : p -= l; len -= l; ret += l;
11220 :
11221 19181 : ret += Top_tag_oldret;
11222 : }
11223 : /* endtime */
11224 19181 : if((data)->endtime) {
11225 19181 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
11226 19181 : ret = 0;
11227 19181 : e = encode_KerberosTime(p, len, (data)->endtime, &l);
11228 19181 : if (e) return e;
11229 19181 : p -= l; len -= l; ret += l;
11230 :
11231 19181 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 6, &l);
11232 19181 : if (e) return e;
11233 19181 : p -= l; len -= l; ret += l;
11234 :
11235 19181 : ret += Top_tag_oldret;
11236 : }
11237 : /* starttime */
11238 19181 : if((data)->starttime) {
11239 19181 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
11240 19181 : ret = 0;
11241 19181 : e = encode_KerberosTime(p, len, (data)->starttime, &l);
11242 19181 : if (e) return e;
11243 19181 : p -= l; len -= l; ret += l;
11244 :
11245 19181 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 5, &l);
11246 19181 : if (e) return e;
11247 19181 : p -= l; len -= l; ret += l;
11248 :
11249 19181 : ret += Top_tag_oldret;
11250 : }
11251 : /* authtime */
11252 19181 : if((data)->authtime) {
11253 19181 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
11254 19181 : ret = 0;
11255 19181 : e = encode_KerberosTime(p, len, (data)->authtime, &l);
11256 19181 : if (e) return e;
11257 19181 : p -= l; len -= l; ret += l;
11258 :
11259 19181 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 4, &l);
11260 19181 : if (e) return e;
11261 19181 : p -= l; len -= l; ret += l;
11262 :
11263 19181 : ret += Top_tag_oldret;
11264 : }
11265 : /* flags */
11266 19181 : if((data)->flags) {
11267 19181 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
11268 19181 : ret = 0;
11269 19181 : e = encode_TicketFlags(p, len, (data)->flags, &l);
11270 19181 : if (e) return e;
11271 19181 : p -= l; len -= l; ret += l;
11272 :
11273 19181 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 3, &l);
11274 19181 : if (e) return e;
11275 19181 : p -= l; len -= l; ret += l;
11276 :
11277 19181 : ret += Top_tag_oldret;
11278 : }
11279 : /* pname */
11280 19181 : if((data)->pname) {
11281 19181 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
11282 19181 : ret = 0;
11283 19181 : e = encode_PrincipalName(p, len, (data)->pname, &l);
11284 19181 : if (e) return e;
11285 19181 : p -= l; len -= l; ret += l;
11286 :
11287 19181 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
11288 19181 : if (e) return e;
11289 19181 : p -= l; len -= l; ret += l;
11290 :
11291 19181 : ret += Top_tag_oldret;
11292 : }
11293 : /* prealm */
11294 19181 : if((data)->prealm) {
11295 19181 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
11296 19181 : ret = 0;
11297 19181 : e = encode_Realm(p, len, (data)->prealm, &l);
11298 19181 : if (e) return e;
11299 19181 : p -= l; len -= l; ret += l;
11300 :
11301 19181 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
11302 19181 : if (e) return e;
11303 19181 : p -= l; len -= l; ret += l;
11304 :
11305 19181 : ret += Top_tag_oldret;
11306 : }
11307 : /* key */
11308 : {
11309 19181 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
11310 19181 : ret = 0;
11311 19181 : e = encode_EncryptionKey(p, len, &(data)->key, &l);
11312 19181 : if (e) return e;
11313 19181 : p -= l; len -= l; ret += l;
11314 :
11315 19181 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
11316 19181 : if (e) return e;
11317 19181 : p -= l; len -= l; ret += l;
11318 :
11319 19181 : ret += Top_tag_oldret;
11320 : }
11321 19181 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
11322 19181 : if (e) return e;
11323 19181 : p -= l; len -= l; ret += l;
11324 :
11325 19181 : *size = ret;
11326 19181 : return 0;
11327 : }
11328 :
11329 : int ASN1CALL
11330 19022 : decode_KrbCredInfo(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, KrbCredInfo *data, size_t *size)
11331 : {
11332 19022 : size_t ret = 0;
11333 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
11334 : int e HEIMDAL_UNUSED_ATTRIBUTE;
11335 :
11336 19022 : memset(data, 0, sizeof(*data));
11337 : {
11338 : size_t Top_datalen, Top_oldlen;
11339 : Der_type Top_type;
11340 19022 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
11341 19022 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
11342 19022 : if(e) goto fail;
11343 19022 : p += l; len -= l; ret += l;
11344 19022 : Top_oldlen = len;
11345 19022 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
11346 19022 : len = Top_datalen;
11347 : {
11348 : size_t key_datalen, key_oldlen;
11349 : Der_type key_type;
11350 19022 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &key_type, 0, &key_datalen, &l);
11351 19022 : if (e == 0 && key_type != CONS) { e = ASN1_BAD_ID; }
11352 19022 : if(e) goto fail;
11353 19022 : p += l; len -= l; ret += l;
11354 19022 : key_oldlen = len;
11355 19022 : if (key_datalen > len) { e = ASN1_OVERRUN; goto fail; }
11356 19022 : len = key_datalen;
11357 19022 : e = decode_EncryptionKey(p, len, &(data)->key, &l);
11358 19022 : if(e) goto fail;
11359 19022 : p += l; len -= l; ret += l;
11360 19022 : len = key_oldlen - key_datalen;
11361 : }
11362 : {
11363 : size_t prealm_datalen, prealm_oldlen;
11364 : Der_type prealm_type;
11365 19022 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &prealm_type, 1, &prealm_datalen, &l);
11366 37306 : if (e == 0 && prealm_type != CONS) { e = ASN1_BAD_ID; }
11367 19022 : if(e) {
11368 0 : (data)->prealm = NULL;
11369 : } else {
11370 19022 : (data)->prealm = calloc(1, sizeof(*(data)->prealm));
11371 19022 : if ((data)->prealm == NULL) { e = ENOMEM; goto fail; }
11372 19022 : p += l; len -= l; ret += l;
11373 19022 : prealm_oldlen = len;
11374 19022 : if (prealm_datalen > len) { e = ASN1_OVERRUN; goto fail; }
11375 19022 : len = prealm_datalen;
11376 19022 : e = decode_Realm(p, len, (data)->prealm, &l);
11377 19022 : if(e) goto fail;
11378 19022 : p += l; len -= l; ret += l;
11379 19022 : len = prealm_oldlen - prealm_datalen;
11380 : }
11381 : }
11382 : {
11383 : size_t pname_datalen, pname_oldlen;
11384 : Der_type pname_type;
11385 19022 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &pname_type, 2, &pname_datalen, &l);
11386 38044 : if (e == 0 && pname_type != CONS) { e = ASN1_BAD_ID; }
11387 19022 : if(e) {
11388 0 : (data)->pname = NULL;
11389 : } else {
11390 19022 : (data)->pname = calloc(1, sizeof(*(data)->pname));
11391 19022 : if ((data)->pname == NULL) { e = ENOMEM; goto fail; }
11392 19022 : p += l; len -= l; ret += l;
11393 19022 : pname_oldlen = len;
11394 19022 : if (pname_datalen > len) { e = ASN1_OVERRUN; goto fail; }
11395 19022 : len = pname_datalen;
11396 19022 : e = decode_PrincipalName(p, len, (data)->pname, &l);
11397 19022 : if(e) goto fail;
11398 19022 : p += l; len -= l; ret += l;
11399 19022 : len = pname_oldlen - pname_datalen;
11400 : }
11401 : }
11402 : {
11403 : size_t flags_datalen, flags_oldlen;
11404 : Der_type flags_type;
11405 19022 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &flags_type, 3, &flags_datalen, &l);
11406 38044 : if (e == 0 && flags_type != CONS) { e = ASN1_BAD_ID; }
11407 19022 : if(e) {
11408 0 : (data)->flags = NULL;
11409 : } else {
11410 19022 : (data)->flags = calloc(1, sizeof(*(data)->flags));
11411 19022 : if ((data)->flags == NULL) { e = ENOMEM; goto fail; }
11412 19022 : p += l; len -= l; ret += l;
11413 19022 : flags_oldlen = len;
11414 19022 : if (flags_datalen > len) { e = ASN1_OVERRUN; goto fail; }
11415 19022 : len = flags_datalen;
11416 19022 : e = decode_TicketFlags(p, len, (data)->flags, &l);
11417 19022 : if(e) goto fail;
11418 19022 : p += l; len -= l; ret += l;
11419 19022 : len = flags_oldlen - flags_datalen;
11420 : }
11421 : }
11422 : {
11423 : size_t authtime_datalen, authtime_oldlen;
11424 : Der_type authtime_type;
11425 19022 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &authtime_type, 4, &authtime_datalen, &l);
11426 38044 : if (e == 0 && authtime_type != CONS) { e = ASN1_BAD_ID; }
11427 19022 : if(e) {
11428 0 : (data)->authtime = NULL;
11429 : } else {
11430 19022 : (data)->authtime = calloc(1, sizeof(*(data)->authtime));
11431 19022 : if ((data)->authtime == NULL) { e = ENOMEM; goto fail; }
11432 19022 : p += l; len -= l; ret += l;
11433 19022 : authtime_oldlen = len;
11434 19022 : if (authtime_datalen > len) { e = ASN1_OVERRUN; goto fail; }
11435 19022 : len = authtime_datalen;
11436 19022 : e = decode_KerberosTime(p, len, (data)->authtime, &l);
11437 19022 : if(e) goto fail;
11438 19022 : p += l; len -= l; ret += l;
11439 19022 : len = authtime_oldlen - authtime_datalen;
11440 : }
11441 : }
11442 : {
11443 : size_t starttime_datalen, starttime_oldlen;
11444 : Der_type starttime_type;
11445 19022 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &starttime_type, 5, &starttime_datalen, &l);
11446 38044 : if (e == 0 && starttime_type != CONS) { e = ASN1_BAD_ID; }
11447 19022 : if(e) {
11448 0 : (data)->starttime = NULL;
11449 : } else {
11450 19022 : (data)->starttime = calloc(1, sizeof(*(data)->starttime));
11451 19022 : if ((data)->starttime == NULL) { e = ENOMEM; goto fail; }
11452 19022 : p += l; len -= l; ret += l;
11453 19022 : starttime_oldlen = len;
11454 19022 : if (starttime_datalen > len) { e = ASN1_OVERRUN; goto fail; }
11455 19022 : len = starttime_datalen;
11456 19022 : e = decode_KerberosTime(p, len, (data)->starttime, &l);
11457 19022 : if(e) goto fail;
11458 19022 : p += l; len -= l; ret += l;
11459 19022 : len = starttime_oldlen - starttime_datalen;
11460 : }
11461 : }
11462 : {
11463 : size_t endtime_datalen, endtime_oldlen;
11464 : Der_type endtime_type;
11465 19022 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &endtime_type, 6, &endtime_datalen, &l);
11466 38044 : if (e == 0 && endtime_type != CONS) { e = ASN1_BAD_ID; }
11467 19022 : if(e) {
11468 0 : (data)->endtime = NULL;
11469 : } else {
11470 19022 : (data)->endtime = calloc(1, sizeof(*(data)->endtime));
11471 19022 : if ((data)->endtime == NULL) { e = ENOMEM; goto fail; }
11472 19022 : p += l; len -= l; ret += l;
11473 19022 : endtime_oldlen = len;
11474 19022 : if (endtime_datalen > len) { e = ASN1_OVERRUN; goto fail; }
11475 19022 : len = endtime_datalen;
11476 19022 : e = decode_KerberosTime(p, len, (data)->endtime, &l);
11477 19022 : if(e) goto fail;
11478 19022 : p += l; len -= l; ret += l;
11479 19022 : len = endtime_oldlen - endtime_datalen;
11480 : }
11481 : }
11482 : {
11483 : size_t renew_till_datalen, renew_till_oldlen;
11484 : Der_type renew_till_type;
11485 19022 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &renew_till_type, 7, &renew_till_datalen, &l);
11486 38044 : if (e == 0 && renew_till_type != CONS) { e = ASN1_BAD_ID; }
11487 19022 : if(e) {
11488 0 : (data)->renew_till = NULL;
11489 : } else {
11490 19022 : (data)->renew_till = calloc(1, sizeof(*(data)->renew_till));
11491 19022 : if ((data)->renew_till == NULL) { e = ENOMEM; goto fail; }
11492 19022 : p += l; len -= l; ret += l;
11493 19022 : renew_till_oldlen = len;
11494 19022 : if (renew_till_datalen > len) { e = ASN1_OVERRUN; goto fail; }
11495 19022 : len = renew_till_datalen;
11496 19022 : e = decode_KerberosTime(p, len, (data)->renew_till, &l);
11497 19022 : if(e) goto fail;
11498 19022 : p += l; len -= l; ret += l;
11499 19022 : len = renew_till_oldlen - renew_till_datalen;
11500 : }
11501 : }
11502 : {
11503 : size_t srealm_datalen, srealm_oldlen;
11504 : Der_type srealm_type;
11505 19022 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &srealm_type, 8, &srealm_datalen, &l);
11506 38044 : if (e == 0 && srealm_type != CONS) { e = ASN1_BAD_ID; }
11507 19022 : if(e) {
11508 0 : (data)->srealm = NULL;
11509 : } else {
11510 19022 : (data)->srealm = calloc(1, sizeof(*(data)->srealm));
11511 19022 : if ((data)->srealm == NULL) { e = ENOMEM; goto fail; }
11512 19022 : p += l; len -= l; ret += l;
11513 19022 : srealm_oldlen = len;
11514 19022 : if (srealm_datalen > len) { e = ASN1_OVERRUN; goto fail; }
11515 19022 : len = srealm_datalen;
11516 19022 : e = decode_Realm(p, len, (data)->srealm, &l);
11517 19022 : if(e) goto fail;
11518 19022 : p += l; len -= l; ret += l;
11519 19022 : len = srealm_oldlen - srealm_datalen;
11520 : }
11521 : }
11522 : {
11523 : size_t sname_datalen, sname_oldlen;
11524 : Der_type sname_type;
11525 19022 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &sname_type, 9, &sname_datalen, &l);
11526 38044 : if (e == 0 && sname_type != CONS) { e = ASN1_BAD_ID; }
11527 19022 : if(e) {
11528 0 : (data)->sname = NULL;
11529 : } else {
11530 19022 : (data)->sname = calloc(1, sizeof(*(data)->sname));
11531 19022 : if ((data)->sname == NULL) { e = ENOMEM; goto fail; }
11532 19022 : p += l; len -= l; ret += l;
11533 19022 : sname_oldlen = len;
11534 19022 : if (sname_datalen > len) { e = ASN1_OVERRUN; goto fail; }
11535 19022 : len = sname_datalen;
11536 19022 : e = decode_PrincipalName(p, len, (data)->sname, &l);
11537 19022 : if(e) goto fail;
11538 19022 : p += l; len -= l; ret += l;
11539 19022 : len = sname_oldlen - sname_datalen;
11540 : }
11541 : }
11542 : {
11543 : size_t caddr_datalen, caddr_oldlen;
11544 : Der_type caddr_type;
11545 19022 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &caddr_type, 10, &caddr_datalen, &l);
11546 38044 : if (e == 0 && caddr_type != CONS) { e = ASN1_BAD_ID; }
11547 19022 : if(e) {
11548 0 : (data)->caddr = NULL;
11549 : } else {
11550 19022 : (data)->caddr = calloc(1, sizeof(*(data)->caddr));
11551 19022 : if ((data)->caddr == NULL) { e = ENOMEM; goto fail; }
11552 19022 : p += l; len -= l; ret += l;
11553 19022 : caddr_oldlen = len;
11554 19022 : if (caddr_datalen > len) { e = ASN1_OVERRUN; goto fail; }
11555 19022 : len = caddr_datalen;
11556 19022 : e = decode_HostAddresses(p, len, (data)->caddr, &l);
11557 19022 : if(e) goto fail;
11558 19022 : p += l; len -= l; ret += l;
11559 19022 : len = caddr_oldlen - caddr_datalen;
11560 : }
11561 : }
11562 19022 : len = Top_oldlen - Top_datalen;
11563 : }
11564 38044 : if(size) *size = ret;
11565 18284 : return 0;
11566 0 : fail:
11567 0 : free_KrbCredInfo(data);
11568 0 : return e;
11569 : }
11570 :
11571 : void ASN1CALL
11572 38203 : free_KrbCredInfo(KrbCredInfo *data)
11573 : {
11574 38203 : free_EncryptionKey(&(data)->key);
11575 38203 : if((data)->prealm) {
11576 38203 : free_Realm((data)->prealm);
11577 38203 : free((data)->prealm);
11578 38203 : (data)->prealm = NULL;
11579 : }
11580 38203 : if((data)->pname) {
11581 38203 : free_PrincipalName((data)->pname);
11582 38203 : free((data)->pname);
11583 38203 : (data)->pname = NULL;
11584 : }
11585 38203 : if((data)->flags) {
11586 38203 : free_TicketFlags((data)->flags);
11587 38203 : free((data)->flags);
11588 38203 : (data)->flags = NULL;
11589 : }
11590 38203 : if((data)->authtime) {
11591 38203 : free_KerberosTime((data)->authtime);
11592 38203 : free((data)->authtime);
11593 38203 : (data)->authtime = NULL;
11594 : }
11595 38203 : if((data)->starttime) {
11596 38203 : free_KerberosTime((data)->starttime);
11597 38203 : free((data)->starttime);
11598 38203 : (data)->starttime = NULL;
11599 : }
11600 38203 : if((data)->endtime) {
11601 38203 : free_KerberosTime((data)->endtime);
11602 38203 : free((data)->endtime);
11603 38203 : (data)->endtime = NULL;
11604 : }
11605 38203 : if((data)->renew_till) {
11606 38203 : free_KerberosTime((data)->renew_till);
11607 38203 : free((data)->renew_till);
11608 38203 : (data)->renew_till = NULL;
11609 : }
11610 38203 : if((data)->srealm) {
11611 38203 : free_Realm((data)->srealm);
11612 38203 : free((data)->srealm);
11613 38203 : (data)->srealm = NULL;
11614 : }
11615 38203 : if((data)->sname) {
11616 38203 : free_PrincipalName((data)->sname);
11617 38203 : free((data)->sname);
11618 38203 : (data)->sname = NULL;
11619 : }
11620 38203 : if((data)->caddr) {
11621 38203 : free_HostAddresses((data)->caddr);
11622 38203 : free((data)->caddr);
11623 38203 : (data)->caddr = NULL;
11624 : }
11625 38203 : }
11626 :
11627 : size_t ASN1CALL
11628 19181 : length_KrbCredInfo(const KrbCredInfo *data)
11629 : {
11630 19181 : size_t ret = 0;
11631 : {
11632 19181 : size_t Top_tag_oldret = ret;
11633 19181 : ret = 0;
11634 19181 : ret += length_EncryptionKey(&(data)->key);
11635 19181 : ret += 1 + der_length_len (ret);
11636 19181 : ret += Top_tag_oldret;
11637 : }
11638 19181 : if((data)->prealm){
11639 19181 : size_t Top_tag_oldret = ret;
11640 19181 : ret = 0;
11641 19181 : ret += length_Realm((data)->prealm);
11642 19181 : ret += 1 + der_length_len (ret);
11643 19181 : ret += Top_tag_oldret;
11644 : }
11645 19181 : if((data)->pname){
11646 19181 : size_t Top_tag_oldret = ret;
11647 19181 : ret = 0;
11648 19181 : ret += length_PrincipalName((data)->pname);
11649 19181 : ret += 1 + der_length_len (ret);
11650 19181 : ret += Top_tag_oldret;
11651 : }
11652 19181 : if((data)->flags){
11653 19181 : size_t Top_tag_oldret = ret;
11654 19181 : ret = 0;
11655 19181 : ret += length_TicketFlags((data)->flags);
11656 19181 : ret += 1 + der_length_len (ret);
11657 19181 : ret += Top_tag_oldret;
11658 : }
11659 19181 : if((data)->authtime){
11660 19181 : size_t Top_tag_oldret = ret;
11661 19181 : ret = 0;
11662 19181 : ret += length_KerberosTime((data)->authtime);
11663 19181 : ret += 1 + der_length_len (ret);
11664 19181 : ret += Top_tag_oldret;
11665 : }
11666 19181 : if((data)->starttime){
11667 19181 : size_t Top_tag_oldret = ret;
11668 19181 : ret = 0;
11669 19181 : ret += length_KerberosTime((data)->starttime);
11670 19181 : ret += 1 + der_length_len (ret);
11671 19181 : ret += Top_tag_oldret;
11672 : }
11673 19181 : if((data)->endtime){
11674 19181 : size_t Top_tag_oldret = ret;
11675 19181 : ret = 0;
11676 19181 : ret += length_KerberosTime((data)->endtime);
11677 19181 : ret += 1 + der_length_len (ret);
11678 19181 : ret += Top_tag_oldret;
11679 : }
11680 19181 : if((data)->renew_till){
11681 19181 : size_t Top_tag_oldret = ret;
11682 19181 : ret = 0;
11683 19181 : ret += length_KerberosTime((data)->renew_till);
11684 19181 : ret += 1 + der_length_len (ret);
11685 19181 : ret += Top_tag_oldret;
11686 : }
11687 19181 : if((data)->srealm){
11688 19181 : size_t Top_tag_oldret = ret;
11689 19181 : ret = 0;
11690 19181 : ret += length_Realm((data)->srealm);
11691 19181 : ret += 1 + der_length_len (ret);
11692 19181 : ret += Top_tag_oldret;
11693 : }
11694 19181 : if((data)->sname){
11695 19181 : size_t Top_tag_oldret = ret;
11696 19181 : ret = 0;
11697 19181 : ret += length_PrincipalName((data)->sname);
11698 19181 : ret += 1 + der_length_len (ret);
11699 19181 : ret += Top_tag_oldret;
11700 : }
11701 19181 : if((data)->caddr){
11702 19181 : size_t Top_tag_oldret = ret;
11703 19181 : ret = 0;
11704 19181 : ret += length_HostAddresses((data)->caddr);
11705 19181 : ret += 1 + der_length_len (ret);
11706 19181 : ret += Top_tag_oldret;
11707 : }
11708 19181 : ret += 1 + der_length_len (ret);
11709 19181 : return ret;
11710 : }
11711 :
11712 : int ASN1CALL
11713 0 : copy_KrbCredInfo(const KrbCredInfo *from, KrbCredInfo *to)
11714 : {
11715 0 : memset(to, 0, sizeof(*to));
11716 0 : if(copy_EncryptionKey(&(from)->key, &(to)->key)) goto fail;
11717 0 : if((from)->prealm) {
11718 0 : (to)->prealm = malloc(sizeof(*(to)->prealm));
11719 0 : if((to)->prealm == NULL) goto fail;
11720 0 : if(copy_Realm((from)->prealm, (to)->prealm)) goto fail;
11721 : }else
11722 0 : (to)->prealm = NULL;
11723 0 : if((from)->pname) {
11724 0 : (to)->pname = malloc(sizeof(*(to)->pname));
11725 0 : if((to)->pname == NULL) goto fail;
11726 0 : if(copy_PrincipalName((from)->pname, (to)->pname)) goto fail;
11727 : }else
11728 0 : (to)->pname = NULL;
11729 0 : if((from)->flags) {
11730 0 : (to)->flags = malloc(sizeof(*(to)->flags));
11731 0 : if((to)->flags == NULL) goto fail;
11732 0 : if(copy_TicketFlags((from)->flags, (to)->flags)) goto fail;
11733 : }else
11734 0 : (to)->flags = NULL;
11735 0 : if((from)->authtime) {
11736 0 : (to)->authtime = malloc(sizeof(*(to)->authtime));
11737 0 : if((to)->authtime == NULL) goto fail;
11738 0 : if(copy_KerberosTime((from)->authtime, (to)->authtime)) goto fail;
11739 : }else
11740 0 : (to)->authtime = NULL;
11741 0 : if((from)->starttime) {
11742 0 : (to)->starttime = malloc(sizeof(*(to)->starttime));
11743 0 : if((to)->starttime == NULL) goto fail;
11744 0 : if(copy_KerberosTime((from)->starttime, (to)->starttime)) goto fail;
11745 : }else
11746 0 : (to)->starttime = NULL;
11747 0 : if((from)->endtime) {
11748 0 : (to)->endtime = malloc(sizeof(*(to)->endtime));
11749 0 : if((to)->endtime == NULL) goto fail;
11750 0 : if(copy_KerberosTime((from)->endtime, (to)->endtime)) goto fail;
11751 : }else
11752 0 : (to)->endtime = NULL;
11753 0 : if((from)->renew_till) {
11754 0 : (to)->renew_till = malloc(sizeof(*(to)->renew_till));
11755 0 : if((to)->renew_till == NULL) goto fail;
11756 0 : if(copy_KerberosTime((from)->renew_till, (to)->renew_till)) goto fail;
11757 : }else
11758 0 : (to)->renew_till = NULL;
11759 0 : if((from)->srealm) {
11760 0 : (to)->srealm = malloc(sizeof(*(to)->srealm));
11761 0 : if((to)->srealm == NULL) goto fail;
11762 0 : if(copy_Realm((from)->srealm, (to)->srealm)) goto fail;
11763 : }else
11764 0 : (to)->srealm = NULL;
11765 0 : if((from)->sname) {
11766 0 : (to)->sname = malloc(sizeof(*(to)->sname));
11767 0 : if((to)->sname == NULL) goto fail;
11768 0 : if(copy_PrincipalName((from)->sname, (to)->sname)) goto fail;
11769 : }else
11770 0 : (to)->sname = NULL;
11771 0 : if((from)->caddr) {
11772 0 : (to)->caddr = malloc(sizeof(*(to)->caddr));
11773 0 : if((to)->caddr == NULL) goto fail;
11774 0 : if(copy_HostAddresses((from)->caddr, (to)->caddr)) goto fail;
11775 : }else
11776 0 : (to)->caddr = NULL;
11777 0 : return 0;
11778 0 : fail:
11779 0 : free_KrbCredInfo(to);
11780 0 : return ENOMEM;
11781 : }
11782 :
11783 : int ASN1CALL
11784 19181 : encode_EncKrbCredPart(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const EncKrbCredPart *data, size_t *size)
11785 : {
11786 19181 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
11787 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
11788 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
11789 :
11790 : /* r-address */
11791 19181 : if((data)->r_address) {
11792 0 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
11793 0 : ret = 0;
11794 0 : e = encode_HostAddress(p, len, (data)->r_address, &l);
11795 0 : if (e) return e;
11796 0 : p -= l; len -= l; ret += l;
11797 :
11798 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 5, &l);
11799 0 : if (e) return e;
11800 0 : p -= l; len -= l; ret += l;
11801 :
11802 0 : ret += Top_tag_tag_oldret;
11803 : }
11804 : /* s-address */
11805 19181 : if((data)->s_address) {
11806 0 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
11807 0 : ret = 0;
11808 0 : e = encode_HostAddress(p, len, (data)->s_address, &l);
11809 0 : if (e) return e;
11810 0 : p -= l; len -= l; ret += l;
11811 :
11812 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 4, &l);
11813 0 : if (e) return e;
11814 0 : p -= l; len -= l; ret += l;
11815 :
11816 0 : ret += Top_tag_tag_oldret;
11817 : }
11818 : /* usec */
11819 19181 : if((data)->usec) {
11820 19181 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
11821 19181 : ret = 0;
11822 19181 : e = encode_krb5int32(p, len, (data)->usec, &l);
11823 19181 : if (e) return e;
11824 19181 : p -= l; len -= l; ret += l;
11825 :
11826 19181 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 3, &l);
11827 19181 : if (e) return e;
11828 19181 : p -= l; len -= l; ret += l;
11829 :
11830 19181 : ret += Top_tag_tag_oldret;
11831 : }
11832 : /* timestamp */
11833 19181 : if((data)->timestamp) {
11834 19181 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
11835 19181 : ret = 0;
11836 19181 : e = encode_KerberosTime(p, len, (data)->timestamp, &l);
11837 19181 : if (e) return e;
11838 19181 : p -= l; len -= l; ret += l;
11839 :
11840 19181 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
11841 19181 : if (e) return e;
11842 19181 : p -= l; len -= l; ret += l;
11843 :
11844 19181 : ret += Top_tag_tag_oldret;
11845 : }
11846 : /* nonce */
11847 19181 : if((data)->nonce) {
11848 0 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
11849 0 : ret = 0;
11850 0 : e = encode_krb5int32(p, len, (data)->nonce, &l);
11851 0 : if (e) return e;
11852 0 : p -= l; len -= l; ret += l;
11853 :
11854 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
11855 0 : if (e) return e;
11856 0 : p -= l; len -= l; ret += l;
11857 :
11858 0 : ret += Top_tag_tag_oldret;
11859 : }
11860 : /* ticket-info */
11861 : {
11862 19181 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
11863 19181 : ret = 0;
11864 38362 : for(i = (int)(&(data)->ticket_info)->len - 1; i >= 0; --i) {
11865 19181 : size_t ticket_info_tag_tag_for_oldret = ret;
11866 19181 : ret = 0;
11867 19181 : e = encode_KrbCredInfo(p, len, &(&(data)->ticket_info)->val[i], &l);
11868 19181 : if (e) return e;
11869 19181 : p -= l; len -= l; ret += l;
11870 :
11871 19181 : ret += ticket_info_tag_tag_for_oldret;
11872 : }
11873 19181 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
11874 19181 : if (e) return e;
11875 19181 : p -= l; len -= l; ret += l;
11876 :
11877 19181 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
11878 19181 : if (e) return e;
11879 19181 : p -= l; len -= l; ret += l;
11880 :
11881 19181 : ret += Top_tag_tag_oldret;
11882 : }
11883 19181 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
11884 19181 : if (e) return e;
11885 19181 : p -= l; len -= l; ret += l;
11886 :
11887 19181 : e = der_put_length_and_tag (p, len, ret, ASN1_C_APPL, CONS, 29, &l);
11888 19181 : if (e) return e;
11889 19181 : p -= l; len -= l; ret += l;
11890 :
11891 19181 : *size = ret;
11892 19181 : return 0;
11893 : }
11894 :
11895 : int ASN1CALL
11896 19022 : decode_EncKrbCredPart(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, EncKrbCredPart *data, size_t *size)
11897 : {
11898 19022 : size_t ret = 0;
11899 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
11900 : int e HEIMDAL_UNUSED_ATTRIBUTE;
11901 :
11902 19022 : memset(data, 0, sizeof(*data));
11903 : {
11904 : size_t Top_datalen, Top_oldlen;
11905 : Der_type Top_type;
11906 19022 : e = der_match_tag_and_length(p, len, ASN1_C_APPL, &Top_type, 29, &Top_datalen, &l);
11907 19022 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
11908 19022 : if(e) goto fail;
11909 19022 : p += l; len -= l; ret += l;
11910 19022 : Top_oldlen = len;
11911 19022 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
11912 19022 : len = Top_datalen;
11913 : {
11914 : size_t Top_Tag_datalen, Top_Tag_oldlen;
11915 : Der_type Top_Tag_type;
11916 19022 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_Tag_type, UT_Sequence, &Top_Tag_datalen, &l);
11917 19022 : if (e == 0 && Top_Tag_type != CONS) { e = ASN1_BAD_ID; }
11918 19022 : if(e) goto fail;
11919 19022 : p += l; len -= l; ret += l;
11920 19022 : Top_Tag_oldlen = len;
11921 19022 : if (Top_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
11922 19022 : len = Top_Tag_datalen;
11923 : {
11924 : size_t ticket_info_datalen, ticket_info_oldlen;
11925 : Der_type ticket_info_type;
11926 19022 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &ticket_info_type, 0, &ticket_info_datalen, &l);
11927 19022 : if (e == 0 && ticket_info_type != CONS) { e = ASN1_BAD_ID; }
11928 19022 : if(e) goto fail;
11929 19022 : p += l; len -= l; ret += l;
11930 19022 : ticket_info_oldlen = len;
11931 19022 : if (ticket_info_datalen > len) { e = ASN1_OVERRUN; goto fail; }
11932 19022 : len = ticket_info_datalen;
11933 : {
11934 : size_t ticket_info_Tag_datalen, ticket_info_Tag_oldlen;
11935 : Der_type ticket_info_Tag_type;
11936 19022 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &ticket_info_Tag_type, UT_Sequence, &ticket_info_Tag_datalen, &l);
11937 19022 : if (e == 0 && ticket_info_Tag_type != CONS) { e = ASN1_BAD_ID; }
11938 19022 : if(e) goto fail;
11939 19022 : p += l; len -= l; ret += l;
11940 19022 : ticket_info_Tag_oldlen = len;
11941 19022 : if (ticket_info_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
11942 19022 : len = ticket_info_Tag_datalen;
11943 : {
11944 19022 : size_t ticket_info_Tag_Tag_origlen = len;
11945 19022 : size_t ticket_info_Tag_Tag_oldret = ret;
11946 19022 : size_t ticket_info_Tag_Tag_olen = 0;
11947 : void *ticket_info_Tag_Tag_tmp;
11948 19022 : ret = 0;
11949 19022 : (&(data)->ticket_info)->len = 0;
11950 19022 : (&(data)->ticket_info)->val = NULL;
11951 57066 : while(ret < ticket_info_Tag_Tag_origlen) {
11952 19022 : size_t ticket_info_Tag_Tag_nlen = ticket_info_Tag_Tag_olen + sizeof(*((&(data)->ticket_info)->val));
11953 19022 : if (ticket_info_Tag_Tag_olen > ticket_info_Tag_Tag_nlen) { e = ASN1_OVERFLOW; goto fail; }
11954 19022 : ticket_info_Tag_Tag_olen = ticket_info_Tag_Tag_nlen;
11955 19022 : ticket_info_Tag_Tag_tmp = realloc((&(data)->ticket_info)->val, ticket_info_Tag_Tag_olen);
11956 19022 : if (ticket_info_Tag_Tag_tmp == NULL) { e = ENOMEM; goto fail; }
11957 19022 : (&(data)->ticket_info)->val = ticket_info_Tag_Tag_tmp;
11958 19022 : e = decode_KrbCredInfo(p, len, &(&(data)->ticket_info)->val[(&(data)->ticket_info)->len], &l);
11959 19022 : if(e) goto fail;
11960 19022 : p += l; len -= l; ret += l;
11961 19022 : (&(data)->ticket_info)->len++;
11962 19022 : len = ticket_info_Tag_Tag_origlen - ret;
11963 : }
11964 19022 : ret += ticket_info_Tag_Tag_oldret;
11965 : }
11966 19022 : len = ticket_info_Tag_oldlen - ticket_info_Tag_datalen;
11967 : }
11968 19022 : len = ticket_info_oldlen - ticket_info_datalen;
11969 : }
11970 : {
11971 : size_t nonce_datalen, nonce_oldlen;
11972 : Der_type nonce_type;
11973 19022 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &nonce_type, 1, &nonce_datalen, &l);
11974 19022 : if (e == 0 && nonce_type != CONS) { e = ASN1_BAD_ID; }
11975 19022 : if(e) {
11976 19022 : (data)->nonce = NULL;
11977 : } else {
11978 0 : (data)->nonce = calloc(1, sizeof(*(data)->nonce));
11979 0 : if ((data)->nonce == NULL) { e = ENOMEM; goto fail; }
11980 0 : p += l; len -= l; ret += l;
11981 0 : nonce_oldlen = len;
11982 0 : if (nonce_datalen > len) { e = ASN1_OVERRUN; goto fail; }
11983 0 : len = nonce_datalen;
11984 0 : e = decode_krb5int32(p, len, (data)->nonce, &l);
11985 0 : if(e) goto fail;
11986 0 : p += l; len -= l; ret += l;
11987 0 : len = nonce_oldlen - nonce_datalen;
11988 : }
11989 : }
11990 : {
11991 : size_t timestamp_datalen, timestamp_oldlen;
11992 : Der_type timestamp_type;
11993 19022 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, ×tamp_type, 2, ×tamp_datalen, &l);
11994 38044 : if (e == 0 && timestamp_type != CONS) { e = ASN1_BAD_ID; }
11995 19022 : if(e) {
11996 0 : (data)->timestamp = NULL;
11997 : } else {
11998 19022 : (data)->timestamp = calloc(1, sizeof(*(data)->timestamp));
11999 19022 : if ((data)->timestamp == NULL) { e = ENOMEM; goto fail; }
12000 19022 : p += l; len -= l; ret += l;
12001 19022 : timestamp_oldlen = len;
12002 19022 : if (timestamp_datalen > len) { e = ASN1_OVERRUN; goto fail; }
12003 19022 : len = timestamp_datalen;
12004 19022 : e = decode_KerberosTime(p, len, (data)->timestamp, &l);
12005 19022 : if(e) goto fail;
12006 19022 : p += l; len -= l; ret += l;
12007 19022 : len = timestamp_oldlen - timestamp_datalen;
12008 : }
12009 : }
12010 : {
12011 : size_t usec_datalen, usec_oldlen;
12012 : Der_type usec_type;
12013 19022 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &usec_type, 3, &usec_datalen, &l);
12014 38044 : if (e == 0 && usec_type != CONS) { e = ASN1_BAD_ID; }
12015 19022 : if(e) {
12016 0 : (data)->usec = NULL;
12017 : } else {
12018 19022 : (data)->usec = calloc(1, sizeof(*(data)->usec));
12019 19022 : if ((data)->usec == NULL) { e = ENOMEM; goto fail; }
12020 19022 : p += l; len -= l; ret += l;
12021 19022 : usec_oldlen = len;
12022 19022 : if (usec_datalen > len) { e = ASN1_OVERRUN; goto fail; }
12023 19022 : len = usec_datalen;
12024 19022 : e = decode_krb5int32(p, len, (data)->usec, &l);
12025 19022 : if(e) goto fail;
12026 19022 : p += l; len -= l; ret += l;
12027 19022 : len = usec_oldlen - usec_datalen;
12028 : }
12029 : }
12030 : {
12031 : size_t s_address_datalen, s_address_oldlen;
12032 : Der_type s_address_type;
12033 19022 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &s_address_type, 4, &s_address_datalen, &l);
12034 19022 : if (e == 0 && s_address_type != CONS) { e = ASN1_BAD_ID; }
12035 19022 : if(e) {
12036 19022 : (data)->s_address = NULL;
12037 : } else {
12038 0 : (data)->s_address = calloc(1, sizeof(*(data)->s_address));
12039 0 : if ((data)->s_address == NULL) { e = ENOMEM; goto fail; }
12040 0 : p += l; len -= l; ret += l;
12041 0 : s_address_oldlen = len;
12042 0 : if (s_address_datalen > len) { e = ASN1_OVERRUN; goto fail; }
12043 0 : len = s_address_datalen;
12044 0 : e = decode_HostAddress(p, len, (data)->s_address, &l);
12045 0 : if(e) goto fail;
12046 0 : p += l; len -= l; ret += l;
12047 0 : len = s_address_oldlen - s_address_datalen;
12048 : }
12049 : }
12050 : {
12051 : size_t r_address_datalen, r_address_oldlen;
12052 : Der_type r_address_type;
12053 19022 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &r_address_type, 5, &r_address_datalen, &l);
12054 19022 : if (e == 0 && r_address_type != CONS) { e = ASN1_BAD_ID; }
12055 19022 : if(e) {
12056 19022 : (data)->r_address = NULL;
12057 : } else {
12058 0 : (data)->r_address = calloc(1, sizeof(*(data)->r_address));
12059 0 : if ((data)->r_address == NULL) { e = ENOMEM; goto fail; }
12060 0 : p += l; len -= l; ret += l;
12061 0 : r_address_oldlen = len;
12062 0 : if (r_address_datalen > len) { e = ASN1_OVERRUN; goto fail; }
12063 0 : len = r_address_datalen;
12064 0 : e = decode_HostAddress(p, len, (data)->r_address, &l);
12065 0 : if(e) goto fail;
12066 0 : p += l; len -= l; ret += l;
12067 0 : len = r_address_oldlen - r_address_datalen;
12068 : }
12069 : }
12070 19022 : len = Top_Tag_oldlen - Top_Tag_datalen;
12071 : }
12072 19022 : len = Top_oldlen - Top_datalen;
12073 : }
12074 38044 : if(size) *size = ret;
12075 18284 : return 0;
12076 0 : fail:
12077 0 : free_EncKrbCredPart(data);
12078 0 : return e;
12079 : }
12080 :
12081 : void ASN1CALL
12082 38203 : free_EncKrbCredPart(EncKrbCredPart *data)
12083 : {
12084 114609 : while((&(data)->ticket_info)->len){
12085 38203 : free_KrbCredInfo(&(&(data)->ticket_info)->val[(&(data)->ticket_info)->len-1]);
12086 38203 : (&(data)->ticket_info)->len--;
12087 : }
12088 38203 : free((&(data)->ticket_info)->val);
12089 38203 : (&(data)->ticket_info)->val = NULL;
12090 38203 : if((data)->nonce) {
12091 0 : free_krb5int32((data)->nonce);
12092 0 : free((data)->nonce);
12093 0 : (data)->nonce = NULL;
12094 : }
12095 38203 : if((data)->timestamp) {
12096 38203 : free_KerberosTime((data)->timestamp);
12097 38203 : free((data)->timestamp);
12098 38203 : (data)->timestamp = NULL;
12099 : }
12100 38203 : if((data)->usec) {
12101 38203 : free_krb5int32((data)->usec);
12102 38203 : free((data)->usec);
12103 38203 : (data)->usec = NULL;
12104 : }
12105 38203 : if((data)->s_address) {
12106 0 : free_HostAddress((data)->s_address);
12107 0 : free((data)->s_address);
12108 0 : (data)->s_address = NULL;
12109 : }
12110 38203 : if((data)->r_address) {
12111 0 : free_HostAddress((data)->r_address);
12112 0 : free((data)->r_address);
12113 0 : (data)->r_address = NULL;
12114 : }
12115 38203 : }
12116 :
12117 : size_t ASN1CALL
12118 19181 : length_EncKrbCredPart(const EncKrbCredPart *data)
12119 : {
12120 19181 : size_t ret = 0;
12121 : {
12122 19181 : size_t Top_tag_tag_oldret = ret;
12123 19181 : ret = 0;
12124 : {
12125 19181 : size_t ticket_info_tag_tag_oldret = ret;
12126 : int i;
12127 19181 : ret = 0;
12128 38362 : for(i = (&(data)->ticket_info)->len - 1; i >= 0; --i){
12129 19181 : size_t ticket_info_tag_tag_for_oldret = ret;
12130 19181 : ret = 0;
12131 19181 : ret += length_KrbCredInfo(&(&(data)->ticket_info)->val[i]);
12132 19181 : ret += ticket_info_tag_tag_for_oldret;
12133 : }
12134 19181 : ret += ticket_info_tag_tag_oldret;
12135 : }
12136 19181 : ret += 1 + der_length_len (ret);
12137 19181 : ret += 1 + der_length_len (ret);
12138 19181 : ret += Top_tag_tag_oldret;
12139 : }
12140 19181 : if((data)->nonce){
12141 0 : size_t Top_tag_tag_oldret = ret;
12142 0 : ret = 0;
12143 0 : ret += length_krb5int32((data)->nonce);
12144 0 : ret += 1 + der_length_len (ret);
12145 0 : ret += Top_tag_tag_oldret;
12146 : }
12147 19181 : if((data)->timestamp){
12148 19181 : size_t Top_tag_tag_oldret = ret;
12149 19181 : ret = 0;
12150 19181 : ret += length_KerberosTime((data)->timestamp);
12151 19181 : ret += 1 + der_length_len (ret);
12152 19181 : ret += Top_tag_tag_oldret;
12153 : }
12154 19181 : if((data)->usec){
12155 19181 : size_t Top_tag_tag_oldret = ret;
12156 19181 : ret = 0;
12157 19181 : ret += length_krb5int32((data)->usec);
12158 19181 : ret += 1 + der_length_len (ret);
12159 19181 : ret += Top_tag_tag_oldret;
12160 : }
12161 19181 : if((data)->s_address){
12162 0 : size_t Top_tag_tag_oldret = ret;
12163 0 : ret = 0;
12164 0 : ret += length_HostAddress((data)->s_address);
12165 0 : ret += 1 + der_length_len (ret);
12166 0 : ret += Top_tag_tag_oldret;
12167 : }
12168 19181 : if((data)->r_address){
12169 0 : size_t Top_tag_tag_oldret = ret;
12170 0 : ret = 0;
12171 0 : ret += length_HostAddress((data)->r_address);
12172 0 : ret += 1 + der_length_len (ret);
12173 0 : ret += Top_tag_tag_oldret;
12174 : }
12175 19181 : ret += 1 + der_length_len (ret);
12176 19181 : ret += 1 + der_length_len (ret);
12177 19181 : return ret;
12178 : }
12179 :
12180 : int ASN1CALL
12181 0 : copy_EncKrbCredPart(const EncKrbCredPart *from, EncKrbCredPart *to)
12182 : {
12183 0 : memset(to, 0, sizeof(*to));
12184 0 : if(((&(to)->ticket_info)->val = malloc((&(from)->ticket_info)->len * sizeof(*(&(to)->ticket_info)->val))) == NULL && (&(from)->ticket_info)->len != 0)
12185 0 : goto fail;
12186 0 : for((&(to)->ticket_info)->len = 0; (&(to)->ticket_info)->len < (&(from)->ticket_info)->len; (&(to)->ticket_info)->len++){
12187 0 : if(copy_KrbCredInfo(&(&(from)->ticket_info)->val[(&(to)->ticket_info)->len], &(&(to)->ticket_info)->val[(&(to)->ticket_info)->len])) goto fail;
12188 : }
12189 0 : if((from)->nonce) {
12190 0 : (to)->nonce = malloc(sizeof(*(to)->nonce));
12191 0 : if((to)->nonce == NULL) goto fail;
12192 0 : if(copy_krb5int32((from)->nonce, (to)->nonce)) goto fail;
12193 : }else
12194 0 : (to)->nonce = NULL;
12195 0 : if((from)->timestamp) {
12196 0 : (to)->timestamp = malloc(sizeof(*(to)->timestamp));
12197 0 : if((to)->timestamp == NULL) goto fail;
12198 0 : if(copy_KerberosTime((from)->timestamp, (to)->timestamp)) goto fail;
12199 : }else
12200 0 : (to)->timestamp = NULL;
12201 0 : if((from)->usec) {
12202 0 : (to)->usec = malloc(sizeof(*(to)->usec));
12203 0 : if((to)->usec == NULL) goto fail;
12204 0 : if(copy_krb5int32((from)->usec, (to)->usec)) goto fail;
12205 : }else
12206 0 : (to)->usec = NULL;
12207 0 : if((from)->s_address) {
12208 0 : (to)->s_address = malloc(sizeof(*(to)->s_address));
12209 0 : if((to)->s_address == NULL) goto fail;
12210 0 : if(copy_HostAddress((from)->s_address, (to)->s_address)) goto fail;
12211 : }else
12212 0 : (to)->s_address = NULL;
12213 0 : if((from)->r_address) {
12214 0 : (to)->r_address = malloc(sizeof(*(to)->r_address));
12215 0 : if((to)->r_address == NULL) goto fail;
12216 0 : if(copy_HostAddress((from)->r_address, (to)->r_address)) goto fail;
12217 : }else
12218 0 : (to)->r_address = NULL;
12219 0 : return 0;
12220 0 : fail:
12221 0 : free_EncKrbCredPart(to);
12222 0 : return ENOMEM;
12223 : }
12224 :
12225 : int ASN1CALL
12226 29488 : encode_KRB_ERROR(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const KRB_ERROR *data, size_t *size)
12227 : {
12228 29488 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
12229 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
12230 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
12231 :
12232 : /* e-data */
12233 29488 : if((data)->e_data) {
12234 14746 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
12235 14746 : ret = 0;
12236 14746 : e = der_put_octet_string(p, len, (data)->e_data, &l);
12237 14746 : if (e) return e;
12238 14746 : p -= l; len -= l; ret += l;
12239 :
12240 14746 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_OctetString, &l);
12241 14746 : if (e) return e;
12242 14746 : p -= l; len -= l; ret += l;
12243 :
12244 14746 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 12, &l);
12245 14746 : if (e) return e;
12246 14746 : p -= l; len -= l; ret += l;
12247 :
12248 14746 : ret += Top_tag_tag_oldret;
12249 : }
12250 : /* e-text */
12251 29488 : if((data)->e_text) {
12252 27014 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
12253 27014 : ret = 0;
12254 27014 : e = der_put_general_string(p, len, (data)->e_text, &l);
12255 27014 : if (e) return e;
12256 27014 : p -= l; len -= l; ret += l;
12257 :
12258 27014 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_GeneralString, &l);
12259 27014 : if (e) return e;
12260 27014 : p -= l; len -= l; ret += l;
12261 :
12262 27014 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 11, &l);
12263 27014 : if (e) return e;
12264 27014 : p -= l; len -= l; ret += l;
12265 :
12266 27014 : ret += Top_tag_tag_oldret;
12267 : }
12268 : /* sname */
12269 : {
12270 29488 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
12271 29488 : ret = 0;
12272 29488 : e = encode_PrincipalName(p, len, &(data)->sname, &l);
12273 29488 : if (e) return e;
12274 29488 : p -= l; len -= l; ret += l;
12275 :
12276 29488 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 10, &l);
12277 29488 : if (e) return e;
12278 29488 : p -= l; len -= l; ret += l;
12279 :
12280 29488 : ret += Top_tag_tag_oldret;
12281 : }
12282 : /* realm */
12283 : {
12284 29488 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
12285 29488 : ret = 0;
12286 29488 : e = encode_Realm(p, len, &(data)->realm, &l);
12287 29488 : if (e) return e;
12288 29488 : p -= l; len -= l; ret += l;
12289 :
12290 29488 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 9, &l);
12291 29488 : if (e) return e;
12292 29488 : p -= l; len -= l; ret += l;
12293 :
12294 29488 : ret += Top_tag_tag_oldret;
12295 : }
12296 : /* cname */
12297 29488 : if((data)->cname) {
12298 28266 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
12299 28266 : ret = 0;
12300 28266 : e = encode_PrincipalName(p, len, (data)->cname, &l);
12301 28266 : if (e) return e;
12302 28266 : p -= l; len -= l; ret += l;
12303 :
12304 28266 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 8, &l);
12305 28266 : if (e) return e;
12306 28266 : p -= l; len -= l; ret += l;
12307 :
12308 28266 : ret += Top_tag_tag_oldret;
12309 : }
12310 : /* crealm */
12311 29488 : if((data)->crealm) {
12312 28549 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
12313 28549 : ret = 0;
12314 28549 : e = encode_Realm(p, len, (data)->crealm, &l);
12315 28549 : if (e) return e;
12316 28549 : p -= l; len -= l; ret += l;
12317 :
12318 28549 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 7, &l);
12319 28549 : if (e) return e;
12320 28549 : p -= l; len -= l; ret += l;
12321 :
12322 28549 : ret += Top_tag_tag_oldret;
12323 : }
12324 : /* error-code */
12325 : {
12326 29488 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
12327 29488 : ret = 0;
12328 29488 : e = encode_krb5int32(p, len, &(data)->error_code, &l);
12329 29488 : if (e) return e;
12330 29488 : p -= l; len -= l; ret += l;
12331 :
12332 29488 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 6, &l);
12333 29488 : if (e) return e;
12334 29488 : p -= l; len -= l; ret += l;
12335 :
12336 29488 : ret += Top_tag_tag_oldret;
12337 : }
12338 : /* susec */
12339 : {
12340 29488 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
12341 29488 : ret = 0;
12342 29488 : e = encode_krb5int32(p, len, &(data)->susec, &l);
12343 29488 : if (e) return e;
12344 29488 : p -= l; len -= l; ret += l;
12345 :
12346 29488 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 5, &l);
12347 29488 : if (e) return e;
12348 29488 : p -= l; len -= l; ret += l;
12349 :
12350 29488 : ret += Top_tag_tag_oldret;
12351 : }
12352 : /* stime */
12353 : {
12354 29488 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
12355 29488 : ret = 0;
12356 29488 : e = encode_KerberosTime(p, len, &(data)->stime, &l);
12357 29488 : if (e) return e;
12358 29488 : p -= l; len -= l; ret += l;
12359 :
12360 29488 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 4, &l);
12361 29488 : if (e) return e;
12362 29488 : p -= l; len -= l; ret += l;
12363 :
12364 29488 : ret += Top_tag_tag_oldret;
12365 : }
12366 : /* cusec */
12367 29488 : if((data)->cusec) {
12368 932 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
12369 932 : ret = 0;
12370 932 : e = encode_krb5int32(p, len, (data)->cusec, &l);
12371 932 : if (e) return e;
12372 932 : p -= l; len -= l; ret += l;
12373 :
12374 932 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 3, &l);
12375 932 : if (e) return e;
12376 932 : p -= l; len -= l; ret += l;
12377 :
12378 932 : ret += Top_tag_tag_oldret;
12379 : }
12380 : /* ctime */
12381 29488 : if((data)->ctime) {
12382 932 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
12383 932 : ret = 0;
12384 932 : e = encode_KerberosTime(p, len, (data)->ctime, &l);
12385 932 : if (e) return e;
12386 932 : p -= l; len -= l; ret += l;
12387 :
12388 932 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
12389 932 : if (e) return e;
12390 932 : p -= l; len -= l; ret += l;
12391 :
12392 932 : ret += Top_tag_tag_oldret;
12393 : }
12394 : /* msg-type */
12395 : {
12396 29488 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
12397 29488 : ret = 0;
12398 29488 : e = encode_MESSAGE_TYPE(p, len, &(data)->msg_type, &l);
12399 29488 : if (e) return e;
12400 29488 : p -= l; len -= l; ret += l;
12401 :
12402 29488 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
12403 29488 : if (e) return e;
12404 29488 : p -= l; len -= l; ret += l;
12405 :
12406 29488 : ret += Top_tag_tag_oldret;
12407 : }
12408 : /* pvno */
12409 : {
12410 29488 : size_t Top_tag_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
12411 29488 : ret = 0;
12412 29488 : e = encode_krb5int32(p, len, &(data)->pvno, &l);
12413 29488 : if (e) return e;
12414 29488 : p -= l; len -= l; ret += l;
12415 :
12416 29488 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
12417 29488 : if (e) return e;
12418 29488 : p -= l; len -= l; ret += l;
12419 :
12420 29488 : ret += Top_tag_tag_oldret;
12421 : }
12422 29488 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
12423 29488 : if (e) return e;
12424 29488 : p -= l; len -= l; ret += l;
12425 :
12426 29488 : e = der_put_length_and_tag (p, len, ret, ASN1_C_APPL, CONS, 30, &l);
12427 29488 : if (e) return e;
12428 29488 : p -= l; len -= l; ret += l;
12429 :
12430 29488 : *size = ret;
12431 29488 : return 0;
12432 : }
12433 :
12434 : int ASN1CALL
12435 110613 : decode_KRB_ERROR(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, KRB_ERROR *data, size_t *size)
12436 : {
12437 110613 : size_t ret = 0;
12438 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
12439 : int e HEIMDAL_UNUSED_ATTRIBUTE;
12440 :
12441 110613 : memset(data, 0, sizeof(*data));
12442 : {
12443 : size_t Top_datalen, Top_oldlen;
12444 : Der_type Top_type;
12445 110613 : e = der_match_tag_and_length(p, len, ASN1_C_APPL, &Top_type, 30, &Top_datalen, &l);
12446 110613 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
12447 167908 : if(e) goto fail;
12448 51934 : p += l; len -= l; ret += l;
12449 51934 : Top_oldlen = len;
12450 51934 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
12451 51934 : len = Top_datalen;
12452 : {
12453 : size_t Top_Tag_datalen, Top_Tag_oldlen;
12454 : Der_type Top_Tag_type;
12455 51934 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_Tag_type, UT_Sequence, &Top_Tag_datalen, &l);
12456 51934 : if (e == 0 && Top_Tag_type != CONS) { e = ASN1_BAD_ID; }
12457 51934 : if(e) goto fail;
12458 51934 : p += l; len -= l; ret += l;
12459 51934 : Top_Tag_oldlen = len;
12460 51934 : if (Top_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
12461 51934 : len = Top_Tag_datalen;
12462 : {
12463 : size_t pvno_datalen, pvno_oldlen;
12464 : Der_type pvno_type;
12465 51934 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &pvno_type, 0, &pvno_datalen, &l);
12466 51934 : if (e == 0 && pvno_type != CONS) { e = ASN1_BAD_ID; }
12467 51934 : if(e) goto fail;
12468 51934 : p += l; len -= l; ret += l;
12469 51934 : pvno_oldlen = len;
12470 51934 : if (pvno_datalen > len) { e = ASN1_OVERRUN; goto fail; }
12471 51934 : len = pvno_datalen;
12472 51934 : e = decode_krb5int32(p, len, &(data)->pvno, &l);
12473 51934 : if(e) goto fail;
12474 51934 : p += l; len -= l; ret += l;
12475 51934 : len = pvno_oldlen - pvno_datalen;
12476 : }
12477 : {
12478 : size_t msg_type_datalen, msg_type_oldlen;
12479 : Der_type msg_type_type;
12480 51934 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &msg_type_type, 1, &msg_type_datalen, &l);
12481 102983 : if (e == 0 && msg_type_type != CONS) { e = ASN1_BAD_ID; }
12482 51934 : if(e) goto fail;
12483 51934 : p += l; len -= l; ret += l;
12484 51934 : msg_type_oldlen = len;
12485 51934 : if (msg_type_datalen > len) { e = ASN1_OVERRUN; goto fail; }
12486 51934 : len = msg_type_datalen;
12487 51934 : e = decode_MESSAGE_TYPE(p, len, &(data)->msg_type, &l);
12488 51934 : if(e) goto fail;
12489 51934 : p += l; len -= l; ret += l;
12490 51934 : len = msg_type_oldlen - msg_type_datalen;
12491 : }
12492 : {
12493 : size_t ctime_datalen, ctime_oldlen;
12494 : Der_type ctime_type;
12495 51934 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &ctime_type, 2, &ctime_datalen, &l);
12496 54402 : if (e == 0 && ctime_type != CONS) { e = ASN1_BAD_ID; }
12497 51934 : if(e) {
12498 49466 : (data)->ctime = NULL;
12499 : } else {
12500 2468 : (data)->ctime = calloc(1, sizeof(*(data)->ctime));
12501 2468 : if ((data)->ctime == NULL) { e = ENOMEM; goto fail; }
12502 2468 : p += l; len -= l; ret += l;
12503 2468 : ctime_oldlen = len;
12504 2468 : if (ctime_datalen > len) { e = ASN1_OVERRUN; goto fail; }
12505 2468 : len = ctime_datalen;
12506 2468 : e = decode_KerberosTime(p, len, (data)->ctime, &l);
12507 2468 : if(e) goto fail;
12508 2468 : p += l; len -= l; ret += l;
12509 2468 : len = ctime_oldlen - ctime_datalen;
12510 : }
12511 : }
12512 : {
12513 : size_t cusec_datalen, cusec_oldlen;
12514 : Der_type cusec_type;
12515 51934 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &cusec_type, 3, &cusec_datalen, &l);
12516 54402 : if (e == 0 && cusec_type != CONS) { e = ASN1_BAD_ID; }
12517 51934 : if(e) {
12518 49466 : (data)->cusec = NULL;
12519 : } else {
12520 2468 : (data)->cusec = calloc(1, sizeof(*(data)->cusec));
12521 2468 : if ((data)->cusec == NULL) { e = ENOMEM; goto fail; }
12522 2468 : p += l; len -= l; ret += l;
12523 2468 : cusec_oldlen = len;
12524 2468 : if (cusec_datalen > len) { e = ASN1_OVERRUN; goto fail; }
12525 2468 : len = cusec_datalen;
12526 2468 : e = decode_krb5int32(p, len, (data)->cusec, &l);
12527 2468 : if(e) goto fail;
12528 2468 : p += l; len -= l; ret += l;
12529 2468 : len = cusec_oldlen - cusec_datalen;
12530 : }
12531 : }
12532 : {
12533 : size_t stime_datalen, stime_oldlen;
12534 : Der_type stime_type;
12535 51934 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &stime_type, 4, &stime_datalen, &l);
12536 103868 : if (e == 0 && stime_type != CONS) { e = ASN1_BAD_ID; }
12537 51934 : if(e) goto fail;
12538 51934 : p += l; len -= l; ret += l;
12539 51934 : stime_oldlen = len;
12540 51934 : if (stime_datalen > len) { e = ASN1_OVERRUN; goto fail; }
12541 51934 : len = stime_datalen;
12542 51934 : e = decode_KerberosTime(p, len, &(data)->stime, &l);
12543 51934 : if(e) goto fail;
12544 51934 : p += l; len -= l; ret += l;
12545 51934 : len = stime_oldlen - stime_datalen;
12546 : }
12547 : {
12548 : size_t susec_datalen, susec_oldlen;
12549 : Der_type susec_type;
12550 51934 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &susec_type, 5, &susec_datalen, &l);
12551 102983 : if (e == 0 && susec_type != CONS) { e = ASN1_BAD_ID; }
12552 51934 : if(e) goto fail;
12553 51934 : p += l; len -= l; ret += l;
12554 51934 : susec_oldlen = len;
12555 51934 : if (susec_datalen > len) { e = ASN1_OVERRUN; goto fail; }
12556 51934 : len = susec_datalen;
12557 51934 : e = decode_krb5int32(p, len, &(data)->susec, &l);
12558 51934 : if(e) goto fail;
12559 51934 : p += l; len -= l; ret += l;
12560 51934 : len = susec_oldlen - susec_datalen;
12561 : }
12562 : {
12563 : size_t error_code_datalen, error_code_oldlen;
12564 : Der_type error_code_type;
12565 51934 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &error_code_type, 6, &error_code_datalen, &l);
12566 102983 : if (e == 0 && error_code_type != CONS) { e = ASN1_BAD_ID; }
12567 51934 : if(e) goto fail;
12568 51934 : p += l; len -= l; ret += l;
12569 51934 : error_code_oldlen = len;
12570 51934 : if (error_code_datalen > len) { e = ASN1_OVERRUN; goto fail; }
12571 51934 : len = error_code_datalen;
12572 51934 : e = decode_krb5int32(p, len, &(data)->error_code, &l);
12573 51934 : if(e) goto fail;
12574 51934 : p += l; len -= l; ret += l;
12575 51934 : len = error_code_oldlen - error_code_datalen;
12576 : }
12577 : {
12578 : size_t crealm_datalen, crealm_oldlen;
12579 : Der_type crealm_type;
12580 51934 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &crealm_type, 7, &crealm_datalen, &l);
12581 100515 : if (e == 0 && crealm_type != CONS) { e = ASN1_BAD_ID; }
12582 51934 : if(e) {
12583 2468 : (data)->crealm = NULL;
12584 : } else {
12585 49466 : (data)->crealm = calloc(1, sizeof(*(data)->crealm));
12586 49466 : if ((data)->crealm == NULL) { e = ENOMEM; goto fail; }
12587 49466 : p += l; len -= l; ret += l;
12588 49466 : crealm_oldlen = len;
12589 49466 : if (crealm_datalen > len) { e = ASN1_OVERRUN; goto fail; }
12590 49466 : len = crealm_datalen;
12591 49466 : e = decode_Realm(p, len, (data)->crealm, &l);
12592 49466 : if(e) goto fail;
12593 49466 : p += l; len -= l; ret += l;
12594 49466 : len = crealm_oldlen - crealm_datalen;
12595 : }
12596 : }
12597 : {
12598 : size_t cname_datalen, cname_oldlen;
12599 : Der_type cname_type;
12600 51934 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &cname_type, 8, &cname_datalen, &l);
12601 100636 : if (e == 0 && cname_type != CONS) { e = ASN1_BAD_ID; }
12602 51934 : if(e) {
12603 3232 : (data)->cname = NULL;
12604 : } else {
12605 48702 : (data)->cname = calloc(1, sizeof(*(data)->cname));
12606 48702 : if ((data)->cname == NULL) { e = ENOMEM; goto fail; }
12607 48702 : p += l; len -= l; ret += l;
12608 48702 : cname_oldlen = len;
12609 48702 : if (cname_datalen > len) { e = ASN1_OVERRUN; goto fail; }
12610 48702 : len = cname_datalen;
12611 48702 : e = decode_PrincipalName(p, len, (data)->cname, &l);
12612 48702 : if(e) goto fail;
12613 48702 : p += l; len -= l; ret += l;
12614 48702 : len = cname_oldlen - cname_datalen;
12615 : }
12616 : }
12617 : {
12618 : size_t realm_datalen, realm_oldlen;
12619 : Der_type realm_type;
12620 51934 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &realm_type, 9, &realm_datalen, &l);
12621 103868 : if (e == 0 && realm_type != CONS) { e = ASN1_BAD_ID; }
12622 51934 : if(e) goto fail;
12623 51934 : p += l; len -= l; ret += l;
12624 51934 : realm_oldlen = len;
12625 51934 : if (realm_datalen > len) { e = ASN1_OVERRUN; goto fail; }
12626 51934 : len = realm_datalen;
12627 51934 : e = decode_Realm(p, len, &(data)->realm, &l);
12628 51934 : if(e) goto fail;
12629 51934 : p += l; len -= l; ret += l;
12630 51934 : len = realm_oldlen - realm_datalen;
12631 : }
12632 : {
12633 : size_t sname_datalen, sname_oldlen;
12634 : Der_type sname_type;
12635 51934 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &sname_type, 10, &sname_datalen, &l);
12636 102983 : if (e == 0 && sname_type != CONS) { e = ASN1_BAD_ID; }
12637 51934 : if(e) goto fail;
12638 51934 : p += l; len -= l; ret += l;
12639 51934 : sname_oldlen = len;
12640 51934 : if (sname_datalen > len) { e = ASN1_OVERRUN; goto fail; }
12641 51934 : len = sname_datalen;
12642 51934 : e = decode_PrincipalName(p, len, &(data)->sname, &l);
12643 51934 : if(e) goto fail;
12644 51934 : p += l; len -= l; ret += l;
12645 51934 : len = sname_oldlen - sname_datalen;
12646 : }
12647 : {
12648 : size_t e_text_datalen, e_text_oldlen;
12649 : Der_type e_text_type;
12650 51934 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &e_text_type, 11, &e_text_datalen, &l);
12651 96400 : if (e == 0 && e_text_type != CONS) { e = ASN1_BAD_ID; }
12652 51934 : if(e) {
12653 6583 : (data)->e_text = NULL;
12654 : } else {
12655 45351 : (data)->e_text = calloc(1, sizeof(*(data)->e_text));
12656 45351 : if ((data)->e_text == NULL) { e = ENOMEM; goto fail; }
12657 45351 : p += l; len -= l; ret += l;
12658 45351 : e_text_oldlen = len;
12659 45351 : if (e_text_datalen > len) { e = ASN1_OVERRUN; goto fail; }
12660 45351 : len = e_text_datalen;
12661 : {
12662 : size_t e_text_Tag_datalen, e_text_Tag_oldlen;
12663 : Der_type e_text_Tag_type;
12664 45351 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &e_text_Tag_type, UT_GeneralString, &e_text_Tag_datalen, &l);
12665 45351 : if (e == 0 && e_text_Tag_type != PRIM) { e = ASN1_BAD_ID; }
12666 45351 : if(e) goto fail;
12667 45351 : p += l; len -= l; ret += l;
12668 45351 : e_text_Tag_oldlen = len;
12669 45351 : if (e_text_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
12670 45351 : len = e_text_Tag_datalen;
12671 45351 : e = der_get_general_string(p, len, (data)->e_text, &l);
12672 45351 : if(e) goto fail;
12673 45351 : p += l; len -= l; ret += l;
12674 45351 : len = e_text_Tag_oldlen - e_text_Tag_datalen;
12675 : }
12676 45351 : len = e_text_oldlen - e_text_datalen;
12677 : }
12678 : }
12679 : {
12680 : size_t e_data_datalen, e_data_oldlen;
12681 : Der_type e_data_type;
12682 51934 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &e_data_type, 12, &e_data_datalen, &l);
12683 83102 : if (e == 0 && e_data_type != CONS) { e = ASN1_BAD_ID; }
12684 51934 : if(e) {
12685 20766 : (data)->e_data = NULL;
12686 : } else {
12687 31168 : (data)->e_data = calloc(1, sizeof(*(data)->e_data));
12688 31168 : if ((data)->e_data == NULL) { e = ENOMEM; goto fail; }
12689 31168 : p += l; len -= l; ret += l;
12690 31168 : e_data_oldlen = len;
12691 31168 : if (e_data_datalen > len) { e = ASN1_OVERRUN; goto fail; }
12692 31168 : len = e_data_datalen;
12693 : {
12694 : size_t e_data_Tag_datalen, e_data_Tag_oldlen;
12695 : Der_type e_data_Tag_type;
12696 31168 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &e_data_Tag_type, UT_OctetString, &e_data_Tag_datalen, &l);
12697 31168 : if (e == 0 && e_data_Tag_type != PRIM) { e = ASN1_BAD_ID; }
12698 31168 : if(e) goto fail;
12699 31168 : p += l; len -= l; ret += l;
12700 31168 : e_data_Tag_oldlen = len;
12701 31168 : if (e_data_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
12702 31168 : len = e_data_Tag_datalen;
12703 31168 : e = der_get_octet_string(p, len, (data)->e_data, &l);
12704 31168 : if(e) goto fail;
12705 31168 : p += l; len -= l; ret += l;
12706 31168 : len = e_data_Tag_oldlen - e_data_Tag_datalen;
12707 : }
12708 31168 : len = e_data_oldlen - e_data_datalen;
12709 : }
12710 : }
12711 51934 : len = Top_Tag_oldlen - Top_Tag_datalen;
12712 : }
12713 51934 : len = Top_oldlen - Top_datalen;
12714 : }
12715 103868 : if(size) *size = ret;
12716 51049 : return 0;
12717 58679 : fail:
12718 58679 : free_KRB_ERROR(data);
12719 58679 : return e;
12720 : }
12721 :
12722 : void ASN1CALL
12723 171944 : free_KRB_ERROR(KRB_ERROR *data)
12724 : {
12725 171944 : free_krb5int32(&(data)->pvno);
12726 171944 : free_MESSAGE_TYPE(&(data)->msg_type);
12727 171944 : if((data)->ctime) {
12728 1884 : free_KerberosTime((data)->ctime);
12729 1884 : free((data)->ctime);
12730 1884 : (data)->ctime = NULL;
12731 : }
12732 171944 : if((data)->cusec) {
12733 1884 : free_krb5int32((data)->cusec);
12734 1884 : free((data)->cusec);
12735 1884 : (data)->cusec = NULL;
12736 : }
12737 171944 : free_KerberosTime(&(data)->stime);
12738 171944 : free_krb5int32(&(data)->susec);
12739 171944 : free_krb5int32(&(data)->error_code);
12740 171944 : if((data)->crealm) {
12741 49463 : free_Realm((data)->crealm);
12742 49463 : free((data)->crealm);
12743 49463 : (data)->crealm = NULL;
12744 : }
12745 171944 : if((data)->cname) {
12746 48699 : free_PrincipalName((data)->cname);
12747 48699 : free((data)->cname);
12748 48699 : (data)->cname = NULL;
12749 : }
12750 171944 : free_Realm(&(data)->realm);
12751 171944 : free_PrincipalName(&(data)->sname);
12752 171944 : if((data)->e_text) {
12753 45351 : der_free_general_string((data)->e_text);
12754 45351 : free((data)->e_text);
12755 45351 : (data)->e_text = NULL;
12756 : }
12757 171944 : if((data)->e_data) {
12758 31168 : der_free_octet_string((data)->e_data);
12759 31168 : free((data)->e_data);
12760 31168 : (data)->e_data = NULL;
12761 : }
12762 171944 : }
12763 :
12764 : size_t ASN1CALL
12765 29488 : length_KRB_ERROR(const KRB_ERROR *data)
12766 : {
12767 29488 : size_t ret = 0;
12768 : {
12769 29488 : size_t Top_tag_tag_oldret = ret;
12770 29488 : ret = 0;
12771 29488 : ret += length_krb5int32(&(data)->pvno);
12772 29488 : ret += 1 + der_length_len (ret);
12773 29488 : ret += Top_tag_tag_oldret;
12774 : }
12775 : {
12776 29488 : size_t Top_tag_tag_oldret = ret;
12777 29488 : ret = 0;
12778 29488 : ret += length_MESSAGE_TYPE(&(data)->msg_type);
12779 29488 : ret += 1 + der_length_len (ret);
12780 29488 : ret += Top_tag_tag_oldret;
12781 : }
12782 29488 : if((data)->ctime){
12783 932 : size_t Top_tag_tag_oldret = ret;
12784 932 : ret = 0;
12785 932 : ret += length_KerberosTime((data)->ctime);
12786 932 : ret += 1 + der_length_len (ret);
12787 932 : ret += Top_tag_tag_oldret;
12788 : }
12789 29488 : if((data)->cusec){
12790 932 : size_t Top_tag_tag_oldret = ret;
12791 932 : ret = 0;
12792 932 : ret += length_krb5int32((data)->cusec);
12793 932 : ret += 1 + der_length_len (ret);
12794 932 : ret += Top_tag_tag_oldret;
12795 : }
12796 : {
12797 29488 : size_t Top_tag_tag_oldret = ret;
12798 29488 : ret = 0;
12799 29488 : ret += length_KerberosTime(&(data)->stime);
12800 29488 : ret += 1 + der_length_len (ret);
12801 29488 : ret += Top_tag_tag_oldret;
12802 : }
12803 : {
12804 29488 : size_t Top_tag_tag_oldret = ret;
12805 29488 : ret = 0;
12806 29488 : ret += length_krb5int32(&(data)->susec);
12807 29488 : ret += 1 + der_length_len (ret);
12808 29488 : ret += Top_tag_tag_oldret;
12809 : }
12810 : {
12811 29488 : size_t Top_tag_tag_oldret = ret;
12812 29488 : ret = 0;
12813 29488 : ret += length_krb5int32(&(data)->error_code);
12814 29488 : ret += 1 + der_length_len (ret);
12815 29488 : ret += Top_tag_tag_oldret;
12816 : }
12817 29488 : if((data)->crealm){
12818 28549 : size_t Top_tag_tag_oldret = ret;
12819 28549 : ret = 0;
12820 28549 : ret += length_Realm((data)->crealm);
12821 28549 : ret += 1 + der_length_len (ret);
12822 28549 : ret += Top_tag_tag_oldret;
12823 : }
12824 29488 : if((data)->cname){
12825 28266 : size_t Top_tag_tag_oldret = ret;
12826 28266 : ret = 0;
12827 28266 : ret += length_PrincipalName((data)->cname);
12828 28266 : ret += 1 + der_length_len (ret);
12829 28266 : ret += Top_tag_tag_oldret;
12830 : }
12831 : {
12832 29488 : size_t Top_tag_tag_oldret = ret;
12833 29488 : ret = 0;
12834 29488 : ret += length_Realm(&(data)->realm);
12835 29488 : ret += 1 + der_length_len (ret);
12836 29488 : ret += Top_tag_tag_oldret;
12837 : }
12838 : {
12839 29488 : size_t Top_tag_tag_oldret = ret;
12840 29488 : ret = 0;
12841 29488 : ret += length_PrincipalName(&(data)->sname);
12842 29488 : ret += 1 + der_length_len (ret);
12843 29488 : ret += Top_tag_tag_oldret;
12844 : }
12845 29488 : if((data)->e_text){
12846 27014 : size_t Top_tag_tag_oldret = ret;
12847 27014 : ret = 0;
12848 27014 : ret += der_length_general_string((data)->e_text);
12849 27014 : ret += 1 + der_length_len (ret);
12850 27014 : ret += 1 + der_length_len (ret);
12851 27014 : ret += Top_tag_tag_oldret;
12852 : }
12853 29488 : if((data)->e_data){
12854 14746 : size_t Top_tag_tag_oldret = ret;
12855 14746 : ret = 0;
12856 14746 : ret += der_length_octet_string((data)->e_data);
12857 14746 : ret += 1 + der_length_len (ret);
12858 14746 : ret += 1 + der_length_len (ret);
12859 14746 : ret += Top_tag_tag_oldret;
12860 : }
12861 29488 : ret += 1 + der_length_len (ret);
12862 29488 : ret += 1 + der_length_len (ret);
12863 29488 : return ret;
12864 : }
12865 :
12866 : int ASN1CALL
12867 0 : copy_KRB_ERROR(const KRB_ERROR *from, KRB_ERROR *to)
12868 : {
12869 0 : memset(to, 0, sizeof(*to));
12870 0 : if(copy_krb5int32(&(from)->pvno, &(to)->pvno)) goto fail;
12871 0 : if(copy_MESSAGE_TYPE(&(from)->msg_type, &(to)->msg_type)) goto fail;
12872 0 : if((from)->ctime) {
12873 0 : (to)->ctime = malloc(sizeof(*(to)->ctime));
12874 0 : if((to)->ctime == NULL) goto fail;
12875 0 : if(copy_KerberosTime((from)->ctime, (to)->ctime)) goto fail;
12876 : }else
12877 0 : (to)->ctime = NULL;
12878 0 : if((from)->cusec) {
12879 0 : (to)->cusec = malloc(sizeof(*(to)->cusec));
12880 0 : if((to)->cusec == NULL) goto fail;
12881 0 : if(copy_krb5int32((from)->cusec, (to)->cusec)) goto fail;
12882 : }else
12883 0 : (to)->cusec = NULL;
12884 0 : if(copy_KerberosTime(&(from)->stime, &(to)->stime)) goto fail;
12885 0 : if(copy_krb5int32(&(from)->susec, &(to)->susec)) goto fail;
12886 0 : if(copy_krb5int32(&(from)->error_code, &(to)->error_code)) goto fail;
12887 0 : if((from)->crealm) {
12888 0 : (to)->crealm = malloc(sizeof(*(to)->crealm));
12889 0 : if((to)->crealm == NULL) goto fail;
12890 0 : if(copy_Realm((from)->crealm, (to)->crealm)) goto fail;
12891 : }else
12892 0 : (to)->crealm = NULL;
12893 0 : if((from)->cname) {
12894 0 : (to)->cname = malloc(sizeof(*(to)->cname));
12895 0 : if((to)->cname == NULL) goto fail;
12896 0 : if(copy_PrincipalName((from)->cname, (to)->cname)) goto fail;
12897 : }else
12898 0 : (to)->cname = NULL;
12899 0 : if(copy_Realm(&(from)->realm, &(to)->realm)) goto fail;
12900 0 : if(copy_PrincipalName(&(from)->sname, &(to)->sname)) goto fail;
12901 0 : if((from)->e_text) {
12902 0 : (to)->e_text = malloc(sizeof(*(to)->e_text));
12903 0 : if((to)->e_text == NULL) goto fail;
12904 0 : if(der_copy_general_string((from)->e_text, (to)->e_text)) goto fail;
12905 : }else
12906 0 : (to)->e_text = NULL;
12907 0 : if((from)->e_data) {
12908 0 : (to)->e_data = malloc(sizeof(*(to)->e_data));
12909 0 : if((to)->e_data == NULL) goto fail;
12910 0 : if(der_copy_octet_string((from)->e_data, (to)->e_data)) goto fail;
12911 : }else
12912 0 : (to)->e_data = NULL;
12913 0 : return 0;
12914 0 : fail:
12915 0 : free_KRB_ERROR(to);
12916 0 : return ENOMEM;
12917 : }
12918 :
12919 : int ASN1CALL
12920 21 : encode_ChangePasswdDataMS(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const ChangePasswdDataMS *data, size_t *size)
12921 : {
12922 21 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
12923 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
12924 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
12925 :
12926 : /* targrealm */
12927 21 : if((data)->targrealm) {
12928 21 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
12929 21 : ret = 0;
12930 21 : e = encode_Realm(p, len, (data)->targrealm, &l);
12931 21 : if (e) return e;
12932 21 : p -= l; len -= l; ret += l;
12933 :
12934 21 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
12935 21 : if (e) return e;
12936 21 : p -= l; len -= l; ret += l;
12937 :
12938 21 : ret += Top_tag_oldret;
12939 : }
12940 : /* targname */
12941 21 : if((data)->targname) {
12942 21 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
12943 21 : ret = 0;
12944 21 : e = encode_PrincipalName(p, len, (data)->targname, &l);
12945 21 : if (e) return e;
12946 21 : p -= l; len -= l; ret += l;
12947 :
12948 21 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
12949 21 : if (e) return e;
12950 21 : p -= l; len -= l; ret += l;
12951 :
12952 21 : ret += Top_tag_oldret;
12953 : }
12954 : /* newpasswd */
12955 : {
12956 21 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
12957 21 : ret = 0;
12958 21 : e = der_put_octet_string(p, len, &(data)->newpasswd, &l);
12959 21 : if (e) return e;
12960 21 : p -= l; len -= l; ret += l;
12961 :
12962 21 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_OctetString, &l);
12963 21 : if (e) return e;
12964 21 : p -= l; len -= l; ret += l;
12965 :
12966 21 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
12967 21 : if (e) return e;
12968 21 : p -= l; len -= l; ret += l;
12969 :
12970 21 : ret += Top_tag_oldret;
12971 : }
12972 21 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
12973 21 : if (e) return e;
12974 21 : p -= l; len -= l; ret += l;
12975 :
12976 21 : *size = ret;
12977 21 : return 0;
12978 : }
12979 :
12980 : int ASN1CALL
12981 21 : decode_ChangePasswdDataMS(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, ChangePasswdDataMS *data, size_t *size)
12982 : {
12983 21 : size_t ret = 0;
12984 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
12985 : int e HEIMDAL_UNUSED_ATTRIBUTE;
12986 :
12987 21 : memset(data, 0, sizeof(*data));
12988 : {
12989 : size_t Top_datalen, Top_oldlen;
12990 : Der_type Top_type;
12991 21 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
12992 21 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
12993 21 : if(e) goto fail;
12994 21 : p += l; len -= l; ret += l;
12995 21 : Top_oldlen = len;
12996 21 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
12997 21 : len = Top_datalen;
12998 : {
12999 : size_t newpasswd_datalen, newpasswd_oldlen;
13000 : Der_type newpasswd_type;
13001 21 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &newpasswd_type, 0, &newpasswd_datalen, &l);
13002 21 : if (e == 0 && newpasswd_type != CONS) { e = ASN1_BAD_ID; }
13003 21 : if(e) goto fail;
13004 21 : p += l; len -= l; ret += l;
13005 21 : newpasswd_oldlen = len;
13006 21 : if (newpasswd_datalen > len) { e = ASN1_OVERRUN; goto fail; }
13007 21 : len = newpasswd_datalen;
13008 : {
13009 : size_t newpasswd_Tag_datalen, newpasswd_Tag_oldlen;
13010 : Der_type newpasswd_Tag_type;
13011 21 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &newpasswd_Tag_type, UT_OctetString, &newpasswd_Tag_datalen, &l);
13012 21 : if (e == 0 && newpasswd_Tag_type != PRIM) { e = ASN1_BAD_ID; }
13013 21 : if(e) goto fail;
13014 21 : p += l; len -= l; ret += l;
13015 21 : newpasswd_Tag_oldlen = len;
13016 21 : if (newpasswd_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
13017 21 : len = newpasswd_Tag_datalen;
13018 21 : e = der_get_octet_string(p, len, &(data)->newpasswd, &l);
13019 21 : if(e) goto fail;
13020 21 : p += l; len -= l; ret += l;
13021 21 : len = newpasswd_Tag_oldlen - newpasswd_Tag_datalen;
13022 : }
13023 21 : len = newpasswd_oldlen - newpasswd_datalen;
13024 : }
13025 : {
13026 : size_t targname_datalen, targname_oldlen;
13027 : Der_type targname_type;
13028 21 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &targname_type, 1, &targname_datalen, &l);
13029 42 : if (e == 0 && targname_type != CONS) { e = ASN1_BAD_ID; }
13030 21 : if(e) {
13031 0 : (data)->targname = NULL;
13032 : } else {
13033 21 : (data)->targname = calloc(1, sizeof(*(data)->targname));
13034 21 : if ((data)->targname == NULL) { e = ENOMEM; goto fail; }
13035 21 : p += l; len -= l; ret += l;
13036 21 : targname_oldlen = len;
13037 21 : if (targname_datalen > len) { e = ASN1_OVERRUN; goto fail; }
13038 21 : len = targname_datalen;
13039 21 : e = decode_PrincipalName(p, len, (data)->targname, &l);
13040 21 : if(e) goto fail;
13041 21 : p += l; len -= l; ret += l;
13042 21 : len = targname_oldlen - targname_datalen;
13043 : }
13044 : }
13045 : {
13046 : size_t targrealm_datalen, targrealm_oldlen;
13047 : Der_type targrealm_type;
13048 21 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &targrealm_type, 2, &targrealm_datalen, &l);
13049 42 : if (e == 0 && targrealm_type != CONS) { e = ASN1_BAD_ID; }
13050 21 : if(e) {
13051 0 : (data)->targrealm = NULL;
13052 : } else {
13053 21 : (data)->targrealm = calloc(1, sizeof(*(data)->targrealm));
13054 21 : if ((data)->targrealm == NULL) { e = ENOMEM; goto fail; }
13055 21 : p += l; len -= l; ret += l;
13056 21 : targrealm_oldlen = len;
13057 21 : if (targrealm_datalen > len) { e = ASN1_OVERRUN; goto fail; }
13058 21 : len = targrealm_datalen;
13059 21 : e = decode_Realm(p, len, (data)->targrealm, &l);
13060 21 : if(e) goto fail;
13061 21 : p += l; len -= l; ret += l;
13062 21 : len = targrealm_oldlen - targrealm_datalen;
13063 : }
13064 : }
13065 21 : len = Top_oldlen - Top_datalen;
13066 : }
13067 42 : if(size) *size = ret;
13068 21 : return 0;
13069 0 : fail:
13070 0 : free_ChangePasswdDataMS(data);
13071 0 : return e;
13072 : }
13073 :
13074 : void ASN1CALL
13075 21 : free_ChangePasswdDataMS(ChangePasswdDataMS *data)
13076 : {
13077 21 : der_free_octet_string(&(data)->newpasswd);
13078 21 : if((data)->targname) {
13079 21 : free_PrincipalName((data)->targname);
13080 21 : free((data)->targname);
13081 21 : (data)->targname = NULL;
13082 : }
13083 21 : if((data)->targrealm) {
13084 21 : free_Realm((data)->targrealm);
13085 21 : free((data)->targrealm);
13086 21 : (data)->targrealm = NULL;
13087 : }
13088 21 : }
13089 :
13090 : size_t ASN1CALL
13091 21 : length_ChangePasswdDataMS(const ChangePasswdDataMS *data)
13092 : {
13093 21 : size_t ret = 0;
13094 : {
13095 21 : size_t Top_tag_oldret = ret;
13096 21 : ret = 0;
13097 21 : ret += der_length_octet_string(&(data)->newpasswd);
13098 21 : ret += 1 + der_length_len (ret);
13099 21 : ret += 1 + der_length_len (ret);
13100 21 : ret += Top_tag_oldret;
13101 : }
13102 21 : if((data)->targname){
13103 21 : size_t Top_tag_oldret = ret;
13104 21 : ret = 0;
13105 21 : ret += length_PrincipalName((data)->targname);
13106 21 : ret += 1 + der_length_len (ret);
13107 21 : ret += Top_tag_oldret;
13108 : }
13109 21 : if((data)->targrealm){
13110 21 : size_t Top_tag_oldret = ret;
13111 21 : ret = 0;
13112 21 : ret += length_Realm((data)->targrealm);
13113 21 : ret += 1 + der_length_len (ret);
13114 21 : ret += Top_tag_oldret;
13115 : }
13116 21 : ret += 1 + der_length_len (ret);
13117 21 : return ret;
13118 : }
13119 :
13120 : int ASN1CALL
13121 0 : copy_ChangePasswdDataMS(const ChangePasswdDataMS *from, ChangePasswdDataMS *to)
13122 : {
13123 0 : memset(to, 0, sizeof(*to));
13124 0 : if(der_copy_octet_string(&(from)->newpasswd, &(to)->newpasswd)) goto fail;
13125 0 : if((from)->targname) {
13126 0 : (to)->targname = malloc(sizeof(*(to)->targname));
13127 0 : if((to)->targname == NULL) goto fail;
13128 0 : if(copy_PrincipalName((from)->targname, (to)->targname)) goto fail;
13129 : }else
13130 0 : (to)->targname = NULL;
13131 0 : if((from)->targrealm) {
13132 0 : (to)->targrealm = malloc(sizeof(*(to)->targrealm));
13133 0 : if((to)->targrealm == NULL) goto fail;
13134 0 : if(copy_Realm((from)->targrealm, (to)->targrealm)) goto fail;
13135 : }else
13136 0 : (to)->targrealm = NULL;
13137 0 : return 0;
13138 0 : fail:
13139 0 : free_ChangePasswdDataMS(to);
13140 0 : return ENOMEM;
13141 : }
13142 :
13143 : int ASN1CALL
13144 20329 : encode_EtypeList(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const EtypeList *data, size_t *size)
13145 : {
13146 20329 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
13147 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
13148 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
13149 :
13150 117420 : for(i = (int)(data)->len - 1; i >= 0; --i) {
13151 97091 : size_t Top_tag_for_oldret = ret;
13152 97091 : ret = 0;
13153 97091 : e = encode_ENCTYPE(p, len, &(data)->val[i], &l);
13154 97091 : if (e) return e;
13155 97091 : p -= l; len -= l; ret += l;
13156 :
13157 97091 : ret += Top_tag_for_oldret;
13158 : }
13159 20329 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
13160 20329 : if (e) return e;
13161 20329 : p -= l; len -= l; ret += l;
13162 :
13163 20329 : *size = ret;
13164 20329 : return 0;
13165 : }
13166 :
13167 : int ASN1CALL
13168 19792 : decode_EtypeList(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, EtypeList *data, size_t *size)
13169 : {
13170 19792 : size_t ret = 0;
13171 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
13172 : int e HEIMDAL_UNUSED_ATTRIBUTE;
13173 :
13174 19792 : memset(data, 0, sizeof(*data));
13175 : {
13176 : size_t Top_datalen, Top_oldlen;
13177 : Der_type Top_type;
13178 19792 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
13179 19792 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
13180 19792 : if(e) goto fail;
13181 19792 : p += l; len -= l; ret += l;
13182 19792 : Top_oldlen = len;
13183 19792 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
13184 19792 : len = Top_datalen;
13185 : {
13186 19792 : size_t Top_Tag_origlen = len;
13187 19792 : size_t Top_Tag_oldret = ret;
13188 19792 : size_t Top_Tag_olen = 0;
13189 : void *Top_Tag_tmp;
13190 19792 : ret = 0;
13191 19792 : (data)->len = 0;
13192 19792 : (data)->val = NULL;
13193 134177 : while(ret < Top_Tag_origlen) {
13194 94593 : size_t Top_Tag_nlen = Top_Tag_olen + sizeof(*((data)->val));
13195 94593 : if (Top_Tag_olen > Top_Tag_nlen) { e = ASN1_OVERFLOW; goto fail; }
13196 94593 : Top_Tag_olen = Top_Tag_nlen;
13197 94593 : Top_Tag_tmp = realloc((data)->val, Top_Tag_olen);
13198 94593 : if (Top_Tag_tmp == NULL) { e = ENOMEM; goto fail; }
13199 94593 : (data)->val = Top_Tag_tmp;
13200 94593 : e = decode_ENCTYPE(p, len, &(data)->val[(data)->len], &l);
13201 94593 : if(e) goto fail;
13202 94593 : p += l; len -= l; ret += l;
13203 94593 : (data)->len++;
13204 94593 : len = Top_Tag_origlen - ret;
13205 : }
13206 19792 : ret += Top_Tag_oldret;
13207 : }
13208 19792 : len = Top_oldlen - Top_datalen;
13209 : }
13210 19792 : if(size) *size = ret;
13211 19054 : return 0;
13212 0 : fail:
13213 0 : free_EtypeList(data);
13214 0 : return e;
13215 : }
13216 :
13217 : void ASN1CALL
13218 82486 : free_EtypeList(EtypeList *data)
13219 : {
13220 356656 : while((data)->len){
13221 191684 : free_ENCTYPE(&(data)->val[(data)->len-1]);
13222 191684 : (data)->len--;
13223 : }
13224 82486 : free((data)->val);
13225 82486 : (data)->val = NULL;
13226 82486 : }
13227 :
13228 : size_t ASN1CALL
13229 20329 : length_EtypeList(const EtypeList *data)
13230 : {
13231 20329 : size_t ret = 0;
13232 : {
13233 20329 : size_t Top_tag_oldret = ret;
13234 : int i;
13235 20329 : ret = 0;
13236 117420 : for(i = (data)->len - 1; i >= 0; --i){
13237 97091 : size_t Top_tag_for_oldret = ret;
13238 97091 : ret = 0;
13239 97091 : ret += length_ENCTYPE(&(data)->val[i]);
13240 97091 : ret += Top_tag_for_oldret;
13241 : }
13242 20329 : ret += Top_tag_oldret;
13243 : }
13244 20329 : ret += 1 + der_length_len (ret);
13245 20329 : return ret;
13246 : }
13247 :
13248 : int ASN1CALL
13249 0 : copy_EtypeList(const EtypeList *from, EtypeList *to)
13250 : {
13251 0 : memset(to, 0, sizeof(*to));
13252 0 : if(((to)->val = malloc((from)->len * sizeof(*(to)->val))) == NULL && (from)->len != 0)
13253 0 : goto fail;
13254 0 : for((to)->len = 0; (to)->len < (from)->len; (to)->len++){
13255 0 : if(copy_ENCTYPE(&(from)->val[(to)->len], &(to)->val[(to)->len])) goto fail;
13256 : }
13257 0 : return 0;
13258 0 : fail:
13259 0 : free_EtypeList(to);
13260 0 : return ENOMEM;
13261 : }
13262 :
13263 : int ASN1CALL
13264 20329 : encode_AD_IF_RELEVANT(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const AD_IF_RELEVANT *data, size_t *size)
13265 : {
13266 20329 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
13267 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
13268 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
13269 :
13270 20329 : e = encode_AuthorizationData(p, len, data, &l);
13271 20329 : if (e) return e;
13272 20329 : p -= l; len -= l; ret += l;
13273 :
13274 20329 : *size = ret;
13275 20329 : return 0;
13276 : }
13277 :
13278 : int ASN1CALL
13279 19792 : decode_AD_IF_RELEVANT(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, AD_IF_RELEVANT *data, size_t *size)
13280 : {
13281 19792 : size_t ret = 0;
13282 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
13283 : int e HEIMDAL_UNUSED_ATTRIBUTE;
13284 :
13285 19792 : memset(data, 0, sizeof(*data));
13286 19792 : e = decode_AuthorizationData(p, len, data, &l);
13287 19792 : if(e) goto fail;
13288 19792 : p += l; len -= l; ret += l;
13289 19792 : if(size) *size = ret;
13290 19054 : return 0;
13291 0 : fail:
13292 0 : free_AD_IF_RELEVANT(data);
13293 0 : return e;
13294 : }
13295 :
13296 : void ASN1CALL
13297 19792 : free_AD_IF_RELEVANT(AD_IF_RELEVANT *data)
13298 : {
13299 19792 : free_AuthorizationData(data);
13300 19792 : }
13301 :
13302 : size_t ASN1CALL
13303 20329 : length_AD_IF_RELEVANT(const AD_IF_RELEVANT *data)
13304 : {
13305 20329 : size_t ret = 0;
13306 20329 : ret += length_AuthorizationData(data);
13307 20329 : return ret;
13308 : }
13309 :
13310 : int ASN1CALL
13311 0 : copy_AD_IF_RELEVANT(const AD_IF_RELEVANT *from, AD_IF_RELEVANT *to)
13312 : {
13313 0 : memset(to, 0, sizeof(*to));
13314 0 : if(copy_AuthorizationData(from, to)) goto fail;
13315 0 : return 0;
13316 0 : fail:
13317 0 : free_AD_IF_RELEVANT(to);
13318 0 : return ENOMEM;
13319 : }
13320 :
13321 : int ASN1CALL
13322 0 : encode_AD_KDCIssued(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const AD_KDCIssued *data, size_t *size)
13323 : {
13324 0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
13325 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
13326 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
13327 :
13328 : /* elements */
13329 : {
13330 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
13331 0 : ret = 0;
13332 0 : e = encode_AuthorizationData(p, len, &(data)->elements, &l);
13333 0 : if (e) return e;
13334 0 : p -= l; len -= l; ret += l;
13335 :
13336 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 3, &l);
13337 0 : if (e) return e;
13338 0 : p -= l; len -= l; ret += l;
13339 :
13340 0 : ret += Top_tag_oldret;
13341 : }
13342 : /* i-sname */
13343 0 : if((data)->i_sname) {
13344 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
13345 0 : ret = 0;
13346 0 : e = encode_PrincipalName(p, len, (data)->i_sname, &l);
13347 0 : if (e) return e;
13348 0 : p -= l; len -= l; ret += l;
13349 :
13350 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
13351 0 : if (e) return e;
13352 0 : p -= l; len -= l; ret += l;
13353 :
13354 0 : ret += Top_tag_oldret;
13355 : }
13356 : /* i-realm */
13357 0 : if((data)->i_realm) {
13358 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
13359 0 : ret = 0;
13360 0 : e = encode_Realm(p, len, (data)->i_realm, &l);
13361 0 : if (e) return e;
13362 0 : p -= l; len -= l; ret += l;
13363 :
13364 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
13365 0 : if (e) return e;
13366 0 : p -= l; len -= l; ret += l;
13367 :
13368 0 : ret += Top_tag_oldret;
13369 : }
13370 : /* ad-checksum */
13371 : {
13372 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
13373 0 : ret = 0;
13374 0 : e = encode_Checksum(p, len, &(data)->ad_checksum, &l);
13375 0 : if (e) return e;
13376 0 : p -= l; len -= l; ret += l;
13377 :
13378 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
13379 0 : if (e) return e;
13380 0 : p -= l; len -= l; ret += l;
13381 :
13382 0 : ret += Top_tag_oldret;
13383 : }
13384 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
13385 0 : if (e) return e;
13386 0 : p -= l; len -= l; ret += l;
13387 :
13388 0 : *size = ret;
13389 0 : return 0;
13390 : }
13391 :
13392 : int ASN1CALL
13393 0 : decode_AD_KDCIssued(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, AD_KDCIssued *data, size_t *size)
13394 : {
13395 0 : size_t ret = 0;
13396 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
13397 : int e HEIMDAL_UNUSED_ATTRIBUTE;
13398 :
13399 0 : memset(data, 0, sizeof(*data));
13400 : {
13401 : size_t Top_datalen, Top_oldlen;
13402 : Der_type Top_type;
13403 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
13404 0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
13405 0 : if(e) goto fail;
13406 0 : p += l; len -= l; ret += l;
13407 0 : Top_oldlen = len;
13408 0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
13409 0 : len = Top_datalen;
13410 : {
13411 : size_t ad_checksum_datalen, ad_checksum_oldlen;
13412 : Der_type ad_checksum_type;
13413 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &ad_checksum_type, 0, &ad_checksum_datalen, &l);
13414 0 : if (e == 0 && ad_checksum_type != CONS) { e = ASN1_BAD_ID; }
13415 0 : if(e) goto fail;
13416 0 : p += l; len -= l; ret += l;
13417 0 : ad_checksum_oldlen = len;
13418 0 : if (ad_checksum_datalen > len) { e = ASN1_OVERRUN; goto fail; }
13419 0 : len = ad_checksum_datalen;
13420 0 : e = decode_Checksum(p, len, &(data)->ad_checksum, &l);
13421 0 : if(e) goto fail;
13422 0 : p += l; len -= l; ret += l;
13423 0 : len = ad_checksum_oldlen - ad_checksum_datalen;
13424 : }
13425 : {
13426 : size_t i_realm_datalen, i_realm_oldlen;
13427 : Der_type i_realm_type;
13428 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &i_realm_type, 1, &i_realm_datalen, &l);
13429 0 : if (e == 0 && i_realm_type != CONS) { e = ASN1_BAD_ID; }
13430 0 : if(e) {
13431 0 : (data)->i_realm = NULL;
13432 : } else {
13433 0 : (data)->i_realm = calloc(1, sizeof(*(data)->i_realm));
13434 0 : if ((data)->i_realm == NULL) { e = ENOMEM; goto fail; }
13435 0 : p += l; len -= l; ret += l;
13436 0 : i_realm_oldlen = len;
13437 0 : if (i_realm_datalen > len) { e = ASN1_OVERRUN; goto fail; }
13438 0 : len = i_realm_datalen;
13439 0 : e = decode_Realm(p, len, (data)->i_realm, &l);
13440 0 : if(e) goto fail;
13441 0 : p += l; len -= l; ret += l;
13442 0 : len = i_realm_oldlen - i_realm_datalen;
13443 : }
13444 : }
13445 : {
13446 : size_t i_sname_datalen, i_sname_oldlen;
13447 : Der_type i_sname_type;
13448 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &i_sname_type, 2, &i_sname_datalen, &l);
13449 0 : if (e == 0 && i_sname_type != CONS) { e = ASN1_BAD_ID; }
13450 0 : if(e) {
13451 0 : (data)->i_sname = NULL;
13452 : } else {
13453 0 : (data)->i_sname = calloc(1, sizeof(*(data)->i_sname));
13454 0 : if ((data)->i_sname == NULL) { e = ENOMEM; goto fail; }
13455 0 : p += l; len -= l; ret += l;
13456 0 : i_sname_oldlen = len;
13457 0 : if (i_sname_datalen > len) { e = ASN1_OVERRUN; goto fail; }
13458 0 : len = i_sname_datalen;
13459 0 : e = decode_PrincipalName(p, len, (data)->i_sname, &l);
13460 0 : if(e) goto fail;
13461 0 : p += l; len -= l; ret += l;
13462 0 : len = i_sname_oldlen - i_sname_datalen;
13463 : }
13464 : }
13465 : {
13466 : size_t elements_datalen, elements_oldlen;
13467 : Der_type elements_type;
13468 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &elements_type, 3, &elements_datalen, &l);
13469 0 : if (e == 0 && elements_type != CONS) { e = ASN1_BAD_ID; }
13470 0 : if(e) goto fail;
13471 0 : p += l; len -= l; ret += l;
13472 0 : elements_oldlen = len;
13473 0 : if (elements_datalen > len) { e = ASN1_OVERRUN; goto fail; }
13474 0 : len = elements_datalen;
13475 0 : e = decode_AuthorizationData(p, len, &(data)->elements, &l);
13476 0 : if(e) goto fail;
13477 0 : p += l; len -= l; ret += l;
13478 0 : len = elements_oldlen - elements_datalen;
13479 : }
13480 0 : len = Top_oldlen - Top_datalen;
13481 : }
13482 0 : if(size) *size = ret;
13483 0 : return 0;
13484 0 : fail:
13485 0 : free_AD_KDCIssued(data);
13486 0 : return e;
13487 : }
13488 :
13489 : void ASN1CALL
13490 0 : free_AD_KDCIssued(AD_KDCIssued *data)
13491 : {
13492 0 : free_Checksum(&(data)->ad_checksum);
13493 0 : if((data)->i_realm) {
13494 0 : free_Realm((data)->i_realm);
13495 0 : free((data)->i_realm);
13496 0 : (data)->i_realm = NULL;
13497 : }
13498 0 : if((data)->i_sname) {
13499 0 : free_PrincipalName((data)->i_sname);
13500 0 : free((data)->i_sname);
13501 0 : (data)->i_sname = NULL;
13502 : }
13503 0 : free_AuthorizationData(&(data)->elements);
13504 0 : }
13505 :
13506 : size_t ASN1CALL
13507 0 : length_AD_KDCIssued(const AD_KDCIssued *data)
13508 : {
13509 0 : size_t ret = 0;
13510 : {
13511 0 : size_t Top_tag_oldret = ret;
13512 0 : ret = 0;
13513 0 : ret += length_Checksum(&(data)->ad_checksum);
13514 0 : ret += 1 + der_length_len (ret);
13515 0 : ret += Top_tag_oldret;
13516 : }
13517 0 : if((data)->i_realm){
13518 0 : size_t Top_tag_oldret = ret;
13519 0 : ret = 0;
13520 0 : ret += length_Realm((data)->i_realm);
13521 0 : ret += 1 + der_length_len (ret);
13522 0 : ret += Top_tag_oldret;
13523 : }
13524 0 : if((data)->i_sname){
13525 0 : size_t Top_tag_oldret = ret;
13526 0 : ret = 0;
13527 0 : ret += length_PrincipalName((data)->i_sname);
13528 0 : ret += 1 + der_length_len (ret);
13529 0 : ret += Top_tag_oldret;
13530 : }
13531 : {
13532 0 : size_t Top_tag_oldret = ret;
13533 0 : ret = 0;
13534 0 : ret += length_AuthorizationData(&(data)->elements);
13535 0 : ret += 1 + der_length_len (ret);
13536 0 : ret += Top_tag_oldret;
13537 : }
13538 0 : ret += 1 + der_length_len (ret);
13539 0 : return ret;
13540 : }
13541 :
13542 : int ASN1CALL
13543 0 : copy_AD_KDCIssued(const AD_KDCIssued *from, AD_KDCIssued *to)
13544 : {
13545 0 : memset(to, 0, sizeof(*to));
13546 0 : if(copy_Checksum(&(from)->ad_checksum, &(to)->ad_checksum)) goto fail;
13547 0 : if((from)->i_realm) {
13548 0 : (to)->i_realm = malloc(sizeof(*(to)->i_realm));
13549 0 : if((to)->i_realm == NULL) goto fail;
13550 0 : if(copy_Realm((from)->i_realm, (to)->i_realm)) goto fail;
13551 : }else
13552 0 : (to)->i_realm = NULL;
13553 0 : if((from)->i_sname) {
13554 0 : (to)->i_sname = malloc(sizeof(*(to)->i_sname));
13555 0 : if((to)->i_sname == NULL) goto fail;
13556 0 : if(copy_PrincipalName((from)->i_sname, (to)->i_sname)) goto fail;
13557 : }else
13558 0 : (to)->i_sname = NULL;
13559 0 : if(copy_AuthorizationData(&(from)->elements, &(to)->elements)) goto fail;
13560 0 : return 0;
13561 0 : fail:
13562 0 : free_AD_KDCIssued(to);
13563 0 : return ENOMEM;
13564 : }
13565 :
13566 : int ASN1CALL
13567 0 : encode_AD_AND_OR(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const AD_AND_OR *data, size_t *size)
13568 : {
13569 0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
13570 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
13571 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
13572 :
13573 : /* elements */
13574 : {
13575 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
13576 0 : ret = 0;
13577 0 : e = encode_AuthorizationData(p, len, &(data)->elements, &l);
13578 0 : if (e) return e;
13579 0 : p -= l; len -= l; ret += l;
13580 :
13581 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
13582 0 : if (e) return e;
13583 0 : p -= l; len -= l; ret += l;
13584 :
13585 0 : ret += Top_tag_oldret;
13586 : }
13587 : /* condition-count */
13588 : {
13589 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
13590 0 : ret = 0;
13591 0 : e = der_put_heim_integer(p, len, &(data)->condition_count, &l);
13592 0 : if (e) return e;
13593 0 : p -= l; len -= l; ret += l;
13594 :
13595 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_Integer, &l);
13596 0 : if (e) return e;
13597 0 : p -= l; len -= l; ret += l;
13598 :
13599 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
13600 0 : if (e) return e;
13601 0 : p -= l; len -= l; ret += l;
13602 :
13603 0 : ret += Top_tag_oldret;
13604 : }
13605 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
13606 0 : if (e) return e;
13607 0 : p -= l; len -= l; ret += l;
13608 :
13609 0 : *size = ret;
13610 0 : return 0;
13611 : }
13612 :
13613 : int ASN1CALL
13614 0 : decode_AD_AND_OR(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, AD_AND_OR *data, size_t *size)
13615 : {
13616 0 : size_t ret = 0;
13617 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
13618 : int e HEIMDAL_UNUSED_ATTRIBUTE;
13619 :
13620 0 : memset(data, 0, sizeof(*data));
13621 : {
13622 : size_t Top_datalen, Top_oldlen;
13623 : Der_type Top_type;
13624 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
13625 0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
13626 0 : if(e) goto fail;
13627 0 : p += l; len -= l; ret += l;
13628 0 : Top_oldlen = len;
13629 0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
13630 0 : len = Top_datalen;
13631 : {
13632 : size_t condition_count_datalen, condition_count_oldlen;
13633 : Der_type condition_count_type;
13634 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &condition_count_type, 0, &condition_count_datalen, &l);
13635 0 : if (e == 0 && condition_count_type != CONS) { e = ASN1_BAD_ID; }
13636 0 : if(e) goto fail;
13637 0 : p += l; len -= l; ret += l;
13638 0 : condition_count_oldlen = len;
13639 0 : if (condition_count_datalen > len) { e = ASN1_OVERRUN; goto fail; }
13640 0 : len = condition_count_datalen;
13641 : {
13642 : size_t condition_count_Tag_datalen, condition_count_Tag_oldlen;
13643 : Der_type condition_count_Tag_type;
13644 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &condition_count_Tag_type, UT_Integer, &condition_count_Tag_datalen, &l);
13645 0 : if (e == 0 && condition_count_Tag_type != PRIM) { e = ASN1_BAD_ID; }
13646 0 : if(e) goto fail;
13647 0 : p += l; len -= l; ret += l;
13648 0 : condition_count_Tag_oldlen = len;
13649 0 : if (condition_count_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
13650 0 : len = condition_count_Tag_datalen;
13651 0 : e = der_get_heim_integer(p, len, &(data)->condition_count, &l);
13652 0 : if(e) goto fail;
13653 0 : p += l; len -= l; ret += l;
13654 0 : len = condition_count_Tag_oldlen - condition_count_Tag_datalen;
13655 : }
13656 0 : len = condition_count_oldlen - condition_count_datalen;
13657 : }
13658 : {
13659 : size_t elements_datalen, elements_oldlen;
13660 : Der_type elements_type;
13661 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &elements_type, 1, &elements_datalen, &l);
13662 0 : if (e == 0 && elements_type != CONS) { e = ASN1_BAD_ID; }
13663 0 : if(e) goto fail;
13664 0 : p += l; len -= l; ret += l;
13665 0 : elements_oldlen = len;
13666 0 : if (elements_datalen > len) { e = ASN1_OVERRUN; goto fail; }
13667 0 : len = elements_datalen;
13668 0 : e = decode_AuthorizationData(p, len, &(data)->elements, &l);
13669 0 : if(e) goto fail;
13670 0 : p += l; len -= l; ret += l;
13671 0 : len = elements_oldlen - elements_datalen;
13672 : }
13673 0 : len = Top_oldlen - Top_datalen;
13674 : }
13675 0 : if(size) *size = ret;
13676 0 : return 0;
13677 0 : fail:
13678 0 : free_AD_AND_OR(data);
13679 0 : return e;
13680 : }
13681 :
13682 : void ASN1CALL
13683 0 : free_AD_AND_OR(AD_AND_OR *data)
13684 : {
13685 0 : der_free_heim_integer(&(data)->condition_count);
13686 0 : free_AuthorizationData(&(data)->elements);
13687 0 : }
13688 :
13689 : size_t ASN1CALL
13690 0 : length_AD_AND_OR(const AD_AND_OR *data)
13691 : {
13692 0 : size_t ret = 0;
13693 : {
13694 0 : size_t Top_tag_oldret = ret;
13695 0 : ret = 0;
13696 0 : ret += der_length_heim_integer(&(data)->condition_count);
13697 0 : ret += 1 + der_length_len (ret);
13698 0 : ret += 1 + der_length_len (ret);
13699 0 : ret += Top_tag_oldret;
13700 : }
13701 : {
13702 0 : size_t Top_tag_oldret = ret;
13703 0 : ret = 0;
13704 0 : ret += length_AuthorizationData(&(data)->elements);
13705 0 : ret += 1 + der_length_len (ret);
13706 0 : ret += Top_tag_oldret;
13707 : }
13708 0 : ret += 1 + der_length_len (ret);
13709 0 : return ret;
13710 : }
13711 :
13712 : int ASN1CALL
13713 0 : copy_AD_AND_OR(const AD_AND_OR *from, AD_AND_OR *to)
13714 : {
13715 0 : memset(to, 0, sizeof(*to));
13716 0 : if(der_copy_heim_integer(&(from)->condition_count, &(to)->condition_count)) goto fail;
13717 0 : if(copy_AuthorizationData(&(from)->elements, &(to)->elements)) goto fail;
13718 0 : return 0;
13719 0 : fail:
13720 0 : free_AD_AND_OR(to);
13721 0 : return ENOMEM;
13722 : }
13723 :
13724 : int ASN1CALL
13725 0 : encode_AD_MANDATORY_FOR_KDC(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const AD_MANDATORY_FOR_KDC *data, size_t *size)
13726 : {
13727 0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
13728 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
13729 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
13730 :
13731 0 : e = encode_AuthorizationData(p, len, data, &l);
13732 0 : if (e) return e;
13733 0 : p -= l; len -= l; ret += l;
13734 :
13735 0 : *size = ret;
13736 0 : return 0;
13737 : }
13738 :
13739 : int ASN1CALL
13740 0 : decode_AD_MANDATORY_FOR_KDC(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, AD_MANDATORY_FOR_KDC *data, size_t *size)
13741 : {
13742 0 : size_t ret = 0;
13743 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
13744 : int e HEIMDAL_UNUSED_ATTRIBUTE;
13745 :
13746 0 : memset(data, 0, sizeof(*data));
13747 0 : e = decode_AuthorizationData(p, len, data, &l);
13748 0 : if(e) goto fail;
13749 0 : p += l; len -= l; ret += l;
13750 0 : if(size) *size = ret;
13751 0 : return 0;
13752 0 : fail:
13753 0 : free_AD_MANDATORY_FOR_KDC(data);
13754 0 : return e;
13755 : }
13756 :
13757 : void ASN1CALL
13758 0 : free_AD_MANDATORY_FOR_KDC(AD_MANDATORY_FOR_KDC *data)
13759 : {
13760 0 : free_AuthorizationData(data);
13761 0 : }
13762 :
13763 : size_t ASN1CALL
13764 0 : length_AD_MANDATORY_FOR_KDC(const AD_MANDATORY_FOR_KDC *data)
13765 : {
13766 0 : size_t ret = 0;
13767 0 : ret += length_AuthorizationData(data);
13768 0 : return ret;
13769 : }
13770 :
13771 : int ASN1CALL
13772 0 : copy_AD_MANDATORY_FOR_KDC(const AD_MANDATORY_FOR_KDC *from, AD_MANDATORY_FOR_KDC *to)
13773 : {
13774 0 : memset(to, 0, sizeof(*to));
13775 0 : if(copy_AuthorizationData(from, to)) goto fail;
13776 0 : return 0;
13777 0 : fail:
13778 0 : free_AD_MANDATORY_FOR_KDC(to);
13779 0 : return ENOMEM;
13780 : }
13781 :
13782 : int ASN1CALL
13783 0 : encode_PA_SAM_TYPE(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const PA_SAM_TYPE *data, size_t *size)
13784 : {
13785 0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
13786 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
13787 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
13788 :
13789 : {
13790 0 : int enumint = (int)*data;
13791 0 : e = der_put_integer(p, len, &enumint, &l);
13792 0 : if (e) return e;
13793 0 : p -= l; len -= l; ret += l;
13794 :
13795 : }
13796 0 : ;e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_Integer, &l);
13797 0 : if (e) return e;
13798 0 : p -= l; len -= l; ret += l;
13799 :
13800 0 : *size = ret;
13801 0 : return 0;
13802 : }
13803 :
13804 : int ASN1CALL
13805 0 : decode_PA_SAM_TYPE(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, PA_SAM_TYPE *data, size_t *size)
13806 : {
13807 0 : size_t ret = 0;
13808 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
13809 : int e HEIMDAL_UNUSED_ATTRIBUTE;
13810 :
13811 0 : memset(data, 0, sizeof(*data));
13812 : {
13813 : size_t Top_datalen, Top_oldlen;
13814 : Der_type Top_type;
13815 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Integer, &Top_datalen, &l);
13816 0 : if (e == 0 && Top_type != PRIM) { e = ASN1_BAD_ID; }
13817 0 : if(e) goto fail;
13818 0 : p += l; len -= l; ret += l;
13819 0 : Top_oldlen = len;
13820 0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
13821 0 : len = Top_datalen;
13822 : {
13823 : int enumint;
13824 0 : e = der_get_integer(p, len, &enumint, &l);
13825 0 : if(e) goto fail;
13826 0 : p += l; len -= l; ret += l;
13827 0 : *data = enumint;
13828 : }
13829 0 : len = Top_oldlen - Top_datalen;
13830 : }
13831 0 : if(size) *size = ret;
13832 0 : return 0;
13833 0 : fail:
13834 0 : free_PA_SAM_TYPE(data);
13835 0 : return e;
13836 : }
13837 :
13838 : void ASN1CALL
13839 0 : free_PA_SAM_TYPE(PA_SAM_TYPE *data)
13840 : {
13841 0 : }
13842 :
13843 : size_t ASN1CALL
13844 0 : length_PA_SAM_TYPE(const PA_SAM_TYPE *data)
13845 : {
13846 0 : size_t ret = 0;
13847 : {
13848 0 : int enumint = *data;
13849 0 : ret += der_length_integer(&enumint);
13850 : }
13851 0 : ret += 1 + der_length_len (ret);
13852 0 : return ret;
13853 : }
13854 :
13855 : int ASN1CALL
13856 0 : copy_PA_SAM_TYPE(const PA_SAM_TYPE *from, PA_SAM_TYPE *to)
13857 : {
13858 0 : memset(to, 0, sizeof(*to));
13859 0 : *(to) = *(from);
13860 0 : return 0;
13861 : }
13862 :
13863 : int ASN1CALL
13864 0 : encode_PA_SAM_REDIRECT(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const PA_SAM_REDIRECT *data, size_t *size)
13865 : {
13866 0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
13867 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
13868 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
13869 :
13870 0 : e = encode_HostAddresses(p, len, data, &l);
13871 0 : if (e) return e;
13872 0 : p -= l; len -= l; ret += l;
13873 :
13874 0 : *size = ret;
13875 0 : return 0;
13876 : }
13877 :
13878 : int ASN1CALL
13879 0 : decode_PA_SAM_REDIRECT(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, PA_SAM_REDIRECT *data, size_t *size)
13880 : {
13881 0 : size_t ret = 0;
13882 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
13883 : int e HEIMDAL_UNUSED_ATTRIBUTE;
13884 :
13885 0 : memset(data, 0, sizeof(*data));
13886 0 : e = decode_HostAddresses(p, len, data, &l);
13887 0 : if(e) goto fail;
13888 0 : p += l; len -= l; ret += l;
13889 0 : if(size) *size = ret;
13890 0 : return 0;
13891 0 : fail:
13892 0 : free_PA_SAM_REDIRECT(data);
13893 0 : return e;
13894 : }
13895 :
13896 : void ASN1CALL
13897 0 : free_PA_SAM_REDIRECT(PA_SAM_REDIRECT *data)
13898 : {
13899 0 : free_HostAddresses(data);
13900 0 : }
13901 :
13902 : size_t ASN1CALL
13903 0 : length_PA_SAM_REDIRECT(const PA_SAM_REDIRECT *data)
13904 : {
13905 0 : size_t ret = 0;
13906 0 : ret += length_HostAddresses(data);
13907 0 : return ret;
13908 : }
13909 :
13910 : int ASN1CALL
13911 0 : copy_PA_SAM_REDIRECT(const PA_SAM_REDIRECT *from, PA_SAM_REDIRECT *to)
13912 : {
13913 0 : memset(to, 0, sizeof(*to));
13914 0 : if(copy_HostAddresses(from, to)) goto fail;
13915 0 : return 0;
13916 0 : fail:
13917 0 : free_PA_SAM_REDIRECT(to);
13918 0 : return ENOMEM;
13919 : }
13920 :
13921 : int ASN1CALL
13922 0 : encode_SAMFlags(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const SAMFlags *data, size_t *size)
13923 : {
13924 0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
13925 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
13926 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
13927 :
13928 : {
13929 0 : unsigned char c = 0;
13930 0 : if (len < 1) return ASN1_OVERFLOW;
13931 0 : *p-- = c; len--; ret++;
13932 0 : c = 0;
13933 0 : if (len < 1) return ASN1_OVERFLOW;
13934 0 : *p-- = c; len--; ret++;
13935 0 : c = 0;
13936 0 : if (len < 1) return ASN1_OVERFLOW;
13937 0 : *p-- = c; len--; ret++;
13938 0 : c = 0;
13939 0 : if((data)->must_pk_encrypt_sad) {
13940 0 : c |= 1<<5;
13941 : }
13942 0 : if((data)->send_encrypted_sad) {
13943 0 : c |= 1<<6;
13944 : }
13945 0 : if((data)->use_sad_as_key) {
13946 0 : c |= 1<<7;
13947 : }
13948 0 : if (len < 1) return ASN1_OVERFLOW;
13949 0 : *p-- = c; len--; ret++;
13950 0 : if (len < 1) return ASN1_OVERFLOW;
13951 0 : *p-- = 0;
13952 0 : len -= 1;
13953 0 : ret += 1;
13954 : }
13955 :
13956 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_BitString, &l);
13957 0 : if (e) return e;
13958 0 : p -= l; len -= l; ret += l;
13959 :
13960 0 : *size = ret;
13961 0 : return 0;
13962 : }
13963 :
13964 : int ASN1CALL
13965 0 : decode_SAMFlags(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, SAMFlags *data, size_t *size)
13966 : {
13967 0 : size_t ret = 0;
13968 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
13969 : int e HEIMDAL_UNUSED_ATTRIBUTE;
13970 :
13971 0 : memset(data, 0, sizeof(*data));
13972 : {
13973 : size_t Top_datalen, Top_oldlen;
13974 : Der_type Top_type;
13975 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_BitString, &Top_datalen, &l);
13976 0 : if (e == 0 && Top_type != PRIM) { e = ASN1_BAD_ID; }
13977 0 : if(e) goto fail;
13978 0 : p += l; len -= l; ret += l;
13979 0 : Top_oldlen = len;
13980 0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
13981 0 : len = Top_datalen;
13982 0 : if (len < 1) return ASN1_OVERRUN;
13983 0 : p++; len--; ret++;
13984 : do {
13985 0 : if (len < 1) break;
13986 0 : (data)->use_sad_as_key = (*p >> 7) & 1;
13987 0 : (data)->send_encrypted_sad = (*p >> 6) & 1;
13988 0 : (data)->must_pk_encrypt_sad = (*p >> 5) & 1;
13989 : } while(0);
13990 0 : p += len; ret += len;
13991 0 : len = Top_oldlen - Top_datalen;
13992 : }
13993 0 : if(size) *size = ret;
13994 0 : return 0;
13995 0 : fail:
13996 0 : free_SAMFlags(data);
13997 0 : return e;
13998 : }
13999 :
14000 : void ASN1CALL
14001 0 : free_SAMFlags(SAMFlags *data)
14002 : {
14003 0 : }
14004 :
14005 : size_t ASN1CALL
14006 0 : length_SAMFlags(const SAMFlags *data)
14007 : {
14008 0 : size_t ret = 0;
14009 0 : ret += 5;
14010 0 : ret += 1 + der_length_len (ret);
14011 0 : return ret;
14012 : }
14013 :
14014 : int ASN1CALL
14015 0 : copy_SAMFlags(const SAMFlags *from, SAMFlags *to)
14016 : {
14017 0 : memset(to, 0, sizeof(*to));
14018 0 : *(to) = *(from);
14019 0 : return 0;
14020 : }
14021 :
14022 0 : unsigned SAMFlags2int(SAMFlags f)
14023 : {
14024 0 : unsigned r = 0;
14025 0 : if(f.use_sad_as_key) r |= (1U << 0);
14026 0 : if(f.send_encrypted_sad) r |= (1U << 1);
14027 0 : if(f.must_pk_encrypt_sad) r |= (1U << 2);
14028 0 : return r;
14029 : }
14030 :
14031 0 : SAMFlags int2SAMFlags(unsigned n)
14032 : {
14033 : SAMFlags flags;
14034 :
14035 0 : memset(&flags, 0, sizeof(flags));
14036 :
14037 0 : flags.use_sad_as_key = (n >> 0) & 1;
14038 0 : flags.send_encrypted_sad = (n >> 1) & 1;
14039 0 : flags.must_pk_encrypt_sad = (n >> 2) & 1;
14040 0 : return flags;
14041 : }
14042 :
14043 : static struct units SAMFlags_units[] = {
14044 : {"must-pk-encrypt-sad", 1U << 2},
14045 : {"send-encrypted-sad", 1U << 1},
14046 : {"use-sad-as-key", 1U << 0},
14047 : {NULL, 0}
14048 : };
14049 :
14050 0 : const struct units * asn1_SAMFlags_units(void){
14051 0 : return SAMFlags_units;
14052 : }
14053 :
14054 : int ASN1CALL
14055 0 : encode_PA_SAM_CHALLENGE_2_BODY(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const PA_SAM_CHALLENGE_2_BODY *data, size_t *size)
14056 : {
14057 0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
14058 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
14059 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
14060 :
14061 : /* sam-etype */
14062 : {
14063 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
14064 0 : ret = 0;
14065 0 : e = encode_krb5int32(p, len, &(data)->sam_etype, &l);
14066 0 : if (e) return e;
14067 0 : p -= l; len -= l; ret += l;
14068 :
14069 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 9, &l);
14070 0 : if (e) return e;
14071 0 : p -= l; len -= l; ret += l;
14072 :
14073 0 : ret += Top_tag_oldret;
14074 : }
14075 : /* sam-nonce */
14076 : {
14077 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
14078 0 : ret = 0;
14079 0 : e = encode_krb5int32(p, len, &(data)->sam_nonce, &l);
14080 0 : if (e) return e;
14081 0 : p -= l; len -= l; ret += l;
14082 :
14083 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 8, &l);
14084 0 : if (e) return e;
14085 0 : p -= l; len -= l; ret += l;
14086 :
14087 0 : ret += Top_tag_oldret;
14088 : }
14089 : /* sam-pk-for-sad */
14090 0 : if((data)->sam_pk_for_sad) {
14091 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
14092 0 : ret = 0;
14093 0 : e = encode_EncryptionKey(p, len, (data)->sam_pk_for_sad, &l);
14094 0 : if (e) return e;
14095 0 : p -= l; len -= l; ret += l;
14096 :
14097 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 7, &l);
14098 0 : if (e) return e;
14099 0 : p -= l; len -= l; ret += l;
14100 :
14101 0 : ret += Top_tag_oldret;
14102 : }
14103 : /* sam-response-prompt */
14104 0 : if((data)->sam_response_prompt) {
14105 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
14106 0 : ret = 0;
14107 0 : e = der_put_general_string(p, len, (data)->sam_response_prompt, &l);
14108 0 : if (e) return e;
14109 0 : p -= l; len -= l; ret += l;
14110 :
14111 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_GeneralString, &l);
14112 0 : if (e) return e;
14113 0 : p -= l; len -= l; ret += l;
14114 :
14115 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 6, &l);
14116 0 : if (e) return e;
14117 0 : p -= l; len -= l; ret += l;
14118 :
14119 0 : ret += Top_tag_oldret;
14120 : }
14121 : /* sam-challenge */
14122 0 : if((data)->sam_challenge) {
14123 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
14124 0 : ret = 0;
14125 0 : e = der_put_general_string(p, len, (data)->sam_challenge, &l);
14126 0 : if (e) return e;
14127 0 : p -= l; len -= l; ret += l;
14128 :
14129 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_GeneralString, &l);
14130 0 : if (e) return e;
14131 0 : p -= l; len -= l; ret += l;
14132 :
14133 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 5, &l);
14134 0 : if (e) return e;
14135 0 : p -= l; len -= l; ret += l;
14136 :
14137 0 : ret += Top_tag_oldret;
14138 : }
14139 : /* sam-challenge-label */
14140 0 : if((data)->sam_challenge_label) {
14141 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
14142 0 : ret = 0;
14143 0 : e = der_put_general_string(p, len, (data)->sam_challenge_label, &l);
14144 0 : if (e) return e;
14145 0 : p -= l; len -= l; ret += l;
14146 :
14147 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_GeneralString, &l);
14148 0 : if (e) return e;
14149 0 : p -= l; len -= l; ret += l;
14150 :
14151 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 4, &l);
14152 0 : if (e) return e;
14153 0 : p -= l; len -= l; ret += l;
14154 :
14155 0 : ret += Top_tag_oldret;
14156 : }
14157 : /* sam-track-id */
14158 0 : if((data)->sam_track_id) {
14159 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
14160 0 : ret = 0;
14161 0 : e = der_put_general_string(p, len, (data)->sam_track_id, &l);
14162 0 : if (e) return e;
14163 0 : p -= l; len -= l; ret += l;
14164 :
14165 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_GeneralString, &l);
14166 0 : if (e) return e;
14167 0 : p -= l; len -= l; ret += l;
14168 :
14169 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 3, &l);
14170 0 : if (e) return e;
14171 0 : p -= l; len -= l; ret += l;
14172 :
14173 0 : ret += Top_tag_oldret;
14174 : }
14175 : /* sam-type-name */
14176 0 : if((data)->sam_type_name) {
14177 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
14178 0 : ret = 0;
14179 0 : e = der_put_general_string(p, len, (data)->sam_type_name, &l);
14180 0 : if (e) return e;
14181 0 : p -= l; len -= l; ret += l;
14182 :
14183 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_GeneralString, &l);
14184 0 : if (e) return e;
14185 0 : p -= l; len -= l; ret += l;
14186 :
14187 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
14188 0 : if (e) return e;
14189 0 : p -= l; len -= l; ret += l;
14190 :
14191 0 : ret += Top_tag_oldret;
14192 : }
14193 : /* sam-flags */
14194 : {
14195 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
14196 0 : ret = 0;
14197 0 : e = encode_SAMFlags(p, len, &(data)->sam_flags, &l);
14198 0 : if (e) return e;
14199 0 : p -= l; len -= l; ret += l;
14200 :
14201 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
14202 0 : if (e) return e;
14203 0 : p -= l; len -= l; ret += l;
14204 :
14205 0 : ret += Top_tag_oldret;
14206 : }
14207 : /* sam-type */
14208 : {
14209 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
14210 0 : ret = 0;
14211 0 : e = encode_krb5int32(p, len, &(data)->sam_type, &l);
14212 0 : if (e) return e;
14213 0 : p -= l; len -= l; ret += l;
14214 :
14215 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
14216 0 : if (e) return e;
14217 0 : p -= l; len -= l; ret += l;
14218 :
14219 0 : ret += Top_tag_oldret;
14220 : }
14221 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
14222 0 : if (e) return e;
14223 0 : p -= l; len -= l; ret += l;
14224 :
14225 0 : *size = ret;
14226 0 : return 0;
14227 : }
14228 :
14229 : int ASN1CALL
14230 0 : decode_PA_SAM_CHALLENGE_2_BODY(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, PA_SAM_CHALLENGE_2_BODY *data, size_t *size)
14231 : {
14232 0 : size_t ret = 0;
14233 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
14234 : int e HEIMDAL_UNUSED_ATTRIBUTE;
14235 :
14236 0 : memset(data, 0, sizeof(*data));
14237 : {
14238 : size_t Top_datalen, Top_oldlen;
14239 : Der_type Top_type;
14240 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
14241 0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
14242 0 : if(e) goto fail;
14243 0 : p += l; len -= l; ret += l;
14244 0 : Top_oldlen = len;
14245 0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
14246 0 : len = Top_datalen;
14247 : {
14248 : size_t sam_type_datalen, sam_type_oldlen;
14249 : Der_type sam_type_type;
14250 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &sam_type_type, 0, &sam_type_datalen, &l);
14251 0 : if (e == 0 && sam_type_type != CONS) { e = ASN1_BAD_ID; }
14252 0 : if(e) goto fail;
14253 0 : p += l; len -= l; ret += l;
14254 0 : sam_type_oldlen = len;
14255 0 : if (sam_type_datalen > len) { e = ASN1_OVERRUN; goto fail; }
14256 0 : len = sam_type_datalen;
14257 0 : e = decode_krb5int32(p, len, &(data)->sam_type, &l);
14258 0 : if(e) goto fail;
14259 0 : p += l; len -= l; ret += l;
14260 0 : len = sam_type_oldlen - sam_type_datalen;
14261 : }
14262 : {
14263 : size_t sam_flags_datalen, sam_flags_oldlen;
14264 : Der_type sam_flags_type;
14265 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &sam_flags_type, 1, &sam_flags_datalen, &l);
14266 0 : if (e == 0 && sam_flags_type != CONS) { e = ASN1_BAD_ID; }
14267 0 : if(e) goto fail;
14268 0 : p += l; len -= l; ret += l;
14269 0 : sam_flags_oldlen = len;
14270 0 : if (sam_flags_datalen > len) { e = ASN1_OVERRUN; goto fail; }
14271 0 : len = sam_flags_datalen;
14272 0 : e = decode_SAMFlags(p, len, &(data)->sam_flags, &l);
14273 0 : if(e) goto fail;
14274 0 : p += l; len -= l; ret += l;
14275 0 : len = sam_flags_oldlen - sam_flags_datalen;
14276 : }
14277 : {
14278 : size_t sam_type_name_datalen, sam_type_name_oldlen;
14279 : Der_type sam_type_name_type;
14280 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &sam_type_name_type, 2, &sam_type_name_datalen, &l);
14281 0 : if (e == 0 && sam_type_name_type != CONS) { e = ASN1_BAD_ID; }
14282 0 : if(e) {
14283 0 : (data)->sam_type_name = NULL;
14284 : } else {
14285 0 : (data)->sam_type_name = calloc(1, sizeof(*(data)->sam_type_name));
14286 0 : if ((data)->sam_type_name == NULL) { e = ENOMEM; goto fail; }
14287 0 : p += l; len -= l; ret += l;
14288 0 : sam_type_name_oldlen = len;
14289 0 : if (sam_type_name_datalen > len) { e = ASN1_OVERRUN; goto fail; }
14290 0 : len = sam_type_name_datalen;
14291 : {
14292 : size_t sam_type_name_Tag_datalen, sam_type_name_Tag_oldlen;
14293 : Der_type sam_type_name_Tag_type;
14294 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &sam_type_name_Tag_type, UT_GeneralString, &sam_type_name_Tag_datalen, &l);
14295 0 : if (e == 0 && sam_type_name_Tag_type != PRIM) { e = ASN1_BAD_ID; }
14296 0 : if(e) goto fail;
14297 0 : p += l; len -= l; ret += l;
14298 0 : sam_type_name_Tag_oldlen = len;
14299 0 : if (sam_type_name_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
14300 0 : len = sam_type_name_Tag_datalen;
14301 0 : e = der_get_general_string(p, len, (data)->sam_type_name, &l);
14302 0 : if(e) goto fail;
14303 0 : p += l; len -= l; ret += l;
14304 0 : len = sam_type_name_Tag_oldlen - sam_type_name_Tag_datalen;
14305 : }
14306 0 : len = sam_type_name_oldlen - sam_type_name_datalen;
14307 : }
14308 : }
14309 : {
14310 : size_t sam_track_id_datalen, sam_track_id_oldlen;
14311 : Der_type sam_track_id_type;
14312 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &sam_track_id_type, 3, &sam_track_id_datalen, &l);
14313 0 : if (e == 0 && sam_track_id_type != CONS) { e = ASN1_BAD_ID; }
14314 0 : if(e) {
14315 0 : (data)->sam_track_id = NULL;
14316 : } else {
14317 0 : (data)->sam_track_id = calloc(1, sizeof(*(data)->sam_track_id));
14318 0 : if ((data)->sam_track_id == NULL) { e = ENOMEM; goto fail; }
14319 0 : p += l; len -= l; ret += l;
14320 0 : sam_track_id_oldlen = len;
14321 0 : if (sam_track_id_datalen > len) { e = ASN1_OVERRUN; goto fail; }
14322 0 : len = sam_track_id_datalen;
14323 : {
14324 : size_t sam_track_id_Tag_datalen, sam_track_id_Tag_oldlen;
14325 : Der_type sam_track_id_Tag_type;
14326 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &sam_track_id_Tag_type, UT_GeneralString, &sam_track_id_Tag_datalen, &l);
14327 0 : if (e == 0 && sam_track_id_Tag_type != PRIM) { e = ASN1_BAD_ID; }
14328 0 : if(e) goto fail;
14329 0 : p += l; len -= l; ret += l;
14330 0 : sam_track_id_Tag_oldlen = len;
14331 0 : if (sam_track_id_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
14332 0 : len = sam_track_id_Tag_datalen;
14333 0 : e = der_get_general_string(p, len, (data)->sam_track_id, &l);
14334 0 : if(e) goto fail;
14335 0 : p += l; len -= l; ret += l;
14336 0 : len = sam_track_id_Tag_oldlen - sam_track_id_Tag_datalen;
14337 : }
14338 0 : len = sam_track_id_oldlen - sam_track_id_datalen;
14339 : }
14340 : }
14341 : {
14342 : size_t sam_challenge_label_datalen, sam_challenge_label_oldlen;
14343 : Der_type sam_challenge_label_type;
14344 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &sam_challenge_label_type, 4, &sam_challenge_label_datalen, &l);
14345 0 : if (e == 0 && sam_challenge_label_type != CONS) { e = ASN1_BAD_ID; }
14346 0 : if(e) {
14347 0 : (data)->sam_challenge_label = NULL;
14348 : } else {
14349 0 : (data)->sam_challenge_label = calloc(1, sizeof(*(data)->sam_challenge_label));
14350 0 : if ((data)->sam_challenge_label == NULL) { e = ENOMEM; goto fail; }
14351 0 : p += l; len -= l; ret += l;
14352 0 : sam_challenge_label_oldlen = len;
14353 0 : if (sam_challenge_label_datalen > len) { e = ASN1_OVERRUN; goto fail; }
14354 0 : len = sam_challenge_label_datalen;
14355 : {
14356 : size_t sam_challenge_label_Tag_datalen, sam_challenge_label_Tag_oldlen;
14357 : Der_type sam_challenge_label_Tag_type;
14358 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &sam_challenge_label_Tag_type, UT_GeneralString, &sam_challenge_label_Tag_datalen, &l);
14359 0 : if (e == 0 && sam_challenge_label_Tag_type != PRIM) { e = ASN1_BAD_ID; }
14360 0 : if(e) goto fail;
14361 0 : p += l; len -= l; ret += l;
14362 0 : sam_challenge_label_Tag_oldlen = len;
14363 0 : if (sam_challenge_label_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
14364 0 : len = sam_challenge_label_Tag_datalen;
14365 0 : e = der_get_general_string(p, len, (data)->sam_challenge_label, &l);
14366 0 : if(e) goto fail;
14367 0 : p += l; len -= l; ret += l;
14368 0 : len = sam_challenge_label_Tag_oldlen - sam_challenge_label_Tag_datalen;
14369 : }
14370 0 : len = sam_challenge_label_oldlen - sam_challenge_label_datalen;
14371 : }
14372 : }
14373 : {
14374 : size_t sam_challenge_datalen, sam_challenge_oldlen;
14375 : Der_type sam_challenge_type;
14376 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &sam_challenge_type, 5, &sam_challenge_datalen, &l);
14377 0 : if (e == 0 && sam_challenge_type != CONS) { e = ASN1_BAD_ID; }
14378 0 : if(e) {
14379 0 : (data)->sam_challenge = NULL;
14380 : } else {
14381 0 : (data)->sam_challenge = calloc(1, sizeof(*(data)->sam_challenge));
14382 0 : if ((data)->sam_challenge == NULL) { e = ENOMEM; goto fail; }
14383 0 : p += l; len -= l; ret += l;
14384 0 : sam_challenge_oldlen = len;
14385 0 : if (sam_challenge_datalen > len) { e = ASN1_OVERRUN; goto fail; }
14386 0 : len = sam_challenge_datalen;
14387 : {
14388 : size_t sam_challenge_Tag_datalen, sam_challenge_Tag_oldlen;
14389 : Der_type sam_challenge_Tag_type;
14390 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &sam_challenge_Tag_type, UT_GeneralString, &sam_challenge_Tag_datalen, &l);
14391 0 : if (e == 0 && sam_challenge_Tag_type != PRIM) { e = ASN1_BAD_ID; }
14392 0 : if(e) goto fail;
14393 0 : p += l; len -= l; ret += l;
14394 0 : sam_challenge_Tag_oldlen = len;
14395 0 : if (sam_challenge_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
14396 0 : len = sam_challenge_Tag_datalen;
14397 0 : e = der_get_general_string(p, len, (data)->sam_challenge, &l);
14398 0 : if(e) goto fail;
14399 0 : p += l; len -= l; ret += l;
14400 0 : len = sam_challenge_Tag_oldlen - sam_challenge_Tag_datalen;
14401 : }
14402 0 : len = sam_challenge_oldlen - sam_challenge_datalen;
14403 : }
14404 : }
14405 : {
14406 : size_t sam_response_prompt_datalen, sam_response_prompt_oldlen;
14407 : Der_type sam_response_prompt_type;
14408 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &sam_response_prompt_type, 6, &sam_response_prompt_datalen, &l);
14409 0 : if (e == 0 && sam_response_prompt_type != CONS) { e = ASN1_BAD_ID; }
14410 0 : if(e) {
14411 0 : (data)->sam_response_prompt = NULL;
14412 : } else {
14413 0 : (data)->sam_response_prompt = calloc(1, sizeof(*(data)->sam_response_prompt));
14414 0 : if ((data)->sam_response_prompt == NULL) { e = ENOMEM; goto fail; }
14415 0 : p += l; len -= l; ret += l;
14416 0 : sam_response_prompt_oldlen = len;
14417 0 : if (sam_response_prompt_datalen > len) { e = ASN1_OVERRUN; goto fail; }
14418 0 : len = sam_response_prompt_datalen;
14419 : {
14420 : size_t sam_response_prompt_Tag_datalen, sam_response_prompt_Tag_oldlen;
14421 : Der_type sam_response_prompt_Tag_type;
14422 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &sam_response_prompt_Tag_type, UT_GeneralString, &sam_response_prompt_Tag_datalen, &l);
14423 0 : if (e == 0 && sam_response_prompt_Tag_type != PRIM) { e = ASN1_BAD_ID; }
14424 0 : if(e) goto fail;
14425 0 : p += l; len -= l; ret += l;
14426 0 : sam_response_prompt_Tag_oldlen = len;
14427 0 : if (sam_response_prompt_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
14428 0 : len = sam_response_prompt_Tag_datalen;
14429 0 : e = der_get_general_string(p, len, (data)->sam_response_prompt, &l);
14430 0 : if(e) goto fail;
14431 0 : p += l; len -= l; ret += l;
14432 0 : len = sam_response_prompt_Tag_oldlen - sam_response_prompt_Tag_datalen;
14433 : }
14434 0 : len = sam_response_prompt_oldlen - sam_response_prompt_datalen;
14435 : }
14436 : }
14437 : {
14438 : size_t sam_pk_for_sad_datalen, sam_pk_for_sad_oldlen;
14439 : Der_type sam_pk_for_sad_type;
14440 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &sam_pk_for_sad_type, 7, &sam_pk_for_sad_datalen, &l);
14441 0 : if (e == 0 && sam_pk_for_sad_type != CONS) { e = ASN1_BAD_ID; }
14442 0 : if(e) {
14443 0 : (data)->sam_pk_for_sad = NULL;
14444 : } else {
14445 0 : (data)->sam_pk_for_sad = calloc(1, sizeof(*(data)->sam_pk_for_sad));
14446 0 : if ((data)->sam_pk_for_sad == NULL) { e = ENOMEM; goto fail; }
14447 0 : p += l; len -= l; ret += l;
14448 0 : sam_pk_for_sad_oldlen = len;
14449 0 : if (sam_pk_for_sad_datalen > len) { e = ASN1_OVERRUN; goto fail; }
14450 0 : len = sam_pk_for_sad_datalen;
14451 0 : e = decode_EncryptionKey(p, len, (data)->sam_pk_for_sad, &l);
14452 0 : if(e) goto fail;
14453 0 : p += l; len -= l; ret += l;
14454 0 : len = sam_pk_for_sad_oldlen - sam_pk_for_sad_datalen;
14455 : }
14456 : }
14457 : {
14458 : size_t sam_nonce_datalen, sam_nonce_oldlen;
14459 : Der_type sam_nonce_type;
14460 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &sam_nonce_type, 8, &sam_nonce_datalen, &l);
14461 0 : if (e == 0 && sam_nonce_type != CONS) { e = ASN1_BAD_ID; }
14462 0 : if(e) goto fail;
14463 0 : p += l; len -= l; ret += l;
14464 0 : sam_nonce_oldlen = len;
14465 0 : if (sam_nonce_datalen > len) { e = ASN1_OVERRUN; goto fail; }
14466 0 : len = sam_nonce_datalen;
14467 0 : e = decode_krb5int32(p, len, &(data)->sam_nonce, &l);
14468 0 : if(e) goto fail;
14469 0 : p += l; len -= l; ret += l;
14470 0 : len = sam_nonce_oldlen - sam_nonce_datalen;
14471 : }
14472 : {
14473 : size_t sam_etype_datalen, sam_etype_oldlen;
14474 : Der_type sam_etype_type;
14475 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &sam_etype_type, 9, &sam_etype_datalen, &l);
14476 0 : if (e == 0 && sam_etype_type != CONS) { e = ASN1_BAD_ID; }
14477 0 : if(e) goto fail;
14478 0 : p += l; len -= l; ret += l;
14479 0 : sam_etype_oldlen = len;
14480 0 : if (sam_etype_datalen > len) { e = ASN1_OVERRUN; goto fail; }
14481 0 : len = sam_etype_datalen;
14482 0 : e = decode_krb5int32(p, len, &(data)->sam_etype, &l);
14483 0 : if(e) goto fail;
14484 0 : p += l; len -= l; ret += l;
14485 0 : len = sam_etype_oldlen - sam_etype_datalen;
14486 : }
14487 0 : len = Top_oldlen - Top_datalen;
14488 : }
14489 0 : if(size) *size = ret;
14490 0 : return 0;
14491 0 : fail:
14492 0 : free_PA_SAM_CHALLENGE_2_BODY(data);
14493 0 : return e;
14494 : }
14495 :
14496 : void ASN1CALL
14497 0 : free_PA_SAM_CHALLENGE_2_BODY(PA_SAM_CHALLENGE_2_BODY *data)
14498 : {
14499 0 : free_krb5int32(&(data)->sam_type);
14500 0 : free_SAMFlags(&(data)->sam_flags);
14501 0 : if((data)->sam_type_name) {
14502 0 : der_free_general_string((data)->sam_type_name);
14503 0 : free((data)->sam_type_name);
14504 0 : (data)->sam_type_name = NULL;
14505 : }
14506 0 : if((data)->sam_track_id) {
14507 0 : der_free_general_string((data)->sam_track_id);
14508 0 : free((data)->sam_track_id);
14509 0 : (data)->sam_track_id = NULL;
14510 : }
14511 0 : if((data)->sam_challenge_label) {
14512 0 : der_free_general_string((data)->sam_challenge_label);
14513 0 : free((data)->sam_challenge_label);
14514 0 : (data)->sam_challenge_label = NULL;
14515 : }
14516 0 : if((data)->sam_challenge) {
14517 0 : der_free_general_string((data)->sam_challenge);
14518 0 : free((data)->sam_challenge);
14519 0 : (data)->sam_challenge = NULL;
14520 : }
14521 0 : if((data)->sam_response_prompt) {
14522 0 : der_free_general_string((data)->sam_response_prompt);
14523 0 : free((data)->sam_response_prompt);
14524 0 : (data)->sam_response_prompt = NULL;
14525 : }
14526 0 : if((data)->sam_pk_for_sad) {
14527 0 : free_EncryptionKey((data)->sam_pk_for_sad);
14528 0 : free((data)->sam_pk_for_sad);
14529 0 : (data)->sam_pk_for_sad = NULL;
14530 : }
14531 0 : free_krb5int32(&(data)->sam_nonce);
14532 0 : free_krb5int32(&(data)->sam_etype);
14533 0 : }
14534 :
14535 : size_t ASN1CALL
14536 0 : length_PA_SAM_CHALLENGE_2_BODY(const PA_SAM_CHALLENGE_2_BODY *data)
14537 : {
14538 0 : size_t ret = 0;
14539 : {
14540 0 : size_t Top_tag_oldret = ret;
14541 0 : ret = 0;
14542 0 : ret += length_krb5int32(&(data)->sam_type);
14543 0 : ret += 1 + der_length_len (ret);
14544 0 : ret += Top_tag_oldret;
14545 : }
14546 : {
14547 0 : size_t Top_tag_oldret = ret;
14548 0 : ret = 0;
14549 0 : ret += length_SAMFlags(&(data)->sam_flags);
14550 0 : ret += 1 + der_length_len (ret);
14551 0 : ret += Top_tag_oldret;
14552 : }
14553 0 : if((data)->sam_type_name){
14554 0 : size_t Top_tag_oldret = ret;
14555 0 : ret = 0;
14556 0 : ret += der_length_general_string((data)->sam_type_name);
14557 0 : ret += 1 + der_length_len (ret);
14558 0 : ret += 1 + der_length_len (ret);
14559 0 : ret += Top_tag_oldret;
14560 : }
14561 0 : if((data)->sam_track_id){
14562 0 : size_t Top_tag_oldret = ret;
14563 0 : ret = 0;
14564 0 : ret += der_length_general_string((data)->sam_track_id);
14565 0 : ret += 1 + der_length_len (ret);
14566 0 : ret += 1 + der_length_len (ret);
14567 0 : ret += Top_tag_oldret;
14568 : }
14569 0 : if((data)->sam_challenge_label){
14570 0 : size_t Top_tag_oldret = ret;
14571 0 : ret = 0;
14572 0 : ret += der_length_general_string((data)->sam_challenge_label);
14573 0 : ret += 1 + der_length_len (ret);
14574 0 : ret += 1 + der_length_len (ret);
14575 0 : ret += Top_tag_oldret;
14576 : }
14577 0 : if((data)->sam_challenge){
14578 0 : size_t Top_tag_oldret = ret;
14579 0 : ret = 0;
14580 0 : ret += der_length_general_string((data)->sam_challenge);
14581 0 : ret += 1 + der_length_len (ret);
14582 0 : ret += 1 + der_length_len (ret);
14583 0 : ret += Top_tag_oldret;
14584 : }
14585 0 : if((data)->sam_response_prompt){
14586 0 : size_t Top_tag_oldret = ret;
14587 0 : ret = 0;
14588 0 : ret += der_length_general_string((data)->sam_response_prompt);
14589 0 : ret += 1 + der_length_len (ret);
14590 0 : ret += 1 + der_length_len (ret);
14591 0 : ret += Top_tag_oldret;
14592 : }
14593 0 : if((data)->sam_pk_for_sad){
14594 0 : size_t Top_tag_oldret = ret;
14595 0 : ret = 0;
14596 0 : ret += length_EncryptionKey((data)->sam_pk_for_sad);
14597 0 : ret += 1 + der_length_len (ret);
14598 0 : ret += Top_tag_oldret;
14599 : }
14600 : {
14601 0 : size_t Top_tag_oldret = ret;
14602 0 : ret = 0;
14603 0 : ret += length_krb5int32(&(data)->sam_nonce);
14604 0 : ret += 1 + der_length_len (ret);
14605 0 : ret += Top_tag_oldret;
14606 : }
14607 : {
14608 0 : size_t Top_tag_oldret = ret;
14609 0 : ret = 0;
14610 0 : ret += length_krb5int32(&(data)->sam_etype);
14611 0 : ret += 1 + der_length_len (ret);
14612 0 : ret += Top_tag_oldret;
14613 : }
14614 0 : ret += 1 + der_length_len (ret);
14615 0 : return ret;
14616 : }
14617 :
14618 : int ASN1CALL
14619 0 : copy_PA_SAM_CHALLENGE_2_BODY(const PA_SAM_CHALLENGE_2_BODY *from, PA_SAM_CHALLENGE_2_BODY *to)
14620 : {
14621 0 : memset(to, 0, sizeof(*to));
14622 0 : if(copy_krb5int32(&(from)->sam_type, &(to)->sam_type)) goto fail;
14623 0 : if(copy_SAMFlags(&(from)->sam_flags, &(to)->sam_flags)) goto fail;
14624 0 : if((from)->sam_type_name) {
14625 0 : (to)->sam_type_name = malloc(sizeof(*(to)->sam_type_name));
14626 0 : if((to)->sam_type_name == NULL) goto fail;
14627 0 : if(der_copy_general_string((from)->sam_type_name, (to)->sam_type_name)) goto fail;
14628 : }else
14629 0 : (to)->sam_type_name = NULL;
14630 0 : if((from)->sam_track_id) {
14631 0 : (to)->sam_track_id = malloc(sizeof(*(to)->sam_track_id));
14632 0 : if((to)->sam_track_id == NULL) goto fail;
14633 0 : if(der_copy_general_string((from)->sam_track_id, (to)->sam_track_id)) goto fail;
14634 : }else
14635 0 : (to)->sam_track_id = NULL;
14636 0 : if((from)->sam_challenge_label) {
14637 0 : (to)->sam_challenge_label = malloc(sizeof(*(to)->sam_challenge_label));
14638 0 : if((to)->sam_challenge_label == NULL) goto fail;
14639 0 : if(der_copy_general_string((from)->sam_challenge_label, (to)->sam_challenge_label)) goto fail;
14640 : }else
14641 0 : (to)->sam_challenge_label = NULL;
14642 0 : if((from)->sam_challenge) {
14643 0 : (to)->sam_challenge = malloc(sizeof(*(to)->sam_challenge));
14644 0 : if((to)->sam_challenge == NULL) goto fail;
14645 0 : if(der_copy_general_string((from)->sam_challenge, (to)->sam_challenge)) goto fail;
14646 : }else
14647 0 : (to)->sam_challenge = NULL;
14648 0 : if((from)->sam_response_prompt) {
14649 0 : (to)->sam_response_prompt = malloc(sizeof(*(to)->sam_response_prompt));
14650 0 : if((to)->sam_response_prompt == NULL) goto fail;
14651 0 : if(der_copy_general_string((from)->sam_response_prompt, (to)->sam_response_prompt)) goto fail;
14652 : }else
14653 0 : (to)->sam_response_prompt = NULL;
14654 0 : if((from)->sam_pk_for_sad) {
14655 0 : (to)->sam_pk_for_sad = malloc(sizeof(*(to)->sam_pk_for_sad));
14656 0 : if((to)->sam_pk_for_sad == NULL) goto fail;
14657 0 : if(copy_EncryptionKey((from)->sam_pk_for_sad, (to)->sam_pk_for_sad)) goto fail;
14658 : }else
14659 0 : (to)->sam_pk_for_sad = NULL;
14660 0 : if(copy_krb5int32(&(from)->sam_nonce, &(to)->sam_nonce)) goto fail;
14661 0 : if(copy_krb5int32(&(from)->sam_etype, &(to)->sam_etype)) goto fail;
14662 0 : return 0;
14663 0 : fail:
14664 0 : free_PA_SAM_CHALLENGE_2_BODY(to);
14665 0 : return ENOMEM;
14666 : }
14667 :
14668 : int ASN1CALL
14669 0 : encode_PA_SAM_CHALLENGE_2(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const PA_SAM_CHALLENGE_2 *data, size_t *size)
14670 : {
14671 0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
14672 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
14673 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
14674 :
14675 : /* sam-cksum */
14676 : {
14677 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
14678 0 : ret = 0;
14679 0 : for(i = (int)(&(data)->sam_cksum)->len - 1; i >= 0; --i) {
14680 0 : size_t sam_cksum_tag_tag_for_oldret = ret;
14681 0 : ret = 0;
14682 0 : e = encode_Checksum(p, len, &(&(data)->sam_cksum)->val[i], &l);
14683 0 : if (e) return e;
14684 0 : p -= l; len -= l; ret += l;
14685 :
14686 0 : ret += sam_cksum_tag_tag_for_oldret;
14687 : }
14688 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
14689 0 : if (e) return e;
14690 0 : p -= l; len -= l; ret += l;
14691 :
14692 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
14693 0 : if (e) return e;
14694 0 : p -= l; len -= l; ret += l;
14695 :
14696 0 : ret += Top_tag_oldret;
14697 : }
14698 : /* sam-body */
14699 : {
14700 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
14701 0 : ret = 0;
14702 0 : e = encode_PA_SAM_CHALLENGE_2_BODY(p, len, &(data)->sam_body, &l);
14703 0 : if (e) return e;
14704 0 : p -= l; len -= l; ret += l;
14705 :
14706 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
14707 0 : if (e) return e;
14708 0 : p -= l; len -= l; ret += l;
14709 :
14710 0 : ret += Top_tag_oldret;
14711 : }
14712 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
14713 0 : if (e) return e;
14714 0 : p -= l; len -= l; ret += l;
14715 :
14716 0 : *size = ret;
14717 0 : return 0;
14718 : }
14719 :
14720 : int ASN1CALL
14721 0 : decode_PA_SAM_CHALLENGE_2(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, PA_SAM_CHALLENGE_2 *data, size_t *size)
14722 : {
14723 0 : size_t ret = 0;
14724 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
14725 : int e HEIMDAL_UNUSED_ATTRIBUTE;
14726 :
14727 0 : memset(data, 0, sizeof(*data));
14728 : {
14729 : size_t Top_datalen, Top_oldlen;
14730 : Der_type Top_type;
14731 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
14732 0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
14733 0 : if(e) goto fail;
14734 0 : p += l; len -= l; ret += l;
14735 0 : Top_oldlen = len;
14736 0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
14737 0 : len = Top_datalen;
14738 : {
14739 : size_t sam_body_datalen, sam_body_oldlen;
14740 : Der_type sam_body_type;
14741 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &sam_body_type, 0, &sam_body_datalen, &l);
14742 0 : if (e == 0 && sam_body_type != CONS) { e = ASN1_BAD_ID; }
14743 0 : if(e) goto fail;
14744 0 : p += l; len -= l; ret += l;
14745 0 : sam_body_oldlen = len;
14746 0 : if (sam_body_datalen > len) { e = ASN1_OVERRUN; goto fail; }
14747 0 : len = sam_body_datalen;
14748 0 : e = decode_PA_SAM_CHALLENGE_2_BODY(p, len, &(data)->sam_body, &l);
14749 0 : if(e) goto fail;
14750 0 : p += l; len -= l; ret += l;
14751 0 : len = sam_body_oldlen - sam_body_datalen;
14752 : }
14753 : {
14754 : size_t sam_cksum_datalen, sam_cksum_oldlen;
14755 : Der_type sam_cksum_type;
14756 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &sam_cksum_type, 1, &sam_cksum_datalen, &l);
14757 0 : if (e == 0 && sam_cksum_type != CONS) { e = ASN1_BAD_ID; }
14758 0 : if(e) goto fail;
14759 0 : p += l; len -= l; ret += l;
14760 0 : sam_cksum_oldlen = len;
14761 0 : if (sam_cksum_datalen > len) { e = ASN1_OVERRUN; goto fail; }
14762 0 : len = sam_cksum_datalen;
14763 : {
14764 : size_t sam_cksum_Tag_datalen, sam_cksum_Tag_oldlen;
14765 : Der_type sam_cksum_Tag_type;
14766 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &sam_cksum_Tag_type, UT_Sequence, &sam_cksum_Tag_datalen, &l);
14767 0 : if (e == 0 && sam_cksum_Tag_type != CONS) { e = ASN1_BAD_ID; }
14768 0 : if(e) goto fail;
14769 0 : p += l; len -= l; ret += l;
14770 0 : sam_cksum_Tag_oldlen = len;
14771 0 : if (sam_cksum_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
14772 0 : len = sam_cksum_Tag_datalen;
14773 : {
14774 0 : size_t sam_cksum_Tag_Tag_origlen = len;
14775 0 : size_t sam_cksum_Tag_Tag_oldret = ret;
14776 0 : size_t sam_cksum_Tag_Tag_olen = 0;
14777 : void *sam_cksum_Tag_Tag_tmp;
14778 0 : ret = 0;
14779 0 : (&(data)->sam_cksum)->len = 0;
14780 0 : (&(data)->sam_cksum)->val = NULL;
14781 0 : while(ret < sam_cksum_Tag_Tag_origlen) {
14782 0 : size_t sam_cksum_Tag_Tag_nlen = sam_cksum_Tag_Tag_olen + sizeof(*((&(data)->sam_cksum)->val));
14783 0 : if (sam_cksum_Tag_Tag_olen > sam_cksum_Tag_Tag_nlen) { e = ASN1_OVERFLOW; goto fail; }
14784 0 : sam_cksum_Tag_Tag_olen = sam_cksum_Tag_Tag_nlen;
14785 0 : sam_cksum_Tag_Tag_tmp = realloc((&(data)->sam_cksum)->val, sam_cksum_Tag_Tag_olen);
14786 0 : if (sam_cksum_Tag_Tag_tmp == NULL) { e = ENOMEM; goto fail; }
14787 0 : (&(data)->sam_cksum)->val = sam_cksum_Tag_Tag_tmp;
14788 0 : e = decode_Checksum(p, len, &(&(data)->sam_cksum)->val[(&(data)->sam_cksum)->len], &l);
14789 0 : if(e) goto fail;
14790 0 : p += l; len -= l; ret += l;
14791 0 : (&(data)->sam_cksum)->len++;
14792 0 : len = sam_cksum_Tag_Tag_origlen - ret;
14793 : }
14794 0 : ret += sam_cksum_Tag_Tag_oldret;
14795 : }
14796 0 : len = sam_cksum_Tag_oldlen - sam_cksum_Tag_datalen;
14797 : }
14798 0 : len = sam_cksum_oldlen - sam_cksum_datalen;
14799 : }
14800 0 : len = Top_oldlen - Top_datalen;
14801 : }
14802 0 : if(size) *size = ret;
14803 0 : return 0;
14804 0 : fail:
14805 0 : free_PA_SAM_CHALLENGE_2(data);
14806 0 : return e;
14807 : }
14808 :
14809 : void ASN1CALL
14810 0 : free_PA_SAM_CHALLENGE_2(PA_SAM_CHALLENGE_2 *data)
14811 : {
14812 0 : free_PA_SAM_CHALLENGE_2_BODY(&(data)->sam_body);
14813 0 : while((&(data)->sam_cksum)->len){
14814 0 : free_Checksum(&(&(data)->sam_cksum)->val[(&(data)->sam_cksum)->len-1]);
14815 0 : (&(data)->sam_cksum)->len--;
14816 : }
14817 0 : free((&(data)->sam_cksum)->val);
14818 0 : (&(data)->sam_cksum)->val = NULL;
14819 0 : }
14820 :
14821 : size_t ASN1CALL
14822 0 : length_PA_SAM_CHALLENGE_2(const PA_SAM_CHALLENGE_2 *data)
14823 : {
14824 0 : size_t ret = 0;
14825 : {
14826 0 : size_t Top_tag_oldret = ret;
14827 0 : ret = 0;
14828 0 : ret += length_PA_SAM_CHALLENGE_2_BODY(&(data)->sam_body);
14829 0 : ret += 1 + der_length_len (ret);
14830 0 : ret += Top_tag_oldret;
14831 : }
14832 : {
14833 0 : size_t Top_tag_oldret = ret;
14834 0 : ret = 0;
14835 : {
14836 0 : size_t sam_cksum_tag_tag_oldret = ret;
14837 : int i;
14838 0 : ret = 0;
14839 0 : for(i = (&(data)->sam_cksum)->len - 1; i >= 0; --i){
14840 0 : size_t sam_cksum_tag_tag_for_oldret = ret;
14841 0 : ret = 0;
14842 0 : ret += length_Checksum(&(&(data)->sam_cksum)->val[i]);
14843 0 : ret += sam_cksum_tag_tag_for_oldret;
14844 : }
14845 0 : ret += sam_cksum_tag_tag_oldret;
14846 : }
14847 0 : ret += 1 + der_length_len (ret);
14848 0 : ret += 1 + der_length_len (ret);
14849 0 : ret += Top_tag_oldret;
14850 : }
14851 0 : ret += 1 + der_length_len (ret);
14852 0 : return ret;
14853 : }
14854 :
14855 : int ASN1CALL
14856 0 : copy_PA_SAM_CHALLENGE_2(const PA_SAM_CHALLENGE_2 *from, PA_SAM_CHALLENGE_2 *to)
14857 : {
14858 0 : memset(to, 0, sizeof(*to));
14859 0 : if(copy_PA_SAM_CHALLENGE_2_BODY(&(from)->sam_body, &(to)->sam_body)) goto fail;
14860 0 : if(((&(to)->sam_cksum)->val = malloc((&(from)->sam_cksum)->len * sizeof(*(&(to)->sam_cksum)->val))) == NULL && (&(from)->sam_cksum)->len != 0)
14861 0 : goto fail;
14862 0 : for((&(to)->sam_cksum)->len = 0; (&(to)->sam_cksum)->len < (&(from)->sam_cksum)->len; (&(to)->sam_cksum)->len++){
14863 0 : if(copy_Checksum(&(&(from)->sam_cksum)->val[(&(to)->sam_cksum)->len], &(&(to)->sam_cksum)->val[(&(to)->sam_cksum)->len])) goto fail;
14864 : }
14865 0 : return 0;
14866 0 : fail:
14867 0 : free_PA_SAM_CHALLENGE_2(to);
14868 0 : return ENOMEM;
14869 : }
14870 :
14871 : int ASN1CALL
14872 0 : encode_PA_SAM_RESPONSE_2(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const PA_SAM_RESPONSE_2 *data, size_t *size)
14873 : {
14874 0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
14875 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
14876 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
14877 :
14878 : /* sam-nonce */
14879 : {
14880 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
14881 0 : ret = 0;
14882 0 : e = encode_krb5int32(p, len, &(data)->sam_nonce, &l);
14883 0 : if (e) return e;
14884 0 : p -= l; len -= l; ret += l;
14885 :
14886 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 4, &l);
14887 0 : if (e) return e;
14888 0 : p -= l; len -= l; ret += l;
14889 :
14890 0 : ret += Top_tag_oldret;
14891 : }
14892 : /* sam-enc-nonce-or-sad */
14893 : {
14894 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
14895 0 : ret = 0;
14896 0 : e = encode_EncryptedData(p, len, &(data)->sam_enc_nonce_or_sad, &l);
14897 0 : if (e) return e;
14898 0 : p -= l; len -= l; ret += l;
14899 :
14900 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 3, &l);
14901 0 : if (e) return e;
14902 0 : p -= l; len -= l; ret += l;
14903 :
14904 0 : ret += Top_tag_oldret;
14905 : }
14906 : /* sam-track-id */
14907 0 : if((data)->sam_track_id) {
14908 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
14909 0 : ret = 0;
14910 0 : e = der_put_general_string(p, len, (data)->sam_track_id, &l);
14911 0 : if (e) return e;
14912 0 : p -= l; len -= l; ret += l;
14913 :
14914 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_GeneralString, &l);
14915 0 : if (e) return e;
14916 0 : p -= l; len -= l; ret += l;
14917 :
14918 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
14919 0 : if (e) return e;
14920 0 : p -= l; len -= l; ret += l;
14921 :
14922 0 : ret += Top_tag_oldret;
14923 : }
14924 : /* sam-flags */
14925 : {
14926 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
14927 0 : ret = 0;
14928 0 : e = encode_SAMFlags(p, len, &(data)->sam_flags, &l);
14929 0 : if (e) return e;
14930 0 : p -= l; len -= l; ret += l;
14931 :
14932 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
14933 0 : if (e) return e;
14934 0 : p -= l; len -= l; ret += l;
14935 :
14936 0 : ret += Top_tag_oldret;
14937 : }
14938 : /* sam-type */
14939 : {
14940 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
14941 0 : ret = 0;
14942 0 : e = encode_krb5int32(p, len, &(data)->sam_type, &l);
14943 0 : if (e) return e;
14944 0 : p -= l; len -= l; ret += l;
14945 :
14946 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
14947 0 : if (e) return e;
14948 0 : p -= l; len -= l; ret += l;
14949 :
14950 0 : ret += Top_tag_oldret;
14951 : }
14952 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
14953 0 : if (e) return e;
14954 0 : p -= l; len -= l; ret += l;
14955 :
14956 0 : *size = ret;
14957 0 : return 0;
14958 : }
14959 :
14960 : int ASN1CALL
14961 0 : decode_PA_SAM_RESPONSE_2(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, PA_SAM_RESPONSE_2 *data, size_t *size)
14962 : {
14963 0 : size_t ret = 0;
14964 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
14965 : int e HEIMDAL_UNUSED_ATTRIBUTE;
14966 :
14967 0 : memset(data, 0, sizeof(*data));
14968 : {
14969 : size_t Top_datalen, Top_oldlen;
14970 : Der_type Top_type;
14971 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
14972 0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
14973 0 : if(e) goto fail;
14974 0 : p += l; len -= l; ret += l;
14975 0 : Top_oldlen = len;
14976 0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
14977 0 : len = Top_datalen;
14978 : {
14979 : size_t sam_type_datalen, sam_type_oldlen;
14980 : Der_type sam_type_type;
14981 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &sam_type_type, 0, &sam_type_datalen, &l);
14982 0 : if (e == 0 && sam_type_type != CONS) { e = ASN1_BAD_ID; }
14983 0 : if(e) goto fail;
14984 0 : p += l; len -= l; ret += l;
14985 0 : sam_type_oldlen = len;
14986 0 : if (sam_type_datalen > len) { e = ASN1_OVERRUN; goto fail; }
14987 0 : len = sam_type_datalen;
14988 0 : e = decode_krb5int32(p, len, &(data)->sam_type, &l);
14989 0 : if(e) goto fail;
14990 0 : p += l; len -= l; ret += l;
14991 0 : len = sam_type_oldlen - sam_type_datalen;
14992 : }
14993 : {
14994 : size_t sam_flags_datalen, sam_flags_oldlen;
14995 : Der_type sam_flags_type;
14996 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &sam_flags_type, 1, &sam_flags_datalen, &l);
14997 0 : if (e == 0 && sam_flags_type != CONS) { e = ASN1_BAD_ID; }
14998 0 : if(e) goto fail;
14999 0 : p += l; len -= l; ret += l;
15000 0 : sam_flags_oldlen = len;
15001 0 : if (sam_flags_datalen > len) { e = ASN1_OVERRUN; goto fail; }
15002 0 : len = sam_flags_datalen;
15003 0 : e = decode_SAMFlags(p, len, &(data)->sam_flags, &l);
15004 0 : if(e) goto fail;
15005 0 : p += l; len -= l; ret += l;
15006 0 : len = sam_flags_oldlen - sam_flags_datalen;
15007 : }
15008 : {
15009 : size_t sam_track_id_datalen, sam_track_id_oldlen;
15010 : Der_type sam_track_id_type;
15011 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &sam_track_id_type, 2, &sam_track_id_datalen, &l);
15012 0 : if (e == 0 && sam_track_id_type != CONS) { e = ASN1_BAD_ID; }
15013 0 : if(e) {
15014 0 : (data)->sam_track_id = NULL;
15015 : } else {
15016 0 : (data)->sam_track_id = calloc(1, sizeof(*(data)->sam_track_id));
15017 0 : if ((data)->sam_track_id == NULL) { e = ENOMEM; goto fail; }
15018 0 : p += l; len -= l; ret += l;
15019 0 : sam_track_id_oldlen = len;
15020 0 : if (sam_track_id_datalen > len) { e = ASN1_OVERRUN; goto fail; }
15021 0 : len = sam_track_id_datalen;
15022 : {
15023 : size_t sam_track_id_Tag_datalen, sam_track_id_Tag_oldlen;
15024 : Der_type sam_track_id_Tag_type;
15025 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &sam_track_id_Tag_type, UT_GeneralString, &sam_track_id_Tag_datalen, &l);
15026 0 : if (e == 0 && sam_track_id_Tag_type != PRIM) { e = ASN1_BAD_ID; }
15027 0 : if(e) goto fail;
15028 0 : p += l; len -= l; ret += l;
15029 0 : sam_track_id_Tag_oldlen = len;
15030 0 : if (sam_track_id_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
15031 0 : len = sam_track_id_Tag_datalen;
15032 0 : e = der_get_general_string(p, len, (data)->sam_track_id, &l);
15033 0 : if(e) goto fail;
15034 0 : p += l; len -= l; ret += l;
15035 0 : len = sam_track_id_Tag_oldlen - sam_track_id_Tag_datalen;
15036 : }
15037 0 : len = sam_track_id_oldlen - sam_track_id_datalen;
15038 : }
15039 : }
15040 : {
15041 : size_t sam_enc_nonce_or_sad_datalen, sam_enc_nonce_or_sad_oldlen;
15042 : Der_type sam_enc_nonce_or_sad_type;
15043 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &sam_enc_nonce_or_sad_type, 3, &sam_enc_nonce_or_sad_datalen, &l);
15044 0 : if (e == 0 && sam_enc_nonce_or_sad_type != CONS) { e = ASN1_BAD_ID; }
15045 0 : if(e) goto fail;
15046 0 : p += l; len -= l; ret += l;
15047 0 : sam_enc_nonce_or_sad_oldlen = len;
15048 0 : if (sam_enc_nonce_or_sad_datalen > len) { e = ASN1_OVERRUN; goto fail; }
15049 0 : len = sam_enc_nonce_or_sad_datalen;
15050 0 : e = decode_EncryptedData(p, len, &(data)->sam_enc_nonce_or_sad, &l);
15051 0 : if(e) goto fail;
15052 0 : p += l; len -= l; ret += l;
15053 0 : len = sam_enc_nonce_or_sad_oldlen - sam_enc_nonce_or_sad_datalen;
15054 : }
15055 : {
15056 : size_t sam_nonce_datalen, sam_nonce_oldlen;
15057 : Der_type sam_nonce_type;
15058 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &sam_nonce_type, 4, &sam_nonce_datalen, &l);
15059 0 : if (e == 0 && sam_nonce_type != CONS) { e = ASN1_BAD_ID; }
15060 0 : if(e) goto fail;
15061 0 : p += l; len -= l; ret += l;
15062 0 : sam_nonce_oldlen = len;
15063 0 : if (sam_nonce_datalen > len) { e = ASN1_OVERRUN; goto fail; }
15064 0 : len = sam_nonce_datalen;
15065 0 : e = decode_krb5int32(p, len, &(data)->sam_nonce, &l);
15066 0 : if(e) goto fail;
15067 0 : p += l; len -= l; ret += l;
15068 0 : len = sam_nonce_oldlen - sam_nonce_datalen;
15069 : }
15070 0 : len = Top_oldlen - Top_datalen;
15071 : }
15072 0 : if(size) *size = ret;
15073 0 : return 0;
15074 0 : fail:
15075 0 : free_PA_SAM_RESPONSE_2(data);
15076 0 : return e;
15077 : }
15078 :
15079 : void ASN1CALL
15080 0 : free_PA_SAM_RESPONSE_2(PA_SAM_RESPONSE_2 *data)
15081 : {
15082 0 : free_krb5int32(&(data)->sam_type);
15083 0 : free_SAMFlags(&(data)->sam_flags);
15084 0 : if((data)->sam_track_id) {
15085 0 : der_free_general_string((data)->sam_track_id);
15086 0 : free((data)->sam_track_id);
15087 0 : (data)->sam_track_id = NULL;
15088 : }
15089 0 : free_EncryptedData(&(data)->sam_enc_nonce_or_sad);
15090 0 : free_krb5int32(&(data)->sam_nonce);
15091 0 : }
15092 :
15093 : size_t ASN1CALL
15094 0 : length_PA_SAM_RESPONSE_2(const PA_SAM_RESPONSE_2 *data)
15095 : {
15096 0 : size_t ret = 0;
15097 : {
15098 0 : size_t Top_tag_oldret = ret;
15099 0 : ret = 0;
15100 0 : ret += length_krb5int32(&(data)->sam_type);
15101 0 : ret += 1 + der_length_len (ret);
15102 0 : ret += Top_tag_oldret;
15103 : }
15104 : {
15105 0 : size_t Top_tag_oldret = ret;
15106 0 : ret = 0;
15107 0 : ret += length_SAMFlags(&(data)->sam_flags);
15108 0 : ret += 1 + der_length_len (ret);
15109 0 : ret += Top_tag_oldret;
15110 : }
15111 0 : if((data)->sam_track_id){
15112 0 : size_t Top_tag_oldret = ret;
15113 0 : ret = 0;
15114 0 : ret += der_length_general_string((data)->sam_track_id);
15115 0 : ret += 1 + der_length_len (ret);
15116 0 : ret += 1 + der_length_len (ret);
15117 0 : ret += Top_tag_oldret;
15118 : }
15119 : {
15120 0 : size_t Top_tag_oldret = ret;
15121 0 : ret = 0;
15122 0 : ret += length_EncryptedData(&(data)->sam_enc_nonce_or_sad);
15123 0 : ret += 1 + der_length_len (ret);
15124 0 : ret += Top_tag_oldret;
15125 : }
15126 : {
15127 0 : size_t Top_tag_oldret = ret;
15128 0 : ret = 0;
15129 0 : ret += length_krb5int32(&(data)->sam_nonce);
15130 0 : ret += 1 + der_length_len (ret);
15131 0 : ret += Top_tag_oldret;
15132 : }
15133 0 : ret += 1 + der_length_len (ret);
15134 0 : return ret;
15135 : }
15136 :
15137 : int ASN1CALL
15138 0 : copy_PA_SAM_RESPONSE_2(const PA_SAM_RESPONSE_2 *from, PA_SAM_RESPONSE_2 *to)
15139 : {
15140 0 : memset(to, 0, sizeof(*to));
15141 0 : if(copy_krb5int32(&(from)->sam_type, &(to)->sam_type)) goto fail;
15142 0 : if(copy_SAMFlags(&(from)->sam_flags, &(to)->sam_flags)) goto fail;
15143 0 : if((from)->sam_track_id) {
15144 0 : (to)->sam_track_id = malloc(sizeof(*(to)->sam_track_id));
15145 0 : if((to)->sam_track_id == NULL) goto fail;
15146 0 : if(der_copy_general_string((from)->sam_track_id, (to)->sam_track_id)) goto fail;
15147 : }else
15148 0 : (to)->sam_track_id = NULL;
15149 0 : if(copy_EncryptedData(&(from)->sam_enc_nonce_or_sad, &(to)->sam_enc_nonce_or_sad)) goto fail;
15150 0 : if(copy_krb5int32(&(from)->sam_nonce, &(to)->sam_nonce)) goto fail;
15151 0 : return 0;
15152 0 : fail:
15153 0 : free_PA_SAM_RESPONSE_2(to);
15154 0 : return ENOMEM;
15155 : }
15156 :
15157 : int ASN1CALL
15158 0 : encode_PA_ENC_SAM_RESPONSE_ENC(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const PA_ENC_SAM_RESPONSE_ENC *data, size_t *size)
15159 : {
15160 0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
15161 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
15162 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
15163 :
15164 : /* sam-sad */
15165 0 : if((data)->sam_sad) {
15166 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
15167 0 : ret = 0;
15168 0 : e = der_put_general_string(p, len, (data)->sam_sad, &l);
15169 0 : if (e) return e;
15170 0 : p -= l; len -= l; ret += l;
15171 :
15172 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_GeneralString, &l);
15173 0 : if (e) return e;
15174 0 : p -= l; len -= l; ret += l;
15175 :
15176 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
15177 0 : if (e) return e;
15178 0 : p -= l; len -= l; ret += l;
15179 :
15180 0 : ret += Top_tag_oldret;
15181 : }
15182 : /* sam-nonce */
15183 : {
15184 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
15185 0 : ret = 0;
15186 0 : e = encode_krb5int32(p, len, &(data)->sam_nonce, &l);
15187 0 : if (e) return e;
15188 0 : p -= l; len -= l; ret += l;
15189 :
15190 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
15191 0 : if (e) return e;
15192 0 : p -= l; len -= l; ret += l;
15193 :
15194 0 : ret += Top_tag_oldret;
15195 : }
15196 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
15197 0 : if (e) return e;
15198 0 : p -= l; len -= l; ret += l;
15199 :
15200 0 : *size = ret;
15201 0 : return 0;
15202 : }
15203 :
15204 : int ASN1CALL
15205 0 : decode_PA_ENC_SAM_RESPONSE_ENC(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, PA_ENC_SAM_RESPONSE_ENC *data, size_t *size)
15206 : {
15207 0 : size_t ret = 0;
15208 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
15209 : int e HEIMDAL_UNUSED_ATTRIBUTE;
15210 :
15211 0 : memset(data, 0, sizeof(*data));
15212 : {
15213 : size_t Top_datalen, Top_oldlen;
15214 : Der_type Top_type;
15215 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
15216 0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
15217 0 : if(e) goto fail;
15218 0 : p += l; len -= l; ret += l;
15219 0 : Top_oldlen = len;
15220 0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
15221 0 : len = Top_datalen;
15222 : {
15223 : size_t sam_nonce_datalen, sam_nonce_oldlen;
15224 : Der_type sam_nonce_type;
15225 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &sam_nonce_type, 0, &sam_nonce_datalen, &l);
15226 0 : if (e == 0 && sam_nonce_type != CONS) { e = ASN1_BAD_ID; }
15227 0 : if(e) goto fail;
15228 0 : p += l; len -= l; ret += l;
15229 0 : sam_nonce_oldlen = len;
15230 0 : if (sam_nonce_datalen > len) { e = ASN1_OVERRUN; goto fail; }
15231 0 : len = sam_nonce_datalen;
15232 0 : e = decode_krb5int32(p, len, &(data)->sam_nonce, &l);
15233 0 : if(e) goto fail;
15234 0 : p += l; len -= l; ret += l;
15235 0 : len = sam_nonce_oldlen - sam_nonce_datalen;
15236 : }
15237 : {
15238 : size_t sam_sad_datalen, sam_sad_oldlen;
15239 : Der_type sam_sad_type;
15240 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &sam_sad_type, 1, &sam_sad_datalen, &l);
15241 0 : if (e == 0 && sam_sad_type != CONS) { e = ASN1_BAD_ID; }
15242 0 : if(e) {
15243 0 : (data)->sam_sad = NULL;
15244 : } else {
15245 0 : (data)->sam_sad = calloc(1, sizeof(*(data)->sam_sad));
15246 0 : if ((data)->sam_sad == NULL) { e = ENOMEM; goto fail; }
15247 0 : p += l; len -= l; ret += l;
15248 0 : sam_sad_oldlen = len;
15249 0 : if (sam_sad_datalen > len) { e = ASN1_OVERRUN; goto fail; }
15250 0 : len = sam_sad_datalen;
15251 : {
15252 : size_t sam_sad_Tag_datalen, sam_sad_Tag_oldlen;
15253 : Der_type sam_sad_Tag_type;
15254 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &sam_sad_Tag_type, UT_GeneralString, &sam_sad_Tag_datalen, &l);
15255 0 : if (e == 0 && sam_sad_Tag_type != PRIM) { e = ASN1_BAD_ID; }
15256 0 : if(e) goto fail;
15257 0 : p += l; len -= l; ret += l;
15258 0 : sam_sad_Tag_oldlen = len;
15259 0 : if (sam_sad_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
15260 0 : len = sam_sad_Tag_datalen;
15261 0 : e = der_get_general_string(p, len, (data)->sam_sad, &l);
15262 0 : if(e) goto fail;
15263 0 : p += l; len -= l; ret += l;
15264 0 : len = sam_sad_Tag_oldlen - sam_sad_Tag_datalen;
15265 : }
15266 0 : len = sam_sad_oldlen - sam_sad_datalen;
15267 : }
15268 : }
15269 0 : len = Top_oldlen - Top_datalen;
15270 : }
15271 0 : if(size) *size = ret;
15272 0 : return 0;
15273 0 : fail:
15274 0 : free_PA_ENC_SAM_RESPONSE_ENC(data);
15275 0 : return e;
15276 : }
15277 :
15278 : void ASN1CALL
15279 0 : free_PA_ENC_SAM_RESPONSE_ENC(PA_ENC_SAM_RESPONSE_ENC *data)
15280 : {
15281 0 : free_krb5int32(&(data)->sam_nonce);
15282 0 : if((data)->sam_sad) {
15283 0 : der_free_general_string((data)->sam_sad);
15284 0 : free((data)->sam_sad);
15285 0 : (data)->sam_sad = NULL;
15286 : }
15287 0 : }
15288 :
15289 : size_t ASN1CALL
15290 0 : length_PA_ENC_SAM_RESPONSE_ENC(const PA_ENC_SAM_RESPONSE_ENC *data)
15291 : {
15292 0 : size_t ret = 0;
15293 : {
15294 0 : size_t Top_tag_oldret = ret;
15295 0 : ret = 0;
15296 0 : ret += length_krb5int32(&(data)->sam_nonce);
15297 0 : ret += 1 + der_length_len (ret);
15298 0 : ret += Top_tag_oldret;
15299 : }
15300 0 : if((data)->sam_sad){
15301 0 : size_t Top_tag_oldret = ret;
15302 0 : ret = 0;
15303 0 : ret += der_length_general_string((data)->sam_sad);
15304 0 : ret += 1 + der_length_len (ret);
15305 0 : ret += 1 + der_length_len (ret);
15306 0 : ret += Top_tag_oldret;
15307 : }
15308 0 : ret += 1 + der_length_len (ret);
15309 0 : return ret;
15310 : }
15311 :
15312 : int ASN1CALL
15313 0 : copy_PA_ENC_SAM_RESPONSE_ENC(const PA_ENC_SAM_RESPONSE_ENC *from, PA_ENC_SAM_RESPONSE_ENC *to)
15314 : {
15315 0 : memset(to, 0, sizeof(*to));
15316 0 : if(copy_krb5int32(&(from)->sam_nonce, &(to)->sam_nonce)) goto fail;
15317 0 : if((from)->sam_sad) {
15318 0 : (to)->sam_sad = malloc(sizeof(*(to)->sam_sad));
15319 0 : if((to)->sam_sad == NULL) goto fail;
15320 0 : if(der_copy_general_string((from)->sam_sad, (to)->sam_sad)) goto fail;
15321 : }else
15322 0 : (to)->sam_sad = NULL;
15323 0 : return 0;
15324 0 : fail:
15325 0 : free_PA_ENC_SAM_RESPONSE_ENC(to);
15326 0 : return ENOMEM;
15327 : }
15328 :
15329 : int ASN1CALL
15330 752 : encode_PA_S4U2Self(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const PA_S4U2Self *data, size_t *size)
15331 : {
15332 752 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
15333 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
15334 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
15335 :
15336 : /* auth */
15337 : {
15338 752 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
15339 752 : ret = 0;
15340 752 : e = der_put_general_string(p, len, &(data)->auth, &l);
15341 752 : if (e) return e;
15342 752 : p -= l; len -= l; ret += l;
15343 :
15344 752 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_GeneralString, &l);
15345 752 : if (e) return e;
15346 752 : p -= l; len -= l; ret += l;
15347 :
15348 752 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 3, &l);
15349 752 : if (e) return e;
15350 752 : p -= l; len -= l; ret += l;
15351 :
15352 752 : ret += Top_tag_oldret;
15353 : }
15354 : /* cksum */
15355 : {
15356 752 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
15357 752 : ret = 0;
15358 752 : e = encode_Checksum(p, len, &(data)->cksum, &l);
15359 752 : if (e) return e;
15360 752 : p -= l; len -= l; ret += l;
15361 :
15362 752 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
15363 752 : if (e) return e;
15364 752 : p -= l; len -= l; ret += l;
15365 :
15366 752 : ret += Top_tag_oldret;
15367 : }
15368 : /* realm */
15369 : {
15370 752 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
15371 752 : ret = 0;
15372 752 : e = encode_Realm(p, len, &(data)->realm, &l);
15373 752 : if (e) return e;
15374 752 : p -= l; len -= l; ret += l;
15375 :
15376 752 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
15377 752 : if (e) return e;
15378 752 : p -= l; len -= l; ret += l;
15379 :
15380 752 : ret += Top_tag_oldret;
15381 : }
15382 : /* name */
15383 : {
15384 752 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
15385 752 : ret = 0;
15386 752 : e = encode_PrincipalName(p, len, &(data)->name, &l);
15387 752 : if (e) return e;
15388 752 : p -= l; len -= l; ret += l;
15389 :
15390 752 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
15391 752 : if (e) return e;
15392 752 : p -= l; len -= l; ret += l;
15393 :
15394 752 : ret += Top_tag_oldret;
15395 : }
15396 752 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
15397 752 : if (e) return e;
15398 752 : p -= l; len -= l; ret += l;
15399 :
15400 752 : *size = ret;
15401 752 : return 0;
15402 : }
15403 :
15404 : int ASN1CALL
15405 625 : decode_PA_S4U2Self(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, PA_S4U2Self *data, size_t *size)
15406 : {
15407 625 : size_t ret = 0;
15408 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
15409 : int e HEIMDAL_UNUSED_ATTRIBUTE;
15410 :
15411 625 : memset(data, 0, sizeof(*data));
15412 : {
15413 : size_t Top_datalen, Top_oldlen;
15414 : Der_type Top_type;
15415 625 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
15416 625 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
15417 625 : if(e) goto fail;
15418 625 : p += l; len -= l; ret += l;
15419 625 : Top_oldlen = len;
15420 625 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
15421 625 : len = Top_datalen;
15422 : {
15423 : size_t name_datalen, name_oldlen;
15424 : Der_type name_type;
15425 625 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &name_type, 0, &name_datalen, &l);
15426 625 : if (e == 0 && name_type != CONS) { e = ASN1_BAD_ID; }
15427 625 : if(e) goto fail;
15428 625 : p += l; len -= l; ret += l;
15429 625 : name_oldlen = len;
15430 625 : if (name_datalen > len) { e = ASN1_OVERRUN; goto fail; }
15431 625 : len = name_datalen;
15432 625 : e = decode_PrincipalName(p, len, &(data)->name, &l);
15433 625 : if(e) goto fail;
15434 625 : p += l; len -= l; ret += l;
15435 625 : len = name_oldlen - name_datalen;
15436 : }
15437 : {
15438 : size_t realm_datalen, realm_oldlen;
15439 : Der_type realm_type;
15440 625 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &realm_type, 1, &realm_datalen, &l);
15441 1250 : if (e == 0 && realm_type != CONS) { e = ASN1_BAD_ID; }
15442 625 : if(e) goto fail;
15443 625 : p += l; len -= l; ret += l;
15444 625 : realm_oldlen = len;
15445 625 : if (realm_datalen > len) { e = ASN1_OVERRUN; goto fail; }
15446 625 : len = realm_datalen;
15447 625 : e = decode_Realm(p, len, &(data)->realm, &l);
15448 625 : if(e) goto fail;
15449 625 : p += l; len -= l; ret += l;
15450 625 : len = realm_oldlen - realm_datalen;
15451 : }
15452 : {
15453 : size_t cksum_datalen, cksum_oldlen;
15454 : Der_type cksum_type;
15455 625 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &cksum_type, 2, &cksum_datalen, &l);
15456 1250 : if (e == 0 && cksum_type != CONS) { e = ASN1_BAD_ID; }
15457 625 : if(e) goto fail;
15458 625 : p += l; len -= l; ret += l;
15459 625 : cksum_oldlen = len;
15460 625 : if (cksum_datalen > len) { e = ASN1_OVERRUN; goto fail; }
15461 625 : len = cksum_datalen;
15462 625 : e = decode_Checksum(p, len, &(data)->cksum, &l);
15463 625 : if(e) goto fail;
15464 625 : p += l; len -= l; ret += l;
15465 625 : len = cksum_oldlen - cksum_datalen;
15466 : }
15467 : {
15468 : size_t auth_datalen, auth_oldlen;
15469 : Der_type auth_type;
15470 625 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &auth_type, 3, &auth_datalen, &l);
15471 1250 : if (e == 0 && auth_type != CONS) { e = ASN1_BAD_ID; }
15472 625 : if(e) goto fail;
15473 625 : p += l; len -= l; ret += l;
15474 625 : auth_oldlen = len;
15475 625 : if (auth_datalen > len) { e = ASN1_OVERRUN; goto fail; }
15476 625 : len = auth_datalen;
15477 : {
15478 : size_t auth_Tag_datalen, auth_Tag_oldlen;
15479 : Der_type auth_Tag_type;
15480 625 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &auth_Tag_type, UT_GeneralString, &auth_Tag_datalen, &l);
15481 625 : if (e == 0 && auth_Tag_type != PRIM) { e = ASN1_BAD_ID; }
15482 625 : if(e) goto fail;
15483 625 : p += l; len -= l; ret += l;
15484 625 : auth_Tag_oldlen = len;
15485 625 : if (auth_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
15486 625 : len = auth_Tag_datalen;
15487 625 : e = der_get_general_string(p, len, &(data)->auth, &l);
15488 625 : if(e) goto fail;
15489 625 : p += l; len -= l; ret += l;
15490 625 : len = auth_Tag_oldlen - auth_Tag_datalen;
15491 : }
15492 625 : len = auth_oldlen - auth_datalen;
15493 : }
15494 625 : len = Top_oldlen - Top_datalen;
15495 : }
15496 625 : if(size) *size = ret;
15497 625 : return 0;
15498 0 : fail:
15499 0 : free_PA_S4U2Self(data);
15500 0 : return e;
15501 : }
15502 :
15503 : void ASN1CALL
15504 625 : free_PA_S4U2Self(PA_S4U2Self *data)
15505 : {
15506 625 : free_PrincipalName(&(data)->name);
15507 625 : free_Realm(&(data)->realm);
15508 625 : free_Checksum(&(data)->cksum);
15509 625 : der_free_general_string(&(data)->auth);
15510 625 : }
15511 :
15512 : size_t ASN1CALL
15513 752 : length_PA_S4U2Self(const PA_S4U2Self *data)
15514 : {
15515 752 : size_t ret = 0;
15516 : {
15517 752 : size_t Top_tag_oldret = ret;
15518 752 : ret = 0;
15519 752 : ret += length_PrincipalName(&(data)->name);
15520 752 : ret += 1 + der_length_len (ret);
15521 752 : ret += Top_tag_oldret;
15522 : }
15523 : {
15524 752 : size_t Top_tag_oldret = ret;
15525 752 : ret = 0;
15526 752 : ret += length_Realm(&(data)->realm);
15527 752 : ret += 1 + der_length_len (ret);
15528 752 : ret += Top_tag_oldret;
15529 : }
15530 : {
15531 752 : size_t Top_tag_oldret = ret;
15532 752 : ret = 0;
15533 752 : ret += length_Checksum(&(data)->cksum);
15534 752 : ret += 1 + der_length_len (ret);
15535 752 : ret += Top_tag_oldret;
15536 : }
15537 : {
15538 752 : size_t Top_tag_oldret = ret;
15539 752 : ret = 0;
15540 752 : ret += der_length_general_string(&(data)->auth);
15541 752 : ret += 1 + der_length_len (ret);
15542 752 : ret += 1 + der_length_len (ret);
15543 752 : ret += Top_tag_oldret;
15544 : }
15545 752 : ret += 1 + der_length_len (ret);
15546 752 : return ret;
15547 : }
15548 :
15549 : int ASN1CALL
15550 0 : copy_PA_S4U2Self(const PA_S4U2Self *from, PA_S4U2Self *to)
15551 : {
15552 0 : memset(to, 0, sizeof(*to));
15553 0 : if(copy_PrincipalName(&(from)->name, &(to)->name)) goto fail;
15554 0 : if(copy_Realm(&(from)->realm, &(to)->realm)) goto fail;
15555 0 : if(copy_Checksum(&(from)->cksum, &(to)->cksum)) goto fail;
15556 0 : if(der_copy_general_string(&(from)->auth, &(to)->auth)) goto fail;
15557 0 : return 0;
15558 0 : fail:
15559 0 : free_PA_S4U2Self(to);
15560 0 : return ENOMEM;
15561 : }
15562 :
15563 : int ASN1CALL
15564 104469 : encode_KRB5SignedPathData(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const KRB5SignedPathData *data, size_t *size)
15565 : {
15566 104469 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
15567 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
15568 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
15569 :
15570 : /* method_data */
15571 104469 : if((data)->method_data) {
15572 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
15573 0 : ret = 0;
15574 0 : e = encode_METHOD_DATA(p, len, (data)->method_data, &l);
15575 0 : if (e) return e;
15576 0 : p -= l; len -= l; ret += l;
15577 :
15578 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 3, &l);
15579 0 : if (e) return e;
15580 0 : p -= l; len -= l; ret += l;
15581 :
15582 0 : ret += Top_tag_oldret;
15583 : }
15584 : /* delegated */
15585 104469 : if((data)->delegated) {
15586 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
15587 0 : ret = 0;
15588 0 : e = encode_Principals(p, len, (data)->delegated, &l);
15589 0 : if (e) return e;
15590 0 : p -= l; len -= l; ret += l;
15591 :
15592 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
15593 0 : if (e) return e;
15594 0 : p -= l; len -= l; ret += l;
15595 :
15596 0 : ret += Top_tag_oldret;
15597 : }
15598 : /* authtime */
15599 : {
15600 104469 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
15601 104469 : ret = 0;
15602 104469 : e = encode_KerberosTime(p, len, &(data)->authtime, &l);
15603 104469 : if (e) return e;
15604 104469 : p -= l; len -= l; ret += l;
15605 :
15606 104469 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
15607 104469 : if (e) return e;
15608 104469 : p -= l; len -= l; ret += l;
15609 :
15610 104469 : ret += Top_tag_oldret;
15611 : }
15612 : /* client */
15613 104469 : if((data)->client) {
15614 104469 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
15615 104469 : ret = 0;
15616 104469 : e = encode_Principal(p, len, (data)->client, &l);
15617 104469 : if (e) return e;
15618 104469 : p -= l; len -= l; ret += l;
15619 :
15620 104469 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
15621 104469 : if (e) return e;
15622 104469 : p -= l; len -= l; ret += l;
15623 :
15624 104469 : ret += Top_tag_oldret;
15625 : }
15626 104469 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
15627 104469 : if (e) return e;
15628 104469 : p -= l; len -= l; ret += l;
15629 :
15630 104469 : *size = ret;
15631 104469 : return 0;
15632 : }
15633 :
15634 : int ASN1CALL
15635 0 : decode_KRB5SignedPathData(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, KRB5SignedPathData *data, size_t *size)
15636 : {
15637 0 : size_t ret = 0;
15638 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
15639 : int e HEIMDAL_UNUSED_ATTRIBUTE;
15640 :
15641 0 : memset(data, 0, sizeof(*data));
15642 : {
15643 : size_t Top_datalen, Top_oldlen;
15644 : Der_type Top_type;
15645 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
15646 0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
15647 0 : if(e) goto fail;
15648 0 : p += l; len -= l; ret += l;
15649 0 : Top_oldlen = len;
15650 0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
15651 0 : len = Top_datalen;
15652 : {
15653 : size_t client_datalen, client_oldlen;
15654 : Der_type client_type;
15655 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &client_type, 0, &client_datalen, &l);
15656 0 : if (e == 0 && client_type != CONS) { e = ASN1_BAD_ID; }
15657 0 : if(e) {
15658 0 : (data)->client = NULL;
15659 : } else {
15660 0 : (data)->client = calloc(1, sizeof(*(data)->client));
15661 0 : if ((data)->client == NULL) { e = ENOMEM; goto fail; }
15662 0 : p += l; len -= l; ret += l;
15663 0 : client_oldlen = len;
15664 0 : if (client_datalen > len) { e = ASN1_OVERRUN; goto fail; }
15665 0 : len = client_datalen;
15666 0 : e = decode_Principal(p, len, (data)->client, &l);
15667 0 : if(e) goto fail;
15668 0 : p += l; len -= l; ret += l;
15669 0 : len = client_oldlen - client_datalen;
15670 : }
15671 : }
15672 : {
15673 : size_t authtime_datalen, authtime_oldlen;
15674 : Der_type authtime_type;
15675 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &authtime_type, 1, &authtime_datalen, &l);
15676 0 : if (e == 0 && authtime_type != CONS) { e = ASN1_BAD_ID; }
15677 0 : if(e) goto fail;
15678 0 : p += l; len -= l; ret += l;
15679 0 : authtime_oldlen = len;
15680 0 : if (authtime_datalen > len) { e = ASN1_OVERRUN; goto fail; }
15681 0 : len = authtime_datalen;
15682 0 : e = decode_KerberosTime(p, len, &(data)->authtime, &l);
15683 0 : if(e) goto fail;
15684 0 : p += l; len -= l; ret += l;
15685 0 : len = authtime_oldlen - authtime_datalen;
15686 : }
15687 : {
15688 : size_t delegated_datalen, delegated_oldlen;
15689 : Der_type delegated_type;
15690 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &delegated_type, 2, &delegated_datalen, &l);
15691 0 : if (e == 0 && delegated_type != CONS) { e = ASN1_BAD_ID; }
15692 0 : if(e) {
15693 0 : (data)->delegated = NULL;
15694 : } else {
15695 0 : (data)->delegated = calloc(1, sizeof(*(data)->delegated));
15696 0 : if ((data)->delegated == NULL) { e = ENOMEM; goto fail; }
15697 0 : p += l; len -= l; ret += l;
15698 0 : delegated_oldlen = len;
15699 0 : if (delegated_datalen > len) { e = ASN1_OVERRUN; goto fail; }
15700 0 : len = delegated_datalen;
15701 0 : e = decode_Principals(p, len, (data)->delegated, &l);
15702 0 : if(e) goto fail;
15703 0 : p += l; len -= l; ret += l;
15704 0 : len = delegated_oldlen - delegated_datalen;
15705 : }
15706 : }
15707 : {
15708 : size_t method_data_datalen, method_data_oldlen;
15709 : Der_type method_data_type;
15710 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &method_data_type, 3, &method_data_datalen, &l);
15711 0 : if (e == 0 && method_data_type != CONS) { e = ASN1_BAD_ID; }
15712 0 : if(e) {
15713 0 : (data)->method_data = NULL;
15714 : } else {
15715 0 : (data)->method_data = calloc(1, sizeof(*(data)->method_data));
15716 0 : if ((data)->method_data == NULL) { e = ENOMEM; goto fail; }
15717 0 : p += l; len -= l; ret += l;
15718 0 : method_data_oldlen = len;
15719 0 : if (method_data_datalen > len) { e = ASN1_OVERRUN; goto fail; }
15720 0 : len = method_data_datalen;
15721 0 : e = decode_METHOD_DATA(p, len, (data)->method_data, &l);
15722 0 : if(e) goto fail;
15723 0 : p += l; len -= l; ret += l;
15724 0 : len = method_data_oldlen - method_data_datalen;
15725 : }
15726 : }
15727 0 : len = Top_oldlen - Top_datalen;
15728 : }
15729 0 : if(size) *size = ret;
15730 0 : return 0;
15731 0 : fail:
15732 0 : free_KRB5SignedPathData(data);
15733 0 : return e;
15734 : }
15735 :
15736 : void ASN1CALL
15737 0 : free_KRB5SignedPathData(KRB5SignedPathData *data)
15738 : {
15739 0 : if((data)->client) {
15740 0 : free_Principal((data)->client);
15741 0 : free((data)->client);
15742 0 : (data)->client = NULL;
15743 : }
15744 0 : free_KerberosTime(&(data)->authtime);
15745 0 : if((data)->delegated) {
15746 0 : free_Principals((data)->delegated);
15747 0 : free((data)->delegated);
15748 0 : (data)->delegated = NULL;
15749 : }
15750 0 : if((data)->method_data) {
15751 0 : free_METHOD_DATA((data)->method_data);
15752 0 : free((data)->method_data);
15753 0 : (data)->method_data = NULL;
15754 : }
15755 0 : }
15756 :
15757 : size_t ASN1CALL
15758 104469 : length_KRB5SignedPathData(const KRB5SignedPathData *data)
15759 : {
15760 104469 : size_t ret = 0;
15761 104469 : if((data)->client){
15762 104469 : size_t Top_tag_oldret = ret;
15763 104469 : ret = 0;
15764 104469 : ret += length_Principal((data)->client);
15765 104469 : ret += 1 + der_length_len (ret);
15766 104469 : ret += Top_tag_oldret;
15767 : }
15768 : {
15769 104469 : size_t Top_tag_oldret = ret;
15770 104469 : ret = 0;
15771 104469 : ret += length_KerberosTime(&(data)->authtime);
15772 104469 : ret += 1 + der_length_len (ret);
15773 104469 : ret += Top_tag_oldret;
15774 : }
15775 104469 : if((data)->delegated){
15776 0 : size_t Top_tag_oldret = ret;
15777 0 : ret = 0;
15778 0 : ret += length_Principals((data)->delegated);
15779 0 : ret += 1 + der_length_len (ret);
15780 0 : ret += Top_tag_oldret;
15781 : }
15782 104469 : if((data)->method_data){
15783 0 : size_t Top_tag_oldret = ret;
15784 0 : ret = 0;
15785 0 : ret += length_METHOD_DATA((data)->method_data);
15786 0 : ret += 1 + der_length_len (ret);
15787 0 : ret += Top_tag_oldret;
15788 : }
15789 104469 : ret += 1 + der_length_len (ret);
15790 104469 : return ret;
15791 : }
15792 :
15793 : int ASN1CALL
15794 0 : copy_KRB5SignedPathData(const KRB5SignedPathData *from, KRB5SignedPathData *to)
15795 : {
15796 0 : memset(to, 0, sizeof(*to));
15797 0 : if((from)->client) {
15798 0 : (to)->client = malloc(sizeof(*(to)->client));
15799 0 : if((to)->client == NULL) goto fail;
15800 0 : if(copy_Principal((from)->client, (to)->client)) goto fail;
15801 : }else
15802 0 : (to)->client = NULL;
15803 0 : if(copy_KerberosTime(&(from)->authtime, &(to)->authtime)) goto fail;
15804 0 : if((from)->delegated) {
15805 0 : (to)->delegated = malloc(sizeof(*(to)->delegated));
15806 0 : if((to)->delegated == NULL) goto fail;
15807 0 : if(copy_Principals((from)->delegated, (to)->delegated)) goto fail;
15808 : }else
15809 0 : (to)->delegated = NULL;
15810 0 : if((from)->method_data) {
15811 0 : (to)->method_data = malloc(sizeof(*(to)->method_data));
15812 0 : if((to)->method_data == NULL) goto fail;
15813 0 : if(copy_METHOD_DATA((from)->method_data, (to)->method_data)) goto fail;
15814 : }else
15815 0 : (to)->method_data = NULL;
15816 0 : return 0;
15817 0 : fail:
15818 0 : free_KRB5SignedPathData(to);
15819 0 : return ENOMEM;
15820 : }
15821 :
15822 : int ASN1CALL
15823 64870 : encode_KRB5SignedPath(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const KRB5SignedPath *data, size_t *size)
15824 : {
15825 64870 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
15826 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
15827 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
15828 :
15829 : /* method_data */
15830 64870 : if((data)->method_data) {
15831 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
15832 0 : ret = 0;
15833 0 : e = encode_METHOD_DATA(p, len, (data)->method_data, &l);
15834 0 : if (e) return e;
15835 0 : p -= l; len -= l; ret += l;
15836 :
15837 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 3, &l);
15838 0 : if (e) return e;
15839 0 : p -= l; len -= l; ret += l;
15840 :
15841 0 : ret += Top_tag_oldret;
15842 : }
15843 : /* delegated */
15844 64870 : if((data)->delegated) {
15845 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
15846 0 : ret = 0;
15847 0 : e = encode_Principals(p, len, (data)->delegated, &l);
15848 0 : if (e) return e;
15849 0 : p -= l; len -= l; ret += l;
15850 :
15851 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
15852 0 : if (e) return e;
15853 0 : p -= l; len -= l; ret += l;
15854 :
15855 0 : ret += Top_tag_oldret;
15856 : }
15857 : /* cksum */
15858 : {
15859 64870 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
15860 64870 : ret = 0;
15861 64870 : e = encode_Checksum(p, len, &(data)->cksum, &l);
15862 64870 : if (e) return e;
15863 64870 : p -= l; len -= l; ret += l;
15864 :
15865 64870 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
15866 64870 : if (e) return e;
15867 64870 : p -= l; len -= l; ret += l;
15868 :
15869 64870 : ret += Top_tag_oldret;
15870 : }
15871 : /* etype */
15872 : {
15873 64870 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
15874 64870 : ret = 0;
15875 64870 : e = encode_ENCTYPE(p, len, &(data)->etype, &l);
15876 64870 : if (e) return e;
15877 64870 : p -= l; len -= l; ret += l;
15878 :
15879 64870 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
15880 64870 : if (e) return e;
15881 64870 : p -= l; len -= l; ret += l;
15882 :
15883 64870 : ret += Top_tag_oldret;
15884 : }
15885 64870 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
15886 64870 : if (e) return e;
15887 64870 : p -= l; len -= l; ret += l;
15888 :
15889 64870 : *size = ret;
15890 64870 : return 0;
15891 : }
15892 :
15893 : int ASN1CALL
15894 39599 : decode_KRB5SignedPath(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, KRB5SignedPath *data, size_t *size)
15895 : {
15896 39599 : size_t ret = 0;
15897 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
15898 : int e HEIMDAL_UNUSED_ATTRIBUTE;
15899 :
15900 39599 : memset(data, 0, sizeof(*data));
15901 : {
15902 : size_t Top_datalen, Top_oldlen;
15903 : Der_type Top_type;
15904 39599 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
15905 39599 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
15906 39599 : if(e) goto fail;
15907 39599 : p += l; len -= l; ret += l;
15908 39599 : Top_oldlen = len;
15909 39599 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
15910 39599 : len = Top_datalen;
15911 : {
15912 : size_t etype_datalen, etype_oldlen;
15913 : Der_type etype_type;
15914 39599 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &etype_type, 0, &etype_datalen, &l);
15915 39599 : if (e == 0 && etype_type != CONS) { e = ASN1_BAD_ID; }
15916 39599 : if(e) goto fail;
15917 39599 : p += l; len -= l; ret += l;
15918 39599 : etype_oldlen = len;
15919 39599 : if (etype_datalen > len) { e = ASN1_OVERRUN; goto fail; }
15920 39599 : len = etype_datalen;
15921 39599 : e = decode_ENCTYPE(p, len, &(data)->etype, &l);
15922 39599 : if(e) goto fail;
15923 39599 : p += l; len -= l; ret += l;
15924 39599 : len = etype_oldlen - etype_datalen;
15925 : }
15926 : {
15927 : size_t cksum_datalen, cksum_oldlen;
15928 : Der_type cksum_type;
15929 39599 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &cksum_type, 1, &cksum_datalen, &l);
15930 78109 : if (e == 0 && cksum_type != CONS) { e = ASN1_BAD_ID; }
15931 39599 : if(e) goto fail;
15932 39599 : p += l; len -= l; ret += l;
15933 39599 : cksum_oldlen = len;
15934 39599 : if (cksum_datalen > len) { e = ASN1_OVERRUN; goto fail; }
15935 39599 : len = cksum_datalen;
15936 39599 : e = decode_Checksum(p, len, &(data)->cksum, &l);
15937 39599 : if(e) goto fail;
15938 39599 : p += l; len -= l; ret += l;
15939 39599 : len = cksum_oldlen - cksum_datalen;
15940 : }
15941 : {
15942 : size_t delegated_datalen, delegated_oldlen;
15943 : Der_type delegated_type;
15944 39599 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &delegated_type, 2, &delegated_datalen, &l);
15945 39599 : if (e == 0 && delegated_type != CONS) { e = ASN1_BAD_ID; }
15946 39599 : if(e) {
15947 39599 : (data)->delegated = NULL;
15948 : } else {
15949 0 : (data)->delegated = calloc(1, sizeof(*(data)->delegated));
15950 0 : if ((data)->delegated == NULL) { e = ENOMEM; goto fail; }
15951 0 : p += l; len -= l; ret += l;
15952 0 : delegated_oldlen = len;
15953 0 : if (delegated_datalen > len) { e = ASN1_OVERRUN; goto fail; }
15954 0 : len = delegated_datalen;
15955 0 : e = decode_Principals(p, len, (data)->delegated, &l);
15956 0 : if(e) goto fail;
15957 0 : p += l; len -= l; ret += l;
15958 0 : len = delegated_oldlen - delegated_datalen;
15959 : }
15960 : }
15961 : {
15962 : size_t method_data_datalen, method_data_oldlen;
15963 : Der_type method_data_type;
15964 39599 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &method_data_type, 3, &method_data_datalen, &l);
15965 39599 : if (e == 0 && method_data_type != CONS) { e = ASN1_BAD_ID; }
15966 39599 : if(e) {
15967 39599 : (data)->method_data = NULL;
15968 : } else {
15969 0 : (data)->method_data = calloc(1, sizeof(*(data)->method_data));
15970 0 : if ((data)->method_data == NULL) { e = ENOMEM; goto fail; }
15971 0 : p += l; len -= l; ret += l;
15972 0 : method_data_oldlen = len;
15973 0 : if (method_data_datalen > len) { e = ASN1_OVERRUN; goto fail; }
15974 0 : len = method_data_datalen;
15975 0 : e = decode_METHOD_DATA(p, len, (data)->method_data, &l);
15976 0 : if(e) goto fail;
15977 0 : p += l; len -= l; ret += l;
15978 0 : len = method_data_oldlen - method_data_datalen;
15979 : }
15980 : }
15981 39599 : len = Top_oldlen - Top_datalen;
15982 : }
15983 39599 : if(size) *size = ret;
15984 38510 : return 0;
15985 0 : fail:
15986 0 : free_KRB5SignedPath(data);
15987 0 : return e;
15988 : }
15989 :
15990 : void ASN1CALL
15991 39599 : free_KRB5SignedPath(KRB5SignedPath *data)
15992 : {
15993 39599 : free_ENCTYPE(&(data)->etype);
15994 39599 : free_Checksum(&(data)->cksum);
15995 39599 : if((data)->delegated) {
15996 0 : free_Principals((data)->delegated);
15997 0 : free((data)->delegated);
15998 0 : (data)->delegated = NULL;
15999 : }
16000 39599 : if((data)->method_data) {
16001 0 : free_METHOD_DATA((data)->method_data);
16002 0 : free((data)->method_data);
16003 0 : (data)->method_data = NULL;
16004 : }
16005 39599 : }
16006 :
16007 : size_t ASN1CALL
16008 64870 : length_KRB5SignedPath(const KRB5SignedPath *data)
16009 : {
16010 64870 : size_t ret = 0;
16011 : {
16012 64870 : size_t Top_tag_oldret = ret;
16013 64870 : ret = 0;
16014 64870 : ret += length_ENCTYPE(&(data)->etype);
16015 64870 : ret += 1 + der_length_len (ret);
16016 64870 : ret += Top_tag_oldret;
16017 : }
16018 : {
16019 64870 : size_t Top_tag_oldret = ret;
16020 64870 : ret = 0;
16021 64870 : ret += length_Checksum(&(data)->cksum);
16022 64870 : ret += 1 + der_length_len (ret);
16023 64870 : ret += Top_tag_oldret;
16024 : }
16025 64870 : if((data)->delegated){
16026 0 : size_t Top_tag_oldret = ret;
16027 0 : ret = 0;
16028 0 : ret += length_Principals((data)->delegated);
16029 0 : ret += 1 + der_length_len (ret);
16030 0 : ret += Top_tag_oldret;
16031 : }
16032 64870 : if((data)->method_data){
16033 0 : size_t Top_tag_oldret = ret;
16034 0 : ret = 0;
16035 0 : ret += length_METHOD_DATA((data)->method_data);
16036 0 : ret += 1 + der_length_len (ret);
16037 0 : ret += Top_tag_oldret;
16038 : }
16039 64870 : ret += 1 + der_length_len (ret);
16040 64870 : return ret;
16041 : }
16042 :
16043 : int ASN1CALL
16044 0 : copy_KRB5SignedPath(const KRB5SignedPath *from, KRB5SignedPath *to)
16045 : {
16046 0 : memset(to, 0, sizeof(*to));
16047 0 : if(copy_ENCTYPE(&(from)->etype, &(to)->etype)) goto fail;
16048 0 : if(copy_Checksum(&(from)->cksum, &(to)->cksum)) goto fail;
16049 0 : if((from)->delegated) {
16050 0 : (to)->delegated = malloc(sizeof(*(to)->delegated));
16051 0 : if((to)->delegated == NULL) goto fail;
16052 0 : if(copy_Principals((from)->delegated, (to)->delegated)) goto fail;
16053 : }else
16054 0 : (to)->delegated = NULL;
16055 0 : if((from)->method_data) {
16056 0 : (to)->method_data = malloc(sizeof(*(to)->method_data));
16057 0 : if((to)->method_data == NULL) goto fail;
16058 0 : if(copy_METHOD_DATA((from)->method_data, (to)->method_data)) goto fail;
16059 : }else
16060 0 : (to)->method_data = NULL;
16061 0 : return 0;
16062 0 : fail:
16063 0 : free_KRB5SignedPath(to);
16064 0 : return ENOMEM;
16065 : }
16066 :
16067 : int ASN1CALL
16068 0 : encode_AD_LoginAlias(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const AD_LoginAlias *data, size_t *size)
16069 : {
16070 0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
16071 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
16072 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
16073 :
16074 : /* checksum */
16075 : {
16076 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
16077 0 : ret = 0;
16078 0 : e = encode_Checksum(p, len, &(data)->checksum, &l);
16079 0 : if (e) return e;
16080 0 : p -= l; len -= l; ret += l;
16081 :
16082 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
16083 0 : if (e) return e;
16084 0 : p -= l; len -= l; ret += l;
16085 :
16086 0 : ret += Top_tag_oldret;
16087 : }
16088 : /* login-alias */
16089 : {
16090 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
16091 0 : ret = 0;
16092 0 : e = encode_PrincipalName(p, len, &(data)->login_alias, &l);
16093 0 : if (e) return e;
16094 0 : p -= l; len -= l; ret += l;
16095 :
16096 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
16097 0 : if (e) return e;
16098 0 : p -= l; len -= l; ret += l;
16099 :
16100 0 : ret += Top_tag_oldret;
16101 : }
16102 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
16103 0 : if (e) return e;
16104 0 : p -= l; len -= l; ret += l;
16105 :
16106 0 : *size = ret;
16107 0 : return 0;
16108 : }
16109 :
16110 : int ASN1CALL
16111 0 : decode_AD_LoginAlias(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, AD_LoginAlias *data, size_t *size)
16112 : {
16113 0 : size_t ret = 0;
16114 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
16115 : int e HEIMDAL_UNUSED_ATTRIBUTE;
16116 :
16117 0 : memset(data, 0, sizeof(*data));
16118 : {
16119 : size_t Top_datalen, Top_oldlen;
16120 : Der_type Top_type;
16121 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
16122 0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
16123 0 : if(e) goto fail;
16124 0 : p += l; len -= l; ret += l;
16125 0 : Top_oldlen = len;
16126 0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
16127 0 : len = Top_datalen;
16128 : {
16129 : size_t login_alias_datalen, login_alias_oldlen;
16130 : Der_type login_alias_type;
16131 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &login_alias_type, 0, &login_alias_datalen, &l);
16132 0 : if (e == 0 && login_alias_type != CONS) { e = ASN1_BAD_ID; }
16133 0 : if(e) goto fail;
16134 0 : p += l; len -= l; ret += l;
16135 0 : login_alias_oldlen = len;
16136 0 : if (login_alias_datalen > len) { e = ASN1_OVERRUN; goto fail; }
16137 0 : len = login_alias_datalen;
16138 0 : e = decode_PrincipalName(p, len, &(data)->login_alias, &l);
16139 0 : if(e) goto fail;
16140 0 : p += l; len -= l; ret += l;
16141 0 : len = login_alias_oldlen - login_alias_datalen;
16142 : }
16143 : {
16144 : size_t checksum_datalen, checksum_oldlen;
16145 : Der_type checksum_type;
16146 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &checksum_type, 1, &checksum_datalen, &l);
16147 0 : if (e == 0 && checksum_type != CONS) { e = ASN1_BAD_ID; }
16148 0 : if(e) goto fail;
16149 0 : p += l; len -= l; ret += l;
16150 0 : checksum_oldlen = len;
16151 0 : if (checksum_datalen > len) { e = ASN1_OVERRUN; goto fail; }
16152 0 : len = checksum_datalen;
16153 0 : e = decode_Checksum(p, len, &(data)->checksum, &l);
16154 0 : if(e) goto fail;
16155 0 : p += l; len -= l; ret += l;
16156 0 : len = checksum_oldlen - checksum_datalen;
16157 : }
16158 0 : len = Top_oldlen - Top_datalen;
16159 : }
16160 0 : if(size) *size = ret;
16161 0 : return 0;
16162 0 : fail:
16163 0 : free_AD_LoginAlias(data);
16164 0 : return e;
16165 : }
16166 :
16167 : void ASN1CALL
16168 0 : free_AD_LoginAlias(AD_LoginAlias *data)
16169 : {
16170 0 : free_PrincipalName(&(data)->login_alias);
16171 0 : free_Checksum(&(data)->checksum);
16172 0 : }
16173 :
16174 : size_t ASN1CALL
16175 0 : length_AD_LoginAlias(const AD_LoginAlias *data)
16176 : {
16177 0 : size_t ret = 0;
16178 : {
16179 0 : size_t Top_tag_oldret = ret;
16180 0 : ret = 0;
16181 0 : ret += length_PrincipalName(&(data)->login_alias);
16182 0 : ret += 1 + der_length_len (ret);
16183 0 : ret += Top_tag_oldret;
16184 : }
16185 : {
16186 0 : size_t Top_tag_oldret = ret;
16187 0 : ret = 0;
16188 0 : ret += length_Checksum(&(data)->checksum);
16189 0 : ret += 1 + der_length_len (ret);
16190 0 : ret += Top_tag_oldret;
16191 : }
16192 0 : ret += 1 + der_length_len (ret);
16193 0 : return ret;
16194 : }
16195 :
16196 : int ASN1CALL
16197 0 : copy_AD_LoginAlias(const AD_LoginAlias *from, AD_LoginAlias *to)
16198 : {
16199 0 : memset(to, 0, sizeof(*to));
16200 0 : if(copy_PrincipalName(&(from)->login_alias, &(to)->login_alias)) goto fail;
16201 0 : if(copy_Checksum(&(from)->checksum, &(to)->checksum)) goto fail;
16202 0 : return 0;
16203 0 : fail:
16204 0 : free_AD_LoginAlias(to);
16205 0 : return ENOMEM;
16206 : }
16207 :
16208 : int ASN1CALL
16209 0 : encode_PA_SvrReferralData(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const PA_SvrReferralData *data, size_t *size)
16210 : {
16211 0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
16212 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
16213 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
16214 :
16215 : /* referred-realm */
16216 : {
16217 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
16218 0 : ret = 0;
16219 0 : e = encode_Realm(p, len, &(data)->referred_realm, &l);
16220 0 : if (e) return e;
16221 0 : p -= l; len -= l; ret += l;
16222 :
16223 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
16224 0 : if (e) return e;
16225 0 : p -= l; len -= l; ret += l;
16226 :
16227 0 : ret += Top_tag_oldret;
16228 : }
16229 : /* referred-name */
16230 0 : if((data)->referred_name) {
16231 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
16232 0 : ret = 0;
16233 0 : e = encode_PrincipalName(p, len, (data)->referred_name, &l);
16234 0 : if (e) return e;
16235 0 : p -= l; len -= l; ret += l;
16236 :
16237 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
16238 0 : if (e) return e;
16239 0 : p -= l; len -= l; ret += l;
16240 :
16241 0 : ret += Top_tag_oldret;
16242 : }
16243 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
16244 0 : if (e) return e;
16245 0 : p -= l; len -= l; ret += l;
16246 :
16247 0 : *size = ret;
16248 0 : return 0;
16249 : }
16250 :
16251 : int ASN1CALL
16252 0 : decode_PA_SvrReferralData(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, PA_SvrReferralData *data, size_t *size)
16253 : {
16254 0 : size_t ret = 0;
16255 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
16256 : int e HEIMDAL_UNUSED_ATTRIBUTE;
16257 :
16258 0 : memset(data, 0, sizeof(*data));
16259 : {
16260 : size_t Top_datalen, Top_oldlen;
16261 : Der_type Top_type;
16262 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
16263 0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
16264 0 : if(e) goto fail;
16265 0 : p += l; len -= l; ret += l;
16266 0 : Top_oldlen = len;
16267 0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
16268 0 : len = Top_datalen;
16269 : {
16270 : size_t referred_name_datalen, referred_name_oldlen;
16271 : Der_type referred_name_type;
16272 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &referred_name_type, 1, &referred_name_datalen, &l);
16273 0 : if (e == 0 && referred_name_type != CONS) { e = ASN1_BAD_ID; }
16274 0 : if(e) {
16275 0 : (data)->referred_name = NULL;
16276 : } else {
16277 0 : (data)->referred_name = calloc(1, sizeof(*(data)->referred_name));
16278 0 : if ((data)->referred_name == NULL) { e = ENOMEM; goto fail; }
16279 0 : p += l; len -= l; ret += l;
16280 0 : referred_name_oldlen = len;
16281 0 : if (referred_name_datalen > len) { e = ASN1_OVERRUN; goto fail; }
16282 0 : len = referred_name_datalen;
16283 0 : e = decode_PrincipalName(p, len, (data)->referred_name, &l);
16284 0 : if(e) goto fail;
16285 0 : p += l; len -= l; ret += l;
16286 0 : len = referred_name_oldlen - referred_name_datalen;
16287 : }
16288 : }
16289 : {
16290 : size_t referred_realm_datalen, referred_realm_oldlen;
16291 : Der_type referred_realm_type;
16292 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &referred_realm_type, 0, &referred_realm_datalen, &l);
16293 0 : if (e == 0 && referred_realm_type != CONS) { e = ASN1_BAD_ID; }
16294 0 : if(e) goto fail;
16295 0 : p += l; len -= l; ret += l;
16296 0 : referred_realm_oldlen = len;
16297 0 : if (referred_realm_datalen > len) { e = ASN1_OVERRUN; goto fail; }
16298 0 : len = referred_realm_datalen;
16299 0 : e = decode_Realm(p, len, &(data)->referred_realm, &l);
16300 0 : if(e) goto fail;
16301 0 : p += l; len -= l; ret += l;
16302 0 : len = referred_realm_oldlen - referred_realm_datalen;
16303 : }
16304 0 : len = Top_oldlen - Top_datalen;
16305 : }
16306 0 : if(size) *size = ret;
16307 0 : return 0;
16308 0 : fail:
16309 0 : free_PA_SvrReferralData(data);
16310 0 : return e;
16311 : }
16312 :
16313 : void ASN1CALL
16314 0 : free_PA_SvrReferralData(PA_SvrReferralData *data)
16315 : {
16316 0 : if((data)->referred_name) {
16317 0 : free_PrincipalName((data)->referred_name);
16318 0 : free((data)->referred_name);
16319 0 : (data)->referred_name = NULL;
16320 : }
16321 0 : free_Realm(&(data)->referred_realm);
16322 0 : }
16323 :
16324 : size_t ASN1CALL
16325 0 : length_PA_SvrReferralData(const PA_SvrReferralData *data)
16326 : {
16327 0 : size_t ret = 0;
16328 0 : if((data)->referred_name){
16329 0 : size_t Top_tag_oldret = ret;
16330 0 : ret = 0;
16331 0 : ret += length_PrincipalName((data)->referred_name);
16332 0 : ret += 1 + der_length_len (ret);
16333 0 : ret += Top_tag_oldret;
16334 : }
16335 : {
16336 0 : size_t Top_tag_oldret = ret;
16337 0 : ret = 0;
16338 0 : ret += length_Realm(&(data)->referred_realm);
16339 0 : ret += 1 + der_length_len (ret);
16340 0 : ret += Top_tag_oldret;
16341 : }
16342 0 : ret += 1 + der_length_len (ret);
16343 0 : return ret;
16344 : }
16345 :
16346 : int ASN1CALL
16347 0 : copy_PA_SvrReferralData(const PA_SvrReferralData *from, PA_SvrReferralData *to)
16348 : {
16349 0 : memset(to, 0, sizeof(*to));
16350 0 : if((from)->referred_name) {
16351 0 : (to)->referred_name = malloc(sizeof(*(to)->referred_name));
16352 0 : if((to)->referred_name == NULL) goto fail;
16353 0 : if(copy_PrincipalName((from)->referred_name, (to)->referred_name)) goto fail;
16354 : }else
16355 0 : (to)->referred_name = NULL;
16356 0 : if(copy_Realm(&(from)->referred_realm, &(to)->referred_realm)) goto fail;
16357 0 : return 0;
16358 0 : fail:
16359 0 : free_PA_SvrReferralData(to);
16360 0 : return ENOMEM;
16361 : }
16362 :
16363 : int ASN1CALL
16364 0 : encode_PA_SERVER_REFERRAL_DATA(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const PA_SERVER_REFERRAL_DATA *data, size_t *size)
16365 : {
16366 0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
16367 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
16368 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
16369 :
16370 0 : e = encode_EncryptedData(p, len, data, &l);
16371 0 : if (e) return e;
16372 0 : p -= l; len -= l; ret += l;
16373 :
16374 0 : *size = ret;
16375 0 : return 0;
16376 : }
16377 :
16378 : int ASN1CALL
16379 0 : decode_PA_SERVER_REFERRAL_DATA(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, PA_SERVER_REFERRAL_DATA *data, size_t *size)
16380 : {
16381 0 : size_t ret = 0;
16382 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
16383 : int e HEIMDAL_UNUSED_ATTRIBUTE;
16384 :
16385 0 : memset(data, 0, sizeof(*data));
16386 0 : e = decode_EncryptedData(p, len, data, &l);
16387 0 : if(e) goto fail;
16388 0 : p += l; len -= l; ret += l;
16389 0 : if(size) *size = ret;
16390 0 : return 0;
16391 0 : fail:
16392 0 : free_PA_SERVER_REFERRAL_DATA(data);
16393 0 : return e;
16394 : }
16395 :
16396 : void ASN1CALL
16397 0 : free_PA_SERVER_REFERRAL_DATA(PA_SERVER_REFERRAL_DATA *data)
16398 : {
16399 0 : free_EncryptedData(data);
16400 0 : }
16401 :
16402 : size_t ASN1CALL
16403 0 : length_PA_SERVER_REFERRAL_DATA(const PA_SERVER_REFERRAL_DATA *data)
16404 : {
16405 0 : size_t ret = 0;
16406 0 : ret += length_EncryptedData(data);
16407 0 : return ret;
16408 : }
16409 :
16410 : int ASN1CALL
16411 0 : copy_PA_SERVER_REFERRAL_DATA(const PA_SERVER_REFERRAL_DATA *from, PA_SERVER_REFERRAL_DATA *to)
16412 : {
16413 0 : memset(to, 0, sizeof(*to));
16414 0 : if(copy_EncryptedData(from, to)) goto fail;
16415 0 : return 0;
16416 0 : fail:
16417 0 : free_PA_SERVER_REFERRAL_DATA(to);
16418 0 : return ENOMEM;
16419 : }
16420 :
16421 : int ASN1CALL
16422 302 : encode_PA_ServerReferralData(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const PA_ServerReferralData *data, size_t *size)
16423 : {
16424 302 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
16425 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
16426 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
16427 :
16428 : /* referral-valid-until */
16429 302 : if((data)->referral_valid_until) {
16430 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
16431 0 : ret = 0;
16432 0 : e = encode_KerberosTime(p, len, (data)->referral_valid_until, &l);
16433 0 : if (e) return e;
16434 0 : p -= l; len -= l; ret += l;
16435 :
16436 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 3, &l);
16437 0 : if (e) return e;
16438 0 : p -= l; len -= l; ret += l;
16439 :
16440 0 : ret += Top_tag_oldret;
16441 : }
16442 : /* requested-principal-name */
16443 302 : if((data)->requested_principal_name) {
16444 302 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
16445 302 : ret = 0;
16446 302 : e = encode_PrincipalName(p, len, (data)->requested_principal_name, &l);
16447 302 : if (e) return e;
16448 302 : p -= l; len -= l; ret += l;
16449 :
16450 302 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
16451 302 : if (e) return e;
16452 302 : p -= l; len -= l; ret += l;
16453 :
16454 302 : ret += Top_tag_oldret;
16455 : }
16456 : /* true-principal-name */
16457 302 : if((data)->true_principal_name) {
16458 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
16459 0 : ret = 0;
16460 0 : e = encode_PrincipalName(p, len, (data)->true_principal_name, &l);
16461 0 : if (e) return e;
16462 0 : p -= l; len -= l; ret += l;
16463 :
16464 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
16465 0 : if (e) return e;
16466 0 : p -= l; len -= l; ret += l;
16467 :
16468 0 : ret += Top_tag_oldret;
16469 : }
16470 : /* referred-realm */
16471 302 : if((data)->referred_realm) {
16472 302 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
16473 302 : ret = 0;
16474 302 : e = encode_Realm(p, len, (data)->referred_realm, &l);
16475 302 : if (e) return e;
16476 302 : p -= l; len -= l; ret += l;
16477 :
16478 302 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
16479 302 : if (e) return e;
16480 302 : p -= l; len -= l; ret += l;
16481 :
16482 302 : ret += Top_tag_oldret;
16483 : }
16484 302 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
16485 302 : if (e) return e;
16486 302 : p -= l; len -= l; ret += l;
16487 :
16488 302 : *size = ret;
16489 302 : return 0;
16490 : }
16491 :
16492 : int ASN1CALL
16493 0 : decode_PA_ServerReferralData(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, PA_ServerReferralData *data, size_t *size)
16494 : {
16495 0 : size_t ret = 0;
16496 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
16497 : int e HEIMDAL_UNUSED_ATTRIBUTE;
16498 :
16499 0 : memset(data, 0, sizeof(*data));
16500 : {
16501 : size_t Top_datalen, Top_oldlen;
16502 : Der_type Top_type;
16503 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
16504 0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
16505 0 : if(e) goto fail;
16506 0 : p += l; len -= l; ret += l;
16507 0 : Top_oldlen = len;
16508 0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
16509 0 : len = Top_datalen;
16510 : {
16511 : size_t referred_realm_datalen, referred_realm_oldlen;
16512 : Der_type referred_realm_type;
16513 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &referred_realm_type, 0, &referred_realm_datalen, &l);
16514 0 : if (e == 0 && referred_realm_type != CONS) { e = ASN1_BAD_ID; }
16515 0 : if(e) {
16516 0 : (data)->referred_realm = NULL;
16517 : } else {
16518 0 : (data)->referred_realm = calloc(1, sizeof(*(data)->referred_realm));
16519 0 : if ((data)->referred_realm == NULL) { e = ENOMEM; goto fail; }
16520 0 : p += l; len -= l; ret += l;
16521 0 : referred_realm_oldlen = len;
16522 0 : if (referred_realm_datalen > len) { e = ASN1_OVERRUN; goto fail; }
16523 0 : len = referred_realm_datalen;
16524 0 : e = decode_Realm(p, len, (data)->referred_realm, &l);
16525 0 : if(e) goto fail;
16526 0 : p += l; len -= l; ret += l;
16527 0 : len = referred_realm_oldlen - referred_realm_datalen;
16528 : }
16529 : }
16530 : {
16531 : size_t true_principal_name_datalen, true_principal_name_oldlen;
16532 : Der_type true_principal_name_type;
16533 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &true_principal_name_type, 1, &true_principal_name_datalen, &l);
16534 0 : if (e == 0 && true_principal_name_type != CONS) { e = ASN1_BAD_ID; }
16535 0 : if(e) {
16536 0 : (data)->true_principal_name = NULL;
16537 : } else {
16538 0 : (data)->true_principal_name = calloc(1, sizeof(*(data)->true_principal_name));
16539 0 : if ((data)->true_principal_name == NULL) { e = ENOMEM; goto fail; }
16540 0 : p += l; len -= l; ret += l;
16541 0 : true_principal_name_oldlen = len;
16542 0 : if (true_principal_name_datalen > len) { e = ASN1_OVERRUN; goto fail; }
16543 0 : len = true_principal_name_datalen;
16544 0 : e = decode_PrincipalName(p, len, (data)->true_principal_name, &l);
16545 0 : if(e) goto fail;
16546 0 : p += l; len -= l; ret += l;
16547 0 : len = true_principal_name_oldlen - true_principal_name_datalen;
16548 : }
16549 : }
16550 : {
16551 : size_t requested_principal_name_datalen, requested_principal_name_oldlen;
16552 : Der_type requested_principal_name_type;
16553 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &requested_principal_name_type, 2, &requested_principal_name_datalen, &l);
16554 0 : if (e == 0 && requested_principal_name_type != CONS) { e = ASN1_BAD_ID; }
16555 0 : if(e) {
16556 0 : (data)->requested_principal_name = NULL;
16557 : } else {
16558 0 : (data)->requested_principal_name = calloc(1, sizeof(*(data)->requested_principal_name));
16559 0 : if ((data)->requested_principal_name == NULL) { e = ENOMEM; goto fail; }
16560 0 : p += l; len -= l; ret += l;
16561 0 : requested_principal_name_oldlen = len;
16562 0 : if (requested_principal_name_datalen > len) { e = ASN1_OVERRUN; goto fail; }
16563 0 : len = requested_principal_name_datalen;
16564 0 : e = decode_PrincipalName(p, len, (data)->requested_principal_name, &l);
16565 0 : if(e) goto fail;
16566 0 : p += l; len -= l; ret += l;
16567 0 : len = requested_principal_name_oldlen - requested_principal_name_datalen;
16568 : }
16569 : }
16570 : {
16571 : size_t referral_valid_until_datalen, referral_valid_until_oldlen;
16572 : Der_type referral_valid_until_type;
16573 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &referral_valid_until_type, 3, &referral_valid_until_datalen, &l);
16574 0 : if (e == 0 && referral_valid_until_type != CONS) { e = ASN1_BAD_ID; }
16575 0 : if(e) {
16576 0 : (data)->referral_valid_until = NULL;
16577 : } else {
16578 0 : (data)->referral_valid_until = calloc(1, sizeof(*(data)->referral_valid_until));
16579 0 : if ((data)->referral_valid_until == NULL) { e = ENOMEM; goto fail; }
16580 0 : p += l; len -= l; ret += l;
16581 0 : referral_valid_until_oldlen = len;
16582 0 : if (referral_valid_until_datalen > len) { e = ASN1_OVERRUN; goto fail; }
16583 0 : len = referral_valid_until_datalen;
16584 0 : e = decode_KerberosTime(p, len, (data)->referral_valid_until, &l);
16585 0 : if(e) goto fail;
16586 0 : p += l; len -= l; ret += l;
16587 0 : len = referral_valid_until_oldlen - referral_valid_until_datalen;
16588 : }
16589 : }
16590 0 : len = Top_oldlen - Top_datalen;
16591 : }
16592 0 : if(size) *size = ret;
16593 0 : return 0;
16594 0 : fail:
16595 0 : free_PA_ServerReferralData(data);
16596 0 : return e;
16597 : }
16598 :
16599 : void ASN1CALL
16600 302 : free_PA_ServerReferralData(PA_ServerReferralData *data)
16601 : {
16602 302 : if((data)->referred_realm) {
16603 302 : free_Realm((data)->referred_realm);
16604 302 : free((data)->referred_realm);
16605 302 : (data)->referred_realm = NULL;
16606 : }
16607 302 : if((data)->true_principal_name) {
16608 0 : free_PrincipalName((data)->true_principal_name);
16609 0 : free((data)->true_principal_name);
16610 0 : (data)->true_principal_name = NULL;
16611 : }
16612 302 : if((data)->requested_principal_name) {
16613 302 : free_PrincipalName((data)->requested_principal_name);
16614 302 : free((data)->requested_principal_name);
16615 302 : (data)->requested_principal_name = NULL;
16616 : }
16617 302 : if((data)->referral_valid_until) {
16618 0 : free_KerberosTime((data)->referral_valid_until);
16619 0 : free((data)->referral_valid_until);
16620 0 : (data)->referral_valid_until = NULL;
16621 : }
16622 302 : }
16623 :
16624 : size_t ASN1CALL
16625 302 : length_PA_ServerReferralData(const PA_ServerReferralData *data)
16626 : {
16627 302 : size_t ret = 0;
16628 302 : if((data)->referred_realm){
16629 302 : size_t Top_tag_oldret = ret;
16630 302 : ret = 0;
16631 302 : ret += length_Realm((data)->referred_realm);
16632 302 : ret += 1 + der_length_len (ret);
16633 302 : ret += Top_tag_oldret;
16634 : }
16635 302 : if((data)->true_principal_name){
16636 0 : size_t Top_tag_oldret = ret;
16637 0 : ret = 0;
16638 0 : ret += length_PrincipalName((data)->true_principal_name);
16639 0 : ret += 1 + der_length_len (ret);
16640 0 : ret += Top_tag_oldret;
16641 : }
16642 302 : if((data)->requested_principal_name){
16643 302 : size_t Top_tag_oldret = ret;
16644 302 : ret = 0;
16645 302 : ret += length_PrincipalName((data)->requested_principal_name);
16646 302 : ret += 1 + der_length_len (ret);
16647 302 : ret += Top_tag_oldret;
16648 : }
16649 302 : if((data)->referral_valid_until){
16650 0 : size_t Top_tag_oldret = ret;
16651 0 : ret = 0;
16652 0 : ret += length_KerberosTime((data)->referral_valid_until);
16653 0 : ret += 1 + der_length_len (ret);
16654 0 : ret += Top_tag_oldret;
16655 : }
16656 302 : ret += 1 + der_length_len (ret);
16657 302 : return ret;
16658 : }
16659 :
16660 : int ASN1CALL
16661 0 : copy_PA_ServerReferralData(const PA_ServerReferralData *from, PA_ServerReferralData *to)
16662 : {
16663 0 : memset(to, 0, sizeof(*to));
16664 0 : if((from)->referred_realm) {
16665 0 : (to)->referred_realm = malloc(sizeof(*(to)->referred_realm));
16666 0 : if((to)->referred_realm == NULL) goto fail;
16667 0 : if(copy_Realm((from)->referred_realm, (to)->referred_realm)) goto fail;
16668 : }else
16669 0 : (to)->referred_realm = NULL;
16670 0 : if((from)->true_principal_name) {
16671 0 : (to)->true_principal_name = malloc(sizeof(*(to)->true_principal_name));
16672 0 : if((to)->true_principal_name == NULL) goto fail;
16673 0 : if(copy_PrincipalName((from)->true_principal_name, (to)->true_principal_name)) goto fail;
16674 : }else
16675 0 : (to)->true_principal_name = NULL;
16676 0 : if((from)->requested_principal_name) {
16677 0 : (to)->requested_principal_name = malloc(sizeof(*(to)->requested_principal_name));
16678 0 : if((to)->requested_principal_name == NULL) goto fail;
16679 0 : if(copy_PrincipalName((from)->requested_principal_name, (to)->requested_principal_name)) goto fail;
16680 : }else
16681 0 : (to)->requested_principal_name = NULL;
16682 0 : if((from)->referral_valid_until) {
16683 0 : (to)->referral_valid_until = malloc(sizeof(*(to)->referral_valid_until));
16684 0 : if((to)->referral_valid_until == NULL) goto fail;
16685 0 : if(copy_KerberosTime((from)->referral_valid_until, (to)->referral_valid_until)) goto fail;
16686 : }else
16687 0 : (to)->referral_valid_until = NULL;
16688 0 : return 0;
16689 0 : fail:
16690 0 : free_PA_ServerReferralData(to);
16691 0 : return ENOMEM;
16692 : }
16693 :
16694 : int ASN1CALL
16695 0 : encode_FastOptions(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const FastOptions *data, size_t *size)
16696 : {
16697 0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
16698 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
16699 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
16700 :
16701 : {
16702 0 : unsigned char c = 0;
16703 0 : if (len < 1) return ASN1_OVERFLOW;
16704 0 : *p-- = c; len--; ret++;
16705 0 : c = 0;
16706 0 : if((data)->kdc_follow__referrals) {
16707 0 : c |= 1<<7;
16708 : }
16709 0 : if (len < 1) return ASN1_OVERFLOW;
16710 0 : *p-- = c; len--; ret++;
16711 0 : c = 0;
16712 0 : if (len < 1) return ASN1_OVERFLOW;
16713 0 : *p-- = c; len--; ret++;
16714 0 : c = 0;
16715 0 : if((data)->hide_client_names) {
16716 0 : c |= 1<<6;
16717 : }
16718 0 : if((data)->reserved) {
16719 0 : c |= 1<<7;
16720 : }
16721 0 : if (len < 1) return ASN1_OVERFLOW;
16722 0 : *p-- = c; len--; ret++;
16723 0 : if (len < 1) return ASN1_OVERFLOW;
16724 0 : *p-- = 0;
16725 0 : len -= 1;
16726 0 : ret += 1;
16727 : }
16728 :
16729 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_BitString, &l);
16730 0 : if (e) return e;
16731 0 : p -= l; len -= l; ret += l;
16732 :
16733 0 : *size = ret;
16734 0 : return 0;
16735 : }
16736 :
16737 : int ASN1CALL
16738 0 : decode_FastOptions(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, FastOptions *data, size_t *size)
16739 : {
16740 0 : size_t ret = 0;
16741 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
16742 : int e HEIMDAL_UNUSED_ATTRIBUTE;
16743 :
16744 0 : memset(data, 0, sizeof(*data));
16745 : {
16746 : size_t Top_datalen, Top_oldlen;
16747 : Der_type Top_type;
16748 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_BitString, &Top_datalen, &l);
16749 0 : if (e == 0 && Top_type != PRIM) { e = ASN1_BAD_ID; }
16750 0 : if(e) goto fail;
16751 0 : p += l; len -= l; ret += l;
16752 0 : Top_oldlen = len;
16753 0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
16754 0 : len = Top_datalen;
16755 0 : if (len < 1) return ASN1_OVERRUN;
16756 0 : p++; len--; ret++;
16757 : do {
16758 0 : if (len < 1) break;
16759 0 : (data)->reserved = (*p >> 7) & 1;
16760 0 : (data)->hide_client_names = (*p >> 6) & 1;
16761 0 : p++; len--; ret++;
16762 0 : if (len < 1) break;
16763 0 : p++; len--; ret++;
16764 0 : if (len < 1) break;
16765 0 : (data)->kdc_follow__referrals = (*p >> 7) & 1;
16766 : } while(0);
16767 0 : p += len; ret += len;
16768 0 : len = Top_oldlen - Top_datalen;
16769 : }
16770 0 : if(size) *size = ret;
16771 0 : return 0;
16772 0 : fail:
16773 0 : free_FastOptions(data);
16774 0 : return e;
16775 : }
16776 :
16777 : void ASN1CALL
16778 0 : free_FastOptions(FastOptions *data)
16779 : {
16780 0 : }
16781 :
16782 : size_t ASN1CALL
16783 0 : length_FastOptions(const FastOptions *data)
16784 : {
16785 0 : size_t ret = 0;
16786 0 : ret += 5;
16787 0 : ret += 1 + der_length_len (ret);
16788 0 : return ret;
16789 : }
16790 :
16791 : int ASN1CALL
16792 0 : copy_FastOptions(const FastOptions *from, FastOptions *to)
16793 : {
16794 0 : memset(to, 0, sizeof(*to));
16795 0 : *(to) = *(from);
16796 0 : return 0;
16797 : }
16798 :
16799 0 : unsigned FastOptions2int(FastOptions f)
16800 : {
16801 0 : unsigned r = 0;
16802 0 : if(f.reserved) r |= (1U << 0);
16803 0 : if(f.hide_client_names) r |= (1U << 1);
16804 0 : if(f.kdc_follow__referrals) r |= (1U << 16);
16805 0 : return r;
16806 : }
16807 :
16808 0 : FastOptions int2FastOptions(unsigned n)
16809 : {
16810 : FastOptions flags;
16811 :
16812 0 : memset(&flags, 0, sizeof(flags));
16813 :
16814 0 : flags.reserved = (n >> 0) & 1;
16815 0 : flags.hide_client_names = (n >> 1) & 1;
16816 0 : flags.kdc_follow__referrals = (n >> 16) & 1;
16817 0 : return flags;
16818 : }
16819 :
16820 : static struct units FastOptions_units[] = {
16821 : {"kdc-follow--referrals", 1U << 16},
16822 : {"hide-client-names", 1U << 1},
16823 : {"reserved", 1U << 0},
16824 : {NULL, 0}
16825 : };
16826 :
16827 0 : const struct units * asn1_FastOptions_units(void){
16828 0 : return FastOptions_units;
16829 : }
16830 :
16831 : int ASN1CALL
16832 0 : encode_KrbFastReq(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const KrbFastReq *data, size_t *size)
16833 : {
16834 0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
16835 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
16836 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
16837 :
16838 : /* req-body */
16839 : {
16840 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
16841 0 : ret = 0;
16842 0 : e = encode_KDC_REQ_BODY(p, len, &(data)->req_body, &l);
16843 0 : if (e) return e;
16844 0 : p -= l; len -= l; ret += l;
16845 :
16846 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
16847 0 : if (e) return e;
16848 0 : p -= l; len -= l; ret += l;
16849 :
16850 0 : ret += Top_tag_oldret;
16851 : }
16852 : /* padata */
16853 : {
16854 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
16855 0 : ret = 0;
16856 0 : for(i = (int)(&(data)->padata)->len - 1; i >= 0; --i) {
16857 0 : size_t padata_tag_tag_for_oldret = ret;
16858 0 : ret = 0;
16859 0 : e = encode_PA_DATA(p, len, &(&(data)->padata)->val[i], &l);
16860 0 : if (e) return e;
16861 0 : p -= l; len -= l; ret += l;
16862 :
16863 0 : ret += padata_tag_tag_for_oldret;
16864 : }
16865 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
16866 0 : if (e) return e;
16867 0 : p -= l; len -= l; ret += l;
16868 :
16869 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
16870 0 : if (e) return e;
16871 0 : p -= l; len -= l; ret += l;
16872 :
16873 0 : ret += Top_tag_oldret;
16874 : }
16875 : /* fast-options */
16876 : {
16877 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
16878 0 : ret = 0;
16879 0 : e = encode_FastOptions(p, len, &(data)->fast_options, &l);
16880 0 : if (e) return e;
16881 0 : p -= l; len -= l; ret += l;
16882 :
16883 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
16884 0 : if (e) return e;
16885 0 : p -= l; len -= l; ret += l;
16886 :
16887 0 : ret += Top_tag_oldret;
16888 : }
16889 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
16890 0 : if (e) return e;
16891 0 : p -= l; len -= l; ret += l;
16892 :
16893 0 : *size = ret;
16894 0 : return 0;
16895 : }
16896 :
16897 : int ASN1CALL
16898 0 : decode_KrbFastReq(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, KrbFastReq *data, size_t *size)
16899 : {
16900 0 : size_t ret = 0;
16901 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
16902 : int e HEIMDAL_UNUSED_ATTRIBUTE;
16903 :
16904 0 : memset(data, 0, sizeof(*data));
16905 : {
16906 : size_t Top_datalen, Top_oldlen;
16907 : Der_type Top_type;
16908 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
16909 0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
16910 0 : if(e) goto fail;
16911 0 : p += l; len -= l; ret += l;
16912 0 : Top_oldlen = len;
16913 0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
16914 0 : len = Top_datalen;
16915 : {
16916 : size_t fast_options_datalen, fast_options_oldlen;
16917 : Der_type fast_options_type;
16918 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &fast_options_type, 0, &fast_options_datalen, &l);
16919 0 : if (e == 0 && fast_options_type != CONS) { e = ASN1_BAD_ID; }
16920 0 : if(e) goto fail;
16921 0 : p += l; len -= l; ret += l;
16922 0 : fast_options_oldlen = len;
16923 0 : if (fast_options_datalen > len) { e = ASN1_OVERRUN; goto fail; }
16924 0 : len = fast_options_datalen;
16925 0 : e = decode_FastOptions(p, len, &(data)->fast_options, &l);
16926 0 : if(e) goto fail;
16927 0 : p += l; len -= l; ret += l;
16928 0 : len = fast_options_oldlen - fast_options_datalen;
16929 : }
16930 : {
16931 : size_t padata_datalen, padata_oldlen;
16932 : Der_type padata_type;
16933 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &padata_type, 1, &padata_datalen, &l);
16934 0 : if (e == 0 && padata_type != CONS) { e = ASN1_BAD_ID; }
16935 0 : if(e) goto fail;
16936 0 : p += l; len -= l; ret += l;
16937 0 : padata_oldlen = len;
16938 0 : if (padata_datalen > len) { e = ASN1_OVERRUN; goto fail; }
16939 0 : len = padata_datalen;
16940 : {
16941 : size_t padata_Tag_datalen, padata_Tag_oldlen;
16942 : Der_type padata_Tag_type;
16943 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &padata_Tag_type, UT_Sequence, &padata_Tag_datalen, &l);
16944 0 : if (e == 0 && padata_Tag_type != CONS) { e = ASN1_BAD_ID; }
16945 0 : if(e) goto fail;
16946 0 : p += l; len -= l; ret += l;
16947 0 : padata_Tag_oldlen = len;
16948 0 : if (padata_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
16949 0 : len = padata_Tag_datalen;
16950 : {
16951 0 : size_t padata_Tag_Tag_origlen = len;
16952 0 : size_t padata_Tag_Tag_oldret = ret;
16953 0 : size_t padata_Tag_Tag_olen = 0;
16954 : void *padata_Tag_Tag_tmp;
16955 0 : ret = 0;
16956 0 : (&(data)->padata)->len = 0;
16957 0 : (&(data)->padata)->val = NULL;
16958 0 : while(ret < padata_Tag_Tag_origlen) {
16959 0 : size_t padata_Tag_Tag_nlen = padata_Tag_Tag_olen + sizeof(*((&(data)->padata)->val));
16960 0 : if (padata_Tag_Tag_olen > padata_Tag_Tag_nlen) { e = ASN1_OVERFLOW; goto fail; }
16961 0 : padata_Tag_Tag_olen = padata_Tag_Tag_nlen;
16962 0 : padata_Tag_Tag_tmp = realloc((&(data)->padata)->val, padata_Tag_Tag_olen);
16963 0 : if (padata_Tag_Tag_tmp == NULL) { e = ENOMEM; goto fail; }
16964 0 : (&(data)->padata)->val = padata_Tag_Tag_tmp;
16965 0 : e = decode_PA_DATA(p, len, &(&(data)->padata)->val[(&(data)->padata)->len], &l);
16966 0 : if(e) goto fail;
16967 0 : p += l; len -= l; ret += l;
16968 0 : (&(data)->padata)->len++;
16969 0 : len = padata_Tag_Tag_origlen - ret;
16970 : }
16971 0 : ret += padata_Tag_Tag_oldret;
16972 : }
16973 0 : len = padata_Tag_oldlen - padata_Tag_datalen;
16974 : }
16975 0 : len = padata_oldlen - padata_datalen;
16976 : }
16977 : {
16978 : size_t req_body_datalen, req_body_oldlen;
16979 : Der_type req_body_type;
16980 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &req_body_type, 2, &req_body_datalen, &l);
16981 0 : if (e == 0 && req_body_type != CONS) { e = ASN1_BAD_ID; }
16982 0 : if(e) goto fail;
16983 0 : p += l; len -= l; ret += l;
16984 0 : req_body_oldlen = len;
16985 0 : if (req_body_datalen > len) { e = ASN1_OVERRUN; goto fail; }
16986 0 : len = req_body_datalen;
16987 0 : e = decode_KDC_REQ_BODY(p, len, &(data)->req_body, &l);
16988 0 : if(e) goto fail;
16989 0 : p += l; len -= l; ret += l;
16990 0 : len = req_body_oldlen - req_body_datalen;
16991 : }
16992 0 : len = Top_oldlen - Top_datalen;
16993 : }
16994 0 : if(size) *size = ret;
16995 0 : return 0;
16996 0 : fail:
16997 0 : free_KrbFastReq(data);
16998 0 : return e;
16999 : }
17000 :
17001 : void ASN1CALL
17002 0 : free_KrbFastReq(KrbFastReq *data)
17003 : {
17004 0 : free_FastOptions(&(data)->fast_options);
17005 0 : while((&(data)->padata)->len){
17006 0 : free_PA_DATA(&(&(data)->padata)->val[(&(data)->padata)->len-1]);
17007 0 : (&(data)->padata)->len--;
17008 : }
17009 0 : free((&(data)->padata)->val);
17010 0 : (&(data)->padata)->val = NULL;
17011 0 : free_KDC_REQ_BODY(&(data)->req_body);
17012 0 : }
17013 :
17014 : size_t ASN1CALL
17015 0 : length_KrbFastReq(const KrbFastReq *data)
17016 : {
17017 0 : size_t ret = 0;
17018 : {
17019 0 : size_t Top_tag_oldret = ret;
17020 0 : ret = 0;
17021 0 : ret += length_FastOptions(&(data)->fast_options);
17022 0 : ret += 1 + der_length_len (ret);
17023 0 : ret += Top_tag_oldret;
17024 : }
17025 : {
17026 0 : size_t Top_tag_oldret = ret;
17027 0 : ret = 0;
17028 : {
17029 0 : size_t padata_tag_tag_oldret = ret;
17030 : int i;
17031 0 : ret = 0;
17032 0 : for(i = (&(data)->padata)->len - 1; i >= 0; --i){
17033 0 : size_t padata_tag_tag_for_oldret = ret;
17034 0 : ret = 0;
17035 0 : ret += length_PA_DATA(&(&(data)->padata)->val[i]);
17036 0 : ret += padata_tag_tag_for_oldret;
17037 : }
17038 0 : ret += padata_tag_tag_oldret;
17039 : }
17040 0 : ret += 1 + der_length_len (ret);
17041 0 : ret += 1 + der_length_len (ret);
17042 0 : ret += Top_tag_oldret;
17043 : }
17044 : {
17045 0 : size_t Top_tag_oldret = ret;
17046 0 : ret = 0;
17047 0 : ret += length_KDC_REQ_BODY(&(data)->req_body);
17048 0 : ret += 1 + der_length_len (ret);
17049 0 : ret += Top_tag_oldret;
17050 : }
17051 0 : ret += 1 + der_length_len (ret);
17052 0 : return ret;
17053 : }
17054 :
17055 : int ASN1CALL
17056 0 : copy_KrbFastReq(const KrbFastReq *from, KrbFastReq *to)
17057 : {
17058 0 : memset(to, 0, sizeof(*to));
17059 0 : if(copy_FastOptions(&(from)->fast_options, &(to)->fast_options)) goto fail;
17060 0 : if(((&(to)->padata)->val = malloc((&(from)->padata)->len * sizeof(*(&(to)->padata)->val))) == NULL && (&(from)->padata)->len != 0)
17061 0 : goto fail;
17062 0 : for((&(to)->padata)->len = 0; (&(to)->padata)->len < (&(from)->padata)->len; (&(to)->padata)->len++){
17063 0 : if(copy_PA_DATA(&(&(from)->padata)->val[(&(to)->padata)->len], &(&(to)->padata)->val[(&(to)->padata)->len])) goto fail;
17064 : }
17065 0 : if(copy_KDC_REQ_BODY(&(from)->req_body, &(to)->req_body)) goto fail;
17066 0 : return 0;
17067 0 : fail:
17068 0 : free_KrbFastReq(to);
17069 0 : return ENOMEM;
17070 : }
17071 :
17072 : int ASN1CALL
17073 0 : encode_KrbFastArmor(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const KrbFastArmor *data, size_t *size)
17074 : {
17075 0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
17076 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
17077 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
17078 :
17079 : /* armor-value */
17080 : {
17081 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
17082 0 : ret = 0;
17083 0 : e = der_put_octet_string(p, len, &(data)->armor_value, &l);
17084 0 : if (e) return e;
17085 0 : p -= l; len -= l; ret += l;
17086 :
17087 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, PRIM, UT_OctetString, &l);
17088 0 : if (e) return e;
17089 0 : p -= l; len -= l; ret += l;
17090 :
17091 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
17092 0 : if (e) return e;
17093 0 : p -= l; len -= l; ret += l;
17094 :
17095 0 : ret += Top_tag_oldret;
17096 : }
17097 : /* armor-type */
17098 : {
17099 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
17100 0 : ret = 0;
17101 0 : e = encode_krb5int32(p, len, &(data)->armor_type, &l);
17102 0 : if (e) return e;
17103 0 : p -= l; len -= l; ret += l;
17104 :
17105 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
17106 0 : if (e) return e;
17107 0 : p -= l; len -= l; ret += l;
17108 :
17109 0 : ret += Top_tag_oldret;
17110 : }
17111 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
17112 0 : if (e) return e;
17113 0 : p -= l; len -= l; ret += l;
17114 :
17115 0 : *size = ret;
17116 0 : return 0;
17117 : }
17118 :
17119 : int ASN1CALL
17120 0 : decode_KrbFastArmor(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, KrbFastArmor *data, size_t *size)
17121 : {
17122 0 : size_t ret = 0;
17123 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
17124 : int e HEIMDAL_UNUSED_ATTRIBUTE;
17125 :
17126 0 : memset(data, 0, sizeof(*data));
17127 : {
17128 : size_t Top_datalen, Top_oldlen;
17129 : Der_type Top_type;
17130 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
17131 0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
17132 0 : if(e) goto fail;
17133 0 : p += l; len -= l; ret += l;
17134 0 : Top_oldlen = len;
17135 0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
17136 0 : len = Top_datalen;
17137 : {
17138 : size_t armor_type_datalen, armor_type_oldlen;
17139 : Der_type armor_type_type;
17140 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &armor_type_type, 0, &armor_type_datalen, &l);
17141 0 : if (e == 0 && armor_type_type != CONS) { e = ASN1_BAD_ID; }
17142 0 : if(e) goto fail;
17143 0 : p += l; len -= l; ret += l;
17144 0 : armor_type_oldlen = len;
17145 0 : if (armor_type_datalen > len) { e = ASN1_OVERRUN; goto fail; }
17146 0 : len = armor_type_datalen;
17147 0 : e = decode_krb5int32(p, len, &(data)->armor_type, &l);
17148 0 : if(e) goto fail;
17149 0 : p += l; len -= l; ret += l;
17150 0 : len = armor_type_oldlen - armor_type_datalen;
17151 : }
17152 : {
17153 : size_t armor_value_datalen, armor_value_oldlen;
17154 : Der_type armor_value_type;
17155 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &armor_value_type, 1, &armor_value_datalen, &l);
17156 0 : if (e == 0 && armor_value_type != CONS) { e = ASN1_BAD_ID; }
17157 0 : if(e) goto fail;
17158 0 : p += l; len -= l; ret += l;
17159 0 : armor_value_oldlen = len;
17160 0 : if (armor_value_datalen > len) { e = ASN1_OVERRUN; goto fail; }
17161 0 : len = armor_value_datalen;
17162 : {
17163 : size_t armor_value_Tag_datalen, armor_value_Tag_oldlen;
17164 : Der_type armor_value_Tag_type;
17165 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &armor_value_Tag_type, UT_OctetString, &armor_value_Tag_datalen, &l);
17166 0 : if (e == 0 && armor_value_Tag_type != PRIM) { e = ASN1_BAD_ID; }
17167 0 : if(e) goto fail;
17168 0 : p += l; len -= l; ret += l;
17169 0 : armor_value_Tag_oldlen = len;
17170 0 : if (armor_value_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
17171 0 : len = armor_value_Tag_datalen;
17172 0 : e = der_get_octet_string(p, len, &(data)->armor_value, &l);
17173 0 : if(e) goto fail;
17174 0 : p += l; len -= l; ret += l;
17175 0 : len = armor_value_Tag_oldlen - armor_value_Tag_datalen;
17176 : }
17177 0 : len = armor_value_oldlen - armor_value_datalen;
17178 : }
17179 0 : len = Top_oldlen - Top_datalen;
17180 : }
17181 0 : if(size) *size = ret;
17182 0 : return 0;
17183 0 : fail:
17184 0 : free_KrbFastArmor(data);
17185 0 : return e;
17186 : }
17187 :
17188 : void ASN1CALL
17189 0 : free_KrbFastArmor(KrbFastArmor *data)
17190 : {
17191 0 : free_krb5int32(&(data)->armor_type);
17192 0 : der_free_octet_string(&(data)->armor_value);
17193 0 : }
17194 :
17195 : size_t ASN1CALL
17196 0 : length_KrbFastArmor(const KrbFastArmor *data)
17197 : {
17198 0 : size_t ret = 0;
17199 : {
17200 0 : size_t Top_tag_oldret = ret;
17201 0 : ret = 0;
17202 0 : ret += length_krb5int32(&(data)->armor_type);
17203 0 : ret += 1 + der_length_len (ret);
17204 0 : ret += Top_tag_oldret;
17205 : }
17206 : {
17207 0 : size_t Top_tag_oldret = ret;
17208 0 : ret = 0;
17209 0 : ret += der_length_octet_string(&(data)->armor_value);
17210 0 : ret += 1 + der_length_len (ret);
17211 0 : ret += 1 + der_length_len (ret);
17212 0 : ret += Top_tag_oldret;
17213 : }
17214 0 : ret += 1 + der_length_len (ret);
17215 0 : return ret;
17216 : }
17217 :
17218 : int ASN1CALL
17219 0 : copy_KrbFastArmor(const KrbFastArmor *from, KrbFastArmor *to)
17220 : {
17221 0 : memset(to, 0, sizeof(*to));
17222 0 : if(copy_krb5int32(&(from)->armor_type, &(to)->armor_type)) goto fail;
17223 0 : if(der_copy_octet_string(&(from)->armor_value, &(to)->armor_value)) goto fail;
17224 0 : return 0;
17225 0 : fail:
17226 0 : free_KrbFastArmor(to);
17227 0 : return ENOMEM;
17228 : }
17229 :
17230 : int ASN1CALL
17231 0 : encode_KrbFastArmoredReq(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const KrbFastArmoredReq *data, size_t *size)
17232 : {
17233 0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
17234 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
17235 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
17236 :
17237 : /* enc-fast-req */
17238 : {
17239 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
17240 0 : ret = 0;
17241 0 : e = encode_EncryptedData(p, len, &(data)->enc_fast_req, &l);
17242 0 : if (e) return e;
17243 0 : p -= l; len -= l; ret += l;
17244 :
17245 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
17246 0 : if (e) return e;
17247 0 : p -= l; len -= l; ret += l;
17248 :
17249 0 : ret += Top_tag_oldret;
17250 : }
17251 : /* req-checksum */
17252 : {
17253 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
17254 0 : ret = 0;
17255 0 : e = encode_Checksum(p, len, &(data)->req_checksum, &l);
17256 0 : if (e) return e;
17257 0 : p -= l; len -= l; ret += l;
17258 :
17259 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
17260 0 : if (e) return e;
17261 0 : p -= l; len -= l; ret += l;
17262 :
17263 0 : ret += Top_tag_oldret;
17264 : }
17265 : /* armor */
17266 0 : if((data)->armor) {
17267 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
17268 0 : ret = 0;
17269 0 : e = encode_KrbFastArmor(p, len, (data)->armor, &l);
17270 0 : if (e) return e;
17271 0 : p -= l; len -= l; ret += l;
17272 :
17273 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
17274 0 : if (e) return e;
17275 0 : p -= l; len -= l; ret += l;
17276 :
17277 0 : ret += Top_tag_oldret;
17278 : }
17279 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
17280 0 : if (e) return e;
17281 0 : p -= l; len -= l; ret += l;
17282 :
17283 0 : *size = ret;
17284 0 : return 0;
17285 : }
17286 :
17287 : int ASN1CALL
17288 0 : decode_KrbFastArmoredReq(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, KrbFastArmoredReq *data, size_t *size)
17289 : {
17290 0 : size_t ret = 0;
17291 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
17292 : int e HEIMDAL_UNUSED_ATTRIBUTE;
17293 :
17294 0 : memset(data, 0, sizeof(*data));
17295 : {
17296 : size_t Top_datalen, Top_oldlen;
17297 : Der_type Top_type;
17298 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
17299 0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
17300 0 : if(e) goto fail;
17301 0 : p += l; len -= l; ret += l;
17302 0 : Top_oldlen = len;
17303 0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
17304 0 : len = Top_datalen;
17305 : {
17306 : size_t armor_datalen, armor_oldlen;
17307 : Der_type armor_type;
17308 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &armor_type, 0, &armor_datalen, &l);
17309 0 : if (e == 0 && armor_type != CONS) { e = ASN1_BAD_ID; }
17310 0 : if(e) {
17311 0 : (data)->armor = NULL;
17312 : } else {
17313 0 : (data)->armor = calloc(1, sizeof(*(data)->armor));
17314 0 : if ((data)->armor == NULL) { e = ENOMEM; goto fail; }
17315 0 : p += l; len -= l; ret += l;
17316 0 : armor_oldlen = len;
17317 0 : if (armor_datalen > len) { e = ASN1_OVERRUN; goto fail; }
17318 0 : len = armor_datalen;
17319 0 : e = decode_KrbFastArmor(p, len, (data)->armor, &l);
17320 0 : if(e) goto fail;
17321 0 : p += l; len -= l; ret += l;
17322 0 : len = armor_oldlen - armor_datalen;
17323 : }
17324 : }
17325 : {
17326 : size_t req_checksum_datalen, req_checksum_oldlen;
17327 : Der_type req_checksum_type;
17328 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &req_checksum_type, 1, &req_checksum_datalen, &l);
17329 0 : if (e == 0 && req_checksum_type != CONS) { e = ASN1_BAD_ID; }
17330 0 : if(e) goto fail;
17331 0 : p += l; len -= l; ret += l;
17332 0 : req_checksum_oldlen = len;
17333 0 : if (req_checksum_datalen > len) { e = ASN1_OVERRUN; goto fail; }
17334 0 : len = req_checksum_datalen;
17335 0 : e = decode_Checksum(p, len, &(data)->req_checksum, &l);
17336 0 : if(e) goto fail;
17337 0 : p += l; len -= l; ret += l;
17338 0 : len = req_checksum_oldlen - req_checksum_datalen;
17339 : }
17340 : {
17341 : size_t enc_fast_req_datalen, enc_fast_req_oldlen;
17342 : Der_type enc_fast_req_type;
17343 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &enc_fast_req_type, 2, &enc_fast_req_datalen, &l);
17344 0 : if (e == 0 && enc_fast_req_type != CONS) { e = ASN1_BAD_ID; }
17345 0 : if(e) goto fail;
17346 0 : p += l; len -= l; ret += l;
17347 0 : enc_fast_req_oldlen = len;
17348 0 : if (enc_fast_req_datalen > len) { e = ASN1_OVERRUN; goto fail; }
17349 0 : len = enc_fast_req_datalen;
17350 0 : e = decode_EncryptedData(p, len, &(data)->enc_fast_req, &l);
17351 0 : if(e) goto fail;
17352 0 : p += l; len -= l; ret += l;
17353 0 : len = enc_fast_req_oldlen - enc_fast_req_datalen;
17354 : }
17355 0 : len = Top_oldlen - Top_datalen;
17356 : }
17357 0 : if(size) *size = ret;
17358 0 : return 0;
17359 0 : fail:
17360 0 : free_KrbFastArmoredReq(data);
17361 0 : return e;
17362 : }
17363 :
17364 : void ASN1CALL
17365 0 : free_KrbFastArmoredReq(KrbFastArmoredReq *data)
17366 : {
17367 0 : if((data)->armor) {
17368 0 : free_KrbFastArmor((data)->armor);
17369 0 : free((data)->armor);
17370 0 : (data)->armor = NULL;
17371 : }
17372 0 : free_Checksum(&(data)->req_checksum);
17373 0 : free_EncryptedData(&(data)->enc_fast_req);
17374 0 : }
17375 :
17376 : size_t ASN1CALL
17377 0 : length_KrbFastArmoredReq(const KrbFastArmoredReq *data)
17378 : {
17379 0 : size_t ret = 0;
17380 0 : if((data)->armor){
17381 0 : size_t Top_tag_oldret = ret;
17382 0 : ret = 0;
17383 0 : ret += length_KrbFastArmor((data)->armor);
17384 0 : ret += 1 + der_length_len (ret);
17385 0 : ret += Top_tag_oldret;
17386 : }
17387 : {
17388 0 : size_t Top_tag_oldret = ret;
17389 0 : ret = 0;
17390 0 : ret += length_Checksum(&(data)->req_checksum);
17391 0 : ret += 1 + der_length_len (ret);
17392 0 : ret += Top_tag_oldret;
17393 : }
17394 : {
17395 0 : size_t Top_tag_oldret = ret;
17396 0 : ret = 0;
17397 0 : ret += length_EncryptedData(&(data)->enc_fast_req);
17398 0 : ret += 1 + der_length_len (ret);
17399 0 : ret += Top_tag_oldret;
17400 : }
17401 0 : ret += 1 + der_length_len (ret);
17402 0 : return ret;
17403 : }
17404 :
17405 : int ASN1CALL
17406 0 : copy_KrbFastArmoredReq(const KrbFastArmoredReq *from, KrbFastArmoredReq *to)
17407 : {
17408 0 : memset(to, 0, sizeof(*to));
17409 0 : if((from)->armor) {
17410 0 : (to)->armor = malloc(sizeof(*(to)->armor));
17411 0 : if((to)->armor == NULL) goto fail;
17412 0 : if(copy_KrbFastArmor((from)->armor, (to)->armor)) goto fail;
17413 : }else
17414 0 : (to)->armor = NULL;
17415 0 : if(copy_Checksum(&(from)->req_checksum, &(to)->req_checksum)) goto fail;
17416 0 : if(copy_EncryptedData(&(from)->enc_fast_req, &(to)->enc_fast_req)) goto fail;
17417 0 : return 0;
17418 0 : fail:
17419 0 : free_KrbFastArmoredReq(to);
17420 0 : return ENOMEM;
17421 : }
17422 :
17423 : int ASN1CALL
17424 0 : encode_PA_FX_FAST_REQUEST(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const PA_FX_FAST_REQUEST *data, size_t *size)
17425 : {
17426 0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
17427 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
17428 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
17429 :
17430 :
17431 0 : switch((data)->element) {
17432 0 : case choice_PA_FX_FAST_REQUEST_armored_data: {size_t Top_oldret = ret;
17433 0 : ret = 0;
17434 0 : e = encode_KrbFastArmoredReq(p, len, &((data))->u.armored_data, &l);
17435 0 : if (e) return e;
17436 0 : p -= l; len -= l; ret += l;
17437 :
17438 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
17439 0 : if (e) return e;
17440 0 : p -= l; len -= l; ret += l;
17441 :
17442 0 : ret += Top_oldret;
17443 0 : break;
17444 : }
17445 0 : case choice_PA_FX_FAST_REQUEST_asn1_ellipsis: {
17446 0 : if (len < (data)->u.asn1_ellipsis.length)
17447 0 : return ASN1_OVERFLOW;
17448 0 : p -= (data)->u.asn1_ellipsis.length;
17449 0 : ret += (data)->u.asn1_ellipsis.length;
17450 0 : memcpy(p + 1, (data)->u.asn1_ellipsis.data, (data)->u.asn1_ellipsis.length);
17451 0 : break;
17452 : }
17453 : };
17454 0 : *size = ret;
17455 0 : return 0;
17456 : }
17457 :
17458 : int ASN1CALL
17459 0 : decode_PA_FX_FAST_REQUEST(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, PA_FX_FAST_REQUEST *data, size_t *size)
17460 : {
17461 0 : size_t ret = 0;
17462 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
17463 : int e HEIMDAL_UNUSED_ATTRIBUTE;
17464 :
17465 0 : memset(data, 0, sizeof(*data));
17466 0 : if (der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 0, NULL) == 0) {
17467 : {
17468 : size_t armored_data_datalen, armored_data_oldlen;
17469 : Der_type armored_data_type;
17470 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &armored_data_type, 0, &armored_data_datalen, &l);
17471 0 : if (e == 0 && armored_data_type != CONS) { e = ASN1_BAD_ID; }
17472 0 : if(e) goto fail;
17473 0 : p += l; len -= l; ret += l;
17474 0 : armored_data_oldlen = len;
17475 0 : if (armored_data_datalen > len) { e = ASN1_OVERRUN; goto fail; }
17476 0 : len = armored_data_datalen;
17477 0 : e = decode_KrbFastArmoredReq(p, len, &(data)->u.armored_data, &l);
17478 0 : if(e) goto fail;
17479 0 : p += l; len -= l; ret += l;
17480 0 : len = armored_data_oldlen - armored_data_datalen;
17481 : }
17482 0 : (data)->element = choice_PA_FX_FAST_REQUEST_armored_data;
17483 : }
17484 : else {
17485 0 : (data)->u.asn1_ellipsis.data = calloc(1, len);
17486 0 : if ((data)->u.asn1_ellipsis.data == NULL) {
17487 0 : e = ENOMEM; goto fail;
17488 : }
17489 0 : (data)->u.asn1_ellipsis.length = len;
17490 0 : memcpy((data)->u.asn1_ellipsis.data, p, len);
17491 0 : (data)->element = choice_PA_FX_FAST_REQUEST_asn1_ellipsis;
17492 0 : p += len;
17493 0 : ret += len;
17494 0 : len = 0;
17495 : }
17496 0 : if(size) *size = ret;
17497 0 : return 0;
17498 0 : fail:
17499 0 : free_PA_FX_FAST_REQUEST(data);
17500 0 : return e;
17501 : }
17502 :
17503 : void ASN1CALL
17504 0 : free_PA_FX_FAST_REQUEST(PA_FX_FAST_REQUEST *data)
17505 : {
17506 0 : switch((data)->element) {
17507 0 : case choice_PA_FX_FAST_REQUEST_armored_data:
17508 0 : free_KrbFastArmoredReq(&(data)->u.armored_data);
17509 0 : break;
17510 0 : case choice_PA_FX_FAST_REQUEST_asn1_ellipsis:
17511 0 : der_free_octet_string(&(data)->u.asn1_ellipsis);
17512 0 : break;}
17513 0 : }
17514 :
17515 : size_t ASN1CALL
17516 0 : length_PA_FX_FAST_REQUEST(const PA_FX_FAST_REQUEST *data)
17517 : {
17518 0 : size_t ret = 0;
17519 0 : switch((data)->element) {
17520 0 : case choice_PA_FX_FAST_REQUEST_armored_data:
17521 : {
17522 0 : size_t Top_oldret = ret;
17523 0 : ret = 0;
17524 0 : ret += length_KrbFastArmoredReq(&(data)->u.armored_data);
17525 0 : ret += 1 + der_length_len (ret);
17526 0 : ret += Top_oldret;
17527 : }
17528 0 : break;
17529 0 : case choice_PA_FX_FAST_REQUEST_asn1_ellipsis:
17530 0 : ret += (data)->u.asn1_ellipsis.length;
17531 0 : break;
17532 : }
17533 0 : return ret;
17534 : }
17535 :
17536 : int ASN1CALL
17537 0 : copy_PA_FX_FAST_REQUEST(const PA_FX_FAST_REQUEST *from, PA_FX_FAST_REQUEST *to)
17538 : {
17539 0 : memset(to, 0, sizeof(*to));
17540 0 : (to)->element = (from)->element;
17541 0 : switch((from)->element) {
17542 0 : case choice_PA_FX_FAST_REQUEST_armored_data:
17543 0 : if(copy_KrbFastArmoredReq(&(from)->u.armored_data, &(to)->u.armored_data)) goto fail;
17544 0 : break;
17545 0 : case choice_PA_FX_FAST_REQUEST_asn1_ellipsis: {
17546 : int ret;
17547 0 : ret=der_copy_octet_string(&(from)->u.asn1_ellipsis, &(to)->u.asn1_ellipsis);
17548 0 : if (ret) goto fail;
17549 0 : break;
17550 : }
17551 : }
17552 0 : return 0;
17553 0 : fail:
17554 0 : free_PA_FX_FAST_REQUEST(to);
17555 0 : return ENOMEM;
17556 : }
17557 :
17558 : int ASN1CALL
17559 0 : encode_KrbFastFinished(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const KrbFastFinished *data, size_t *size)
17560 : {
17561 0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
17562 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
17563 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
17564 :
17565 : /* ticket-checksum */
17566 : {
17567 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
17568 0 : ret = 0;
17569 0 : e = encode_Checksum(p, len, &(data)->ticket_checksum, &l);
17570 0 : if (e) return e;
17571 0 : p -= l; len -= l; ret += l;
17572 :
17573 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 5, &l);
17574 0 : if (e) return e;
17575 0 : p -= l; len -= l; ret += l;
17576 :
17577 0 : ret += Top_tag_oldret;
17578 : }
17579 : /* checksum */
17580 : {
17581 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
17582 0 : ret = 0;
17583 0 : e = encode_Checksum(p, len, &(data)->checksum, &l);
17584 0 : if (e) return e;
17585 0 : p -= l; len -= l; ret += l;
17586 :
17587 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 4, &l);
17588 0 : if (e) return e;
17589 0 : p -= l; len -= l; ret += l;
17590 :
17591 0 : ret += Top_tag_oldret;
17592 : }
17593 : /* cname */
17594 : {
17595 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
17596 0 : ret = 0;
17597 0 : e = encode_PrincipalName(p, len, &(data)->cname, &l);
17598 0 : if (e) return e;
17599 0 : p -= l; len -= l; ret += l;
17600 :
17601 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 3, &l);
17602 0 : if (e) return e;
17603 0 : p -= l; len -= l; ret += l;
17604 :
17605 0 : ret += Top_tag_oldret;
17606 : }
17607 : /* crealm */
17608 : {
17609 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
17610 0 : ret = 0;
17611 0 : e = encode_Realm(p, len, &(data)->crealm, &l);
17612 0 : if (e) return e;
17613 0 : p -= l; len -= l; ret += l;
17614 :
17615 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
17616 0 : if (e) return e;
17617 0 : p -= l; len -= l; ret += l;
17618 :
17619 0 : ret += Top_tag_oldret;
17620 : }
17621 : /* usec */
17622 : {
17623 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
17624 0 : ret = 0;
17625 0 : e = encode_krb5int32(p, len, &(data)->usec, &l);
17626 0 : if (e) return e;
17627 0 : p -= l; len -= l; ret += l;
17628 :
17629 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
17630 0 : if (e) return e;
17631 0 : p -= l; len -= l; ret += l;
17632 :
17633 0 : ret += Top_tag_oldret;
17634 : }
17635 : /* timestamp */
17636 : {
17637 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
17638 0 : ret = 0;
17639 0 : e = encode_KerberosTime(p, len, &(data)->timestamp, &l);
17640 0 : if (e) return e;
17641 0 : p -= l; len -= l; ret += l;
17642 :
17643 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
17644 0 : if (e) return e;
17645 0 : p -= l; len -= l; ret += l;
17646 :
17647 0 : ret += Top_tag_oldret;
17648 : }
17649 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
17650 0 : if (e) return e;
17651 0 : p -= l; len -= l; ret += l;
17652 :
17653 0 : *size = ret;
17654 0 : return 0;
17655 : }
17656 :
17657 : int ASN1CALL
17658 0 : decode_KrbFastFinished(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, KrbFastFinished *data, size_t *size)
17659 : {
17660 0 : size_t ret = 0;
17661 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
17662 : int e HEIMDAL_UNUSED_ATTRIBUTE;
17663 :
17664 0 : memset(data, 0, sizeof(*data));
17665 : {
17666 : size_t Top_datalen, Top_oldlen;
17667 : Der_type Top_type;
17668 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
17669 0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
17670 0 : if(e) goto fail;
17671 0 : p += l; len -= l; ret += l;
17672 0 : Top_oldlen = len;
17673 0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
17674 0 : len = Top_datalen;
17675 : {
17676 : size_t timestamp_datalen, timestamp_oldlen;
17677 : Der_type timestamp_type;
17678 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, ×tamp_type, 0, ×tamp_datalen, &l);
17679 0 : if (e == 0 && timestamp_type != CONS) { e = ASN1_BAD_ID; }
17680 0 : if(e) goto fail;
17681 0 : p += l; len -= l; ret += l;
17682 0 : timestamp_oldlen = len;
17683 0 : if (timestamp_datalen > len) { e = ASN1_OVERRUN; goto fail; }
17684 0 : len = timestamp_datalen;
17685 0 : e = decode_KerberosTime(p, len, &(data)->timestamp, &l);
17686 0 : if(e) goto fail;
17687 0 : p += l; len -= l; ret += l;
17688 0 : len = timestamp_oldlen - timestamp_datalen;
17689 : }
17690 : {
17691 : size_t usec_datalen, usec_oldlen;
17692 : Der_type usec_type;
17693 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &usec_type, 1, &usec_datalen, &l);
17694 0 : if (e == 0 && usec_type != CONS) { e = ASN1_BAD_ID; }
17695 0 : if(e) goto fail;
17696 0 : p += l; len -= l; ret += l;
17697 0 : usec_oldlen = len;
17698 0 : if (usec_datalen > len) { e = ASN1_OVERRUN; goto fail; }
17699 0 : len = usec_datalen;
17700 0 : e = decode_krb5int32(p, len, &(data)->usec, &l);
17701 0 : if(e) goto fail;
17702 0 : p += l; len -= l; ret += l;
17703 0 : len = usec_oldlen - usec_datalen;
17704 : }
17705 : {
17706 : size_t crealm_datalen, crealm_oldlen;
17707 : Der_type crealm_type;
17708 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &crealm_type, 2, &crealm_datalen, &l);
17709 0 : if (e == 0 && crealm_type != CONS) { e = ASN1_BAD_ID; }
17710 0 : if(e) goto fail;
17711 0 : p += l; len -= l; ret += l;
17712 0 : crealm_oldlen = len;
17713 0 : if (crealm_datalen > len) { e = ASN1_OVERRUN; goto fail; }
17714 0 : len = crealm_datalen;
17715 0 : e = decode_Realm(p, len, &(data)->crealm, &l);
17716 0 : if(e) goto fail;
17717 0 : p += l; len -= l; ret += l;
17718 0 : len = crealm_oldlen - crealm_datalen;
17719 : }
17720 : {
17721 : size_t cname_datalen, cname_oldlen;
17722 : Der_type cname_type;
17723 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &cname_type, 3, &cname_datalen, &l);
17724 0 : if (e == 0 && cname_type != CONS) { e = ASN1_BAD_ID; }
17725 0 : if(e) goto fail;
17726 0 : p += l; len -= l; ret += l;
17727 0 : cname_oldlen = len;
17728 0 : if (cname_datalen > len) { e = ASN1_OVERRUN; goto fail; }
17729 0 : len = cname_datalen;
17730 0 : e = decode_PrincipalName(p, len, &(data)->cname, &l);
17731 0 : if(e) goto fail;
17732 0 : p += l; len -= l; ret += l;
17733 0 : len = cname_oldlen - cname_datalen;
17734 : }
17735 : {
17736 : size_t checksum_datalen, checksum_oldlen;
17737 : Der_type checksum_type;
17738 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &checksum_type, 4, &checksum_datalen, &l);
17739 0 : if (e == 0 && checksum_type != CONS) { e = ASN1_BAD_ID; }
17740 0 : if(e) goto fail;
17741 0 : p += l; len -= l; ret += l;
17742 0 : checksum_oldlen = len;
17743 0 : if (checksum_datalen > len) { e = ASN1_OVERRUN; goto fail; }
17744 0 : len = checksum_datalen;
17745 0 : e = decode_Checksum(p, len, &(data)->checksum, &l);
17746 0 : if(e) goto fail;
17747 0 : p += l; len -= l; ret += l;
17748 0 : len = checksum_oldlen - checksum_datalen;
17749 : }
17750 : {
17751 : size_t ticket_checksum_datalen, ticket_checksum_oldlen;
17752 : Der_type ticket_checksum_type;
17753 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &ticket_checksum_type, 5, &ticket_checksum_datalen, &l);
17754 0 : if (e == 0 && ticket_checksum_type != CONS) { e = ASN1_BAD_ID; }
17755 0 : if(e) goto fail;
17756 0 : p += l; len -= l; ret += l;
17757 0 : ticket_checksum_oldlen = len;
17758 0 : if (ticket_checksum_datalen > len) { e = ASN1_OVERRUN; goto fail; }
17759 0 : len = ticket_checksum_datalen;
17760 0 : e = decode_Checksum(p, len, &(data)->ticket_checksum, &l);
17761 0 : if(e) goto fail;
17762 0 : p += l; len -= l; ret += l;
17763 0 : len = ticket_checksum_oldlen - ticket_checksum_datalen;
17764 : }
17765 0 : len = Top_oldlen - Top_datalen;
17766 : }
17767 0 : if(size) *size = ret;
17768 0 : return 0;
17769 0 : fail:
17770 0 : free_KrbFastFinished(data);
17771 0 : return e;
17772 : }
17773 :
17774 : void ASN1CALL
17775 0 : free_KrbFastFinished(KrbFastFinished *data)
17776 : {
17777 0 : free_KerberosTime(&(data)->timestamp);
17778 0 : free_krb5int32(&(data)->usec);
17779 0 : free_Realm(&(data)->crealm);
17780 0 : free_PrincipalName(&(data)->cname);
17781 0 : free_Checksum(&(data)->checksum);
17782 0 : free_Checksum(&(data)->ticket_checksum);
17783 0 : }
17784 :
17785 : size_t ASN1CALL
17786 0 : length_KrbFastFinished(const KrbFastFinished *data)
17787 : {
17788 0 : size_t ret = 0;
17789 : {
17790 0 : size_t Top_tag_oldret = ret;
17791 0 : ret = 0;
17792 0 : ret += length_KerberosTime(&(data)->timestamp);
17793 0 : ret += 1 + der_length_len (ret);
17794 0 : ret += Top_tag_oldret;
17795 : }
17796 : {
17797 0 : size_t Top_tag_oldret = ret;
17798 0 : ret = 0;
17799 0 : ret += length_krb5int32(&(data)->usec);
17800 0 : ret += 1 + der_length_len (ret);
17801 0 : ret += Top_tag_oldret;
17802 : }
17803 : {
17804 0 : size_t Top_tag_oldret = ret;
17805 0 : ret = 0;
17806 0 : ret += length_Realm(&(data)->crealm);
17807 0 : ret += 1 + der_length_len (ret);
17808 0 : ret += Top_tag_oldret;
17809 : }
17810 : {
17811 0 : size_t Top_tag_oldret = ret;
17812 0 : ret = 0;
17813 0 : ret += length_PrincipalName(&(data)->cname);
17814 0 : ret += 1 + der_length_len (ret);
17815 0 : ret += Top_tag_oldret;
17816 : }
17817 : {
17818 0 : size_t Top_tag_oldret = ret;
17819 0 : ret = 0;
17820 0 : ret += length_Checksum(&(data)->checksum);
17821 0 : ret += 1 + der_length_len (ret);
17822 0 : ret += Top_tag_oldret;
17823 : }
17824 : {
17825 0 : size_t Top_tag_oldret = ret;
17826 0 : ret = 0;
17827 0 : ret += length_Checksum(&(data)->ticket_checksum);
17828 0 : ret += 1 + der_length_len (ret);
17829 0 : ret += Top_tag_oldret;
17830 : }
17831 0 : ret += 1 + der_length_len (ret);
17832 0 : return ret;
17833 : }
17834 :
17835 : int ASN1CALL
17836 0 : copy_KrbFastFinished(const KrbFastFinished *from, KrbFastFinished *to)
17837 : {
17838 0 : memset(to, 0, sizeof(*to));
17839 0 : if(copy_KerberosTime(&(from)->timestamp, &(to)->timestamp)) goto fail;
17840 0 : if(copy_krb5int32(&(from)->usec, &(to)->usec)) goto fail;
17841 0 : if(copy_Realm(&(from)->crealm, &(to)->crealm)) goto fail;
17842 0 : if(copy_PrincipalName(&(from)->cname, &(to)->cname)) goto fail;
17843 0 : if(copy_Checksum(&(from)->checksum, &(to)->checksum)) goto fail;
17844 0 : if(copy_Checksum(&(from)->ticket_checksum, &(to)->ticket_checksum)) goto fail;
17845 0 : return 0;
17846 0 : fail:
17847 0 : free_KrbFastFinished(to);
17848 0 : return ENOMEM;
17849 : }
17850 :
17851 : int ASN1CALL
17852 0 : encode_KrbFastResponse(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const KrbFastResponse *data, size_t *size)
17853 : {
17854 0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
17855 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
17856 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
17857 :
17858 : /* finished */
17859 0 : if((data)->finished) {
17860 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
17861 0 : ret = 0;
17862 0 : e = encode_KrbFastFinished(p, len, (data)->finished, &l);
17863 0 : if (e) return e;
17864 0 : p -= l; len -= l; ret += l;
17865 :
17866 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
17867 0 : if (e) return e;
17868 0 : p -= l; len -= l; ret += l;
17869 :
17870 0 : ret += Top_tag_oldret;
17871 : }
17872 : /* rep-key */
17873 0 : if((data)->rep_key) {
17874 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
17875 0 : ret = 0;
17876 0 : e = encode_EncryptionKey(p, len, (data)->rep_key, &l);
17877 0 : if (e) return e;
17878 0 : p -= l; len -= l; ret += l;
17879 :
17880 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
17881 0 : if (e) return e;
17882 0 : p -= l; len -= l; ret += l;
17883 :
17884 0 : ret += Top_tag_oldret;
17885 : }
17886 : /* padata */
17887 : {
17888 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
17889 0 : ret = 0;
17890 0 : for(i = (int)(&(data)->padata)->len - 1; i >= 0; --i) {
17891 0 : size_t padata_tag_tag_for_oldret = ret;
17892 0 : ret = 0;
17893 0 : e = encode_PA_DATA(p, len, &(&(data)->padata)->val[i], &l);
17894 0 : if (e) return e;
17895 0 : p -= l; len -= l; ret += l;
17896 :
17897 0 : ret += padata_tag_tag_for_oldret;
17898 : }
17899 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
17900 0 : if (e) return e;
17901 0 : p -= l; len -= l; ret += l;
17902 :
17903 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
17904 0 : if (e) return e;
17905 0 : p -= l; len -= l; ret += l;
17906 :
17907 0 : ret += Top_tag_oldret;
17908 : }
17909 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
17910 0 : if (e) return e;
17911 0 : p -= l; len -= l; ret += l;
17912 :
17913 0 : *size = ret;
17914 0 : return 0;
17915 : }
17916 :
17917 : int ASN1CALL
17918 0 : decode_KrbFastResponse(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, KrbFastResponse *data, size_t *size)
17919 : {
17920 0 : size_t ret = 0;
17921 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
17922 : int e HEIMDAL_UNUSED_ATTRIBUTE;
17923 :
17924 0 : memset(data, 0, sizeof(*data));
17925 : {
17926 : size_t Top_datalen, Top_oldlen;
17927 : Der_type Top_type;
17928 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
17929 0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
17930 0 : if(e) goto fail;
17931 0 : p += l; len -= l; ret += l;
17932 0 : Top_oldlen = len;
17933 0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
17934 0 : len = Top_datalen;
17935 : {
17936 : size_t padata_datalen, padata_oldlen;
17937 : Der_type padata_type;
17938 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &padata_type, 0, &padata_datalen, &l);
17939 0 : if (e == 0 && padata_type != CONS) { e = ASN1_BAD_ID; }
17940 0 : if(e) goto fail;
17941 0 : p += l; len -= l; ret += l;
17942 0 : padata_oldlen = len;
17943 0 : if (padata_datalen > len) { e = ASN1_OVERRUN; goto fail; }
17944 0 : len = padata_datalen;
17945 : {
17946 : size_t padata_Tag_datalen, padata_Tag_oldlen;
17947 : Der_type padata_Tag_type;
17948 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &padata_Tag_type, UT_Sequence, &padata_Tag_datalen, &l);
17949 0 : if (e == 0 && padata_Tag_type != CONS) { e = ASN1_BAD_ID; }
17950 0 : if(e) goto fail;
17951 0 : p += l; len -= l; ret += l;
17952 0 : padata_Tag_oldlen = len;
17953 0 : if (padata_Tag_datalen > len) { e = ASN1_OVERRUN; goto fail; }
17954 0 : len = padata_Tag_datalen;
17955 : {
17956 0 : size_t padata_Tag_Tag_origlen = len;
17957 0 : size_t padata_Tag_Tag_oldret = ret;
17958 0 : size_t padata_Tag_Tag_olen = 0;
17959 : void *padata_Tag_Tag_tmp;
17960 0 : ret = 0;
17961 0 : (&(data)->padata)->len = 0;
17962 0 : (&(data)->padata)->val = NULL;
17963 0 : while(ret < padata_Tag_Tag_origlen) {
17964 0 : size_t padata_Tag_Tag_nlen = padata_Tag_Tag_olen + sizeof(*((&(data)->padata)->val));
17965 0 : if (padata_Tag_Tag_olen > padata_Tag_Tag_nlen) { e = ASN1_OVERFLOW; goto fail; }
17966 0 : padata_Tag_Tag_olen = padata_Tag_Tag_nlen;
17967 0 : padata_Tag_Tag_tmp = realloc((&(data)->padata)->val, padata_Tag_Tag_olen);
17968 0 : if (padata_Tag_Tag_tmp == NULL) { e = ENOMEM; goto fail; }
17969 0 : (&(data)->padata)->val = padata_Tag_Tag_tmp;
17970 0 : e = decode_PA_DATA(p, len, &(&(data)->padata)->val[(&(data)->padata)->len], &l);
17971 0 : if(e) goto fail;
17972 0 : p += l; len -= l; ret += l;
17973 0 : (&(data)->padata)->len++;
17974 0 : len = padata_Tag_Tag_origlen - ret;
17975 : }
17976 0 : ret += padata_Tag_Tag_oldret;
17977 : }
17978 0 : len = padata_Tag_oldlen - padata_Tag_datalen;
17979 : }
17980 0 : len = padata_oldlen - padata_datalen;
17981 : }
17982 : {
17983 : size_t rep_key_datalen, rep_key_oldlen;
17984 : Der_type rep_key_type;
17985 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &rep_key_type, 1, &rep_key_datalen, &l);
17986 0 : if (e == 0 && rep_key_type != CONS) { e = ASN1_BAD_ID; }
17987 0 : if(e) {
17988 0 : (data)->rep_key = NULL;
17989 : } else {
17990 0 : (data)->rep_key = calloc(1, sizeof(*(data)->rep_key));
17991 0 : if ((data)->rep_key == NULL) { e = ENOMEM; goto fail; }
17992 0 : p += l; len -= l; ret += l;
17993 0 : rep_key_oldlen = len;
17994 0 : if (rep_key_datalen > len) { e = ASN1_OVERRUN; goto fail; }
17995 0 : len = rep_key_datalen;
17996 0 : e = decode_EncryptionKey(p, len, (data)->rep_key, &l);
17997 0 : if(e) goto fail;
17998 0 : p += l; len -= l; ret += l;
17999 0 : len = rep_key_oldlen - rep_key_datalen;
18000 : }
18001 : }
18002 : {
18003 : size_t finished_datalen, finished_oldlen;
18004 : Der_type finished_type;
18005 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &finished_type, 2, &finished_datalen, &l);
18006 0 : if (e == 0 && finished_type != CONS) { e = ASN1_BAD_ID; }
18007 0 : if(e) {
18008 0 : (data)->finished = NULL;
18009 : } else {
18010 0 : (data)->finished = calloc(1, sizeof(*(data)->finished));
18011 0 : if ((data)->finished == NULL) { e = ENOMEM; goto fail; }
18012 0 : p += l; len -= l; ret += l;
18013 0 : finished_oldlen = len;
18014 0 : if (finished_datalen > len) { e = ASN1_OVERRUN; goto fail; }
18015 0 : len = finished_datalen;
18016 0 : e = decode_KrbFastFinished(p, len, (data)->finished, &l);
18017 0 : if(e) goto fail;
18018 0 : p += l; len -= l; ret += l;
18019 0 : len = finished_oldlen - finished_datalen;
18020 : }
18021 : }
18022 0 : len = Top_oldlen - Top_datalen;
18023 : }
18024 0 : if(size) *size = ret;
18025 0 : return 0;
18026 0 : fail:
18027 0 : free_KrbFastResponse(data);
18028 0 : return e;
18029 : }
18030 :
18031 : void ASN1CALL
18032 0 : free_KrbFastResponse(KrbFastResponse *data)
18033 : {
18034 0 : while((&(data)->padata)->len){
18035 0 : free_PA_DATA(&(&(data)->padata)->val[(&(data)->padata)->len-1]);
18036 0 : (&(data)->padata)->len--;
18037 : }
18038 0 : free((&(data)->padata)->val);
18039 0 : (&(data)->padata)->val = NULL;
18040 0 : if((data)->rep_key) {
18041 0 : free_EncryptionKey((data)->rep_key);
18042 0 : free((data)->rep_key);
18043 0 : (data)->rep_key = NULL;
18044 : }
18045 0 : if((data)->finished) {
18046 0 : free_KrbFastFinished((data)->finished);
18047 0 : free((data)->finished);
18048 0 : (data)->finished = NULL;
18049 : }
18050 0 : }
18051 :
18052 : size_t ASN1CALL
18053 0 : length_KrbFastResponse(const KrbFastResponse *data)
18054 : {
18055 0 : size_t ret = 0;
18056 : {
18057 0 : size_t Top_tag_oldret = ret;
18058 0 : ret = 0;
18059 : {
18060 0 : size_t padata_tag_tag_oldret = ret;
18061 : int i;
18062 0 : ret = 0;
18063 0 : for(i = (&(data)->padata)->len - 1; i >= 0; --i){
18064 0 : size_t padata_tag_tag_for_oldret = ret;
18065 0 : ret = 0;
18066 0 : ret += length_PA_DATA(&(&(data)->padata)->val[i]);
18067 0 : ret += padata_tag_tag_for_oldret;
18068 : }
18069 0 : ret += padata_tag_tag_oldret;
18070 : }
18071 0 : ret += 1 + der_length_len (ret);
18072 0 : ret += 1 + der_length_len (ret);
18073 0 : ret += Top_tag_oldret;
18074 : }
18075 0 : if((data)->rep_key){
18076 0 : size_t Top_tag_oldret = ret;
18077 0 : ret = 0;
18078 0 : ret += length_EncryptionKey((data)->rep_key);
18079 0 : ret += 1 + der_length_len (ret);
18080 0 : ret += Top_tag_oldret;
18081 : }
18082 0 : if((data)->finished){
18083 0 : size_t Top_tag_oldret = ret;
18084 0 : ret = 0;
18085 0 : ret += length_KrbFastFinished((data)->finished);
18086 0 : ret += 1 + der_length_len (ret);
18087 0 : ret += Top_tag_oldret;
18088 : }
18089 0 : ret += 1 + der_length_len (ret);
18090 0 : return ret;
18091 : }
18092 :
18093 : int ASN1CALL
18094 0 : copy_KrbFastResponse(const KrbFastResponse *from, KrbFastResponse *to)
18095 : {
18096 0 : memset(to, 0, sizeof(*to));
18097 0 : if(((&(to)->padata)->val = malloc((&(from)->padata)->len * sizeof(*(&(to)->padata)->val))) == NULL && (&(from)->padata)->len != 0)
18098 0 : goto fail;
18099 0 : for((&(to)->padata)->len = 0; (&(to)->padata)->len < (&(from)->padata)->len; (&(to)->padata)->len++){
18100 0 : if(copy_PA_DATA(&(&(from)->padata)->val[(&(to)->padata)->len], &(&(to)->padata)->val[(&(to)->padata)->len])) goto fail;
18101 : }
18102 0 : if((from)->rep_key) {
18103 0 : (to)->rep_key = malloc(sizeof(*(to)->rep_key));
18104 0 : if((to)->rep_key == NULL) goto fail;
18105 0 : if(copy_EncryptionKey((from)->rep_key, (to)->rep_key)) goto fail;
18106 : }else
18107 0 : (to)->rep_key = NULL;
18108 0 : if((from)->finished) {
18109 0 : (to)->finished = malloc(sizeof(*(to)->finished));
18110 0 : if((to)->finished == NULL) goto fail;
18111 0 : if(copy_KrbFastFinished((from)->finished, (to)->finished)) goto fail;
18112 : }else
18113 0 : (to)->finished = NULL;
18114 0 : return 0;
18115 0 : fail:
18116 0 : free_KrbFastResponse(to);
18117 0 : return ENOMEM;
18118 : }
18119 :
18120 : int ASN1CALL
18121 0 : encode_KrbFastArmoredRep(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const KrbFastArmoredRep *data, size_t *size)
18122 : {
18123 0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
18124 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
18125 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
18126 :
18127 : /* enc-fast-rep */
18128 : {
18129 0 : size_t Top_tag_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;
18130 0 : ret = 0;
18131 0 : e = encode_EncryptedData(p, len, &(data)->enc_fast_rep, &l);
18132 0 : if (e) return e;
18133 0 : p -= l; len -= l; ret += l;
18134 :
18135 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
18136 0 : if (e) return e;
18137 0 : p -= l; len -= l; ret += l;
18138 :
18139 0 : ret += Top_tag_oldret;
18140 : }
18141 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
18142 0 : if (e) return e;
18143 0 : p -= l; len -= l; ret += l;
18144 :
18145 0 : *size = ret;
18146 0 : return 0;
18147 : }
18148 :
18149 : int ASN1CALL
18150 0 : decode_KrbFastArmoredRep(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, KrbFastArmoredRep *data, size_t *size)
18151 : {
18152 0 : size_t ret = 0;
18153 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
18154 : int e HEIMDAL_UNUSED_ATTRIBUTE;
18155 :
18156 0 : memset(data, 0, sizeof(*data));
18157 : {
18158 : size_t Top_datalen, Top_oldlen;
18159 : Der_type Top_type;
18160 0 : e = der_match_tag_and_length(p, len, ASN1_C_UNIV, &Top_type, UT_Sequence, &Top_datalen, &l);
18161 0 : if (e == 0 && Top_type != CONS) { e = ASN1_BAD_ID; }
18162 0 : if(e) goto fail;
18163 0 : p += l; len -= l; ret += l;
18164 0 : Top_oldlen = len;
18165 0 : if (Top_datalen > len) { e = ASN1_OVERRUN; goto fail; }
18166 0 : len = Top_datalen;
18167 : {
18168 : size_t enc_fast_rep_datalen, enc_fast_rep_oldlen;
18169 : Der_type enc_fast_rep_type;
18170 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &enc_fast_rep_type, 0, &enc_fast_rep_datalen, &l);
18171 0 : if (e == 0 && enc_fast_rep_type != CONS) { e = ASN1_BAD_ID; }
18172 0 : if(e) goto fail;
18173 0 : p += l; len -= l; ret += l;
18174 0 : enc_fast_rep_oldlen = len;
18175 0 : if (enc_fast_rep_datalen > len) { e = ASN1_OVERRUN; goto fail; }
18176 0 : len = enc_fast_rep_datalen;
18177 0 : e = decode_EncryptedData(p, len, &(data)->enc_fast_rep, &l);
18178 0 : if(e) goto fail;
18179 0 : p += l; len -= l; ret += l;
18180 0 : len = enc_fast_rep_oldlen - enc_fast_rep_datalen;
18181 : }
18182 0 : len = Top_oldlen - Top_datalen;
18183 : }
18184 0 : if(size) *size = ret;
18185 0 : return 0;
18186 0 : fail:
18187 0 : free_KrbFastArmoredRep(data);
18188 0 : return e;
18189 : }
18190 :
18191 : void ASN1CALL
18192 0 : free_KrbFastArmoredRep(KrbFastArmoredRep *data)
18193 : {
18194 0 : free_EncryptedData(&(data)->enc_fast_rep);
18195 0 : }
18196 :
18197 : size_t ASN1CALL
18198 0 : length_KrbFastArmoredRep(const KrbFastArmoredRep *data)
18199 : {
18200 0 : size_t ret = 0;
18201 : {
18202 0 : size_t Top_tag_oldret = ret;
18203 0 : ret = 0;
18204 0 : ret += length_EncryptedData(&(data)->enc_fast_rep);
18205 0 : ret += 1 + der_length_len (ret);
18206 0 : ret += Top_tag_oldret;
18207 : }
18208 0 : ret += 1 + der_length_len (ret);
18209 0 : return ret;
18210 : }
18211 :
18212 : int ASN1CALL
18213 0 : copy_KrbFastArmoredRep(const KrbFastArmoredRep *from, KrbFastArmoredRep *to)
18214 : {
18215 0 : memset(to, 0, sizeof(*to));
18216 0 : if(copy_EncryptedData(&(from)->enc_fast_rep, &(to)->enc_fast_rep)) goto fail;
18217 0 : return 0;
18218 0 : fail:
18219 0 : free_KrbFastArmoredRep(to);
18220 0 : return ENOMEM;
18221 : }
18222 :
18223 : int ASN1CALL
18224 0 : encode_PA_FX_FAST_REPLY(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, const PA_FX_FAST_REPLY *data, size_t *size)
18225 : {
18226 0 : size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;
18227 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
18228 : int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;
18229 :
18230 :
18231 0 : switch((data)->element) {
18232 0 : case choice_PA_FX_FAST_REPLY_armored_data: {size_t Top_oldret = ret;
18233 0 : ret = 0;
18234 0 : e = encode_KrbFastArmoredRep(p, len, &((data))->u.armored_data, &l);
18235 0 : if (e) return e;
18236 0 : p -= l; len -= l; ret += l;
18237 :
18238 0 : e = der_put_length_and_tag (p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
18239 0 : if (e) return e;
18240 0 : p -= l; len -= l; ret += l;
18241 :
18242 0 : ret += Top_oldret;
18243 0 : break;
18244 : }
18245 0 : case choice_PA_FX_FAST_REPLY_asn1_ellipsis: {
18246 0 : if (len < (data)->u.asn1_ellipsis.length)
18247 0 : return ASN1_OVERFLOW;
18248 0 : p -= (data)->u.asn1_ellipsis.length;
18249 0 : ret += (data)->u.asn1_ellipsis.length;
18250 0 : memcpy(p + 1, (data)->u.asn1_ellipsis.data, (data)->u.asn1_ellipsis.length);
18251 0 : break;
18252 : }
18253 : };
18254 0 : *size = ret;
18255 0 : return 0;
18256 : }
18257 :
18258 : int ASN1CALL
18259 0 : decode_PA_FX_FAST_REPLY(const unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE, PA_FX_FAST_REPLY *data, size_t *size)
18260 : {
18261 0 : size_t ret = 0;
18262 : size_t l HEIMDAL_UNUSED_ATTRIBUTE;
18263 : int e HEIMDAL_UNUSED_ATTRIBUTE;
18264 :
18265 0 : memset(data, 0, sizeof(*data));
18266 0 : if (der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 0, NULL) == 0) {
18267 : {
18268 : size_t armored_data_datalen, armored_data_oldlen;
18269 : Der_type armored_data_type;
18270 0 : e = der_match_tag_and_length(p, len, ASN1_C_CONTEXT, &armored_data_type, 0, &armored_data_datalen, &l);
18271 0 : if (e == 0 && armored_data_type != CONS) { e = ASN1_BAD_ID; }
18272 0 : if(e) goto fail;
18273 0 : p += l; len -= l; ret += l;
18274 0 : armored_data_oldlen = len;
18275 0 : if (armored_data_datalen > len) { e = ASN1_OVERRUN; goto fail; }
18276 0 : len = armored_data_datalen;
18277 0 : e = decode_KrbFastArmoredRep(p, len, &(data)->u.armored_data, &l);
18278 0 : if(e) goto fail;
18279 0 : p += l; len -= l; ret += l;
18280 0 : len = armored_data_oldlen - armored_data_datalen;
18281 : }
18282 0 : (data)->element = choice_PA_FX_FAST_REPLY_armored_data;
18283 : }
18284 : else {
18285 0 : (data)->u.asn1_ellipsis.data = calloc(1, len);
18286 0 : if ((data)->u.asn1_ellipsis.data == NULL) {
18287 0 : e = ENOMEM; goto fail;
18288 : }
18289 0 : (data)->u.asn1_ellipsis.length = len;
18290 0 : memcpy((data)->u.asn1_ellipsis.data, p, len);
18291 0 : (data)->element = choice_PA_FX_FAST_REPLY_asn1_ellipsis;
18292 0 : p += len;
18293 0 : ret += len;
18294 0 : len = 0;
18295 : }
18296 0 : if(size) *size = ret;
18297 0 : return 0;
18298 0 : fail:
18299 0 : free_PA_FX_FAST_REPLY(data);
18300 0 : return e;
18301 : }
18302 :
18303 : void ASN1CALL
18304 0 : free_PA_FX_FAST_REPLY(PA_FX_FAST_REPLY *data)
18305 : {
18306 0 : switch((data)->element) {
18307 0 : case choice_PA_FX_FAST_REPLY_armored_data:
18308 0 : free_KrbFastArmoredRep(&(data)->u.armored_data);
18309 0 : break;
18310 0 : case choice_PA_FX_FAST_REPLY_asn1_ellipsis:
18311 0 : der_free_octet_string(&(data)->u.asn1_ellipsis);
18312 0 : break;}
18313 0 : }
18314 :
18315 : size_t ASN1CALL
18316 0 : length_PA_FX_FAST_REPLY(const PA_FX_FAST_REPLY *data)
18317 : {
18318 0 : size_t ret = 0;
18319 0 : switch((data)->element) {
18320 0 : case choice_PA_FX_FAST_REPLY_armored_data:
18321 : {
18322 0 : size_t Top_oldret = ret;
18323 0 : ret = 0;
18324 0 : ret += length_KrbFastArmoredRep(&(data)->u.armored_data);
18325 0 : ret += 1 + der_length_len (ret);
18326 0 : ret += Top_oldret;
18327 : }
18328 0 : break;
18329 0 : case choice_PA_FX_FAST_REPLY_asn1_ellipsis:
18330 0 : ret += (data)->u.asn1_ellipsis.length;
18331 0 : break;
18332 : }
18333 0 : return ret;
18334 : }
18335 :
18336 : int ASN1CALL
18337 0 : copy_PA_FX_FAST_REPLY(const PA_FX_FAST_REPLY *from, PA_FX_FAST_REPLY *to)
18338 : {
18339 0 : memset(to, 0, sizeof(*to));
18340 0 : (to)->element = (from)->element;
18341 0 : switch((from)->element) {
18342 0 : case choice_PA_FX_FAST_REPLY_armored_data:
18343 0 : if(copy_KrbFastArmoredRep(&(from)->u.armored_data, &(to)->u.armored_data)) goto fail;
18344 0 : break;
18345 0 : case choice_PA_FX_FAST_REPLY_asn1_ellipsis: {
18346 : int ret;
18347 0 : ret=der_copy_octet_string(&(from)->u.asn1_ellipsis, &(to)->u.asn1_ellipsis);
18348 0 : if (ret) goto fail;
18349 0 : break;
18350 : }
18351 : }
18352 0 : return 0;
18353 0 : fail:
18354 0 : free_PA_FX_FAST_REPLY(to);
18355 0 : return ENOMEM;
18356 : }
18357 :
|