Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F107109859
D30683.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
85 KB
Referenced Files
None
Subscribers
None
D30683.diff
View Options
Index: ObsoleteFiles.inc
===================================================================
--- ObsoleteFiles.inc
+++ ObsoleteFiles.inc
@@ -40,6 +40,18 @@
# xargs -n1 | sort | uniq -d;
# done
+# 20210607: remove publickey(5) related programs
+OLD_FILES+=usr/bin/chkey
+OLD_FILES+=usr/bin/keylogin
+OLD_FILES+=usr/bin/keylogout
+OLD_FILES+=usr/sbin/keyserv
+OLD_FILES+=usr/bin/newkey
+OLD_FILES+=usr/share/man/man1/chkey.1.gz
+OLD_FILES+=usr/share/man/man1/keylogin.1.gz
+OLD_FILES+=usr/share/man/man1/keylogin.1.gz
+OLD_FILES+=usr/share/man/man5/publickey.5.gz
+OLD_FILES+=usr/share/man/man8/keyserv.1.gz
+
# 20210426: remove unused libexec/rc.d/addswap
OLD_FILES+=etc/rc.d/addswap
Index: lib/libc/rpc/Makefile.inc
===================================================================
--- lib/libc/rpc/Makefile.inc
+++ lib/libc/rpc/Makefile.inc
@@ -50,7 +50,7 @@
rpc_clnt_create.3 rpc_svc_calls.3 rpc_svc_create.3 rpc_svc_err.3 \
rpc_svc_reg.3 rpc_xdr.3 rpcbind.3 publickey.3 rpc_secure.3 \
rtime.3
-MAN+= publickey.5 rpc.5 netconfig.5
+MAN+= rpc.5 netconfig.5
MLINKS+= bindresvport.3 bindresvport_sa.3 \
des_crypt.3 ecb_crypt.3 \
des_crypt.3 cbc_crypt.3 \
Index: lib/libc/rpc/publickey.5
===================================================================
--- lib/libc/rpc/publickey.5
+++ /dev/null
@@ -1,42 +0,0 @@
-.\" $FreeBSD$
-.\" @(#)publickey.5 2.1 88/08/07 4.0 RPCSRC; from 1.6 88/02/29 SMI;
-.Dd October 19, 1987
-.Dt PUBLICKEY 5
-.Os
-.Sh NAME
-.Nm publickey
-.Nd "public key database"
-.Sh SYNOPSIS
-.Pa /etc/publickey
-.Sh DESCRIPTION
-.Pa /etc/publickey
-is the public key database used for secure
-RPC (Remote Procedure Calls).
-Each entry in
-the database consists of a network user
-name (which may either refer to
-a user or a hostname), followed by the user's
-public key (in hex
-notation), a colon, and then the user's
-secret key encrypted with
-its login password (also in hex notation).
-.Pp
-This file is altered either by the user through the
-.Xr chkey 1
-command or by the system administrator through the
-.Xr newkey 8
-command.
-The file
-.Pa /etc/publickey
-should only contain data on the
-.Tn NIS
-master machine, where it
-is converted into the
-.Tn NIS
-database
-.Pa publickey.byname .
-.Sh SEE ALSO
-.Xr chkey 1 ,
-.Xr publickey 3 ,
-.Xr newkey 8 ,
-.Xr ypupdated 8
Index: usr.bin/Makefile
===================================================================
--- usr.bin/Makefile
+++ usr.bin/Makefile
@@ -61,8 +61,6 @@
ipcs \
join \
jot \
- keylogin \
- keylogout \
killall \
ktrace \
ktrdump \
@@ -241,8 +239,6 @@
SUBDIR.${MK_NIS}+= ypmatch
SUBDIR.${MK_NIS}+= ypwhich
SUBDIR.${MK_OPENSSH}+= ssh-copy-id
-SUBDIR.${MK_OPENSSL}+= chkey
-SUBDIR.${MK_OPENSSL}+= newkey
SUBDIR.${MK_QUOTAS}+= quota
SUBDIR.${MK_SENDMAIL}+= vacation
SUBDIR.${MK_TALK}+= talk
Index: usr.bin/chkey/Makefile
===================================================================
--- usr.bin/chkey/Makefile
+++ /dev/null
@@ -1,15 +0,0 @@
-# $FreeBSD$
-
-.include <src.opts.mk>
-
-.PATH: ${SRCTOP}/usr.bin/newkey
-
-PROG= chkey
-SRCS= chkey.c generic.c update.c
-CFLAGS+= -I${SRCTOP}/usr.bin/newkey
-.if ${MK_NIS} != "no"
-CFLAGS+= -DYP
-.endif
-LIBADD+= rpcsvc mp
-
-.include <bsd.prog.mk>
Index: usr.bin/chkey/Makefile.depend
===================================================================
--- usr.bin/chkey/Makefile.depend
+++ /dev/null
@@ -1,18 +0,0 @@
-# $FreeBSD$
-# Autogenerated - do NOT edit!
-
-DIRDEPS = \
- include \
- include/xlocale \
- lib/${CSU_DIR} \
- lib/libc \
- lib/libcompiler_rt \
- lib/libthr \
- secure/lib/libcrypto \
-
-
-.include <dirdeps.mk>
-
-.if ${DEP_RELDIR} == ${_DEP_RELDIR}
-# local dependencies - needed for -jN in clean tree
-.endif
Index: usr.bin/chkey/Makefile.depend.options
===================================================================
--- usr.bin/chkey/Makefile.depend.options
+++ /dev/null
@@ -1,8 +0,0 @@
-# $FreeBSD$
-# This file is not autogenerated - take care!
-
-DIRDEPS_OPTIONS= NIS
-
-DIRDEPS.NIS.yes= lib/libmp
-
-.include <dirdeps-options.mk>
Index: usr.bin/chkey/chkey.1
===================================================================
--- usr.bin/chkey/chkey.1
+++ /dev/null
@@ -1,30 +0,0 @@
-.\" @(#)chkey.1 1.5 91/03/11 TIRPC 1.0;
-.\" Copyright (c) 1988 Sun Microsystems, Inc. - All Rights Reserved.
-.\" $FreeBSD$
-.\"
-.Dd July 5, 1989
-.Dt CHKEY 1
-.Os
-.Sh NAME
-.Nm chkey
-.Nd change your encryption key
-.Sh SYNOPSIS
-.Nm
-.Sh DESCRIPTION
-The
-.Nm
-utility prompts the user for their login password,
-and uses it to encrypt a new encryption key
-for the user to be stored in the
-.Xr publickey 5
-database.
-.Sh "SEE ALSO"
-.Xr keylogin 1 ,
-.Xr publickey 5 ,
-.Xr keyserv 8 ,
-.Xr newkey 8
-.Sh HISTORY
-The
-.Nm
-utility was removed from
-.Fx 14.0 .
Index: usr.bin/chkey/chkey.c
===================================================================
--- usr.bin/chkey/chkey.c
+++ /dev/null
@@ -1,275 +0,0 @@
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user or with the express written consent of
- * Sun Microsystems, Inc.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)chkey.c 1.7 91/03/11 Copyr 1986 Sun Micro";
-#endif
-#endif
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * Copyright (C) 1986, Sun Microsystems, Inc.
- */
-
-/*
- * Command to change one's public key in the public key database
- */
-#include <rpc/rpc.h>
-#include <rpc/key_prot.h>
-#ifdef YP
-#include <rpcsvc/yp_prot.h>
-#include <rpcsvc/ypclnt.h>
-#else
-#define YPOP_STORE 4
-#endif
-#include <sys/fcntl.h>
-#include <err.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "extern.h"
-
-#ifdef YPPASSWD
-struct passwd *ypgetpwuid(uid_t);
-#endif
-
-#ifdef YP
-static char *domain;
-static char PKMAP[] = "publickey.byname";
-#else
-static char PKFILE[] = "/etc/publickey";
-#endif /* YP */
-static char ROOTKEY[] = "/etc/.rootkey";
-
-static void usage(void);
-extern int yp_update(char *, char *, int, char *, size_t, char *, size_t);
-
-int
-main(int argc, char **argv)
-{
- char name[MAXNETNAMELEN+1];
- char public[HEXKEYBYTES + 1];
- char secret[HEXKEYBYTES + 1];
- char crypt1[HEXKEYBYTES + KEYCHECKSUMSIZE + 1];
- char crypt2[HEXKEYBYTES + KEYCHECKSUMSIZE + 1];
- int status;
- char *pass;
- struct passwd *pw;
- uid_t uid;
- int force = 0;
- int ch;
-#ifdef YP
- char *master;
-#endif
-#ifdef YPPASSWD
- char *cryptpw;
-#endif
-
- fprintf(stderr, "chkey is deprecated and removed from FreeBSD 14.\n");
- while ((ch = getopt(argc, argv, "f")) != -1)
- switch(ch) {
- case 'f':
- force = 1;
- break;
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- if (argc != 0)
- usage();
-
-#ifdef YP
- (void)yp_get_default_domain(&domain);
- if (yp_master(domain, PKMAP, &master) != 0)
- errx(1, "can't find master of publickey database");
-#endif
- uid = getuid() /*geteuid()*/;
- if (uid == 0) {
- if (host2netname(name, NULL, NULL) == 0)
- errx(1, "cannot convert hostname to netname");
- } else {
- if (user2netname(name, uid, NULL) == 0)
- errx(1, "cannot convert username to netname");
- }
- (void)printf("Generating new key for %s.\n", name);
-
- if (!force) {
- if (uid != 0) {
-#ifdef YPPASSWD
- pw = ypgetpwuid(uid);
-#else
- pw = getpwuid(uid);
-#endif
- if (pw == NULL) {
-#ifdef YPPASSWD
- errx(1,
- "no NIS password entry found: can't change key");
-#else
- errx(1,
- "no password entry found: can't change key");
-#endif
- }
- } else {
- pw = getpwuid(0);
- if (pw == NULL)
- errx(1, "no password entry found: can't change key");
- }
- }
- pass = getpass("Password:");
-#ifdef YPPASSWD
- if (!force) {
- cryptpw = crypt(pass, pw->pw_passwd);
- if (cryptpw == NULL || strcmp(cryptpw, pw->pw_passwd) != 0)
- errx(1, "invalid password");
- }
-#else
- force = 1; /* Make this mandatory */
-#endif
- genkeys(public, secret, pass);
-
- memcpy(crypt1, secret, HEXKEYBYTES);
- memcpy(crypt1 + HEXKEYBYTES, secret, KEYCHECKSUMSIZE);
- crypt1[HEXKEYBYTES + KEYCHECKSUMSIZE] = 0;
- xencrypt(crypt1, pass);
-
- if (force) {
- memcpy(crypt2, crypt1, HEXKEYBYTES + KEYCHECKSUMSIZE + 1);
- xdecrypt(crypt2, getpass("Retype password:"));
- if (memcmp(crypt2, crypt2 + HEXKEYBYTES, KEYCHECKSUMSIZE) != 0
- || memcmp(crypt2, secret, HEXKEYBYTES) != 0)
- errx(1, "password incorrect");
- }
-
-#ifdef YP
- (void)printf("Sending key change request to %s...\n", master);
-#endif
- status = setpublicmap(name, public, crypt1);
- if (status != 0) {
-#ifdef YP
- errx(1, "unable to update NIS database (%u): %s",
- status, yperr_string(status));
-#else
- errx(1, "unable to update publickey database");
-#endif
- }
-
- if (uid == 0) {
- /*
- * Root users store their key in /etc/$ROOTKEY so
- * that they can auto reboot without having to be
- * around to type a password. Storing this in a file
- * is rather dubious: it should really be in the EEPROM
- * so it does not go over the net.
- */
- int fd;
-
- fd = open(ROOTKEY, O_WRONLY|O_TRUNC|O_CREAT, 0);
- if (fd < 0) {
- warn("%s", ROOTKEY);
- } else {
- char newline = '\n';
-
- if (write(fd, secret, strlen(secret)) < 0 ||
- write(fd, &newline, sizeof(newline)) < 0)
- warn("%s: write", ROOTKEY);
- }
- close(fd);
- }
-
- if (key_setsecret(secret) < 0)
- errx(1, "unable to login with new secret key");
- (void)printf("Done.\n");
- exit(0);
- /* NOTREACHED */
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr, "usage: chkey [-f]\n");
- exit(1);
- /* NOTREACHED */
-}
-
-
-/*
- * Set the entry in the public key file
- */
-int
-setpublicmap(char *name, char *public, char *secret)
-{
- char pkent[1024];
-
- (void)sprintf(pkent,"%s:%s", public, secret);
-#ifdef YP
- return (yp_update(domain, PKMAP, YPOP_STORE,
- name, strlen(name), pkent, strlen(pkent)));
-#else
- return (localupdate(name, PKFILE, YPOP_STORE,
- strlen(name), name, strlen(pkent), pkent));
-#endif
-}
-
-#ifdef YPPASSWD
-struct passwd *
-ypgetpwuid(uid_t uid)
-{
- char uidstr[10];
- char *val;
- int vallen;
- static struct passwd pw;
- char *p;
-
- (void)sprintf(uidstr, "%d", uid);
- if (yp_match(domain, "passwd.byuid", uidstr, strlen(uidstr),
- &val, &vallen) != 0) {
- return (NULL);
- }
- p = strchr(val, ':');
- if (p == NULL) {
- return (NULL);
- }
- pw.pw_passwd = p + 1;
- p = strchr(pw.pw_passwd, ':');
- if (p == NULL) {
- return (NULL);
- }
- *p = 0;
- return (&pw);
-}
-#endif /* YPPASSWD */
Index: usr.bin/keylogin/Makefile
===================================================================
--- usr.bin/keylogin/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-# $FreeBSD$
-
-PROG= keylogin
-
-LIBADD= rpcsvc
-
-.include <bsd.prog.mk>
Index: usr.bin/keylogin/Makefile.depend
===================================================================
--- usr.bin/keylogin/Makefile.depend
+++ /dev/null
@@ -1,20 +0,0 @@
-# $FreeBSD$
-# Autogenerated - do NOT edit!
-
-DIRDEPS = \
- gnu/lib/csu \
- include \
- include/rpc \
- include/rpcsvc \
- include/xlocale \
- lib/${CSU_DIR} \
- lib/libc \
- lib/libcompiler_rt \
- lib/librpcsvc \
-
-
-.include <dirdeps.mk>
-
-.if ${DEP_RELDIR} == ${_DEP_RELDIR}
-# local dependencies - needed for -jN in clean tree
-.endif
Index: usr.bin/keylogin/keylogin.1
===================================================================
--- usr.bin/keylogin/keylogin.1
+++ /dev/null
@@ -1,35 +0,0 @@
-.\" @(#)keylogin.1 1.5 91/03/11 TIRPC 1.0;
-.\" Copyright (c) 1988 Sun Microsystems, Inc. - All Rights Reserved.
-.\" $FreeBSD$
-.\"
-.Dd September 9, 1987
-.Dt KEYLOGIN 1
-.Os
-.Sh NAME
-.Nm keylogin
-.Nd decrypt and store secret key
-.Sh SYNOPSIS
-.Nm
-.Sh DESCRIPTION
-The
-.Nm
-utility prompts the user for their login password, and uses it to decrypt
-the user's secret key stored in the
-.Xr publickey 5
-database.
-Once decrypted, the user's key is stored by the local
-key server process
-.Xr keyserv 8
-to be used by any secure network services, such as NFS.
-.Sh SEE ALSO
-.Xr chkey 1 ,
-.Xr keylogout 1 ,
-.Xr login 1 ,
-.Xr publickey 5 ,
-.Xr keyserv 8 ,
-.Xr newkey 8
-.Sh HISTORY
-The
-.Nm
-utility was removed from
-.Fx 14.0 .
Index: usr.bin/keylogin/keylogin.c
===================================================================
--- usr.bin/keylogin/keylogin.c
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user or with the express written consent of
- * Sun Microsystems, Inc.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- */
-#if !defined(lint) && defined(SCCSIDS)
-static char sccsid[] = "@(#)keylogin.c 1.4 91/03/11 Copyr 1986 Sun Micro";
-#endif
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * Copyright (C) 1986, Sun Microsystems, Inc.
- */
-
-/*
- * Set secret key on local machine
- */
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <pwd.h>
-#include <unistd.h>
-#include <rpc/rpc.h>
-#include <rpc/key_prot.h>
-
-extern int key_setnet(struct key_netstarg *);
-
-int
-main(void)
-{
- char fullname[MAXNETNAMELEN + 1];
- struct key_netstarg netst;
-
- fprintf(stderr, "keylogin is deprecated and removed from FreeBSD 14.\n");
- if (!getnetname(fullname)) {
- fprintf(stderr, "netname lookup failed -- make sure the ");
- fprintf(stderr, "system domain name is set.\n");
- exit(1);
- }
-
- if (! getsecretkey(fullname, (char *)&(netst.st_priv_key),
- getpass("Password:"))) {
- fprintf(stderr, "Can't find %s's secret key\n", fullname);
- exit(1);
- }
- if (netst.st_priv_key[0] == 0) {
- fprintf(stderr, "Password incorrect for %s\n", fullname);
- exit(1);
- }
-
- netst.st_pub_key[0] = 0;
- netst.st_netname = strdup(fullname);
-
- if (key_setnet(&netst) < 0) {
- fprintf(stderr, "Could not set %s's secret key\n", fullname);
- fprintf(stderr, "Maybe the keyserver is down?\n");
- exit(1);
- }
- exit(0);
- /* NOTREACHED */
-}
Index: usr.bin/keylogout/Makefile
===================================================================
--- usr.bin/keylogout/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# $FreeBSD$
-
-PROG= keylogout
-
-.include <bsd.prog.mk>
Index: usr.bin/keylogout/Makefile.depend
===================================================================
--- usr.bin/keylogout/Makefile.depend
+++ /dev/null
@@ -1,19 +0,0 @@
-# $FreeBSD$
-# Autogenerated - do NOT edit!
-
-DIRDEPS = \
- gnu/lib/csu \
- include \
- include/rpc \
- include/rpcsvc \
- include/xlocale \
- lib/${CSU_DIR} \
- lib/libc \
- lib/libcompiler_rt \
-
-
-.include <dirdeps.mk>
-
-.if ${DEP_RELDIR} == ${_DEP_RELDIR}
-# local dependencies - needed for -jN in clean tree
-.endif
Index: usr.bin/keylogout/keylogout.1
===================================================================
--- usr.bin/keylogout/keylogout.1
+++ /dev/null
@@ -1,47 +0,0 @@
-.\" $FreeBSD$
-.\" @(#)keylogout.1 1.4 91/03/11 TIRPC 1.0; from 1.3 89/07/26 SMI;
-.Dd April 15, 1989
-.Dt KEYLOGOUT 1
-.Os
-.Sh NAME
-.Nm keylogout
-.Nd delete stored secret key
-.Sh SYNOPSIS
-.Nm
-.Op Fl f
-.Sh DESCRIPTION
-The
-.Nm
-utility deletes the key stored by the key server process
-.Xr keyserv 8
-to be used by any secure network services, such as NFS.
-Further access to the key is revoked,
-however current session keys may remain valid till they expire,
-or are refreshed.
-This option will cause any background jobs that need secure RPC
-services to fail, and any scheduled
-.Nm at
-jobs that need the key to fail.
-Also since only one copy is kept on a machine of the key,
-it is a bad idea to place this in your
-.Pa .logout
-file since it will affect other sessions on the same machine.
-.Pp
-The following option is available:
-.Bl -tag -width indent
-.It Fl f
-Forget the rootkey.
-This will break secure NFS if it is done on a server.
-.El
-.Sh SEE ALSO
-.Xr chkey 1 ,
-.Xr keylogin 1 ,
-.Xr login 1 ,
-.Xr publickey 5 ,
-.Xr keyserv 8 ,
-.Xr newkey 8
-.Sh HISTORY
-The
-.Nm
-utility was removed from
-.Fx 14.0 .
Index: usr.bin/keylogout/keylogout.c
===================================================================
--- usr.bin/keylogout/keylogout.c
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user or with the express written consent of
- * Sun Microsystems, Inc.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- */
-/*
- * Copyright (C) 1986, Sun Microsystems, Inc.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * unset the secret key on local machine
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <rpc/key_prot.h>
-
-int
-main(int argc, char **argv)
-{
- static char secret[HEXKEYBYTES + 1];
-
- fprintf(stderr, "keylogin is deprecated and removed from FreeBSD 14.\n");
- if (geteuid() == 0) {
- if ((argc != 2 ) || (strcmp(argv[1], "-f") != 0)) {
- fprintf(stderr,
-"keylogout by root would break all servers that use secure rpc!\n");
- fprintf(stderr,
-"root may use keylogout -f to do this (at your own risk)!\n");
- exit(1);
- }
- }
-
- if (key_setsecret(secret) < 0) {
- fprintf(stderr, "Could not unset your secret key.\n");
- fprintf(stderr, "Maybe the keyserver is down?\n");
- exit(1);
- }
- exit(0);
- /* NOTREACHED */
-}
Index: usr.bin/newkey/Makefile
===================================================================
--- usr.bin/newkey/Makefile
+++ /dev/null
@@ -1,13 +0,0 @@
-# $FreeBSD$
-
-.include <src.opts.mk>
-
-PROG= newkey
-SRCS= newkey.c generic.c update.c
-.if ${MK_NIS} != "no"
-CFLAGS+= -DYP
-.endif
-MAN= newkey.8
-LIBADD= rpcsvc mp
-
-.include <bsd.prog.mk>
Index: usr.bin/newkey/Makefile.depend
===================================================================
--- usr.bin/newkey/Makefile.depend
+++ /dev/null
@@ -1,22 +0,0 @@
-# $FreeBSD$
-# Autogenerated - do NOT edit!
-
-DIRDEPS = \
- gnu/lib/csu \
- include \
- include/rpc \
- include/rpcsvc \
- include/xlocale \
- lib/${CSU_DIR} \
- lib/libc \
- lib/libcompiler_rt \
- lib/libmp \
- lib/librpcsvc \
- secure/lib/libcrypto \
-
-
-.include <dirdeps.mk>
-
-.if ${DEP_RELDIR} == ${_DEP_RELDIR}
-# local dependencies - needed for -jN in clean tree
-.endif
Index: usr.bin/newkey/extern.h
===================================================================
--- usr.bin/newkey/extern.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user or with the express written consent of
- * Sun Microsystems, Inc.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- *
- * $FreeBSD$
- */
-
-#ifdef YP
-#define MAXMAPNAMELEN 256
-#else
-#define YPOP_CHANGE 1 /* change, do not add */
-#define YPOP_INSERT 2 /* add, do not change */
-#define YPOP_DELETE 3 /* delete this entry */
-#define YPOP_STORE 4 /* add, or change */
-#endif
-
-void genkeys(char *, char *, char *);
-int setpublicmap(char *, char *, char *);
-int mapupdate(char *, char *, u_int, u_int, char *, u_int, char *);
-void xencrypt(char *, char *);
-void xdecrypt(char *, char *);
-int localupdate(char *, char *, u_int, u_int, char *, u_int, char *);
Index: usr.bin/newkey/generic.c
===================================================================
--- usr.bin/newkey/generic.c
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user or with the express written consent of
- * Sun Microsystems, Inc.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- */
-
-#if !defined(lint) && defined(SCCSIDS)
-#if 0
-static char sccsid[] = "@(#)generic.c 1.2 91/03/11 Copyr 1986 Sun Micro";
-#endif
-#endif
-
-/*
- * Copyright (C) 1986, Sun Microsystems, Inc.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/file.h>
-
-#include <rpc/rpc.h>
-#include <rpc/key_prot.h>
-
-#include <mp.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "extern.h"
-
-static void adjust(char[], char *);
-static void getseed(char *, int, unsigned char *);
-
-/*
- * Generate a seed
- */
-static void
-getseed(char *seed, int seedsize, unsigned char *pass)
-{
- int i;
-
- for (i = 0; i < seedsize; i++) {
- seed[i] = (arc4random() & 0xff) ^ pass[i % 8];
- }
-}
-
-/*
- * Generate a random public/secret key pair
- */
-void
-genkeys(char *public, char *secret, char *pass)
-{
- unsigned int i;
-
-# define BASEBITS (8*sizeof (short) - 1)
-# define BASE (1 << BASEBITS)
-
- MINT *pk = mp_itom(0);
- MINT *sk = mp_itom(0);
- MINT *tmp;
- MINT *base = mp_itom((short)BASE);
- MINT *root = mp_itom(PROOT);
- MINT *modulus = mp_xtom(HEXMODULUS);
- short r;
- unsigned short seed[KEYSIZE/BASEBITS + 1];
- char *xkey;
-
- getseed((char *)seed, sizeof (seed), (u_char *)pass);
- for (i = 0; i < KEYSIZE/BASEBITS + 1; i++) {
- r = seed[i] % BASE;
- tmp = mp_itom(r);
- mp_mult(sk, base, sk);
- mp_madd(sk, tmp, sk);
- mp_mfree(tmp);
- }
- tmp = mp_itom(0);
- mp_mdiv(sk, modulus, tmp, sk);
- mp_mfree(tmp);
- mp_pow(root, sk, modulus, pk);
- xkey = mp_mtox(sk);
- adjust(secret, xkey);
- xkey = mp_mtox(pk);
- adjust(public, xkey);
- mp_mfree(sk);
- mp_mfree(base);
- mp_mfree(pk);
- mp_mfree(root);
- mp_mfree(modulus);
-}
-
-/*
- * Adjust the input key so that it is 0-filled on the left
- */
-static void
-adjust(char keyout[HEXKEYBYTES+1], char *keyin)
-{
- char *p;
- char *s;
-
- for (p = keyin; *p; p++)
- ;
- for (s = keyout + HEXKEYBYTES; p >= keyin; p--, s--) {
- *s = *p;
- }
- while (s >= keyout) {
- *s-- = '0';
- }
-}
Index: usr.bin/newkey/newkey.8
===================================================================
--- usr.bin/newkey/newkey.8
+++ /dev/null
@@ -1,64 +0,0 @@
-.\" @(#)newkey.8 1.3 91/03/11 TIRPC 1.0; from 1.12 90/02/03 SMI;
-.\" $FreeBSD$
-.Dd October 12, 1987
-.Dt NEWKEY 8
-.Os
-.Sh NAME
-.Nm newkey
-.Nd create a new key in the publickey database
-.Sh SYNOPSIS
-.Nm
-.Fl h Ar hostname
-.Nm
-.Fl u Ar username
-.Sh DESCRIPTION
-The
-.Nm
-utility is normally run by the network administrator on the
-Network Interface Service
-.Pq NIS
-master machine in order to establish public keys for
-users and super-users on the network.
-These keys are needed for using secure
-RPC
-or secure
-NFS .
-.Pp
-The
-.Nm
-utility will prompt for the login password of the given username and then
-create a new public/secret key pair in
-.Pa /etc/publickey
-encrypted with the login password of the given user.
-.Pp
-Use of this program is
-not required: users may create their own keys using
-.Xr chkey 1 .
-.Sh OPTIONS
-.Bl -tag -width indent
-.It Fl h Ar hostname
-Create a new public key for the super-user at the given hostname.
-Prompts for the root password of the given hostname.
-.It Fl u Ar username
-Create a new public key for the given username.
-Prompts for the
-NIS
-password of the given username.
-.El
-.Sh SEE ALSO
-.Xr chkey 1 ,
-.Xr keylogin 1 ,
-.Xr publickey 5 ,
-.Xr keyserv 8
-.Sh HISTORY
-The
-.Nm
-utility was removed from
-.Fx 14.0 .
-.Sh NOTES
-The Network Information Service
-.Pq NIS
-was formerly known as Sun Yellow Pages
-.Pq YP .
-The functionality of the two remains the same;
-only the name has changed.
Index: usr.bin/newkey/newkey.c
===================================================================
--- usr.bin/newkey/newkey.c
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user or with the express written consent of
- * Sun Microsystems, Inc.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- */
-
-#if !defined(lint) && defined(SCCSIDS)
-#if 0
-static char sccsid[] = "@(#)newkey.c 1.8 91/03/11 Copyr 1986 Sun Micro";
-#endif
-#endif
-
-/*
- * Copyright (C) 1986, Sun Microsystems, Inc.
- */
-
-/*
- * Administrative tool to add a new user to the publickey database
- */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/time.h>
-#include <sys/resource.h>
-
-#include <rpc/rpc.h>
-#include <rpc/key_prot.h>
-
-#ifdef YP
-#include <sys/wait.h>
-#include <rpcsvc/yp_prot.h>
-#include <rpcsvc/ypclnt.h>
-#include <netdb.h>
-#endif /* YP */
-
-#include <err.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "extern.h"
-
-#ifdef YP
-#define MAXMAPNAMELEN 256
-#else
-#define YPOP_CHANGE 1 /* change, do not add */
-#define YPOP_INSERT 2 /* add, do not change */
-#define YPOP_DELETE 3 /* delete this entry */
-#define YPOP_STORE 4 /* add, or change */
-#define ERR_ACCESS 1
-#define ERR_MALLOC 2
-#define ERR_READ 3
-#define ERR_WRITE 4
-#define ERR_DBASE 5
-#define ERR_KEY 6
-#endif
-
-#ifdef YP
-static char YPDBPATH[]="/var/yp";
-static char PKMAP[] = "publickey.byname";
-#else
-static char PKFILE[] = "/etc/publickey";
-static const char *err_string(int);
-#endif /* YP */
-
-static void usage(void);
-
-int
-main(int argc, char *argv[])
-{
- char name[MAXNETNAMELEN + 1];
- char public[HEXKEYBYTES + 1];
- char secret[HEXKEYBYTES + 1];
- char crypt1[HEXKEYBYTES + KEYCHECKSUMSIZE + 1];
- char crypt2[HEXKEYBYTES + KEYCHECKSUMSIZE + 1];
- int status;
- char *pass;
- struct passwd *pw;
-#ifdef undef
- struct hostent *h;
-#endif
-
- fprintf(stderr, "newkey is deprecated and removed from FreeBSD 14.\n");
- if (argc != 3 || !(strcmp(argv[1], "-u") == 0 ||
- strcmp(argv[1], "-h") == 0)) {
- usage();
- }
- if (geteuid() != 0)
- errx(1, "must be superuser");
-
-#ifdef YP
- if (chdir(YPDBPATH) < 0)
- warn("cannot chdir to %s", YPDBPATH);
-#endif /* YP */
- if (strcmp(argv[1], "-u") == 0) {
- pw = getpwnam(argv[2]);
- if (pw == NULL)
- errx(1, "unknown user: %s", argv[2]);
- (void)user2netname(name, (int)pw->pw_uid, (char *)NULL);
- } else {
-#ifdef undef
- h = gethostbyname(argv[2]);
- if (h == NULL)
- errx(1, "unknown host: %s", argv[1]);
- (void)host2netname(name, h->h_name, (char *)NULL);
-#else
- (void)host2netname(name, argv[2], (char *)NULL);
-#endif
- }
-
- (void)printf("Adding new key for %s.\n", name);
- pass = getpass("New password:");
- genkeys(public, secret, pass);
-
- memcpy(crypt1, secret, HEXKEYBYTES);
- memcpy(crypt1 + HEXKEYBYTES, secret, KEYCHECKSUMSIZE);
- crypt1[HEXKEYBYTES + KEYCHECKSUMSIZE] = 0;
- xencrypt(crypt1, pass);
-
- memcpy(crypt2, crypt1, HEXKEYBYTES + KEYCHECKSUMSIZE + 1);
- xdecrypt(crypt2, getpass("Retype password:"));
- if (memcmp(crypt2, crypt2 + HEXKEYBYTES, KEYCHECKSUMSIZE) != 0 ||
- memcmp(crypt2, secret, HEXKEYBYTES) != 0)
- errx(1, "password incorrect");
-
-#ifdef YP
- (void)printf("Please wait for the database to get updated...\n");
-#endif
- if ((status = setpublicmap(name, public, crypt1))) {
-#ifdef YP
- errx(1, "unable to update NIS database (%u): %s",
- status, yperr_string(status));
-#else
- errx(1, "unable to update publickey database (%u): %s",
- status, err_string(status));
-#endif
- }
- (void)printf("Your new key has been successfully stored away.\n");
- exit(0);
- /* NOTREACHED */
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr, "%s\n%s\n",
- "usage: newkey -h hostname",
- " newkey -u username");
- exit(1);
-}
-
-/*
- * Set the entry in the public key file
- */
-int
-setpublicmap(char *name, char *public, char *secret)
-{
- char pkent[1024];
-
- (void)sprintf(pkent, "%s:%s", public, secret);
-#ifdef YP
- return (mapupdate(name, PKMAP, YPOP_STORE,
- strlen(name), name, strlen(pkent), pkent));
-#else
- return (localupdate(name, PKFILE, YPOP_STORE,
- strlen(name), name, strlen(pkent), pkent));
-#endif
- }
-
-#ifndef YP
- /*
- * This returns a pointer to an error message string appropriate
- * to an input error code. An input value of zero will return
- * a success message.
- */
-static const char *
-err_string(int code)
-{
- const char *pmesg;
-
- switch (code) {
- case 0:
- pmesg = "update operation succeeded";
- break;
- case ERR_KEY:
- pmesg = "no such key in file";
- break;
- case ERR_READ:
- pmesg = "cannot read the database";
- break;
- case ERR_WRITE:
- pmesg = "cannot write to the database";
- break;
- case ERR_DBASE:
- pmesg = "cannot update database";
- break;
- case ERR_ACCESS:
- pmesg = "permission denied";
- break;
- case ERR_MALLOC:
- pmesg = "malloc failed";
- break;
- default:
- pmesg = "unknown error";
- break;
- }
- return (pmesg);
-}
-#endif
Index: usr.bin/newkey/update.c
===================================================================
--- usr.bin/newkey/update.c
+++ /dev/null
@@ -1,340 +0,0 @@
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user or with the express written consent of
- * Sun Microsystems, Inc.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)update.c 1.2 91/03/11 Copyr 1986 Sun Micro";
-#endif
-#endif
-
-/*
- * Copyright (C) 1986, 1989, Sun Microsystems, Inc.
- */
-
-/*
- * Administrative tool to add a new user to the publickey database
- */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/time.h>
-#include <sys/resource.h>
-
-#include <rpc/rpc.h>
-#include <rpc/key_prot.h>
-
-#ifdef YP
-#include <sys/wait.h>
-#include <rpcsvc/yp_prot.h>
-#include <rpcsvc/ypclnt.h>
-#include <netdb.h>
-#endif /* YP */
-
-#include <pwd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "extern.h"
-
-#ifdef YP
-static char SHELL[] = "/bin/sh";
-static char YPDBPATH[]="/var/yp"; /* This is defined but not used! */
-static char UPDATEFILE[] = "updaters";
-
-static int _openchild(char *, FILE **, FILE **);
-static char *basename(char *path);
-
-/*
- * Determine if requester is allowed to update the given map,
- * and update it if so. Returns the yp status, which is zero
- * if there is no access violation.
- */
-int
-mapupdate(char *requester, char *mapname, u_int op, u_int keylen,
- char *key, u_int datalen, char *data)
-{
- char updater[MAXMAPNAMELEN + 40];
- FILE *childargs;
- FILE *childrslt;
-#ifdef WEXITSTATUS
- int status;
-#else
- union wait status;
-#endif
- pid_t pid;
- u_int yperrno;
-
-
-#ifdef DEBUG
- printf("%s %s\n", key, data);
-#endif
- (void)sprintf(updater, "make -s -f %s/%s %s", YPDBPATH, /* !!! */
- UPDATEFILE, mapname);
- pid = _openchild(updater, &childargs, &childrslt);
- if (pid < 0) {
- return (YPERR_YPERR);
- }
-
- /*
- * Write to child
- */
- (void)fprintf(childargs, "%s\n", requester);
- (void)fprintf(childargs, "%u\n", op);
- (void)fprintf(childargs, "%u\n", keylen);
- (void)fwrite(key, (int)keylen, 1, childargs);
- (void)fprintf(childargs, "\n");
- (void)fprintf(childargs, "%u\n", datalen);
- (void)fwrite(data, (int)datalen, 1, childargs);
- (void)fprintf(childargs, "\n");
- (void)fclose(childargs);
-
- /*
- * Read from child
- */
- (void)fscanf(childrslt, "%d", &yperrno);
- (void)fclose(childrslt);
-
- (void)wait(&status);
-#ifdef WEXITSTATUS
- if (WEXITSTATUS(status) != 0) {
-#else
- if (status.w_retcode != 0) {
-#endif
- return (YPERR_YPERR);
- }
- return (yperrno);
-}
-
-/*
- * returns pid, or -1 for failure
- */
-static pid_t
-_openchild(char *command, FILE **fto, FILE **ffrom)
-{
- int i;
- pid_t pid;
- int pdto[2];
- int pdfrom[2];
- char *com;
- struct rlimit rl;
-
- if (pipe(pdto) < 0) {
- goto error1;
- }
- if (pipe(pdfrom) < 0) {
- goto error2;
- }
- switch (pid = fork()) {
- case -1:
- goto error3;
-
- case 0:
- /*
- * child: read from pdto[0], write into pdfrom[1]
- */
- (void)close(0);
- (void)dup(pdto[0]);
- (void)close(1);
- (void)dup(pdfrom[1]);
- getrlimit(RLIMIT_NOFILE, &rl);
- for (i = rl.rlim_max - 1; i >= 3; i--) {
- (void) close(i);
- }
- com = malloc((unsigned) strlen(command) + 6);
- if (com == NULL) {
- _exit(~0);
- }
- (void)sprintf(com, "exec %s", command);
- execl(SHELL, basename(SHELL), "-c", com, (char *)NULL);
- _exit(~0);
-
- default:
- /*
- * parent: write into pdto[1], read from pdfrom[0]
- */
- *fto = fdopen(pdto[1], "w");
- (void)close(pdto[0]);
- *ffrom = fdopen(pdfrom[0], "r");
- (void)close(pdfrom[1]);
- break;
- }
- return (pid);
-
- /*
- * error cleanup and return
- */
-error3:
- (void)close(pdfrom[0]);
- (void)close(pdfrom[1]);
-error2:
- (void)close(pdto[0]);
- (void)close(pdto[1]);
-error1:
- return (-1);
-}
-
-static char *
-basename(char *path)
-{
- char *p;
-
- p = strrchr(path, '/');
- if (p == NULL) {
- return (path);
- } else {
- return (p + 1);
- }
-}
-
-#else /* YP */
-
-#define ERR_ACCESS 1
-#define ERR_MALLOC 2
-#define ERR_READ 3
-#define ERR_WRITE 4
-#define ERR_DBASE 5
-#define ERR_KEY 6
-
-static int match(char *, char *);
-
-/*
- * Determine if requester is allowed to update the given map,
- * and update it if so. Returns the status, which is zero
- * if there is no access violation. This function updates
- * the local file and then shuts up.
- */
-int
-localupdate(char *name, char *filename, u_int op, u_int keylen __unused,
- char *key, u_int datalen __unused, char *data)
-{
- char line[256];
- FILE *rf;
- FILE *wf;
- char *tmpname;
- int err;
-
- /*
- * Check permission
- */
- if (strcmp(name, key) != 0) {
- return (ERR_ACCESS);
- }
- if (strcmp(name, "nobody") == 0) {
- /*
- * Can't change "nobody"s key.
- */
- return (ERR_ACCESS);
- }
-
- /*
- * Open files
- */
- tmpname = malloc(strlen(filename) + 4);
- if (tmpname == NULL) {
- return (ERR_MALLOC);
- }
- sprintf(tmpname, "%s.tmp", filename);
- rf = fopen(filename, "r");
- if (rf == NULL) {
- err = ERR_READ;
- goto cleanup;
- }
- wf = fopen(tmpname, "w");
- if (wf == NULL) {
- fclose(rf);
- err = ERR_WRITE;
- goto cleanup;
- }
- err = -1;
- while (fgets(line, sizeof (line), rf)) {
- if (err < 0 && match(line, name)) {
- switch (op) {
- case YPOP_INSERT:
- err = ERR_KEY;
- break;
- case YPOP_STORE:
- case YPOP_CHANGE:
- fprintf(wf, "%s %s\n", key, data);
- err = 0;
- break;
- case YPOP_DELETE:
- /* do nothing */
- err = 0;
- break;
- }
- } else {
- fputs(line, wf);
- }
- }
- if (err < 0) {
- switch (op) {
- case YPOP_CHANGE:
- case YPOP_DELETE:
- err = ERR_KEY;
- break;
- case YPOP_INSERT:
- case YPOP_STORE:
- err = 0;
- fprintf(wf, "%s %s\n", key, data);
- break;
- }
- }
- fclose(wf);
- fclose(rf);
- if (err == 0) {
- if (rename(tmpname, filename) < 0) {
- err = ERR_DBASE;
- goto cleanup;
- }
- } else {
- if (unlink(tmpname) < 0) {
- err = ERR_DBASE;
- goto cleanup;
- }
- }
-
-cleanup:
- free(tmpname);
- return (err);
-}
-
-static int
-match(char *line, char *name)
-{
- int len;
-
- len = strlen(name);
- return (strncmp(line, name, len) == 0 &&
- (line[len] == ' ' || line[len] == '\t'));
-}
-#endif /* !YP */
Index: usr.sbin/Makefile
===================================================================
--- usr.sbin/Makefile
+++ usr.sbin/Makefile
@@ -180,7 +180,6 @@
SUBDIR.${MK_NIS}+= ypserv
SUBDIR.${MK_NIS}+= ypset
SUBDIR.${MK_NTP}+= ntp
-SUBDIR.${MK_OPENSSL}+= keyserv
SUBDIR.${MK_OPENSSL_KTLS}+= rpc.tlsclntd
SUBDIR.${MK_OPENSSL_KTLS}+= rpc.tlsservd
SUBDIR.${MK_PF}+= ftp-proxy
Index: usr.sbin/keyserv/Makefile
===================================================================
--- usr.sbin/keyserv/Makefile
+++ /dev/null
@@ -1,25 +0,0 @@
-# $FreeBSD$
-
-PROG= keyserv
-MAN= keyserv.8
-SRCS= keyserv.c setkey.c crypt_svc.c crypt_server.c crypt.h
-
-CFLAGS+= -DBROKEN_DES -I.
-
-LIBADD= mp rpcsvc
-
-WARNS?= 1
-
-RPCDIR= ${SYSROOT:U${DESTDIR}}/usr/include/rpcsvc
-
-CLEANFILES= crypt_svc.c crypt.h
-
-RPCGEN= RPCGEN_CPP=${CPP:Q} rpcgen -C
-
-crypt_svc.c: ${RPCDIR}/crypt.x
- ${RPCGEN} -m -o ${.TARGET} ${RPCDIR}/crypt.x
-
-crypt.h: ${RPCDIR}/crypt.x
- ${RPCGEN} -h -o ${.TARGET} ${RPCDIR}/crypt.x
-
-.include <bsd.prog.mk>
Index: usr.sbin/keyserv/Makefile.depend
===================================================================
--- usr.sbin/keyserv/Makefile.depend
+++ /dev/null
@@ -1,22 +0,0 @@
-# $FreeBSD$
-# Autogenerated - do NOT edit!
-
-DIRDEPS = \
- gnu/lib/csu \
- include \
- include/rpc \
- include/rpcsvc \
- include/xlocale \
- lib/${CSU_DIR} \
- lib/libc \
- lib/libcompiler_rt \
- lib/libmp \
- lib/librpcsvc \
- secure/lib/libcrypto \
-
-
-.include <dirdeps.mk>
-
-.if ${DEP_RELDIR} == ${_DEP_RELDIR}
-# local dependencies - needed for -jN in clean tree
-.endif
Index: usr.sbin/keyserv/crypt_server.c
===================================================================
--- usr.sbin/keyserv/crypt_server.c
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- * Copyright (c) 1996
- * Bill Paul <wpaul@ctr.columbia.edu>. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Bill Paul.
- * 4. Neither the name of the author nor the names of any co-contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL Bill Paul OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <dirent.h>
-#include <dlfcn.h>
-#include <err.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <rpc/des_crypt.h>
-#include <rpc/des.h>
-#include "crypt.h"
-
-#ifndef lint
-static const char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-/*
- * The U.S. government stupidly believes that a) it can keep strong
- * crypto code a secret and b) that doing so somehow protects national
- * interests. It's wrong on both counts, but until it listens to reason
- * we have to make certain compromises so it doesn't have an excuse to
- * throw us in federal prison.
- *
- * Consequently, the core OS ships without DES support, and keyserv
- * defaults to using ARCFOUR with only a 40 bit key, just like nutscrape.
- * This breaks compatibility with Secure RPC on other systems, but it
- * allows Secure RPC to work between FreeBSD systems that don't have the
- * DES package installed without throwing security totally out the window.
- *
- * In order to avoid having to supply two versions of keyserv (one with
- * DES and one without), we use dlopen() and friends to load libdes.so
- * into our address space at runtime. We check for the presence of
- * /usr/lib/libdes.so.3.0 at startup and load it if we find it. If we
- * can't find it, or the __des_crypt symbol doesn't exist, we fall back
- * to the ARCFOUR encryption code. The user can specify another path using
- * the -p flag.
- */
-
- /* arcfour.h */
-typedef struct arcfour_key
-{
- unsigned char state[256];
- unsigned char x;
- unsigned char y;
-} arcfour_key;
-
-static void prepare_key(unsigned char *key_data_ptr,int key_data_len,
- arcfour_key *key);
-static void arcfour(unsigned char *buffer_ptr,int buffer_len,arcfour_key * key);
-static void swap_byte(unsigned char *a, unsigned char *b);
-
-static void prepare_key(unsigned char *key_data_ptr, int key_data_len,
- arcfour_key *key)
-{
- unsigned char index1;
- unsigned char index2;
- unsigned char* state;
- short counter;
-
- state = &key->state[0];
- for(counter = 0; counter < 256; counter++)
- state[counter] = counter;
- key->x = 0;
- key->y = 0;
- index1 = 0;
- index2 = 0;
- for(counter = 0; counter < 256; counter++)
- {
- index2 = (key_data_ptr[index1] + state[counter] +
- index2) % 256;
- swap_byte(&state[counter], &state[index2]);
-
- index1 = (index1 + 1) % key_data_len;
- }
-}
-
-static void arcfour(unsigned char *buffer_ptr, int buffer_len, arcfour_key *key)
-{
- unsigned char x;
- unsigned char y;
- unsigned char* state;
- unsigned char xorIndex;
- short counter;
-
- x = key->x;
- y = key->y;
-
- state = &key->state[0];
- for(counter = 0; counter < buffer_len; counter ++)
- {
- x = (x + 1) % 256;
- y = (state[x] + y) % 256;
- swap_byte(&state[x], &state[y]);
-
- xorIndex = (state[x] + state[y]) % 256;
-
- buffer_ptr[counter] ^= state[xorIndex];
- }
- key->x = x;
- key->y = y;
-}
-
-static void swap_byte(unsigned char *a, unsigned char *b)
-{
- unsigned char swapByte;
-
- swapByte = *a;
- *a = *b;
- *b = swapByte;
-}
-
-/* Dummy _des_crypt function that uses ARCFOUR with a 40 bit key */
-int _arcfour_crypt(buf, len, desp)
- char *buf;
- int len;
- struct desparams *desp;
-{
- struct arcfour_key arcfourk;
-
- /*
- * U.S. government anti-crypto weasels take
- * note: although we are supplied with a 64 bit
- * key, we're only passing 40 bits to the ARCFOUR
- * encryption code. So there.
- */
- prepare_key(desp->des_key, 5, &arcfourk);
- arcfour(buf, len, &arcfourk);
-
- return(DESERR_NOHWDEVICE);
-}
-
-int (*_my_crypt)(char *, int, struct desparams *) = NULL;
-
-static void *dlhandle;
-
-#ifndef _PATH_USRLIB
-#define _PATH_USRLIB "/usr/lib"
-#endif
-
-#ifndef LIBCRYPTO
-#define LIBCRYPTO "libcrypto.so.2"
-#endif
-
-void load_des(warn, libpath)
- int warn;
- char *libpath;
-{
- char dlpath[MAXPATHLEN];
-
- if (libpath == NULL)
- snprintf(dlpath, sizeof(dlpath), "%s/%s", _PATH_USRLIB,
- LIBCRYPTO);
- else
- snprintf(dlpath, sizeof(dlpath), "%s", libpath);
-
- if ((dlhandle = dlopen(dlpath, 0444)) != NULL)
- _my_crypt = (int (*)())dlsym(dlhandle, "_des_crypt");
-
- if (_my_crypt == NULL) {
- if (dlhandle != NULL)
- dlclose(dlhandle);
- _my_crypt = &_arcfour_crypt;
- if (warn) {
- printf ("DES support disabled -- using ARCFOUR instead.\n");
- printf ("Warning: ARCFOUR cipher is not compatible with ");
- printf ("other Secure RPC implementations.\nInstall ");
- printf ("the FreeBSD 'des' distribution to enable");
- printf (" DES encryption.\n");
- }
- } else {
- if (warn) {
- printf ("DES support enabled\n");
- printf ("Using %s shared object.\n", dlpath);
- }
- }
-
- return;
-}
-
-desresp *
-des_crypt_1_svc(desargs *argp, struct svc_req *rqstp)
-{
- static desresp result;
- struct desparams dparm;
-
- if (argp->desbuf.desbuf_len > DES_MAXDATA) {
- result.stat = DESERR_BADPARAM;
- return(&result);
- }
-
-
- bcopy(argp->des_key, dparm.des_key, 8);
- bcopy(argp->des_ivec, dparm.des_ivec, 8);
- dparm.des_mode = (argp->des_mode == CBC_DES) ? CBC : ECB;
- dparm.des_dir = (argp->des_dir == ENCRYPT_DES) ? ENCRYPT : DECRYPT;
-#ifdef BROKEN_DES
- dparm.UDES.UDES_buf = argp->desbuf.desbuf_val;
-#endif
-
- /*
- * XXX This compensates for a bug in the libdes Secure RPC
- * compat interface. (Actually, there are a couple.) The
- * des_ecb_encrypt() routine in libdes only encrypts 8 bytes
- * (64 bits) at a time. However, the Sun Secure RPC ecb_crypt()
- * routine is supposed to be able to handle buffers up to 8Kbytes.
- * The rpc_enc module in libdes ignores this fact and just drops
- * the length parameter on the floor, encrypting only the
- * first 64 bits of whatever buffer you feed it. We deal with
- * this here: if we're using DES encryption, and we're using
- * ECB mode, then we make a pass over the entire buffer
- * ourselves. Note: the rpc_enc module incorrectly transposes
- * the mode flags, so when you ask for CBC mode, you're really
- * getting ECB mode.
- */
-#ifdef BROKEN_DES
- if (_my_crypt != &_arcfour_crypt && argp->des_mode == CBC) {
-#else
- if (_my_crypt != &_arcfour_crypt && argp->des_mode == ECB) {
-#endif
- int i;
- char *dptr;
-
- for (i = 0; i < argp->desbuf.desbuf_len / 8; i++) {
- dptr = argp->desbuf.desbuf_val;
- dptr += (i * 8);
-#ifdef BROKEN_DES
- dparm.UDES.UDES_buf = dptr;
-#endif
- result.stat = _my_crypt(dptr, 8, &dparm);
- }
- } else {
- result.stat = _my_crypt(argp->desbuf.desbuf_val,
- argp->desbuf.desbuf_len,
- &dparm);
- }
-
- if (result.stat == DESERR_NONE || result.stat == DESERR_NOHWDEVICE) {
- bcopy(dparm.des_ivec, result.des_ivec, 8);
- result.desbuf.desbuf_len = argp->desbuf.desbuf_len;
- result.desbuf.desbuf_val = argp->desbuf.desbuf_val;
- }
-
- return (&result);
-}
Index: usr.sbin/keyserv/keyserv.h
===================================================================
--- usr.sbin/keyserv/keyserv.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * $FreeBSD$
- */
-extern void setmodulus(char *modx);
-
-extern keystatus pk_setkey( uid_t, keybuf );
-extern keystatus pk_encrypt( uid_t, char *, netobj *, des_block * );
-extern keystatus pk_decrypt( uid_t, char *, netobj *, des_block * );
-extern keystatus pk_netput( uid_t, key_netstarg * );
-extern keystatus pk_netget( uid_t, key_netstarg * );
-extern keystatus pk_get_conv_key( uid_t, keybuf, cryptkeyres * );
-extern void pk_nodefaultkeys( void );
-
-extern void crypt_prog_1( struct svc_req *, register SVCXPRT * );
-extern void load_des( int, char * );
-
-extern int (*_my_crypt)( char *, int, struct desparams * );
Index: usr.sbin/keyserv/keyserv.8
===================================================================
--- usr.sbin/keyserv/keyserv.8
+++ /dev/null
@@ -1,85 +0,0 @@
-.\" @(#)keyserv.1m 1.21 93/07/14 SMI; from SVr4
-.\"macro stdmacro
-.\" Copyright 1989 AT&T
-.\" @(#)keyserv.8c 1.8 89/03/29 SMI;
-.\" $FreeBSD$
-.\".TH KEYSERV 8C "9 September 1987"
-.Dd September 14, 1992
-.Dt KEYSERV 8
-.Os
-.Sh NAME
-.Nm keyserv
-.Nd server for storing private encryption keys
-.Sh SYNOPSIS
-.Nm
-.Op Fl d
-.Op Fl D
-.Op Fl n
-.Op Fl p Ar path
-.Op Fl v
-.Sh DESCRIPTION
-The
-.Nm
-utility is a daemon that is used for storing the
-private encryption keys of each
-user logged into the system.
-These encryption keys are used for accessing
-secure network services such as secure
-.Tn NFS .
-.Pp
-Normally, root's key is read from the file
-.Pa /etc/.rootkey
-when the daemon is started.
-This is useful during power-fail reboots
-when no one is around to type a password.
-.Pp
-If a client with no secret key calls
-.Nm ,
-then the key of user
-.Em nobody
-is used instead as the default key.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl d
-Disable the use of default keys for
-.Em nobody .
-.It Fl D
-Run in debugging mode and log all requests to
-.Nm .
-.It Fl n
-Root's secret key is not read from
-.Pa /etc/.rootkey .
-Instead,
-.Nm
-prompts the user for the password to decrypt
-root's key stored in the
-.Pa /etc/publickey
-database and then stores the decrypted key in
-.Pa /etc/.rootkey
-for future use.
-This option is useful if the
-.Pa /etc/.rootkey
-file ever gets out of date or corrupted.
-.It Fl p Ar path
-Specify where to search for
-.Pa libdes.so.3 .
-Default is
-.Pa /usr/lib .
-.It Fl v
-Display status of DES support (enabled/disabled).
-.El
-.Sh FILES
-.Bl -tag -width /usr/lib/libdes.so.3 -compact
-.It Pa /etc/.rootkey
-.It Pa /usr/lib/libdes.so.3
-.El
-.Sh "SEE ALSO"
-.Xr keylogin 1 ,
-.Xr keylogout 1 ,
-.Xr publickey 5
-.Sh HISTORY
-The
-.Nm
-utility was removed from
-.Fx 14.0 .
Index: usr.sbin/keyserv/keyserv.c
===================================================================
--- usr.sbin/keyserv/keyserv.c
+++ /dev/null
@@ -1,792 +0,0 @@
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)keyserv.c 1.15 94/04/25 SMI";
-#endif
-static const char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-/*
- * Copyright (c) 1986 - 1991 by Sun Microsystems, Inc.
- */
-
-/*
- * Keyserver
- * Store secret keys per uid. Do public key encryption and decryption
- * operations. Generate "random" keys.
- * Do not talk to anything but a local root
- * process on the local transport only
- */
-
-#include <err.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <rpc/rpc.h>
-#include <sys/param.h>
-#include <sys/file.h>
-#include <rpc/des_crypt.h>
-#include <rpc/des.h>
-#include <rpc/key_prot.h>
-#include <rpcsvc/crypt.h>
-#include "keyserv.h"
-
-#ifndef NGROUPS
-#define NGROUPS 16
-#endif
-
-#ifndef KEYSERVSOCK
-#define KEYSERVSOCK "/var/run/keyservsock"
-#endif
-
-static void randomize( des_block * );
-static void usage( void );
-static int getrootkey( des_block *, int );
-static int root_auth( SVCXPRT *, struct svc_req * );
-
-#ifdef DEBUG
-static int debugging = 1;
-#else
-static int debugging = 0;
-#endif
-
-static void keyprogram();
-static des_block masterkey;
-char *getenv();
-static char ROOTKEY[] = "/etc/.rootkey";
-
-/*
- * Hack to allow the keyserver to use AUTH_DES (for authenticated
- * NIS+ calls, for example). The only functions that get called
- * are key_encryptsession_pk, key_decryptsession_pk, and key_gendes.
- *
- * The approach is to have the keyserver fill in pointers to local
- * implementations of these functions, and to call those in key_call().
- */
-
-extern cryptkeyres *(*__key_encryptsession_pk_LOCAL)();
-extern cryptkeyres *(*__key_decryptsession_pk_LOCAL)();
-extern des_block *(*__key_gendes_LOCAL)();
-extern int (*__des_crypt_LOCAL)();
-
-cryptkeyres *key_encrypt_pk_2_svc_prog( uid_t, cryptkeyarg2 * );
-cryptkeyres *key_decrypt_pk_2_svc_prog( uid_t, cryptkeyarg2 * );
-des_block *key_gen_1_svc_prog( void *, struct svc_req * );
-
-int
-main(argc, argv)
- int argc;
- char *argv[];
-{
- int nflag = 0;
- int c;
- int warn = 0;
- char *path = NULL;
- void *localhandle;
- register SVCXPRT *transp;
- struct netconfig *nconf = NULL;
-
- fprintf(stderr, "keyserv is deprecated and removed from FreeBSD 14.\n");
- __key_encryptsession_pk_LOCAL = &key_encrypt_pk_2_svc_prog;
- __key_decryptsession_pk_LOCAL = &key_decrypt_pk_2_svc_prog;
- __key_gendes_LOCAL = &key_gen_1_svc_prog;
-
- while ((c = getopt(argc, argv, "ndDvp:")) != -1)
- switch (c) {
- case 'n':
- nflag++;
- break;
- case 'd':
- pk_nodefaultkeys();
- break;
- case 'D':
- debugging = 1;
- break;
- case 'v':
- warn = 1;
- break;
- case 'p':
- path = optarg;
- break;
- default:
- usage();
- }
-
- load_des(warn, path);
- __des_crypt_LOCAL = _my_crypt;
- if (svc_auth_reg(AUTH_DES, _svcauth_des) == -1)
- errx(1, "failed to register AUTH_DES authenticator");
-
- if (optind != argc) {
- usage();
- }
-
- /*
- * Initialize
- */
- (void) umask(S_IXUSR|S_IXGRP|S_IXOTH);
- if (geteuid() != 0)
- errx(1, "keyserv must be run as root");
- setmodulus(HEXMODULUS);
- getrootkey(&masterkey, nflag);
-
- rpcb_unset(KEY_PROG, KEY_VERS, NULL);
- rpcb_unset(KEY_PROG, KEY_VERS2, NULL);
-
- if (svc_create(keyprogram, KEY_PROG, KEY_VERS,
- "netpath") == 0) {
- (void) fprintf(stderr,
- "%s: unable to create service\n", argv[0]);
- exit(1);
- }
-
- if (svc_create(keyprogram, KEY_PROG, KEY_VERS2,
- "netpath") == 0) {
- (void) fprintf(stderr,
- "%s: unable to create service\n", argv[0]);
- exit(1);
- }
-
- localhandle = setnetconfig();
- while ((nconf = getnetconfig(localhandle)) != NULL) {
- if (nconf->nc_protofmly != NULL &&
- strcmp(nconf->nc_protofmly, NC_LOOPBACK) == 0)
- break;
- }
-
- if (nconf == NULL)
- errx(1, "getnetconfig: %s", nc_sperror());
-
- unlink(KEYSERVSOCK);
- rpcb_unset(CRYPT_PROG, CRYPT_VERS, nconf);
- transp = svcunix_create(RPC_ANYSOCK, 0, 0, KEYSERVSOCK);
- if (transp == NULL)
- errx(1, "cannot create AF_LOCAL service");
- if (!svc_reg(transp, KEY_PROG, KEY_VERS, keyprogram, nconf))
- errx(1, "unable to register (KEY_PROG, KEY_VERS, unix)");
- if (!svc_reg(transp, KEY_PROG, KEY_VERS2, keyprogram, nconf))
- errx(1, "unable to register (KEY_PROG, KEY_VERS2, unix)");
- if (!svc_reg(transp, CRYPT_PROG, CRYPT_VERS, crypt_prog_1, nconf))
- errx(1, "unable to register (CRYPT_PROG, CRYPT_VERS, unix)");
-
- endnetconfig(localhandle);
-
- (void) umask(066); /* paranoia */
-
- if (!debugging) {
- daemon(0,0);
- }
-
- signal(SIGPIPE, SIG_IGN);
-
- svc_run();
- abort();
- /* NOTREACHED */
-}
-
-/*
- * In the event that we don't get a root password, we try to
- * randomize the master key the best we can
- */
-static void
-randomize(master)
- des_block *master;
-{
- master->key.low = arc4random();
- master->key.high = arc4random();
-}
-
-/*
- * Try to get root's secret key, by prompting if terminal is a tty, else trying
- * from standard input.
- * Returns 1 on success.
- */
-static int
-getrootkey(master, prompt)
- des_block *master;
- int prompt;
-{
- char *passwd;
- char name[MAXNETNAMELEN + 1];
- char secret[HEXKEYBYTES];
- key_netstarg netstore;
- int fd;
-
- if (!prompt) {
- /*
- * Read secret key out of ROOTKEY
- */
- fd = open(ROOTKEY, O_RDONLY, 0);
- if (fd < 0) {
- randomize(master);
- return (0);
- }
- if (read(fd, secret, HEXKEYBYTES) < HEXKEYBYTES) {
- warnx("the key read from %s was too short", ROOTKEY);
- (void) close(fd);
- return (0);
- }
- (void) close(fd);
- if (!getnetname(name)) {
- warnx(
- "failed to generate host's netname when establishing root's key");
- return (0);
- }
- memcpy(netstore.st_priv_key, secret, HEXKEYBYTES);
- memset(netstore.st_pub_key, 0, HEXKEYBYTES);
- netstore.st_netname = name;
- if (pk_netput(0, &netstore) != KEY_SUCCESS) {
- warnx("could not set root's key and netname");
- return (0);
- }
- return (1);
- }
- /*
- * Decrypt yellow pages publickey entry to get secret key
- */
- passwd = getpass("root password:");
- passwd2des(passwd, (char *)master);
- getnetname(name);
- if (!getsecretkey(name, secret, passwd)) {
- warnx("can't find %s's secret key", name);
- return (0);
- }
- if (secret[0] == 0) {
- warnx("password does not decrypt secret key for %s", name);
- return (0);
- }
- (void) pk_setkey(0, secret);
- /*
- * Store it for future use in $ROOTKEY, if possible
- */
- fd = open(ROOTKEY, O_WRONLY|O_TRUNC|O_CREAT, 0);
- if (fd > 0) {
- char newline = '\n';
-
- write(fd, secret, strlen(secret));
- write(fd, &newline, sizeof (newline));
- close(fd);
- }
- return (1);
-}
-
-/*
- * Procedures to implement RPC service
- */
-char *
-strstatus(status)
- keystatus status;
-{
- switch (status) {
- case KEY_SUCCESS:
- return ("KEY_SUCCESS");
- case KEY_NOSECRET:
- return ("KEY_NOSECRET");
- case KEY_UNKNOWN:
- return ("KEY_UNKNOWN");
- case KEY_SYSTEMERR:
- return ("KEY_SYSTEMERR");
- default:
- return ("(bad result code)");
- }
-}
-
-keystatus *
-key_set_1_svc_prog(uid, key)
- uid_t uid;
- keybuf key;
-{
- static keystatus status;
-
- if (debugging) {
- (void) fprintf(stderr, "set(%u, %.*s) = ", uid,
- (int) sizeof (keybuf), key);
- }
- status = pk_setkey(uid, key);
- if (debugging) {
- (void) fprintf(stderr, "%s\n", strstatus(status));
- (void) fflush(stderr);
- }
- return (&status);
-}
-
-cryptkeyres *
-key_encrypt_pk_2_svc_prog(uid, arg)
- uid_t uid;
- cryptkeyarg2 *arg;
-{
- static cryptkeyres res;
-
- if (debugging) {
- (void) fprintf(stderr, "encrypt(%u, %s, %08x%08x) = ", uid,
- arg->remotename, arg->deskey.key.high,
- arg->deskey.key.low);
- }
- res.cryptkeyres_u.deskey = arg->deskey;
- res.status = pk_encrypt(uid, arg->remotename, &(arg->remotekey),
- &res.cryptkeyres_u.deskey);
- if (debugging) {
- if (res.status == KEY_SUCCESS) {
- (void) fprintf(stderr, "%08x%08x\n",
- res.cryptkeyres_u.deskey.key.high,
- res.cryptkeyres_u.deskey.key.low);
- } else {
- (void) fprintf(stderr, "%s\n", strstatus(res.status));
- }
- (void) fflush(stderr);
- }
- return (&res);
-}
-
-cryptkeyres *
-key_decrypt_pk_2_svc_prog(uid, arg)
- uid_t uid;
- cryptkeyarg2 *arg;
-{
- static cryptkeyres res;
-
- if (debugging) {
- (void) fprintf(stderr, "decrypt(%u, %s, %08x%08x) = ", uid,
- arg->remotename, arg->deskey.key.high,
- arg->deskey.key.low);
- }
- res.cryptkeyres_u.deskey = arg->deskey;
- res.status = pk_decrypt(uid, arg->remotename, &(arg->remotekey),
- &res.cryptkeyres_u.deskey);
- if (debugging) {
- if (res.status == KEY_SUCCESS) {
- (void) fprintf(stderr, "%08x%08x\n",
- res.cryptkeyres_u.deskey.key.high,
- res.cryptkeyres_u.deskey.key.low);
- } else {
- (void) fprintf(stderr, "%s\n", strstatus(res.status));
- }
- (void) fflush(stderr);
- }
- return (&res);
-}
-
-keystatus *
-key_net_put_2_svc_prog(uid, arg)
- uid_t uid;
- key_netstarg *arg;
-{
- static keystatus status;
-
- if (debugging) {
- (void) fprintf(stderr, "net_put(%s, %.*s, %.*s) = ",
- arg->st_netname, (int)sizeof (arg->st_pub_key),
- arg->st_pub_key, (int)sizeof (arg->st_priv_key),
- arg->st_priv_key);
- }
-
- status = pk_netput(uid, arg);
-
- if (debugging) {
- (void) fprintf(stderr, "%s\n", strstatus(status));
- (void) fflush(stderr);
- }
-
- return (&status);
-}
-
-key_netstres *
-key_net_get_2_svc_prog(uid, arg)
- uid_t uid;
- void *arg;
-{
- static key_netstres keynetname;
-
- if (debugging)
- (void) fprintf(stderr, "net_get(%u) = ", uid);
-
- keynetname.status = pk_netget(uid, &keynetname.key_netstres_u.knet);
- if (debugging) {
- if (keynetname.status == KEY_SUCCESS) {
- fprintf(stderr, "<%s, %.*s, %.*s>\n",
- keynetname.key_netstres_u.knet.st_netname,
- (int)sizeof (keynetname.key_netstres_u.knet.st_pub_key),
- keynetname.key_netstres_u.knet.st_pub_key,
- (int)sizeof (keynetname.key_netstres_u.knet.st_priv_key),
- keynetname.key_netstres_u.knet.st_priv_key);
- } else {
- (void) fprintf(stderr, "NOT FOUND\n");
- }
- (void) fflush(stderr);
- }
-
- return (&keynetname);
-
-}
-
-cryptkeyres *
-key_get_conv_2_svc_prog(uid, arg)
- uid_t uid;
- keybuf arg;
-{
- static cryptkeyres res;
-
- if (debugging)
- (void) fprintf(stderr, "get_conv(%u, %.*s) = ", uid,
- (int)sizeof (keybuf), arg);
-
-
- res.status = pk_get_conv_key(uid, arg, &res);
-
- if (debugging) {
- if (res.status == KEY_SUCCESS) {
- (void) fprintf(stderr, "%08x%08x\n",
- res.cryptkeyres_u.deskey.key.high,
- res.cryptkeyres_u.deskey.key.low);
- } else {
- (void) fprintf(stderr, "%s\n", strstatus(res.status));
- }
- (void) fflush(stderr);
- }
- return (&res);
-}
-
-
-cryptkeyres *
-key_encrypt_1_svc_prog(uid, arg)
- uid_t uid;
- cryptkeyarg *arg;
-{
- static cryptkeyres res;
-
- if (debugging) {
- (void) fprintf(stderr, "encrypt(%u, %s, %08x%08x) = ", uid,
- arg->remotename, arg->deskey.key.high,
- arg->deskey.key.low);
- }
- res.cryptkeyres_u.deskey = arg->deskey;
- res.status = pk_encrypt(uid, arg->remotename, NULL,
- &res.cryptkeyres_u.deskey);
- if (debugging) {
- if (res.status == KEY_SUCCESS) {
- (void) fprintf(stderr, "%08x%08x\n",
- res.cryptkeyres_u.deskey.key.high,
- res.cryptkeyres_u.deskey.key.low);
- } else {
- (void) fprintf(stderr, "%s\n", strstatus(res.status));
- }
- (void) fflush(stderr);
- }
- return (&res);
-}
-
-cryptkeyres *
-key_decrypt_1_svc_prog(uid, arg)
- uid_t uid;
- cryptkeyarg *arg;
-{
- static cryptkeyres res;
-
- if (debugging) {
- (void) fprintf(stderr, "decrypt(%u, %s, %08x%08x) = ", uid,
- arg->remotename, arg->deskey.key.high,
- arg->deskey.key.low);
- }
- res.cryptkeyres_u.deskey = arg->deskey;
- res.status = pk_decrypt(uid, arg->remotename, NULL,
- &res.cryptkeyres_u.deskey);
- if (debugging) {
- if (res.status == KEY_SUCCESS) {
- (void) fprintf(stderr, "%08x%08x\n",
- res.cryptkeyres_u.deskey.key.high,
- res.cryptkeyres_u.deskey.key.low);
- } else {
- (void) fprintf(stderr, "%s\n", strstatus(res.status));
- }
- (void) fflush(stderr);
- }
- return (&res);
-}
-
-/* ARGSUSED */
-des_block *
-key_gen_1_svc_prog(v, s)
- void *v;
- struct svc_req *s;
-{
- struct timeval time;
- static des_block keygen;
- static des_block key;
-
- (void)gettimeofday(&time, NULL);
- keygen.key.high += (time.tv_sec ^ time.tv_usec);
- keygen.key.low += (time.tv_sec ^ time.tv_usec);
- ecb_crypt((char *)&masterkey, (char *)&keygen, sizeof (keygen),
- DES_ENCRYPT | DES_HW);
- key = keygen;
- des_setparity((char *)&key);
- if (debugging) {
- (void) fprintf(stderr, "gen() = %08x%08x\n", key.key.high,
- key.key.low);
- (void) fflush(stderr);
- }
- return (&key);
-}
-
-getcredres *
-key_getcred_1_svc_prog(uid, name)
- uid_t uid;
- netnamestr *name;
-{
- static getcredres res;
- static u_int gids[NGROUPS];
- struct unixcred *cred;
-
- cred = &res.getcredres_u.cred;
- cred->gids.gids_val = gids;
- if (!netname2user(*name, (uid_t *) &cred->uid, (gid_t *) &cred->gid,
- (int *)&cred->gids.gids_len, (gid_t *)gids)) {
- res.status = KEY_UNKNOWN;
- } else {
- res.status = KEY_SUCCESS;
- }
- if (debugging) {
- (void) fprintf(stderr, "getcred(%s) = ", *name);
- if (res.status == KEY_SUCCESS) {
- (void) fprintf(stderr, "uid=%d, gid=%d, grouplen=%d\n",
- cred->uid, cred->gid, cred->gids.gids_len);
- } else {
- (void) fprintf(stderr, "%s\n", strstatus(res.status));
- }
- (void) fflush(stderr);
- }
- return (&res);
-}
-
-/*
- * RPC boilerplate
- */
-static void
-keyprogram(rqstp, transp)
- struct svc_req *rqstp;
- SVCXPRT *transp;
-{
- union {
- keybuf key_set_1_arg;
- cryptkeyarg key_encrypt_1_arg;
- cryptkeyarg key_decrypt_1_arg;
- netnamestr key_getcred_1_arg;
- cryptkeyarg key_encrypt_2_arg;
- cryptkeyarg key_decrypt_2_arg;
- netnamestr key_getcred_2_arg;
- cryptkeyarg2 key_encrypt_pk_2_arg;
- cryptkeyarg2 key_decrypt_pk_2_arg;
- key_netstarg key_net_put_2_arg;
- netobj key_get_conv_2_arg;
- } argument;
- char *result;
- xdrproc_t xdr_argument, xdr_result;
- char *(*local) ();
- uid_t uid = -1;
- int check_auth;
-
- switch (rqstp->rq_proc) {
- case NULLPROC:
- svc_sendreply(transp, (xdrproc_t)xdr_void, NULL);
- return;
-
- case KEY_SET:
- xdr_argument = (xdrproc_t)xdr_keybuf;
- xdr_result = (xdrproc_t)xdr_int;
- local = (char *(*)()) key_set_1_svc_prog;
- check_auth = 1;
- break;
-
- case KEY_ENCRYPT:
- xdr_argument = (xdrproc_t)xdr_cryptkeyarg;
- xdr_result = (xdrproc_t)xdr_cryptkeyres;
- local = (char *(*)()) key_encrypt_1_svc_prog;
- check_auth = 1;
- break;
-
- case KEY_DECRYPT:
- xdr_argument = (xdrproc_t)xdr_cryptkeyarg;
- xdr_result = (xdrproc_t)xdr_cryptkeyres;
- local = (char *(*)()) key_decrypt_1_svc_prog;
- check_auth = 1;
- break;
-
- case KEY_GEN:
- xdr_argument = (xdrproc_t)xdr_void;
- xdr_result = (xdrproc_t)xdr_des_block;
- local = (char *(*)()) key_gen_1_svc_prog;
- check_auth = 0;
- break;
-
- case KEY_GETCRED:
- xdr_argument = (xdrproc_t)xdr_netnamestr;
- xdr_result = (xdrproc_t)xdr_getcredres;
- local = (char *(*)()) key_getcred_1_svc_prog;
- check_auth = 0;
- break;
-
- case KEY_ENCRYPT_PK:
- xdr_argument = (xdrproc_t)xdr_cryptkeyarg2;
- xdr_result = (xdrproc_t)xdr_cryptkeyres;
- local = (char *(*)()) key_encrypt_pk_2_svc_prog;
- check_auth = 1;
- break;
-
- case KEY_DECRYPT_PK:
- xdr_argument = (xdrproc_t)xdr_cryptkeyarg2;
- xdr_result = (xdrproc_t)xdr_cryptkeyres;
- local = (char *(*)()) key_decrypt_pk_2_svc_prog;
- check_auth = 1;
- break;
-
-
- case KEY_NET_PUT:
- xdr_argument = (xdrproc_t)xdr_key_netstarg;
- xdr_result = (xdrproc_t)xdr_keystatus;
- local = (char *(*)()) key_net_put_2_svc_prog;
- check_auth = 1;
- break;
-
- case KEY_NET_GET:
- xdr_argument = (xdrproc_t) xdr_void;
- xdr_result = (xdrproc_t)xdr_key_netstres;
- local = (char *(*)()) key_net_get_2_svc_prog;
- check_auth = 1;
- break;
-
- case KEY_GET_CONV:
- xdr_argument = (xdrproc_t) xdr_keybuf;
- xdr_result = (xdrproc_t)xdr_cryptkeyres;
- local = (char *(*)()) key_get_conv_2_svc_prog;
- check_auth = 1;
- break;
-
- default:
- svcerr_noproc(transp);
- return;
- }
- if (check_auth) {
- if (root_auth(transp, rqstp) == 0) {
- if (debugging) {
- (void) fprintf(stderr,
- "not local privileged process\n");
- }
- svcerr_weakauth(transp);
- return;
- }
- if (rqstp->rq_cred.oa_flavor != AUTH_SYS) {
- if (debugging) {
- (void) fprintf(stderr,
- "not unix authentication\n");
- }
- svcerr_weakauth(transp);
- return;
- }
- uid = ((struct authsys_parms *)rqstp->rq_clntcred)->aup_uid;
- }
-
- memset(&argument, 0, sizeof (argument));
- if (!svc_getargs(transp, xdr_argument, &argument)) {
- svcerr_decode(transp);
- return;
- }
- result = (*local) (uid, &argument);
- if (!svc_sendreply(transp, xdr_result, result)) {
- if (debugging)
- (void) fprintf(stderr, "unable to reply\n");
- svcerr_systemerr(transp);
- }
- if (!svc_freeargs(transp, xdr_argument, &argument)) {
- if (debugging)
- (void) fprintf(stderr,
- "unable to free arguments\n");
- exit(1);
- }
- return;
-}
-
-static int
-root_auth(trans, rqstp)
- SVCXPRT *trans;
- struct svc_req *rqstp;
-{
- uid_t uid;
- struct sockaddr *remote;
-
- remote = svc_getrpccaller(trans)->buf;
- if (remote->sa_family != AF_UNIX) {
- if (debugging)
- fprintf(stderr, "client didn't use AF_UNIX\n");
- return (0);
- }
-
- if (__rpc_get_local_uid(trans, &uid) < 0) {
- if (debugging)
- fprintf(stderr, "__rpc_get_local_uid failed\n");
- return (0);
- }
-
- if (debugging)
- fprintf(stderr, "local_uid %u\n", uid);
- if (uid == 0)
- return (1);
- if (rqstp->rq_cred.oa_flavor == AUTH_SYS) {
- if (((uid_t) ((struct authunix_parms *)
- rqstp->rq_clntcred)->aup_uid)
- == uid) {
- return (1);
- } else {
- if (debugging)
- fprintf(stderr,
- "local_uid %u mismatches auth %u\n", uid,
-((uid_t) ((struct authunix_parms *)rqstp->rq_clntcred)->aup_uid));
- return (0);
- }
- } else {
- if (debugging)
- fprintf(stderr, "Not auth sys\n");
- return (0);
- }
-}
-
-static void
-usage()
-{
- (void) fprintf(stderr,
- "usage: keyserv [-n] [-D] [-d] [-v] [-p path]\n");
- (void) fprintf(stderr, "-d disables the use of default keys\n");
- exit(1);
-}
Index: usr.sbin/keyserv/setkey.c
===================================================================
--- usr.sbin/keyserv/setkey.c
+++ /dev/null
@@ -1,550 +0,0 @@
-/*
- * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
- * unrestricted use provided that this legend is included on all tape
- * media and as a part of the software program in whole or part. Users
- * may copy or modify Sun RPC without charge, but are not authorized
- * to license or distribute it to anyone else except as part of a product or
- * program developed by the user.
- *
- * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
- * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
- * Sun RPC is provided with no support and without any obligation on the
- * part of Sun Microsystems, Inc. to assist in its use, correction,
- * modification or enhancement.
- *
- * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
- * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
- * OR ANY PART THEREOF.
- *
- * In no event will Sun Microsystems, Inc. be liable for any lost revenue
- * or profits or other special, indirect and consequential damages, even if
- * Sun has been advised of the possibility of such damages.
- *
- * Sun Microsystems, Inc.
- * 2550 Garcia Avenue
- * Mountain View, California 94043
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)setkey.c 1.11 94/04/25 SMI";
-#endif
-static const char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-/*
- * Copyright (c) 1986 - 1991 by Sun Microsystems, Inc.
- */
-
-/*
- * Do the real work of the keyserver.
- * Store secret keys. Compute common keys,
- * and use them to decrypt and encrypt DES keys.
- * Cache the common keys, so the expensive computation is avoided.
- */
-#include <mp.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <rpc/rpc.h>
-#include <rpc/key_prot.h>
-#include <rpc/des_crypt.h>
-#include <rpc/des.h>
-#include <sys/errno.h>
-#include "keyserv.h"
-
-static MINT *MODULUS;
-static char *fetchsecretkey( uid_t );
-static void writecache( char *, char *, des_block * );
-static int readcache( char *, char *, des_block * );
-static void extractdeskey( MINT *, des_block * );
-static int storesecretkey( uid_t, keybuf );
-static keystatus pk_crypt( uid_t, char *, netobj *, des_block *, int);
-static int nodefaultkeys = 0;
-
-
-/*
- * prohibit the nobody key on this machine k (the -d flag)
- */
-void
-pk_nodefaultkeys()
-{
- nodefaultkeys = 1;
-}
-
-/*
- * Set the modulus for all our Diffie-Hellman operations
- */
-void
-setmodulus(modx)
- char *modx;
-{
- MODULUS = mp_xtom(modx);
-}
-
-/*
- * Set the secretkey key for this uid
- */
-keystatus
-pk_setkey(uid, skey)
- uid_t uid;
- keybuf skey;
-{
- if (!storesecretkey(uid, skey)) {
- return (KEY_SYSTEMERR);
- }
- return (KEY_SUCCESS);
-}
-
-/*
- * Encrypt the key using the public key associated with remote_name and the
- * secret key associated with uid.
- */
-keystatus
-pk_encrypt(uid, remote_name, remote_key, key)
- uid_t uid;
- char *remote_name;
- netobj *remote_key;
- des_block *key;
-{
- return (pk_crypt(uid, remote_name, remote_key, key, DES_ENCRYPT));
-}
-
-/*
- * Decrypt the key using the public key associated with remote_name and the
- * secret key associated with uid.
- */
-keystatus
-pk_decrypt(uid, remote_name, remote_key, key)
- uid_t uid;
- char *remote_name;
- netobj *remote_key;
- des_block *key;
-{
- return (pk_crypt(uid, remote_name, remote_key, key, DES_DECRYPT));
-}
-
-static int store_netname( uid_t, key_netstarg * );
-static int fetch_netname( uid_t, key_netstarg * );
-
-keystatus
-pk_netput(uid, netstore)
- uid_t uid;
- key_netstarg *netstore;
-{
- if (!store_netname(uid, netstore)) {
- return (KEY_SYSTEMERR);
- }
- return (KEY_SUCCESS);
-}
-
-keystatus
-pk_netget(uid, netstore)
- uid_t uid;
- key_netstarg *netstore;
-{
- if (!fetch_netname(uid, netstore)) {
- return (KEY_SYSTEMERR);
- }
- return (KEY_SUCCESS);
-}
-
-
-/*
- * Do the work of pk_encrypt && pk_decrypt
- */
-static keystatus
-pk_crypt(uid, remote_name, remote_key, key, mode)
- uid_t uid;
- char *remote_name;
- netobj *remote_key;
- des_block *key;
- int mode;
-{
- char *xsecret;
- char xpublic[1024];
- char xsecret_hold[1024];
- des_block deskey;
- int err;
- MINT *public;
- MINT *secret;
- MINT *common;
- char zero[8];
-
- xsecret = fetchsecretkey(uid);
- if (xsecret == NULL || xsecret[0] == 0) {
- memset(zero, 0, sizeof (zero));
- xsecret = xsecret_hold;
- if (nodefaultkeys)
- return (KEY_NOSECRET);
-
- if (!getsecretkey("nobody", xsecret, zero) || xsecret[0] == 0) {
- return (KEY_NOSECRET);
- }
- }
- if (remote_key) {
- memcpy(xpublic, remote_key->n_bytes, remote_key->n_len);
- } else {
- bzero((char *)&xpublic, sizeof(xpublic));
- if (!getpublickey(remote_name, xpublic)) {
- if (nodefaultkeys || !getpublickey("nobody", xpublic))
- return (KEY_UNKNOWN);
- }
- }
-
- if (!readcache(xpublic, xsecret, &deskey)) {
- public = mp_xtom(xpublic);
- secret = mp_xtom(xsecret);
- /* Sanity Check on public and private keys */
- if ((public == NULL) || (secret == NULL))
- return (KEY_SYSTEMERR);
-
- common = mp_itom(0);
- mp_pow(public, secret, MODULUS, common);
- extractdeskey(common, &deskey);
- writecache(xpublic, xsecret, &deskey);
- mp_mfree(secret);
- mp_mfree(public);
- mp_mfree(common);
- }
- err = ecb_crypt((char *)&deskey, (char *)key, sizeof (des_block),
- DES_HW | mode);
- if (DES_FAILED(err)) {
- return (KEY_SYSTEMERR);
- }
- return (KEY_SUCCESS);
-}
-
-keystatus
-pk_get_conv_key(uid, xpublic, result)
- uid_t uid;
- keybuf xpublic;
- cryptkeyres *result;
-{
- char *xsecret;
- char xsecret_hold[1024];
- MINT *public;
- MINT *secret;
- MINT *common;
- char zero[8];
-
-
- xsecret = fetchsecretkey(uid);
-
- if (xsecret == NULL || xsecret[0] == 0) {
- memset(zero, 0, sizeof (zero));
- xsecret = xsecret_hold;
- if (nodefaultkeys)
- return (KEY_NOSECRET);
-
- if (!getsecretkey("nobody", xsecret, zero) ||
- xsecret[0] == 0)
- return (KEY_NOSECRET);
- }
-
- if (!readcache(xpublic, xsecret, &result->cryptkeyres_u.deskey)) {
- public = mp_xtom(xpublic);
- secret = mp_xtom(xsecret);
- /* Sanity Check on public and private keys */
- if ((public == NULL) || (secret == NULL))
- return (KEY_SYSTEMERR);
-
- common = mp_itom(0);
- mp_pow(public, secret, MODULUS, common);
- extractdeskey(common, &result->cryptkeyres_u.deskey);
- writecache(xpublic, xsecret, &result->cryptkeyres_u.deskey);
- mp_mfree(secret);
- mp_mfree(public);
- mp_mfree(common);
- }
-
- return (KEY_SUCCESS);
-}
-
-/*
- * Choose middle 64 bits of the common key to use as our des key, possibly
- * overwriting the lower order bits by setting parity.
- */
-static void
-extractdeskey(ck, deskey)
- MINT *ck;
- des_block *deskey;
-{
- MINT *a;
- short r;
- int i;
- short base = (1 << 8);
- char *k;
-
- a = mp_itom(0);
-#ifdef SOLARIS_MP
- _mp_move(ck, a);
-#else
- mp_move(ck, a);
-#endif
- for (i = 0; i < ((KEYSIZE - 64) / 2) / 8; i++) {
- mp_sdiv(a, base, a, &r);
- }
- k = deskey->c;
- for (i = 0; i < 8; i++) {
- mp_sdiv(a, base, a, &r);
- *k++ = r;
- }
- mp_mfree(a);
- des_setparity((char *)deskey);
-}
-
-/*
- * Key storage management
- */
-
-#define KEY_ONLY 0
-#define KEY_NAME 1
-struct secretkey_netname_list {
- uid_t uid;
- key_netstarg keynetdata;
- u_char sc_flag;
- struct secretkey_netname_list *next;
-};
-
-
-
-static struct secretkey_netname_list *g_secretkey_netname;
-
-/*
- * Store the keys and netname for this uid
- */
-static int
-store_netname(uid, netstore)
- uid_t uid;
- key_netstarg *netstore;
-{
- struct secretkey_netname_list *new;
- struct secretkey_netname_list **l;
-
- for (l = &g_secretkey_netname; *l != NULL && (*l)->uid != uid;
- l = &(*l)->next) {
- }
- if (*l == NULL) {
- new = (struct secretkey_netname_list *)malloc(sizeof (*new));
- if (new == NULL) {
- return (0);
- }
- new->uid = uid;
- new->next = NULL;
- *l = new;
- } else {
- new = *l;
- if (new->keynetdata.st_netname)
- (void) free (new->keynetdata.st_netname);
- }
- memcpy(new->keynetdata.st_priv_key, netstore->st_priv_key,
- HEXKEYBYTES);
- memcpy(new->keynetdata.st_pub_key, netstore->st_pub_key, HEXKEYBYTES);
-
- if (netstore->st_netname)
- new->keynetdata.st_netname = strdup(netstore->st_netname);
- else
- new->keynetdata.st_netname = (char *)NULL;
- new->sc_flag = KEY_NAME;
- return (1);
-
-}
-
-/*
- * Fetch the keys and netname for this uid
- */
-
-static int
-fetch_netname(uid, key_netst)
- uid_t uid;
- struct key_netstarg *key_netst;
-{
- struct secretkey_netname_list *l;
-
- for (l = g_secretkey_netname; l != NULL; l = l->next) {
- if ((l->uid == uid) && (l->sc_flag == KEY_NAME)){
-
- memcpy(key_netst->st_priv_key,
- l->keynetdata.st_priv_key, HEXKEYBYTES);
-
- memcpy(key_netst->st_pub_key,
- l->keynetdata.st_pub_key, HEXKEYBYTES);
-
- if (l->keynetdata.st_netname)
- key_netst->st_netname =
- strdup(l->keynetdata.st_netname);
- else
- key_netst->st_netname = NULL;
- return (1);
- }
- }
-
- return (0);
-}
-
-static char *
-fetchsecretkey(uid)
- uid_t uid;
-{
- struct secretkey_netname_list *l;
-
- for (l = g_secretkey_netname; l != NULL; l = l->next) {
- if (l->uid == uid) {
- return (l->keynetdata.st_priv_key);
- }
- }
- return (NULL);
-}
-
-/*
- * Store the secretkey for this uid
- */
-static int
-storesecretkey(uid, key)
- uid_t uid;
- keybuf key;
-{
- struct secretkey_netname_list *new;
- struct secretkey_netname_list **l;
-
- for (l = &g_secretkey_netname; *l != NULL && (*l)->uid != uid;
- l = &(*l)->next) {
- }
- if (*l == NULL) {
- new = (struct secretkey_netname_list *) malloc(sizeof (*new));
- if (new == NULL) {
- return (0);
- }
- new->uid = uid;
- new->sc_flag = KEY_ONLY;
- memset(new->keynetdata.st_pub_key, 0, HEXKEYBYTES);
- new->keynetdata.st_netname = NULL;
- new->next = NULL;
- *l = new;
- } else {
- new = *l;
- }
-
- memcpy(new->keynetdata.st_priv_key, key,
- HEXKEYBYTES);
- return (1);
-}
-
-static int
-hexdigit(val)
- int val;
-{
- return ("0123456789abcdef"[val]);
-}
-
-void
-bin2hex(bin, hex, size)
- unsigned char *bin;
- unsigned char *hex;
- int size;
-{
- int i;
-
- for (i = 0; i < size; i++) {
- *hex++ = hexdigit(*bin >> 4);
- *hex++ = hexdigit(*bin++ & 0xf);
- }
-}
-
-static int
-hexval(dig)
- char dig;
-{
- if ('0' <= dig && dig <= '9') {
- return (dig - '0');
- } else if ('a' <= dig && dig <= 'f') {
- return (dig - 'a' + 10);
- } else if ('A' <= dig && dig <= 'F') {
- return (dig - 'A' + 10);
- } else {
- return (-1);
- }
-}
-
-void
-hex2bin(hex, bin, size)
- unsigned char *hex;
- unsigned char *bin;
- int size;
-{
- int i;
-
- for (i = 0; i < size; i++) {
- *bin = hexval(*hex++) << 4;
- *bin++ |= hexval(*hex++);
- }
-}
-
-/*
- * Exponential caching management
- */
-struct cachekey_list {
- keybuf secret;
- keybuf public;
- des_block deskey;
- struct cachekey_list *next;
-};
-static struct cachekey_list *g_cachedkeys;
-
-/*
- * cache result of expensive multiple precision exponential operation
- */
-static void
-writecache(pub, sec, deskey)
- char *pub;
- char *sec;
- des_block *deskey;
-{
- struct cachekey_list *new;
-
- new = (struct cachekey_list *) malloc(sizeof (struct cachekey_list));
- if (new == NULL) {
- return;
- }
- memcpy(new->public, pub, sizeof (keybuf));
- memcpy(new->secret, sec, sizeof (keybuf));
- new->deskey = *deskey;
- new->next = g_cachedkeys;
- g_cachedkeys = new;
-}
-
-/*
- * Try to find the common key in the cache
- */
-static int
-readcache(pub, sec, deskey)
- char *pub;
- char *sec;
- des_block *deskey;
-{
- struct cachekey_list *found;
- register struct cachekey_list **l;
-
-#define cachehit(pub, sec, list) \
- (memcmp(pub, (list)->public, sizeof (keybuf)) == 0 && \
- memcmp(sec, (list)->secret, sizeof (keybuf)) == 0)
-
- for (l = &g_cachedkeys; (*l) != NULL && !cachehit(pub, sec, *l);
- l = &(*l)->next)
- ;
- if ((*l) == NULL) {
- return (0);
- }
- found = *l;
- (*l) = (*l)->next;
- found->next = g_cachedkeys;
- g_cachedkeys = found;
- *deskey = found->deskey;
- return (1);
-}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Jan 11, 6:27 AM (19 h, 20 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
15751360
Default Alt Text
D30683.diff (85 KB)
Attached To
Mode
D30683: Remove publickey(5) stuff
Attached
Detach File
Event Timeline
Log In to Comment