|
|
1.1 ! root 1: /* ! 2: * $Source: /mit/kerberos/src/lib/kdb/RCS/krb_kdb_utils.c,v $ ! 3: * $Author: jtkohl $ ! 4: * ! 5: * Copyright 1988 by the Massachusetts Institute of Technology. ! 6: * ! 7: * For copying and distribution information, please see the file ! 8: * <mit-copyright.h>. ! 9: * ! 10: * Utility routines for Kerberos programs which directly access ! 11: * the database. This code was duplicated in too many places ! 12: * before I gathered it here. ! 13: * ! 14: * Jon Rochlis, MIT Telecom, March 1988 ! 15: */ ! 16: ! 17: #ifndef lint ! 18: static char rcsid_krb_kdb_utils_c[] = ! 19: "$Header: /mit/kerberos/src/lib/kdb/RCS/krb_kdb_utils.c,v 4.1 89/07/26 11:01:12 jtkohl Exp $"; ! 20: #endif lint ! 21: ! 22: #include <mit-copyright.h> ! 23: #include <des.h> ! 24: #include <krb.h> ! 25: #include <krb_db.h> ! 26: #include <kdc.h> ! 27: #include <stdio.h> ! 28: #include <sys/file.h> ! 29: ! 30: long kdb_get_master_key(prompt, master_key, master_key_sched) ! 31: int prompt; ! 32: C_Block master_key; ! 33: Key_schedule master_key_sched; ! 34: { ! 35: int kfile; ! 36: ! 37: if (prompt) { ! 38: #ifdef NOENCRYPTION ! 39: placebo_read_password(master_key, ! 40: "\nEnter Kerberos master key: ", 0); ! 41: #else ! 42: des_read_password(master_key, ! 43: "\nEnter Kerberos master key: ", 0); ! 44: #endif ! 45: printf ("\n"); ! 46: } ! 47: else { ! 48: kfile = open(MKEYFILE, O_RDONLY, 0600); ! 49: if (kfile < 0) { ! 50: /* oh, for com_err_ */ ! 51: return (-1); ! 52: } ! 53: if (read(kfile, (char *) master_key, 8) != 8) { ! 54: return (-1); ! 55: } ! 56: close(kfile); ! 57: } ! 58: ! 59: #ifndef NOENCRYPTION ! 60: key_sched(master_key, master_key_sched); ! 61: #endif ! 62: return (0); ! 63: } ! 64: ! 65: /* The caller is reasponsible for cleaning up the master key and sched, ! 66: even if we can't verify the master key */ ! 67: ! 68: /* Returns master key version if successful, otherwise -1 */ ! 69: ! 70: long kdb_verify_master_key (master_key, master_key_sched, out) ! 71: C_Block master_key; ! 72: Key_schedule master_key_sched; ! 73: FILE *out; /* setting this to non-null be do output */ ! 74: { ! 75: C_Block key_from_db; ! 76: Principal principal_data[1]; ! 77: int n, more = 0; ! 78: long master_key_version; ! 79: ! 80: /* lookup the master key version */ ! 81: n = kerb_get_principal(KERB_M_NAME, KERB_M_INST, principal_data, ! 82: 1 /* only one please */, &more); ! 83: if ((n != 1) || more) { ! 84: if (out != (FILE *) NULL) ! 85: fprintf(out, ! 86: "verify_master_key: %s, %d found.\n", ! 87: "Kerberos error on master key version lookup", ! 88: n); ! 89: return (-1); ! 90: } ! 91: ! 92: master_key_version = (long) principal_data[0].key_version; ! 93: ! 94: /* set up the master key */ ! 95: if (out != (FILE *) NULL) /* should we punt this? */ ! 96: fprintf(out, "Current Kerberos master key version is %d.\n", ! 97: principal_data[0].kdc_key_ver); ! 98: ! 99: /* ! 100: * now use the master key to decrypt the key in the db, had better ! 101: * be the same! ! 102: */ ! 103: bcopy(&principal_data[0].key_low, key_from_db, 4); ! 104: bcopy(&principal_data[0].key_high, ((long *) key_from_db) + 1, 4); ! 105: kdb_encrypt_key (key_from_db, key_from_db, ! 106: master_key, master_key_sched, DECRYPT); ! 107: ! 108: /* the decrypted database key had better equal the master key */ ! 109: n = bcmp((char *) master_key, (char *) key_from_db, ! 110: sizeof(master_key)); ! 111: /* this used to zero the master key here! */ ! 112: bzero(key_from_db, sizeof(key_from_db)); ! 113: bzero(principal_data, sizeof (principal_data)); ! 114: ! 115: if (n && (out != (FILE *) NULL)) { ! 116: fprintf(out, "\n\07\07verify_master_key: Invalid master key; "); ! 117: fprintf(out, "does not match database.\n"); ! 118: return (-1); ! 119: } ! 120: if (out != (FILE *) NULL) { ! 121: fprintf(out, "\nMaster key entered. BEWARE!\07\07\n"); ! 122: fflush(out); ! 123: } ! 124: ! 125: return (master_key_version); ! 126: } ! 127: ! 128: /* The old algorithm used the key schedule as the initial vector which ! 129: was byte order depedent ... */ ! 130: ! 131: kdb_encrypt_key (in, out, master_key, master_key_sched, e_d_flag) ! 132: C_Block in, out, master_key; ! 133: Key_schedule master_key_sched; ! 134: int e_d_flag; ! 135: { ! 136: ! 137: #ifdef NOENCRYPTION ! 138: bcopy(in, out, sizeof(C_Block)); ! 139: #else ! 140: pcbc_encrypt(in, out, (long) sizeof(C_Block), ! 141: master_key_sched, master_key, e_d_flag); ! 142: #endif ! 143: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.