⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 encrypt.c

📁 inetutils的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*- * Copyright (c) 1991, 1993 *	The Regents of the University of California.  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. * 4. Neither the name of the University nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 THE REGENTS 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. */#ifndef lintstatic char sccsid[] = "@(#)encrypt.c	8.2 (Berkeley) 5/30/95";#endif /* not lint *//* * Copyright (C) 1990, 2000 by the Massachusetts Institute of Technology * * Export of this software from the United States of America is assumed * to require a specific license from the United States Government. * It is the responsibility of any person or organization contemplating * export to obtain such a license before exporting. * * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and * distribute this software and its documentation for any purpose and * without fee is hereby granted, provided that the above copyright * notice appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, and that * the name of M.I.T. not be used in advertising or publicity pertaining * to distribution of the software without specific, written prior * permission.  M.I.T. makes no representations about the suitability of * this software for any purpose.  It is provided "as is" without express * or implied warranty. */#ifdef HAVE_CONFIG_H#include <config.h>#endif#ifdef	ENCRYPTION#define	ENCRYPT_NAMES#include <arpa/telnet.h>#include "encrypt.h"#include "misc.h"#ifdef HAVE_STDLIB_H#include <stdlib.h>#endif#ifdef	NO_STRING_H#include <strings.h>#else#include <string.h>#endif/* * These functions pointers point to the current routines * for encrypting and decrypting data. */void	(*encrypt_output) P((unsigned char *, int));int	(*decrypt_input) P((int));int encrypt_debug_mode = 0;static int decrypt_mode = 0;static int encrypt_mode = 0;static int encrypt_verbose = 0;static int autoencrypt = 0;static int autodecrypt = 0;static int havesessionkey = 0;static int Server = 0;static char *Name = "Noname";#define	typemask(x)	((x) > 0 ? 1 << ((x)-1) : 0)static long i_support_encrypt = typemask(ENCTYPE_DES_CFB64)				| typemask(ENCTYPE_DES_OFB64);static long i_support_decrypt = typemask(ENCTYPE_DES_CFB64)				| typemask(ENCTYPE_DES_OFB64);static long i_wont_support_encrypt = 0;static long i_wont_support_decrypt = 0;#define	I_SUPPORT_ENCRYPT	(i_support_encrypt & ~i_wont_support_encrypt)#define	I_SUPPORT_DECRYPT	(i_support_decrypt & ~i_wont_support_decrypt)static long remote_supports_encrypt = 0;static long remote_supports_decrypt = 0;static Encryptions encryptions[] = {#ifdef	DES_ENCRYPTION    { "DES_CFB64",	ENCTYPE_DES_CFB64,			cfb64_encrypt,			cfb64_decrypt,			cfb64_init,			cfb64_start,			cfb64_is,			cfb64_reply,			cfb64_session,			cfb64_keyid,			cfb64_printsub },    { "DES_OFB64",	ENCTYPE_DES_OFB64,			ofb64_encrypt,			ofb64_decrypt,			ofb64_init,			ofb64_start,			ofb64_is,			ofb64_reply,			ofb64_session,			ofb64_keyid,			ofb64_printsub },#endif	/* DES_ENCRYPTION */    { 0, },};static unsigned char str_send[64] = { IAC, SB, TELOPT_ENCRYPT,					 ENCRYPT_SUPPORT };static unsigned char str_suplen = 0;static unsigned char str_start[72] = { IAC, SB, TELOPT_ENCRYPT };static unsigned char str_end[] = { IAC, SB, TELOPT_ENCRYPT, 0, IAC, SE };	Encryptions *findencryption(type)	int type;{	Encryptions *ep = encryptions;	if (!(I_SUPPORT_ENCRYPT & remote_supports_decrypt & typemask(type)))		return(0);	while (ep->type && ep->type != type)		++ep;	return(ep->type ? ep : 0);}	Encryptions *finddecryption(type)	int type;{	Encryptions *ep = encryptions;	if (!(I_SUPPORT_DECRYPT & remote_supports_encrypt & typemask(type)))		return(0);	while (ep->type && ep->type != type)		++ep;	return(ep->type ? ep : 0);}#define	MAXKEYLEN 64static struct key_info {	unsigned char keyid[MAXKEYLEN];	int keylen;	int dir;	int *modep;	Encryptions *(*getcrypt)();} ki[2] = {	{ { 0 }, 0, DIR_ENCRYPT, &encrypt_mode, findencryption },	{ { 0 }, 0, DIR_DECRYPT, &decrypt_mode, finddecryption },};	voidencrypt_init(name, server)	char *name;	int server;{	Encryptions *ep = encryptions;	Name = name;	Server = server;	i_support_encrypt = i_support_decrypt = 0;	remote_supports_encrypt = remote_supports_decrypt = 0;	encrypt_mode = 0;	decrypt_mode = 0;	encrypt_output = 0;	decrypt_input = 0;#ifdef notdef	encrypt_verbose = !server;#endif	str_suplen = 4;	while (ep->type) {		if (encrypt_debug_mode)			printf(">>>%s: I will support %s\r\n",				Name, ENCTYPE_NAME(ep->type));		i_support_encrypt |= typemask(ep->type);		i_support_decrypt |= typemask(ep->type);		if ((i_wont_support_decrypt & typemask(ep->type)) == 0)			if ((str_send[str_suplen++] = ep->type) == IAC)				str_send[str_suplen++] = IAC;		if (ep->init)			(*ep->init)(Server);		++ep;	}	str_send[str_suplen++] = IAC;	str_send[str_suplen++] = SE;}	voidencrypt_list_types(){	Encryptions *ep = encryptions;	printf("Valid encryption types:\n");	while (ep->type) {		printf("\t%s (%d)\r\n", ENCTYPE_NAME(ep->type), ep->type);		++ep;	}}	intEncryptEnable(type, mode)	char *type, *mode;{	if (isprefix(type, "help") || isprefix(type, "?")) {		printf("Usage: encrypt enable <type> [input|output]\n");		encrypt_list_types();		return(0);	}	if (EncryptType(type, mode))		return(EncryptStart(mode));	return(0);}	intEncryptDisable(type, mode)	char *type, *mode;{	register Encryptions *ep;	int ret = 0;	if (isprefix(type, "help") || isprefix(type, "?")) {		printf("Usage: encrypt disable <type> [input|output]\n");		encrypt_list_types();	} else if ((ep = (Encryptions *)genget(type, encryptions,						sizeof(Encryptions))) == 0) {		printf("%s: invalid encryption type\n", type);	} else if (Ambiguous(ep)) {		printf("Ambiguous type '%s'\n", type);	} else {		if ((mode == 0) || (isprefix(mode, "input") ? 1 : 0)) {			if (decrypt_mode == ep->type)				EncryptStopInput();			i_wont_support_decrypt |= typemask(ep->type);			ret = 1;		}		if ((mode == 0) || (isprefix(mode, "output"))) {			if (encrypt_mode == ep->type)				EncryptStopOutput();			i_wont_support_encrypt |= typemask(ep->type);			ret = 1;		}		if (ret == 0)			printf("%s: invalid encryption mode\n", mode);	}	return(ret);}	intEncryptType(type, mode)	char *type;	char *mode;{	register Encryptions *ep;	int ret = 0;	if (isprefix(type, "help") || isprefix(type, "?")) {		printf("Usage: encrypt type <type> [input|output]\n");		encrypt_list_types();	} else if ((ep = (Encryptions *)genget(type, encryptions,						sizeof(Encryptions))) == 0) {		printf("%s: invalid encryption type\n", type);	} else if (Ambiguous(ep)) {		printf("Ambiguous type '%s'\n", type);	} else {		if ((mode == 0) || isprefix(mode, "input")) {			decrypt_mode = ep->type;			i_wont_support_decrypt &= ~typemask(ep->type);			ret = 1;		}		if ((mode == 0) || isprefix(mode, "output")) {			encrypt_mode = ep->type;			i_wont_support_encrypt &= ~typemask(ep->type);			ret = 1;		}		if (ret == 0)			printf("%s: invalid encryption mode\n", mode);	}	return(ret);}	intEncryptStart(mode)	char *mode;{	register int ret = 0;	if (mode) {		if (isprefix(mode, "input"))			return(EncryptStartInput());		if (isprefix(mode, "output"))			return(EncryptStartOutput());		if (isprefix(mode, "help") || isprefix(mode, "?")) {			printf("Usage: encrypt start [input|output]\n");			return(0);		}		printf("%s: invalid encryption mode 'encrypt start ?' for help\n", mode);		return(0);	}	ret += EncryptStartInput();	ret += EncryptStartOutput();	return(ret);}	intEncryptStartInput(){	if (decrypt_mode) {		encrypt_send_request_start();		return(1);	}	printf("No previous decryption mode, decryption not enabled\r\n");	return(0);}	intEncryptStartOutput(){	if (encrypt_mode) {		encrypt_start_output(encrypt_mode);		return(1);	}	printf("No previous encryption mode, encryption not enabled\r\n");	return(0);}	intEncryptStop(mode)	char *mode;{	int ret = 0;	if (mode) {		if (isprefix(mode, "input"))			return(EncryptStopInput());		if (isprefix(mode, "output"))			return(EncryptStopOutput());		if (isprefix(mode, "help") || isprefix(mode, "?")) {			printf("Usage: encrypt stop [input|output]\n");			return(0);		}		printf("%s: invalid encryption mode 'encrypt stop ?' for help\n", mode);		return(0);	}	ret += EncryptStopInput();	ret += EncryptStopOutput();	return(ret);}	intEncryptStopInput(){	encrypt_send_request_end();	return(1);}	intEncryptStopOutput(){	encrypt_send_end();	return(1);}	voidencrypt_display(){	if (encrypt_output)		printf("Currently encrypting output with %s\r\n",			ENCTYPE_NAME(encrypt_mode));	if (decrypt_input)		printf("Currently decrypting input with %s\r\n",			ENCTYPE_NAME(decrypt_mode));}	intEncryptStatus(){	if (encrypt_output)		printf("Currently encrypting output with %s\r\n",			ENCTYPE_NAME(encrypt_mode));	else if (encrypt_mode) {		printf("Currently output is clear text.\r\n");		printf("Last encryption mode was %s\r\n",			ENCTYPE_NAME(encrypt_mode));	}	if (decrypt_input) {		printf("Currently decrypting input with %s\r\n",			ENCTYPE_NAME(decrypt_mode));	} else if (decrypt_mode) {		printf("Currently input is clear text.\r\n");		printf("Last decryption mode was %s\r\n",			ENCTYPE_NAME(decrypt_mode));	}	return 1;}	voidencrypt_send_support(){	if (str_suplen) {		/*		 * If the user has requested that decryption start		 * immediatly, then send a "REQUEST START" before		 * we negotiate the type.		 */		if (!Server && autodecrypt)			encrypt_send_request_start();		net_write(str_send, str_suplen);		printsub('>', &str_send[2], str_suplen - 2);		str_suplen = 0;	}}	intEncryptDebug(on)	int on;{	if (on < 0)		encrypt_debug_mode ^= 1;	else		encrypt_debug_mode = on;	printf("Encryption debugging %s\r\n",		encrypt_debug_mode ? "enabled" : "disabled");	return(1);}	intEncryptVerbose(on)	int on;{	if (on < 0)		encrypt_verbose ^= 1;	else		encrypt_verbose = on;	printf("Encryption %s verbose\r\n",		encrypt_verbose ? "is" : "is not");	return(1);}	intEncryptAutoEnc(on)	int on;{	encrypt_auto(on);	printf("Automatic encryption of output is %s\r\n",		autoencrypt ? "enabled" : "disabled");	return(1);}	intEncryptAutoDec(on)	int on;{	decrypt_auto(on);	printf("Automatic decryption of input is %s\r\n",		autodecrypt ? "enabled" : "disabled");	return(1);}/* * Called when ENCRYPT SUPPORT is received. */	voidencrypt_support(typelist, cnt)	unsigned char *typelist;	int cnt;{	register int type, use_type = 0;	Encryptions *ep;	/*	 * Forget anything the other side has previously told us.	 */	remote_supports_decrypt = 0;	while (cnt-- > 0) {		type = *typelist++;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -