1 /*
2  * Copyright (c) 1989 The Regents of the University of California.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms are permitted
6  * provided that the above copyright notice and this paragraph are
7  * duplicated in all such forms and that any documentation,
8  * advertising materials, and other materials related to such
9  * distribution and use acknowledge that the software was developed
10  * by the University of California, Berkeley.  The name of the
11  * University may not be used to endorse or promote products derived
12  * from this software without specific prior written permission.
13  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16  */
17 
18 #ifndef lint
19 static char sccsid[] = "@(#)make_keypair.c	1.5 (Berkeley) 06/25/90";
20 #endif /* not lint */
21 
22 #include <sys/types.h>
23 #include <sys/file.h>
24 #include <netinet/in.h>
25 #include <stdio.h>
26 #include <netdb.h>
27 #include <kerberosIV/des.h>
28 #include <kerberosIV/krb.h>
29 #include "pathnames.h"
30 #include "register_proto.h"
31 
32 extern void random_key(), herror();
33 void make_key(), usage();
34 
35 main(argc, argv)
36 	int	argc;
37 	char	**argv;
38 {
39 	struct hostent	*hp;
40 	char		*addr;
41 	int		i;
42 	struct sockaddr_in	sin;
43 
44 	if (argc != 2) {
45 		usage(argv[0]);
46 		exit(1);
47 	}
48 
49 	if ((hp = gethostbyname(argv[1])) == NULL) {
50 		herror(argv[1]);
51 		exit(1);
52 	}
53 
54 	for (i = 0; addr = hp->h_addr_list[i]; i++) {
55 		addr = hp->h_addr_list[i];
56 		bcopy(addr, &sin.sin_addr, hp->h_length);
57 
58 		printf("Making key for host %s (%s)\n",
59 			argv[1], inet_ntoa(sin.sin_addr));
60 		make_key(sin.sin_addr);
61 	}
62 	printf("==========\n");
63 	printf("One copy of the each key should be put in %s on the\n",
64 		SERVER_KEYDIR);
65 	printf("Kerberos server machine (mode 600, owner root).\n");
66 	printf("Another copy of each key should be put on the named\n");
67 	printf("client as %sXXX.XXX.XXX.XXX (same modes as above),\n",
68 		CLIENT_KEYFILE);
69 	printf("where the X's refer to digits of the host's inet address.\n");
70 	(void)fflush(stdout);
71 	exit(0);
72 }
73 
74 void
75 make_key(addr)
76 	struct in_addr	addr;
77 {
78 	struct keyfile_data	kfile;
79 	char		namebuf[255];
80 	int		fd;
81 
82 	(void)sprintf(namebuf, ".%s%s",
83 		CLIENT_KEYFILE,
84 		inet_ntoa(addr));
85 	fd = open(namebuf, O_WRONLY|O_CREAT, 0600);
86 	if (fd < 0) {
87 		perror("open");
88 		exit(1);
89 	}
90 	random_key(kfile.kf_key);
91 	printf("writing to file -> %s ...", namebuf);
92 	if (write(fd, &kfile, sizeof(kfile)) != sizeof(kfile)) {
93 		fprintf(stderr, "error writing file %s\n", namebuf);
94 	}
95 	printf("done.\n");
96 	(void)close(fd);
97 	return;
98 }
99 
100 void
101 usage(name)
102 	char	*name;
103 {
104 	fprintf(stderr, "usage: %s host\n", name);
105 }
106