// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Cryptographic API.
*
* SEED Cipher Algorithm.
*
* Documentation of SEED can be found in RFC 4269.
* Copyright (C) 2007 Korea Information Security Agency (KISA).
*/
#include <crypto/algapi.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/types.h>
#include <linux/errno.h>
#include <linux/unaligned.h>
#define SEED_NUM_KCONSTANTS 16
#define SEED_KEY_SIZE 16
#define SEED_BLOCK_SIZE 16
#define SEED_KEYSCHED_LEN 32
/*
* #define byte(x, nr) ((unsigned char)((x) >> (nr*8)))
*/
static inline u8
byte(const u32 x, const unsigned n)
{
return x >> (n << 3 );
}
struct seed_ctx {
u32 keysched[SEED_KEYSCHED_LEN];
};
static const u32 SS0[256 ] = {
0 x2989a1a8, 0 x05858184, 0 x16c6d2d4, 0 x13c3d3d0,
0 x14445054, 0 x1d0d111c, 0 x2c8ca0ac, 0 x25052124,
0 x1d4d515c, 0 x03434340, 0 x18081018, 0 x1e0e121c,
0 x11415150, 0 x3cccf0fc, 0 x0acac2c8, 0 x23436360,
0 x28082028, 0 x04444044, 0 x20002020, 0 x1d8d919c,
0 x20c0e0e0, 0 x22c2e2e0, 0 x08c8c0c8, 0 x17071314,
0 x2585a1a4, 0 x0f8f838c, 0 x03030300, 0 x3b4b7378,
0 x3b8bb3b8, 0 x13031310, 0 x12c2d2d0, 0 x2ecee2ec,
0 x30407070, 0 x0c8c808c, 0 x3f0f333c, 0 x2888a0a8,
0 x32023230, 0 x1dcdd1dc, 0 x36c6f2f4, 0 x34447074,
0 x2ccce0ec, 0 x15859194, 0 x0b0b0308, 0 x17475354,
0 x1c4c505c, 0 x1b4b5358, 0 x3d8db1bc, 0 x01010100,
0 x24042024, 0 x1c0c101c, 0 x33437370, 0 x18889098,
0 x10001010, 0 x0cccc0cc, 0 x32c2f2f0, 0 x19c9d1d8,
0 x2c0c202c, 0 x27c7e3e4, 0 x32427270, 0 x03838380,
0 x1b8b9398, 0 x11c1d1d0, 0 x06868284, 0 x09c9c1c8,
0 x20406060, 0 x10405050, 0 x2383a3a0, 0 x2bcbe3e8,
0 x0d0d010c, 0 x3686b2b4, 0 x1e8e929c, 0 x0f4f434c,
0 x3787b3b4, 0 x1a4a5258, 0 x06c6c2c4, 0 x38487078,
0 x2686a2a4, 0 x12021210, 0 x2f8fa3ac, 0 x15c5d1d4,
0 x21416160, 0 x03c3c3c0, 0 x3484b0b4, 0 x01414140,
0 x12425250, 0 x3d4d717c, 0 x0d8d818c, 0 x08080008,
0 x1f0f131c, 0 x19899198, 0 x00000000, 0 x19091118,
0 x04040004, 0 x13435350, 0 x37c7f3f4, 0 x21c1e1e0,
0 x3dcdf1fc, 0 x36467274, 0 x2f0f232c, 0 x27072324,
0 x3080b0b0, 0 x0b8b8388, 0 x0e0e020c, 0 x2b8ba3a8,
0 x2282a2a0, 0 x2e4e626c, 0 x13839390, 0 x0d4d414c,
0 x29496168, 0 x3c4c707c, 0 x09090108, 0 x0a0a0208,
0 x3f8fb3bc, 0 x2fcfe3ec, 0 x33c3f3f0, 0 x05c5c1c4,
0 x07878384, 0 x14041014, 0 x3ecef2fc, 0 x24446064,
0 x1eced2dc, 0 x2e0e222c, 0 x0b4b4348, 0 x1a0a1218,
0 x06060204, 0 x21012120, 0 x2b4b6368, 0 x26466264,
0 x02020200, 0 x35c5f1f4, 0 x12829290, 0 x0a8a8288,
0 x0c0c000c, 0 x3383b3b0, 0 x3e4e727c, 0 x10c0d0d0,
0 x3a4a7278, 0 x07474344, 0 x16869294, 0 x25c5e1e4,
0 x26062224, 0 x00808080, 0 x2d8da1ac, 0 x1fcfd3dc,
0 x2181a1a0, 0 x30003030, 0 x37073334, 0 x2e8ea2ac,
0 x36063234, 0 x15051114, 0 x22022220, 0 x38083038,
0 x34c4f0f4, 0 x2787a3a4, 0 x05454144, 0 x0c4c404c,
0 x01818180, 0 x29c9e1e8, 0 x04848084, 0 x17879394,
0 x35053134, 0 x0bcbc3c8, 0 x0ecec2cc, 0 x3c0c303c,
0 x31417170, 0 x11011110, 0 x07c7c3c4, 0 x09898188,
0 x35457174, 0 x3bcbf3f8, 0 x1acad2d8, 0 x38c8f0f8,
0 x14849094, 0 x19495158, 0 x02828280, 0 x04c4c0c4,
0 x3fcff3fc, 0 x09494148, 0 x39093138, 0 x27476364,
0 x00c0c0c0, 0 x0fcfc3cc, 0 x17c7d3d4, 0 x3888b0b8,
0 x0f0f030c, 0 x0e8e828c, 0 x02424240, 0 x23032320,
0 x11819190, 0 x2c4c606c, 0 x1bcbd3d8, 0 x2484a0a4,
0 x34043034, 0 x31c1f1f0, 0 x08484048, 0 x02c2c2c0,
0 x2f4f636c, 0 x3d0d313c, 0 x2d0d212c, 0 x00404040,
0 x3e8eb2bc, 0 x3e0e323c, 0 x3c8cb0bc, 0 x01c1c1c0,
0 x2a8aa2a8, 0 x3a8ab2b8, 0 x0e4e424c, 0 x15455154,
0 x3b0b3338, 0 x1cccd0dc, 0 x28486068, 0 x3f4f737c,
0 x1c8c909c, 0 x18c8d0d8, 0 x0a4a4248, 0 x16465254,
0 x37477374, 0 x2080a0a0, 0 x2dcde1ec, 0 x06464244,
0 x3585b1b4, 0 x2b0b2328, 0 x25456164, 0 x3acaf2f8,
0 x23c3e3e0, 0 x3989b1b8, 0 x3181b1b0, 0 x1f8f939c,
0 x1e4e525c, 0 x39c9f1f8, 0 x26c6e2e4, 0 x3282b2b0,
0 x31013130, 0 x2acae2e8, 0 x2d4d616c, 0 x1f4f535c,
0 x24c4e0e4, 0 x30c0f0f0, 0 x0dcdc1cc, 0 x08888088,
0 x16061214, 0 x3a0a3238, 0 x18485058, 0 x14c4d0d4,
0 x22426260, 0 x29092128, 0 x07070304, 0 x33033330,
0 x28c8e0e8, 0 x1b0b1318, 0 x05050104, 0 x39497178,
0 x10809090, 0 x2a4a6268, 0 x2a0a2228, 0 x1a8a9298,
};
static const u32 SS1[256 ] = {
0 x38380830, 0 xe828c8e0, 0 x2c2d0d21, 0 xa42686a2,
0 xcc0fcfc3, 0 xdc1eced2, 0 xb03383b3, 0 xb83888b0,
0 xac2f8fa3, 0 x60204060, 0 x54154551, 0 xc407c7c3,
0 x44044440, 0 x6c2f4f63, 0 x682b4b63, 0 x581b4b53,
0 xc003c3c3, 0 x60224262, 0 x30330333, 0 xb43585b1,
0 x28290921, 0 xa02080a0, 0 xe022c2e2, 0 xa42787a3,
0 xd013c3d3, 0 x90118191, 0 x10110111, 0 x04060602,
0 x1c1c0c10, 0 xbc3c8cb0, 0 x34360632, 0 x480b4b43,
0 xec2fcfe3, 0 x88088880, 0 x6c2c4c60, 0 xa82888a0,
0 x14170713, 0 xc404c4c0, 0 x14160612, 0 xf434c4f0,
0 xc002c2c2, 0 x44054541, 0 xe021c1e1, 0 xd416c6d2,
0 x3c3f0f33, 0 x3c3d0d31, 0 x8c0e8e82, 0 x98188890,
0 x28280820, 0 x4c0e4e42, 0 xf436c6f2, 0 x3c3e0e32,
0 xa42585a1, 0 xf839c9f1, 0 x0c0d0d01, 0 xdc1fcfd3,
0 xd818c8d0, 0 x282b0b23, 0 x64264662, 0 x783a4a72,
0 x24270723, 0 x2c2f0f23, 0 xf031c1f1, 0 x70324272,
0 x40024242, 0 xd414c4d0, 0 x40014141, 0 xc000c0c0,
0 x70334373, 0 x64274763, 0 xac2c8ca0, 0 x880b8b83,
0 xf437c7f3, 0 xac2d8da1, 0 x80008080, 0 x1c1f0f13,
0 xc80acac2, 0 x2c2c0c20, 0 xa82a8aa2, 0 x34340430,
0 xd012c2d2, 0 x080b0b03, 0 xec2ecee2, 0 xe829c9e1,
0 x5c1d4d51, 0 x94148490, 0 x18180810, 0 xf838c8f0,
0 x54174753, 0 xac2e8ea2, 0 x08080800, 0 xc405c5c1,
0 x10130313, 0 xcc0dcdc1, 0 x84068682, 0 xb83989b1,
0 xfc3fcff3, 0 x7c3d4d71, 0 xc001c1c1, 0 x30310131,
0 xf435c5f1, 0 x880a8a82, 0 x682a4a62, 0 xb03181b1,
0 xd011c1d1, 0 x20200020, 0 xd417c7d3, 0 x00020202,
0 x20220222, 0 x04040400, 0 x68284860, 0 x70314171,
0 x04070703, 0 xd81bcbd3, 0 x9c1d8d91, 0 x98198991,
0 x60214161, 0 xbc3e8eb2, 0 xe426c6e2, 0 x58194951,
0 xdc1dcdd1, 0 x50114151, 0 x90108090, 0 xdc1cccd0,
0 x981a8a92, 0 xa02383a3, 0 xa82b8ba3, 0 xd010c0d0,
0 x80018181, 0 x0c0f0f03, 0 x44074743, 0 x181a0a12,
0 xe023c3e3, 0 xec2ccce0, 0 x8c0d8d81, 0 xbc3f8fb3,
0 x94168692, 0 x783b4b73, 0 x5c1c4c50, 0 xa02282a2,
0 xa02181a1, 0 x60234363, 0 x20230323, 0 x4c0d4d41,
0 xc808c8c0, 0 x9c1e8e92, 0 x9c1c8c90, 0 x383a0a32,
0 x0c0c0c00, 0 x2c2e0e22, 0 xb83a8ab2, 0 x6c2e4e62,
0 x9c1f8f93, 0 x581a4a52, 0 xf032c2f2, 0 x90128292,
0 xf033c3f3, 0 x48094941, 0 x78384870, 0 xcc0cccc0,
0 x14150511, 0 xf83bcbf3, 0 x70304070, 0 x74354571,
0 x7c3f4f73, 0 x34350531, 0 x10100010, 0 x00030303,
0 x64244460, 0 x6c2d4d61, 0 xc406c6c2, 0 x74344470,
0 xd415c5d1, 0 xb43484b0, 0 xe82acae2, 0 x08090901,
0 x74364672, 0 x18190911, 0 xfc3ecef2, 0 x40004040,
0 x10120212, 0 xe020c0e0, 0 xbc3d8db1, 0 x04050501,
0 xf83acaf2, 0 x00010101, 0 xf030c0f0, 0 x282a0a22,
0 x5c1e4e52, 0 xa82989a1, 0 x54164652, 0 x40034343,
0 x84058581, 0 x14140410, 0 x88098981, 0 x981b8b93,
0 xb03080b0, 0 xe425c5e1, 0 x48084840, 0 x78394971,
0 x94178793, 0 xfc3cccf0, 0 x1c1e0e12, 0 x80028282,
0 x20210121, 0 x8c0c8c80, 0 x181b0b13, 0 x5c1f4f53,
0 x74374773, 0 x54144450, 0 xb03282b2, 0 x1c1d0d11,
0 x24250521, 0 x4c0f4f43, 0 x00000000, 0 x44064642,
0 xec2dcde1, 0 x58184850, 0 x50124252, 0 xe82bcbe3,
0 x7c3e4e72, 0 xd81acad2, 0 xc809c9c1, 0 xfc3dcdf1,
0 x30300030, 0 x94158591, 0 x64254561, 0 x3c3c0c30,
0 xb43686b2, 0 xe424c4e0, 0 xb83b8bb3, 0 x7c3c4c70,
0 x0c0e0e02, 0 x50104050, 0 x38390931, 0 x24260622,
0 x30320232, 0 x84048480, 0 x68294961, 0 x90138393,
0 x34370733, 0 xe427c7e3, 0 x24240420, 0 xa42484a0,
0 xc80bcbc3, 0 x50134353, 0 x080a0a02, 0 x84078783,
0 xd819c9d1, 0 x4c0c4c40, 0 x80038383, 0 x8c0f8f83,
0 xcc0ecec2, 0 x383b0b33, 0 x480a4a42, 0 xb43787b3,
};
static const u32 SS2[256 ] = {
0 xa1a82989, 0 x81840585, 0 xd2d416c6, 0 xd3d013c3,
0 x50541444, 0 x111c1d0d, 0 xa0ac2c8c, 0 x21242505,
0 x515c1d4d, 0 x43400343, 0 x10181808, 0 x121c1e0e,
0 x51501141, 0 xf0fc3ccc, 0 xc2c80aca, 0 x63602343,
0 x20282808, 0 x40440444, 0 x20202000, 0 x919c1d8d,
0 xe0e020c0, 0 xe2e022c2, 0 xc0c808c8, 0 x13141707,
0 xa1a42585, 0 x838c0f8f, 0 x03000303, 0 x73783b4b,
0 xb3b83b8b, 0 x13101303, 0 xd2d012c2, 0 xe2ec2ece,
0 x70703040, 0 x808c0c8c, 0 x333c3f0f, 0 xa0a82888,
0 x32303202, 0 xd1dc1dcd, 0 xf2f436c6, 0 x70743444,
0 xe0ec2ccc, 0 x91941585, 0 x03080b0b, 0 x53541747,
0 x505c1c4c, 0 x53581b4b, 0 xb1bc3d8d, 0 x01000101,
0 x20242404, 0 x101c1c0c, 0 x73703343, 0 x90981888,
0 x10101000, 0 xc0cc0ccc, 0 xf2f032c2, 0 xd1d819c9,
0 x202c2c0c, 0 xe3e427c7, 0 x72703242, 0 x83800383,
0 x93981b8b, 0 xd1d011c1, 0 x82840686, 0 xc1c809c9,
0 x60602040, 0 x50501040, 0 xa3a02383, 0 xe3e82bcb,
0 x010c0d0d, 0 xb2b43686, 0 x929c1e8e, 0 x434c0f4f,
0 xb3b43787, 0 x52581a4a, 0 xc2c406c6, 0 x70783848,
0 xa2a42686, 0 x12101202, 0 xa3ac2f8f, 0 xd1d415c5,
0 x61602141, 0 xc3c003c3, 0 xb0b43484, 0 x41400141,
0 x52501242, 0 x717c3d4d, 0 x818c0d8d, 0 x00080808,
0 x131c1f0f, 0 x91981989, 0 x00000000, 0 x11181909,
0 x00040404, 0 x53501343, 0 xf3f437c7, 0 xe1e021c1,
0 xf1fc3dcd, 0 x72743646, 0 x232c2f0f, 0 x23242707,
0 xb0b03080, 0 x83880b8b, 0 x020c0e0e, 0 xa3a82b8b,
0 xa2a02282, 0 x626c2e4e, 0 x93901383, 0 x414c0d4d,
0 x61682949, 0 x707c3c4c, 0 x01080909, 0 x02080a0a,
0 xb3bc3f8f, 0 xe3ec2fcf, 0 xf3f033c3, 0 xc1c405c5,
0 x83840787, 0 x10141404, 0 xf2fc3ece, 0 x60642444,
0 xd2dc1ece, 0 x222c2e0e, 0 x43480b4b, 0 x12181a0a,
0 x02040606, 0 x21202101, 0 x63682b4b, 0 x62642646,
0 x02000202, 0 xf1f435c5, 0 x92901282, 0 x82880a8a,
0 x000c0c0c, 0 xb3b03383, 0 x727c3e4e, 0 xd0d010c0,
0 x72783a4a, 0 x43440747, 0 x92941686, 0 xe1e425c5,
0 x22242606, 0 x80800080, 0 xa1ac2d8d, 0 xd3dc1fcf,
0 xa1a02181, 0 x30303000, 0 x33343707, 0 xa2ac2e8e,
0 x32343606, 0 x11141505, 0 x22202202, 0 x30383808,
0 xf0f434c4, 0 xa3a42787, 0 x41440545, 0 x404c0c4c,
0 x81800181, 0 xe1e829c9, 0 x80840484, 0 x93941787,
0 x31343505, 0 xc3c80bcb, 0 xc2cc0ece, 0 x303c3c0c,
0 x71703141, 0 x11101101, 0 xc3c407c7, 0 x81880989,
0 x71743545, 0 xf3f83bcb, 0 xd2d81aca, 0 xf0f838c8,
0 x90941484, 0 x51581949, 0 x82800282, 0 xc0c404c4,
0 xf3fc3fcf, 0 x41480949, 0 x31383909, 0 x63642747,
0 xc0c000c0, 0 xc3cc0fcf, 0 xd3d417c7, 0 xb0b83888,
0 x030c0f0f, 0 x828c0e8e, 0 x42400242, 0 x23202303,
0 x91901181, 0 x606c2c4c, 0 xd3d81bcb, 0 xa0a42484,
0 x30343404, 0 xf1f031c1, 0 x40480848, 0 xc2c002c2,
0 x636c2f4f, 0 x313c3d0d, 0 x212c2d0d, 0 x40400040,
0 xb2bc3e8e, 0 x323c3e0e, 0 xb0bc3c8c, 0 xc1c001c1,
0 xa2a82a8a, 0 xb2b83a8a, 0 x424c0e4e, 0 x51541545,
0 x33383b0b, 0 xd0dc1ccc, 0 x60682848, 0 x737c3f4f,
0 x909c1c8c, 0 xd0d818c8, 0 x42480a4a, 0 x52541646,
0 x73743747, 0 xa0a02080, 0 xe1ec2dcd, 0 x42440646,
0 xb1b43585, 0 x23282b0b, 0 x61642545, 0 xf2f83aca,
0 xe3e023c3, 0 xb1b83989, 0 xb1b03181, 0 x939c1f8f,
0 x525c1e4e, 0 xf1f839c9, 0 xe2e426c6, 0 xb2b03282,
0 x31303101, 0 xe2e82aca, 0 x616c2d4d, 0 x535c1f4f,
0 xe0e424c4, 0 xf0f030c0, 0 xc1cc0dcd, 0 x80880888,
0 x12141606, 0 x32383a0a, 0 x50581848, 0 xd0d414c4,
0 x62602242, 0 x21282909, 0 x03040707, 0 x33303303,
0 xe0e828c8, 0 x13181b0b, 0 x01040505, 0 x71783949,
0 x90901080, 0 x62682a4a, 0 x22282a0a, 0 x92981a8a,
};
static const u32 SS3[256 ] = {
0 x08303838, 0 xc8e0e828, 0 x0d212c2d, 0 x86a2a426,
0 xcfc3cc0f, 0 xced2dc1e, 0 x83b3b033, 0 x88b0b838,
0 x8fa3ac2f, 0 x40606020, 0 x45515415, 0 xc7c3c407,
0 x44404404, 0 x4f636c2f, 0 x4b63682b, 0 x4b53581b,
0 xc3c3c003, 0 x42626022, 0 x03333033, 0 x85b1b435,
0 x09212829, 0 x80a0a020, 0 xc2e2e022, 0 x87a3a427,
0 xc3d3d013, 0 x81919011, 0 x01111011, 0 x06020406,
0 x0c101c1c, 0 x8cb0bc3c, 0 x06323436, 0 x4b43480b,
0 xcfe3ec2f, 0 x88808808, 0 x4c606c2c, 0 x88a0a828,
0 x07131417, 0 xc4c0c404, 0 x06121416, 0 xc4f0f434,
0 xc2c2c002, 0 x45414405, 0 xc1e1e021, 0 xc6d2d416,
0 x0f333c3f, 0 x0d313c3d, 0 x8e828c0e, 0 x88909818,
0 x08202828, 0 x4e424c0e, 0 xc6f2f436, 0 x0e323c3e,
0 x85a1a425, 0 xc9f1f839, 0 x0d010c0d, 0 xcfd3dc1f,
0 xc8d0d818, 0 x0b23282b, 0 x46626426, 0 x4a72783a,
0 x07232427, 0 x0f232c2f, 0 xc1f1f031, 0 x42727032,
0 x42424002, 0 xc4d0d414, 0 x41414001, 0 xc0c0c000,
0 x43737033, 0 x47636427, 0 x8ca0ac2c, 0 x8b83880b,
0 xc7f3f437, 0 x8da1ac2d, 0 x80808000, 0 x0f131c1f,
0 xcac2c80a, 0 x0c202c2c, 0 x8aa2a82a, 0 x04303434,
0 xc2d2d012, 0 x0b03080b, 0 xcee2ec2e, 0 xc9e1e829,
0 x4d515c1d, 0 x84909414, 0 x08101818, 0 xc8f0f838,
0 x47535417, 0 x8ea2ac2e, 0 x08000808, 0 xc5c1c405,
0 x03131013, 0 xcdc1cc0d, 0 x86828406, 0 x89b1b839,
0 xcff3fc3f, 0 x4d717c3d, 0 xc1c1c001, 0 x01313031,
0 xc5f1f435, 0 x8a82880a, 0 x4a62682a, 0 x81b1b031,
0 xc1d1d011, 0 x00202020, 0 xc7d3d417, 0 x02020002,
0 x02222022, 0 x04000404, 0 x48606828, 0 x41717031,
0 x07030407, 0 xcbd3d81b, 0 x8d919c1d, 0 x89919819,
0 x41616021, 0 x8eb2bc3e, 0 xc6e2e426, 0 x49515819,
0 xcdd1dc1d, 0 x41515011, 0 x80909010, 0 xccd0dc1c,
0 x8a92981a, 0 x83a3a023, 0 x8ba3a82b, 0 xc0d0d010,
0 x81818001, 0 x0f030c0f, 0 x47434407, 0 x0a12181a,
0 xc3e3e023, 0 xcce0ec2c, 0 x8d818c0d, 0 x8fb3bc3f,
0 x86929416, 0 x4b73783b, 0 x4c505c1c, 0 x82a2a022,
0 x81a1a021, 0 x43636023, 0 x03232023, 0 x4d414c0d,
0 xc8c0c808, 0 x8e929c1e, 0 x8c909c1c, 0 x0a32383a,
0 x0c000c0c, 0 x0e222c2e, 0 x8ab2b83a, 0 x4e626c2e,
0 x8f939c1f, 0 x4a52581a, 0 xc2f2f032, 0 x82929012,
0 xc3f3f033, 0 x49414809, 0 x48707838, 0 xccc0cc0c,
0 x05111415, 0 xcbf3f83b, 0 x40707030, 0 x45717435,
0 x4f737c3f, 0 x05313435, 0 x00101010, 0 x03030003,
0 x44606424, 0 x4d616c2d, 0 xc6c2c406, 0 x44707434,
0 xc5d1d415, 0 x84b0b434, 0 xcae2e82a, 0 x09010809,
0 x46727436, 0 x09111819, 0 xcef2fc3e, 0 x40404000,
0 x02121012, 0 xc0e0e020, 0 x8db1bc3d, 0 x05010405,
0 xcaf2f83a, 0 x01010001, 0 xc0f0f030, 0 x0a22282a,
0 x4e525c1e, 0 x89a1a829, 0 x46525416, 0 x43434003,
0 x85818405, 0 x04101414, 0 x89818809, 0 x8b93981b,
0 x80b0b030, 0 xc5e1e425, 0 x48404808, 0 x49717839,
0 x87939417, 0 xccf0fc3c, 0 x0e121c1e, 0 x82828002,
0 x01212021, 0 x8c808c0c, 0 x0b13181b, 0 x4f535c1f,
0 x47737437, 0 x44505414, 0 x82b2b032, 0 x0d111c1d,
0 x05212425, 0 x4f434c0f, 0 x00000000, 0 x46424406,
0 xcde1ec2d, 0 x48505818, 0 x42525012, 0 xcbe3e82b,
0 x4e727c3e, 0 xcad2d81a, 0 xc9c1c809, 0 xcdf1fc3d,
0 x00303030, 0 x85919415, 0 x45616425, 0 x0c303c3c,
0 x86b2b436, 0 xc4e0e424, 0 x8bb3b83b, 0 x4c707c3c,
0 x0e020c0e, 0 x40505010, 0 x09313839, 0 x06222426,
0 x02323032, 0 x84808404, 0 x49616829, 0 x83939013,
0 x07333437, 0 xc7e3e427, 0 x04202424, 0 x84a0a424,
0 xcbc3c80b, 0 x43535013, 0 x0a02080a, 0 x87838407,
0 xc9d1d819, 0 x4c404c0c, 0 x83838003, 0 x8f838c0f,
0 xcec2cc0e, 0 x0b33383b, 0 x4a42480a, 0 x87b3b437,
};
static const u32 KC[SEED_NUM_KCONSTANTS] = {
0 x9e3779b9, 0 x3c6ef373, 0 x78dde6e6, 0 xf1bbcdcc,
0 xe3779b99, 0 xc6ef3733, 0 x8dde6e67, 0 x1bbcdccf,
0 x3779b99e, 0 x6ef3733c, 0 xdde6e678, 0 xbbcdccf1,
0 x779b99e3, 0 xef3733c6, 0 xde6e678d, 0 xbcdccf1b,
};
#define OP(X1, X2, X3, X4, rbase) \
t0 = X3 ^ ks[rbase]; \
t1 = X4 ^ ks[rbase+1 ]; \
t1 ^= t0; \
t1 = SS0[byte(t1, 0 )] ^ SS1[byte(t1, 1 )] ^ \
SS2[byte(t1, 2 )] ^ SS3[byte(t1, 3 )]; \
t0 += t1; \
t0 = SS0[byte(t0, 0 )] ^ SS1[byte(t0, 1 )] ^ \
SS2[byte(t0, 2 )] ^ SS3[byte(t0, 3 )]; \
t1 += t0; \
t1 = SS0[byte(t1, 0 )] ^ SS1[byte(t1, 1 )] ^ \
SS2[byte(t1, 2 )] ^ SS3[byte(t1, 3 )]; \
t0 += t1; \
X1 ^= t0; \
X2 ^= t1
static int seed_set_key(struct crypto_tfm *tfm, const u8 *in_key,
unsigned int key_len)
{
struct seed_ctx *ctx = crypto_tfm_ctx(tfm);
u32 *keyout = ctx->keysched;
u32 i, t0, t1, x1, x2, x3, x4;
x1 = get_unaligned_be32(&in_key[0 ]);
x2 = get_unaligned_be32(&in_key[4 ]);
x3 = get_unaligned_be32(&in_key[8 ]);
x4 = get_unaligned_be32(&in_key[12 ]);
for (i = 0 ; i < SEED_NUM_KCONSTANTS; i++) {
t0 = x1 + x3 - KC[i];
t1 = x2 + KC[i] - x4;
*(keyout++) = SS0[byte(t0, 0 )] ^ SS1[byte(t0, 1 )] ^
SS2[byte(t0, 2 )] ^ SS3[byte(t0, 3 )];
*(keyout++) = SS0[byte(t1, 0 )] ^ SS1[byte(t1, 1 )] ^
SS2[byte(t1, 2 )] ^ SS3[byte(t1, 3 )];
if (i % 2 == 0 ) {
t0 = x1;
x1 = (x1 >> 8 ) ^ (x2 << 24 );
x2 = (x2 >> 8 ) ^ (t0 << 24 );
} else {
t0 = x3;
x3 = (x3 << 8 ) ^ (x4 >> 24 );
x4 = (x4 << 8 ) ^ (t0 >> 24 );
}
}
return 0 ;
}
/* encrypt a block of text */
static void seed_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
{
const struct seed_ctx *ctx = crypto_tfm_ctx(tfm);
u32 x1, x2, x3, x4, t0, t1;
const u32 *ks = ctx->keysched;
x1 = get_unaligned_be32(&in[0 ]);
x2 = get_unaligned_be32(&in[4 ]);
x3 = get_unaligned_be32(&in[8 ]);
x4 = get_unaligned_be32(&in[12 ]);
OP(x1, x2, x3, x4, 0 );
OP(x3, x4, x1, x2, 2 );
OP(x1, x2, x3, x4, 4 );
OP(x3, x4, x1, x2, 6 );
OP(x1, x2, x3, x4, 8 );
OP(x3, x4, x1, x2, 10 );
OP(x1, x2, x3, x4, 12 );
OP(x3, x4, x1, x2, 14 );
OP(x1, x2, x3, x4, 16 );
OP(x3, x4, x1, x2, 18 );
OP(x1, x2, x3, x4, 20 );
OP(x3, x4, x1, x2, 22 );
OP(x1, x2, x3, x4, 24 );
OP(x3, x4, x1, x2, 26 );
OP(x1, x2, x3, x4, 28 );
OP(x3, x4, x1, x2, 30 );
put_unaligned_be32(x3, &out[0 ]);
put_unaligned_be32(x4, &out[4 ]);
put_unaligned_be32(x1, &out[8 ]);
put_unaligned_be32(x2, &out[12 ]);
}
/* decrypt a block of text */
static void seed_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
{
const struct seed_ctx *ctx = crypto_tfm_ctx(tfm);
u32 x1, x2, x3, x4, t0, t1;
const u32 *ks = ctx->keysched;
x1 = get_unaligned_be32(&in[0 ]);
x2 = get_unaligned_be32(&in[4 ]);
x3 = get_unaligned_be32(&in[8 ]);
x4 = get_unaligned_be32(&in[12 ]);
OP(x1, x2, x3, x4, 30 );
OP(x3, x4, x1, x2, 28 );
OP(x1, x2, x3, x4, 26 );
OP(x3, x4, x1, x2, 24 );
OP(x1, x2, x3, x4, 22 );
OP(x3, x4, x1, x2, 20 );
OP(x1, x2, x3, x4, 18 );
OP(x3, x4, x1, x2, 16 );
OP(x1, x2, x3, x4, 14 );
OP(x3, x4, x1, x2, 12 );
OP(x1, x2, x3, x4, 10 );
OP(x3, x4, x1, x2, 8 );
OP(x1, x2, x3, x4, 6 );
OP(x3, x4, x1, x2, 4 );
OP(x1, x2, x3, x4, 2 );
OP(x3, x4, x1, x2, 0 );
put_unaligned_be32(x3, &out[0 ]);
put_unaligned_be32(x4, &out[4 ]);
put_unaligned_be32(x1, &out[8 ]);
put_unaligned_be32(x2, &out[12 ]);
}
static struct crypto_alg seed_alg = {
.cra_name = "seed" ,
.cra_driver_name = "seed-generic" ,
.cra_priority = 100 ,
.cra_flags = CRYPTO_ALG_TYPE_CIPHER,
.cra_blocksize = SEED_BLOCK_SIZE,
.cra_ctxsize = sizeof (struct seed_ctx),
.cra_module = THIS_MODULE,
.cra_u = {
.cipher = {
.cia_min_keysize = SEED_KEY_SIZE,
.cia_max_keysize = SEED_KEY_SIZE,
.cia_setkey = seed_set_key,
.cia_encrypt = seed_encrypt,
.cia_decrypt = seed_decrypt
}
}
};
static int __init seed_init(void )
{
return crypto_register_alg(&seed_alg);
}
static void __exit seed_fini(void )
{
crypto_unregister_alg(&seed_alg);
}
module_init(seed_init);
module_exit(seed_fini);
MODULE_DESCRIPTION("SEED Cipher Algorithm" );
MODULE_LICENSE("GPL" );
MODULE_AUTHOR("Hye-Shik Chang <perky@FreeBSD.org>, Kim Hyun <hkim@kisa.or.kr>" );
MODULE_ALIAS_CRYPTO("seed" );
Messung V0.5 in Prozent C=99 H=97 G=97