|
|
1.1 root 1: /*
2: * $Source: /mit/kerberos/src/admin/RCS/kdb_init.c,v $
3: * $Author: jtkohl $
4: *
5: * Copyright 1987, 1988 by the Massachusetts Institute of Technology.
6: *
7: * For copying and distribution information, please see the file
8: * <mit-copyright.h>.
9: *
10: * program to initialize the database, reports error if database file
11: * already exists.
12: */
13:
14: #ifndef lint
15: static char rcsid_kdb_init_c[] =
16: "$Header: kdb_init.c,v 4.0 89/01/24 21:50:45 jtkohl Exp $";
17: #endif lint
18:
19: #include <mit-copyright.h>
20: #include <stdio.h>
21: #include <sys/types.h>
22: #include <sys/file.h>
23: #include <sys/time.h>
24: #include <des.h>
25: #include <krb.h>
26: #include <krb_db.h>
27: #include <string.h>
28:
29: #define TRUE 1
30:
31: enum ap_op {
32: NULL_KEY, /* setup null keys */
33: MASTER_KEY, /* use master key as new key */
34: RANDOM_KEY, /* choose a random key */
35: };
36:
37: int debug = 0;
38: char *progname, *rindex();
39: C_Block master_key;
40: Key_schedule master_key_schedule;
41:
42: main(argc, argv)
43: char *argv[];
44: {
45: char realm[REALM_SZ];
46: char *cp;
47: int code;
48: extern char *sys_errlist[];
49: char *database;
50:
51: progname = (cp = rindex(*argv, '/')) ? cp + 1 : *argv;
52:
53: if (argc > 3) {
54: fprintf(stderr, "Usage: %s [realm-name] [database-name]\n", argv[0]);
55: exit(1);
56: }
57: if (argc == 3) {
58: database = argv[2];
59: --argc;
60: } else
61: database = DBM_FILE;
62:
63: /* Do this first, it'll fail if the database exists */
64: if ((code = kerb_db_create(database)) != 0) {
65: fprintf(stderr, "Couldn't create database: %s\n",
66: sys_errlist[code]);
67: exit(1);
68: }
69: kerb_db_set_name(database);
70:
71: if (argc == 2)
72: strncpy(realm, argv[1], REALM_SZ);
73: else {
74: fprintf(stderr, "Realm name [default %s ]: ", KRB_REALM);
75: if (fgets(realm, sizeof(realm), stdin) == NULL) {
76: fprintf(stderr, "\nEOF reading realm\n");
77: exit(1);
78: }
79: if (cp = index(realm, '\n'))
80: *cp = '\0';
81: if (!*realm) /* no realm given */
82: strcpy(realm, KRB_REALM);
83: }
84: if (!k_isrealm(realm)) {
85: fprintf(stderr, "%s: Bad kerberos realm name \"%s\"\n",
86: progname, realm);
87: exit(1);
88: }
89: printf("You will be prompted for the database Master Password.\n");
90: printf("It is important that you NOT FORGET this password.\n");
91: fflush(stdout);
92:
93: if (kdb_get_master_key (TRUE, master_key, master_key_schedule) != 0) {
94: fprintf (stderr, "Couldn't read master key.\n");
95: exit (-1);
96: }
97:
98: if (
99: add_principal(KERB_M_NAME, KERB_M_INST, MASTER_KEY) ||
100: add_principal(KERB_DEFAULT_NAME, KERB_DEFAULT_INST, NULL_KEY) ||
101: add_principal("krbtgt", realm, RANDOM_KEY) ||
102: add_principal("changepw", KRB_MASTER, RANDOM_KEY)
103: ) {
104: fprintf(stderr, "\n%s: couldn't initialize database.\n",
105: progname);
106: exit(1);
107: }
108:
109: /* play it safe */
110: bzero (master_key, sizeof (C_Block));
111: bzero (master_key_schedule, sizeof (Key_schedule));
112: exit(0);
113: }
114:
115: /* use a return code to indicate success or failure. check the return */
116: /* values of the routines called by this routine. */
117:
118: add_principal(name, instance, aap_op)
119: char *name, *instance;
120: enum ap_op aap_op;
121: {
122: Principal principal;
123: char datestring[50];
124: char pw_str[255];
125: void read_pw_string();
126: void string_to_key();
127: void random_key();
128: struct tm *tm, *localtime();
129: C_Block new_key;
130:
131: bzero(&principal, sizeof(principal));
132: strncpy(principal.name, name, ANAME_SZ);
133: strncpy(principal.instance, instance, INST_SZ);
134: switch (aap_op) {
135: case NULL_KEY:
136: principal.key_low = 0;
137: principal.key_high = 0;
138: break;
139: case RANDOM_KEY:
140: #ifdef NOENCRYPTION
141: bzero(new_key, sizeof(C_Block));
142: new_key[0] = 127;
143: #else
144: random_key(new_key);
145: #endif
146: kdb_encrypt_key (new_key, new_key, master_key, master_key_schedule,
147: ENCRYPT);
148: bcopy(new_key, &principal.key_low, 4);
149: bcopy(((long *) new_key) + 1, &principal.key_high, 4);
150: break;
151: case MASTER_KEY:
152: bcopy (master_key, new_key, sizeof (C_Block));
153: kdb_encrypt_key (new_key, new_key, master_key, master_key_schedule,
154: ENCRYPT);
155: bcopy(new_key, &principal.key_low, 4);
156: bcopy(((long *) new_key) + 1, &principal.key_high, 4);
157: break;
158: }
159: principal.exp_date = 946702799; /* Happy new century */
160: strncpy(principal.exp_date_txt, "12/31/99", DATE_SZ);
161: principal.mod_date = time(0);
162:
163: tm = localtime(&principal.mod_date);
164: principal.attributes = 0;
165: principal.max_life = 255;
166:
167: principal.kdc_key_ver = 1;
168: principal.key_version = 1;
169:
170: strncpy(principal.mod_name, "db_creation", ANAME_SZ);
171: strncpy(principal.mod_instance, "", INST_SZ);
172: principal.old = 0;
173:
174: kerb_db_put_principal(&principal, 1);
175:
176: /* let's play it safe */
177: bzero (new_key, sizeof (C_Block));
178: bzero (&principal.key_low, 4);
179: bzero (&principal.key_high, 4);
180: return 0;
181: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.