|
|
1.1 ! root 1: /* ! 2: * $Source: /usr/src/kerberosIV/krb/RCS/read_service_key.c,v $ ! 3: * $Author: kfall $ ! 4: * ! 5: * Copyright 1985, 1986, 1987, 1988 by the Massachusetts Institute ! 6: * of Technology. ! 7: * ! 8: * For copying and distribution information, please see the file ! 9: * <mit-copyright.h>. ! 10: */ ! 11: ! 12: #ifndef lint ! 13: static char *rcsid_read_service_key_c = ! 14: "$Id: read_service_key.c,v 4.10 90/06/25 20:57:14 kfall Exp $"; ! 15: #endif /* lint */ ! 16: ! 17: #include <mit-copyright.h> ! 18: #include <des.h> ! 19: #include <krb.h> ! 20: #include <stdio.h> ! 21: #include <strings.h> ! 22: ! 23: /* ! 24: * The private keys for servers on a given host are stored in a ! 25: * "srvtab" file (typically "/etc/srvtab"). This routine extracts ! 26: * a given server's key from the file. ! 27: * ! 28: * read_service_key() takes the server's name ("service"), "instance", ! 29: * and "realm" and a key version number "kvno", and looks in the given ! 30: * "file" for the corresponding entry, and if found, returns the entry's ! 31: * key field in "key". ! 32: * ! 33: * If "instance" contains the string "*", then it will match ! 34: * any instance, and the chosen instance will be copied to that ! 35: * string. For this reason it is important that the there is enough ! 36: * space beyond the "*" to receive the entry. ! 37: * ! 38: * If "kvno" is 0, it is treated as a wild card and the first ! 39: * matching entry regardless of the "vno" field is returned. ! 40: * ! 41: * This routine returns KSUCCESS on success, otherwise KFAILURE. ! 42: * ! 43: * The format of each "srvtab" entry is as follows: ! 44: * ! 45: * Size Variable Field in file ! 46: * ---- -------- ------------- ! 47: * string serv server name ! 48: * string inst server instance ! 49: * string realm server realm ! 50: * 1 byte vno server key version # ! 51: * 8 bytes key server's key ! 52: * ... ... ... ! 53: */ ! 54: ! 55: ! 56: /*ARGSUSED */ ! 57: read_service_key(service,instance,realm,kvno,file,key) ! 58: char *service; /* Service Name */ ! 59: char *instance; /* Instance name or "*" */ ! 60: char *realm; /* Realm */ ! 61: int kvno; /* Key version number */ ! 62: char *file; /* Filename */ ! 63: char *key; /* Pointer to key to be filled in */ ! 64: { ! 65: char serv[SNAME_SZ]; ! 66: char inst[INST_SZ]; ! 67: char rlm[REALM_SZ]; ! 68: unsigned char vno; /* Key version number */ ! 69: int wcard; ! 70: ! 71: int stab, open(); ! 72: ! 73: if ((stab = open(file, 0, 0)) < NULL) ! 74: return(KFAILURE); ! 75: ! 76: wcard = (instance[0] == '*') && (instance[1] == '\0'); ! 77: ! 78: while(getst(stab,serv,SNAME_SZ) > 0) { /* Read sname */ ! 79: (void) getst(stab,inst,INST_SZ); /* Instance */ ! 80: (void) getst(stab,rlm,REALM_SZ); /* Realm */ ! 81: /* Vers number */ ! 82: if (read(stab,(char *)&vno,1) != 1) ! 83: return(KFAILURE); ! 84: /* Key */ ! 85: if (read(stab,key,8) != 8) ! 86: return(KFAILURE); ! 87: /* Is this the right service */ ! 88: if (strcmp(serv,service)) ! 89: continue; ! 90: /* How about instance */ ! 91: if (!wcard && strcmp(inst,instance)) ! 92: continue; ! 93: if (wcard) ! 94: (void) strncpy(instance,inst,INST_SZ); ! 95: /* Is this the right realm */ ! 96: #ifdef ATHENA_COMPAT ! 97: /* XXX For backward compatibility: if keyfile says "Athena" ! 98: and caller wants "ATHENA.MIT.EDU", call it a match */ ! 99: if (strcmp(rlm,realm) && ! 100: (strcmp(rlm,"Athena") || ! 101: strcmp(realm,"ATHENA.MIT.EDU"))) ! 102: continue; ! 103: #else /* ! ATHENA_COMPAT */ ! 104: if (strcmp(rlm,realm)) ! 105: continue; ! 106: #endif /* ATHENA_COMPAT */ ! 107: ! 108: /* How about the key version number */ ! 109: if (kvno && kvno != (int) vno) ! 110: continue; ! 111: ! 112: (void) close(stab); ! 113: return(KSUCCESS); ! 114: } ! 115: ! 116: /* Can't find the requested service */ ! 117: (void) close(stab); ! 118: return(KFAILURE); ! 119: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.