2 * Copyright (C) 2006, 2007, 2012, 2013 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 $ */
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 */
31 #ifndef __asn1_common_definitions__
32 #define __asn1_common_definitions__
34 typedef struct octet_string {
39 typedef char *general_string;
41 typedef char *utf8_string;
48 #define ASN1_MALLOC_ENCODE(T, B, BL, S, L, R) \
50 (BL) = length_##T((S)); \
55 (R) = encode_##T(((unsigned char*)(B)) + (BL) - 1, (BL), \
67 * MechType ::= OBJECT IDENTIFIER
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 {
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;
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;
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 {
149 accept_completed = 0,
150 accept_incomplete = 1,
155 MechType *supportedMech;
156 octet_string *responseToken;
157 octet_string *mechListMIC;
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 */
174 #define BACK if (e) return e; p -= l; len -= l; ret += l; POST(p); POST(len); POST(ret)
177 encode_MechType(unsigned char *p, size_t len, const MechType * data, size_t * size)
183 e = encode_oid(p, len, data, &l);
189 #define FORW if(e) goto fail; p += l; len -= l; ret += l; POST(p); POST(len); POST(ret)
192 decode_MechType(const unsigned char *p, size_t len, MechType * data, size_t * size)
198 memset(data, 0, sizeof(*data));
199 e = decode_oid(p, len, data, &l);
210 free_MechType(MechType * data)
215 /* unused function: length_MechType */
218 /* unused function: copy_MechType */
220 /* Generated from spnego.asn1 */
225 encode_MechTypeList(unsigned char *p, size_t len, const MechTypeList * data, size_t * size)
231 for (i = (data)->len - 1; i >= 0; --i) {
234 e = encode_MechType(p, len, &(data)->val[i], &l);
238 e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
245 decode_MechTypeList(const unsigned char *p, size_t len, MechTypeList * data, size_t * size)
247 size_t ret = 0, reallen;
251 memset(data, 0, sizeof(*data));
253 e = der_match_tag_and_length(p, len, ASN1_C_UNIV, CONS, UT_Sequence, &reallen, &l);
259 size_t origlen = len;
264 while (ret < origlen) {
265 void *old = (data)->val;
267 (data)->val = realloc((data)->val, sizeof(*((data)->val)) * (data)->len);
268 if ((data)->val == NULL) {
273 e = decode_MechType(p, len, &(data)->val[(data)->len - 1], &l);
283 free_MechTypeList(data);
288 free_MechTypeList(MechTypeList * data)
290 while ((data)->len) {
291 free_MechType(&(data)->val[(data)->len - 1]);
298 /* unused function: length_MechTypeList */
301 /* unused function: copy_MechTypeList */
303 /* Generated from spnego.asn1 */
308 encode_ContextFlags(unsigned char *p, size_t len, const ContextFlags * data, size_t * size)
334 if (data->sequenceFlag)
336 if (data->replayFlag)
338 if (data->mutualFlag)
348 e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, PRIM, UT_BitString, &l);
355 decode_ContextFlags(const unsigned char *p, size_t len, ContextFlags * data, size_t * size)
357 size_t ret = 0, reallen;
361 memset(data, 0, sizeof(*data));
363 e = der_match_tag_and_length(p, len, ASN1_C_UNIV, PRIM, UT_BitString, &reallen, &l);
371 data->delegFlag = (*p >> 7) & 1;
372 data->mutualFlag = (*p >> 6) & 1;
373 data->replayFlag = (*p >> 5) & 1;
374 data->sequenceFlag = (*p >> 4) & 1;
375 data->anonFlag = (*p >> 3) & 1;
376 data->confFlag = (*p >> 2) & 1;
377 data->integFlag = (*p >> 1) & 1;
383 free_ContextFlags(data);
388 free_ContextFlags(ContextFlags * data)
393 /* unused function: length_ContextFlags */
396 /* unused function: copy_ContextFlags */
399 /* unused function: ContextFlags2int */
402 /* unused function: int2ContextFlags */
405 /* unused variable: ContextFlags_units */
407 /* unused function: asn1_ContextFlags_units */
409 /* Generated from spnego.asn1 */
414 encode_NegTokenInit(unsigned char *p, size_t len, const NegTokenInit * data, size_t * size)
420 if ((data)->mechListMIC) {
423 e = encode_octet_string(p, len, (data)->mechListMIC, &l);
425 e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 3, &l);
429 if ((data)->mechToken) {
432 e = encode_octet_string(p, len, (data)->mechToken, &l);
434 e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
438 if ((data)->reqFlags) {
441 e = encode_ContextFlags(p, len, (data)->reqFlags, &l);
443 e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
449 e = encode_MechTypeList(p, len, &(data)->mechTypes, &l);
451 e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
455 e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
462 decode_NegTokenInit(const unsigned char *p, size_t len, NegTokenInit * data, size_t * size)
464 size_t ret = 0, reallen;
468 memset(data, 0, sizeof(*data));
470 e = der_match_tag_and_length(p, len, ASN1_C_UNIV, CONS, UT_Sequence, &reallen, &l);
474 if ((dce_fix = fix_dce(reallen, &len)) < 0)
475 return ASN1_BAD_FORMAT;
477 size_t newlen, oldlen;
479 e = der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 0, &l);
486 e = der_get_length(p, len, &newlen, &l);
491 if ((dce_fix = fix_dce(newlen, &len)) < 0)
492 return ASN1_BAD_FORMAT;
493 e = decode_MechTypeList(p, len, &(data)->mechTypes, &l);
496 e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
499 len = oldlen - newlen;
504 size_t newlen, oldlen;
506 e = der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 1, &l);
508 (data)->reqFlags = NULL;
513 e = der_get_length(p, len, &newlen, &l);
518 if ((dce_fix = fix_dce(newlen, &len)) < 0)
519 return ASN1_BAD_FORMAT;
520 (data)->reqFlags = malloc(sizeof(*(data)->reqFlags));
521 if ((data)->reqFlags == NULL)
523 e = decode_ContextFlags(p, len, (data)->reqFlags, &l);
526 e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
529 len = oldlen - newlen;
534 size_t newlen, oldlen;
536 e = der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 2, &l);
538 (data)->mechToken = NULL;
543 e = der_get_length(p, len, &newlen, &l);
548 if ((dce_fix = fix_dce(newlen, &len)) < 0)
549 return ASN1_BAD_FORMAT;
550 (data)->mechToken = malloc(sizeof(*(data)->mechToken));
551 if ((data)->mechToken == NULL)
553 e = decode_octet_string(p, len, (data)->mechToken, &l);
556 e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
559 len = oldlen - newlen;
564 size_t newlen, oldlen;
566 e = der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 3, &l);
568 (data)->mechListMIC = NULL;
573 e = der_get_length(p, len, &newlen, &l);
578 if ((dce_fix = fix_dce(newlen, &len)) < 0)
579 return ASN1_BAD_FORMAT;
580 (data)->mechListMIC = malloc(sizeof(*(data)->mechListMIC));
581 if ((data)->mechListMIC == NULL)
583 e = decode_octet_string(p, len, (data)->mechListMIC, &l);
586 e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
589 len = oldlen - newlen;
594 e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
602 free_NegTokenInit(data);
607 free_NegTokenInit(NegTokenInit * data)
609 free_MechTypeList(&(data)->mechTypes);
610 if ((data)->reqFlags) {
611 free_ContextFlags((data)->reqFlags);
612 free((data)->reqFlags);
613 (data)->reqFlags = NULL;
615 if ((data)->mechToken) {
616 free_octet_string((data)->mechToken);
617 free((data)->mechToken);
618 (data)->mechToken = NULL;
620 if ((data)->mechListMIC) {
621 free_octet_string((data)->mechListMIC);
622 free((data)->mechListMIC);
623 (data)->mechListMIC = NULL;
627 /* unused function: length_NegTokenInit */
630 /* unused function: copy_NegTokenInit */
632 /* Generated from spnego.asn1 */
637 encode_NegTokenResp(unsigned char *p, size_t len, const NegTokenResp * data, size_t * size)
643 if ((data)->mechListMIC) {
646 e = encode_octet_string(p, len, (data)->mechListMIC, &l);
648 e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 3, &l);
652 if ((data)->responseToken) {
655 e = encode_octet_string(p, len, (data)->responseToken, &l);
657 e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
661 if ((data)->supportedMech) {
664 e = encode_MechType(p, len, (data)->supportedMech, &l);
666 e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
670 if ((data)->negState) {
673 e = encode_enumerated(p, len, (data)->negState, &l);
675 e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
679 e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
686 decode_NegTokenResp(const unsigned char *p, size_t len, NegTokenResp * data, size_t * size)
688 size_t ret = 0, reallen;
692 memset(data, 0, sizeof(*data));
694 e = der_match_tag_and_length(p, len, ASN1_C_UNIV, CONS, UT_Sequence, &reallen, &l);
698 if ((dce_fix = fix_dce(reallen, &len)) < 0)
699 return ASN1_BAD_FORMAT;
701 size_t newlen, oldlen;
703 e = der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 0, &l);
705 (data)->negState = NULL;
710 e = der_get_length(p, len, &newlen, &l);
715 if ((dce_fix = fix_dce(newlen, &len)) < 0)
716 return ASN1_BAD_FORMAT;
717 (data)->negState = malloc(sizeof(*(data)->negState));
718 if ((data)->negState == NULL)
720 e = decode_enumerated(p, len, (data)->negState, &l);
723 e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
726 len = oldlen - newlen;
731 size_t newlen, oldlen;
733 e = der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 1, &l);
735 (data)->supportedMech = NULL;
740 e = der_get_length(p, len, &newlen, &l);
745 if ((dce_fix = fix_dce(newlen, &len)) < 0)
746 return ASN1_BAD_FORMAT;
747 (data)->supportedMech = malloc(sizeof(*(data)->supportedMech));
748 if ((data)->supportedMech == NULL)
750 e = decode_MechType(p, len, (data)->supportedMech, &l);
753 e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
756 len = oldlen - newlen;
761 size_t newlen, oldlen;
763 e = der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 2, &l);
765 (data)->responseToken = NULL;
770 e = der_get_length(p, len, &newlen, &l);
775 if ((dce_fix = fix_dce(newlen, &len)) < 0)
776 return ASN1_BAD_FORMAT;
777 (data)->responseToken = malloc(sizeof(*(data)->responseToken));
778 if ((data)->responseToken == NULL)
780 e = decode_octet_string(p, len, (data)->responseToken, &l);
783 e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
786 len = oldlen - newlen;
791 size_t newlen, oldlen;
793 e = der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 3, &l);
795 (data)->mechListMIC = NULL;
800 e = der_get_length(p, len, &newlen, &l);
805 if ((dce_fix = fix_dce(newlen, &len)) < 0)
806 return ASN1_BAD_FORMAT;
807 (data)->mechListMIC = malloc(sizeof(*(data)->mechListMIC));
808 if ((data)->mechListMIC == NULL)
810 e = decode_octet_string(p, len, (data)->mechListMIC, &l);
813 e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
816 len = oldlen - newlen;
821 e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
829 free_NegTokenResp(data);
834 free_NegTokenResp(NegTokenResp * data)
836 if ((data)->negState) {
837 free((data)->negState);
838 (data)->negState = NULL;
840 if ((data)->supportedMech) {
841 free_MechType((data)->supportedMech);
842 free((data)->supportedMech);
843 (data)->supportedMech = NULL;
845 if ((data)->responseToken) {
846 free_octet_string((data)->responseToken);
847 free((data)->responseToken);
848 (data)->responseToken = NULL;
850 if ((data)->mechListMIC) {
851 free_octet_string((data)->mechListMIC);
852 free((data)->mechListMIC);
853 (data)->mechListMIC = NULL;
857 /* unused function: length_NegTokenResp */
860 /* unused function: copy_NegTokenResp */
862 /* Generated from spnego.asn1 */
867 /* unused variable: asn1_NegotiationToken_dummy_holder */