📄 cipher-serpent.c
字号:
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 + -