xref: /minix3/external/bsd/bind/dist/lib/dns/spnego_asn1.c (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
1*00b67f09SDavid van Moolenbroek /*	$NetBSD: spnego_asn1.c,v 1.7 2015/07/08 17:28:59 christos Exp $	*/
2*00b67f09SDavid van Moolenbroek 
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek  * Copyright (C) 2006, 2007, 2012, 2013, 2015  Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek  *
6*00b67f09SDavid van Moolenbroek  * Permission to use, copy, modify, and/or distribute this software for any
7*00b67f09SDavid van Moolenbroek  * purpose with or without fee is hereby granted, provided that the above
8*00b67f09SDavid van Moolenbroek  * copyright notice and this permission notice appear in all copies.
9*00b67f09SDavid van Moolenbroek  *
10*00b67f09SDavid van Moolenbroek  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
11*00b67f09SDavid van Moolenbroek  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
12*00b67f09SDavid van Moolenbroek  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
13*00b67f09SDavid van Moolenbroek  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
14*00b67f09SDavid van Moolenbroek  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
15*00b67f09SDavid van Moolenbroek  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16*00b67f09SDavid van Moolenbroek  * PERFORMANCE OF THIS SOFTWARE.
17*00b67f09SDavid van Moolenbroek  */
18*00b67f09SDavid van Moolenbroek 
19*00b67f09SDavid van Moolenbroek /* Id: spnego_asn1.c,v 1.4 2007/06/19 23:47:16 tbox Exp  */
20*00b67f09SDavid van Moolenbroek 
21*00b67f09SDavid van Moolenbroek /*! \file
22*00b67f09SDavid van Moolenbroek  * \brief Method routines generated from SPNEGO ASN.1 module.
23*00b67f09SDavid van Moolenbroek  * See spnego_asn1.pl for details.  Do not edit.
24*00b67f09SDavid van Moolenbroek  */
25*00b67f09SDavid van Moolenbroek 
26*00b67f09SDavid van Moolenbroek /* Generated from spnego.asn1 */
27*00b67f09SDavid van Moolenbroek /* Do not edit */
28*00b67f09SDavid van Moolenbroek 
29*00b67f09SDavid van Moolenbroek #ifndef __asn1_h__
30*00b67f09SDavid van Moolenbroek #define __asn1_h__
31*00b67f09SDavid van Moolenbroek 
32*00b67f09SDavid van Moolenbroek 
33*00b67f09SDavid van Moolenbroek #ifndef __asn1_common_definitions__
34*00b67f09SDavid van Moolenbroek #define __asn1_common_definitions__
35*00b67f09SDavid van Moolenbroek 
36*00b67f09SDavid van Moolenbroek typedef struct octet_string {
37*00b67f09SDavid van Moolenbroek 	size_t length;
38*00b67f09SDavid van Moolenbroek 	void *data;
39*00b67f09SDavid van Moolenbroek } octet_string;
40*00b67f09SDavid van Moolenbroek 
41*00b67f09SDavid van Moolenbroek typedef char *general_string;
42*00b67f09SDavid van Moolenbroek 
43*00b67f09SDavid van Moolenbroek typedef char *utf8_string;
44*00b67f09SDavid van Moolenbroek 
45*00b67f09SDavid van Moolenbroek typedef struct oid {
46*00b67f09SDavid van Moolenbroek 	size_t length;
47*00b67f09SDavid van Moolenbroek 	unsigned *components;
48*00b67f09SDavid van Moolenbroek } oid;
49*00b67f09SDavid van Moolenbroek 
50*00b67f09SDavid van Moolenbroek #define ASN1_MALLOC_ENCODE(T, B, BL, S, L, R)                  \
51*00b67f09SDavid van Moolenbroek   do {                                                         \
52*00b67f09SDavid van Moolenbroek     (BL) = length_##T((S));                                    \
53*00b67f09SDavid van Moolenbroek     (B) = malloc((BL));                                        \
54*00b67f09SDavid van Moolenbroek     if((B) == NULL) {                                          \
55*00b67f09SDavid van Moolenbroek       (R) = ENOMEM;                                            \
56*00b67f09SDavid van Moolenbroek     } else {                                                   \
57*00b67f09SDavid van Moolenbroek       (R) = encode_##T(((unsigned char*)(B)) + (BL) - 1, (BL), \
58*00b67f09SDavid van Moolenbroek 		       (S), (L));                              \
59*00b67f09SDavid van Moolenbroek       if((R) != 0) {                                           \
60*00b67f09SDavid van Moolenbroek 	free((B));                                             \
61*00b67f09SDavid van Moolenbroek 	(B) = NULL;                                            \
62*00b67f09SDavid van Moolenbroek       }                                                        \
63*00b67f09SDavid van Moolenbroek     }                                                          \
64*00b67f09SDavid van Moolenbroek   } while (/*CONSTCOND*/0)
65*00b67f09SDavid van Moolenbroek 
66*00b67f09SDavid van Moolenbroek #endif
67*00b67f09SDavid van Moolenbroek 
68*00b67f09SDavid van Moolenbroek /*
69*00b67f09SDavid van Moolenbroek  * MechType ::= OBJECT IDENTIFIER
70*00b67f09SDavid van Moolenbroek  */
71*00b67f09SDavid van Moolenbroek 
72*00b67f09SDavid van Moolenbroek typedef oid MechType;
73*00b67f09SDavid van Moolenbroek 
74*00b67f09SDavid van Moolenbroek static int encode_MechType(unsigned char *, size_t, const MechType *, size_t *);
75*00b67f09SDavid van Moolenbroek static int decode_MechType(const unsigned char *, size_t, MechType *, size_t *);
76*00b67f09SDavid van Moolenbroek static void free_MechType(MechType *);
77*00b67f09SDavid van Moolenbroek /* unused declaration: length_MechType */
78*00b67f09SDavid van Moolenbroek /* unused declaration: copy_MechType */
79*00b67f09SDavid van Moolenbroek 
80*00b67f09SDavid van Moolenbroek 
81*00b67f09SDavid van Moolenbroek /*
82*00b67f09SDavid van Moolenbroek  * MechTypeList ::= SEQUENCE OF MechType
83*00b67f09SDavid van Moolenbroek  */
84*00b67f09SDavid van Moolenbroek 
85*00b67f09SDavid van Moolenbroek typedef struct MechTypeList {
86*00b67f09SDavid van Moolenbroek 	unsigned int len;
87*00b67f09SDavid van Moolenbroek 	MechType *val;
88*00b67f09SDavid van Moolenbroek } MechTypeList;
89*00b67f09SDavid van Moolenbroek 
90*00b67f09SDavid van Moolenbroek static int encode_MechTypeList(unsigned char *, size_t, const MechTypeList *, size_t *);
91*00b67f09SDavid van Moolenbroek static int decode_MechTypeList(const unsigned char *, size_t, MechTypeList *, size_t *);
92*00b67f09SDavid van Moolenbroek static void free_MechTypeList(MechTypeList *);
93*00b67f09SDavid van Moolenbroek /* unused declaration: length_MechTypeList */
94*00b67f09SDavid van Moolenbroek /* unused declaration: copy_MechTypeList */
95*00b67f09SDavid van Moolenbroek 
96*00b67f09SDavid van Moolenbroek 
97*00b67f09SDavid van Moolenbroek /*
98*00b67f09SDavid van Moolenbroek  * ContextFlags ::= BIT STRING { delegFlag(0), mutualFlag(1), replayFlag(2),
99*00b67f09SDavid van Moolenbroek  * sequenceFlag(3), anonFlag(4), confFlag(5), integFlag(6) }
100*00b67f09SDavid van Moolenbroek  */
101*00b67f09SDavid van Moolenbroek 
102*00b67f09SDavid van Moolenbroek typedef struct ContextFlags {
103*00b67f09SDavid van Moolenbroek 	unsigned int delegFlag:1;
104*00b67f09SDavid van Moolenbroek 	unsigned int mutualFlag:1;
105*00b67f09SDavid van Moolenbroek 	unsigned int replayFlag:1;
106*00b67f09SDavid van Moolenbroek 	unsigned int sequenceFlag:1;
107*00b67f09SDavid van Moolenbroek 	unsigned int anonFlag:1;
108*00b67f09SDavid van Moolenbroek 	unsigned int confFlag:1;
109*00b67f09SDavid van Moolenbroek 	unsigned int integFlag:1;
110*00b67f09SDavid van Moolenbroek } ContextFlags;
111*00b67f09SDavid van Moolenbroek 
112*00b67f09SDavid van Moolenbroek 
113*00b67f09SDavid van Moolenbroek static int encode_ContextFlags(unsigned char *, size_t, const ContextFlags *, size_t *);
114*00b67f09SDavid van Moolenbroek static int decode_ContextFlags(const unsigned char *, size_t, ContextFlags *, size_t *);
115*00b67f09SDavid van Moolenbroek static void free_ContextFlags(ContextFlags *);
116*00b67f09SDavid van Moolenbroek /* unused declaration: length_ContextFlags */
117*00b67f09SDavid van Moolenbroek /* unused declaration: copy_ContextFlags */
118*00b67f09SDavid van Moolenbroek /* unused declaration: ContextFlags2int */
119*00b67f09SDavid van Moolenbroek /* unused declaration: int2ContextFlags */
120*00b67f09SDavid van Moolenbroek /* unused declaration: asn1_ContextFlags_units */
121*00b67f09SDavid van Moolenbroek 
122*00b67f09SDavid van Moolenbroek /*
123*00b67f09SDavid van Moolenbroek  * NegTokenInit ::= SEQUENCE { mechTypes[0]    MechTypeList, reqFlags[1]
124*00b67f09SDavid van Moolenbroek  * ContextFlags OPTIONAL, mechToken[2]    OCTET STRING OPTIONAL,
125*00b67f09SDavid van Moolenbroek  * mechListMIC[3]  OCTET STRING OPTIONAL }
126*00b67f09SDavid van Moolenbroek  */
127*00b67f09SDavid van Moolenbroek 
128*00b67f09SDavid van Moolenbroek typedef struct NegTokenInit {
129*00b67f09SDavid van Moolenbroek 	MechTypeList mechTypes;
130*00b67f09SDavid van Moolenbroek 	ContextFlags *reqFlags;
131*00b67f09SDavid van Moolenbroek 	octet_string *mechToken;
132*00b67f09SDavid van Moolenbroek 	octet_string *mechListMIC;
133*00b67f09SDavid van Moolenbroek } NegTokenInit;
134*00b67f09SDavid van Moolenbroek 
135*00b67f09SDavid van Moolenbroek static int encode_NegTokenInit(unsigned char *, size_t, const NegTokenInit *, size_t *);
136*00b67f09SDavid van Moolenbroek static int decode_NegTokenInit(const unsigned char *, size_t, NegTokenInit *, size_t *);
137*00b67f09SDavid van Moolenbroek static void free_NegTokenInit(NegTokenInit *);
138*00b67f09SDavid van Moolenbroek /* unused declaration: length_NegTokenInit */
139*00b67f09SDavid van Moolenbroek /* unused declaration: copy_NegTokenInit */
140*00b67f09SDavid van Moolenbroek 
141*00b67f09SDavid van Moolenbroek 
142*00b67f09SDavid van Moolenbroek /*
143*00b67f09SDavid van Moolenbroek  * NegTokenResp ::= SEQUENCE { negState[0]       ENUMERATED {
144*00b67f09SDavid van Moolenbroek  * accept-completed(0), accept-incomplete(1), reject(2), request-mic(3) }
145*00b67f09SDavid van Moolenbroek  * OPTIONAL, supportedMech[1]  MechType OPTIONAL, responseToken[2]  OCTET
146*00b67f09SDavid van Moolenbroek  * STRING OPTIONAL, mechListMIC[3]    OCTET STRING OPTIONAL }
147*00b67f09SDavid van Moolenbroek  */
148*00b67f09SDavid van Moolenbroek 
149*00b67f09SDavid van Moolenbroek typedef struct NegTokenResp {
150*00b67f09SDavid van Moolenbroek 	enum {
151*00b67f09SDavid van Moolenbroek 		accept_completed = 0,
152*00b67f09SDavid van Moolenbroek 		accept_incomplete = 1,
153*00b67f09SDavid van Moolenbroek 		reject = 2,
154*00b67f09SDavid van Moolenbroek 		request_mic = 3
155*00b67f09SDavid van Moolenbroek 	} *negState;
156*00b67f09SDavid van Moolenbroek 
157*00b67f09SDavid van Moolenbroek 	MechType *supportedMech;
158*00b67f09SDavid van Moolenbroek 	octet_string *responseToken;
159*00b67f09SDavid van Moolenbroek 	octet_string *mechListMIC;
160*00b67f09SDavid van Moolenbroek } NegTokenResp;
161*00b67f09SDavid van Moolenbroek 
162*00b67f09SDavid van Moolenbroek static int encode_NegTokenResp(unsigned char *, size_t, const NegTokenResp *, size_t *);
163*00b67f09SDavid van Moolenbroek static int decode_NegTokenResp(const unsigned char *, size_t, NegTokenResp *, size_t *);
164*00b67f09SDavid van Moolenbroek static void free_NegTokenResp(NegTokenResp *);
165*00b67f09SDavid van Moolenbroek /* unused declaration: length_NegTokenResp */
166*00b67f09SDavid van Moolenbroek /* unused declaration: copy_NegTokenResp */
167*00b67f09SDavid van Moolenbroek 
168*00b67f09SDavid van Moolenbroek 
169*00b67f09SDavid van Moolenbroek 
170*00b67f09SDavid van Moolenbroek 
171*00b67f09SDavid van Moolenbroek #endif				/* __asn1_h__ */
172*00b67f09SDavid van Moolenbroek /* Generated from spnego.asn1 */
173*00b67f09SDavid van Moolenbroek /* Do not edit */
174*00b67f09SDavid van Moolenbroek 
175*00b67f09SDavid van Moolenbroek 
176*00b67f09SDavid van Moolenbroek #define BACK if (e) return e; p -= l; len -= l; ret += l; POST(p); POST(len); POST(ret)
177*00b67f09SDavid van Moolenbroek 
178*00b67f09SDavid van Moolenbroek static int
encode_MechType(unsigned char * p,size_t len,const MechType * data,size_t * size)179*00b67f09SDavid van Moolenbroek encode_MechType(unsigned char *p, size_t len, const MechType * data, size_t * size)
180*00b67f09SDavid van Moolenbroek {
181*00b67f09SDavid van Moolenbroek 	size_t ret = 0;
182*00b67f09SDavid van Moolenbroek 	size_t l;
183*00b67f09SDavid van Moolenbroek 	int e;
184*00b67f09SDavid van Moolenbroek 
185*00b67f09SDavid van Moolenbroek 	e = encode_oid(p, len, data, &l);
186*00b67f09SDavid van Moolenbroek 	BACK;
187*00b67f09SDavid van Moolenbroek 	*size = ret;
188*00b67f09SDavid van Moolenbroek 	return 0;
189*00b67f09SDavid van Moolenbroek }
190*00b67f09SDavid van Moolenbroek 
191*00b67f09SDavid van Moolenbroek #define FORW if(e) goto fail; p += l; len -= l; ret += l; POST(p); POST(len); POST(ret)
192*00b67f09SDavid van Moolenbroek 
193*00b67f09SDavid van Moolenbroek static int
decode_MechType(const unsigned char * p,size_t len,MechType * data,size_t * size)194*00b67f09SDavid van Moolenbroek decode_MechType(const unsigned char *p, size_t len, MechType * data, size_t * size)
195*00b67f09SDavid van Moolenbroek {
196*00b67f09SDavid van Moolenbroek 	size_t ret = 0;
197*00b67f09SDavid van Moolenbroek 	size_t l;
198*00b67f09SDavid van Moolenbroek 	int e;
199*00b67f09SDavid van Moolenbroek 
200*00b67f09SDavid van Moolenbroek 	memset(data, 0, sizeof(*data));
201*00b67f09SDavid van Moolenbroek 	e = decode_oid(p, len, data, &l);
202*00b67f09SDavid van Moolenbroek 	FORW;
203*00b67f09SDavid van Moolenbroek 	if (size)
204*00b67f09SDavid van Moolenbroek 		*size = ret;
205*00b67f09SDavid van Moolenbroek 	return 0;
206*00b67f09SDavid van Moolenbroek fail:
207*00b67f09SDavid van Moolenbroek 	free_MechType(data);
208*00b67f09SDavid van Moolenbroek 	return e;
209*00b67f09SDavid van Moolenbroek }
210*00b67f09SDavid van Moolenbroek 
211*00b67f09SDavid van Moolenbroek static void
free_MechType(MechType * data)212*00b67f09SDavid van Moolenbroek free_MechType(MechType * data)
213*00b67f09SDavid van Moolenbroek {
214*00b67f09SDavid van Moolenbroek 	free_oid(data);
215*00b67f09SDavid van Moolenbroek }
216*00b67f09SDavid van Moolenbroek 
217*00b67f09SDavid van Moolenbroek /* unused function: length_MechType */
218*00b67f09SDavid van Moolenbroek 
219*00b67f09SDavid van Moolenbroek 
220*00b67f09SDavid van Moolenbroek /* unused function: copy_MechType */
221*00b67f09SDavid van Moolenbroek 
222*00b67f09SDavid van Moolenbroek /* Generated from spnego.asn1 */
223*00b67f09SDavid van Moolenbroek /* Do not edit */
224*00b67f09SDavid van Moolenbroek 
225*00b67f09SDavid van Moolenbroek 
226*00b67f09SDavid van Moolenbroek static int
encode_MechTypeList(unsigned char * p,size_t len,const MechTypeList * data,size_t * size)227*00b67f09SDavid van Moolenbroek encode_MechTypeList(unsigned char *p, size_t len, const MechTypeList * data, size_t * size)
228*00b67f09SDavid van Moolenbroek {
229*00b67f09SDavid van Moolenbroek 	size_t ret = 0;
230*00b67f09SDavid van Moolenbroek 	size_t l;
231*00b67f09SDavid van Moolenbroek 	int i, e;
232*00b67f09SDavid van Moolenbroek 
233*00b67f09SDavid van Moolenbroek 	for (i = (data)->len - 1; i >= 0; --i) {
234*00b67f09SDavid van Moolenbroek 		size_t oldret = ret;
235*00b67f09SDavid van Moolenbroek 		ret = 0;
236*00b67f09SDavid van Moolenbroek 		e = encode_MechType(p, len, &(data)->val[i], &l);
237*00b67f09SDavid van Moolenbroek 		BACK;
238*00b67f09SDavid van Moolenbroek 		ret += oldret;
239*00b67f09SDavid van Moolenbroek 	}
240*00b67f09SDavid van Moolenbroek 	e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
241*00b67f09SDavid van Moolenbroek 	BACK;
242*00b67f09SDavid van Moolenbroek 	*size = ret;
243*00b67f09SDavid van Moolenbroek 	return 0;
244*00b67f09SDavid van Moolenbroek }
245*00b67f09SDavid van Moolenbroek 
246*00b67f09SDavid van Moolenbroek static int
decode_MechTypeList(const unsigned char * p,size_t len,MechTypeList * data,size_t * size)247*00b67f09SDavid van Moolenbroek decode_MechTypeList(const unsigned char *p, size_t len, MechTypeList * data, size_t * size)
248*00b67f09SDavid van Moolenbroek {
249*00b67f09SDavid van Moolenbroek 	size_t ret = 0, reallen;
250*00b67f09SDavid van Moolenbroek 	size_t l;
251*00b67f09SDavid van Moolenbroek 	int e;
252*00b67f09SDavid van Moolenbroek 
253*00b67f09SDavid van Moolenbroek 	memset(data, 0, sizeof(*data));
254*00b67f09SDavid van Moolenbroek 	reallen = 0;
255*00b67f09SDavid van Moolenbroek 	e = der_match_tag_and_length(p, len, ASN1_C_UNIV, CONS, UT_Sequence, &reallen, &l);
256*00b67f09SDavid van Moolenbroek 	FORW;
257*00b67f09SDavid van Moolenbroek 	if (len < reallen)
258*00b67f09SDavid van Moolenbroek 		return ASN1_OVERRUN;
259*00b67f09SDavid van Moolenbroek 	len = reallen;
260*00b67f09SDavid van Moolenbroek 	{
261*00b67f09SDavid van Moolenbroek 		size_t origlen = len;
262*00b67f09SDavid van Moolenbroek 		size_t oldret = ret;
263*00b67f09SDavid van Moolenbroek 		ret = 0;
264*00b67f09SDavid van Moolenbroek 		(data)->len = 0;
265*00b67f09SDavid van Moolenbroek 		(data)->val = NULL;
266*00b67f09SDavid van Moolenbroek 		while (ret < origlen) {
267*00b67f09SDavid van Moolenbroek 			void *old = (data)->val;
268*00b67f09SDavid van Moolenbroek 			(data)->len++;
269*00b67f09SDavid van Moolenbroek 			(data)->val = realloc((data)->val, sizeof(*((data)->val)) * (data)->len);
270*00b67f09SDavid van Moolenbroek 			if ((data)->val == NULL) {
271*00b67f09SDavid van Moolenbroek 				(data)->val = old;
272*00b67f09SDavid van Moolenbroek 				(data)->len--;
273*00b67f09SDavid van Moolenbroek 				return ENOMEM;
274*00b67f09SDavid van Moolenbroek 			}
275*00b67f09SDavid van Moolenbroek 			e = decode_MechType(p, len, &(data)->val[(data)->len - 1], &l);
276*00b67f09SDavid van Moolenbroek 			FORW;
277*00b67f09SDavid van Moolenbroek 			len = origlen - ret;
278*00b67f09SDavid van Moolenbroek 		}
279*00b67f09SDavid van Moolenbroek 		ret += oldret;
280*00b67f09SDavid van Moolenbroek 	}
281*00b67f09SDavid van Moolenbroek 	if (size)
282*00b67f09SDavid van Moolenbroek 		*size = ret;
283*00b67f09SDavid van Moolenbroek 	return 0;
284*00b67f09SDavid van Moolenbroek fail:
285*00b67f09SDavid van Moolenbroek 	free_MechTypeList(data);
286*00b67f09SDavid van Moolenbroek 	return e;
287*00b67f09SDavid van Moolenbroek }
288*00b67f09SDavid van Moolenbroek 
289*00b67f09SDavid van Moolenbroek static void
free_MechTypeList(MechTypeList * data)290*00b67f09SDavid van Moolenbroek free_MechTypeList(MechTypeList * data)
291*00b67f09SDavid van Moolenbroek {
292*00b67f09SDavid van Moolenbroek 	while ((data)->len) {
293*00b67f09SDavid van Moolenbroek 		free_MechType(&(data)->val[(data)->len - 1]);
294*00b67f09SDavid van Moolenbroek 		(data)->len--;
295*00b67f09SDavid van Moolenbroek 	}
296*00b67f09SDavid van Moolenbroek 	free((data)->val);
297*00b67f09SDavid van Moolenbroek 	(data)->val = NULL;
298*00b67f09SDavid van Moolenbroek }
299*00b67f09SDavid van Moolenbroek 
300*00b67f09SDavid van Moolenbroek /* unused function: length_MechTypeList */
301*00b67f09SDavid van Moolenbroek 
302*00b67f09SDavid van Moolenbroek 
303*00b67f09SDavid van Moolenbroek /* unused function: copy_MechTypeList */
304*00b67f09SDavid van Moolenbroek 
305*00b67f09SDavid van Moolenbroek /* Generated from spnego.asn1 */
306*00b67f09SDavid van Moolenbroek /* Do not edit */
307*00b67f09SDavid van Moolenbroek 
308*00b67f09SDavid van Moolenbroek 
309*00b67f09SDavid van Moolenbroek static int
encode_ContextFlags(unsigned char * p,size_t len,const ContextFlags * data,size_t * size)310*00b67f09SDavid van Moolenbroek encode_ContextFlags(unsigned char *p, size_t len, const ContextFlags * data, size_t * size)
311*00b67f09SDavid van Moolenbroek {
312*00b67f09SDavid van Moolenbroek 	size_t ret = 0;
313*00b67f09SDavid van Moolenbroek 	size_t l;
314*00b67f09SDavid van Moolenbroek 	int e;
315*00b67f09SDavid van Moolenbroek 
316*00b67f09SDavid van Moolenbroek 	{
317*00b67f09SDavid van Moolenbroek 		unsigned char c = 0;
318*00b67f09SDavid van Moolenbroek 		*p-- = c;
319*00b67f09SDavid van Moolenbroek 		len--;
320*00b67f09SDavid van Moolenbroek 		ret++;
321*00b67f09SDavid van Moolenbroek 		c = 0;
322*00b67f09SDavid van Moolenbroek 		*p-- = c;
323*00b67f09SDavid van Moolenbroek 		len--;
324*00b67f09SDavid van Moolenbroek 		ret++;
325*00b67f09SDavid van Moolenbroek 		c = 0;
326*00b67f09SDavid van Moolenbroek 		*p-- = c;
327*00b67f09SDavid van Moolenbroek 		len--;
328*00b67f09SDavid van Moolenbroek 		ret++;
329*00b67f09SDavid van Moolenbroek 		c = 0;
330*00b67f09SDavid van Moolenbroek 		if (data->integFlag)
331*00b67f09SDavid van Moolenbroek 			c |= 1 << 1;
332*00b67f09SDavid van Moolenbroek 		if (data->confFlag)
333*00b67f09SDavid van Moolenbroek 			c |= 1 << 2;
334*00b67f09SDavid van Moolenbroek 		if (data->anonFlag)
335*00b67f09SDavid van Moolenbroek 			c |= 1 << 3;
336*00b67f09SDavid van Moolenbroek 		if (data->sequenceFlag)
337*00b67f09SDavid van Moolenbroek 			c |= 1 << 4;
338*00b67f09SDavid van Moolenbroek 		if (data->replayFlag)
339*00b67f09SDavid van Moolenbroek 			c |= 1 << 5;
340*00b67f09SDavid van Moolenbroek 		if (data->mutualFlag)
341*00b67f09SDavid van Moolenbroek 			c |= 1 << 6;
342*00b67f09SDavid van Moolenbroek 		if (data->delegFlag)
343*00b67f09SDavid van Moolenbroek 			c |= 1 << 7;
344*00b67f09SDavid van Moolenbroek 		*p-- = c;
345*00b67f09SDavid van Moolenbroek 		*p-- = 0;
346*00b67f09SDavid van Moolenbroek 		len -= 2;
347*00b67f09SDavid van Moolenbroek 		ret += 2;
348*00b67f09SDavid van Moolenbroek 	}
349*00b67f09SDavid van Moolenbroek 
350*00b67f09SDavid van Moolenbroek 	e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, PRIM, UT_BitString, &l);
351*00b67f09SDavid van Moolenbroek 	BACK;
352*00b67f09SDavid van Moolenbroek 	*size = ret;
353*00b67f09SDavid van Moolenbroek 	return 0;
354*00b67f09SDavid van Moolenbroek }
355*00b67f09SDavid van Moolenbroek 
356*00b67f09SDavid van Moolenbroek static int
decode_ContextFlags(const unsigned char * p,size_t len,ContextFlags * data,size_t * size)357*00b67f09SDavid van Moolenbroek decode_ContextFlags(const unsigned char *p, size_t len, ContextFlags * data, size_t * size)
358*00b67f09SDavid van Moolenbroek {
359*00b67f09SDavid van Moolenbroek 	size_t ret = 0, reallen;
360*00b67f09SDavid van Moolenbroek 	size_t l;
361*00b67f09SDavid van Moolenbroek 	int e;
362*00b67f09SDavid van Moolenbroek 
363*00b67f09SDavid van Moolenbroek 	memset(data, 0, sizeof(*data));
364*00b67f09SDavid van Moolenbroek 	reallen = 0;
365*00b67f09SDavid van Moolenbroek 	e = der_match_tag_and_length(p, len, ASN1_C_UNIV, PRIM, UT_BitString, &reallen, &l);
366*00b67f09SDavid van Moolenbroek 	FORW;
367*00b67f09SDavid van Moolenbroek 	if (len < reallen)
368*00b67f09SDavid van Moolenbroek 		return ASN1_OVERRUN;
369*00b67f09SDavid van Moolenbroek 	p++;
370*00b67f09SDavid van Moolenbroek 	len--;
371*00b67f09SDavid van Moolenbroek 	reallen--;
372*00b67f09SDavid van Moolenbroek 	ret++;
373*00b67f09SDavid van Moolenbroek 	data->delegFlag = (*p >> 7) & 1;
374*00b67f09SDavid van Moolenbroek 	data->mutualFlag = (*p >> 6) & 1;
375*00b67f09SDavid van Moolenbroek 	data->replayFlag = (*p >> 5) & 1;
376*00b67f09SDavid van Moolenbroek 	data->sequenceFlag = (*p >> 4) & 1;
377*00b67f09SDavid van Moolenbroek 	data->anonFlag = (*p >> 3) & 1;
378*00b67f09SDavid van Moolenbroek 	data->confFlag = (*p >> 2) & 1;
379*00b67f09SDavid van Moolenbroek 	data->integFlag = (*p >> 1) & 1;
380*00b67f09SDavid van Moolenbroek 	ret += reallen;
381*00b67f09SDavid van Moolenbroek 	if (size)
382*00b67f09SDavid van Moolenbroek 		*size = ret;
383*00b67f09SDavid van Moolenbroek 	return 0;
384*00b67f09SDavid van Moolenbroek fail:
385*00b67f09SDavid van Moolenbroek 	free_ContextFlags(data);
386*00b67f09SDavid van Moolenbroek 	return e;
387*00b67f09SDavid van Moolenbroek }
388*00b67f09SDavid van Moolenbroek 
389*00b67f09SDavid van Moolenbroek static void
free_ContextFlags(ContextFlags * data)390*00b67f09SDavid van Moolenbroek free_ContextFlags(ContextFlags * data)
391*00b67f09SDavid van Moolenbroek {
392*00b67f09SDavid van Moolenbroek 	(void)data;
393*00b67f09SDavid van Moolenbroek }
394*00b67f09SDavid van Moolenbroek 
395*00b67f09SDavid van Moolenbroek /* unused function: length_ContextFlags */
396*00b67f09SDavid van Moolenbroek 
397*00b67f09SDavid van Moolenbroek 
398*00b67f09SDavid van Moolenbroek /* unused function: copy_ContextFlags */
399*00b67f09SDavid van Moolenbroek 
400*00b67f09SDavid van Moolenbroek 
401*00b67f09SDavid van Moolenbroek /* unused function: ContextFlags2int */
402*00b67f09SDavid van Moolenbroek 
403*00b67f09SDavid van Moolenbroek 
404*00b67f09SDavid van Moolenbroek /* unused function: int2ContextFlags */
405*00b67f09SDavid van Moolenbroek 
406*00b67f09SDavid van Moolenbroek 
407*00b67f09SDavid van Moolenbroek /* unused variable: ContextFlags_units */
408*00b67f09SDavid van Moolenbroek 
409*00b67f09SDavid van Moolenbroek /* unused function: asn1_ContextFlags_units */
410*00b67f09SDavid van Moolenbroek 
411*00b67f09SDavid van Moolenbroek /* Generated from spnego.asn1 */
412*00b67f09SDavid van Moolenbroek /* Do not edit */
413*00b67f09SDavid van Moolenbroek 
414*00b67f09SDavid van Moolenbroek 
415*00b67f09SDavid van Moolenbroek static int
encode_NegTokenInit(unsigned char * p,size_t len,const NegTokenInit * data,size_t * size)416*00b67f09SDavid van Moolenbroek encode_NegTokenInit(unsigned char *p, size_t len, const NegTokenInit * data, size_t * size)
417*00b67f09SDavid van Moolenbroek {
418*00b67f09SDavid van Moolenbroek 	size_t ret = 0;
419*00b67f09SDavid van Moolenbroek 	size_t l;
420*00b67f09SDavid van Moolenbroek 	int e;
421*00b67f09SDavid van Moolenbroek 
422*00b67f09SDavid van Moolenbroek 	if ((data)->mechListMIC) {
423*00b67f09SDavid van Moolenbroek 		size_t oldret = ret;
424*00b67f09SDavid van Moolenbroek 		ret = 0;
425*00b67f09SDavid van Moolenbroek 		e = encode_octet_string(p, len, (data)->mechListMIC, &l);
426*00b67f09SDavid van Moolenbroek 		BACK;
427*00b67f09SDavid van Moolenbroek 		e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 3, &l);
428*00b67f09SDavid van Moolenbroek 		BACK;
429*00b67f09SDavid van Moolenbroek 		ret += oldret;
430*00b67f09SDavid van Moolenbroek 	}
431*00b67f09SDavid van Moolenbroek 	if ((data)->mechToken) {
432*00b67f09SDavid van Moolenbroek 		size_t oldret = ret;
433*00b67f09SDavid van Moolenbroek 		ret = 0;
434*00b67f09SDavid van Moolenbroek 		e = encode_octet_string(p, len, (data)->mechToken, &l);
435*00b67f09SDavid van Moolenbroek 		BACK;
436*00b67f09SDavid van Moolenbroek 		e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
437*00b67f09SDavid van Moolenbroek 		BACK;
438*00b67f09SDavid van Moolenbroek 		ret += oldret;
439*00b67f09SDavid van Moolenbroek 	}
440*00b67f09SDavid van Moolenbroek 	if ((data)->reqFlags) {
441*00b67f09SDavid van Moolenbroek 		size_t oldret = ret;
442*00b67f09SDavid van Moolenbroek 		ret = 0;
443*00b67f09SDavid van Moolenbroek 		e = encode_ContextFlags(p, len, (data)->reqFlags, &l);
444*00b67f09SDavid van Moolenbroek 		BACK;
445*00b67f09SDavid van Moolenbroek 		e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
446*00b67f09SDavid van Moolenbroek 		BACK;
447*00b67f09SDavid van Moolenbroek 		ret += oldret;
448*00b67f09SDavid van Moolenbroek 	} {
449*00b67f09SDavid van Moolenbroek 		size_t oldret = ret;
450*00b67f09SDavid van Moolenbroek 		ret = 0;
451*00b67f09SDavid van Moolenbroek 		e = encode_MechTypeList(p, len, &(data)->mechTypes, &l);
452*00b67f09SDavid van Moolenbroek 		BACK;
453*00b67f09SDavid van Moolenbroek 		e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
454*00b67f09SDavid van Moolenbroek 		BACK;
455*00b67f09SDavid van Moolenbroek 		ret += oldret;
456*00b67f09SDavid van Moolenbroek 	}
457*00b67f09SDavid van Moolenbroek 	e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
458*00b67f09SDavid van Moolenbroek 	BACK;
459*00b67f09SDavid van Moolenbroek 	*size = ret;
460*00b67f09SDavid van Moolenbroek 	return 0;
461*00b67f09SDavid van Moolenbroek }
462*00b67f09SDavid van Moolenbroek 
463*00b67f09SDavid van Moolenbroek static int
decode_NegTokenInit(const unsigned char * p,size_t len,NegTokenInit * data,size_t * size)464*00b67f09SDavid van Moolenbroek decode_NegTokenInit(const unsigned char *p, size_t len, NegTokenInit * data, size_t * size)
465*00b67f09SDavid van Moolenbroek {
466*00b67f09SDavid van Moolenbroek 	size_t ret = 0, reallen;
467*00b67f09SDavid van Moolenbroek 	size_t l;
468*00b67f09SDavid van Moolenbroek 	int e;
469*00b67f09SDavid van Moolenbroek 
470*00b67f09SDavid van Moolenbroek 	memset(data, 0, sizeof(*data));
471*00b67f09SDavid van Moolenbroek 	reallen = 0;
472*00b67f09SDavid van Moolenbroek 	e = der_match_tag_and_length(p, len, ASN1_C_UNIV, CONS, UT_Sequence, &reallen, &l);
473*00b67f09SDavid van Moolenbroek 	FORW;
474*00b67f09SDavid van Moolenbroek 	{
475*00b67f09SDavid van Moolenbroek 		int dce_fix;
476*00b67f09SDavid van Moolenbroek 		if ((dce_fix = fix_dce(reallen, &len)) < 0)
477*00b67f09SDavid van Moolenbroek 			return ASN1_BAD_FORMAT;
478*00b67f09SDavid van Moolenbroek 		{
479*00b67f09SDavid van Moolenbroek 			size_t newlen, oldlen;
480*00b67f09SDavid van Moolenbroek 
481*00b67f09SDavid van Moolenbroek 			e = der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 0, &l);
482*00b67f09SDavid van Moolenbroek 			if (e)
483*00b67f09SDavid van Moolenbroek 				return e;
484*00b67f09SDavid van Moolenbroek 			else {
485*00b67f09SDavid van Moolenbroek 				p += l;
486*00b67f09SDavid van Moolenbroek 				len -= l;
487*00b67f09SDavid van Moolenbroek 				ret += l;
488*00b67f09SDavid van Moolenbroek 				e = der_get_length(p, len, &newlen, &l);
489*00b67f09SDavid van Moolenbroek 				FORW;
490*00b67f09SDavid van Moolenbroek 				{
491*00b67f09SDavid van Moolenbroek 					int mydce_fix;
492*00b67f09SDavid van Moolenbroek 					oldlen = len;
493*00b67f09SDavid van Moolenbroek 					if ((mydce_fix = fix_dce(newlen, &len)) < 0)
494*00b67f09SDavid van Moolenbroek 						return ASN1_BAD_FORMAT;
495*00b67f09SDavid van Moolenbroek 					e = decode_MechTypeList(p, len, &(data)->mechTypes, &l);
496*00b67f09SDavid van Moolenbroek 					FORW;
497*00b67f09SDavid van Moolenbroek 					if (mydce_fix) {
498*00b67f09SDavid van Moolenbroek 						e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
499*00b67f09SDavid van Moolenbroek 						FORW;
500*00b67f09SDavid van Moolenbroek 					} else
501*00b67f09SDavid van Moolenbroek 						len = oldlen - newlen;
502*00b67f09SDavid van Moolenbroek 				}
503*00b67f09SDavid van Moolenbroek 			}
504*00b67f09SDavid van Moolenbroek 		}
505*00b67f09SDavid van Moolenbroek 		{
506*00b67f09SDavid van Moolenbroek 			size_t newlen, oldlen;
507*00b67f09SDavid van Moolenbroek 
508*00b67f09SDavid van Moolenbroek 			e = der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 1, &l);
509*00b67f09SDavid van Moolenbroek 			if (e)
510*00b67f09SDavid van Moolenbroek 				(data)->reqFlags = NULL;
511*00b67f09SDavid van Moolenbroek 			else {
512*00b67f09SDavid van Moolenbroek 				p += l;
513*00b67f09SDavid van Moolenbroek 				len -= l;
514*00b67f09SDavid van Moolenbroek 				ret += l;
515*00b67f09SDavid van Moolenbroek 				e = der_get_length(p, len, &newlen, &l);
516*00b67f09SDavid van Moolenbroek 				FORW;
517*00b67f09SDavid van Moolenbroek 				{
518*00b67f09SDavid van Moolenbroek 					int mydce_fix;
519*00b67f09SDavid van Moolenbroek 					oldlen = len;
520*00b67f09SDavid van Moolenbroek 					if ((mydce_fix = fix_dce(newlen, &len)) < 0)
521*00b67f09SDavid van Moolenbroek 						return ASN1_BAD_FORMAT;
522*00b67f09SDavid van Moolenbroek 					(data)->reqFlags = malloc(sizeof(*(data)->reqFlags));
523*00b67f09SDavid van Moolenbroek 					if ((data)->reqFlags == NULL)
524*00b67f09SDavid van Moolenbroek 						return ENOMEM;
525*00b67f09SDavid van Moolenbroek 					e = decode_ContextFlags(p, len, (data)->reqFlags, &l);
526*00b67f09SDavid van Moolenbroek 					FORW;
527*00b67f09SDavid van Moolenbroek 					if (mydce_fix) {
528*00b67f09SDavid van Moolenbroek 						e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
529*00b67f09SDavid van Moolenbroek 						FORW;
530*00b67f09SDavid van Moolenbroek 					} else
531*00b67f09SDavid van Moolenbroek 						len = oldlen - newlen;
532*00b67f09SDavid van Moolenbroek 				}
533*00b67f09SDavid van Moolenbroek 			}
534*00b67f09SDavid van Moolenbroek 		}
535*00b67f09SDavid van Moolenbroek 		{
536*00b67f09SDavid van Moolenbroek 			size_t newlen, oldlen;
537*00b67f09SDavid van Moolenbroek 
538*00b67f09SDavid van Moolenbroek 			e = der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 2, &l);
539*00b67f09SDavid van Moolenbroek 			if (e)
540*00b67f09SDavid van Moolenbroek 				(data)->mechToken = NULL;
541*00b67f09SDavid van Moolenbroek 			else {
542*00b67f09SDavid van Moolenbroek 				p += l;
543*00b67f09SDavid van Moolenbroek 				len -= l;
544*00b67f09SDavid van Moolenbroek 				ret += l;
545*00b67f09SDavid van Moolenbroek 				e = der_get_length(p, len, &newlen, &l);
546*00b67f09SDavid van Moolenbroek 				FORW;
547*00b67f09SDavid van Moolenbroek 				{
548*00b67f09SDavid van Moolenbroek 					int mydce_fix;
549*00b67f09SDavid van Moolenbroek 					oldlen = len;
550*00b67f09SDavid van Moolenbroek 					if ((mydce_fix = fix_dce(newlen, &len)) < 0)
551*00b67f09SDavid van Moolenbroek 						return ASN1_BAD_FORMAT;
552*00b67f09SDavid van Moolenbroek 					(data)->mechToken = malloc(sizeof(*(data)->mechToken));
553*00b67f09SDavid van Moolenbroek 					if ((data)->mechToken == NULL)
554*00b67f09SDavid van Moolenbroek 						return ENOMEM;
555*00b67f09SDavid van Moolenbroek 					e = decode_octet_string(p, len, (data)->mechToken, &l);
556*00b67f09SDavid van Moolenbroek 					FORW;
557*00b67f09SDavid van Moolenbroek 					if (mydce_fix) {
558*00b67f09SDavid van Moolenbroek 						e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
559*00b67f09SDavid van Moolenbroek 						FORW;
560*00b67f09SDavid van Moolenbroek 					} else
561*00b67f09SDavid van Moolenbroek 						len = oldlen - newlen;
562*00b67f09SDavid van Moolenbroek 				}
563*00b67f09SDavid van Moolenbroek 			}
564*00b67f09SDavid van Moolenbroek 		}
565*00b67f09SDavid van Moolenbroek 		{
566*00b67f09SDavid van Moolenbroek 			size_t newlen, oldlen;
567*00b67f09SDavid van Moolenbroek 
568*00b67f09SDavid van Moolenbroek 			e = der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 3, &l);
569*00b67f09SDavid van Moolenbroek 			if (e)
570*00b67f09SDavid van Moolenbroek 				(data)->mechListMIC = NULL;
571*00b67f09SDavid van Moolenbroek 			else {
572*00b67f09SDavid van Moolenbroek 				p += l;
573*00b67f09SDavid van Moolenbroek 				len -= l;
574*00b67f09SDavid van Moolenbroek 				ret += l;
575*00b67f09SDavid van Moolenbroek 				e = der_get_length(p, len, &newlen, &l);
576*00b67f09SDavid van Moolenbroek 				FORW;
577*00b67f09SDavid van Moolenbroek 				{
578*00b67f09SDavid van Moolenbroek 					int mydce_fix;
579*00b67f09SDavid van Moolenbroek 					oldlen = len;
580*00b67f09SDavid van Moolenbroek 					if ((mydce_fix = fix_dce(newlen, &len)) < 0)
581*00b67f09SDavid van Moolenbroek 						return ASN1_BAD_FORMAT;
582*00b67f09SDavid van Moolenbroek 					(data)->mechListMIC = malloc(sizeof(*(data)->mechListMIC));
583*00b67f09SDavid van Moolenbroek 					if ((data)->mechListMIC == NULL)
584*00b67f09SDavid van Moolenbroek 						return ENOMEM;
585*00b67f09SDavid van Moolenbroek 					e = decode_octet_string(p, len, (data)->mechListMIC, &l);
586*00b67f09SDavid van Moolenbroek 					FORW;
587*00b67f09SDavid van Moolenbroek 					if (mydce_fix) {
588*00b67f09SDavid van Moolenbroek 						e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
589*00b67f09SDavid van Moolenbroek 						FORW;
590*00b67f09SDavid van Moolenbroek 					} else
591*00b67f09SDavid van Moolenbroek 						len = oldlen - newlen;
592*00b67f09SDavid van Moolenbroek 				}
593*00b67f09SDavid van Moolenbroek 			}
594*00b67f09SDavid van Moolenbroek 		}
595*00b67f09SDavid van Moolenbroek 		if (dce_fix) {
596*00b67f09SDavid van Moolenbroek 			e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
597*00b67f09SDavid van Moolenbroek 			FORW;
598*00b67f09SDavid van Moolenbroek 		}
599*00b67f09SDavid van Moolenbroek 	}
600*00b67f09SDavid van Moolenbroek 	if (size)
601*00b67f09SDavid van Moolenbroek 		*size = ret;
602*00b67f09SDavid van Moolenbroek 	return 0;
603*00b67f09SDavid van Moolenbroek fail:
604*00b67f09SDavid van Moolenbroek 	free_NegTokenInit(data);
605*00b67f09SDavid van Moolenbroek 	return e;
606*00b67f09SDavid van Moolenbroek }
607*00b67f09SDavid van Moolenbroek 
608*00b67f09SDavid van Moolenbroek static void
free_NegTokenInit(NegTokenInit * data)609*00b67f09SDavid van Moolenbroek free_NegTokenInit(NegTokenInit * data)
610*00b67f09SDavid van Moolenbroek {
611*00b67f09SDavid van Moolenbroek 	free_MechTypeList(&(data)->mechTypes);
612*00b67f09SDavid van Moolenbroek 	if ((data)->reqFlags) {
613*00b67f09SDavid van Moolenbroek 		free_ContextFlags((data)->reqFlags);
614*00b67f09SDavid van Moolenbroek 		free((data)->reqFlags);
615*00b67f09SDavid van Moolenbroek 		(data)->reqFlags = NULL;
616*00b67f09SDavid van Moolenbroek 	}
617*00b67f09SDavid van Moolenbroek 	if ((data)->mechToken) {
618*00b67f09SDavid van Moolenbroek 		free_octet_string((data)->mechToken);
619*00b67f09SDavid van Moolenbroek 		free((data)->mechToken);
620*00b67f09SDavid van Moolenbroek 		(data)->mechToken = NULL;
621*00b67f09SDavid van Moolenbroek 	}
622*00b67f09SDavid van Moolenbroek 	if ((data)->mechListMIC) {
623*00b67f09SDavid van Moolenbroek 		free_octet_string((data)->mechListMIC);
624*00b67f09SDavid van Moolenbroek 		free((data)->mechListMIC);
625*00b67f09SDavid van Moolenbroek 		(data)->mechListMIC = NULL;
626*00b67f09SDavid van Moolenbroek 	}
627*00b67f09SDavid van Moolenbroek }
628*00b67f09SDavid van Moolenbroek 
629*00b67f09SDavid van Moolenbroek /* unused function: length_NegTokenInit */
630*00b67f09SDavid van Moolenbroek 
631*00b67f09SDavid van Moolenbroek 
632*00b67f09SDavid van Moolenbroek /* unused function: copy_NegTokenInit */
633*00b67f09SDavid van Moolenbroek 
634*00b67f09SDavid van Moolenbroek /* Generated from spnego.asn1 */
635*00b67f09SDavid van Moolenbroek /* Do not edit */
636*00b67f09SDavid van Moolenbroek 
637*00b67f09SDavid van Moolenbroek 
638*00b67f09SDavid van Moolenbroek static int
encode_NegTokenResp(unsigned char * p,size_t len,const NegTokenResp * data,size_t * size)639*00b67f09SDavid van Moolenbroek encode_NegTokenResp(unsigned char *p, size_t len, const NegTokenResp * data, size_t * size)
640*00b67f09SDavid van Moolenbroek {
641*00b67f09SDavid van Moolenbroek 	size_t ret = 0;
642*00b67f09SDavid van Moolenbroek 	size_t l;
643*00b67f09SDavid van Moolenbroek 	int e;
644*00b67f09SDavid van Moolenbroek 
645*00b67f09SDavid van Moolenbroek 	if ((data)->mechListMIC) {
646*00b67f09SDavid van Moolenbroek 		size_t oldret = ret;
647*00b67f09SDavid van Moolenbroek 		ret = 0;
648*00b67f09SDavid van Moolenbroek 		e = encode_octet_string(p, len, (data)->mechListMIC, &l);
649*00b67f09SDavid van Moolenbroek 		BACK;
650*00b67f09SDavid van Moolenbroek 		e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 3, &l);
651*00b67f09SDavid van Moolenbroek 		BACK;
652*00b67f09SDavid van Moolenbroek 		ret += oldret;
653*00b67f09SDavid van Moolenbroek 	}
654*00b67f09SDavid van Moolenbroek 	if ((data)->responseToken) {
655*00b67f09SDavid van Moolenbroek 		size_t oldret = ret;
656*00b67f09SDavid van Moolenbroek 		ret = 0;
657*00b67f09SDavid van Moolenbroek 		e = encode_octet_string(p, len, (data)->responseToken, &l);
658*00b67f09SDavid van Moolenbroek 		BACK;
659*00b67f09SDavid van Moolenbroek 		e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 2, &l);
660*00b67f09SDavid van Moolenbroek 		BACK;
661*00b67f09SDavid van Moolenbroek 		ret += oldret;
662*00b67f09SDavid van Moolenbroek 	}
663*00b67f09SDavid van Moolenbroek 	if ((data)->supportedMech) {
664*00b67f09SDavid van Moolenbroek 		size_t oldret = ret;
665*00b67f09SDavid van Moolenbroek 		ret = 0;
666*00b67f09SDavid van Moolenbroek 		e = encode_MechType(p, len, (data)->supportedMech, &l);
667*00b67f09SDavid van Moolenbroek 		BACK;
668*00b67f09SDavid van Moolenbroek 		e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 1, &l);
669*00b67f09SDavid van Moolenbroek 		BACK;
670*00b67f09SDavid van Moolenbroek 		ret += oldret;
671*00b67f09SDavid van Moolenbroek 	}
672*00b67f09SDavid van Moolenbroek 	if ((data)->negState) {
673*00b67f09SDavid van Moolenbroek 		size_t oldret = ret;
674*00b67f09SDavid van Moolenbroek 		ret = 0;
675*00b67f09SDavid van Moolenbroek 		e = encode_enumerated(p, len, (data)->negState, &l);
676*00b67f09SDavid van Moolenbroek 		BACK;
677*00b67f09SDavid van Moolenbroek 		e = der_put_length_and_tag(p, len, ret, ASN1_C_CONTEXT, CONS, 0, &l);
678*00b67f09SDavid van Moolenbroek 		BACK;
679*00b67f09SDavid van Moolenbroek 		ret += oldret;
680*00b67f09SDavid van Moolenbroek 	}
681*00b67f09SDavid van Moolenbroek 	e = der_put_length_and_tag(p, len, ret, ASN1_C_UNIV, CONS, UT_Sequence, &l);
682*00b67f09SDavid van Moolenbroek 	BACK;
683*00b67f09SDavid van Moolenbroek 	*size = ret;
684*00b67f09SDavid van Moolenbroek 	return 0;
685*00b67f09SDavid van Moolenbroek }
686*00b67f09SDavid van Moolenbroek 
687*00b67f09SDavid van Moolenbroek static int
decode_NegTokenResp(const unsigned char * p,size_t len,NegTokenResp * data,size_t * size)688*00b67f09SDavid van Moolenbroek decode_NegTokenResp(const unsigned char *p, size_t len, NegTokenResp * data, size_t * size)
689*00b67f09SDavid van Moolenbroek {
690*00b67f09SDavid van Moolenbroek 	size_t ret = 0, reallen;
691*00b67f09SDavid van Moolenbroek 	size_t l;
692*00b67f09SDavid van Moolenbroek 	int e;
693*00b67f09SDavid van Moolenbroek 
694*00b67f09SDavid van Moolenbroek 	memset(data, 0, sizeof(*data));
695*00b67f09SDavid van Moolenbroek 	reallen = 0;
696*00b67f09SDavid van Moolenbroek 	e = der_match_tag_and_length(p, len, ASN1_C_UNIV, CONS, UT_Sequence, &reallen, &l);
697*00b67f09SDavid van Moolenbroek 	FORW;
698*00b67f09SDavid van Moolenbroek 	{
699*00b67f09SDavid van Moolenbroek 		int dce_fix;
700*00b67f09SDavid van Moolenbroek 		if ((dce_fix = fix_dce(reallen, &len)) < 0)
701*00b67f09SDavid van Moolenbroek 			return ASN1_BAD_FORMAT;
702*00b67f09SDavid van Moolenbroek 		{
703*00b67f09SDavid van Moolenbroek 			size_t newlen, oldlen;
704*00b67f09SDavid van Moolenbroek 
705*00b67f09SDavid van Moolenbroek 			e = der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 0, &l);
706*00b67f09SDavid van Moolenbroek 			if (e)
707*00b67f09SDavid van Moolenbroek 				(data)->negState = NULL;
708*00b67f09SDavid van Moolenbroek 			else {
709*00b67f09SDavid van Moolenbroek 				p += l;
710*00b67f09SDavid van Moolenbroek 				len -= l;
711*00b67f09SDavid van Moolenbroek 				ret += l;
712*00b67f09SDavid van Moolenbroek 				e = der_get_length(p, len, &newlen, &l);
713*00b67f09SDavid van Moolenbroek 				FORW;
714*00b67f09SDavid van Moolenbroek 				{
715*00b67f09SDavid van Moolenbroek 					int mydce_fix;
716*00b67f09SDavid van Moolenbroek 					oldlen = len;
717*00b67f09SDavid van Moolenbroek 					if ((mydce_fix = fix_dce(newlen, &len)) < 0)
718*00b67f09SDavid van Moolenbroek 						return ASN1_BAD_FORMAT;
719*00b67f09SDavid van Moolenbroek 					(data)->negState = malloc(sizeof(*(data)->negState));
720*00b67f09SDavid van Moolenbroek 					if ((data)->negState == NULL)
721*00b67f09SDavid van Moolenbroek 						return ENOMEM;
722*00b67f09SDavid van Moolenbroek 					e = decode_enumerated(p, len, (data)->negState, &l);
723*00b67f09SDavid van Moolenbroek 					FORW;
724*00b67f09SDavid van Moolenbroek 					if (mydce_fix) {
725*00b67f09SDavid van Moolenbroek 						e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
726*00b67f09SDavid van Moolenbroek 						FORW;
727*00b67f09SDavid van Moolenbroek 					} else
728*00b67f09SDavid van Moolenbroek 						len = oldlen - newlen;
729*00b67f09SDavid van Moolenbroek 				}
730*00b67f09SDavid van Moolenbroek 			}
731*00b67f09SDavid van Moolenbroek 		}
732*00b67f09SDavid van Moolenbroek 		{
733*00b67f09SDavid van Moolenbroek 			size_t newlen, oldlen;
734*00b67f09SDavid van Moolenbroek 
735*00b67f09SDavid van Moolenbroek 			e = der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 1, &l);
736*00b67f09SDavid van Moolenbroek 			if (e)
737*00b67f09SDavid van Moolenbroek 				(data)->supportedMech = NULL;
738*00b67f09SDavid van Moolenbroek 			else {
739*00b67f09SDavid van Moolenbroek 				p += l;
740*00b67f09SDavid van Moolenbroek 				len -= l;
741*00b67f09SDavid van Moolenbroek 				ret += l;
742*00b67f09SDavid van Moolenbroek 				e = der_get_length(p, len, &newlen, &l);
743*00b67f09SDavid van Moolenbroek 				FORW;
744*00b67f09SDavid van Moolenbroek 				{
745*00b67f09SDavid van Moolenbroek 					int mydce_fix;
746*00b67f09SDavid van Moolenbroek 					oldlen = len;
747*00b67f09SDavid van Moolenbroek 					if ((mydce_fix = fix_dce(newlen, &len)) < 0)
748*00b67f09SDavid van Moolenbroek 						return ASN1_BAD_FORMAT;
749*00b67f09SDavid van Moolenbroek 					(data)->supportedMech = malloc(sizeof(*(data)->supportedMech));
750*00b67f09SDavid van Moolenbroek 					if ((data)->supportedMech == NULL)
751*00b67f09SDavid van Moolenbroek 						return ENOMEM;
752*00b67f09SDavid van Moolenbroek 					e = decode_MechType(p, len, (data)->supportedMech, &l);
753*00b67f09SDavid van Moolenbroek 					FORW;
754*00b67f09SDavid van Moolenbroek 					if (mydce_fix) {
755*00b67f09SDavid van Moolenbroek 						e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
756*00b67f09SDavid van Moolenbroek 						FORW;
757*00b67f09SDavid van Moolenbroek 					} else
758*00b67f09SDavid van Moolenbroek 						len = oldlen - newlen;
759*00b67f09SDavid van Moolenbroek 				}
760*00b67f09SDavid van Moolenbroek 			}
761*00b67f09SDavid van Moolenbroek 		}
762*00b67f09SDavid van Moolenbroek 		{
763*00b67f09SDavid van Moolenbroek 			size_t newlen, oldlen;
764*00b67f09SDavid van Moolenbroek 
765*00b67f09SDavid van Moolenbroek 			e = der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 2, &l);
766*00b67f09SDavid van Moolenbroek 			if (e)
767*00b67f09SDavid van Moolenbroek 				(data)->responseToken = NULL;
768*00b67f09SDavid van Moolenbroek 			else {
769*00b67f09SDavid van Moolenbroek 				p += l;
770*00b67f09SDavid van Moolenbroek 				len -= l;
771*00b67f09SDavid van Moolenbroek 				ret += l;
772*00b67f09SDavid van Moolenbroek 				e = der_get_length(p, len, &newlen, &l);
773*00b67f09SDavid van Moolenbroek 				FORW;
774*00b67f09SDavid van Moolenbroek 				{
775*00b67f09SDavid van Moolenbroek 					int mydce_fix;
776*00b67f09SDavid van Moolenbroek 					oldlen = len;
777*00b67f09SDavid van Moolenbroek 					if ((mydce_fix = fix_dce(newlen, &len)) < 0)
778*00b67f09SDavid van Moolenbroek 						return ASN1_BAD_FORMAT;
779*00b67f09SDavid van Moolenbroek 					(data)->responseToken = malloc(sizeof(*(data)->responseToken));
780*00b67f09SDavid van Moolenbroek 					if ((data)->responseToken == NULL)
781*00b67f09SDavid van Moolenbroek 						return ENOMEM;
782*00b67f09SDavid van Moolenbroek 					e = decode_octet_string(p, len, (data)->responseToken, &l);
783*00b67f09SDavid van Moolenbroek 					FORW;
784*00b67f09SDavid van Moolenbroek 					if (mydce_fix) {
785*00b67f09SDavid van Moolenbroek 						e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
786*00b67f09SDavid van Moolenbroek 						FORW;
787*00b67f09SDavid van Moolenbroek 					} else
788*00b67f09SDavid van Moolenbroek 						len = oldlen - newlen;
789*00b67f09SDavid van Moolenbroek 				}
790*00b67f09SDavid van Moolenbroek 			}
791*00b67f09SDavid van Moolenbroek 		}
792*00b67f09SDavid van Moolenbroek 		{
793*00b67f09SDavid van Moolenbroek 			size_t newlen, oldlen;
794*00b67f09SDavid van Moolenbroek 
795*00b67f09SDavid van Moolenbroek 			e = der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 3, &l);
796*00b67f09SDavid van Moolenbroek 			if (e)
797*00b67f09SDavid van Moolenbroek 				(data)->mechListMIC = NULL;
798*00b67f09SDavid van Moolenbroek 			else {
799*00b67f09SDavid van Moolenbroek 				p += l;
800*00b67f09SDavid van Moolenbroek 				len -= l;
801*00b67f09SDavid van Moolenbroek 				ret += l;
802*00b67f09SDavid van Moolenbroek 				e = der_get_length(p, len, &newlen, &l);
803*00b67f09SDavid van Moolenbroek 				FORW;
804*00b67f09SDavid van Moolenbroek 				{
805*00b67f09SDavid van Moolenbroek 					int mydce_fix;
806*00b67f09SDavid van Moolenbroek 					oldlen = len;
807*00b67f09SDavid van Moolenbroek 					if ((mydce_fix = fix_dce(newlen, &len)) < 0)
808*00b67f09SDavid van Moolenbroek 						return ASN1_BAD_FORMAT;
809*00b67f09SDavid van Moolenbroek 					(data)->mechListMIC = malloc(sizeof(*(data)->mechListMIC));
810*00b67f09SDavid van Moolenbroek 					if ((data)->mechListMIC == NULL)
811*00b67f09SDavid van Moolenbroek 						return ENOMEM;
812*00b67f09SDavid van Moolenbroek 					e = decode_octet_string(p, len, (data)->mechListMIC, &l);
813*00b67f09SDavid van Moolenbroek 					FORW;
814*00b67f09SDavid van Moolenbroek 					if (mydce_fix) {
815*00b67f09SDavid van Moolenbroek 						e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
816*00b67f09SDavid van Moolenbroek 						FORW;
817*00b67f09SDavid van Moolenbroek 					} else
818*00b67f09SDavid van Moolenbroek 						len = oldlen - newlen;
819*00b67f09SDavid van Moolenbroek 				}
820*00b67f09SDavid van Moolenbroek 			}
821*00b67f09SDavid van Moolenbroek 		}
822*00b67f09SDavid van Moolenbroek 		if (dce_fix) {
823*00b67f09SDavid van Moolenbroek 			e = der_match_tag_and_length(p, len, (Der_class) 0, (Der_type) 0, 0, &reallen, &l);
824*00b67f09SDavid van Moolenbroek 			FORW;
825*00b67f09SDavid van Moolenbroek 		}
826*00b67f09SDavid van Moolenbroek 	}
827*00b67f09SDavid van Moolenbroek 	if (size)
828*00b67f09SDavid van Moolenbroek 		*size = ret;
829*00b67f09SDavid van Moolenbroek 	return 0;
830*00b67f09SDavid van Moolenbroek fail:
831*00b67f09SDavid van Moolenbroek 	free_NegTokenResp(data);
832*00b67f09SDavid van Moolenbroek 	return e;
833*00b67f09SDavid van Moolenbroek }
834*00b67f09SDavid van Moolenbroek 
835*00b67f09SDavid van Moolenbroek static void
free_NegTokenResp(NegTokenResp * data)836*00b67f09SDavid van Moolenbroek free_NegTokenResp(NegTokenResp * data)
837*00b67f09SDavid van Moolenbroek {
838*00b67f09SDavid van Moolenbroek 	if ((data)->negState) {
839*00b67f09SDavid van Moolenbroek 		free((data)->negState);
840*00b67f09SDavid van Moolenbroek 		(data)->negState = NULL;
841*00b67f09SDavid van Moolenbroek 	}
842*00b67f09SDavid van Moolenbroek 	if ((data)->supportedMech) {
843*00b67f09SDavid van Moolenbroek 		free_MechType((data)->supportedMech);
844*00b67f09SDavid van Moolenbroek 		free((data)->supportedMech);
845*00b67f09SDavid van Moolenbroek 		(data)->supportedMech = NULL;
846*00b67f09SDavid van Moolenbroek 	}
847*00b67f09SDavid van Moolenbroek 	if ((data)->responseToken) {
848*00b67f09SDavid van Moolenbroek 		free_octet_string((data)->responseToken);
849*00b67f09SDavid van Moolenbroek 		free((data)->responseToken);
850*00b67f09SDavid van Moolenbroek 		(data)->responseToken = NULL;
851*00b67f09SDavid van Moolenbroek 	}
852*00b67f09SDavid van Moolenbroek 	if ((data)->mechListMIC) {
853*00b67f09SDavid van Moolenbroek 		free_octet_string((data)->mechListMIC);
854*00b67f09SDavid van Moolenbroek 		free((data)->mechListMIC);
855*00b67f09SDavid van Moolenbroek 		(data)->mechListMIC = NULL;
856*00b67f09SDavid van Moolenbroek 	}
857*00b67f09SDavid van Moolenbroek }
858*00b67f09SDavid van Moolenbroek 
859*00b67f09SDavid van Moolenbroek /* unused function: length_NegTokenResp */
860*00b67f09SDavid van Moolenbroek 
861*00b67f09SDavid van Moolenbroek 
862*00b67f09SDavid van Moolenbroek /* unused function: copy_NegTokenResp */
863*00b67f09SDavid van Moolenbroek 
864*00b67f09SDavid van Moolenbroek /* Generated from spnego.asn1 */
865*00b67f09SDavid van Moolenbroek /* Do not edit */
866*00b67f09SDavid van Moolenbroek 
867*00b67f09SDavid van Moolenbroek 
868*00b67f09SDavid van Moolenbroek /* CHOICE */
869*00b67f09SDavid van Moolenbroek /* unused variable: asn1_NegotiationToken_dummy_holder */
870