1*7348b5c5SDavid van Moolenbroek /* $NetBSD: spx.c,v 1.7 2005/04/19 03:19:46 christos Exp $ */
2*7348b5c5SDavid van Moolenbroek
3*7348b5c5SDavid van Moolenbroek /*-
4*7348b5c5SDavid van Moolenbroek * Copyright (c) 1992, 1993
5*7348b5c5SDavid van Moolenbroek * The Regents of the University of California. All rights reserved.
6*7348b5c5SDavid van Moolenbroek *
7*7348b5c5SDavid van Moolenbroek * Redistribution and use in source and binary forms, with or without
8*7348b5c5SDavid van Moolenbroek * modification, are permitted provided that the following conditions
9*7348b5c5SDavid van Moolenbroek * are met:
10*7348b5c5SDavid van Moolenbroek * 1. Redistributions of source code must retain the above copyright
11*7348b5c5SDavid van Moolenbroek * notice, this list of conditions and the following disclaimer.
12*7348b5c5SDavid van Moolenbroek * 2. Redistributions in binary form must reproduce the above copyright
13*7348b5c5SDavid van Moolenbroek * notice, this list of conditions and the following disclaimer in the
14*7348b5c5SDavid van Moolenbroek * documentation and/or other materials provided with the distribution.
15*7348b5c5SDavid van Moolenbroek * 3. Neither the name of the University nor the names of its contributors
16*7348b5c5SDavid van Moolenbroek * may be used to endorse or promote products derived from this software
17*7348b5c5SDavid van Moolenbroek * without specific prior written permission.
18*7348b5c5SDavid van Moolenbroek *
19*7348b5c5SDavid van Moolenbroek * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20*7348b5c5SDavid van Moolenbroek * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21*7348b5c5SDavid van Moolenbroek * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22*7348b5c5SDavid van Moolenbroek * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23*7348b5c5SDavid van Moolenbroek * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24*7348b5c5SDavid van Moolenbroek * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25*7348b5c5SDavid van Moolenbroek * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26*7348b5c5SDavid van Moolenbroek * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27*7348b5c5SDavid van Moolenbroek * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28*7348b5c5SDavid van Moolenbroek * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29*7348b5c5SDavid van Moolenbroek * SUCH DAMAGE.
30*7348b5c5SDavid van Moolenbroek */
31*7348b5c5SDavid van Moolenbroek
32*7348b5c5SDavid van Moolenbroek #include <sys/cdefs.h>
33*7348b5c5SDavid van Moolenbroek
34*7348b5c5SDavid van Moolenbroek #ifndef lint
35*7348b5c5SDavid van Moolenbroek #if 0
36*7348b5c5SDavid van Moolenbroek static char sccsid[] = "@(#)spx.c 8.2 (Berkeley) 5/30/95";
37*7348b5c5SDavid van Moolenbroek #else
38*7348b5c5SDavid van Moolenbroek __RCSID("$NetBSD: spx.c,v 1.7 2005/04/19 03:19:46 christos Exp $");
39*7348b5c5SDavid van Moolenbroek #endif
40*7348b5c5SDavid van Moolenbroek #endif /* not lint */
41*7348b5c5SDavid van Moolenbroek
42*7348b5c5SDavid van Moolenbroek #ifdef SPX
43*7348b5c5SDavid van Moolenbroek /*
44*7348b5c5SDavid van Moolenbroek * COPYRIGHT (C) 1990 DIGITAL EQUIPMENT CORPORATION
45*7348b5c5SDavid van Moolenbroek * ALL RIGHTS RESERVED
46*7348b5c5SDavid van Moolenbroek *
47*7348b5c5SDavid van Moolenbroek * "Digital Equipment Corporation authorizes the reproduction,
48*7348b5c5SDavid van Moolenbroek * distribution and modification of this software subject to the following
49*7348b5c5SDavid van Moolenbroek * restrictions:
50*7348b5c5SDavid van Moolenbroek *
51*7348b5c5SDavid van Moolenbroek * 1. Any partial or whole copy of this software, or any modification
52*7348b5c5SDavid van Moolenbroek * thereof, must include this copyright notice in its entirety.
53*7348b5c5SDavid van Moolenbroek *
54*7348b5c5SDavid van Moolenbroek * 2. This software is supplied "as is" with no warranty of any kind,
55*7348b5c5SDavid van Moolenbroek * expressed or implied, for any purpose, including any warranty of fitness
56*7348b5c5SDavid van Moolenbroek * or merchantibility. DIGITAL assumes no responsibility for the use or
57*7348b5c5SDavid van Moolenbroek * reliability of this software, nor promises to provide any form of
58*7348b5c5SDavid van Moolenbroek * support for it on any basis.
59*7348b5c5SDavid van Moolenbroek *
60*7348b5c5SDavid van Moolenbroek * 3. Distribution of this software is authorized only if no profit or
61*7348b5c5SDavid van Moolenbroek * remuneration of any kind is received in exchange for such distribution.
62*7348b5c5SDavid van Moolenbroek *
63*7348b5c5SDavid van Moolenbroek * 4. This software produces public key authentication certificates
64*7348b5c5SDavid van Moolenbroek * bearing an expiration date established by DIGITAL and RSA Data
65*7348b5c5SDavid van Moolenbroek * Security, Inc. It may cease to generate certificates after the expiration
66*7348b5c5SDavid van Moolenbroek * date. Any modification of this software that changes or defeats
67*7348b5c5SDavid van Moolenbroek * the expiration date or its effect is unauthorized.
68*7348b5c5SDavid van Moolenbroek *
69*7348b5c5SDavid van Moolenbroek * 5. Software that will renew or extend the expiration date of
70*7348b5c5SDavid van Moolenbroek * authentication certificates produced by this software may be obtained
71*7348b5c5SDavid van Moolenbroek * from RSA Data Security, Inc., 10 Twin Dolphin Drive, Redwood City, CA
72*7348b5c5SDavid van Moolenbroek * 94065, (415)595-8782, or from DIGITAL"
73*7348b5c5SDavid van Moolenbroek *
74*7348b5c5SDavid van Moolenbroek */
75*7348b5c5SDavid van Moolenbroek
76*7348b5c5SDavid van Moolenbroek #include <sys/types.h>
77*7348b5c5SDavid van Moolenbroek #include <arpa/telnet.h>
78*7348b5c5SDavid van Moolenbroek #include <stdio.h>
79*7348b5c5SDavid van Moolenbroek #include "gssapi_defs.h"
80*7348b5c5SDavid van Moolenbroek #include <stdlib.h>
81*7348b5c5SDavid van Moolenbroek #ifdef NO_STRING_H
82*7348b5c5SDavid van Moolenbroek #include <strings.h>
83*7348b5c5SDavid van Moolenbroek #else
84*7348b5c5SDavid van Moolenbroek #include <string.h>
85*7348b5c5SDavid van Moolenbroek #endif
86*7348b5c5SDavid van Moolenbroek
87*7348b5c5SDavid van Moolenbroek #include <pwd.h>
88*7348b5c5SDavid van Moolenbroek #include "encrypt.h"
89*7348b5c5SDavid van Moolenbroek #include "auth.h"
90*7348b5c5SDavid van Moolenbroek #include "misc.h"
91*7348b5c5SDavid van Moolenbroek
92*7348b5c5SDavid van Moolenbroek extern auth_debug_mode;
93*7348b5c5SDavid van Moolenbroek
94*7348b5c5SDavid van Moolenbroek static unsigned char str_data[1024] = { IAC, SB, TELOPT_AUTHENTICATION, 0,
95*7348b5c5SDavid van Moolenbroek AUTHTYPE_SPX, };
96*7348b5c5SDavid van Moolenbroek static unsigned char str_name[1024] = { IAC, SB, TELOPT_AUTHENTICATION,
97*7348b5c5SDavid van Moolenbroek TELQUAL_NAME, };
98*7348b5c5SDavid van Moolenbroek
99*7348b5c5SDavid van Moolenbroek #define SPX_AUTH 0 /* Authentication data follows */
100*7348b5c5SDavid van Moolenbroek #define SPX_REJECT 1 /* Rejected (reason might follow) */
101*7348b5c5SDavid van Moolenbroek #define SPX_ACCEPT 2 /* Accepted */
102*7348b5c5SDavid van Moolenbroek
103*7348b5c5SDavid van Moolenbroek #ifdef ENCRYPTION
104*7348b5c5SDavid van Moolenbroek static Block session_key = { 0 };
105*7348b5c5SDavid van Moolenbroek #endif /* ENCRYPTION */
106*7348b5c5SDavid van Moolenbroek static Schedule sched;
107*7348b5c5SDavid van Moolenbroek static Block challenge = { 0 };
108*7348b5c5SDavid van Moolenbroek
109*7348b5c5SDavid van Moolenbroek
110*7348b5c5SDavid van Moolenbroek /*******************************************************************/
111*7348b5c5SDavid van Moolenbroek
112*7348b5c5SDavid van Moolenbroek gss_OID_set actual_mechs;
113*7348b5c5SDavid van Moolenbroek gss_OID actual_mech_type, output_name_type;
114*7348b5c5SDavid van Moolenbroek int major_status, status, msg_ctx = 0, new_status;
115*7348b5c5SDavid van Moolenbroek int req_flags = 0, ret_flags, lifetime_rec;
116*7348b5c5SDavid van Moolenbroek gss_cred_id_t gss_cred_handle;
117*7348b5c5SDavid van Moolenbroek gss_ctx_id_t actual_ctxhandle, context_handle;
118*7348b5c5SDavid van Moolenbroek gss_buffer_desc output_token, input_token, input_name_buffer;
119*7348b5c5SDavid van Moolenbroek gss_buffer_desc status_string;
120*7348b5c5SDavid van Moolenbroek gss_name_t desired_targname, src_name;
121*7348b5c5SDavid van Moolenbroek gss_channel_bindings input_chan_bindings;
122*7348b5c5SDavid van Moolenbroek char lhostname[GSS_C_MAX_PRINTABLE_NAME];
123*7348b5c5SDavid van Moolenbroek char targ_printable[GSS_C_MAX_PRINTABLE_NAME];
124*7348b5c5SDavid van Moolenbroek int to_addr=0, from_addr=0;
125*7348b5c5SDavid van Moolenbroek char *address;
126*7348b5c5SDavid van Moolenbroek gss_buffer_desc fullname_buffer;
127*7348b5c5SDavid van Moolenbroek gss_OID fullname_type;
128*7348b5c5SDavid van Moolenbroek gss_cred_id_t gss_delegated_cred_handle;
129*7348b5c5SDavid van Moolenbroek
130*7348b5c5SDavid van Moolenbroek /*******************************************************************/
131*7348b5c5SDavid van Moolenbroek
132*7348b5c5SDavid van Moolenbroek
133*7348b5c5SDavid van Moolenbroek
134*7348b5c5SDavid van Moolenbroek static int
Data(ap,type,d,c)135*7348b5c5SDavid van Moolenbroek Data(ap, type, d, c)
136*7348b5c5SDavid van Moolenbroek Authenticator *ap;
137*7348b5c5SDavid van Moolenbroek int type;
138*7348b5c5SDavid van Moolenbroek void *d;
139*7348b5c5SDavid van Moolenbroek int c;
140*7348b5c5SDavid van Moolenbroek {
141*7348b5c5SDavid van Moolenbroek unsigned char *p = str_data + 4;
142*7348b5c5SDavid van Moolenbroek unsigned char *cd = (unsigned char *)d;
143*7348b5c5SDavid van Moolenbroek
144*7348b5c5SDavid van Moolenbroek if (c == -1)
145*7348b5c5SDavid van Moolenbroek c = strlen((char *)cd);
146*7348b5c5SDavid van Moolenbroek
147*7348b5c5SDavid van Moolenbroek if (0) {
148*7348b5c5SDavid van Moolenbroek printf("%s:%d: [%d] (%d)",
149*7348b5c5SDavid van Moolenbroek str_data[3] == TELQUAL_IS ? ">>>IS" : ">>>REPLY",
150*7348b5c5SDavid van Moolenbroek str_data[3],
151*7348b5c5SDavid van Moolenbroek type, c);
152*7348b5c5SDavid van Moolenbroek printd(d, c);
153*7348b5c5SDavid van Moolenbroek printf("\r\n");
154*7348b5c5SDavid van Moolenbroek }
155*7348b5c5SDavid van Moolenbroek *p++ = ap->type;
156*7348b5c5SDavid van Moolenbroek *p++ = ap->way;
157*7348b5c5SDavid van Moolenbroek *p++ = type;
158*7348b5c5SDavid van Moolenbroek while (c-- > 0) {
159*7348b5c5SDavid van Moolenbroek if ((*p++ = *cd++) == IAC)
160*7348b5c5SDavid van Moolenbroek *p++ = IAC;
161*7348b5c5SDavid van Moolenbroek }
162*7348b5c5SDavid van Moolenbroek *p++ = IAC;
163*7348b5c5SDavid van Moolenbroek *p++ = SE;
164*7348b5c5SDavid van Moolenbroek if (str_data[3] == TELQUAL_IS)
165*7348b5c5SDavid van Moolenbroek printsub('>', &str_data[2], p - (&str_data[2]));
166*7348b5c5SDavid van Moolenbroek return(telnet_net_write(str_data, p - str_data));
167*7348b5c5SDavid van Moolenbroek }
168*7348b5c5SDavid van Moolenbroek
169*7348b5c5SDavid van Moolenbroek int
spx_init(ap,server)170*7348b5c5SDavid van Moolenbroek spx_init(ap, server)
171*7348b5c5SDavid van Moolenbroek Authenticator *ap;
172*7348b5c5SDavid van Moolenbroek int server;
173*7348b5c5SDavid van Moolenbroek {
174*7348b5c5SDavid van Moolenbroek gss_cred_id_t tmp_cred_handle;
175*7348b5c5SDavid van Moolenbroek
176*7348b5c5SDavid van Moolenbroek if (server) {
177*7348b5c5SDavid van Moolenbroek str_data[3] = TELQUAL_REPLY;
178*7348b5c5SDavid van Moolenbroek gethostname(lhostname, sizeof(lhostname));
179*7348b5c5SDavid van Moolenbroek strlcpy(targ_printable, "SERVICE:rcmd@",
180*7348b5c5SDavid van Moolenbroek sizeof(targ_printable));
181*7348b5c5SDavid van Moolenbroek strlcat(targ_printable, lhostname, sizeof(targ_printable));
182*7348b5c5SDavid van Moolenbroek input_name_buffer.length = strlen(targ_printable);
183*7348b5c5SDavid van Moolenbroek input_name_buffer.value = targ_printable;
184*7348b5c5SDavid van Moolenbroek major_status = gss_import_name(&status,
185*7348b5c5SDavid van Moolenbroek &input_name_buffer,
186*7348b5c5SDavid van Moolenbroek GSS_C_NULL_OID,
187*7348b5c5SDavid van Moolenbroek &desired_targname);
188*7348b5c5SDavid van Moolenbroek major_status = gss_acquire_cred(&status,
189*7348b5c5SDavid van Moolenbroek desired_targname,
190*7348b5c5SDavid van Moolenbroek 0,
191*7348b5c5SDavid van Moolenbroek GSS_C_NULL_OID_SET,
192*7348b5c5SDavid van Moolenbroek GSS_C_ACCEPT,
193*7348b5c5SDavid van Moolenbroek &tmp_cred_handle,
194*7348b5c5SDavid van Moolenbroek &actual_mechs,
195*7348b5c5SDavid van Moolenbroek &lifetime_rec);
196*7348b5c5SDavid van Moolenbroek if (major_status != GSS_S_COMPLETE) return(0);
197*7348b5c5SDavid van Moolenbroek } else {
198*7348b5c5SDavid van Moolenbroek str_data[3] = TELQUAL_IS;
199*7348b5c5SDavid van Moolenbroek }
200*7348b5c5SDavid van Moolenbroek return(1);
201*7348b5c5SDavid van Moolenbroek }
202*7348b5c5SDavid van Moolenbroek
203*7348b5c5SDavid van Moolenbroek int
spx_send(ap)204*7348b5c5SDavid van Moolenbroek spx_send(ap)
205*7348b5c5SDavid van Moolenbroek Authenticator *ap;
206*7348b5c5SDavid van Moolenbroek {
207*7348b5c5SDavid van Moolenbroek Block enckey;
208*7348b5c5SDavid van Moolenbroek int r;
209*7348b5c5SDavid van Moolenbroek
210*7348b5c5SDavid van Moolenbroek gss_OID actual_mech_type, output_name_type;
211*7348b5c5SDavid van Moolenbroek int msg_ctx = 0, new_status, status;
212*7348b5c5SDavid van Moolenbroek int req_flags = 0, ret_flags, lifetime_rec, major_status;
213*7348b5c5SDavid van Moolenbroek gss_buffer_desc output_token, input_token, input_name_buffer;
214*7348b5c5SDavid van Moolenbroek gss_buffer_desc output_name_buffer, status_string;
215*7348b5c5SDavid van Moolenbroek gss_name_t desired_targname;
216*7348b5c5SDavid van Moolenbroek gss_channel_bindings input_chan_bindings;
217*7348b5c5SDavid van Moolenbroek char targ_printable[GSS_C_MAX_PRINTABLE_NAME];
218*7348b5c5SDavid van Moolenbroek int from_addr=0, to_addr=0, myhostlen, j;
219*7348b5c5SDavid van Moolenbroek int deleg_flag=1, mutual_flag=0, replay_flag=0, seq_flag=0;
220*7348b5c5SDavid van Moolenbroek char *address;
221*7348b5c5SDavid van Moolenbroek
222*7348b5c5SDavid van Moolenbroek printf("[ Trying SPX ... ]\n");
223*7348b5c5SDavid van Moolenbroek strlcpy(targ_printable, "SERVICE:rcmd@", sizeof(targ_printable));
224*7348b5c5SDavid van Moolenbroek strlcat(targ_printable, RemoteHostName, sizeof(targ_printable));
225*7348b5c5SDavid van Moolenbroek
226*7348b5c5SDavid van Moolenbroek input_name_buffer.length = strlen(targ_printable);
227*7348b5c5SDavid van Moolenbroek input_name_buffer.value = targ_printable;
228*7348b5c5SDavid van Moolenbroek
229*7348b5c5SDavid van Moolenbroek if (!UserNameRequested) {
230*7348b5c5SDavid van Moolenbroek return(0);
231*7348b5c5SDavid van Moolenbroek }
232*7348b5c5SDavid van Moolenbroek
233*7348b5c5SDavid van Moolenbroek major_status = gss_import_name(&status,
234*7348b5c5SDavid van Moolenbroek &input_name_buffer,
235*7348b5c5SDavid van Moolenbroek GSS_C_NULL_OID,
236*7348b5c5SDavid van Moolenbroek &desired_targname);
237*7348b5c5SDavid van Moolenbroek
238*7348b5c5SDavid van Moolenbroek
239*7348b5c5SDavid van Moolenbroek major_status = gss_display_name(&status,
240*7348b5c5SDavid van Moolenbroek desired_targname,
241*7348b5c5SDavid van Moolenbroek &output_name_buffer,
242*7348b5c5SDavid van Moolenbroek &output_name_type);
243*7348b5c5SDavid van Moolenbroek
244*7348b5c5SDavid van Moolenbroek printf("target is '%s'\n", output_name_buffer.value); fflush(stdout);
245*7348b5c5SDavid van Moolenbroek
246*7348b5c5SDavid van Moolenbroek major_status = gss_release_buffer(&status, &output_name_buffer);
247*7348b5c5SDavid van Moolenbroek
248*7348b5c5SDavid van Moolenbroek input_chan_bindings = (gss_channel_bindings)
249*7348b5c5SDavid van Moolenbroek malloc(sizeof(gss_channel_bindings_desc));
250*7348b5c5SDavid van Moolenbroek
251*7348b5c5SDavid van Moolenbroek input_chan_bindings->initiator_addrtype = GSS_C_AF_INET;
252*7348b5c5SDavid van Moolenbroek input_chan_bindings->initiator_address.length = 4;
253*7348b5c5SDavid van Moolenbroek address = (char *) malloc(4);
254*7348b5c5SDavid van Moolenbroek input_chan_bindings->initiator_address.value = (char *) address;
255*7348b5c5SDavid van Moolenbroek address[0] = ((from_addr & 0xff000000) >> 24);
256*7348b5c5SDavid van Moolenbroek address[1] = ((from_addr & 0xff0000) >> 16);
257*7348b5c5SDavid van Moolenbroek address[2] = ((from_addr & 0xff00) >> 8);
258*7348b5c5SDavid van Moolenbroek address[3] = (from_addr & 0xff);
259*7348b5c5SDavid van Moolenbroek input_chan_bindings->acceptor_addrtype = GSS_C_AF_INET;
260*7348b5c5SDavid van Moolenbroek input_chan_bindings->acceptor_address.length = 4;
261*7348b5c5SDavid van Moolenbroek address = (char *) malloc(4);
262*7348b5c5SDavid van Moolenbroek input_chan_bindings->acceptor_address.value = (char *) address;
263*7348b5c5SDavid van Moolenbroek address[0] = ((to_addr & 0xff000000) >> 24);
264*7348b5c5SDavid van Moolenbroek address[1] = ((to_addr & 0xff0000) >> 16);
265*7348b5c5SDavid van Moolenbroek address[2] = ((to_addr & 0xff00) >> 8);
266*7348b5c5SDavid van Moolenbroek address[3] = (to_addr & 0xff);
267*7348b5c5SDavid van Moolenbroek input_chan_bindings->application_data.length = 0;
268*7348b5c5SDavid van Moolenbroek
269*7348b5c5SDavid van Moolenbroek req_flags = 0;
270*7348b5c5SDavid van Moolenbroek if (deleg_flag) req_flags = req_flags | 1;
271*7348b5c5SDavid van Moolenbroek if (mutual_flag) req_flags = req_flags | 2;
272*7348b5c5SDavid van Moolenbroek if (replay_flag) req_flags = req_flags | 4;
273*7348b5c5SDavid van Moolenbroek if (seq_flag) req_flags = req_flags | 8;
274*7348b5c5SDavid van Moolenbroek
275*7348b5c5SDavid van Moolenbroek major_status = gss_init_sec_context(&status, /* minor status */
276*7348b5c5SDavid van Moolenbroek GSS_C_NO_CREDENTIAL, /* cred handle */
277*7348b5c5SDavid van Moolenbroek &actual_ctxhandle, /* ctx handle */
278*7348b5c5SDavid van Moolenbroek desired_targname, /* target name */
279*7348b5c5SDavid van Moolenbroek GSS_C_NULL_OID, /* mech type */
280*7348b5c5SDavid van Moolenbroek req_flags, /* req flags */
281*7348b5c5SDavid van Moolenbroek 0, /* time req */
282*7348b5c5SDavid van Moolenbroek input_chan_bindings, /* chan binding */
283*7348b5c5SDavid van Moolenbroek GSS_C_NO_BUFFER, /* input token */
284*7348b5c5SDavid van Moolenbroek &actual_mech_type, /* actual mech */
285*7348b5c5SDavid van Moolenbroek &output_token, /* output token */
286*7348b5c5SDavid van Moolenbroek &ret_flags, /* ret flags */
287*7348b5c5SDavid van Moolenbroek &lifetime_rec); /* time rec */
288*7348b5c5SDavid van Moolenbroek
289*7348b5c5SDavid van Moolenbroek if ((major_status != GSS_S_COMPLETE) &&
290*7348b5c5SDavid van Moolenbroek (major_status != GSS_S_CONTINUE_NEEDED)) {
291*7348b5c5SDavid van Moolenbroek gss_display_status(&new_status,
292*7348b5c5SDavid van Moolenbroek status,
293*7348b5c5SDavid van Moolenbroek GSS_C_MECH_CODE,
294*7348b5c5SDavid van Moolenbroek GSS_C_NULL_OID,
295*7348b5c5SDavid van Moolenbroek &msg_ctx,
296*7348b5c5SDavid van Moolenbroek &status_string);
297*7348b5c5SDavid van Moolenbroek printf("%s\n", status_string.value);
298*7348b5c5SDavid van Moolenbroek return(0);
299*7348b5c5SDavid van Moolenbroek }
300*7348b5c5SDavid van Moolenbroek
301*7348b5c5SDavid van Moolenbroek if (!auth_sendname(UserNameRequested, strlen(UserNameRequested))) {
302*7348b5c5SDavid van Moolenbroek return(0);
303*7348b5c5SDavid van Moolenbroek }
304*7348b5c5SDavid van Moolenbroek
305*7348b5c5SDavid van Moolenbroek if (!Data(ap, SPX_AUTH, (void *)output_token.value, output_token.length)) {
306*7348b5c5SDavid van Moolenbroek return(0);
307*7348b5c5SDavid van Moolenbroek }
308*7348b5c5SDavid van Moolenbroek
309*7348b5c5SDavid van Moolenbroek return(1);
310*7348b5c5SDavid van Moolenbroek }
311*7348b5c5SDavid van Moolenbroek
312*7348b5c5SDavid van Moolenbroek void
spx_is(ap,data,cnt)313*7348b5c5SDavid van Moolenbroek spx_is(ap, data, cnt)
314*7348b5c5SDavid van Moolenbroek Authenticator *ap;
315*7348b5c5SDavid van Moolenbroek unsigned char *data;
316*7348b5c5SDavid van Moolenbroek int cnt;
317*7348b5c5SDavid van Moolenbroek {
318*7348b5c5SDavid van Moolenbroek Session_Key skey;
319*7348b5c5SDavid van Moolenbroek Block datablock;
320*7348b5c5SDavid van Moolenbroek int r;
321*7348b5c5SDavid van Moolenbroek
322*7348b5c5SDavid van Moolenbroek if (cnt-- < 1)
323*7348b5c5SDavid van Moolenbroek return;
324*7348b5c5SDavid van Moolenbroek switch (*data++) {
325*7348b5c5SDavid van Moolenbroek case SPX_AUTH:
326*7348b5c5SDavid van Moolenbroek input_token.length = cnt;
327*7348b5c5SDavid van Moolenbroek input_token.value = (char *) data;
328*7348b5c5SDavid van Moolenbroek
329*7348b5c5SDavid van Moolenbroek gethostname(lhostname, sizeof(lhostname));
330*7348b5c5SDavid van Moolenbroek
331*7348b5c5SDavid van Moolenbroek strlcpy(targ_printable, "SERVICE:rcmd@",
332*7348b5c5SDavid van Moolenbroek sizeof(targ_printable));
333*7348b5c5SDavid van Moolenbroek strlcat(targ_printable, lhostname, sizeof(targ_printable));
334*7348b5c5SDavid van Moolenbroek
335*7348b5c5SDavid van Moolenbroek input_name_buffer.length = strlen(targ_printable);
336*7348b5c5SDavid van Moolenbroek input_name_buffer.value = targ_printable;
337*7348b5c5SDavid van Moolenbroek
338*7348b5c5SDavid van Moolenbroek major_status = gss_import_name(&status,
339*7348b5c5SDavid van Moolenbroek &input_name_buffer,
340*7348b5c5SDavid van Moolenbroek GSS_C_NULL_OID,
341*7348b5c5SDavid van Moolenbroek &desired_targname);
342*7348b5c5SDavid van Moolenbroek
343*7348b5c5SDavid van Moolenbroek major_status = gss_acquire_cred(&status,
344*7348b5c5SDavid van Moolenbroek desired_targname,
345*7348b5c5SDavid van Moolenbroek 0,
346*7348b5c5SDavid van Moolenbroek GSS_C_NULL_OID_SET,
347*7348b5c5SDavid van Moolenbroek GSS_C_ACCEPT,
348*7348b5c5SDavid van Moolenbroek &gss_cred_handle,
349*7348b5c5SDavid van Moolenbroek &actual_mechs,
350*7348b5c5SDavid van Moolenbroek &lifetime_rec);
351*7348b5c5SDavid van Moolenbroek
352*7348b5c5SDavid van Moolenbroek major_status = gss_release_name(&status, desired_targname);
353*7348b5c5SDavid van Moolenbroek
354*7348b5c5SDavid van Moolenbroek input_chan_bindings = (gss_channel_bindings)
355*7348b5c5SDavid van Moolenbroek malloc(sizeof(gss_channel_bindings_desc));
356*7348b5c5SDavid van Moolenbroek
357*7348b5c5SDavid van Moolenbroek input_chan_bindings->initiator_addrtype = GSS_C_AF_INET;
358*7348b5c5SDavid van Moolenbroek input_chan_bindings->initiator_address.length = 4;
359*7348b5c5SDavid van Moolenbroek address = (char *) malloc(4);
360*7348b5c5SDavid van Moolenbroek input_chan_bindings->initiator_address.value = (char *) address;
361*7348b5c5SDavid van Moolenbroek address[0] = ((from_addr & 0xff000000) >> 24);
362*7348b5c5SDavid van Moolenbroek address[1] = ((from_addr & 0xff0000) >> 16);
363*7348b5c5SDavid van Moolenbroek address[2] = ((from_addr & 0xff00) >> 8);
364*7348b5c5SDavid van Moolenbroek address[3] = (from_addr & 0xff);
365*7348b5c5SDavid van Moolenbroek input_chan_bindings->acceptor_addrtype = GSS_C_AF_INET;
366*7348b5c5SDavid van Moolenbroek input_chan_bindings->acceptor_address.length = 4;
367*7348b5c5SDavid van Moolenbroek address = (char *) malloc(4);
368*7348b5c5SDavid van Moolenbroek input_chan_bindings->acceptor_address.value = (char *) address;
369*7348b5c5SDavid van Moolenbroek address[0] = ((to_addr & 0xff000000) >> 24);
370*7348b5c5SDavid van Moolenbroek address[1] = ((to_addr & 0xff0000) >> 16);
371*7348b5c5SDavid van Moolenbroek address[2] = ((to_addr & 0xff00) >> 8);
372*7348b5c5SDavid van Moolenbroek address[3] = (to_addr & 0xff);
373*7348b5c5SDavid van Moolenbroek input_chan_bindings->application_data.length = 0;
374*7348b5c5SDavid van Moolenbroek
375*7348b5c5SDavid van Moolenbroek major_status = gss_accept_sec_context(&status,
376*7348b5c5SDavid van Moolenbroek &context_handle,
377*7348b5c5SDavid van Moolenbroek gss_cred_handle,
378*7348b5c5SDavid van Moolenbroek &input_token,
379*7348b5c5SDavid van Moolenbroek input_chan_bindings,
380*7348b5c5SDavid van Moolenbroek &src_name,
381*7348b5c5SDavid van Moolenbroek &actual_mech_type,
382*7348b5c5SDavid van Moolenbroek &output_token,
383*7348b5c5SDavid van Moolenbroek &ret_flags,
384*7348b5c5SDavid van Moolenbroek &lifetime_rec,
385*7348b5c5SDavid van Moolenbroek &gss_delegated_cred_handle);
386*7348b5c5SDavid van Moolenbroek
387*7348b5c5SDavid van Moolenbroek
388*7348b5c5SDavid van Moolenbroek if (major_status != GSS_S_COMPLETE) {
389*7348b5c5SDavid van Moolenbroek
390*7348b5c5SDavid van Moolenbroek major_status = gss_display_name(&status,
391*7348b5c5SDavid van Moolenbroek src_name,
392*7348b5c5SDavid van Moolenbroek &fullname_buffer,
393*7348b5c5SDavid van Moolenbroek &fullname_type);
394*7348b5c5SDavid van Moolenbroek Data(ap, SPX_REJECT, (void *)"auth failed", -1);
395*7348b5c5SDavid van Moolenbroek auth_finished(ap, AUTH_REJECT);
396*7348b5c5SDavid van Moolenbroek return;
397*7348b5c5SDavid van Moolenbroek }
398*7348b5c5SDavid van Moolenbroek
399*7348b5c5SDavid van Moolenbroek major_status = gss_display_name(&status,
400*7348b5c5SDavid van Moolenbroek src_name,
401*7348b5c5SDavid van Moolenbroek &fullname_buffer,
402*7348b5c5SDavid van Moolenbroek &fullname_type);
403*7348b5c5SDavid van Moolenbroek
404*7348b5c5SDavid van Moolenbroek
405*7348b5c5SDavid van Moolenbroek Data(ap, SPX_ACCEPT, (void *)output_token.value, output_token.length);
406*7348b5c5SDavid van Moolenbroek auth_finished(ap, AUTH_USER);
407*7348b5c5SDavid van Moolenbroek break;
408*7348b5c5SDavid van Moolenbroek
409*7348b5c5SDavid van Moolenbroek default:
410*7348b5c5SDavid van Moolenbroek Data(ap, SPX_REJECT, 0, 0);
411*7348b5c5SDavid van Moolenbroek break;
412*7348b5c5SDavid van Moolenbroek }
413*7348b5c5SDavid van Moolenbroek }
414*7348b5c5SDavid van Moolenbroek
415*7348b5c5SDavid van Moolenbroek
416*7348b5c5SDavid van Moolenbroek void
spx_reply(ap,data,cnt)417*7348b5c5SDavid van Moolenbroek spx_reply(ap, data, cnt)
418*7348b5c5SDavid van Moolenbroek Authenticator *ap;
419*7348b5c5SDavid van Moolenbroek unsigned char *data;
420*7348b5c5SDavid van Moolenbroek int cnt;
421*7348b5c5SDavid van Moolenbroek {
422*7348b5c5SDavid van Moolenbroek Session_Key skey;
423*7348b5c5SDavid van Moolenbroek
424*7348b5c5SDavid van Moolenbroek if (cnt-- < 1)
425*7348b5c5SDavid van Moolenbroek return;
426*7348b5c5SDavid van Moolenbroek switch (*data++) {
427*7348b5c5SDavid van Moolenbroek case SPX_REJECT:
428*7348b5c5SDavid van Moolenbroek if (cnt > 0) {
429*7348b5c5SDavid van Moolenbroek printf("[ SPX refuses authentication because %.*s ]\r\n",
430*7348b5c5SDavid van Moolenbroek cnt, data);
431*7348b5c5SDavid van Moolenbroek } else
432*7348b5c5SDavid van Moolenbroek printf("[ SPX refuses authentication ]\r\n");
433*7348b5c5SDavid van Moolenbroek auth_send_retry();
434*7348b5c5SDavid van Moolenbroek return;
435*7348b5c5SDavid van Moolenbroek case SPX_ACCEPT:
436*7348b5c5SDavid van Moolenbroek printf("[ SPX accepts you ]\n");
437*7348b5c5SDavid van Moolenbroek if ((ap->way & AUTH_HOW_MASK) == AUTH_HOW_MUTUAL) {
438*7348b5c5SDavid van Moolenbroek /*
439*7348b5c5SDavid van Moolenbroek * Send over the encrypted challenge.
440*7348b5c5SDavid van Moolenbroek */
441*7348b5c5SDavid van Moolenbroek input_token.value = (char *) data;
442*7348b5c5SDavid van Moolenbroek input_token.length = cnt;
443*7348b5c5SDavid van Moolenbroek
444*7348b5c5SDavid van Moolenbroek major_status = gss_init_sec_context(&status, /* minor stat */
445*7348b5c5SDavid van Moolenbroek GSS_C_NO_CREDENTIAL, /* cred handle */
446*7348b5c5SDavid van Moolenbroek &actual_ctxhandle, /* ctx handle */
447*7348b5c5SDavid van Moolenbroek desired_targname, /* target name */
448*7348b5c5SDavid van Moolenbroek GSS_C_NULL_OID, /* mech type */
449*7348b5c5SDavid van Moolenbroek req_flags, /* req flags */
450*7348b5c5SDavid van Moolenbroek 0, /* time req */
451*7348b5c5SDavid van Moolenbroek input_chan_bindings, /* chan binding */
452*7348b5c5SDavid van Moolenbroek &input_token, /* input token */
453*7348b5c5SDavid van Moolenbroek &actual_mech_type, /* actual mech */
454*7348b5c5SDavid van Moolenbroek &output_token, /* output token */
455*7348b5c5SDavid van Moolenbroek &ret_flags, /* ret flags */
456*7348b5c5SDavid van Moolenbroek &lifetime_rec); /* time rec */
457*7348b5c5SDavid van Moolenbroek
458*7348b5c5SDavid van Moolenbroek if (major_status != GSS_S_COMPLETE) {
459*7348b5c5SDavid van Moolenbroek gss_display_status(&new_status,
460*7348b5c5SDavid van Moolenbroek status,
461*7348b5c5SDavid van Moolenbroek GSS_C_MECH_CODE,
462*7348b5c5SDavid van Moolenbroek GSS_C_NULL_OID,
463*7348b5c5SDavid van Moolenbroek &msg_ctx,
464*7348b5c5SDavid van Moolenbroek &status_string);
465*7348b5c5SDavid van Moolenbroek printf("[ SPX mutual response fails ... '%s' ]\r\n",
466*7348b5c5SDavid van Moolenbroek status_string.value);
467*7348b5c5SDavid van Moolenbroek auth_send_retry();
468*7348b5c5SDavid van Moolenbroek return;
469*7348b5c5SDavid van Moolenbroek }
470*7348b5c5SDavid van Moolenbroek }
471*7348b5c5SDavid van Moolenbroek auth_finished(ap, AUTH_USER);
472*7348b5c5SDavid van Moolenbroek return;
473*7348b5c5SDavid van Moolenbroek
474*7348b5c5SDavid van Moolenbroek default:
475*7348b5c5SDavid van Moolenbroek return;
476*7348b5c5SDavid van Moolenbroek }
477*7348b5c5SDavid van Moolenbroek }
478*7348b5c5SDavid van Moolenbroek
479*7348b5c5SDavid van Moolenbroek int
spx_status(ap,name,l,level)480*7348b5c5SDavid van Moolenbroek spx_status(ap, name, l, level)
481*7348b5c5SDavid van Moolenbroek Authenticator *ap;
482*7348b5c5SDavid van Moolenbroek char *name;
483*7348b5c5SDavid van Moolenbroek size_t l;
484*7348b5c5SDavid van Moolenbroek int level;
485*7348b5c5SDavid van Moolenbroek {
486*7348b5c5SDavid van Moolenbroek
487*7348b5c5SDavid van Moolenbroek gss_buffer_desc fullname_buffer, acl_file_buffer;
488*7348b5c5SDavid van Moolenbroek gss_OID fullname_type;
489*7348b5c5SDavid van Moolenbroek char acl_file[160], fullname[160];
490*7348b5c5SDavid van Moolenbroek int major_status, status = 0;
491*7348b5c5SDavid van Moolenbroek struct passwd pws, *pwd;
492*7348b5c5SDavid van Moolenbroek char pwbuf[1024];
493*7348b5c5SDavid van Moolenbroek
494*7348b5c5SDavid van Moolenbroek /*
495*7348b5c5SDavid van Moolenbroek * hard code fullname to
496*7348b5c5SDavid van Moolenbroek * "SPX:/C=US/O=Digital/OU=LKG/OU=Sphinx/OU=Users/CN=Kannan Alagappan"
497*7348b5c5SDavid van Moolenbroek * and acl_file to "~kannan/.sphinx"
498*7348b5c5SDavid van Moolenbroek */
499*7348b5c5SDavid van Moolenbroek
500*7348b5c5SDavid van Moolenbroek if (getpwnam_r(UserNameRequested, &pws, pwbuf, sizeof(pwbuf), &pwd)
501*7348b5c5SDavid van Moolenbroek != 0 || pwd == NULL) {
502*7348b5c5SDavid van Moolenbroek return(AUTH_USER); /* not authenticated */
503*7348b5c5SDavid van Moolenbroek }
504*7348b5c5SDavid van Moolenbroek
505*7348b5c5SDavid van Moolenbroek strlcpy(acl_file, pwd->pw_dir, sizeof(acl_file));
506*7348b5c5SDavid van Moolenbroek strlcat(acl_file, "/.sphinx", sizeof(acl_file));
507*7348b5c5SDavid van Moolenbroek acl_file_buffer.value = acl_file;
508*7348b5c5SDavid van Moolenbroek acl_file_buffer.length = strlen(acl_file);
509*7348b5c5SDavid van Moolenbroek
510*7348b5c5SDavid van Moolenbroek major_status = gss_display_name(&status,
511*7348b5c5SDavid van Moolenbroek src_name,
512*7348b5c5SDavid van Moolenbroek &fullname_buffer,
513*7348b5c5SDavid van Moolenbroek &fullname_type);
514*7348b5c5SDavid van Moolenbroek
515*7348b5c5SDavid van Moolenbroek if (level < AUTH_USER)
516*7348b5c5SDavid van Moolenbroek return(level);
517*7348b5c5SDavid van Moolenbroek
518*7348b5c5SDavid van Moolenbroek major_status = gss__check_acl(&status, &fullname_buffer,
519*7348b5c5SDavid van Moolenbroek &acl_file_buffer);
520*7348b5c5SDavid van Moolenbroek
521*7348b5c5SDavid van Moolenbroek if (major_status == GSS_S_COMPLETE) {
522*7348b5c5SDavid van Moolenbroek strlcpy(name, UserNameRequested, l);
523*7348b5c5SDavid van Moolenbroek return(AUTH_VALID);
524*7348b5c5SDavid van Moolenbroek } else {
525*7348b5c5SDavid van Moolenbroek return(AUTH_USER);
526*7348b5c5SDavid van Moolenbroek }
527*7348b5c5SDavid van Moolenbroek
528*7348b5c5SDavid van Moolenbroek }
529*7348b5c5SDavid van Moolenbroek
530*7348b5c5SDavid van Moolenbroek #define BUMP(buf, len) while (*(buf)) {++(buf), --(len);}
531*7348b5c5SDavid van Moolenbroek #define ADDC(buf, len, c) if ((len) > 0) {*(buf)++ = (c); --(len);}
532*7348b5c5SDavid van Moolenbroek
533*7348b5c5SDavid van Moolenbroek void
spx_printsub(data,cnt,buf,buflen)534*7348b5c5SDavid van Moolenbroek spx_printsub(data, cnt, buf, buflen)
535*7348b5c5SDavid van Moolenbroek unsigned char *data, *buf;
536*7348b5c5SDavid van Moolenbroek int cnt, buflen;
537*7348b5c5SDavid van Moolenbroek {
538*7348b5c5SDavid van Moolenbroek char lbuf[32];
539*7348b5c5SDavid van Moolenbroek register int i;
540*7348b5c5SDavid van Moolenbroek
541*7348b5c5SDavid van Moolenbroek buf[buflen-1] = '\0'; /* make sure its NULL terminated */
542*7348b5c5SDavid van Moolenbroek buflen -= 1;
543*7348b5c5SDavid van Moolenbroek
544*7348b5c5SDavid van Moolenbroek switch(data[3]) {
545*7348b5c5SDavid van Moolenbroek case SPX_REJECT: /* Rejected (reason might follow) */
546*7348b5c5SDavid van Moolenbroek strncpy((char *)buf, " REJECT ", buflen);
547*7348b5c5SDavid van Moolenbroek goto common;
548*7348b5c5SDavid van Moolenbroek
549*7348b5c5SDavid van Moolenbroek case SPX_ACCEPT: /* Accepted (name might follow) */
550*7348b5c5SDavid van Moolenbroek strncpy((char *)buf, " ACCEPT ", buflen);
551*7348b5c5SDavid van Moolenbroek common:
552*7348b5c5SDavid van Moolenbroek BUMP(buf, buflen);
553*7348b5c5SDavid van Moolenbroek if (cnt <= 4)
554*7348b5c5SDavid van Moolenbroek break;
555*7348b5c5SDavid van Moolenbroek ADDC(buf, buflen, '"');
556*7348b5c5SDavid van Moolenbroek for (i = 4; i < cnt; i++)
557*7348b5c5SDavid van Moolenbroek ADDC(buf, buflen, data[i]);
558*7348b5c5SDavid van Moolenbroek ADDC(buf, buflen, '"');
559*7348b5c5SDavid van Moolenbroek ADDC(buf, buflen, '\0');
560*7348b5c5SDavid van Moolenbroek break;
561*7348b5c5SDavid van Moolenbroek
562*7348b5c5SDavid van Moolenbroek case SPX_AUTH: /* Authentication data follows */
563*7348b5c5SDavid van Moolenbroek strncpy((char *)buf, " AUTH", buflen);
564*7348b5c5SDavid van Moolenbroek goto common2;
565*7348b5c5SDavid van Moolenbroek
566*7348b5c5SDavid van Moolenbroek default:
567*7348b5c5SDavid van Moolenbroek snprintf(lbuf, sizeof(lbuf), " %d (unknown)", data[3]);
568*7348b5c5SDavid van Moolenbroek strncpy((char *)buf, lbuf, buflen);
569*7348b5c5SDavid van Moolenbroek common2:
570*7348b5c5SDavid van Moolenbroek BUMP(buf, buflen);
571*7348b5c5SDavid van Moolenbroek for (i = 4; i < cnt; i++) {
572*7348b5c5SDavid van Moolenbroek snprintf(lbuf, sizeof(lbuf), " %d", data[i]);
573*7348b5c5SDavid van Moolenbroek strncpy((char *)buf, lbuf, buflen);
574*7348b5c5SDavid van Moolenbroek BUMP(buf, buflen);
575*7348b5c5SDavid van Moolenbroek }
576*7348b5c5SDavid van Moolenbroek break;
577*7348b5c5SDavid van Moolenbroek }
578*7348b5c5SDavid van Moolenbroek }
579*7348b5c5SDavid van Moolenbroek
580*7348b5c5SDavid van Moolenbroek #endif
581*7348b5c5SDavid van Moolenbroek
582*7348b5c5SDavid van Moolenbroek #ifdef notdef
583*7348b5c5SDavid van Moolenbroek
prkey(msg,key)584*7348b5c5SDavid van Moolenbroek prkey(msg, key)
585*7348b5c5SDavid van Moolenbroek char *msg;
586*7348b5c5SDavid van Moolenbroek unsigned char *key;
587*7348b5c5SDavid van Moolenbroek {
588*7348b5c5SDavid van Moolenbroek register int i;
589*7348b5c5SDavid van Moolenbroek printf("%s:", msg);
590*7348b5c5SDavid van Moolenbroek for (i = 0; i < 8; i++)
591*7348b5c5SDavid van Moolenbroek printf(" %3d", key[i]);
592*7348b5c5SDavid van Moolenbroek printf("\r\n");
593*7348b5c5SDavid van Moolenbroek }
594*7348b5c5SDavid van Moolenbroek #endif
595