From 36ecfe5690660610f27d839f3cae31f417b33a04 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Thu, 11 Jun 1998 11:32:21 +0000 Subject: Update. 1998-06-03 03:09 Geoff Keating * sysdeps/unix/sysv/linux/pread.c: Detect missing syscall, like poll(). * sysdeps/unix/sysv/linux/pread64.c: Likewise. * sysdeps/unix/sysv/linux/pwrite.c: Likewise. * sysdeps/unix/sysv/linux/pwrite64.c: Likewise. 1998-06-03 03:09 Geoff Keating * sysdeps/powerpc/Makefile: Use -G0 on the startup file; this makes it easier to undump emacs. * sysdeps/powerpc/bits/endian.h: Use more informative error message for when the endianness can't be determined. 1998-06-04 13:19 Geoff Keating * nss/Makefile: Add files publickey database support. * nss/libnss_files.map: Export the required functions. * nss/nss_files/files-key.c: Implement it. * sunrpc/rpc/auth_des.h: Correct typos in comments. --- nss/nss_files/files-key.c | 115 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 nss/nss_files/files-key.c (limited to 'nss/nss_files') diff --git a/nss/nss_files/files-key.c b/nss/nss_files/files-key.c new file mode 100644 index 0000000..a3c1474 --- /dev/null +++ b/nss/nss_files/files-key.c @@ -0,0 +1,115 @@ +/* Public key file parser in nss_files module. + Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include +#include +#include +#include "nsswitch.h" + +#define DATAFILE "/etc/publickey" + +/* Prototype for function in xcyrpt.c. */ +extern int xdecrypt (char *, char *); + + +static enum nss_status +search (const char *netname, char *result, int *errnop, int secret) +{ + FILE *stream; + + stream = fopen (DATAFILE, "r"); + if (stream == NULL) + return errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL; + + for (;;) + { + char buffer[HEXKEYBYTES * 2 + KEYCHECKSUMSIZE + MAXNETNAMELEN + 17]; + char *p; + char *save_ptr; + + buffer[sizeof (buffer) - 1] = '\xff'; + p = fgets (buffer, sizeof (buffer), stream); + if (p == NULL) + { + /* End of file or read error. */ + *errnop = errno; + fclose (stream); + return NSS_STATUS_NOTFOUND; + } + else if (buffer[sizeof (buffer) - 1] != '\xff') + { + /* Invalid line in file? Skip remainder of line. */ + if (buffer[sizeof (buffer) - 2] != '\0') + while (getc (stream) != '\n') + continue; + continue; + } + + /* Parse line. */ + p = __strtok_r (buffer, "# \t:\n", &save_ptr); + if (p == NULL) /* Skip empty and comment lines. */ + continue; + if (strcmp (p, netname) != 0) + continue; + + /* A hit! Find the field we want and return. */ + p = __strtok_r (NULL, ":\n", &save_ptr); + if (p == NULL) /* malformed line? */ + continue; + if (secret) + p = __strtok_r (NULL, ":\n", &save_ptr); + if (p == NULL) /* malformed line? */ + continue; + strcpy (result, p); + return NSS_STATUS_SUCCESS; + } +} + +enum nss_status +_nss_files_getpublickey (const char *netname, char *pkey, int *errnop) +{ + return search (netname, pkey, errnop, 0); +} + +enum nss_status +_nss_files_getsecretkey (const char *netname, char *skey, char *passwd, + int *errnop) +{ + enum nss_status status; + char buf[HEXKEYBYTES + KEYCHECKSUMSIZE + 16]; + + skey[0] = 0; + + status = search (netname, buf, errnop, 1); + if (status != NSS_STATUS_SUCCESS) + return status; + + if (!xdecrypt (buf, passwd)) + return NSS_STATUS_SUCCESS; + + if (memcmp (buf, &(buf[HEXKEYBYTES]), KEYCHECKSUMSIZE) != 0) + return NSS_STATUS_SUCCESS; + + buf[HEXKEYBYTES] = 0; + strcpy (skey, buf); + + return NSS_STATUS_SUCCESS; +} -- cgit v1.1