xref: /aosp_15_r20/external/curl/tests/libtest/stub_gssapi.c (revision 6236dae45794135f37c4eb022389c904c8b0090d)
1*6236dae4SAndroid Build Coastguard Worker /***************************************************************************
2*6236dae4SAndroid Build Coastguard Worker  *                                  _   _ ____  _
3*6236dae4SAndroid Build Coastguard Worker  *  Project                     ___| | | |  _ \| |
4*6236dae4SAndroid Build Coastguard Worker  *                             / __| | | | |_) | |
5*6236dae4SAndroid Build Coastguard Worker  *                            | (__| |_| |  _ <| |___
6*6236dae4SAndroid Build Coastguard Worker  *                             \___|\___/|_| \_\_____|
7*6236dae4SAndroid Build Coastguard Worker  *
8*6236dae4SAndroid Build Coastguard Worker  * Copyright (C) Daniel Stenberg, <[email protected]>, et al.
9*6236dae4SAndroid Build Coastguard Worker  *
10*6236dae4SAndroid Build Coastguard Worker  * This software is licensed as described in the file COPYING, which
11*6236dae4SAndroid Build Coastguard Worker  * you should have received as part of this distribution. The terms
12*6236dae4SAndroid Build Coastguard Worker  * are also available at https://curl.se/docs/copyright.html.
13*6236dae4SAndroid Build Coastguard Worker  *
14*6236dae4SAndroid Build Coastguard Worker  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15*6236dae4SAndroid Build Coastguard Worker  * copies of the Software, and permit persons to whom the Software is
16*6236dae4SAndroid Build Coastguard Worker  * furnished to do so, under the terms of the COPYING file.
17*6236dae4SAndroid Build Coastguard Worker  *
18*6236dae4SAndroid Build Coastguard Worker  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19*6236dae4SAndroid Build Coastguard Worker  * KIND, either express or implied.
20*6236dae4SAndroid Build Coastguard Worker  *
21*6236dae4SAndroid Build Coastguard Worker  * SPDX-License-Identifier: curl
22*6236dae4SAndroid Build Coastguard Worker  *
23*6236dae4SAndroid Build Coastguard Worker  ***************************************************************************/
24*6236dae4SAndroid Build Coastguard Worker 
25*6236dae4SAndroid Build Coastguard Worker /* Only provides the bare minimum to link with libcurl */
26*6236dae4SAndroid Build Coastguard Worker 
27*6236dae4SAndroid Build Coastguard Worker #include <stdio.h>
28*6236dae4SAndroid Build Coastguard Worker #include <stdlib.h>
29*6236dae4SAndroid Build Coastguard Worker #include <string.h>
30*6236dae4SAndroid Build Coastguard Worker 
31*6236dae4SAndroid Build Coastguard Worker #include "stub_gssapi.h"
32*6236dae4SAndroid Build Coastguard Worker 
33*6236dae4SAndroid Build Coastguard Worker /* !checksrc! disable SNPRINTF all */
34*6236dae4SAndroid Build Coastguard Worker 
35*6236dae4SAndroid Build Coastguard Worker #define MAX_CREDS_LENGTH 250
36*6236dae4SAndroid Build Coastguard Worker #define APPROX_TOKEN_LEN 250
37*6236dae4SAndroid Build Coastguard Worker 
38*6236dae4SAndroid Build Coastguard Worker enum min_err_code {
39*6236dae4SAndroid Build Coastguard Worker     GSS_OK = 0,
40*6236dae4SAndroid Build Coastguard Worker     GSS_NO_MEMORY,
41*6236dae4SAndroid Build Coastguard Worker     GSS_INVALID_ARGS,
42*6236dae4SAndroid Build Coastguard Worker     GSS_INVALID_CREDS,
43*6236dae4SAndroid Build Coastguard Worker     GSS_INVALID_CTX,
44*6236dae4SAndroid Build Coastguard Worker     GSS_SERVER_ERR,
45*6236dae4SAndroid Build Coastguard Worker     GSS_NO_MECH,
46*6236dae4SAndroid Build Coastguard Worker     GSS_LAST
47*6236dae4SAndroid Build Coastguard Worker };
48*6236dae4SAndroid Build Coastguard Worker 
49*6236dae4SAndroid Build Coastguard Worker static const char *min_err_table[] = {
50*6236dae4SAndroid Build Coastguard Worker   "stub-gss: no error",
51*6236dae4SAndroid Build Coastguard Worker   "stub-gss: no memory",
52*6236dae4SAndroid Build Coastguard Worker   "stub-gss: invalid arguments",
53*6236dae4SAndroid Build Coastguard Worker   "stub-gss: invalid credentials",
54*6236dae4SAndroid Build Coastguard Worker   "stub-gss: invalid context",
55*6236dae4SAndroid Build Coastguard Worker   "stub-gss: server returned error",
56*6236dae4SAndroid Build Coastguard Worker   "stub-gss: cannot find a mechanism",
57*6236dae4SAndroid Build Coastguard Worker   NULL
58*6236dae4SAndroid Build Coastguard Worker };
59*6236dae4SAndroid Build Coastguard Worker 
60*6236dae4SAndroid Build Coastguard Worker struct gss_ctx_id_t_desc_struct {
61*6236dae4SAndroid Build Coastguard Worker   enum { NONE, KRB5, NTLM1, NTLM3 } sent;
62*6236dae4SAndroid Build Coastguard Worker   int have_krb5;
63*6236dae4SAndroid Build Coastguard Worker   int have_ntlm;
64*6236dae4SAndroid Build Coastguard Worker   OM_uint32 flags;
65*6236dae4SAndroid Build Coastguard Worker   char creds[MAX_CREDS_LENGTH];
66*6236dae4SAndroid Build Coastguard Worker };
67*6236dae4SAndroid Build Coastguard Worker 
68*6236dae4SAndroid Build Coastguard Worker /* simple implementation of strndup(), which isn't portable */
my_strndup(const char * ptr,size_t len)69*6236dae4SAndroid Build Coastguard Worker static char *my_strndup(const char *ptr, size_t len)
70*6236dae4SAndroid Build Coastguard Worker {
71*6236dae4SAndroid Build Coastguard Worker   char *copy = malloc(len + 1);
72*6236dae4SAndroid Build Coastguard Worker   if(!copy)
73*6236dae4SAndroid Build Coastguard Worker     return NULL;
74*6236dae4SAndroid Build Coastguard Worker   memcpy(copy, ptr, len);
75*6236dae4SAndroid Build Coastguard Worker   copy[len] = '\0';
76*6236dae4SAndroid Build Coastguard Worker   return copy;
77*6236dae4SAndroid Build Coastguard Worker }
78*6236dae4SAndroid Build Coastguard Worker 
gss_init_sec_context(OM_uint32 * min,gss_const_cred_id_t initiator_cred_handle,gss_ctx_id_t * context_handle,gss_const_name_t target_name,const gss_OID mech_type,OM_uint32 req_flags,OM_uint32 time_req,const gss_channel_bindings_t input_chan_bindings,const gss_buffer_t input_token,gss_OID * actual_mech_type,gss_buffer_t output_token,OM_uint32 * ret_flags,OM_uint32 * time_rec)79*6236dae4SAndroid Build Coastguard Worker OM_uint32 gss_init_sec_context(OM_uint32 *min,
80*6236dae4SAndroid Build Coastguard Worker             gss_const_cred_id_t initiator_cred_handle,
81*6236dae4SAndroid Build Coastguard Worker             gss_ctx_id_t *context_handle,
82*6236dae4SAndroid Build Coastguard Worker             gss_const_name_t target_name,
83*6236dae4SAndroid Build Coastguard Worker             const gss_OID mech_type,
84*6236dae4SAndroid Build Coastguard Worker             OM_uint32 req_flags,
85*6236dae4SAndroid Build Coastguard Worker             OM_uint32 time_req,
86*6236dae4SAndroid Build Coastguard Worker             const gss_channel_bindings_t input_chan_bindings,
87*6236dae4SAndroid Build Coastguard Worker             const gss_buffer_t input_token,
88*6236dae4SAndroid Build Coastguard Worker             gss_OID *actual_mech_type,
89*6236dae4SAndroid Build Coastguard Worker             gss_buffer_t output_token,
90*6236dae4SAndroid Build Coastguard Worker             OM_uint32 *ret_flags,
91*6236dae4SAndroid Build Coastguard Worker             OM_uint32 *time_rec)
92*6236dae4SAndroid Build Coastguard Worker {
93*6236dae4SAndroid Build Coastguard Worker   /* The token will be encoded in base64 */
94*6236dae4SAndroid Build Coastguard Worker   size_t length = APPROX_TOKEN_LEN * 3 / 4;
95*6236dae4SAndroid Build Coastguard Worker   size_t used = 0;
96*6236dae4SAndroid Build Coastguard Worker   char *token = NULL;
97*6236dae4SAndroid Build Coastguard Worker   const char *creds = NULL;
98*6236dae4SAndroid Build Coastguard Worker   gss_ctx_id_t ctx = NULL;
99*6236dae4SAndroid Build Coastguard Worker 
100*6236dae4SAndroid Build Coastguard Worker   (void)initiator_cred_handle;
101*6236dae4SAndroid Build Coastguard Worker   (void)mech_type;
102*6236dae4SAndroid Build Coastguard Worker   (void)time_req;
103*6236dae4SAndroid Build Coastguard Worker   (void)input_chan_bindings;
104*6236dae4SAndroid Build Coastguard Worker   (void)actual_mech_type;
105*6236dae4SAndroid Build Coastguard Worker 
106*6236dae4SAndroid Build Coastguard Worker   if(!min)
107*6236dae4SAndroid Build Coastguard Worker     return GSS_S_FAILURE;
108*6236dae4SAndroid Build Coastguard Worker 
109*6236dae4SAndroid Build Coastguard Worker   *min = 0;
110*6236dae4SAndroid Build Coastguard Worker 
111*6236dae4SAndroid Build Coastguard Worker   if(!context_handle || !target_name || !output_token) {
112*6236dae4SAndroid Build Coastguard Worker     *min = GSS_INVALID_ARGS;
113*6236dae4SAndroid Build Coastguard Worker     return GSS_S_FAILURE;
114*6236dae4SAndroid Build Coastguard Worker   }
115*6236dae4SAndroid Build Coastguard Worker 
116*6236dae4SAndroid Build Coastguard Worker   creds = getenv("CURL_STUB_GSS_CREDS");
117*6236dae4SAndroid Build Coastguard Worker   if(!creds || strlen(creds) >= MAX_CREDS_LENGTH) {
118*6236dae4SAndroid Build Coastguard Worker     *min = GSS_INVALID_CREDS;
119*6236dae4SAndroid Build Coastguard Worker     return GSS_S_FAILURE;
120*6236dae4SAndroid Build Coastguard Worker   }
121*6236dae4SAndroid Build Coastguard Worker 
122*6236dae4SAndroid Build Coastguard Worker   ctx = *context_handle;
123*6236dae4SAndroid Build Coastguard Worker   if(ctx && strcmp(ctx->creds, creds)) {
124*6236dae4SAndroid Build Coastguard Worker     *min = GSS_INVALID_CREDS;
125*6236dae4SAndroid Build Coastguard Worker     return GSS_S_FAILURE;
126*6236dae4SAndroid Build Coastguard Worker   }
127*6236dae4SAndroid Build Coastguard Worker 
128*6236dae4SAndroid Build Coastguard Worker   output_token->length = 0;
129*6236dae4SAndroid Build Coastguard Worker   output_token->value = NULL;
130*6236dae4SAndroid Build Coastguard Worker 
131*6236dae4SAndroid Build Coastguard Worker   if(input_token && input_token->length) {
132*6236dae4SAndroid Build Coastguard Worker     if(!ctx) {
133*6236dae4SAndroid Build Coastguard Worker       *min = GSS_INVALID_CTX;
134*6236dae4SAndroid Build Coastguard Worker       return GSS_S_FAILURE;
135*6236dae4SAndroid Build Coastguard Worker     }
136*6236dae4SAndroid Build Coastguard Worker 
137*6236dae4SAndroid Build Coastguard Worker     /* Server response, either D (RA==) or C (Qw==) */
138*6236dae4SAndroid Build Coastguard Worker     if(((char *) input_token->value)[0] == 'D') {
139*6236dae4SAndroid Build Coastguard Worker       /* Done */
140*6236dae4SAndroid Build Coastguard Worker       switch(ctx->sent) {
141*6236dae4SAndroid Build Coastguard Worker       case KRB5:
142*6236dae4SAndroid Build Coastguard Worker       case NTLM3:
143*6236dae4SAndroid Build Coastguard Worker         if(ret_flags)
144*6236dae4SAndroid Build Coastguard Worker           *ret_flags = ctx->flags;
145*6236dae4SAndroid Build Coastguard Worker         if(time_rec)
146*6236dae4SAndroid Build Coastguard Worker           *time_rec = GSS_C_INDEFINITE;
147*6236dae4SAndroid Build Coastguard Worker         return GSS_S_COMPLETE;
148*6236dae4SAndroid Build Coastguard Worker       default:
149*6236dae4SAndroid Build Coastguard Worker         *min = GSS_SERVER_ERR;
150*6236dae4SAndroid Build Coastguard Worker         return GSS_S_FAILURE;
151*6236dae4SAndroid Build Coastguard Worker       }
152*6236dae4SAndroid Build Coastguard Worker     }
153*6236dae4SAndroid Build Coastguard Worker 
154*6236dae4SAndroid Build Coastguard Worker     if(((char *) input_token->value)[0] != 'C') {
155*6236dae4SAndroid Build Coastguard Worker       /* We only support Done or Continue */
156*6236dae4SAndroid Build Coastguard Worker       *min = GSS_SERVER_ERR;
157*6236dae4SAndroid Build Coastguard Worker       return GSS_S_FAILURE;
158*6236dae4SAndroid Build Coastguard Worker     }
159*6236dae4SAndroid Build Coastguard Worker 
160*6236dae4SAndroid Build Coastguard Worker     /* Continue */
161*6236dae4SAndroid Build Coastguard Worker     switch(ctx->sent) {
162*6236dae4SAndroid Build Coastguard Worker     case KRB5:
163*6236dae4SAndroid Build Coastguard Worker       /* We sent KRB5 and it failed, let's try NTLM */
164*6236dae4SAndroid Build Coastguard Worker       if(ctx->have_ntlm) {
165*6236dae4SAndroid Build Coastguard Worker         ctx->sent = NTLM1;
166*6236dae4SAndroid Build Coastguard Worker         break;
167*6236dae4SAndroid Build Coastguard Worker       }
168*6236dae4SAndroid Build Coastguard Worker       else {
169*6236dae4SAndroid Build Coastguard Worker         *min = GSS_SERVER_ERR;
170*6236dae4SAndroid Build Coastguard Worker         return GSS_S_FAILURE;
171*6236dae4SAndroid Build Coastguard Worker       }
172*6236dae4SAndroid Build Coastguard Worker     case NTLM1:
173*6236dae4SAndroid Build Coastguard Worker       ctx->sent = NTLM3;
174*6236dae4SAndroid Build Coastguard Worker       break;
175*6236dae4SAndroid Build Coastguard Worker     default:
176*6236dae4SAndroid Build Coastguard Worker       *min = GSS_SERVER_ERR;
177*6236dae4SAndroid Build Coastguard Worker       return GSS_S_FAILURE;
178*6236dae4SAndroid Build Coastguard Worker     }
179*6236dae4SAndroid Build Coastguard Worker   }
180*6236dae4SAndroid Build Coastguard Worker   else {
181*6236dae4SAndroid Build Coastguard Worker     if(ctx) {
182*6236dae4SAndroid Build Coastguard Worker       *min = GSS_INVALID_CTX;
183*6236dae4SAndroid Build Coastguard Worker       return GSS_S_FAILURE;
184*6236dae4SAndroid Build Coastguard Worker     }
185*6236dae4SAndroid Build Coastguard Worker 
186*6236dae4SAndroid Build Coastguard Worker     ctx = (gss_ctx_id_t) calloc(1, sizeof(*ctx));
187*6236dae4SAndroid Build Coastguard Worker     if(!ctx) {
188*6236dae4SAndroid Build Coastguard Worker       *min = GSS_NO_MEMORY;
189*6236dae4SAndroid Build Coastguard Worker       return GSS_S_FAILURE;
190*6236dae4SAndroid Build Coastguard Worker     }
191*6236dae4SAndroid Build Coastguard Worker 
192*6236dae4SAndroid Build Coastguard Worker     if(strstr(creds, "KRB5"))
193*6236dae4SAndroid Build Coastguard Worker       ctx->have_krb5 = 1;
194*6236dae4SAndroid Build Coastguard Worker 
195*6236dae4SAndroid Build Coastguard Worker     if(strstr(creds, "NTLM"))
196*6236dae4SAndroid Build Coastguard Worker       ctx->have_ntlm = 1;
197*6236dae4SAndroid Build Coastguard Worker 
198*6236dae4SAndroid Build Coastguard Worker     if(ctx->have_krb5)
199*6236dae4SAndroid Build Coastguard Worker       ctx->sent = KRB5;
200*6236dae4SAndroid Build Coastguard Worker     else if(ctx->have_ntlm)
201*6236dae4SAndroid Build Coastguard Worker       ctx->sent = NTLM1;
202*6236dae4SAndroid Build Coastguard Worker     else {
203*6236dae4SAndroid Build Coastguard Worker       free(ctx);
204*6236dae4SAndroid Build Coastguard Worker       *min = GSS_NO_MECH;
205*6236dae4SAndroid Build Coastguard Worker       return GSS_S_FAILURE;
206*6236dae4SAndroid Build Coastguard Worker     }
207*6236dae4SAndroid Build Coastguard Worker 
208*6236dae4SAndroid Build Coastguard Worker     strcpy(ctx->creds, creds);
209*6236dae4SAndroid Build Coastguard Worker     ctx->flags = req_flags;
210*6236dae4SAndroid Build Coastguard Worker   }
211*6236dae4SAndroid Build Coastguard Worker 
212*6236dae4SAndroid Build Coastguard Worker   token = malloc(length);
213*6236dae4SAndroid Build Coastguard Worker   if(!token) {
214*6236dae4SAndroid Build Coastguard Worker     free(ctx);
215*6236dae4SAndroid Build Coastguard Worker     *min = GSS_NO_MEMORY;
216*6236dae4SAndroid Build Coastguard Worker     return GSS_S_FAILURE;
217*6236dae4SAndroid Build Coastguard Worker   }
218*6236dae4SAndroid Build Coastguard Worker 
219*6236dae4SAndroid Build Coastguard Worker   /* Token format: creds:target:type:padding */
220*6236dae4SAndroid Build Coastguard Worker   /* Note: this is using the *real* snprintf() and not the curl provided
221*6236dae4SAndroid Build Coastguard Worker      one */
222*6236dae4SAndroid Build Coastguard Worker   used = (size_t) snprintf(token, length, "%s:%s:%d:", creds,
223*6236dae4SAndroid Build Coastguard Worker                            (char *) target_name, ctx->sent);
224*6236dae4SAndroid Build Coastguard Worker 
225*6236dae4SAndroid Build Coastguard Worker   if(used >= length) {
226*6236dae4SAndroid Build Coastguard Worker     free(token);
227*6236dae4SAndroid Build Coastguard Worker     free(ctx);
228*6236dae4SAndroid Build Coastguard Worker     *min = GSS_NO_MEMORY;
229*6236dae4SAndroid Build Coastguard Worker     return GSS_S_FAILURE;
230*6236dae4SAndroid Build Coastguard Worker   }
231*6236dae4SAndroid Build Coastguard Worker 
232*6236dae4SAndroid Build Coastguard Worker   /* Overwrite null terminator */
233*6236dae4SAndroid Build Coastguard Worker   memset(token + used, 'A', length - used);
234*6236dae4SAndroid Build Coastguard Worker 
235*6236dae4SAndroid Build Coastguard Worker   *context_handle = ctx;
236*6236dae4SAndroid Build Coastguard Worker 
237*6236dae4SAndroid Build Coastguard Worker   output_token->value = token;
238*6236dae4SAndroid Build Coastguard Worker   output_token->length = length;
239*6236dae4SAndroid Build Coastguard Worker 
240*6236dae4SAndroid Build Coastguard Worker   return GSS_S_CONTINUE_NEEDED;
241*6236dae4SAndroid Build Coastguard Worker }
242*6236dae4SAndroid Build Coastguard Worker 
gss_delete_sec_context(OM_uint32 * min,gss_ctx_id_t * context_handle,gss_buffer_t output_token)243*6236dae4SAndroid Build Coastguard Worker OM_uint32 gss_delete_sec_context(OM_uint32 *min,
244*6236dae4SAndroid Build Coastguard Worker                                  gss_ctx_id_t *context_handle,
245*6236dae4SAndroid Build Coastguard Worker                                  gss_buffer_t output_token)
246*6236dae4SAndroid Build Coastguard Worker {
247*6236dae4SAndroid Build Coastguard Worker   (void)output_token;
248*6236dae4SAndroid Build Coastguard Worker 
249*6236dae4SAndroid Build Coastguard Worker   if(!min)
250*6236dae4SAndroid Build Coastguard Worker     return GSS_S_FAILURE;
251*6236dae4SAndroid Build Coastguard Worker 
252*6236dae4SAndroid Build Coastguard Worker   if(!context_handle) {
253*6236dae4SAndroid Build Coastguard Worker     *min = GSS_INVALID_CTX;
254*6236dae4SAndroid Build Coastguard Worker     return GSS_S_FAILURE;
255*6236dae4SAndroid Build Coastguard Worker   }
256*6236dae4SAndroid Build Coastguard Worker 
257*6236dae4SAndroid Build Coastguard Worker   free(*context_handle);
258*6236dae4SAndroid Build Coastguard Worker   *context_handle = NULL;
259*6236dae4SAndroid Build Coastguard Worker   *min = 0;
260*6236dae4SAndroid Build Coastguard Worker 
261*6236dae4SAndroid Build Coastguard Worker   return GSS_S_COMPLETE;
262*6236dae4SAndroid Build Coastguard Worker }
263*6236dae4SAndroid Build Coastguard Worker 
gss_release_buffer(OM_uint32 * min,gss_buffer_t buffer)264*6236dae4SAndroid Build Coastguard Worker OM_uint32 gss_release_buffer(OM_uint32 *min,
265*6236dae4SAndroid Build Coastguard Worker                              gss_buffer_t buffer)
266*6236dae4SAndroid Build Coastguard Worker {
267*6236dae4SAndroid Build Coastguard Worker   if(min)
268*6236dae4SAndroid Build Coastguard Worker     *min = 0;
269*6236dae4SAndroid Build Coastguard Worker 
270*6236dae4SAndroid Build Coastguard Worker   if(buffer && buffer->length) {
271*6236dae4SAndroid Build Coastguard Worker     free(buffer->value);
272*6236dae4SAndroid Build Coastguard Worker     buffer->length = 0;
273*6236dae4SAndroid Build Coastguard Worker   }
274*6236dae4SAndroid Build Coastguard Worker 
275*6236dae4SAndroid Build Coastguard Worker   return GSS_S_COMPLETE;
276*6236dae4SAndroid Build Coastguard Worker }
277*6236dae4SAndroid Build Coastguard Worker 
gss_import_name(OM_uint32 * min,const gss_buffer_t input_name_buffer,const gss_OID input_name_type,gss_name_t * output_name)278*6236dae4SAndroid Build Coastguard Worker OM_uint32 gss_import_name(OM_uint32 *min,
279*6236dae4SAndroid Build Coastguard Worker                           const gss_buffer_t input_name_buffer,
280*6236dae4SAndroid Build Coastguard Worker                           const gss_OID input_name_type,
281*6236dae4SAndroid Build Coastguard Worker                           gss_name_t *output_name)
282*6236dae4SAndroid Build Coastguard Worker {
283*6236dae4SAndroid Build Coastguard Worker   char *name = NULL;
284*6236dae4SAndroid Build Coastguard Worker   (void)input_name_type;
285*6236dae4SAndroid Build Coastguard Worker 
286*6236dae4SAndroid Build Coastguard Worker   if(!min)
287*6236dae4SAndroid Build Coastguard Worker     return GSS_S_FAILURE;
288*6236dae4SAndroid Build Coastguard Worker 
289*6236dae4SAndroid Build Coastguard Worker   if(!input_name_buffer || !output_name) {
290*6236dae4SAndroid Build Coastguard Worker     *min = GSS_INVALID_ARGS;
291*6236dae4SAndroid Build Coastguard Worker     return GSS_S_FAILURE;
292*6236dae4SAndroid Build Coastguard Worker   }
293*6236dae4SAndroid Build Coastguard Worker 
294*6236dae4SAndroid Build Coastguard Worker   name = my_strndup(input_name_buffer->value, input_name_buffer->length);
295*6236dae4SAndroid Build Coastguard Worker   if(!name) {
296*6236dae4SAndroid Build Coastguard Worker     *min = GSS_NO_MEMORY;
297*6236dae4SAndroid Build Coastguard Worker     return GSS_S_FAILURE;
298*6236dae4SAndroid Build Coastguard Worker   }
299*6236dae4SAndroid Build Coastguard Worker 
300*6236dae4SAndroid Build Coastguard Worker   *output_name = (gss_name_t) name;
301*6236dae4SAndroid Build Coastguard Worker   *min = 0;
302*6236dae4SAndroid Build Coastguard Worker 
303*6236dae4SAndroid Build Coastguard Worker   return GSS_S_COMPLETE;
304*6236dae4SAndroid Build Coastguard Worker }
305*6236dae4SAndroid Build Coastguard Worker 
gss_release_name(OM_uint32 * min,gss_name_t * input_name)306*6236dae4SAndroid Build Coastguard Worker OM_uint32 gss_release_name(OM_uint32 *min,
307*6236dae4SAndroid Build Coastguard Worker                            gss_name_t *input_name)
308*6236dae4SAndroid Build Coastguard Worker {
309*6236dae4SAndroid Build Coastguard Worker   if(min)
310*6236dae4SAndroid Build Coastguard Worker     *min = 0;
311*6236dae4SAndroid Build Coastguard Worker 
312*6236dae4SAndroid Build Coastguard Worker   if(input_name)
313*6236dae4SAndroid Build Coastguard Worker     free(*input_name);
314*6236dae4SAndroid Build Coastguard Worker 
315*6236dae4SAndroid Build Coastguard Worker   return GSS_S_COMPLETE;
316*6236dae4SAndroid Build Coastguard Worker }
317*6236dae4SAndroid Build Coastguard Worker 
gss_display_status(OM_uint32 * min,OM_uint32 status_value,int status_type,const gss_OID mech_type,OM_uint32 * message_context,gss_buffer_t status_string)318*6236dae4SAndroid Build Coastguard Worker OM_uint32 gss_display_status(OM_uint32 *min,
319*6236dae4SAndroid Build Coastguard Worker                              OM_uint32 status_value,
320*6236dae4SAndroid Build Coastguard Worker                              int status_type,
321*6236dae4SAndroid Build Coastguard Worker                              const gss_OID mech_type,
322*6236dae4SAndroid Build Coastguard Worker                              OM_uint32 *message_context,
323*6236dae4SAndroid Build Coastguard Worker                              gss_buffer_t status_string)
324*6236dae4SAndroid Build Coastguard Worker {
325*6236dae4SAndroid Build Coastguard Worker   const char maj_str[] = "Stub GSS error";
326*6236dae4SAndroid Build Coastguard Worker   (void)mech_type;
327*6236dae4SAndroid Build Coastguard Worker   if(min)
328*6236dae4SAndroid Build Coastguard Worker     *min = 0;
329*6236dae4SAndroid Build Coastguard Worker 
330*6236dae4SAndroid Build Coastguard Worker   if(message_context)
331*6236dae4SAndroid Build Coastguard Worker     *message_context = 0;
332*6236dae4SAndroid Build Coastguard Worker 
333*6236dae4SAndroid Build Coastguard Worker   if(status_string) {
334*6236dae4SAndroid Build Coastguard Worker     status_string->value = NULL;
335*6236dae4SAndroid Build Coastguard Worker     status_string->length = 0;
336*6236dae4SAndroid Build Coastguard Worker 
337*6236dae4SAndroid Build Coastguard Worker     if(status_value >= GSS_LAST)
338*6236dae4SAndroid Build Coastguard Worker       return GSS_S_FAILURE;
339*6236dae4SAndroid Build Coastguard Worker 
340*6236dae4SAndroid Build Coastguard Worker     switch(status_type) {
341*6236dae4SAndroid Build Coastguard Worker       case GSS_C_GSS_CODE:
342*6236dae4SAndroid Build Coastguard Worker         status_string->value = strdup(maj_str);
343*6236dae4SAndroid Build Coastguard Worker         break;
344*6236dae4SAndroid Build Coastguard Worker       case GSS_C_MECH_CODE:
345*6236dae4SAndroid Build Coastguard Worker         status_string->value = strdup(min_err_table[status_value]);
346*6236dae4SAndroid Build Coastguard Worker         break;
347*6236dae4SAndroid Build Coastguard Worker       default:
348*6236dae4SAndroid Build Coastguard Worker         return GSS_S_FAILURE;
349*6236dae4SAndroid Build Coastguard Worker     }
350*6236dae4SAndroid Build Coastguard Worker 
351*6236dae4SAndroid Build Coastguard Worker     if(status_string->value)
352*6236dae4SAndroid Build Coastguard Worker       status_string->length = strlen(status_string->value);
353*6236dae4SAndroid Build Coastguard Worker     else
354*6236dae4SAndroid Build Coastguard Worker       return GSS_S_FAILURE;
355*6236dae4SAndroid Build Coastguard Worker   }
356*6236dae4SAndroid Build Coastguard Worker 
357*6236dae4SAndroid Build Coastguard Worker   return GSS_S_COMPLETE;
358*6236dae4SAndroid Build Coastguard Worker }
359*6236dae4SAndroid Build Coastguard Worker 
360*6236dae4SAndroid Build Coastguard Worker /* Stubs returning error */
361*6236dae4SAndroid Build Coastguard Worker 
gss_display_name(OM_uint32 * min,gss_const_name_t input_name,gss_buffer_t output_name_buffer,gss_OID * output_name_type)362*6236dae4SAndroid Build Coastguard Worker OM_uint32 gss_display_name(OM_uint32 *min,
363*6236dae4SAndroid Build Coastguard Worker                            gss_const_name_t input_name,
364*6236dae4SAndroid Build Coastguard Worker                            gss_buffer_t output_name_buffer,
365*6236dae4SAndroid Build Coastguard Worker                            gss_OID *output_name_type)
366*6236dae4SAndroid Build Coastguard Worker {
367*6236dae4SAndroid Build Coastguard Worker   (void)min;
368*6236dae4SAndroid Build Coastguard Worker   (void)input_name;
369*6236dae4SAndroid Build Coastguard Worker   (void)output_name_buffer;
370*6236dae4SAndroid Build Coastguard Worker   (void)output_name_type;
371*6236dae4SAndroid Build Coastguard Worker   return GSS_S_FAILURE;
372*6236dae4SAndroid Build Coastguard Worker }
373*6236dae4SAndroid Build Coastguard Worker 
gss_inquire_context(OM_uint32 * min,gss_const_ctx_id_t context_handle,gss_name_t * src_name,gss_name_t * targ_name,OM_uint32 * lifetime_rec,gss_OID * mech_type,OM_uint32 * ctx_flags,int * locally_initiated,int * open_context)374*6236dae4SAndroid Build Coastguard Worker OM_uint32 gss_inquire_context(OM_uint32 *min,
375*6236dae4SAndroid Build Coastguard Worker                               gss_const_ctx_id_t context_handle,
376*6236dae4SAndroid Build Coastguard Worker                               gss_name_t *src_name,
377*6236dae4SAndroid Build Coastguard Worker                               gss_name_t *targ_name,
378*6236dae4SAndroid Build Coastguard Worker                               OM_uint32 *lifetime_rec,
379*6236dae4SAndroid Build Coastguard Worker                               gss_OID *mech_type,
380*6236dae4SAndroid Build Coastguard Worker                               OM_uint32 *ctx_flags,
381*6236dae4SAndroid Build Coastguard Worker                               int *locally_initiated,
382*6236dae4SAndroid Build Coastguard Worker                               int *open_context)
383*6236dae4SAndroid Build Coastguard Worker {
384*6236dae4SAndroid Build Coastguard Worker   (void)min;
385*6236dae4SAndroid Build Coastguard Worker   (void)context_handle;
386*6236dae4SAndroid Build Coastguard Worker   (void)src_name;
387*6236dae4SAndroid Build Coastguard Worker   (void)targ_name;
388*6236dae4SAndroid Build Coastguard Worker   (void)lifetime_rec;
389*6236dae4SAndroid Build Coastguard Worker   (void)mech_type;
390*6236dae4SAndroid Build Coastguard Worker   (void)ctx_flags;
391*6236dae4SAndroid Build Coastguard Worker   (void)locally_initiated;
392*6236dae4SAndroid Build Coastguard Worker   (void)open_context;
393*6236dae4SAndroid Build Coastguard Worker   return GSS_S_FAILURE;
394*6236dae4SAndroid Build Coastguard Worker }
395*6236dae4SAndroid Build Coastguard Worker 
gss_wrap(OM_uint32 * min,gss_const_ctx_id_t context_handle,int conf_req_flag,gss_qop_t qop_req,const gss_buffer_t input_message_buffer,int * conf_state,gss_buffer_t output_message_buffer)396*6236dae4SAndroid Build Coastguard Worker OM_uint32 gss_wrap(OM_uint32 *min,
397*6236dae4SAndroid Build Coastguard Worker                    gss_const_ctx_id_t context_handle,
398*6236dae4SAndroid Build Coastguard Worker                    int conf_req_flag,
399*6236dae4SAndroid Build Coastguard Worker                    gss_qop_t qop_req,
400*6236dae4SAndroid Build Coastguard Worker                    const gss_buffer_t input_message_buffer,
401*6236dae4SAndroid Build Coastguard Worker                    int *conf_state,
402*6236dae4SAndroid Build Coastguard Worker                    gss_buffer_t output_message_buffer)
403*6236dae4SAndroid Build Coastguard Worker {
404*6236dae4SAndroid Build Coastguard Worker   (void)min;
405*6236dae4SAndroid Build Coastguard Worker   (void)context_handle;
406*6236dae4SAndroid Build Coastguard Worker   (void)conf_req_flag;
407*6236dae4SAndroid Build Coastguard Worker   (void)qop_req;
408*6236dae4SAndroid Build Coastguard Worker   (void)input_message_buffer;
409*6236dae4SAndroid Build Coastguard Worker   (void)conf_state;
410*6236dae4SAndroid Build Coastguard Worker   (void)output_message_buffer;
411*6236dae4SAndroid Build Coastguard Worker   return GSS_S_FAILURE;
412*6236dae4SAndroid Build Coastguard Worker }
413*6236dae4SAndroid Build Coastguard Worker 
gss_unwrap(OM_uint32 * min,gss_const_ctx_id_t context_handle,const gss_buffer_t input_message_buffer,gss_buffer_t output_message_buffer,int * conf_state,gss_qop_t * qop_state)414*6236dae4SAndroid Build Coastguard Worker OM_uint32 gss_unwrap(OM_uint32 *min,
415*6236dae4SAndroid Build Coastguard Worker                      gss_const_ctx_id_t context_handle,
416*6236dae4SAndroid Build Coastguard Worker                      const gss_buffer_t input_message_buffer,
417*6236dae4SAndroid Build Coastguard Worker                      gss_buffer_t output_message_buffer,
418*6236dae4SAndroid Build Coastguard Worker                      int *conf_state,
419*6236dae4SAndroid Build Coastguard Worker                      gss_qop_t *qop_state)
420*6236dae4SAndroid Build Coastguard Worker {
421*6236dae4SAndroid Build Coastguard Worker   (void)min;
422*6236dae4SAndroid Build Coastguard Worker   (void)context_handle;
423*6236dae4SAndroid Build Coastguard Worker   (void)input_message_buffer;
424*6236dae4SAndroid Build Coastguard Worker   (void)output_message_buffer;
425*6236dae4SAndroid Build Coastguard Worker   (void)conf_state;
426*6236dae4SAndroid Build Coastguard Worker   (void)qop_state;
427*6236dae4SAndroid Build Coastguard Worker   return GSS_S_FAILURE;
428*6236dae4SAndroid Build Coastguard Worker }
429*6236dae4SAndroid Build Coastguard Worker 
gss_seal(OM_uint32 * min,gss_ctx_id_t context_handle,int conf_req_flag,int qop_req,gss_buffer_t input_message_buffer,int * conf_state,gss_buffer_t output_message_buffer)430*6236dae4SAndroid Build Coastguard Worker OM_uint32 gss_seal(OM_uint32 *min,
431*6236dae4SAndroid Build Coastguard Worker                    gss_ctx_id_t context_handle,
432*6236dae4SAndroid Build Coastguard Worker                    int conf_req_flag,
433*6236dae4SAndroid Build Coastguard Worker                    int qop_req,
434*6236dae4SAndroid Build Coastguard Worker                    gss_buffer_t input_message_buffer,
435*6236dae4SAndroid Build Coastguard Worker                    int *conf_state,
436*6236dae4SAndroid Build Coastguard Worker                    gss_buffer_t output_message_buffer)
437*6236dae4SAndroid Build Coastguard Worker {
438*6236dae4SAndroid Build Coastguard Worker   (void)min;
439*6236dae4SAndroid Build Coastguard Worker   (void)context_handle;
440*6236dae4SAndroid Build Coastguard Worker   (void)conf_req_flag;
441*6236dae4SAndroid Build Coastguard Worker   (void)qop_req;
442*6236dae4SAndroid Build Coastguard Worker   (void)input_message_buffer;
443*6236dae4SAndroid Build Coastguard Worker   (void)conf_state;
444*6236dae4SAndroid Build Coastguard Worker   (void)output_message_buffer;
445*6236dae4SAndroid Build Coastguard Worker   return GSS_S_FAILURE;
446*6236dae4SAndroid Build Coastguard Worker }
447*6236dae4SAndroid Build Coastguard Worker 
gss_unseal(OM_uint32 * min,gss_ctx_id_t context_handle,gss_buffer_t input_message_buffer,gss_buffer_t output_message_buffer,int * conf_state,int * qop_state)448*6236dae4SAndroid Build Coastguard Worker OM_uint32 gss_unseal(OM_uint32 *min,
449*6236dae4SAndroid Build Coastguard Worker                      gss_ctx_id_t context_handle,
450*6236dae4SAndroid Build Coastguard Worker                      gss_buffer_t input_message_buffer,
451*6236dae4SAndroid Build Coastguard Worker                      gss_buffer_t output_message_buffer,
452*6236dae4SAndroid Build Coastguard Worker                      int *conf_state,
453*6236dae4SAndroid Build Coastguard Worker                      int *qop_state)
454*6236dae4SAndroid Build Coastguard Worker {
455*6236dae4SAndroid Build Coastguard Worker   (void)min;
456*6236dae4SAndroid Build Coastguard Worker   (void)context_handle;
457*6236dae4SAndroid Build Coastguard Worker   (void)input_message_buffer;
458*6236dae4SAndroid Build Coastguard Worker   (void)output_message_buffer;
459*6236dae4SAndroid Build Coastguard Worker   (void)conf_state;
460*6236dae4SAndroid Build Coastguard Worker   (void)qop_state;
461*6236dae4SAndroid Build Coastguard Worker   return GSS_S_FAILURE;
462*6236dae4SAndroid Build Coastguard Worker }
463