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

📄 des.h

📁 Example Dreambox CAM source code
💻 H
字号:
#ifndef __DES_H__
#define __DES_H__

#include "rqcamd.h"

/* --------------------- DES includes ------------------------------ */
#define i_DES_UNROLL 1

#define i_ITERATIONS 16
#define i_DES_LONG unsigned long
#define i_DES_ENCRYPT	1
#define i_DES_DECRYPT	0

#define	i_ROTATE(a, n) ( ( (a) >> (n) ) + ( (a) << ( 32 - (n) ) ) )
#define i_DES_CAST(x) ((i_DES_cblock *)(x))

#define i_DES_check_key 0
#define i_DES_KEY_SZ 	(sizeof(i_DES_cblock))

#define c2l(c, l) \
			(l =((i_DES_LONG)(*((c)++)))     , \
			 l|=((i_DES_LONG)(*((c)++)))<< 8L, \
			 l|=((i_DES_LONG)(*((c)++)))<<16L, \
			 l|=((i_DES_LONG)(*((c)++)))<<24L)

#define c2ln(c,l1,l2,n)	{ \
			c+=n; \
			l1=l2=0; \
			switch (n) \
			{ \
				case 8: l2 =((i_DES_LONG)(*(--(c))))<<24L; \
				case 7: l2|=((i_DES_LONG)(*(--(c))))<<16L; \
				case 6: l2|=((i_DES_LONG)(*(--(c))))<< 8L; \
				case 5: l2|=((i_DES_LONG)(*(--(c))));     \
				case 4: l1 =((i_DES_LONG)(*(--(c))))<<24L; \
				case 3: l1|=((i_DES_LONG)(*(--(c))))<<16L; \
				case 2: l1|=((i_DES_LONG)(*(--(c))))<< 8L; \
				case 1: l1|=((i_DES_LONG)(*(--(c))));     \
			} \
		}
			
#define l2c(l, c) \
			(*((c)++)=(unsigned char)(((l)     )&0xff), \
			 *((c)++)=(unsigned char)(((l)>> 8L)&0xff), \
			 *((c)++)=(unsigned char)(((l)>>16L)&0xff), \
			 *((c)++)=(unsigned char)(((l)>>24L)&0xff))

#define l2cn(l1,l2,c,n)	{ \
			c+=n; \
			switch (n) \
			{ \
				case 8: *(--(c))=(unsigned char)(((l2)>>24L)&0xff); \
				case 7: *(--(c))=(unsigned char)(((l2)>>16L)&0xff); \
				case 6: *(--(c))=(unsigned char)(((l2)>> 8L)&0xff); \
				case 5: *(--(c))=(unsigned char)(((l2)     )&0xff); \
				case 4: *(--(c))=(unsigned char)(((l1)>>24L)&0xff); \
				case 3: *(--(c))=(unsigned char)(((l1)>>16L)&0xff); \
				case 2: *(--(c))=(unsigned char)(((l1)>> 8L)&0xff); \
				case 1: *(--(c))=(unsigned char)(((l1)     )&0xff); \
			} \
		}

#define PERM_OP(a, b, t, n, m) ((t)=((((a)>>(n))^(b))&(m)), (b)^=(t), (a)^=((t)<<(n)))
#define HPERM_OP(a, t, n, m) ((t)=((((a)<<(16-(n)))^(a))&(m)),	(a)=(a)^(t)^(t>>(16-(n))))
	
#define IP(l, r) \
	{ \
		register i_DES_LONG tt; \
		PERM_OP(r, l, tt,  4,0x0f0f0f0fL); \
		PERM_OP(l, r, tt, 16,0x0000ffffL); \
		PERM_OP(r, l, tt,  2,0x33333333L); \
		PERM_OP(l, r, tt,  8,0x00ff00ffL); \
		PERM_OP(r, l, tt,  1,0x55555555L); \
	}

#define FP(l, r) \
	{ \
		register i_DES_LONG tt; \
		PERM_OP(l, r, tt,  1,0x55555555L); \
		PERM_OP(r, l, tt,  8,0x00ff00ffL); \
		PERM_OP(l, r, tt,  2,0x33333333L); \
		PERM_OP(r, l, tt, 16,0x0000ffffL); \
		PERM_OP(l, r, tt,  4,0x0f0f0f0fL); \
	}

const i_DES_LONG i_DES_SPtrans[8][64] =
{
	{
		/* nibble 0 */
		0x02080800L, 0x00080000L, 0x02000002L, 0x02080802L,
		0x02000000L, 0x00080802L, 0x00080002L, 0x02000002L,
		0x00080802L, 0x02080800L, 0x02080000L, 0x00000802L,
		0x02000802L, 0x02000000L, 0x00000000L, 0x00080002L,
		0x00080000L, 0x00000002L, 0x02000800L, 0x00080800L,
		0x02080802L, 0x02080000L, 0x00000802L, 0x02000800L,
		0x00000002L, 0x00000800L, 0x00080800L, 0x02080002L,
		0x00000800L, 0x02000802L, 0x02080002L, 0x00000000L,
		0x00000000L, 0x02080802L, 0x02000800L, 0x00080002L,
		0x02080800L, 0x00080000L, 0x00000802L, 0x02000800L,
		0x02080002L, 0x00000800L, 0x00080800L, 0x02000002L,
		0x00080802L, 0x00000002L, 0x02000002L, 0x02080000L,
		0x02080802L, 0x00080800L, 0x02080000L, 0x02000802L,
		0x02000000L, 0x00000802L, 0x00080002L, 0x00000000L,
		0x00080000L, 0x02000000L, 0x02000802L, 0x02080800L,
		0x00000002L, 0x02080002L, 0x00000800L, 0x00080802L,
	},
	{
		/* nibble 1 */
		0x40108010L, 0x00000000L, 0x00108000L, 0x40100000L,
		0x40000010L, 0x00008010L, 0x40008000L, 0x00108000L,
		0x00008000L, 0x40100010L, 0x00000010L, 0x40008000L,
		0x00100010L, 0x40108000L, 0x40100000L, 0x00000010L,
		0x00100000L, 0x40008010L, 0x40100010L, 0x00008000L,
		0x00108010L, 0x40000000L, 0x00000000L, 0x00100010L,
		0x40008010L, 0x00108010L, 0x40108000L, 0x40000010L,
		0x40000000L, 0x00100000L, 0x00008010L, 0x40108010L,
		0x00100010L, 0x40108000L, 0x40008000L, 0x00108010L,
		0x40108010L, 0x00100010L, 0x40000010L, 0x00000000L,
		0x40000000L, 0x00008010L, 0x00100000L, 0x40100010L,
		0x00008000L, 0x40000000L, 0x00108010L, 0x40008010L,
		0x40108000L, 0x00008000L, 0x00000000L, 0x40000010L,
		0x00000010L, 0x40108010L, 0x00108000L, 0x40100000L,
		0x40100010L, 0x00100000L, 0x00008010L, 0x40008000L,
		0x40008010L, 0x00000010L, 0x40100000L, 0x00108000L,
	},
	{
		/* nibble 2 */
		0x04000001L, 0x04040100L, 0x00000100L, 0x04000101L,
		0x00040001L, 0x04000000L, 0x04000101L, 0x00040100L,
		0x04000100L, 0x00040000L, 0x04040000L, 0x00000001L,
		0x04040101L, 0x00000101L, 0x00000001L, 0x04040001L,
		0x00000000L, 0x00040001L, 0x04040100L, 0x00000100L,
		0x00000101L, 0x04040101L, 0x00040000L, 0x04000001L,
		0x04040001L, 0x04000100L, 0x00040101L, 0x04040000L,
		0x00040100L, 0x00000000L, 0x04000000L, 0x00040101L,
		0x04040100L, 0x00000100L, 0x00000001L, 0x00040000L,
		0x00000101L, 0x00040001L, 0x04040000L, 0x04000101L,
		0x00000000L, 0x04040100L, 0x00040100L, 0x04040001L,
		0x00040001L, 0x04000000L, 0x04040101L, 0x00000001L,
		0x00040101L, 0x04000001L, 0x04000000L, 0x04040101L,
		0x00040000L, 0x04000100L, 0x04000101L, 0x00040100L,
		0x04000100L, 0x00000000L, 0x04040001L, 0x00000101L,
		0x04000001L, 0x00040101L, 0x00000100L, 0x04040000L,
	},
	{
		/* nibble 3 */
		0x00401008L, 0x10001000L, 0x00000008L, 0x10401008L,
		0x00000000L, 0x10400000L, 0x10001008L, 0x00400008L,
		0x10401000L, 0x10000008L, 0x10000000L, 0x00001008L,
		0x10000008L, 0x00401008L, 0x00400000L, 0x10000000L,
		0x10400008L, 0x00401000L, 0x00001000L, 0x00000008L,
		0x00401000L, 0x10001008L, 0x10400000L, 0x00001000L,
		0x00001008L, 0x00000000L, 0x00400008L, 0x10401000L,
		0x10001000L, 0x10400008L, 0x10401008L, 0x00400000L,
		0x10400008L, 0x00001008L, 0x00400000L, 0x10000008L,
		0x00401000L, 0x10001000L, 0x00000008L, 0x10400000L,
		0x10001008L, 0x00000000L, 0x00001000L, 0x00400008L,
		0x00000000L, 0x10400008L, 0x10401000L, 0x00001000L,
		0x10000000L, 0x10401008L, 0x00401008L, 0x00400000L,
		0x10401008L, 0x00000008L, 0x10001000L, 0x00401008L,
		0x00400008L, 0x00401000L, 0x10400000L, 0x10001008L,
		0x00001008L, 0x10000000L, 0x10000008L, 0x10401000L,
	},
	{
		/* nibble 4 */
		0x08000000L, 0x00010000L, 0x00000400L, 0x08010420L,
		0x08010020L, 0x08000400L, 0x00010420L, 0x08010000L,
		0x00010000L, 0x00000020L, 0x08000020L, 0x00010400L,
		0x08000420L, 0x08010020L, 0x08010400L, 0x00000000L,
		0x00010400L, 0x08000000L, 0x00010020L, 0x00000420L,
		0x08000400L, 0x00010420L, 0x00000000L, 0x08000020L,
		0x00000020L, 0x08000420L, 0x08010420L, 0x00010020L,
		0x08010000L, 0x00000400L, 0x00000420L, 0x08010400L,
		0x08010400L, 0x08000420L, 0x00010020L, 0x08010000L,
		0x00010000L, 0x00000020L, 0x08000020L, 0x08000400L,
		0x08000000L, 0x00010400L, 0x08010420L, 0x00000000L,
		0x00010420L, 0x08000000L, 0x00000400L, 0x00010020L,
		0x08000420L, 0x00000400L, 0x00000000L, 0x08010420L,
		0x08010020L, 0x08010400L, 0x00000420L, 0x00010000L,
		0x00010400L, 0x08010020L, 0x08000400L, 0x00000420L,
		0x00000020L, 0x00010420L, 0x08010000L, 0x08000020L,
	},
	{
		/* nibble 5 */
		0x80000040L, 0x00200040L, 0x00000000L, 0x80202000L,
		0x00200040L, 0x00002000L, 0x80002040L, 0x00200000L,
		0x00002040L, 0x80202040L, 0x00202000L, 0x80000000L,
		0x80002000L, 0x80000040L, 0x80200000L, 0x00202040L,
		0x00200000L, 0x80002040L, 0x80200040L, 0x00000000L,
		0x00002000L, 0x00000040L, 0x80202000L, 0x80200040L,
		0x80202040L, 0x80200000L, 0x80000000L, 0x00002040L,
		0x00000040L, 0x00202000L, 0x00202040L, 0x80002000L,
		0x00002040L, 0x80000000L, 0x80002000L, 0x00202040L,
		0x80202000L, 0x00200040L, 0x00000000L, 0x80002000L,
		0x80000000L, 0x00002000L, 0x80200040L, 0x00200000L,
		0x00200040L, 0x80202040L, 0x00202000L, 0x00000040L,
		0x80202040L, 0x00202000L, 0x00200000L, 0x80002040L,
		0x80000040L, 0x80200000L, 0x00202040L, 0x00000000L,
		0x00002000L, 0x80000040L, 0x80002040L, 0x80202000L,
		0x80200000L, 0x00002040L, 0x00000040L, 0x80200040L,
	},
	{
		/* nibble 6 */
		0x00004000L, 0x00000200L, 0x01000200L, 0x01000004L,
		0x01004204L, 0x00004004L, 0x00004200L, 0x00000000L,
		0x01000000L, 0x01000204L, 0x00000204L, 0x01004000L,
		0x00000004L, 0x01004200L, 0x01004000L, 0x00000204L,
		0x01000204L, 0x00004000L, 0x00004004L, 0x01004204L,
		0x00000000L, 0x01000200L, 0x01000004L, 0x00004200L,
		0x01004004L, 0x00004204L, 0x01004200L, 0x00000004L,
		0x00004204L, 0x01004004L, 0x00000200L, 0x01000000L,
		0x00004204L, 0x01004000L, 0x01004004L, 0x00000204L,
		0x00004000L, 0x00000200L, 0x01000000L, 0x01004004L,
		0x01000204L, 0x00004204L, 0x00004200L, 0x00000000L,
		0x00000200L, 0x01000004L, 0x00000004L, 0x01000200L,
		0x00000000L, 0x01000204L, 0x01000200L, 0x00004200L,
		0x00000204L, 0x00004000L, 0x01004204L, 0x01000000L,
		0x01004200L, 0x00000004L, 0x00004004L, 0x01004204L,
		0x01000004L, 0x01004200L, 0x01004000L, 0x00004004L,
	},
	{
		/* nibble 7 */
		0x20800080L, 0x20820000L, 0x00020080L, 0x00000000L,
		0x20020000L, 0x00800080L, 0x20800000L, 0x20820080L,
		0x00000080L, 0x20000000L, 0x00820000L, 0x00020080L,
		0x00820080L, 0x20020080L, 0x20000080L, 0x20800000L,
		0x00020000L, 0x00820080L, 0x00800080L, 0x20020000L,
		0x20820080L, 0x20000080L, 0x00000000L, 0x00820000L,
		0x20000000L, 0x00800000L, 0x20020080L, 0x20800080L,
		0x00800000L, 0x00020000L, 0x20820000L, 0x00000080L,
		0x00800000L, 0x00020000L, 0x20000080L, 0x20820080L,
		0x00020080L, 0x20000000L, 0x00000000L, 0x00820000L,
		0x20800080L, 0x20020080L, 0x20020000L, 0x00800080L,
		0x20820000L, 0x00000080L, 0x00800080L, 0x20020000L,
		0x20820080L, 0x00800000L, 0x20800000L, 0x20000080L,
		0x00820000L, 0x00020080L, 0x20020080L, 0x20800000L,
		0x00000080L, 0x20820000L, 0x00820080L, 0x00000000L,
		0x20000000L, 0x20800080L, 0x00020000L, 0x00820080L,
	}
};

#define LOAD_DATA_tmp(a, b, c, d, e, f) LOAD_DATA(a, b, c, d, e, f, g)
#define LOAD_DATA(R, S, u, t, E0, E1, tmp) \
	u = R ^ s[S  ]; \
	t = R ^ s[S+1]

#define D_ENCRYPT(LL, R, S) \
{ \
	LOAD_DATA_tmp(R, S, u, t, E0, E1); \
	t = i_ROTATE(t, 4); \
	LL ^= \
		i_DES_SPtrans[0][(u>> 2L)&0x3f]^ \
		i_DES_SPtrans[2][(u>>10L)&0x3f]^ \
		i_DES_SPtrans[4][(u>>18L)&0x3f]^ \
		i_DES_SPtrans[6][(u>>26L)&0x3f]^ \
		i_DES_SPtrans[1][(t>> 2L)&0x3f]^ \
		i_DES_SPtrans[3][(t>>10L)&0x3f]^ \
		i_DES_SPtrans[5][(t>>18L)&0x3f]^ \
		i_DES_SPtrans[7][(t>>26L)&0x3f]; \
}

typedef unsigned char i_DES_cblock[8];
typedef unsigned char i_const_DES_cblock[8];

typedef struct i_DES_ks
{
	union
	{
		i_DES_cblock cblock;
		/* make sure things are correct size on machines with 8 byte longs */
		i_DES_LONG deslong[2];
	} ks[16];
} i_DES_key_schedule;

int i_DES_random_key(i_DES_cblock *ret);
int i_DES_key_sched(i_const_DES_cblock *key,i_DES_key_schedule *schedule);
int i_DES_set_key(i_const_DES_cblock *key,i_DES_key_schedule *schedule);
int i_DES_set_key_checked(i_const_DES_cblock *key,i_DES_key_schedule *schedule);
void i_DES_set_key_unchecked(i_const_DES_cblock *key,i_DES_key_schedule *schedule);
void i_DES_set_odd_parity(i_DES_cblock *key);
int i_DES_check_key_parity(i_const_DES_cblock *key);
int i_DES_is_weak_key(i_const_DES_cblock *key);

void i_DES_encrypt2(i_DES_LONG *data, i_DES_key_schedule *ks, int enc);
void i_DES_encrypt3(i_DES_LONG *data, i_DES_key_schedule *ks1, i_DES_key_schedule *ks2, i_DES_key_schedule *ks3);
void i_DES_decrypt3(i_DES_LONG *data, i_DES_key_schedule *ks1, i_DES_key_schedule *ks2, i_DES_key_schedule *ks3);
void i_DES_ecb3_encrypt(i_const_DES_cblock *input, i_DES_cblock *output, i_DES_key_schedule *ks1,i_DES_key_schedule *ks2, i_DES_key_schedule *ks3, int enc);
void i_DES_ede3_cbc_encrypt(const unsigned char *input,unsigned char *output, long length, i_DES_key_schedule *ks1,i_DES_key_schedule *ks2, i_DES_key_schedule *ks3,i_DES_cblock *ivec,int enc);

#define i_DES_ecb2_encrypt(i, o, k1, k2, e) i_DES_ecb3_encrypt((i), (o), (k1), (k2), (k1), (e))
#define i_DES_ede2_cbc_encrypt(i,o,l,k1,k2,iv,e) i_DES_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(e))

#endif

⌨️ 快捷键说明

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