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

📄 cipher-mars.c

📁 海思KEY驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
	return 0;};#else /* defined(CIPHER_MARS_ROUND_1) */static intmars_set_key (struct cipher_context *cx, const unsigned char *key, int key_len,	      int atomic){	u32 i, j, m, t1, t2, *kp;	const u32 *in_key = (const u32 *) key;	u32 *l_key = cx->keyinfo;	u32 t_key[15];		/* key mixing array */	if (key_len != 16 && key_len != 24 && key_len != 32)		return -EINVAL;	/* unsupported key length */	m = key_len / 4;	for (i = 0; i < m; ++i)		t_key[i] = le32_to_cpu (in_key[i]);	t_key[i++] = m;	for (; i < 15; ++i)		t_key[i] = 0;	kp = l_key;#define tk1(j) t1 = t_key[j] ^= rotl(t1 ^ t_key[(j + 8) % 15], 3) ^ (i + 4 * j)#define tk2(j) t2 = t_key[j] ^= rotl(t2 ^ t_key[(j + 8) % 15], 3) ^ (i + 4 * j)#define tk3(j) t_key[j] = t1 = rotl(t_key[j] + s_box[t1 & 511], 9)	for (i = 0; i < 4; ++i) {		t1 = t_key[13];		t2 = t_key[14];		tk1 (0);		tk2 (1);		tk1 (2);		tk2 (3);		tk1 (4);		tk2 (5);		tk1 (6);		tk2 (7);		tk1 (8);		tk2 (9);		tk1 (10);		tk2 (11);		tk1 (12);		tk2 (13);		tk1 (14);		tk3 (0);		tk3 (1);		tk3 (2);		tk3 (3);		tk3 (4);		tk3 (5);		tk3 (6);		tk3 (7);		tk3 (8);		tk3 (9);		tk3 (10);		tk3 (11);		tk3 (12);		tk3 (13);		tk3 (14);		tk3 (0);		tk3 (1);		tk3 (2);		tk3 (3);		tk3 (4);		tk3 (5);		tk3 (6);		tk3 (7);		tk3 (8);		tk3 (9);		tk3 (10);		tk3 (11);		tk3 (12);		tk3 (13);		tk3 (14);		tk3 (0);		tk3 (1);		tk3 (2);		tk3 (3);		tk3 (4);		tk3 (5);		tk3 (6);		tk3 (7);		tk3 (8);		tk3 (9);		tk3 (10);		tk3 (11);		tk3 (12);		tk3 (13);		tk3 (14);		tk3 (0);		tk3 (1);		tk3 (2);		tk3 (3);		tk3 (4);		tk3 (5);		tk3 (6);		tk3 (7);		tk3 (8);		tk3 (9);		tk3 (10);		tk3 (11);		tk3 (12);		tk3 (13);		tk3 (14);		*kp++ = t_key[0];		*kp++ = t_key[4];		*kp++ = t_key[8];		*kp++ = t_key[12];		*kp++ = t_key[1];		*kp++ = t_key[5];		*kp++ = t_key[9];		*kp++ = t_key[13];		*kp++ = t_key[2];		*kp++ = t_key[6];	}	for (i = 5; i < 37; i += 2) {		j = l_key[i] | 3;		m = (~j ^ (j >> 1)) & 0x7fffffff;		m &= (m >> 1) & (m >> 2);		m &= (m >> 3) & (m >> 6);		if (m) {			m <<= 1;			m |= (m << 1);			m |= (m << 2);			m |= (m << 4);			m &= 0xfffffffc;			j ^= (rotl (b_tab[l_key[i] & 3], l_key[i - 1]) & m);		}		l_key[i] = j;	}	return 0;}#endif /* defined(CIPHER_MARS_ROUND_1) */static intmars_encrypt (struct cipher_context *cx, const u8 *in, u8 *out, int size,	      int atomic){	u32 a, b, c, d, l, m, r;	const u32 *l_key = cx->keyinfo;	const u32 *in_blk = (const u32 *) in;	u32 *out_blk = (u32 *) out;	a = le32_to_cpu (in_blk[0]) + l_key[0];	b = le32_to_cpu (in_blk[1]) + l_key[1];	c = le32_to_cpu (in_blk[2]) + l_key[2];	d = le32_to_cpu (in_blk[3]) + l_key[3];	f_mix (a, b, c, d);	a += d;	f_mix (b, c, d, a);	b += c;	f_mix (c, d, a, b);	f_mix (d, a, b, c);	f_mix (a, b, c, d);	a += d;	f_mix (b, c, d, a);	b += c;	f_mix (c, d, a, b);	f_mix (d, a, b, c);	f_ktr (a, b, c, d, 4);	f_ktr (b, c, d, a, 6);	f_ktr (c, d, a, b, 8);	f_ktr (d, a, b, c, 10);	f_ktr (a, b, c, d, 12);	f_ktr (b, c, d, a, 14);	f_ktr (c, d, a, b, 16);	f_ktr (d, a, b, c, 18);	f_ktr (a, d, c, b, 20);	f_ktr (b, a, d, c, 22);	f_ktr (c, b, a, d, 24);	f_ktr (d, c, b, a, 26);	f_ktr (a, d, c, b, 28);	f_ktr (b, a, d, c, 30);	f_ktr (c, b, a, d, 32);	f_ktr (d, c, b, a, 34);	b_mix (a, b, c, d);	b_mix (b, c, d, a);	c -= b;	b_mix (c, d, a, b);	d -= a;	b_mix (d, a, b, c);	b_mix (a, b, c, d);	b_mix (b, c, d, a);	c -= b;	b_mix (c, d, a, b);	d -= a;	b_mix (d, a, b, c);	out_blk[0] = cpu_to_le32 (a - l_key[36]);	out_blk[1] = cpu_to_le32 (b - l_key[37]);	out_blk[2] = cpu_to_le32 (c - l_key[38]);	out_blk[3] = cpu_to_le32 (d - l_key[39]);	return 0;}static intmars_decrypt (struct cipher_context *cx, const u8 *in, u8 *out, int size,	      int atomic){	u32 a, b, c, d, l, m, r;	const u32 *l_key = cx->keyinfo;	const u32 *in_blk = (const u32 *) in;	u32 *out_blk = (u32 *) out;	d = le32_to_cpu (in_blk[0]) + l_key[36];	c = le32_to_cpu (in_blk[1]) + l_key[37];	b = le32_to_cpu (in_blk[2]) + l_key[38];	a = le32_to_cpu (in_blk[3]) + l_key[39];	f_mix (a, b, c, d);	a += d;	f_mix (b, c, d, a);	b += c;	f_mix (c, d, a, b);	f_mix (d, a, b, c);	f_mix (a, b, c, d);	a += d;	f_mix (b, c, d, a);	b += c;	f_mix (c, d, a, b);	f_mix (d, a, b, c);	r_ktr (a, b, c, d, 34);	r_ktr (b, c, d, a, 32);	r_ktr (c, d, a, b, 30);	r_ktr (d, a, b, c, 28);	r_ktr (a, b, c, d, 26);	r_ktr (b, c, d, a, 24);	r_ktr (c, d, a, b, 22);	r_ktr (d, a, b, c, 20);	r_ktr (a, d, c, b, 18);	r_ktr (b, a, d, c, 16);	r_ktr (c, b, a, d, 14);	r_ktr (d, c, b, a, 12);	r_ktr (a, d, c, b, 10);	r_ktr (b, a, d, c, 8);	r_ktr (c, b, a, d, 6);	r_ktr (d, c, b, a, 4);	b_mix (a, b, c, d);	b_mix (b, c, d, a);	c -= b;	b_mix (c, d, a, b);	d -= a;	b_mix (d, a, b, c);	b_mix (a, b, c, d);	b_mix (b, c, d, a);	c -= b;	b_mix (c, d, a, b);	d -= a;	b_mix (d, a, b, c);	out_blk[0] = cpu_to_le32 (d - l_key[0]);	out_blk[1] = cpu_to_le32 (c - l_key[1]);	out_blk[2] = cpu_to_le32 (b - l_key[2]);	out_blk[3] = cpu_to_le32 (a - l_key[3]);	return 0;}#define CIPHER_ID                mars#define CIPHER_BLOCKSIZE         128#define CIPHER_KEY_SIZE_MASK     CIPHER_KEYSIZE_128 | CIPHER_KEYSIZE_192 | CIPHER_KEYSIZE_256#define CIPHER_KEY_SCHEDULE_SIZE (40*sizeof(u32))#include "gen-cipher.h"EXPORT_NO_SYMBOLS;/* eof */

⌨️ 快捷键说明

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