auth-prototypes-20090316
[openafs.git] / src / auth / authcon.c
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 #include <afsconfig.h>
11 #if defined(UKERNEL)
12 #include "afs/param.h"
13 #else
14 #include <afs/param.h>
15 #endif
16
17 RCSID
18     ("$Header$");
19
20 #if defined(UKERNEL)
21 #include "afs/sysincludes.h"
22 #include "afsincludes.h"
23 #include "afs/stds.h"
24 #include "afs/pthread_glock.h"
25 #include "des/des.h"
26 #include "des/des_prototypes.h"
27 #include "rx/rxkad.h"
28 #include "rx/rx.h"
29 #include "afs/cellconfig.h"
30 #include "afs/keys.h"
31 #include "afs/auth.h"
32 #include "afs/pthread_glock.h"
33 #else /* defined(UKERNEL) */
34 #include <afs/stds.h>
35 #include <afs/pthread_glock.h>
36 #include <sys/types.h>
37 #ifdef AFS_NT40_ENV
38 #include <winsock2.h>
39 #else
40 #include <sys/file.h>
41 #include <sys/time.h>
42 #include <netinet/in.h>
43 #include <netdb.h>
44 #endif
45 #include <string.h>
46 #include <stdio.h>
47 #include <des.h>
48 #include <des_prototypes.h>
49 #include <rx/rxkad.h>
50 #include <rx/rx.h>
51 #include "cellconfig.h"
52 #include "keys.h"
53 #include "auth.h"
54 #endif /* defined(UKERNEL) */
55
56 /* return a null security object if nothing else can be done */
57 static afs_int32
58 QuickAuth(struct rx_securityClass **astr, afs_int32 *aindex)
59 {
60     register struct rx_securityClass *tc;
61     tc = rxnull_NewClientSecurityObject();
62     *astr = tc;
63     *aindex = 0;
64     return 0;
65 }
66
67 #if !defined(UKERNEL)
68 /* Return an appropriate security class and index */
69 afs_int32
70 afsconf_ServerAuth(void *arock,
71                    struct rx_securityClass **astr, 
72                    afs_int32 *aindex)
73 {
74     struct afsconf_dir *adir = (struct afsconf_dir *) arock;
75     register struct rx_securityClass *tclass;
76
77     LOCK_GLOBAL_MUTEX;
78     tclass = (struct rx_securityClass *)
79         rxkad_NewServerSecurityObject(0, adir, afsconf_GetKey, NULL);
80     if (tclass) {
81         *astr = tclass;
82         *aindex = 2;            /* kerberos security index */
83         UNLOCK_GLOBAL_MUTEX;
84         return 0;
85     } else {
86         UNLOCK_GLOBAL_MUTEX;
87         return 2;
88     }
89 }
90 #endif /* !defined(UKERNEL) */
91
92 static afs_int32
93 GenericAuth(struct afsconf_dir *adir, 
94             struct rx_securityClass **astr, 
95             afs_int32 *aindex, 
96             rxkad_level enclevel)
97 {
98     char tbuffer[256];
99     struct ktc_encryptionKey key, session;
100     struct rx_securityClass *tclass;
101     afs_int32 kvno;
102     afs_int32 ticketLen;
103     register afs_int32 code;
104
105     /* first, find the right key and kvno to use */
106     code = afsconf_GetLatestKey(adir, &kvno, &key);
107     if (code) {
108         return QuickAuth(astr, aindex);
109     }
110
111     /* next create random session key, using key for seed to good random */
112     des_init_random_number_generator(&key);
113     code = des_random_key(&session);
114     if (code) {
115         return QuickAuth(astr, aindex);
116     }
117
118     /* now create the actual ticket */
119     ticketLen = sizeof(tbuffer);
120     memset(tbuffer, '\0', sizeof(tbuffer));
121     code =
122         tkt_MakeTicket(tbuffer, &ticketLen, &key, AUTH_SUPERUSER, "", "", 0,
123                        0xffffffff, &session, 0, "afs", "");
124     /* parms were buffer, ticketlen, key to seal ticket with, principal
125      * name, instance and cell, start time, end time, session key to seal
126      * in ticket, inet host, server name and server instance */
127     if (code) {
128         return QuickAuth(astr, aindex);
129     }
130
131     /* Next, we have ticket, kvno and session key, authenticate the connection.
132      * We use a magic # instead of a constant because of basic compilation
133      * order when compiling the system from scratch (rx/rxkad.h isn't installed
134      * yet). */
135     tclass = (struct rx_securityClass *)
136         rxkad_NewClientSecurityObject(enclevel, &session, kvno, ticketLen,
137                                       tbuffer);
138     *astr = tclass;
139     *aindex = 2;                /* kerberos security index */
140     return 0;
141 }
142
143 /* build a fake ticket for 'afs' using keys from adir, returning an
144  * appropriate security class and index
145  */
146 afs_int32
147 afsconf_ClientAuth(void *arock, struct rx_securityClass ** astr,
148                    afs_int32 * aindex)
149 {
150     struct afsconf_dir * adir = (struct afsconf_dir *) arock;
151     afs_int32 rc;
152
153     LOCK_GLOBAL_MUTEX;
154     rc = GenericAuth(adir, astr, aindex, rxkad_clear);
155     UNLOCK_GLOBAL_MUTEX;
156     return rc;
157 }
158
159 /* build a fake ticket for 'afs' using keys from adir, returning an
160  * appropriate security class and index.  This one, unlike the above,
161  * tells rxkad to encrypt the data, too.
162  */
163 afs_int32
164 afsconf_ClientAuthSecure(void *arock, 
165                          struct rx_securityClass **astr, 
166                          afs_int32 *aindex)
167 {
168     struct afsconf_dir *adir = (struct afsconf_dir *) arock;
169     afs_int32 rc;
170
171     LOCK_GLOBAL_MUTEX;
172     rc = GenericAuth(adir, astr, aindex, rxkad_crypt);
173     UNLOCK_GLOBAL_MUTEX;
174     return rc;
175 }