0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <linux/module.h>
0012 #include <linux/init.h>
0013 #include <linux/types.h>
0014 #include <linux/errno.h>
0015 #include <linux/crypto.h>
0016 #include <asm/byteorder.h>
0017
0018 #define SEED_NUM_KCONSTANTS 16
0019 #define SEED_KEY_SIZE 16
0020 #define SEED_BLOCK_SIZE 16
0021 #define SEED_KEYSCHED_LEN 32
0022
0023
0024
0025
0026 static inline u8
0027 byte(const u32 x, const unsigned n)
0028 {
0029 return x >> (n << 3);
0030 }
0031
0032 struct seed_ctx {
0033 u32 keysched[SEED_KEYSCHED_LEN];
0034 };
0035
0036 static const u32 SS0[256] = {
0037 0x2989a1a8, 0x05858184, 0x16c6d2d4, 0x13c3d3d0,
0038 0x14445054, 0x1d0d111c, 0x2c8ca0ac, 0x25052124,
0039 0x1d4d515c, 0x03434340, 0x18081018, 0x1e0e121c,
0040 0x11415150, 0x3cccf0fc, 0x0acac2c8, 0x23436360,
0041 0x28082028, 0x04444044, 0x20002020, 0x1d8d919c,
0042 0x20c0e0e0, 0x22c2e2e0, 0x08c8c0c8, 0x17071314,
0043 0x2585a1a4, 0x0f8f838c, 0x03030300, 0x3b4b7378,
0044 0x3b8bb3b8, 0x13031310, 0x12c2d2d0, 0x2ecee2ec,
0045 0x30407070, 0x0c8c808c, 0x3f0f333c, 0x2888a0a8,
0046 0x32023230, 0x1dcdd1dc, 0x36c6f2f4, 0x34447074,
0047 0x2ccce0ec, 0x15859194, 0x0b0b0308, 0x17475354,
0048 0x1c4c505c, 0x1b4b5358, 0x3d8db1bc, 0x01010100,
0049 0x24042024, 0x1c0c101c, 0x33437370, 0x18889098,
0050 0x10001010, 0x0cccc0cc, 0x32c2f2f0, 0x19c9d1d8,
0051 0x2c0c202c, 0x27c7e3e4, 0x32427270, 0x03838380,
0052 0x1b8b9398, 0x11c1d1d0, 0x06868284, 0x09c9c1c8,
0053 0x20406060, 0x10405050, 0x2383a3a0, 0x2bcbe3e8,
0054 0x0d0d010c, 0x3686b2b4, 0x1e8e929c, 0x0f4f434c,
0055 0x3787b3b4, 0x1a4a5258, 0x06c6c2c4, 0x38487078,
0056 0x2686a2a4, 0x12021210, 0x2f8fa3ac, 0x15c5d1d4,
0057 0x21416160, 0x03c3c3c0, 0x3484b0b4, 0x01414140,
0058 0x12425250, 0x3d4d717c, 0x0d8d818c, 0x08080008,
0059 0x1f0f131c, 0x19899198, 0x00000000, 0x19091118,
0060 0x04040004, 0x13435350, 0x37c7f3f4, 0x21c1e1e0,
0061 0x3dcdf1fc, 0x36467274, 0x2f0f232c, 0x27072324,
0062 0x3080b0b0, 0x0b8b8388, 0x0e0e020c, 0x2b8ba3a8,
0063 0x2282a2a0, 0x2e4e626c, 0x13839390, 0x0d4d414c,
0064 0x29496168, 0x3c4c707c, 0x09090108, 0x0a0a0208,
0065 0x3f8fb3bc, 0x2fcfe3ec, 0x33c3f3f0, 0x05c5c1c4,
0066 0x07878384, 0x14041014, 0x3ecef2fc, 0x24446064,
0067 0x1eced2dc, 0x2e0e222c, 0x0b4b4348, 0x1a0a1218,
0068 0x06060204, 0x21012120, 0x2b4b6368, 0x26466264,
0069 0x02020200, 0x35c5f1f4, 0x12829290, 0x0a8a8288,
0070 0x0c0c000c, 0x3383b3b0, 0x3e4e727c, 0x10c0d0d0,
0071 0x3a4a7278, 0x07474344, 0x16869294, 0x25c5e1e4,
0072 0x26062224, 0x00808080, 0x2d8da1ac, 0x1fcfd3dc,
0073 0x2181a1a0, 0x30003030, 0x37073334, 0x2e8ea2ac,
0074 0x36063234, 0x15051114, 0x22022220, 0x38083038,
0075 0x34c4f0f4, 0x2787a3a4, 0x05454144, 0x0c4c404c,
0076 0x01818180, 0x29c9e1e8, 0x04848084, 0x17879394,
0077 0x35053134, 0x0bcbc3c8, 0x0ecec2cc, 0x3c0c303c,
0078 0x31417170, 0x11011110, 0x07c7c3c4, 0x09898188,
0079 0x35457174, 0x3bcbf3f8, 0x1acad2d8, 0x38c8f0f8,
0080 0x14849094, 0x19495158, 0x02828280, 0x04c4c0c4,
0081 0x3fcff3fc, 0x09494148, 0x39093138, 0x27476364,
0082 0x00c0c0c0, 0x0fcfc3cc, 0x17c7d3d4, 0x3888b0b8,
0083 0x0f0f030c, 0x0e8e828c, 0x02424240, 0x23032320,
0084 0x11819190, 0x2c4c606c, 0x1bcbd3d8, 0x2484a0a4,
0085 0x34043034, 0x31c1f1f0, 0x08484048, 0x02c2c2c0,
0086 0x2f4f636c, 0x3d0d313c, 0x2d0d212c, 0x00404040,
0087 0x3e8eb2bc, 0x3e0e323c, 0x3c8cb0bc, 0x01c1c1c0,
0088 0x2a8aa2a8, 0x3a8ab2b8, 0x0e4e424c, 0x15455154,
0089 0x3b0b3338, 0x1cccd0dc, 0x28486068, 0x3f4f737c,
0090 0x1c8c909c, 0x18c8d0d8, 0x0a4a4248, 0x16465254,
0091 0x37477374, 0x2080a0a0, 0x2dcde1ec, 0x06464244,
0092 0x3585b1b4, 0x2b0b2328, 0x25456164, 0x3acaf2f8,
0093 0x23c3e3e0, 0x3989b1b8, 0x3181b1b0, 0x1f8f939c,
0094 0x1e4e525c, 0x39c9f1f8, 0x26c6e2e4, 0x3282b2b0,
0095 0x31013130, 0x2acae2e8, 0x2d4d616c, 0x1f4f535c,
0096 0x24c4e0e4, 0x30c0f0f0, 0x0dcdc1cc, 0x08888088,
0097 0x16061214, 0x3a0a3238, 0x18485058, 0x14c4d0d4,
0098 0x22426260, 0x29092128, 0x07070304, 0x33033330,
0099 0x28c8e0e8, 0x1b0b1318, 0x05050104, 0x39497178,
0100 0x10809090, 0x2a4a6268, 0x2a0a2228, 0x1a8a9298,
0101 };
0102
0103 static const u32 SS1[256] = {
0104 0x38380830, 0xe828c8e0, 0x2c2d0d21, 0xa42686a2,
0105 0xcc0fcfc3, 0xdc1eced2, 0xb03383b3, 0xb83888b0,
0106 0xac2f8fa3, 0x60204060, 0x54154551, 0xc407c7c3,
0107 0x44044440, 0x6c2f4f63, 0x682b4b63, 0x581b4b53,
0108 0xc003c3c3, 0x60224262, 0x30330333, 0xb43585b1,
0109 0x28290921, 0xa02080a0, 0xe022c2e2, 0xa42787a3,
0110 0xd013c3d3, 0x90118191, 0x10110111, 0x04060602,
0111 0x1c1c0c10, 0xbc3c8cb0, 0x34360632, 0x480b4b43,
0112 0xec2fcfe3, 0x88088880, 0x6c2c4c60, 0xa82888a0,
0113 0x14170713, 0xc404c4c0, 0x14160612, 0xf434c4f0,
0114 0xc002c2c2, 0x44054541, 0xe021c1e1, 0xd416c6d2,
0115 0x3c3f0f33, 0x3c3d0d31, 0x8c0e8e82, 0x98188890,
0116 0x28280820, 0x4c0e4e42, 0xf436c6f2, 0x3c3e0e32,
0117 0xa42585a1, 0xf839c9f1, 0x0c0d0d01, 0xdc1fcfd3,
0118 0xd818c8d0, 0x282b0b23, 0x64264662, 0x783a4a72,
0119 0x24270723, 0x2c2f0f23, 0xf031c1f1, 0x70324272,
0120 0x40024242, 0xd414c4d0, 0x40014141, 0xc000c0c0,
0121 0x70334373, 0x64274763, 0xac2c8ca0, 0x880b8b83,
0122 0xf437c7f3, 0xac2d8da1, 0x80008080, 0x1c1f0f13,
0123 0xc80acac2, 0x2c2c0c20, 0xa82a8aa2, 0x34340430,
0124 0xd012c2d2, 0x080b0b03, 0xec2ecee2, 0xe829c9e1,
0125 0x5c1d4d51, 0x94148490, 0x18180810, 0xf838c8f0,
0126 0x54174753, 0xac2e8ea2, 0x08080800, 0xc405c5c1,
0127 0x10130313, 0xcc0dcdc1, 0x84068682, 0xb83989b1,
0128 0xfc3fcff3, 0x7c3d4d71, 0xc001c1c1, 0x30310131,
0129 0xf435c5f1, 0x880a8a82, 0x682a4a62, 0xb03181b1,
0130 0xd011c1d1, 0x20200020, 0xd417c7d3, 0x00020202,
0131 0x20220222, 0x04040400, 0x68284860, 0x70314171,
0132 0x04070703, 0xd81bcbd3, 0x9c1d8d91, 0x98198991,
0133 0x60214161, 0xbc3e8eb2, 0xe426c6e2, 0x58194951,
0134 0xdc1dcdd1, 0x50114151, 0x90108090, 0xdc1cccd0,
0135 0x981a8a92, 0xa02383a3, 0xa82b8ba3, 0xd010c0d0,
0136 0x80018181, 0x0c0f0f03, 0x44074743, 0x181a0a12,
0137 0xe023c3e3, 0xec2ccce0, 0x8c0d8d81, 0xbc3f8fb3,
0138 0x94168692, 0x783b4b73, 0x5c1c4c50, 0xa02282a2,
0139 0xa02181a1, 0x60234363, 0x20230323, 0x4c0d4d41,
0140 0xc808c8c0, 0x9c1e8e92, 0x9c1c8c90, 0x383a0a32,
0141 0x0c0c0c00, 0x2c2e0e22, 0xb83a8ab2, 0x6c2e4e62,
0142 0x9c1f8f93, 0x581a4a52, 0xf032c2f2, 0x90128292,
0143 0xf033c3f3, 0x48094941, 0x78384870, 0xcc0cccc0,
0144 0x14150511, 0xf83bcbf3, 0x70304070, 0x74354571,
0145 0x7c3f4f73, 0x34350531, 0x10100010, 0x00030303,
0146 0x64244460, 0x6c2d4d61, 0xc406c6c2, 0x74344470,
0147 0xd415c5d1, 0xb43484b0, 0xe82acae2, 0x08090901,
0148 0x74364672, 0x18190911, 0xfc3ecef2, 0x40004040,
0149 0x10120212, 0xe020c0e0, 0xbc3d8db1, 0x04050501,
0150 0xf83acaf2, 0x00010101, 0xf030c0f0, 0x282a0a22,
0151 0x5c1e4e52, 0xa82989a1, 0x54164652, 0x40034343,
0152 0x84058581, 0x14140410, 0x88098981, 0x981b8b93,
0153 0xb03080b0, 0xe425c5e1, 0x48084840, 0x78394971,
0154 0x94178793, 0xfc3cccf0, 0x1c1e0e12, 0x80028282,
0155 0x20210121, 0x8c0c8c80, 0x181b0b13, 0x5c1f4f53,
0156 0x74374773, 0x54144450, 0xb03282b2, 0x1c1d0d11,
0157 0x24250521, 0x4c0f4f43, 0x00000000, 0x44064642,
0158 0xec2dcde1, 0x58184850, 0x50124252, 0xe82bcbe3,
0159 0x7c3e4e72, 0xd81acad2, 0xc809c9c1, 0xfc3dcdf1,
0160 0x30300030, 0x94158591, 0x64254561, 0x3c3c0c30,
0161 0xb43686b2, 0xe424c4e0, 0xb83b8bb3, 0x7c3c4c70,
0162 0x0c0e0e02, 0x50104050, 0x38390931, 0x24260622,
0163 0x30320232, 0x84048480, 0x68294961, 0x90138393,
0164 0x34370733, 0xe427c7e3, 0x24240420, 0xa42484a0,
0165 0xc80bcbc3, 0x50134353, 0x080a0a02, 0x84078783,
0166 0xd819c9d1, 0x4c0c4c40, 0x80038383, 0x8c0f8f83,
0167 0xcc0ecec2, 0x383b0b33, 0x480a4a42, 0xb43787b3,
0168 };
0169
0170 static const u32 SS2[256] = {
0171 0xa1a82989, 0x81840585, 0xd2d416c6, 0xd3d013c3,
0172 0x50541444, 0x111c1d0d, 0xa0ac2c8c, 0x21242505,
0173 0x515c1d4d, 0x43400343, 0x10181808, 0x121c1e0e,
0174 0x51501141, 0xf0fc3ccc, 0xc2c80aca, 0x63602343,
0175 0x20282808, 0x40440444, 0x20202000, 0x919c1d8d,
0176 0xe0e020c0, 0xe2e022c2, 0xc0c808c8, 0x13141707,
0177 0xa1a42585, 0x838c0f8f, 0x03000303, 0x73783b4b,
0178 0xb3b83b8b, 0x13101303, 0xd2d012c2, 0xe2ec2ece,
0179 0x70703040, 0x808c0c8c, 0x333c3f0f, 0xa0a82888,
0180 0x32303202, 0xd1dc1dcd, 0xf2f436c6, 0x70743444,
0181 0xe0ec2ccc, 0x91941585, 0x03080b0b, 0x53541747,
0182 0x505c1c4c, 0x53581b4b, 0xb1bc3d8d, 0x01000101,
0183 0x20242404, 0x101c1c0c, 0x73703343, 0x90981888,
0184 0x10101000, 0xc0cc0ccc, 0xf2f032c2, 0xd1d819c9,
0185 0x202c2c0c, 0xe3e427c7, 0x72703242, 0x83800383,
0186 0x93981b8b, 0xd1d011c1, 0x82840686, 0xc1c809c9,
0187 0x60602040, 0x50501040, 0xa3a02383, 0xe3e82bcb,
0188 0x010c0d0d, 0xb2b43686, 0x929c1e8e, 0x434c0f4f,
0189 0xb3b43787, 0x52581a4a, 0xc2c406c6, 0x70783848,
0190 0xa2a42686, 0x12101202, 0xa3ac2f8f, 0xd1d415c5,
0191 0x61602141, 0xc3c003c3, 0xb0b43484, 0x41400141,
0192 0x52501242, 0x717c3d4d, 0x818c0d8d, 0x00080808,
0193 0x131c1f0f, 0x91981989, 0x00000000, 0x11181909,
0194 0x00040404, 0x53501343, 0xf3f437c7, 0xe1e021c1,
0195 0xf1fc3dcd, 0x72743646, 0x232c2f0f, 0x23242707,
0196 0xb0b03080, 0x83880b8b, 0x020c0e0e, 0xa3a82b8b,
0197 0xa2a02282, 0x626c2e4e, 0x93901383, 0x414c0d4d,
0198 0x61682949, 0x707c3c4c, 0x01080909, 0x02080a0a,
0199 0xb3bc3f8f, 0xe3ec2fcf, 0xf3f033c3, 0xc1c405c5,
0200 0x83840787, 0x10141404, 0xf2fc3ece, 0x60642444,
0201 0xd2dc1ece, 0x222c2e0e, 0x43480b4b, 0x12181a0a,
0202 0x02040606, 0x21202101, 0x63682b4b, 0x62642646,
0203 0x02000202, 0xf1f435c5, 0x92901282, 0x82880a8a,
0204 0x000c0c0c, 0xb3b03383, 0x727c3e4e, 0xd0d010c0,
0205 0x72783a4a, 0x43440747, 0x92941686, 0xe1e425c5,
0206 0x22242606, 0x80800080, 0xa1ac2d8d, 0xd3dc1fcf,
0207 0xa1a02181, 0x30303000, 0x33343707, 0xa2ac2e8e,
0208 0x32343606, 0x11141505, 0x22202202, 0x30383808,
0209 0xf0f434c4, 0xa3a42787, 0x41440545, 0x404c0c4c,
0210 0x81800181, 0xe1e829c9, 0x80840484, 0x93941787,
0211 0x31343505, 0xc3c80bcb, 0xc2cc0ece, 0x303c3c0c,
0212 0x71703141, 0x11101101, 0xc3c407c7, 0x81880989,
0213 0x71743545, 0xf3f83bcb, 0xd2d81aca, 0xf0f838c8,
0214 0x90941484, 0x51581949, 0x82800282, 0xc0c404c4,
0215 0xf3fc3fcf, 0x41480949, 0x31383909, 0x63642747,
0216 0xc0c000c0, 0xc3cc0fcf, 0xd3d417c7, 0xb0b83888,
0217 0x030c0f0f, 0x828c0e8e, 0x42400242, 0x23202303,
0218 0x91901181, 0x606c2c4c, 0xd3d81bcb, 0xa0a42484,
0219 0x30343404, 0xf1f031c1, 0x40480848, 0xc2c002c2,
0220 0x636c2f4f, 0x313c3d0d, 0x212c2d0d, 0x40400040,
0221 0xb2bc3e8e, 0x323c3e0e, 0xb0bc3c8c, 0xc1c001c1,
0222 0xa2a82a8a, 0xb2b83a8a, 0x424c0e4e, 0x51541545,
0223 0x33383b0b, 0xd0dc1ccc, 0x60682848, 0x737c3f4f,
0224 0x909c1c8c, 0xd0d818c8, 0x42480a4a, 0x52541646,
0225 0x73743747, 0xa0a02080, 0xe1ec2dcd, 0x42440646,
0226 0xb1b43585, 0x23282b0b, 0x61642545, 0xf2f83aca,
0227 0xe3e023c3, 0xb1b83989, 0xb1b03181, 0x939c1f8f,
0228 0x525c1e4e, 0xf1f839c9, 0xe2e426c6, 0xb2b03282,
0229 0x31303101, 0xe2e82aca, 0x616c2d4d, 0x535c1f4f,
0230 0xe0e424c4, 0xf0f030c0, 0xc1cc0dcd, 0x80880888,
0231 0x12141606, 0x32383a0a, 0x50581848, 0xd0d414c4,
0232 0x62602242, 0x21282909, 0x03040707, 0x33303303,
0233 0xe0e828c8, 0x13181b0b, 0x01040505, 0x71783949,
0234 0x90901080, 0x62682a4a, 0x22282a0a, 0x92981a8a,
0235 };
0236
0237 static const u32 SS3[256] = {
0238 0x08303838, 0xc8e0e828, 0x0d212c2d, 0x86a2a426,
0239 0xcfc3cc0f, 0xced2dc1e, 0x83b3b033, 0x88b0b838,
0240 0x8fa3ac2f, 0x40606020, 0x45515415, 0xc7c3c407,
0241 0x44404404, 0x4f636c2f, 0x4b63682b, 0x4b53581b,
0242 0xc3c3c003, 0x42626022, 0x03333033, 0x85b1b435,
0243 0x09212829, 0x80a0a020, 0xc2e2e022, 0x87a3a427,
0244 0xc3d3d013, 0x81919011, 0x01111011, 0x06020406,
0245 0x0c101c1c, 0x8cb0bc3c, 0x06323436, 0x4b43480b,
0246 0xcfe3ec2f, 0x88808808, 0x4c606c2c, 0x88a0a828,
0247 0x07131417, 0xc4c0c404, 0x06121416, 0xc4f0f434,
0248 0xc2c2c002, 0x45414405, 0xc1e1e021, 0xc6d2d416,
0249 0x0f333c3f, 0x0d313c3d, 0x8e828c0e, 0x88909818,
0250 0x08202828, 0x4e424c0e, 0xc6f2f436, 0x0e323c3e,
0251 0x85a1a425, 0xc9f1f839, 0x0d010c0d, 0xcfd3dc1f,
0252 0xc8d0d818, 0x0b23282b, 0x46626426, 0x4a72783a,
0253 0x07232427, 0x0f232c2f, 0xc1f1f031, 0x42727032,
0254 0x42424002, 0xc4d0d414, 0x41414001, 0xc0c0c000,
0255 0x43737033, 0x47636427, 0x8ca0ac2c, 0x8b83880b,
0256 0xc7f3f437, 0x8da1ac2d, 0x80808000, 0x0f131c1f,
0257 0xcac2c80a, 0x0c202c2c, 0x8aa2a82a, 0x04303434,
0258 0xc2d2d012, 0x0b03080b, 0xcee2ec2e, 0xc9e1e829,
0259 0x4d515c1d, 0x84909414, 0x08101818, 0xc8f0f838,
0260 0x47535417, 0x8ea2ac2e, 0x08000808, 0xc5c1c405,
0261 0x03131013, 0xcdc1cc0d, 0x86828406, 0x89b1b839,
0262 0xcff3fc3f, 0x4d717c3d, 0xc1c1c001, 0x01313031,
0263 0xc5f1f435, 0x8a82880a, 0x4a62682a, 0x81b1b031,
0264 0xc1d1d011, 0x00202020, 0xc7d3d417, 0x02020002,
0265 0x02222022, 0x04000404, 0x48606828, 0x41717031,
0266 0x07030407, 0xcbd3d81b, 0x8d919c1d, 0x89919819,
0267 0x41616021, 0x8eb2bc3e, 0xc6e2e426, 0x49515819,
0268 0xcdd1dc1d, 0x41515011, 0x80909010, 0xccd0dc1c,
0269 0x8a92981a, 0x83a3a023, 0x8ba3a82b, 0xc0d0d010,
0270 0x81818001, 0x0f030c0f, 0x47434407, 0x0a12181a,
0271 0xc3e3e023, 0xcce0ec2c, 0x8d818c0d, 0x8fb3bc3f,
0272 0x86929416, 0x4b73783b, 0x4c505c1c, 0x82a2a022,
0273 0x81a1a021, 0x43636023, 0x03232023, 0x4d414c0d,
0274 0xc8c0c808, 0x8e929c1e, 0x8c909c1c, 0x0a32383a,
0275 0x0c000c0c, 0x0e222c2e, 0x8ab2b83a, 0x4e626c2e,
0276 0x8f939c1f, 0x4a52581a, 0xc2f2f032, 0x82929012,
0277 0xc3f3f033, 0x49414809, 0x48707838, 0xccc0cc0c,
0278 0x05111415, 0xcbf3f83b, 0x40707030, 0x45717435,
0279 0x4f737c3f, 0x05313435, 0x00101010, 0x03030003,
0280 0x44606424, 0x4d616c2d, 0xc6c2c406, 0x44707434,
0281 0xc5d1d415, 0x84b0b434, 0xcae2e82a, 0x09010809,
0282 0x46727436, 0x09111819, 0xcef2fc3e, 0x40404000,
0283 0x02121012, 0xc0e0e020, 0x8db1bc3d, 0x05010405,
0284 0xcaf2f83a, 0x01010001, 0xc0f0f030, 0x0a22282a,
0285 0x4e525c1e, 0x89a1a829, 0x46525416, 0x43434003,
0286 0x85818405, 0x04101414, 0x89818809, 0x8b93981b,
0287 0x80b0b030, 0xc5e1e425, 0x48404808, 0x49717839,
0288 0x87939417, 0xccf0fc3c, 0x0e121c1e, 0x82828002,
0289 0x01212021, 0x8c808c0c, 0x0b13181b, 0x4f535c1f,
0290 0x47737437, 0x44505414, 0x82b2b032, 0x0d111c1d,
0291 0x05212425, 0x4f434c0f, 0x00000000, 0x46424406,
0292 0xcde1ec2d, 0x48505818, 0x42525012, 0xcbe3e82b,
0293 0x4e727c3e, 0xcad2d81a, 0xc9c1c809, 0xcdf1fc3d,
0294 0x00303030, 0x85919415, 0x45616425, 0x0c303c3c,
0295 0x86b2b436, 0xc4e0e424, 0x8bb3b83b, 0x4c707c3c,
0296 0x0e020c0e, 0x40505010, 0x09313839, 0x06222426,
0297 0x02323032, 0x84808404, 0x49616829, 0x83939013,
0298 0x07333437, 0xc7e3e427, 0x04202424, 0x84a0a424,
0299 0xcbc3c80b, 0x43535013, 0x0a02080a, 0x87838407,
0300 0xc9d1d819, 0x4c404c0c, 0x83838003, 0x8f838c0f,
0301 0xcec2cc0e, 0x0b33383b, 0x4a42480a, 0x87b3b437,
0302 };
0303
0304 static const u32 KC[SEED_NUM_KCONSTANTS] = {
0305 0x9e3779b9, 0x3c6ef373, 0x78dde6e6, 0xf1bbcdcc,
0306 0xe3779b99, 0xc6ef3733, 0x8dde6e67, 0x1bbcdccf,
0307 0x3779b99e, 0x6ef3733c, 0xdde6e678, 0xbbcdccf1,
0308 0x779b99e3, 0xef3733c6, 0xde6e678d, 0xbcdccf1b,
0309 };
0310
0311 #define OP(X1, X2, X3, X4, rbase) \
0312 t0 = X3 ^ ks[rbase]; \
0313 t1 = X4 ^ ks[rbase+1]; \
0314 t1 ^= t0; \
0315 t1 = SS0[byte(t1, 0)] ^ SS1[byte(t1, 1)] ^ \
0316 SS2[byte(t1, 2)] ^ SS3[byte(t1, 3)]; \
0317 t0 += t1; \
0318 t0 = SS0[byte(t0, 0)] ^ SS1[byte(t0, 1)] ^ \
0319 SS2[byte(t0, 2)] ^ SS3[byte(t0, 3)]; \
0320 t1 += t0; \
0321 t1 = SS0[byte(t1, 0)] ^ SS1[byte(t1, 1)] ^ \
0322 SS2[byte(t1, 2)] ^ SS3[byte(t1, 3)]; \
0323 t0 += t1; \
0324 X1 ^= t0; \
0325 X2 ^= t1
0326
0327 static int seed_set_key(struct crypto_tfm *tfm, const u8 *in_key,
0328 unsigned int key_len)
0329 {
0330 struct seed_ctx *ctx = crypto_tfm_ctx(tfm);
0331 u32 *keyout = ctx->keysched;
0332 const __be32 *key = (const __be32 *)in_key;
0333 u32 i, t0, t1, x1, x2, x3, x4;
0334
0335 x1 = be32_to_cpu(key[0]);
0336 x2 = be32_to_cpu(key[1]);
0337 x3 = be32_to_cpu(key[2]);
0338 x4 = be32_to_cpu(key[3]);
0339
0340 for (i = 0; i < SEED_NUM_KCONSTANTS; i++) {
0341 t0 = x1 + x3 - KC[i];
0342 t1 = x2 + KC[i] - x4;
0343 *(keyout++) = SS0[byte(t0, 0)] ^ SS1[byte(t0, 1)] ^
0344 SS2[byte(t0, 2)] ^ SS3[byte(t0, 3)];
0345 *(keyout++) = SS0[byte(t1, 0)] ^ SS1[byte(t1, 1)] ^
0346 SS2[byte(t1, 2)] ^ SS3[byte(t1, 3)];
0347
0348 if (i % 2 == 0) {
0349 t0 = x1;
0350 x1 = (x1 >> 8) ^ (x2 << 24);
0351 x2 = (x2 >> 8) ^ (t0 << 24);
0352 } else {
0353 t0 = x3;
0354 x3 = (x3 << 8) ^ (x4 >> 24);
0355 x4 = (x4 << 8) ^ (t0 >> 24);
0356 }
0357 }
0358
0359 return 0;
0360 }
0361
0362
0363
0364 static void seed_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
0365 {
0366 const struct seed_ctx *ctx = crypto_tfm_ctx(tfm);
0367 const __be32 *src = (const __be32 *)in;
0368 __be32 *dst = (__be32 *)out;
0369 u32 x1, x2, x3, x4, t0, t1;
0370 const u32 *ks = ctx->keysched;
0371
0372 x1 = be32_to_cpu(src[0]);
0373 x2 = be32_to_cpu(src[1]);
0374 x3 = be32_to_cpu(src[2]);
0375 x4 = be32_to_cpu(src[3]);
0376
0377 OP(x1, x2, x3, x4, 0);
0378 OP(x3, x4, x1, x2, 2);
0379 OP(x1, x2, x3, x4, 4);
0380 OP(x3, x4, x1, x2, 6);
0381 OP(x1, x2, x3, x4, 8);
0382 OP(x3, x4, x1, x2, 10);
0383 OP(x1, x2, x3, x4, 12);
0384 OP(x3, x4, x1, x2, 14);
0385 OP(x1, x2, x3, x4, 16);
0386 OP(x3, x4, x1, x2, 18);
0387 OP(x1, x2, x3, x4, 20);
0388 OP(x3, x4, x1, x2, 22);
0389 OP(x1, x2, x3, x4, 24);
0390 OP(x3, x4, x1, x2, 26);
0391 OP(x1, x2, x3, x4, 28);
0392 OP(x3, x4, x1, x2, 30);
0393
0394 dst[0] = cpu_to_be32(x3);
0395 dst[1] = cpu_to_be32(x4);
0396 dst[2] = cpu_to_be32(x1);
0397 dst[3] = cpu_to_be32(x2);
0398 }
0399
0400
0401
0402 static void seed_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
0403 {
0404 const struct seed_ctx *ctx = crypto_tfm_ctx(tfm);
0405 const __be32 *src = (const __be32 *)in;
0406 __be32 *dst = (__be32 *)out;
0407 u32 x1, x2, x3, x4, t0, t1;
0408 const u32 *ks = ctx->keysched;
0409
0410 x1 = be32_to_cpu(src[0]);
0411 x2 = be32_to_cpu(src[1]);
0412 x3 = be32_to_cpu(src[2]);
0413 x4 = be32_to_cpu(src[3]);
0414
0415 OP(x1, x2, x3, x4, 30);
0416 OP(x3, x4, x1, x2, 28);
0417 OP(x1, x2, x3, x4, 26);
0418 OP(x3, x4, x1, x2, 24);
0419 OP(x1, x2, x3, x4, 22);
0420 OP(x3, x4, x1, x2, 20);
0421 OP(x1, x2, x3, x4, 18);
0422 OP(x3, x4, x1, x2, 16);
0423 OP(x1, x2, x3, x4, 14);
0424 OP(x3, x4, x1, x2, 12);
0425 OP(x1, x2, x3, x4, 10);
0426 OP(x3, x4, x1, x2, 8);
0427 OP(x1, x2, x3, x4, 6);
0428 OP(x3, x4, x1, x2, 4);
0429 OP(x1, x2, x3, x4, 2);
0430 OP(x3, x4, x1, x2, 0);
0431
0432 dst[0] = cpu_to_be32(x3);
0433 dst[1] = cpu_to_be32(x4);
0434 dst[2] = cpu_to_be32(x1);
0435 dst[3] = cpu_to_be32(x2);
0436 }
0437
0438
0439 static struct crypto_alg seed_alg = {
0440 .cra_name = "seed",
0441 .cra_driver_name = "seed-generic",
0442 .cra_priority = 100,
0443 .cra_flags = CRYPTO_ALG_TYPE_CIPHER,
0444 .cra_blocksize = SEED_BLOCK_SIZE,
0445 .cra_ctxsize = sizeof(struct seed_ctx),
0446 .cra_alignmask = 3,
0447 .cra_module = THIS_MODULE,
0448 .cra_u = {
0449 .cipher = {
0450 .cia_min_keysize = SEED_KEY_SIZE,
0451 .cia_max_keysize = SEED_KEY_SIZE,
0452 .cia_setkey = seed_set_key,
0453 .cia_encrypt = seed_encrypt,
0454 .cia_decrypt = seed_decrypt
0455 }
0456 }
0457 };
0458
0459 static int __init seed_init(void)
0460 {
0461 return crypto_register_alg(&seed_alg);
0462 }
0463
0464 static void __exit seed_fini(void)
0465 {
0466 crypto_unregister_alg(&seed_alg);
0467 }
0468
0469 subsys_initcall(seed_init);
0470 module_exit(seed_fini);
0471
0472 MODULE_DESCRIPTION("SEED Cipher Algorithm");
0473 MODULE_LICENSE("GPL");
0474 MODULE_AUTHOR("Hye-Shik Chang <perky@FreeBSD.org>, Kim Hyun <hkim@kisa.or.kr>");
0475 MODULE_ALIAS_CRYPTO("seed");