2 * Copyright 1987, 1988 by the Massachusetts Institute of Technology.
4 * For copying and distribution information, please see the file
7 * program to initialize the database, reports error if database file
10 /* $FreeBSD: src/crypto/kerberosIV/admin/kdb_init.c,v 1.1.1.3.2.1 2003/02/14 22:37:37 nectar Exp $ */
11 /* $DragonFly: src/crypto/kerberosIV/admin/Attic/kdb_init.c,v 1.2 2003/06/17 04:24:36 dillon Exp $ */
15 RCSID("$Id: kdb_init.c,v 1.25 1999/09/16 20:37:21 assar Exp $");
18 NULL_KEY, /* setup null keys */
19 MASTER_KEY, /* use master key as new key */
20 RANDOM_KEY /* choose a random key */
23 static des_cblock master_key;
24 static des_key_schedule master_key_schedule;
26 /* use a return code to indicate success or failure. check the return */
27 /* values of the routines called by this routine. */
30 add_principal(char *name, char *instance, enum ap_op aap_op, int maxlife)
35 memset(&principal, 0, sizeof(principal));
36 strlcpy(principal.name, name, ANAME_SZ);
37 strlcpy(principal.instance, instance, INST_SZ);
40 principal.key_low = 0;
41 principal.key_high = 0;
45 memset(new_key, 0, sizeof(des_cblock));
48 des_random_key(new_key);
50 kdb_encrypt_key (&new_key, &new_key, &master_key, master_key_schedule,
52 copy_from_key(new_key, &principal.key_low, &principal.key_high);
53 memset(new_key, 0, sizeof(new_key));
56 memcpy(new_key, master_key, sizeof (des_cblock));
57 kdb_encrypt_key (&new_key, &new_key, &master_key, master_key_schedule,
59 copy_from_key(new_key, &principal.key_low, &principal.key_high);
62 principal.mod_date = time(0);
63 *principal.mod_date_txt = '\0';
64 principal.exp_date = principal.mod_date + 5 * 365 * 24 * 60 * 60;
65 *principal.exp_date_txt = '\0';
67 principal.attributes = 0;
68 principal.max_life = maxlife;
70 principal.kdc_key_ver = 1;
71 principal.key_version = 1;
73 strlcpy(principal.mod_name, "db_creation", ANAME_SZ);
74 strlcpy(principal.mod_instance, "", INST_SZ);
77 if (kerb_db_put_principal(&principal, 1) != 1)
80 /* let's play it safe */
81 memset(new_key, 0, sizeof (des_cblock));
82 memset(&principal.key_low, 0, 4);
83 memset(&principal.key_high, 0, 4);
88 main(int argc, char **argv)
95 set_progname (argv[0]);
98 fprintf(stderr, "Usage: %s [realm-name] [database-name]\n", argv[0]);
107 /* Do this first, it'll fail if the database exists */
108 if ((code = kerb_db_create(database)) != 0)
109 err (1, "Couldn't create database %s", database);
110 kerb_db_set_name(database);
113 strlcpy(realm, argv[1], REALM_SZ);
115 if (krb_get_lrealm(realm, 1) != KSUCCESS)
116 strlcpy(realm, KRB_REALM, REALM_SZ);
117 fprintf(stderr, "Realm name [default %s ]: ", realm);
118 if (fgets(realm, sizeof(realm), stdin) == NULL)
119 errx (1, "\nEOF reading realm");
120 if ((cp = strchr(realm, '\n')))
122 if (!*realm) /* no realm given */
123 if (krb_get_lrealm(realm, 1) != KSUCCESS)
124 strlcpy(realm, KRB_REALM, REALM_SZ);
126 if (!k_isrealm(realm))
127 errx (1, "Bad kerberos realm name \"%s\"", realm);
129 printf("You will be prompted for the database Master Password.\n");
130 printf("It is important that you NOT FORGET this password.\n");
132 printf("To generate a master key, please enter some random data.\n");
133 printf("You do not have to remember this.\n");
137 if (kdb_get_master_key (KDB_GET_TWICE, &master_key,
138 master_key_schedule) != 0)
139 errx (1, "Couldn't read master key.");
142 if(kdb_kstash(&master_key, MKEYFILE) < 0)
143 err (1, "Error writing master key");
144 fprintf(stderr, "Wrote master key to %s\n", MKEYFILE);
147 /* Maximum lifetime for changepw.kerberos (kadmin) tickets, 10 minutes */
148 #define ADMLIFE (1 + (CLOCK_SKEW/(5*60)))
150 /* Maximum lifetime for ticket granting tickets, 4 days or 21.25h */
151 #define TGTLIFE ((krb_life_to_time(0, 162) >= 24*60*60) ? 161 : 255)
153 /* This means that default lifetimes have not been initialized */
159 add_principal(KERB_M_NAME, KERB_M_INST, MASTER_KEY, NOLIFE) ||
160 add_principal(KERB_DEFAULT_NAME, KERB_DEFAULT_INST, NULL_KEY,DEFLIFE)||
161 add_principal(KRB_TICKET_GRANTING_TICKET, realm, RANDOM_KEY, TGTLIFE)||
162 add_principal(PWSERV_NAME, KRB_MASTER, RANDOM_KEY, ADMLIFE)
165 errx (1, "couldn't initialize database.");
169 memset(master_key, 0, sizeof (des_cblock));
170 memset(master_key_schedule, 0, sizeof (des_key_schedule));