1 /*- 2 * Copyright (c) 2009, Sun Microsystems, Inc. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * - Redistributions of source code must retain the above copyright notice, 8 * this list of conditions and the following disclaimer. 9 * - Redistributions in binary form must reproduce the above copyright notice, 10 * this list of conditions and the following disclaimer in the documentation 11 * and/or other materials provided with the distribution. 12 * - Neither the name of Sun Microsystems, Inc. nor the names of its 13 * contributors may be used to endorse or promote products derived 14 * from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 * 28 * $FreeBSD: src/lib/libc/rpc/getpublickey.c,v 1.9 2006/02/28 16:02:26 deischen Exp $ 29 * 30 * @(#)publickey.c 1.10 91/03/11 Copyr 1986 Sun Micro 31 */ 32 33 /* 34 * publickey.c 35 * Copyright (C) 1986, Sun Microsystems, Inc. 36 */ 37 38 /* 39 * Public key lookup routines 40 */ 41 #include "namespace.h" 42 #include <stdio.h> 43 #include <pwd.h> 44 #include <rpc/rpc.h> 45 #include <rpc/key_prot.h> 46 #include <rpcsvc/yp_prot.h> 47 #include <rpcsvc/ypclnt.h> 48 #include <string.h> 49 #include <stdlib.h> 50 #include "un-namespace.h" 51 52 #define PKFILE "/etc/publickey" 53 54 /* 55 * Hack to let ypserv/rpc.nisd use AUTH_DES. 56 */ 57 int (*__getpublickey_LOCAL)() = NULL; 58 59 /* 60 * Get somebody's public key 61 */ 62 static int 63 __getpublickey_real(const char *netname, char *publickey) 64 { 65 char lookup[3 * HEXKEYBYTES]; 66 char *p; 67 68 if (publickey == NULL) 69 return (0); 70 if (!getpublicandprivatekey(netname, lookup)) 71 return (0); 72 p = strchr(lookup, ':'); 73 if (p == NULL) { 74 return (0); 75 } 76 *p = '\0'; 77 strncpy(publickey, lookup, HEXKEYBYTES); 78 publickey[HEXKEYBYTES] = '\0'; 79 return (1); 80 } 81 82 /* 83 * reads the file /etc/publickey looking for a + to optionally go to the 84 * yellow pages 85 */ 86 87 int 88 getpublicandprivatekey(const char *key, char *ret) 89 { 90 char buf[1024]; /* big enough */ 91 char *res; 92 FILE *fd; 93 char *mkey; 94 char *mval; 95 96 fd = fopen(PKFILE, "r"); 97 if (fd == NULL) 98 return (0); 99 for (;;) { 100 res = fgets(buf, sizeof(buf), fd); 101 if (res == NULL) { 102 fclose(fd); 103 return (0); 104 } 105 if (res[0] == '#') 106 continue; 107 else if (res[0] == '+') { 108 #ifdef YP 109 char *PKMAP = "publickey.byname"; 110 char *lookup; 111 char *domain; 112 int err; 113 int len; 114 115 err = yp_get_default_domain(&domain); 116 if (err) { 117 continue; 118 } 119 lookup = NULL; 120 err = yp_match(domain, PKMAP, key, strlen(key), &lookup, &len); 121 if (err) { 122 #ifdef DEBUG 123 fprintf(stderr, "match failed error %d\n", err); 124 #endif 125 continue; 126 } 127 lookup[len] = 0; 128 strcpy(ret, lookup); 129 fclose(fd); 130 free(lookup); 131 return (2); 132 #else /* YP */ 133 #ifdef DEBUG 134 fprintf(stderr, 135 "Bad record in %s '+' -- NIS not supported in this library copy\n", PKFILE); 136 #endif /* DEBUG */ 137 continue; 138 #endif /* YP */ 139 } else { 140 mkey = strsep(&res, "\t "); 141 if (mkey == NULL) { 142 fprintf(stderr, 143 "Bad record in %s -- %s", PKFILE, buf); 144 continue; 145 } 146 do { 147 mval = strsep(&res, " \t#\n"); 148 } while (mval != NULL && !*mval); 149 if (mval == NULL) { 150 fprintf(stderr, 151 "Bad record in %s val problem - %s", PKFILE, buf); 152 continue; 153 } 154 if (strcmp(mkey, key) == 0) { 155 strcpy(ret, mval); 156 fclose(fd); 157 return (1); 158 } 159 } 160 } 161 } 162 163 int 164 getpublickey(const char *netname, char *publickey) 165 { 166 if (__getpublickey_LOCAL != NULL) 167 return(__getpublickey_LOCAL(netname, publickey)); 168 else 169 return(__getpublickey_real(netname, publickey)); 170 } 171