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

📄 cipher-serpent.c

📁 海思KEY驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
	GETKEY(ctx->xkey, r0, r1, r2, r3, 16);	S7(r0,r1,r2,r3,r4);	SETKEY(ctx->xkey, r2, r4, r3, r0, 16);	GETKEY(ctx->xkey, r0, r1, r2, r3, 20);	S6(r0,r1,r2,r3,r4);	SETKEY(ctx->xkey, r0, r1, r4, r2, 20);	GETKEY(ctx->xkey, r0, r1, r2, r3, 24);	S5(r0,r1,r2,r3,r4);	SETKEY(ctx->xkey, r1, r3, r0, r2, 24);	GETKEY(ctx->xkey, r0, r1, r2, r3, 28);	S4(r0,r1,r2,r3,r4);	SETKEY(ctx->xkey, r1, r4, r0, r3, 28);	GETKEY(ctx->xkey, r0, r1, r2, r3, 32);	S3(r0,r1,r2,r3,r4);	SETKEY(ctx->xkey, r1, r2, r3, r4, 32);	GETKEY(ctx->xkey, r0, r1, r2, r3, 36);	S2(r0,r1,r2,r3,r4);	SETKEY(ctx->xkey, r2, r3, r1, r4, 36); 	GETKEY(ctx->xkey, r0, r1, r2, r3, 40);	S1(r0,r1,r2,r3,r4);	SETKEY(ctx->xkey, r3, r1, r2, r0, 40);	GETKEY(ctx->xkey, r0, r1, r2, r3, 44);	S0(r0,r1,r2,r3,r4);	SETKEY(ctx->xkey, r1, r4, r2, r0, 44);	GETKEY(ctx->xkey, r0, r1, r2, r3, 48);	S7(r0,r1,r2,r3,r4);	SETKEY(ctx->xkey, r2, r4, r3, r0, 48);	GETKEY(ctx->xkey, r0, r1, r2, r3, 52);	S6(r0,r1,r2,r3,r4);	SETKEY(ctx->xkey, r0, r1, r4, r2, 52);	GETKEY(ctx->xkey, r0, r1, r2, r3, 56);	S5(r0,r1,r2,r3,r4);	SETKEY(ctx->xkey, r1, r3, r0, r2, 56);	GETKEY(ctx->xkey, r0, r1, r2, r3, 60);	S4(r0,r1,r2,r3,r4);	SETKEY(ctx->xkey, r1, r4, r0, r3, 60);	GETKEY(ctx->xkey, r0, r1, r2, r3, 64);	S3(r0,r1,r2,r3,r4);	SETKEY(ctx->xkey, r1, r2, r3, r4, 64);	GETKEY(ctx->xkey, r0, r1, r2, r3, 68);	S2(r0,r1,r2,r3,r4);	SETKEY(ctx->xkey, r2, r3, r1, r4, 68);	GETKEY(ctx->xkey, r0, r1, r2, r3, 72);	S1(r0,r1,r2,r3,r4);	SETKEY(ctx->xkey, r3, r1, r2, r0, 72);	GETKEY(ctx->xkey, r0, r1, r2, r3, 76);	S0(r0,r1,r2,r3,r4);	SETKEY(ctx->xkey, r1, r4, r2, r0, 76);	GETKEY(ctx->xkey, r0, r1, r2, r3, 80);	S7(r0,r1,r2,r3,r4);	SETKEY(ctx->xkey, r2, r4, r3, r0, 80);	GETKEY(ctx->xkey, r0, r1, r2, r3, 84);	S6(r0,r1,r2,r3,r4);	SETKEY(ctx->xkey, r0, r1, r4, r2, 84);	GETKEY(ctx->xkey, r0, r1, r2, r3, 88);	S5(r0,r1,r2,r3,r4);	SETKEY(ctx->xkey, r1, r3, r0, r2, 88);	GETKEY(ctx->xkey, r0, r1, r2, r3, 92);	S4(r0,r1,r2,r3,r4);	SETKEY(ctx->xkey, r1, r4, r0, r3, 92); 	GETKEY(ctx->xkey, r0, r1, r2, r3, 96);	S3(r0,r1,r2,r3,r4);	SETKEY(ctx->xkey, r1, r2, r3, r4, 96);	GETKEY(ctx->xkey, r0, r1, r2, r3, 100);	S2(r0,r1,r2,r3,r4);	SETKEY(ctx->xkey, r2, r3, r1, r4, 100);	GETKEY(ctx->xkey, r0, r1, r2, r3, 104);	S1(r0,r1,r2,r3,r4);	SETKEY(ctx->xkey, r3, r1, r2, r0, 104);	GETKEY(ctx->xkey, r0, r1, r2, r3, 108);	S0(r0,r1,r2,r3,r4);	SETKEY(ctx->xkey, r1, r4, r2, r0, 108);	GETKEY(ctx->xkey, r0, r1, r2, r3, 112);	S7(r0,r1,r2,r3,r4);	SETKEY(ctx->xkey, r2, r4, r3, r0, 112);	GETKEY(ctx->xkey, r0, r1, r2, r3, 116);	S6(r0,r1,r2,r3,r4);	SETKEY(ctx->xkey, r0, r1, r4, r2, 116);	GETKEY(ctx->xkey, r0, r1, r2, r3, 120);	S5(r0,r1,r2,r3,r4);	SETKEY(ctx->xkey, r1, r3, r0, r2, 120);	GETKEY(ctx->xkey, r0, r1, r2, r3, 124);	S4(r0,r1,r2,r3,r4);	SETKEY(ctx->xkey, r1, r4, r0, r3, 124);	GETKEY(ctx->xkey, r0, r1, r2, r3, 128);	S3(r0,r1,r2,r3,r4);	SETKEY(ctx->xkey, r1, r2, r3, r4, 128);	return 0;}/* Encryption and decryption functions. The rounds are fully inlined.  * The sboxes alters the bit order of the output, and the altered * bit ordrer is used progressivly. */static intserpent_encrypt(struct cipher_context *cx, const u8 *in, 		u8 *out, int size, int atomic){	struct serpent_ctx *ctx;	const u32 *in_blk = (u32 *) in;	u32 *out_blk = (u32 *) out;	u32  r0,r1,r2,r3,r4;	ctx = (struct serpent_ctx *)cx->keyinfo;	r0 = io_swap(in_blk[3]);	r1 = io_swap(in_blk[2]); 	r2 = io_swap(in_blk[1]);	r3 = io_swap(in_blk[0]);	/* round 1 */	KEYMIX(ctx->xkey, r0,r1,r2,r3,r4,0);	S0(r0,r1,r2,r3,r4);	LINTRANS(r1,r4,r2,r0,r3);	/* round 2 */	KEYMIX(ctx->xkey, r1,r4,r2,r0,r3,4);	S1(r1,r4,r2,r0,r3);	LINTRANS(r0,r4,r2,r1,r3);	/* round 3 */	KEYMIX(ctx->xkey, r0,r4,r2,r1,r3,8);	S2(r0,r4,r2,r1,r3);	LINTRANS(r2,r1,r4,r3,r0);	/* round 4 */	KEYMIX(ctx->xkey, r2,r1,r4,r3,r0,12);	S3(r2,r1,r4,r3,r0);	LINTRANS(r1,r4,r3,r0,r2);	/* round 5 */	KEYMIX(ctx->xkey, r1,r4,r3,r0,r2,16);	S4(r1,r4,r3,r0,r2);	LINTRANS(r4,r2,r1,r0,r3);	/* round 6 */	KEYMIX(ctx->xkey, r4,r2,r1,r0,r3,20);	S5(r4,r2,r1,r0,r3);	LINTRANS(r2,r0,r4,r1,r3);	/* round 7 */	KEYMIX(ctx->xkey, r2,r0,r4,r1,r3,24);	S6(r2,r0,r4,r1,r3);	LINTRANS(r2,r0,r3,r4,r1);	/* round 8 */	KEYMIX(ctx->xkey, r2,r0,r3,r4,r1,28);	S7(r2,r0,r3,r4,r1);	LINTRANS(r3,r1,r4,r2,r0);	/* round 9 */	KEYMIX(ctx->xkey, r3,r1,r4,r2,r0,32);	S0(r3,r1,r4,r2,r0);	LINTRANS(r1,r0,r4,r3,r2);	/* round 10 */	KEYMIX(ctx->xkey, r1,r0,r4,r3,r2,36);	S1(r1,r0,r4,r3,r2);	LINTRANS(r3,r0,r4,r1,r2);	/* round 11 */	KEYMIX(ctx->xkey, r3,r0,r4,r1,r2,40);	S2(r3,r0,r4,r1,r2);	LINTRANS(r4,r1,r0,r2,r3);	/* round 12 */	KEYMIX(ctx->xkey, r4,r1,r0,r2,r3,44);	S3(r4,r1,r0,r2,r3);	LINTRANS(r1,r0,r2,r3,r4);	/* round 13 */	KEYMIX(ctx->xkey, r1,r0,r2,r3,r4,48);	S4(r1,r0,r2,r3,r4);	LINTRANS(r0,r4,r1,r3,r2);	/* round 14 */	KEYMIX(ctx->xkey, r0,r4,r1,r3,r2,52);	S5(r0,r4,r1,r3,r2);	LINTRANS(r4,r3,r0,r1,r2);	/* round 15 */	KEYMIX(ctx->xkey, r4,r3,r0,r1,r2,56);	S6(r4,r3,r0,r1,r2);	LINTRANS(r4,r3,r2,r0,r1);	/* round 16 */	KEYMIX(ctx->xkey, r4,r3,r2,r0,r1,60);	S7(r4,r3,r2,r0,r1);	LINTRANS(r2,r1,r0,r4,r3);	/* round 17 */	KEYMIX(ctx->xkey, r2,r1,r0,r4,r3,64);	S0(r2,r1,r0,r4,r3);	LINTRANS(r1,r3,r0,r2,r4);	/* round 18 */	KEYMIX(ctx->xkey, r1,r3,r0,r2,r4,68);	S1(r1,r3,r0,r2,r4);	LINTRANS(r2,r3,r0,r1,r4);	/* round 19 */	KEYMIX(ctx->xkey, r2,r3,r0,r1,r4,72);	S2(r2,r3,r0,r1,r4);	LINTRANS(r0,r1,r3,r4,r2);	/* round 20 */	KEYMIX(ctx->xkey, r0,r1,r3,r4,r2,76);	S3(r0,r1,r3,r4,r2);	LINTRANS(r1,r3,r4,r2,r0);	/* round 21 */	KEYMIX(ctx->xkey, r1,r3,r4,r2,r0,80);	S4(r1,r3,r4,r2,r0); 	LINTRANS(r3,r0,r1,r2,r4);	/* round 22 */	KEYMIX(ctx->xkey, r3,r0,r1,r2,r4,84);	S5(r3,r0,r1,r2,r4);	LINTRANS(r0,r2,r3,r1,r4);	/* round 23 */	KEYMIX(ctx->xkey, r0,r2,r3,r1,r4,88);	S6(r0,r2,r3,r1,r4);	LINTRANS(r0,r2,r4,r3,r1);	/* round 24 */	KEYMIX(ctx->xkey, r0,r2,r4,r3,r1,92);	S7(r0,r2,r4,r3,r1);	LINTRANS(r4,r1,r3,r0,r2);	/* round 25 */	KEYMIX(ctx->xkey, r4,r1,r3,r0,r2,96);	S0(r4,r1,r3,r0,r2);	LINTRANS(r1,r2,r3,r4,r0);	/* round 26 */	KEYMIX(ctx->xkey, r1,r2,r3,r4,r0,100);	S1(r1,r2,r3,r4,r0);	LINTRANS(r4,r2,r3,r1,r0);	/* round 27 */	KEYMIX(ctx->xkey, r4,r2,r3,r1,r0,104);	S2(r4,r2,r3,r1,r0);	LINTRANS(r3,r1,r2,r0,r4);	/* round 28 */	KEYMIX(ctx->xkey, r3,r1,r2,r0,r4,108);	S3(r3,r1,r2,r0,r4);	LINTRANS(r1,r2,r0,r4,r3);	/* round 29 */	KEYMIX(ctx->xkey, r1,r2,r0,r4,r3,112);	S4(r1,r2,r0,r4,r3); 	LINTRANS(r2,r3,r1,r4,r0);	/* round 30 */	KEYMIX(ctx->xkey, r2,r3,r1,r4,r0,116);	S5(r2,r3,r1,r4,r0);	LINTRANS(r3,r4,r2,r1,r0);	/* round 31 */	KEYMIX(ctx->xkey, r3,r4,r2,r1,r0,120);	S6(r3,r4,r2,r1,r0); 	LINTRANS(r3,r4,r0,r2,r1);	/* round 32 */	KEYMIX(ctx->xkey, r3,r4,r0,r2,r1,124);	S7(r3,r4,r0,r2,r1);	KEYMIX(ctx->xkey, r0,r1,r2,r3,r4,128);        out_blk[3] = io_swap(r0);	out_blk[2] = io_swap(r1);	out_blk[1] = io_swap(r2);	out_blk[0] = io_swap(r3);	return 0;}static intserpent_decrypt(struct cipher_context *cx, const u8 *in,		u8 *out, int size, int atomic){	struct serpent_ctx *ctx;	const u32 *in_blk = (const u32 *)in;	u32 *out_blk = (u32 *)out;	u32  r0,r1,r2,r3,r4;	ctx = (struct serpent_ctx *)cx->keyinfo;	r0 = io_swap(in_blk[3]);	r1 = io_swap(in_blk[2]);	r2 = io_swap(in_blk[1]);	r3 = io_swap(in_blk[0]);	/* round 1 */	KEYMIX(ctx->xkey, r0,r1,r2,r3,r4,128);	I7(r0,r1,r2,r3,r4);	KEYMIX(ctx->xkey, r3,r0,r1,r4,r2,124);	/* round 2 */	ILINTRANS(r3,r0,r1,r4,r2);	I6(r3,r0,r1,r4,r2);	KEYMIX(ctx->xkey, r0,r1,r2,r4,r3,120);	/* round 3 */	ILINTRANS(r0,r1,r2,r4,r3);	I5(r0,r1,r2,r4,r3);	KEYMIX(ctx->xkey, r1,r3,r4,r2,r0,116);	/* round 4 */	ILINTRANS(r1,r3,r4,r2,r0);	I4(r1,r3,r4,r2,r0);	KEYMIX(ctx->xkey, r1,r2,r4,r0,r3,112);	/* round 5 */	ILINTRANS(r1,r2,r4,r0,r3);	I3(r1,r2,r4,r0,r3);	KEYMIX(ctx->xkey, r4,r2,r0,r1,r3,108);	/* round 6 */	ILINTRANS(r4,r2,r0,r1,r3);	I2(r4,r2,r0,r1,r3);	KEYMIX(ctx->xkey, r2,r3,r0,r1,r4,104);	/* round 7 */	ILINTRANS(r2,r3,r0,r1,r4);	I1(r2,r3,r0,r1,r4);	KEYMIX(ctx->xkey, r4,r2,r1,r0,r3,100);	/* round 8 */	ILINTRANS(r4,r2,r1,r0,r3);	I0(r4,r2,r1,r0,r3);	KEYMIX(ctx->xkey, r4,r3,r2,r0,r1,96);	/* round 9 */	ILINTRANS(r4,r3,r2,r0,r1);	I7(r4,r3,r2,r0,r1);	KEYMIX(ctx->xkey, r0,r4,r3,r1,r2,92);	/* round 10 */	ILINTRANS(r0,r4,r3,r1,r2);	I6(r0,r4,r3,r1,r2);	KEYMIX(ctx->xkey, r4,r3,r2,r1,r0,88);	/* round 11 */	ILINTRANS(r4,r3,r2,r1,r0);	I5(r4,r3,r2,r1,r0);	KEYMIX(ctx->xkey, r3,r0,r1,r2,r4,84);	/* round 12 */	ILINTRANS(r3,r0,r1,r2,r4);	I4(r3,r0,r1,r2,r4);	KEYMIX(ctx->xkey, r3,r2,r1,r4,r0,80);	/* round 13 */	ILINTRANS(r3,r2,r1,r4,r0);	I3(r3,r2,r1,r4,r0);	KEYMIX(ctx->xkey, r1,r2,r4,r3,r0,76);	/* round 14 */	ILINTRANS(r1,r2,r4,r3,r0);	I2(r1,r2,r4,r3,r0);	KEYMIX(ctx->xkey, r2,r0,r4,r3,r1,72);	/* round 15 */	ILINTRANS(r2,r0,r4,r3,r1);	I1(r2,r0,r4,r3,r1);	KEYMIX(ctx->xkey, r1,r2,r3,r4,r0,68);	/* round 16 */	ILINTRANS(r1,r2,r3,r4,r0);	I0(r1,r2,r3,r4,r0);	KEYMIX(ctx->xkey, r1,r0,r2,r4,r3,64);	/* round 17 */	ILINTRANS(r1,r0,r2,r4,r3);	I7(r1,r0,r2,r4,r3);	KEYMIX(ctx->xkey, r4,r1,r0,r3,r2,60);	/* round 18 */	ILINTRANS(r4,r1,r0,r3,r2);	I6(r4,r1,r0,r3,r2);	KEYMIX(ctx->xkey, r1,r0,r2,r3,r4,56);	/* round 19 */	ILINTRANS(r1,r0,r2,r3,r4);	I5(r1,r0,r2,r3,r4);	KEYMIX(ctx->xkey, r0,r4,r3,r2,r1,52);	/* round 20 */	ILINTRANS(r0,r4,r3,r2,r1);	I4(r0,r4,r3,r2,r1);	KEYMIX(ctx->xkey, r0,r2,r3,r1,r4,48);	/* round 21 */	ILINTRANS(r0,r2,r3,r1,r4);	I3(r0,r2,r3,r1,r4);	KEYMIX(ctx->xkey, r3,r2,r1,r0,r4,44);	/* round 22 */	ILINTRANS(r3,r2,r1,r0,r4);	I2(r3,r2,r1,r0,r4);	KEYMIX(ctx->xkey, r2,r4,r1,r0,r3,40);	/* round 23 */	ILINTRANS(r2,r4,r1,r0,r3);	I1(r2,r4,r1,r0,r3);	KEYMIX(ctx->xkey, r3,r2,r0,r1,r4,36);	/* round 24 */	ILINTRANS(r3,r2,r0,r1,r4);	I0(r3,r2,r0,r1,r4);	KEYMIX(ctx->xkey, r3,r4,r2,r1,r0,32);	/* round 25 */	ILINTRANS(r3,r4,r2,r1,r0);	I7(r3,r4,r2,r1,r0);	KEYMIX(ctx->xkey, r1,r3,r4,r0,r2,28);	/* round 26 */	ILINTRANS(r1,r3,r4,r0,r2);	I6(r1,r3,r4,r0,r2);	KEYMIX(ctx->xkey, r3,r4,r2,r0,r1,24);	/* round 27 */	ILINTRANS(r3,r4,r2,r0,r1);	I5(r3,r4,r2,r0,r1);	KEYMIX(ctx->xkey, r4,r1,r0,r2,r3,20);	/* round 28 */	ILINTRANS(r4,r1,r0,r2,r3);	I4(r4,r1,r0,r2,r3);	KEYMIX(ctx->xkey, r4,r2,r0,r3,r1,16);	/* round 29 */	ILINTRANS(r4,r2,r0,r3,r1);	I3(r4,r2,r0,r3,r1);	KEYMIX(ctx->xkey, r0,r2,r3,r4,r1,12);	/* round 30 */	ILINTRANS(r0,r2,r3,r4,r1);	I2(r0,r2,r3,r4,r1);	KEYMIX(ctx->xkey, r2,r1,r3,r4,r0,8);	/* round 31 */	ILINTRANS(r2,r1,r3,r4,r0);	I1(r2,r1,r3,r4,r0);	KEYMIX(ctx->xkey, r0,r2,r4,r3,r1,4);	/* round 32 */	ILINTRANS(r0,r2,r4,r3,r1);	I0(r0,r2,r4,r3,r1);	KEYMIX(ctx->xkey, r0,r1,r2,r3,r4,0);		out_blk[3] = io_swap(r0);	out_blk[2] = io_swap(r1); 	out_blk[1] = io_swap(r2);	out_blk[0] = io_swap(r3);	return 0;}#define CIPHER_ID                serpent#define CIPHER_BLOCKSIZE         128#define CIPHER_KEY_SIZE_MASK     CIPHER_KEYSIZE_128 | CIPHER_KEYSIZE_192 | \                                 CIPHER_KEYSIZE_256#define CIPHER_KEY_SCHEDULE_SIZE (sizeof(struct serpent_ctx))#include "gen-cipher.h"EXPORT_NO_SYMBOLS;/* eof */

⌨️ 快捷键说明

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