|
|
1.1 root 1:
2: /*
3: * Copyright (c) 1989 The Regents of the University of California.
4: * All rights reserved.
5: *
6: * Redistribution and use in source and binary forms are permitted
7: * provided that the above copyright notice and this paragraph are
8: * duplicated in all such forms and that any documentation,
9: * advertising materials, and other materials related to such
10: * distribution and use acknowledge that the software was developed
11: * by the University of California, Berkeley. The name of the
12: * University may not be used to endorse or promote products derived
13: * from this software without specific prior written permission.
14: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
15: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
16: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
17: */
18:
19: #ifndef lint
20: static char sccsid[] = "@(#)registerd.c 1.7 (Berkeley) 5/11/90";
21: #endif /* not lint */
22:
23: #include <sys/types.h>
24: #include <sys/time.h>
25: #include <sys/signal.h>
26: #include <sys/resource.h>
27: #include <sys/param.h>
28: #include <sys/file.h>
29: #include <netinet/in.h>
30: #include <stdio.h>
31: #include <syslog.h>
32: #include <kerberosIV/des.h>
33: #include <kerberosIV/krb.h>
34: #include <kerberosIV/krb_db.h>
35: #include "pathnames.h"
36: #include "register_proto.h"
37:
38: #define KBUFSIZ (sizeof(struct keyfile_data))
39: #define CRYPT 0x00
40: #define CLEAR 0x01
41:
42: char *progname;
43: struct sockaddr_in sin;
44: char msgbuf[BUFSIZ];
45:
46: int die();
47:
48: main(argc, argv)
49: char **argv;
50: {
51: int kf;
52: char keyfile[MAXPATHLEN];
53: static Key_schedule schedule;
54: u_char code;
55: char keybuf[KBUFSIZ];
56: int retval, sval;
57: struct keyfile_data *kfile;
58: static struct rlimit rl = { 0, 0 };
59:
60: openlog("registerd", LOG_PID, LOG_AUTH);
61:
62: progname = argv[0];
63:
64: signal(SIGHUP, SIG_IGN);
65: signal(SIGINT, SIG_IGN);
66: signal(SIGTSTP, SIG_IGN);
67: signal(SIGPIPE, die);
68: if (setrlimit(RLIMIT_CORE, &rl) < 0) {
69: syslog(LOG_ERR, "setrlimit: %m");
70: exit(1);
71: }
72:
73:
74: /* figure out who we are talking to */
75:
76: sval = sizeof(sin);
77: if (getpeername(0, (struct sockaddr *) &sin, &sval) < 0) {
78: syslog(LOG_ERR, "getpeername: %m");
79: exit(1);
80: }
81:
82: /* get encryption key */
83:
84: (void) sprintf(keyfile, "%s%s%s",
85: SERVER_KEYDIR,
86: CLIENT_KEYFILE,
87: inet_ntoa(sin.sin_addr));
88:
89: if ((kf = open(keyfile, O_RDONLY)) < 0) {
90: syslog(LOG_ERR,
91: "error opening Kerberos update keyfile (%s): %m", keyfile);
92: (void) sprintf(msgbuf,
93: "couldn't open session keyfile for your host");
94: send_packet(msgbuf, CLEAR);
95: exit(1);
96: }
97:
98: if (read(kf, keybuf, KBUFSIZ) != KBUFSIZ) {
99: syslog(LOG_ERR, "wrong read size of Kerberos update keyfile");
100: (void) sprintf(msgbuf,
101: "couldn't read session key from your host's keyfile");
102: send_packet(msgbuf, CLEAR);
103: exit(1);
104: }
105: (void) sprintf(msgbuf, GOTKEY_MSG);
106: send_packet(msgbuf, CLEAR);
107: kfile = (struct keyfile_data *) keybuf;
108: key_sched(kfile->kf_key, schedule);
109: des_set_key(kfile->kf_key, schedule);
110:
111: /* read the command code byte */
112:
113: if (des_read(0, &code, 1) == 1) {
114:
115: switch(code) {
116: case APPEND_DB:
117: retval = do_append();
118: break;
119: case ABORT:
120: cleanup();
121: close(0);
122: exit(0);
123: default:
124: retval = KFAILURE;
125: syslog(LOG_NOTICE,
126: "invalid command code on db update (0x%x)",
127: code);
128: }
129:
130: } else {
131: retval = KFAILURE;
132: syslog(LOG_ERR, "couldn't read command code on Kerberos update");
133: }
134:
135: code = (u_char) retval;
136: if (code != KSUCCESS) {
137: (void) sprintf(msgbuf, "%s", krb_err_txt[code]);
138: send_packet(msgbuf, CRYPT);
139: } else {
140: (void) sprintf(msgbuf, "Update complete.");
141: send_packet(msgbuf, CRYPT);
142: }
143: cleanup();
144: close(0);
145: exit(0);
146: }
147:
148: #define MAX_PRINCIPAL 10
149: static Principal principal_data[MAX_PRINCIPAL];
150: static C_Block key, master_key;
151: static Key_schedule master_key_schedule;
152: int
153: do_append()
154: {
155: Principal default_princ;
156: char input_name[ANAME_SZ];
157: char input_instance[INST_SZ];
158: int j,n, more;
159: long mkeyversion;
160:
161:
162:
163: /* get master key from MKEYFILE */
164: if (kdb_get_master_key(0, master_key, master_key_schedule) != 0) {
165: syslog(LOG_ERR, "couldn't get master key");
166: return(KFAILURE);
167: }
168:
169: mkeyversion = kdb_verify_master_key(master_key, master_key_schedule, NULL);
170: if (mkeyversion < 0) {
171: syslog(LOG_ERR, "couldn't validate master key");
172: return(KFAILURE);
173: }
174:
175: n = kerb_get_principal(KERB_DEFAULT_NAME, KERB_DEFAULT_INST,
176: &default_princ, 1, &more);
177:
178: if (n != 1) {
179: syslog(LOG_ERR, "couldn't get default principal");
180: return(KFAILURE);
181: }
182:
183: /*
184: * get principal name, instance, and password from network.
185: * convert password to key and store it
186: */
187:
188: if (net_get_principal(input_name, input_instance, key) != 0) {
189: return(KFAILURE);
190: }
191:
192:
193: j = kerb_get_principal(
194: input_name,
195: input_instance,
196: principal_data,
197: MAX_PRINCIPAL,
198: &more
199: );
200:
201: if (j != 0) {
202: /* already in database, no update */
203: syslog(LOG_NOTICE,
204: "attempt to add duplicate entry for principal %s.%s",
205: input_name, input_instance);
206: return(KDC_PR_N_UNIQUE);
207: }
208:
209: /*
210: * set up principal's name, instance
211: */
212:
213: strcpy(principal_data[0].name, input_name);
214: strcpy(principal_data[0].instance, input_instance);
215: principal_data[0].old = NULL;
216:
217:
218: /* and the expiration date and version #s */
219:
220: principal_data[0].exp_date = default_princ.exp_date;
221: strcpy(principal_data[0].exp_date_txt, default_princ.exp_date_txt);
222: principal_data[0].max_life = default_princ.max_life;
223: principal_data[0].attributes = default_princ.attributes;
224: principal_data[0].kdc_key_ver = default_princ.kdc_key_ver;
225:
226:
227: /* and the key */
228:
229: kdb_encrypt_key(key, key, master_key, master_key_schedule,
230: ENCRYPT);
231: bcopy(key, &principal_data[0].key_low, 4);
232: bcopy(((long *) key) + 1, &principal_data[0].key_high,4);
233: bzero(key, sizeof(key));
234:
235: principal_data[0].key_version = 1; /* 1st entry */
236:
237: /* and write it to the database */
238:
239: if (kerb_put_principal(&principal_data[0], 1)) {
240: syslog(LOG_INFO, "Kerberos update failure: put_principal failed");
241: return(KFAILURE);
242: }
243:
244: syslog(LOG_NOTICE, "Kerberos update: wrote new record for %s.%s from %s",
245: principal_data[0].name,
246: principal_data[0].instance,
247: inet_ntoa(sin.sin_addr)
248: );
249:
250: return(KSUCCESS);
251:
252: }
253:
254: send_packet(msg,flag)
255: char *msg;
256: int flag;
257: {
258: int len = strlen(msg);
259: msg[len++] = '\n';
260: msg[len] = '\0';
261: if (len > sizeof(msgbuf)) {
262: syslog(LOG_ERR, "send_packet: invalid msg size");
263: return;
264: }
265: if (flag == CRYPT) {
266: if (des_write(0, msg, len) != len)
267: syslog(LOG_ERR, "couldn't write reply message");
268: } else if (flag == CLEAR) {
269: if (write(0, msg, len) != len)
270: syslog(LOG_ERR, "couldn't write reply message");
271: } else
272: syslog(LOG_ERR, "send_packet: invalid flag (%d)", flag);
273:
274: }
275:
276: net_get_principal(pname, iname, keyp)
277: char *pname, *iname;
278: C_Block *keyp;
279: {
280: int cc;
281: static char password[255];
282:
283: cc = des_read(0, pname, ANAME_SZ);
284: if (cc != ANAME_SZ) {
285: syslog(LOG_ERR, "couldn't get principal name");
286: return(-1);
287: }
288:
289: cc = des_read(0, iname, INST_SZ);
290: if (cc != INST_SZ) {
291: syslog(LOG_ERR, "couldn't get instance name");
292: return(-1);
293: }
294:
295: cc = des_read(0, password, 255);
296: if (cc != 255) {
297: syslog(LOG_ERR, "couldn't get password");
298: bzero(password, 255);
299: return(-1);
300: }
301:
302: string_to_key(password, *keyp);
303: bzero(password, 255);
304: return(0);
305: }
306:
307: cleanup()
308: {
309: bzero(master_key, sizeof(master_key));
310: bzero(key, sizeof(key));
311: bzero(master_key_schedule, sizeof(master_key_schedule));
312: }
313:
314: die()
315: {
316: syslog(LOG_ERR, "remote end died (SIGPIPE)");
317: cleanup();
318: exit(1);
319: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.