vendor/BIND: Update to 9.5.2-P3
[dragonfly.git] / contrib / bind / lib / dns / spnego_asn1.c
blob75c2304d8e2c62398863e935268e5480eddff5ff
1 /*
2 * Copyright (C) 2006, 2007 Internet Systems Consortium, Inc. ("ISC")
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
8 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
9 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10 * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
11 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
13 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14 * PERFORMANCE OF THIS SOFTWARE.
17 /* $Id: spnego_asn1.c,v 1.4 2007/06/19 23:47:16 tbox Exp $ */
19 /*! \file
20 * \brief Method routines generated from SPNEGO ASN.1 module.
21 * See spnego_asn1.pl for details. Do not edit.
24 /* Generated from spnego.asn1 */
25 /* Do not edit */
27 #ifndef __asn1_h__
28 #define __asn1_h__
31 #ifndef __asn1_common_definitions__
32 #define __asn1_common_definitions__
34 typedef struct octet_string {
35 size_t length;
36 void *data;
37 } octet_string;
39 typedef char *general_string;
41 typedef char *utf8_string;
43 typedef struct oid {
44 size_t length;
45 unsigned *components;
46 } oid;
48 #define ASN1_MALLOC_ENCODE(T, B, BL, S, L, R) \
49 do { \
50 (BL) = length_##T((S)); \
51 (B) = malloc((BL)); \
52 if((B) == NULL) { \
53 (R) = ENOMEM; \
54 } else { \
55 (R) = encode_##T(((unsigned char*)(B)) + (BL) - 1, (BL), \
56 (S), (L)); \
57 if((R) != 0) { \
58 free((B)); \
59 (B) = NULL; \
60 } \
61 } \
62 } while (0)
64 #endif
67 * MechType ::= OBJECT IDENTIFIER
70 typedef oid MechType;
72 static int encode_MechType(unsigned char *, size_t, const MechType *, size_t *);
73 static int decode_MechType(const unsigned char *, size_t, MechType *, size_t *);
74 static void free_MechType(MechType *);
75 /* unused declaration: length_MechType */
76 /* unused declaration: copy_MechType */
80 * MechTypeList ::= SEQUENCE OF MechType
83 typedef struct MechTypeList {
84 unsigned int len;
85 MechType *val;
86 } MechTypeList;
88 static int encode_MechTypeList(unsigned char *, size_t, const MechTypeList *, size_t *);
89 static int decode_MechTypeList(const unsigned char *, size_t, MechTypeList *, size_t *);
90 static void free_MechTypeList(MechTypeList *);
91 /* unused declaration: length_MechTypeList */
92 /* unused declaration: copy_MechTypeList */
96 * ContextFlags ::= BIT STRING { delegFlag(0), mutualFlag(1), replayFlag(2),
97 * sequenceFlag(3), anonFlag(4), confFlag(5), integFlag(6) }
100 typedef struct ContextFlags {
101 unsigned int delegFlag:1;
102 unsigned int mutualFlag:1;
103 unsigned int replayFlag:1;
104 unsigned int sequenceFlag:1;
105 unsigned int anonFlag:1;
106 unsigned int confFlag:1;
107 unsigned int integFlag:1;
108 } ContextFlags;
111 static int encode_ContextFlags(unsigned char *, size_t, const ContextFlags *, size_t *);
112 static int decode_ContextFlags(const unsigned char *, size_t, ContextFlags *, size_t *);
113 static void free_ContextFlags(ContextFlags *);
114 /* unused declaration: length_ContextFlags */
115 /* unused declaration: copy_ContextFlags */
116 /* unused declaration: ContextFlags2int */
117 /* unused declaration: int2ContextFlags */
118 /* unused declaration: asn1_ContextFlags_units */
121 * NegTokenInit ::= SEQUENCE { mechTypes[0] MechTypeList, reqFlags[1]
122 * ContextFlags OPTIONAL, mechToken[2] OCTET STRING OPTIONAL,
123 * mechListMIC[3] OCTET STRING OPTIONAL }
126 typedef struct NegTokenInit {
127 MechTypeList mechTypes;
128 ContextFlags *reqFlags;
129 octet_string *mechToken;
130 octet_string *mechListMIC;
131 } NegTokenInit;
133 static int encode_NegTokenInit(unsigned char *, size_t, const NegTokenInit *, size_t *);
134 static int decode_NegTokenInit(const unsigned char *, size_t, NegTokenInit *, size_t *);
135 static void free_NegTokenInit(NegTokenInit *);
136 /* unused declaration: length_NegTokenInit */
137 /* unused declaration: copy_NegTokenInit */
141 * NegTokenResp ::= SEQUENCE { negState[0] ENUMERATED {
142 * accept-completed(0), accept-incomplete(1), reject(2), request-mic(3) }
143 * OPTIONAL, supportedMech[1] MechType OPTIONAL, responseToken[2] OCTET
144 * STRING OPTIONAL, mechListMIC[3] OCTET STRING OPTIONAL }
147 typedef struct NegTokenResp {
148 enum {
149 accept_completed = 0,
150 accept_incomplete = 1,
151 reject = 2,
152 request_mic = 3
153 } *negState;
155 MechType *supportedMech;
156 octet_string *responseToken;
157 octet_string *mechListMIC;
158 } NegTokenResp;
160 static int encode_NegTokenResp(unsigned char *, size_t, const NegTokenResp *, size_t *);
161 static int decode_NegTokenResp(const unsigned char *, size_t, NegTokenResp *, size_t *);
162 static void free_NegTokenResp(NegTokenResp *);
163 /* unused declaration: length_NegTokenResp */
164 /* unused declaration: copy_NegTokenResp */
169 #endif /* __asn1_h__ */
170 /* Generated from spnego.asn1 */
171 /* Do not edit */
174 #define BACK if (e) return e; p -= l; len -= l; ret += l
176 static int
177 encode_MechType(unsigned char *p, size_t len, const MechType * data, size_t * size)
179 size_t ret = 0;
180 size_t l;
181 int i, e;
183 i = 0;
184 e = encode_oid(p, len, data, &l);
185 BACK;
186 *size = ret;
187 return 0;
190 #define FORW if(e) goto fail; p += l; len -= l; ret += l
192 static int
193 decode_MechType(const unsigned char *p, size_t len, MechType * data, size_t * size)
195 size_t ret = 0, reallen;
196 size_t l;
197 int e;
199 memset(data, 0, sizeof(*data));
200 reallen = 0;
201 e = decode_oid(p, len, data, &l);
202 FORW;
203 if (size)
204 *size = ret;
205 return 0;
206 fail:
207 free_MechType(data);
208 return e;
211 static void
212 free_MechType(MechType * data)
214 free_oid(data);
217 /* unused function: length_MechType */
220 /* unused function: copy_MechType */
222 /* Generated from spnego.asn1 */
223 /* Do not edit */
226 #define BACK if (e) return e; p -= l; len -= l; ret += l
228 static int
229 encode_MechTypeList(unsigned char *p, size_t len, const MechTypeList * data, size_t * size)
231 size_t ret = 0;
232 size_t l;
233 int i, e;
235 i = 0;
236 for (i = (data)->len - 1; i >= 0; --i) {
237 int oldret = ret;
238 ret = 0;
239 e = encode_MechType(p, len, &(data)->val[i], &l);
240 BACK;
241 ret += oldret;
243 e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
244 BACK;
245 *size = ret;
246 return 0;
249 #define FORW if(e) goto fail; p += l; len -= l; ret += l
251 static int
252 decode_MechTypeList(const unsigned char *p, size_t len, MechTypeList * data, size_t * size)
254 size_t ret = 0, reallen;
255 size_t l;
256 int e;
258 memset(data, 0, sizeof(*data));
259 reallen = 0;
260 e = der_match_tag_and_length(p, len, ASN1_C_UNIV, CONS, UT_Sequence, &reallen, &l);
261 FORW;
262 if (len < reallen)
263 return ASN1_OVERRUN;
264 len = reallen;
266 size_t origlen = len;
267 int oldret = ret;
268 ret = 0;
269 (data)->len = 0;
270 (data)->val = NULL;
271 while (ret < origlen) {
272 (data)->len++;
273 (data)->val = realloc((data)->val, sizeof(*((data)->val)) * (data)->len);
274 e = decode_MechType(p, len, &(data)->val[(data)->len - 1], &l);
275 FORW;
276 len = origlen - ret;
278 ret += oldret;
280 if (size)
281 *size = ret;
282 return 0;
283 fail:
284 free_MechTypeList(data);
285 return e;
288 static void
289 free_MechTypeList(MechTypeList * data)
291 while ((data)->len) {
292 free_MechType(&(data)->val[(data)->len - 1]);
293 (data)->len--;
295 free((data)->val);
296 (data)->val = NULL;
299 /* unused function: length_MechTypeList */
302 /* unused function: copy_MechTypeList */
304 /* Generated from spnego.asn1 */
305 /* Do not edit */
308 #define BACK if (e) return e; p -= l; len -= l; ret += l
310 static int
311 encode_ContextFlags(unsigned char *p, size_t len, const ContextFlags * data, size_t * size)
313 size_t ret = 0;
314 size_t l;
315 int i, e;
317 i = 0;
319 unsigned char c = 0;
320 *p-- = c;
321 len--;
322 ret++;
323 c = 0;
324 *p-- = c;
325 len--;
326 ret++;
327 c = 0;
328 *p-- = c;
329 len--;
330 ret++;
331 c = 0;
332 if (data->integFlag)
333 c |= 1 << 1;
334 if (data->confFlag)
335 c |= 1 << 2;
336 if (data->anonFlag)
337 c |= 1 << 3;
338 if (data->sequenceFlag)
339 c |= 1 << 4;
340 if (data->replayFlag)
341 c |= 1 << 5;
342 if (data->mutualFlag)
343 c |= 1 << 6;
344 if (data->delegFlag)
345 c |= 1 << 7;
346 *p-- = c;
347 *p-- = 0;
348 len -= 2;
349 ret += 2;
352 e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, PRIM, UT_BitString, &l);
353 BACK;
354 *size = ret;
355 return 0;
358 #define FORW if(e) goto fail; p += l; len -= l; ret += l
360 static int
361 decode_ContextFlags(const unsigned char *p, size_t len, ContextFlags * data, size_t * size)
363 size_t ret = 0, reallen;
364 size_t l;
365 int e;
367 memset(data, 0, sizeof(*data));
368 reallen = 0;
369 e = der_match_tag_and_length(p, len, ASN1_C_UNIV, PRIM, UT_BitString, &reallen, &l);
370 FORW;
371 if (len < reallen)
372 return ASN1_OVERRUN;
373 p++;
374 len--;
375 reallen--;
376 ret++;
377 data->delegFlag = (*p >> 7) & 1;
378 data->mutualFlag = (*p >> 6) & 1;
379 data->replayFlag = (*p >> 5) & 1;
380 data->sequenceFlag = (*p >> 4) & 1;
381 data->anonFlag = (*p >> 3) & 1;
382 data->confFlag = (*p >> 2) & 1;
383 data->integFlag = (*p >> 1) & 1;
384 p += reallen;
385 len -= reallen;
386 ret += reallen;
387 if (size)
388 *size = ret;
389 return 0;
390 fail:
391 free_ContextFlags(data);
392 return e;
395 static void
396 free_ContextFlags(ContextFlags * data)
398 (void)data;
401 /* unused function: length_ContextFlags */
404 /* unused function: copy_ContextFlags */
407 /* unused function: ContextFlags2int */
410 /* unused function: int2ContextFlags */
413 /* unused variable: ContextFlags_units */
415 /* unused function: asn1_ContextFlags_units */
417 /* Generated from spnego.asn1 */
418 /* Do not edit */
421 #define BACK if (e) return e; p -= l; len -= l; ret += l
423 static int
424 encode_NegTokenInit(unsigned char *p, size_t len, const NegTokenInit * data, size_t * size)
426 size_t ret = 0;
427 size_t l;
428 int i, e;
430 i = 0;
431 if ((data)->mechListMIC) {
432 int oldret = ret;
433 ret = 0;
434 e = encode_octet_string(p, len, (data)->mechListMIC, &l);
435 BACK;
436 e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 3, &l);
437 BACK;
438 ret += oldret;
440 if ((data)->mechToken) {
441 int oldret = ret;
442 ret = 0;
443 e = encode_octet_string(p, len, (data)->mechToken, &l);
444 BACK;
445 e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
446 BACK;
447 ret += oldret;
449 if ((data)->reqFlags) {
450 int oldret = ret;
451 ret = 0;
452 e = encode_ContextFlags(p, len, (data)->reqFlags, &l);
453 BACK;
454 e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
455 BACK;
456 ret += oldret;
458 int oldret = ret;
459 ret = 0;
460 e = encode_MechTypeList(p, len, &(data)->mechTypes, &l);
461 BACK;
462 e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
463 BACK;
464 ret += oldret;
466 e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
467 BACK;
468 *size = ret;
469 return 0;
472 #define FORW if(e) goto fail; p += l; len -= l; ret += l
474 static int
475 decode_NegTokenInit(const unsigned char *p, size_t len, NegTokenInit * data, size_t * size)
477 size_t ret = 0, reallen;
478 size_t l;
479 int e;
481 memset(data, 0, sizeof(*data));
482 reallen = 0;
483 e = der_match_tag_and_length(p, len, ASN1_C_UNIV, CONS, UT_Sequence, &reallen, &l);
484 FORW;
486 int dce_fix;
487 if ((dce_fix = fix_dce(reallen, &len)) < 0)
488 return ASN1_BAD_FORMAT;
490 size_t newlen, oldlen;
492 e = der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 0, &l);
493 if (e)
494 return e;
495 else {
496 p += l;
497 len -= l;
498 ret += l;
499 e = der_get_length(p, len, &newlen, &l);
500 FORW;
502 int dce_fix;
503 oldlen = len;
504 if ((dce_fix = fix_dce(newlen, &len)) < 0)
505 return ASN1_BAD_FORMAT;
506 e = decode_MechTypeList(p, len, &(data)->mechTypes, &l);
507 FORW;
508 if (dce_fix) {
509 e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
510 FORW;
511 } else
512 len = oldlen - newlen;
517 size_t newlen, oldlen;
519 e = der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 1, &l);
520 if (e)
521 (data)->reqFlags = NULL;
522 else {
523 p += l;
524 len -= l;
525 ret += l;
526 e = der_get_length(p, len, &newlen, &l);
527 FORW;
529 int dce_fix;
530 oldlen = len;
531 if ((dce_fix = fix_dce(newlen, &len)) < 0)
532 return ASN1_BAD_FORMAT;
533 (data)->reqFlags = malloc(sizeof(*(data)->reqFlags));
534 if ((data)->reqFlags == NULL)
535 return ENOMEM;
536 e = decode_ContextFlags(p, len, (data)->reqFlags, &l);
537 FORW;
538 if (dce_fix) {
539 e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
540 FORW;
541 } else
542 len = oldlen - newlen;
547 size_t newlen, oldlen;
549 e = der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 2, &l);
550 if (e)
551 (data)->mechToken = NULL;
552 else {
553 p += l;
554 len -= l;
555 ret += l;
556 e = der_get_length(p, len, &newlen, &l);
557 FORW;
559 int dce_fix;
560 oldlen = len;
561 if ((dce_fix = fix_dce(newlen, &len)) < 0)
562 return ASN1_BAD_FORMAT;
563 (data)->mechToken = malloc(sizeof(*(data)->mechToken));
564 if ((data)->mechToken == NULL)
565 return ENOMEM;
566 e = decode_octet_string(p, len, (data)->mechToken, &l);
567 FORW;
568 if (dce_fix) {
569 e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
570 FORW;
571 } else
572 len = oldlen - newlen;
577 size_t newlen, oldlen;
579 e = der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 3, &l);
580 if (e)
581 (data)->mechListMIC = NULL;
582 else {
583 p += l;
584 len -= l;
585 ret += l;
586 e = der_get_length(p, len, &newlen, &l);
587 FORW;
589 int dce_fix;
590 oldlen = len;
591 if ((dce_fix = fix_dce(newlen, &len)) < 0)
592 return ASN1_BAD_FORMAT;
593 (data)->mechListMIC = malloc(sizeof(*(data)->mechListMIC));
594 if ((data)->mechListMIC == NULL)
595 return ENOMEM;
596 e = decode_octet_string(p, len, (data)->mechListMIC, &l);
597 FORW;
598 if (dce_fix) {
599 e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
600 FORW;
601 } else
602 len = oldlen - newlen;
606 if (dce_fix) {
607 e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
608 FORW;
611 if (size)
612 *size = ret;
613 return 0;
614 fail:
615 free_NegTokenInit(data);
616 return e;
619 static void
620 free_NegTokenInit(NegTokenInit * data)
622 free_MechTypeList(&(data)->mechTypes);
623 if ((data)->reqFlags) {
624 free_ContextFlags((data)->reqFlags);
625 free((data)->reqFlags);
626 (data)->reqFlags = NULL;
628 if ((data)->mechToken) {
629 free_octet_string((data)->mechToken);
630 free((data)->mechToken);
631 (data)->mechToken = NULL;
633 if ((data)->mechListMIC) {
634 free_octet_string((data)->mechListMIC);
635 free((data)->mechListMIC);
636 (data)->mechListMIC = NULL;
640 /* unused function: length_NegTokenInit */
643 /* unused function: copy_NegTokenInit */
645 /* Generated from spnego.asn1 */
646 /* Do not edit */
649 #define BACK if (e) return e; p -= l; len -= l; ret += l
651 static int
652 encode_NegTokenResp(unsigned char *p, size_t len, const NegTokenResp * data, size_t * size)
654 size_t ret = 0;
655 size_t l;
656 int i, e;
658 i = 0;
659 if ((data)->mechListMIC) {
660 int oldret = ret;
661 ret = 0;
662 e = encode_octet_string(p, len, (data)->mechListMIC, &l);
663 BACK;
664 e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 3, &l);
665 BACK;
666 ret += oldret;
668 if ((data)->responseToken) {
669 int oldret = ret;
670 ret = 0;
671 e = encode_octet_string(p, len, (data)->responseToken, &l);
672 BACK;
673 e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
674 BACK;
675 ret += oldret;
677 if ((data)->supportedMech) {
678 int oldret = ret;
679 ret = 0;
680 e = encode_MechType(p, len, (data)->supportedMech, &l);
681 BACK;
682 e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
683 BACK;
684 ret += oldret;
686 if ((data)->negState) {
687 int oldret = ret;
688 ret = 0;
689 e = encode_enumerated(p, len, (data)->negState, &l);
690 BACK;
691 e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
692 BACK;
693 ret += oldret;
695 e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
696 BACK;
697 *size = ret;
698 return 0;
701 #define FORW if(e) goto fail; p += l; len -= l; ret += l
703 static int
704 decode_NegTokenResp(const unsigned char *p, size_t len, NegTokenResp * data, size_t * size)
706 size_t ret = 0, reallen;
707 size_t l;
708 int e;
710 memset(data, 0, sizeof(*data));
711 reallen = 0;
712 e = der_match_tag_and_length(p, len, ASN1_C_UNIV, CONS, UT_Sequence, &reallen, &l);
713 FORW;
715 int dce_fix;
716 if ((dce_fix = fix_dce(reallen, &len)) < 0)
717 return ASN1_BAD_FORMAT;
719 size_t newlen, oldlen;
721 e = der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 0, &l);
722 if (e)
723 (data)->negState = NULL;
724 else {
725 p += l;
726 len -= l;
727 ret += l;
728 e = der_get_length(p, len, &newlen, &l);
729 FORW;
731 int dce_fix;
732 oldlen = len;
733 if ((dce_fix = fix_dce(newlen, &len)) < 0)
734 return ASN1_BAD_FORMAT;
735 (data)->negState = malloc(sizeof(*(data)->negState));
736 if ((data)->negState == NULL)
737 return ENOMEM;
738 e = decode_enumerated(p, len, (data)->negState, &l);
739 FORW;
740 if (dce_fix) {
741 e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
742 FORW;
743 } else
744 len = oldlen - newlen;
749 size_t newlen, oldlen;
751 e = der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 1, &l);
752 if (e)
753 (data)->supportedMech = NULL;
754 else {
755 p += l;
756 len -= l;
757 ret += l;
758 e = der_get_length(p, len, &newlen, &l);
759 FORW;
761 int dce_fix;
762 oldlen = len;
763 if ((dce_fix = fix_dce(newlen, &len)) < 0)
764 return ASN1_BAD_FORMAT;
765 (data)->supportedMech = malloc(sizeof(*(data)->supportedMech));
766 if ((data)->supportedMech == NULL)
767 return ENOMEM;
768 e = decode_MechType(p, len, (data)->supportedMech, &l);
769 FORW;
770 if (dce_fix) {
771 e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
772 FORW;
773 } else
774 len = oldlen - newlen;
779 size_t newlen, oldlen;
781 e = der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 2, &l);
782 if (e)
783 (data)->responseToken = NULL;
784 else {
785 p += l;
786 len -= l;
787 ret += l;
788 e = der_get_length(p, len, &newlen, &l);
789 FORW;
791 int dce_fix;
792 oldlen = len;
793 if ((dce_fix = fix_dce(newlen, &len)) < 0)
794 return ASN1_BAD_FORMAT;
795 (data)->responseToken = malloc(sizeof(*(data)->responseToken));
796 if ((data)->responseToken == NULL)
797 return ENOMEM;
798 e = decode_octet_string(p, len, (data)->responseToken, &l);
799 FORW;
800 if (dce_fix) {
801 e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
802 FORW;
803 } else
804 len = oldlen - newlen;
809 size_t newlen, oldlen;
811 e = der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 3, &l);
812 if (e)
813 (data)->mechListMIC = NULL;
814 else {
815 p += l;
816 len -= l;
817 ret += l;
818 e = der_get_length(p, len, &newlen, &l);
819 FORW;
821 int dce_fix;
822 oldlen = len;
823 if ((dce_fix = fix_dce(newlen, &len)) < 0)
824 return ASN1_BAD_FORMAT;
825 (data)->mechListMIC = malloc(sizeof(*(data)->mechListMIC));
826 if ((data)->mechListMIC == NULL)
827 return ENOMEM;
828 e = decode_octet_string(p, len, (data)->mechListMIC, &l);
829 FORW;
830 if (dce_fix) {
831 e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
832 FORW;
833 } else
834 len = oldlen - newlen;
838 if (dce_fix) {
839 e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
840 FORW;
843 if (size)
844 *size = ret;
845 return 0;
846 fail:
847 free_NegTokenResp(data);
848 return e;
851 static void
852 free_NegTokenResp(NegTokenResp * data)
854 if ((data)->negState) {
855 free((data)->negState);
856 (data)->negState = NULL;
858 if ((data)->supportedMech) {
859 free_MechType((data)->supportedMech);
860 free((data)->supportedMech);
861 (data)->supportedMech = NULL;
863 if ((data)->responseToken) {
864 free_octet_string((data)->responseToken);
865 free((data)->responseToken);
866 (data)->responseToken = NULL;
868 if ((data)->mechListMIC) {
869 free_octet_string((data)->mechListMIC);
870 free((data)->mechListMIC);
871 (data)->mechListMIC = NULL;
875 /* unused function: length_NegTokenResp */
878 /* unused function: copy_NegTokenResp */
880 /* Generated from spnego.asn1 */
881 /* Do not edit */
884 /* CHOICE */
885 /* unused variable: asn1_NegotiationToken_dummy_holder */