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

📄 des3.c

📁 PeerSec Networks MatrixSSL?is an embedded SSL implementation designed for small footprint applicatio
💻 C
📖 第 1 页 / 共 2 页
字号:
/* *	des3.c *	Release $Name: MATRIXSSL_1_7_3_OPEN $ * *	3DES block cipher implementation for low memory usage *//* *	Copyright (c) PeerSec Networks, 2002-2005. All Rights Reserved. *	The latest version of this code is available at http://www.matrixssl.org * *	This software is open source; you can redistribute it and/or modify *	it under the terms of the GNU General Public License as published by *	the Free Software Foundation; either version 2 of the License, or *	(at your option) any later version. * *	This General Public License does NOT permit incorporating this software  *	into proprietary programs.  If you are unable to comply with the GPL, a  *	commercial license for this software may be purchased from PeerSec Networks *	at http://www.peersec.com *	 *	This program is distributed in WITHOUT ANY WARRANTY; without even the  *	implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  *	See the GNU General Public License for more details. *	 *	You should have received a copy of the GNU General Public License *	along with this program; if not, write to the Free Software *	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA *	http://www.gnu.org/copyleft/gpl.html *//******************************************************************************/#include "../cryptoLayer.h"#ifdef USE_3DES#define EN0 0 #define DE1 1static const ulong32 bytebit[8] ={	0200, 0100, 040, 020, 010, 04, 02, 01 };static const ulong32 bigbyte[24] ={	0x800000UL,		0x400000UL,		0x200000UL,		0x100000UL,	0x80000UL,		0x40000UL,		0x20000UL,		0x10000UL,	0x8000UL,		0x4000UL,		0x2000UL,		0x1000UL,	0x800UL,		0x400UL,		0x200UL,		0x100UL,	0x80UL,			0x40UL,			0x20UL,			0x10UL,	0x8UL,			0x4UL,			0x2UL,			0x1L };static const unsigned char pc1[56] = {    56, 48, 40, 32, 24, 16,  8,  0, 57, 49, 41, 33, 25, 17,       9,  1, 58, 50, 42, 34, 26, 18, 10,  2, 59, 51, 43, 35,     62, 54, 46, 38, 30, 22, 14,  6, 61, 53, 45, 37, 29, 21,    13,  5, 60, 52, 44, 36, 28, 20, 12,  4, 27, 19, 11,  3 };static const unsigned char pc2[48] = {    13, 16, 10, 23,  0,  4,      2, 27, 14,  5, 20,  9,    22, 18, 11,  3, 25,  7,     15,  6, 26, 19, 12,  1,    40, 51, 30, 36, 46, 54,     29, 39, 50, 44, 32, 47,    43, 48, 38, 55, 33, 52,     45, 41, 49, 35, 28, 31};static const unsigned char totrot[16] = {    1,   2,  4,  6,    8,  10, 12, 14,     15, 17, 19, 21,     23, 25, 27, 28};static const ulong32 SP1[] ={	0x01010400UL, 0x00000000UL, 0x00010000UL, 0x01010404UL,	0x01010004UL, 0x00010404UL, 0x00000004UL, 0x00010000UL,	0x00000400UL, 0x01010400UL, 0x01010404UL, 0x00000400UL,	0x01000404UL, 0x01010004UL, 0x01000000UL, 0x00000004UL,	0x00000404UL, 0x01000400UL, 0x01000400UL, 0x00010400UL,	0x00010400UL, 0x01010000UL, 0x01010000UL, 0x01000404UL,	0x00010004UL, 0x01000004UL, 0x01000004UL, 0x00010004UL,	0x00000000UL, 0x00000404UL, 0x00010404UL, 0x01000000UL,	0x00010000UL, 0x01010404UL, 0x00000004UL, 0x01010000UL,	0x01010400UL, 0x01000000UL, 0x01000000UL, 0x00000400UL,	0x01010004UL, 0x00010000UL, 0x00010400UL, 0x01000004UL,	0x00000400UL, 0x00000004UL, 0x01000404UL, 0x00010404UL,	0x01010404UL, 0x00010004UL, 0x01010000UL, 0x01000404UL,	0x01000004UL, 0x00000404UL, 0x00010404UL, 0x01010400UL,	0x00000404UL, 0x01000400UL, 0x01000400UL, 0x00000000UL,	0x00010004UL, 0x00010400UL, 0x00000000UL, 0x01010004UL};static const ulong32 SP2[] ={	0x80108020UL, 0x80008000UL, 0x00008000UL, 0x00108020UL,	0x00100000UL, 0x00000020UL, 0x80100020UL, 0x80008020UL,	0x80000020UL, 0x80108020UL, 0x80108000UL, 0x80000000UL,	0x80008000UL, 0x00100000UL, 0x00000020UL, 0x80100020UL,	0x00108000UL, 0x00100020UL, 0x80008020UL, 0x00000000UL,	0x80000000UL, 0x00008000UL, 0x00108020UL, 0x80100000UL,	0x00100020UL, 0x80000020UL, 0x00000000UL, 0x00108000UL,	0x00008020UL, 0x80108000UL, 0x80100000UL, 0x00008020UL,	0x00000000UL, 0x00108020UL, 0x80100020UL, 0x00100000UL,	0x80008020UL, 0x80100000UL, 0x80108000UL, 0x00008000UL,	0x80100000UL, 0x80008000UL, 0x00000020UL, 0x80108020UL,	0x00108020UL, 0x00000020UL, 0x00008000UL, 0x80000000UL,	0x00008020UL, 0x80108000UL, 0x00100000UL, 0x80000020UL,	0x00100020UL, 0x80008020UL, 0x80000020UL, 0x00100020UL,	0x00108000UL, 0x00000000UL, 0x80008000UL, 0x00008020UL,	0x80000000UL, 0x80100020UL, 0x80108020UL, 0x00108000UL};static const ulong32 SP3[] ={	0x00000208UL, 0x08020200UL, 0x00000000UL, 0x08020008UL,	0x08000200UL, 0x00000000UL, 0x00020208UL, 0x08000200UL,	0x00020008UL, 0x08000008UL, 0x08000008UL, 0x00020000UL,	0x08020208UL, 0x00020008UL, 0x08020000UL, 0x00000208UL,	0x08000000UL, 0x00000008UL, 0x08020200UL, 0x00000200UL,	0x00020200UL, 0x08020000UL, 0x08020008UL, 0x00020208UL,	0x08000208UL, 0x00020200UL, 0x00020000UL, 0x08000208UL,	0x00000008UL, 0x08020208UL, 0x00000200UL, 0x08000000UL,	0x08020200UL, 0x08000000UL, 0x00020008UL, 0x00000208UL,	0x00020000UL, 0x08020200UL, 0x08000200UL, 0x00000000UL,	0x00000200UL, 0x00020008UL, 0x08020208UL, 0x08000200UL,	0x08000008UL, 0x00000200UL, 0x00000000UL, 0x08020008UL,	0x08000208UL, 0x00020000UL, 0x08000000UL, 0x08020208UL,	0x00000008UL, 0x00020208UL, 0x00020200UL, 0x08000008UL,	0x08020000UL, 0x08000208UL, 0x00000208UL, 0x08020000UL,	0x00020208UL, 0x00000008UL, 0x08020008UL, 0x00020200UL};static const ulong32 SP4[] ={	0x00802001UL, 0x00002081UL, 0x00002081UL, 0x00000080UL,	0x00802080UL, 0x00800081UL, 0x00800001UL, 0x00002001UL,	0x00000000UL, 0x00802000UL, 0x00802000UL, 0x00802081UL,	0x00000081UL, 0x00000000UL, 0x00800080UL, 0x00800001UL,	0x00000001UL, 0x00002000UL, 0x00800000UL, 0x00802001UL,	0x00000080UL, 0x00800000UL, 0x00002001UL, 0x00002080UL,	0x00800081UL, 0x00000001UL, 0x00002080UL, 0x00800080UL,	0x00002000UL, 0x00802080UL, 0x00802081UL, 0x00000081UL,	0x00800080UL, 0x00800001UL, 0x00802000UL, 0x00802081UL,	0x00000081UL, 0x00000000UL, 0x00000000UL, 0x00802000UL,	0x00002080UL, 0x00800080UL, 0x00800081UL, 0x00000001UL,	0x00802001UL, 0x00002081UL, 0x00002081UL, 0x00000080UL,	0x00802081UL, 0x00000081UL, 0x00000001UL, 0x00002000UL,	0x00800001UL, 0x00002001UL, 0x00802080UL, 0x00800081UL,	0x00002001UL, 0x00002080UL, 0x00800000UL, 0x00802001UL,	0x00000080UL, 0x00800000UL, 0x00002000UL, 0x00802080UL};static const ulong32 SP5[] ={	0x00000100UL, 0x02080100UL, 0x02080000UL, 0x42000100UL,	0x00080000UL, 0x00000100UL, 0x40000000UL, 0x02080000UL,	0x40080100UL, 0x00080000UL, 0x02000100UL, 0x40080100UL,	0x42000100UL, 0x42080000UL, 0x00080100UL, 0x40000000UL,	0x02000000UL, 0x40080000UL, 0x40080000UL, 0x00000000UL,	0x40000100UL, 0x42080100UL, 0x42080100UL, 0x02000100UL,	0x42080000UL, 0x40000100UL, 0x00000000UL, 0x42000000UL,	0x02080100UL, 0x02000000UL, 0x42000000UL, 0x00080100UL,	0x00080000UL, 0x42000100UL, 0x00000100UL, 0x02000000UL,	0x40000000UL, 0x02080000UL, 0x42000100UL, 0x40080100UL,	0x02000100UL, 0x40000000UL, 0x42080000UL, 0x02080100UL,	0x40080100UL, 0x00000100UL, 0x02000000UL, 0x42080000UL,	0x42080100UL, 0x00080100UL, 0x42000000UL, 0x42080100UL,	0x02080000UL, 0x00000000UL, 0x40080000UL, 0x42000000UL,	0x00080100UL, 0x02000100UL, 0x40000100UL, 0x00080000UL,	0x00000000UL, 0x40080000UL, 0x02080100UL, 0x40000100UL};static const ulong32 SP6[] ={	0x20000010UL, 0x20400000UL, 0x00004000UL, 0x20404010UL,	0x20400000UL, 0x00000010UL, 0x20404010UL, 0x00400000UL,	0x20004000UL, 0x00404010UL, 0x00400000UL, 0x20000010UL,	0x00400010UL, 0x20004000UL, 0x20000000UL, 0x00004010UL,	0x00000000UL, 0x00400010UL, 0x20004010UL, 0x00004000UL,	0x00404000UL, 0x20004010UL, 0x00000010UL, 0x20400010UL,	0x20400010UL, 0x00000000UL, 0x00404010UL, 0x20404000UL,	0x00004010UL, 0x00404000UL, 0x20404000UL, 0x20000000UL,	0x20004000UL, 0x00000010UL, 0x20400010UL, 0x00404000UL,	0x20404010UL, 0x00400000UL, 0x00004010UL, 0x20000010UL,	0x00400000UL, 0x20004000UL, 0x20000000UL, 0x00004010UL,	0x20000010UL, 0x20404010UL, 0x00404000UL, 0x20400000UL,	0x00404010UL, 0x20404000UL, 0x00000000UL, 0x20400010UL,	0x00000010UL, 0x00004000UL, 0x20400000UL, 0x00404010UL,	0x00004000UL, 0x00400010UL, 0x20004010UL, 0x00000000UL,	0x20404000UL, 0x20000000UL, 0x00400010UL, 0x20004010UL};static const ulong32 SP7[] ={	0x00200000UL, 0x04200002UL, 0x04000802UL, 0x00000000UL,	0x00000800UL, 0x04000802UL, 0x00200802UL, 0x04200800UL,	0x04200802UL, 0x00200000UL, 0x00000000UL, 0x04000002UL,	0x00000002UL, 0x04000000UL, 0x04200002UL, 0x00000802UL,	0x04000800UL, 0x00200802UL, 0x00200002UL, 0x04000800UL,	0x04000002UL, 0x04200000UL, 0x04200800UL, 0x00200002UL,	0x04200000UL, 0x00000800UL, 0x00000802UL, 0x04200802UL,	0x00200800UL, 0x00000002UL, 0x04000000UL, 0x00200800UL,	0x04000000UL, 0x00200800UL, 0x00200000UL, 0x04000802UL,	0x04000802UL, 0x04200002UL, 0x04200002UL, 0x00000002UL,	0x00200002UL, 0x04000000UL, 0x04000800UL, 0x00200000UL,	0x04200800UL, 0x00000802UL, 0x00200802UL, 0x04200800UL,	0x00000802UL, 0x04000002UL, 0x04200802UL, 0x04200000UL,	0x00200800UL, 0x00000000UL, 0x00000002UL, 0x04200802UL,	0x00000000UL, 0x00200802UL, 0x04200000UL, 0x00000800UL,	0x04000002UL, 0x04000800UL, 0x00000800UL, 0x00200002UL};static const ulong32 SP8[] ={	0x10001040UL, 0x00001000UL, 0x00040000UL, 0x10041040UL,	0x10000000UL, 0x10001040UL, 0x00000040UL, 0x10000000UL,	0x00040040UL, 0x10040000UL, 0x10041040UL, 0x00041000UL,	0x10041000UL, 0x00041040UL, 0x00001000UL, 0x00000040UL,	0x10040000UL, 0x10000040UL, 0x10001000UL, 0x00001040UL,	0x00041000UL, 0x00040040UL, 0x10040040UL, 0x10041000UL,	0x00001040UL, 0x00000000UL, 0x00000000UL, 0x10040040UL,	0x10000040UL, 0x10001000UL, 0x00041040UL, 0x00040000UL,	0x00041040UL, 0x00040000UL, 0x10041000UL, 0x00001000UL,	0x00000040UL, 0x10040040UL, 0x00001000UL, 0x00041040UL,	0x10001000UL, 0x00000040UL, 0x10000040UL, 0x10040000UL,	0x10040040UL, 0x10000000UL, 0x00040000UL, 0x10001040UL,	0x00000000UL, 0x10041040UL, 0x00040040UL, 0x10000040UL,	0x10040000UL, 0x10001000UL, 0x10001040UL, 0x00000000UL,	0x10041040UL, 0x00041000UL, 0x00041000UL, 0x00001040UL,	0x00001040UL, 0x00040040UL, 0x10000000UL, 0x10041000UL,	0xe1f27f3aUL, 0xf5710fb0UL, 0xada0e5c4UL, 0x98e4c919UL};static void cookey(const ulong32 *raw1, ulong32 *keyout);static void deskey(const unsigned char *key, short edf, ulong32 *keyout);/******************************************************************************//*	Init the 3DES block cipher context for EDE mode.	IV should point to 8 bytes of initialization vector	Key should point to 24 bytes of data*/int32 matrix3desInit(sslCipherContext_t *ctx, unsigned char *IV,				   unsigned char *key, int32 keylen){	int32 x, err;	if (IV == NULL || key == NULL || ctx == NULL || keylen != SSL_DES3_KEY_LEN){		return -1;	}/*	setup cipher */	if ((err = des3_setup(key, keylen, 0, &ctx->des3)) != CRYPT_OK) {		return -1;	}/*	copy IV */	ctx->des3.blocklen = SSL_DES3_IV_LEN;	for (x = 0; x < ctx->des3.blocklen; x++) {		ctx->des3.IV[x] = IV[x];	}	ctx->des3.explicitIV = 0;	return 0;}/******************************************************************************//*	Encrypt a buffer using 3DES-EDE-CBC	(Encrypt Decrypt Encrypt and Cipher Block Chaining)	len must be a multiple of blockLen (8 bytes)*/int32 matrix3desEncrypt(sslCipherContext_t *ctx, unsigned char *pt,					  unsigned char *ct, int32 len){	int32				x, i;	unsigned char	tmp[MAXBLOCKSIZE];	if (pt == NULL || ct == NULL || ctx == NULL || (len & 0x7) != 0) {		return -1;	}	/* is blocklen valid? */	if (ctx->des3.blocklen < 0 || ctx->des3.blocklen > 		(int32)sizeof(ctx->des3.IV)) {		return -1;	}	for (i = 0; i < len; i += ctx->des3.blocklen) {		/* xor IV against plaintext */		for (x = 0; x < ctx->des3.blocklen; x++) {			tmp[x] = pt[x] ^ ctx->des3.IV[x];		}		/* encrypt */		des3_ecb_encrypt(tmp, (unsigned char*)ct, &ctx->des3);		/* store IV [ciphertext] for a future block */		for (x = 0; x < ctx->des3.blocklen; x++) {			ctx->des3.IV[x] = ct[x];		}		ct += ctx->des3.blocklen;		pt += ctx->des3.blocklen;	}#ifdef CLEAN_STACK	psZeromem(tmp, sizeof(tmp));#endif /* CLEAN STACK */	return len;}/******************************************************************************//*	Decrypt a buffer using 3DES-EDE-CBC	(Encrypt Decrypt Encrypt and Cipher Block Chaining)	len must be a multiple of blockLen (8 bytes)*/int32 matrix3desDecrypt(sslCipherContext_t *ctx, unsigned char *ct,					  unsigned char *pt, int32 len){	int32				x, i;	unsigned char	tmp[MAXBLOCKSIZE], tmp2[MAXBLOCKSIZE];	if (pt == NULL || ct == NULL || ctx == NULL || (len & 0x7) != 0) {		return -1;	}	if (ctx->des3.explicitIV) {		for (i = 0; i < ctx->des3.blocklen; i++ ) {			ctx->des3.IV[i] = *ct; ct++;			len--;		}	}	/* is blocklen valid? */	if (ctx->des3.blocklen < 0 || ctx->des3.blocklen > 		(int32)sizeof(ctx->des3.IV)) {		return -1;	}	for (i = 0; i < len; i += ctx->des3.blocklen) {		/* decrypt the block from ct into tmp */		des3_ecb_decrypt(ct, tmp, &ctx->des3);		/* xor IV against the plaintext of the previous step */		for (x = 0; x < ctx->des3.blocklen; x++) { 			/* copy CT in case ct == pt */			tmp2[x] = ct[x]; 			/* actually decrypt the byte */			pt[x] = tmp[x] ^ ctx->des3.IV[x]; 		}		/* replace IV with this current ciphertext */		for (x = 0; x < ctx->des3.blocklen; x++) {			ctx->des3.IV[x] = tmp2[x];		}		ct += ctx->des3.blocklen;		if (ctx->des3.explicitIV) {			if (i != 0) {				pt += ctx->des3.blocklen;			}		} else {

⌨️ 快捷键说明

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