linux/crypto/cast5_generic.c
<<
>>
Prefs
   1/* Kernel cryptographic api.
   2* cast5.c - Cast5 cipher algorithm (rfc2144).
   3*
   4* Derived from GnuPG implementation of cast5.
   5*
   6* Major Changes.
   7*       Complete conformance to rfc2144.
   8*       Supports key size from 40 to 128 bits.
   9*
  10* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
  11* Copyright (C) 2003 Kartikey Mahendra Bhatt <kartik_me@hotmail.com>.
  12*
  13* This program is free software; you can redistribute it and/or modify it
  14* under the terms of GNU General Public License as published by the Free
  15* Software Foundation; either version 2 of the License, or (at your option)
  16* any later version.
  17*
  18* You should have received a copy of the GNU General Public License
  19* along with this program; if not, write to the Free Software
  20* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
  21*/
  22
  23
  24#include <asm/byteorder.h>
  25#include <linux/init.h>
  26#include <linux/crypto.h>
  27#include <linux/module.h>
  28#include <linux/errno.h>
  29#include <linux/string.h>
  30#include <linux/types.h>
  31#include <crypto/cast5.h>
  32
  33
  34const u32 cast5_s1[256] = {
  35        0x30fb40d4, 0x9fa0ff0b, 0x6beccd2f, 0x3f258c7a, 0x1e213f2f,
  36        0x9c004dd3, 0x6003e540, 0xcf9fc949,
  37        0xbfd4af27, 0x88bbbdb5, 0xe2034090, 0x98d09675, 0x6e63a0e0,
  38        0x15c361d2, 0xc2e7661d, 0x22d4ff8e,
  39        0x28683b6f, 0xc07fd059, 0xff2379c8, 0x775f50e2, 0x43c340d3,
  40        0xdf2f8656, 0x887ca41a, 0xa2d2bd2d,
  41        0xa1c9e0d6, 0x346c4819, 0x61b76d87, 0x22540f2f, 0x2abe32e1,
  42        0xaa54166b, 0x22568e3a, 0xa2d341d0,
  43        0x66db40c8, 0xa784392f, 0x004dff2f, 0x2db9d2de, 0x97943fac,
  44        0x4a97c1d8, 0x527644b7, 0xb5f437a7,
  45        0xb82cbaef, 0xd751d159, 0x6ff7f0ed, 0x5a097a1f, 0x827b68d0,
  46        0x90ecf52e, 0x22b0c054, 0xbc8e5935,
  47        0x4b6d2f7f, 0x50bb64a2, 0xd2664910, 0xbee5812d, 0xb7332290,
  48        0xe93b159f, 0xb48ee411, 0x4bff345d,
  49        0xfd45c240, 0xad31973f, 0xc4f6d02e, 0x55fc8165, 0xd5b1caad,
  50        0xa1ac2dae, 0xa2d4b76d, 0xc19b0c50,
  51        0x882240f2, 0x0c6e4f38, 0xa4e4bfd7, 0x4f5ba272, 0x564c1d2f,
  52        0xc59c5319, 0xb949e354, 0xb04669fe,
  53        0xb1b6ab8a, 0xc71358dd, 0x6385c545, 0x110f935d, 0x57538ad5,
  54        0x6a390493, 0xe63d37e0, 0x2a54f6b3,
  55        0x3a787d5f, 0x6276a0b5, 0x19a6fcdf, 0x7a42206a, 0x29f9d4d5,
  56        0xf61b1891, 0xbb72275e, 0xaa508167,
  57        0x38901091, 0xc6b505eb, 0x84c7cb8c, 0x2ad75a0f, 0x874a1427,
  58        0xa2d1936b, 0x2ad286af, 0xaa56d291,
  59        0xd7894360, 0x425c750d, 0x93b39e26, 0x187184c9, 0x6c00b32d,
  60        0x73e2bb14, 0xa0bebc3c, 0x54623779,
  61        0x64459eab, 0x3f328b82, 0x7718cf82, 0x59a2cea6, 0x04ee002e,
  62        0x89fe78e6, 0x3fab0950, 0x325ff6c2,
  63        0x81383f05, 0x6963c5c8, 0x76cb5ad6, 0xd49974c9, 0xca180dcf,
  64        0x380782d5, 0xc7fa5cf6, 0x8ac31511,
  65        0x35e79e13, 0x47da91d0, 0xf40f9086, 0xa7e2419e, 0x31366241,
  66        0x051ef495, 0xaa573b04, 0x4a805d8d,
  67        0x548300d0, 0x00322a3c, 0xbf64cddf, 0xba57a68e, 0x75c6372b,
  68        0x50afd341, 0xa7c13275, 0x915a0bf5,
  69        0x6b54bfab, 0x2b0b1426, 0xab4cc9d7, 0x449ccd82, 0xf7fbf265,
  70        0xab85c5f3, 0x1b55db94, 0xaad4e324,
  71        0xcfa4bd3f, 0x2deaa3e2, 0x9e204d02, 0xc8bd25ac, 0xeadf55b3,
  72        0xd5bd9e98, 0xe31231b2, 0x2ad5ad6c,
  73        0x954329de, 0xadbe4528, 0xd8710f69, 0xaa51c90f, 0xaa786bf6,
  74        0x22513f1e, 0xaa51a79b, 0x2ad344cc,
  75        0x7b5a41f0, 0xd37cfbad, 0x1b069505, 0x41ece491, 0xb4c332e6,
  76        0x032268d4, 0xc9600acc, 0xce387e6d,
  77        0xbf6bb16c, 0x6a70fb78, 0x0d03d9c9, 0xd4df39de, 0xe01063da,
  78        0x4736f464, 0x5ad328d8, 0xb347cc96,
  79        0x75bb0fc3, 0x98511bfb, 0x4ffbcc35, 0xb58bcf6a, 0xe11f0abc,
  80        0xbfc5fe4a, 0xa70aec10, 0xac39570a,
  81        0x3f04442f, 0x6188b153, 0xe0397a2e, 0x5727cb79, 0x9ceb418f,
  82        0x1cacd68d, 0x2ad37c96, 0x0175cb9d,
  83        0xc69dff09, 0xc75b65f0, 0xd9db40d8, 0xec0e7779, 0x4744ead4,
  84        0xb11c3274, 0xdd24cb9e, 0x7e1c54bd,
  85        0xf01144f9, 0xd2240eb1, 0x9675b3fd, 0xa3ac3755, 0xd47c27af,
  86        0x51c85f4d, 0x56907596, 0xa5bb15e6,
  87        0x580304f0, 0xca042cf1, 0x011a37ea, 0x8dbfaadb, 0x35ba3e4a,
  88        0x3526ffa0, 0xc37b4d09, 0xbc306ed9,
  89        0x98a52666, 0x5648f725, 0xff5e569d, 0x0ced63d0, 0x7c63b2cf,
  90        0x700b45e1, 0xd5ea50f1, 0x85a92872,
  91        0xaf1fbda7, 0xd4234870, 0xa7870bf3, 0x2d3b4d79, 0x42e04198,
  92        0x0cd0ede7, 0x26470db8, 0xf881814c,
  93        0x474d6ad7, 0x7c0c5e5c, 0xd1231959, 0x381b7298, 0xf5d2f4db,
  94        0xab838653, 0x6e2f1e23, 0x83719c9e,
  95        0xbd91e046, 0x9a56456e, 0xdc39200c, 0x20c8c571, 0x962bda1c,
  96        0xe1e696ff, 0xb141ab08, 0x7cca89b9,
  97        0x1a69e783, 0x02cc4843, 0xa2f7c579, 0x429ef47d, 0x427b169c,
  98        0x5ac9f049, 0xdd8f0f00, 0x5c8165bf
  99};
 100EXPORT_SYMBOL_GPL(cast5_s1);
 101const u32 cast5_s2[256] = {
 102        0x1f201094, 0xef0ba75b, 0x69e3cf7e, 0x393f4380, 0xfe61cf7a,
 103        0xeec5207a, 0x55889c94, 0x72fc0651,
 104        0xada7ef79, 0x4e1d7235, 0xd55a63ce, 0xde0436ba, 0x99c430ef,
 105        0x5f0c0794, 0x18dcdb7d, 0xa1d6eff3,
 106        0xa0b52f7b, 0x59e83605, 0xee15b094, 0xe9ffd909, 0xdc440086,
 107        0xef944459, 0xba83ccb3, 0xe0c3cdfb,
 108        0xd1da4181, 0x3b092ab1, 0xf997f1c1, 0xa5e6cf7b, 0x01420ddb,
 109        0xe4e7ef5b, 0x25a1ff41, 0xe180f806,
 110        0x1fc41080, 0x179bee7a, 0xd37ac6a9, 0xfe5830a4, 0x98de8b7f,
 111        0x77e83f4e, 0x79929269, 0x24fa9f7b,
 112        0xe113c85b, 0xacc40083, 0xd7503525, 0xf7ea615f, 0x62143154,
 113        0x0d554b63, 0x5d681121, 0xc866c359,
 114        0x3d63cf73, 0xcee234c0, 0xd4d87e87, 0x5c672b21, 0x071f6181,
 115        0x39f7627f, 0x361e3084, 0xe4eb573b,
 116        0x602f64a4, 0xd63acd9c, 0x1bbc4635, 0x9e81032d, 0x2701f50c,
 117        0x99847ab4, 0xa0e3df79, 0xba6cf38c,
 118        0x10843094, 0x2537a95e, 0xf46f6ffe, 0xa1ff3b1f, 0x208cfb6a,
 119        0x8f458c74, 0xd9e0a227, 0x4ec73a34,
 120        0xfc884f69, 0x3e4de8df, 0xef0e0088, 0x3559648d, 0x8a45388c,
 121        0x1d804366, 0x721d9bfd, 0xa58684bb,
 122        0xe8256333, 0x844e8212, 0x128d8098, 0xfed33fb4, 0xce280ae1,
 123        0x27e19ba5, 0xd5a6c252, 0xe49754bd,
 124        0xc5d655dd, 0xeb667064, 0x77840b4d, 0xa1b6a801, 0x84db26a9,
 125        0xe0b56714, 0x21f043b7, 0xe5d05860,
 126        0x54f03084, 0x066ff472, 0xa31aa153, 0xdadc4755, 0xb5625dbf,
 127        0x68561be6, 0x83ca6b94, 0x2d6ed23b,
 128        0xeccf01db, 0xa6d3d0ba, 0xb6803d5c, 0xaf77a709, 0x33b4a34c,
 129        0x397bc8d6, 0x5ee22b95, 0x5f0e5304,
 130        0x81ed6f61, 0x20e74364, 0xb45e1378, 0xde18639b, 0x881ca122,
 131        0xb96726d1, 0x8049a7e8, 0x22b7da7b,
 132        0x5e552d25, 0x5272d237, 0x79d2951c, 0xc60d894c, 0x488cb402,
 133        0x1ba4fe5b, 0xa4b09f6b, 0x1ca815cf,
 134        0xa20c3005, 0x8871df63, 0xb9de2fcb, 0x0cc6c9e9, 0x0beeff53,
 135        0xe3214517, 0xb4542835, 0x9f63293c,
 136        0xee41e729, 0x6e1d2d7c, 0x50045286, 0x1e6685f3, 0xf33401c6,
 137        0x30a22c95, 0x31a70850, 0x60930f13,
 138        0x73f98417, 0xa1269859, 0xec645c44, 0x52c877a9, 0xcdff33a6,
 139        0xa02b1741, 0x7cbad9a2, 0x2180036f,
 140        0x50d99c08, 0xcb3f4861, 0xc26bd765, 0x64a3f6ab, 0x80342676,
 141        0x25a75e7b, 0xe4e6d1fc, 0x20c710e6,
 142        0xcdf0b680, 0x17844d3b, 0x31eef84d, 0x7e0824e4, 0x2ccb49eb,
 143        0x846a3bae, 0x8ff77888, 0xee5d60f6,
 144        0x7af75673, 0x2fdd5cdb, 0xa11631c1, 0x30f66f43, 0xb3faec54,
 145        0x157fd7fa, 0xef8579cc, 0xd152de58,
 146        0xdb2ffd5e, 0x8f32ce19, 0x306af97a, 0x02f03ef8, 0x99319ad5,
 147        0xc242fa0f, 0xa7e3ebb0, 0xc68e4906,
 148        0xb8da230c, 0x80823028, 0xdcdef3c8, 0xd35fb171, 0x088a1bc8,
 149        0xbec0c560, 0x61a3c9e8, 0xbca8f54d,
 150        0xc72feffa, 0x22822e99, 0x82c570b4, 0xd8d94e89, 0x8b1c34bc,
 151        0x301e16e6, 0x273be979, 0xb0ffeaa6,
 152        0x61d9b8c6, 0x00b24869, 0xb7ffce3f, 0x08dc283b, 0x43daf65a,
 153        0xf7e19798, 0x7619b72f, 0x8f1c9ba4,
 154        0xdc8637a0, 0x16a7d3b1, 0x9fc393b7, 0xa7136eeb, 0xc6bcc63e,
 155        0x1a513742, 0xef6828bc, 0x520365d6,
 156        0x2d6a77ab, 0x3527ed4b, 0x821fd216, 0x095c6e2e, 0xdb92f2fb,
 157        0x5eea29cb, 0x145892f5, 0x91584f7f,
 158        0x5483697b, 0x2667a8cc, 0x85196048, 0x8c4bacea, 0x833860d4,
 159        0x0d23e0f9, 0x6c387e8a, 0x0ae6d249,
 160        0xb284600c, 0xd835731d, 0xdcb1c647, 0xac4c56ea, 0x3ebd81b3,
 161        0x230eabb0, 0x6438bc87, 0xf0b5b1fa,
 162        0x8f5ea2b3, 0xfc184642, 0x0a036b7a, 0x4fb089bd, 0x649da589,
 163        0xa345415e, 0x5c038323, 0x3e5d3bb9,
 164        0x43d79572, 0x7e6dd07c, 0x06dfdf1e, 0x6c6cc4ef, 0x7160a539,
 165        0x73bfbe70, 0x83877605, 0x4523ecf1
 166};
 167EXPORT_SYMBOL_GPL(cast5_s2);
 168const u32 cast5_s3[256] = {
 169        0x8defc240, 0x25fa5d9f, 0xeb903dbf, 0xe810c907, 0x47607fff,
 170        0x369fe44b, 0x8c1fc644, 0xaececa90,
 171        0xbeb1f9bf, 0xeefbcaea, 0xe8cf1950, 0x51df07ae, 0x920e8806,
 172        0xf0ad0548, 0xe13c8d83, 0x927010d5,
 173        0x11107d9f, 0x07647db9, 0xb2e3e4d4, 0x3d4f285e, 0xb9afa820,
 174        0xfade82e0, 0xa067268b, 0x8272792e,
 175        0x553fb2c0, 0x489ae22b, 0xd4ef9794, 0x125e3fbc, 0x21fffcee,
 176        0x825b1bfd, 0x9255c5ed, 0x1257a240,
 177        0x4e1a8302, 0xbae07fff, 0x528246e7, 0x8e57140e, 0x3373f7bf,
 178        0x8c9f8188, 0xa6fc4ee8, 0xc982b5a5,
 179        0xa8c01db7, 0x579fc264, 0x67094f31, 0xf2bd3f5f, 0x40fff7c1,
 180        0x1fb78dfc, 0x8e6bd2c1, 0x437be59b,
 181        0x99b03dbf, 0xb5dbc64b, 0x638dc0e6, 0x55819d99, 0xa197c81c,
 182        0x4a012d6e, 0xc5884a28, 0xccc36f71,
 183        0xb843c213, 0x6c0743f1, 0x8309893c, 0x0feddd5f, 0x2f7fe850,
 184        0xd7c07f7e, 0x02507fbf, 0x5afb9a04,
 185        0xa747d2d0, 0x1651192e, 0xaf70bf3e, 0x58c31380, 0x5f98302e,
 186        0x727cc3c4, 0x0a0fb402, 0x0f7fef82,
 187        0x8c96fdad, 0x5d2c2aae, 0x8ee99a49, 0x50da88b8, 0x8427f4a0,
 188        0x1eac5790, 0x796fb449, 0x8252dc15,
 189        0xefbd7d9b, 0xa672597d, 0xada840d8, 0x45f54504, 0xfa5d7403,
 190        0xe83ec305, 0x4f91751a, 0x925669c2,
 191        0x23efe941, 0xa903f12e, 0x60270df2, 0x0276e4b6, 0x94fd6574,
 192        0x927985b2, 0x8276dbcb, 0x02778176,
 193        0xf8af918d, 0x4e48f79e, 0x8f616ddf, 0xe29d840e, 0x842f7d83,
 194        0x340ce5c8, 0x96bbb682, 0x93b4b148,
 195        0xef303cab, 0x984faf28, 0x779faf9b, 0x92dc560d, 0x224d1e20,
 196        0x8437aa88, 0x7d29dc96, 0x2756d3dc,
 197        0x8b907cee, 0xb51fd240, 0xe7c07ce3, 0xe566b4a1, 0xc3e9615e,
 198        0x3cf8209d, 0x6094d1e3, 0xcd9ca341,
 199        0x5c76460e, 0x00ea983b, 0xd4d67881, 0xfd47572c, 0xf76cedd9,
 200        0xbda8229c, 0x127dadaa, 0x438a074e,
 201        0x1f97c090, 0x081bdb8a, 0x93a07ebe, 0xb938ca15, 0x97b03cff,
 202        0x3dc2c0f8, 0x8d1ab2ec, 0x64380e51,
 203        0x68cc7bfb, 0xd90f2788, 0x12490181, 0x5de5ffd4, 0xdd7ef86a,
 204        0x76a2e214, 0xb9a40368, 0x925d958f,
 205        0x4b39fffa, 0xba39aee9, 0xa4ffd30b, 0xfaf7933b, 0x6d498623,
 206        0x193cbcfa, 0x27627545, 0x825cf47a,
 207        0x61bd8ba0, 0xd11e42d1, 0xcead04f4, 0x127ea392, 0x10428db7,
 208        0x8272a972, 0x9270c4a8, 0x127de50b,
 209        0x285ba1c8, 0x3c62f44f, 0x35c0eaa5, 0xe805d231, 0x428929fb,
 210        0xb4fcdf82, 0x4fb66a53, 0x0e7dc15b,
 211        0x1f081fab, 0x108618ae, 0xfcfd086d, 0xf9ff2889, 0x694bcc11,
 212        0x236a5cae, 0x12deca4d, 0x2c3f8cc5,
 213        0xd2d02dfe, 0xf8ef5896, 0xe4cf52da, 0x95155b67, 0x494a488c,
 214        0xb9b6a80c, 0x5c8f82bc, 0x89d36b45,
 215        0x3a609437, 0xec00c9a9, 0x44715253, 0x0a874b49, 0xd773bc40,
 216        0x7c34671c, 0x02717ef6, 0x4feb5536,
 217        0xa2d02fff, 0xd2bf60c4, 0xd43f03c0, 0x50b4ef6d, 0x07478cd1,
 218        0x006e1888, 0xa2e53f55, 0xb9e6d4bc,
 219        0xa2048016, 0x97573833, 0xd7207d67, 0xde0f8f3d, 0x72f87b33,
 220        0xabcc4f33, 0x7688c55d, 0x7b00a6b0,
 221        0x947b0001, 0x570075d2, 0xf9bb88f8, 0x8942019e, 0x4264a5ff,
 222        0x856302e0, 0x72dbd92b, 0xee971b69,
 223        0x6ea22fde, 0x5f08ae2b, 0xaf7a616d, 0xe5c98767, 0xcf1febd2,
 224        0x61efc8c2, 0xf1ac2571, 0xcc8239c2,
 225        0x67214cb8, 0xb1e583d1, 0xb7dc3e62, 0x7f10bdce, 0xf90a5c38,
 226        0x0ff0443d, 0x606e6dc6, 0x60543a49,
 227        0x5727c148, 0x2be98a1d, 0x8ab41738, 0x20e1be24, 0xaf96da0f,
 228        0x68458425, 0x99833be5, 0x600d457d,
 229        0x282f9350, 0x8334b362, 0xd91d1120, 0x2b6d8da0, 0x642b1e31,
 230        0x9c305a00, 0x52bce688, 0x1b03588a,
 231        0xf7baefd5, 0x4142ed9c, 0xa4315c11, 0x83323ec5, 0xdfef4636,
 232        0xa133c501, 0xe9d3531c, 0xee353783
 233};
 234EXPORT_SYMBOL_GPL(cast5_s3);
 235const u32 cast5_s4[256] = {
 236        0x9db30420, 0x1fb6e9de, 0xa7be7bef, 0xd273a298, 0x4a4f7bdb,
 237        0x64ad8c57, 0x85510443, 0xfa020ed1,
 238        0x7e287aff, 0xe60fb663, 0x095f35a1, 0x79ebf120, 0xfd059d43,
 239        0x6497b7b1, 0xf3641f63, 0x241e4adf,
 240        0x28147f5f, 0x4fa2b8cd, 0xc9430040, 0x0cc32220, 0xfdd30b30,
 241        0xc0a5374f, 0x1d2d00d9, 0x24147b15,
 242        0xee4d111a, 0x0fca5167, 0x71ff904c, 0x2d195ffe, 0x1a05645f,
 243        0x0c13fefe, 0x081b08ca, 0x05170121,
 244        0x80530100, 0xe83e5efe, 0xac9af4f8, 0x7fe72701, 0xd2b8ee5f,
 245        0x06df4261, 0xbb9e9b8a, 0x7293ea25,
 246        0xce84ffdf, 0xf5718801, 0x3dd64b04, 0xa26f263b, 0x7ed48400,
 247        0x547eebe6, 0x446d4ca0, 0x6cf3d6f5,
 248        0x2649abdf, 0xaea0c7f5, 0x36338cc1, 0x503f7e93, 0xd3772061,
 249        0x11b638e1, 0x72500e03, 0xf80eb2bb,
 250        0xabe0502e, 0xec8d77de, 0x57971e81, 0xe14f6746, 0xc9335400,
 251        0x6920318f, 0x081dbb99, 0xffc304a5,
 252        0x4d351805, 0x7f3d5ce3, 0xa6c866c6, 0x5d5bcca9, 0xdaec6fea,
 253        0x9f926f91, 0x9f46222f, 0x3991467d,
 254        0xa5bf6d8e, 0x1143c44f, 0x43958302, 0xd0214eeb, 0x022083b8,
 255        0x3fb6180c, 0x18f8931e, 0x281658e6,
 256        0x26486e3e, 0x8bd78a70, 0x7477e4c1, 0xb506e07c, 0xf32d0a25,
 257        0x79098b02, 0xe4eabb81, 0x28123b23,
 258        0x69dead38, 0x1574ca16, 0xdf871b62, 0x211c40b7, 0xa51a9ef9,
 259        0x0014377b, 0x041e8ac8, 0x09114003,
 260        0xbd59e4d2, 0xe3d156d5, 0x4fe876d5, 0x2f91a340, 0x557be8de,
 261        0x00eae4a7, 0x0ce5c2ec, 0x4db4bba6,
 262        0xe756bdff, 0xdd3369ac, 0xec17b035, 0x06572327, 0x99afc8b0,
 263        0x56c8c391, 0x6b65811c, 0x5e146119,
 264        0x6e85cb75, 0xbe07c002, 0xc2325577, 0x893ff4ec, 0x5bbfc92d,
 265        0xd0ec3b25, 0xb7801ab7, 0x8d6d3b24,
 266        0x20c763ef, 0xc366a5fc, 0x9c382880, 0x0ace3205, 0xaac9548a,
 267        0xeca1d7c7, 0x041afa32, 0x1d16625a,
 268        0x6701902c, 0x9b757a54, 0x31d477f7, 0x9126b031, 0x36cc6fdb,
 269        0xc70b8b46, 0xd9e66a48, 0x56e55a79,
 270        0x026a4ceb, 0x52437eff, 0x2f8f76b4, 0x0df980a5, 0x8674cde3,
 271        0xedda04eb, 0x17a9be04, 0x2c18f4df,
 272        0xb7747f9d, 0xab2af7b4, 0xefc34d20, 0x2e096b7c, 0x1741a254,
 273        0xe5b6a035, 0x213d42f6, 0x2c1c7c26,
 274        0x61c2f50f, 0x6552daf9, 0xd2c231f8, 0x25130f69, 0xd8167fa2,
 275        0x0418f2c8, 0x001a96a6, 0x0d1526ab,
 276        0x63315c21, 0x5e0a72ec, 0x49bafefd, 0x187908d9, 0x8d0dbd86,
 277        0x311170a7, 0x3e9b640c, 0xcc3e10d7,
 278        0xd5cad3b6, 0x0caec388, 0xf73001e1, 0x6c728aff, 0x71eae2a1,
 279        0x1f9af36e, 0xcfcbd12f, 0xc1de8417,
 280        0xac07be6b, 0xcb44a1d8, 0x8b9b0f56, 0x013988c3, 0xb1c52fca,
 281        0xb4be31cd, 0xd8782806, 0x12a3a4e2,
 282        0x6f7de532, 0x58fd7eb6, 0xd01ee900, 0x24adffc2, 0xf4990fc5,
 283        0x9711aac5, 0x001d7b95, 0x82e5e7d2,
 284        0x109873f6, 0x00613096, 0xc32d9521, 0xada121ff, 0x29908415,
 285        0x7fbb977f, 0xaf9eb3db, 0x29c9ed2a,
 286        0x5ce2a465, 0xa730f32c, 0xd0aa3fe8, 0x8a5cc091, 0xd49e2ce7,
 287        0x0ce454a9, 0xd60acd86, 0x015f1919,
 288        0x77079103, 0xdea03af6, 0x78a8565e, 0xdee356df, 0x21f05cbe,
 289        0x8b75e387, 0xb3c50651, 0xb8a5c3ef,
 290        0xd8eeb6d2, 0xe523be77, 0xc2154529, 0x2f69efdf, 0xafe67afb,
 291        0xf470c4b2, 0xf3e0eb5b, 0xd6cc9876,
 292        0x39e4460c, 0x1fda8538, 0x1987832f, 0xca007367, 0xa99144f8,
 293        0x296b299e, 0x492fc295, 0x9266beab,
 294        0xb5676e69, 0x9bd3ddda, 0xdf7e052f, 0xdb25701c, 0x1b5e51ee,
 295        0xf65324e6, 0x6afce36c, 0x0316cc04,
 296        0x8644213e, 0xb7dc59d0, 0x7965291f, 0xccd6fd43, 0x41823979,
 297        0x932bcdf6, 0xb657c34d, 0x4edfd282,
 298        0x7ae5290c, 0x3cb9536b, 0x851e20fe, 0x9833557e, 0x13ecf0b0,
 299        0xd3ffb372, 0x3f85c5c1, 0x0aef7ed2
 300};
 301EXPORT_SYMBOL_GPL(cast5_s4);
 302static const u32 s5[256] = {
 303        0x7ec90c04, 0x2c6e74b9, 0x9b0e66df, 0xa6337911, 0xb86a7fff,
 304        0x1dd358f5, 0x44dd9d44, 0x1731167f,
 305        0x08fbf1fa, 0xe7f511cc, 0xd2051b00, 0x735aba00, 0x2ab722d8,
 306        0x386381cb, 0xacf6243a, 0x69befd7a,
 307        0xe6a2e77f, 0xf0c720cd, 0xc4494816, 0xccf5c180, 0x38851640,
 308        0x15b0a848, 0xe68b18cb, 0x4caadeff,
 309        0x5f480a01, 0x0412b2aa, 0x259814fc, 0x41d0efe2, 0x4e40b48d,
 310        0x248eb6fb, 0x8dba1cfe, 0x41a99b02,
 311        0x1a550a04, 0xba8f65cb, 0x7251f4e7, 0x95a51725, 0xc106ecd7,
 312        0x97a5980a, 0xc539b9aa, 0x4d79fe6a,
 313        0xf2f3f763, 0x68af8040, 0xed0c9e56, 0x11b4958b, 0xe1eb5a88,
 314        0x8709e6b0, 0xd7e07156, 0x4e29fea7,
 315        0x6366e52d, 0x02d1c000, 0xc4ac8e05, 0x9377f571, 0x0c05372a,
 316        0x578535f2, 0x2261be02, 0xd642a0c9,
 317        0xdf13a280, 0x74b55bd2, 0x682199c0, 0xd421e5ec, 0x53fb3ce8,
 318        0xc8adedb3, 0x28a87fc9, 0x3d959981,
 319        0x5c1ff900, 0xfe38d399, 0x0c4eff0b, 0x062407ea, 0xaa2f4fb1,
 320        0x4fb96976, 0x90c79505, 0xb0a8a774,
 321        0xef55a1ff, 0xe59ca2c2, 0xa6b62d27, 0xe66a4263, 0xdf65001f,
 322        0x0ec50966, 0xdfdd55bc, 0x29de0655,
 323        0x911e739a, 0x17af8975, 0x32c7911c, 0x89f89468, 0x0d01e980,
 324        0x524755f4, 0x03b63cc9, 0x0cc844b2,
 325        0xbcf3f0aa, 0x87ac36e9, 0xe53a7426, 0x01b3d82b, 0x1a9e7449,
 326        0x64ee2d7e, 0xcddbb1da, 0x01c94910,
 327        0xb868bf80, 0x0d26f3fd, 0x9342ede7, 0x04a5c284, 0x636737b6,
 328        0x50f5b616, 0xf24766e3, 0x8eca36c1,
 329        0x136e05db, 0xfef18391, 0xfb887a37, 0xd6e7f7d4, 0xc7fb7dc9,
 330        0x3063fcdf, 0xb6f589de, 0xec2941da,
 331        0x26e46695, 0xb7566419, 0xf654efc5, 0xd08d58b7, 0x48925401,
 332        0xc1bacb7f, 0xe5ff550f, 0xb6083049,
 333        0x5bb5d0e8, 0x87d72e5a, 0xab6a6ee1, 0x223a66ce, 0xc62bf3cd,
 334        0x9e0885f9, 0x68cb3e47, 0x086c010f,
 335        0xa21de820, 0xd18b69de, 0xf3f65777, 0xfa02c3f6, 0x407edac3,
 336        0xcbb3d550, 0x1793084d, 0xb0d70eba,
 337        0x0ab378d5, 0xd951fb0c, 0xded7da56, 0x4124bbe4, 0x94ca0b56,
 338        0x0f5755d1, 0xe0e1e56e, 0x6184b5be,
 339        0x580a249f, 0x94f74bc0, 0xe327888e, 0x9f7b5561, 0xc3dc0280,
 340        0x05687715, 0x646c6bd7, 0x44904db3,
 341        0x66b4f0a3, 0xc0f1648a, 0x697ed5af, 0x49e92ff6, 0x309e374f,
 342        0x2cb6356a, 0x85808573, 0x4991f840,
 343        0x76f0ae02, 0x083be84d, 0x28421c9a, 0x44489406, 0x736e4cb8,
 344        0xc1092910, 0x8bc95fc6, 0x7d869cf4,
 345        0x134f616f, 0x2e77118d, 0xb31b2be1, 0xaa90b472, 0x3ca5d717,
 346        0x7d161bba, 0x9cad9010, 0xaf462ba2,
 347        0x9fe459d2, 0x45d34559, 0xd9f2da13, 0xdbc65487, 0xf3e4f94e,
 348        0x176d486f, 0x097c13ea, 0x631da5c7,
 349        0x445f7382, 0x175683f4, 0xcdc66a97, 0x70be0288, 0xb3cdcf72,
 350        0x6e5dd2f3, 0x20936079, 0x459b80a5,
 351        0xbe60e2db, 0xa9c23101, 0xeba5315c, 0x224e42f2, 0x1c5c1572,
 352        0xf6721b2c, 0x1ad2fff3, 0x8c25404e,
 353        0x324ed72f, 0x4067b7fd, 0x0523138e, 0x5ca3bc78, 0xdc0fd66e,
 354        0x75922283, 0x784d6b17, 0x58ebb16e,
 355        0x44094f85, 0x3f481d87, 0xfcfeae7b, 0x77b5ff76, 0x8c2302bf,
 356        0xaaf47556, 0x5f46b02a, 0x2b092801,
 357        0x3d38f5f7, 0x0ca81f36, 0x52af4a8a, 0x66d5e7c0, 0xdf3b0874,
 358        0x95055110, 0x1b5ad7a8, 0xf61ed5ad,
 359        0x6cf6e479, 0x20758184, 0xd0cefa65, 0x88f7be58, 0x4a046826,
 360        0x0ff6f8f3, 0xa09c7f70, 0x5346aba0,
 361        0x5ce96c28, 0xe176eda3, 0x6bac307f, 0x376829d2, 0x85360fa9,
 362        0x17e3fe2a, 0x24b79767, 0xf5a96b20,
 363        0xd6cd2595, 0x68ff1ebf, 0x7555442c, 0xf19f06be, 0xf9e0659a,
 364        0xeeb9491d, 0x34010718, 0xbb30cab8,
 365        0xe822fe15, 0x88570983, 0x750e6249, 0xda627e55, 0x5e76ffa8,
 366        0xb1534546, 0x6d47de08, 0xefe9e7d4
 367};
 368static const u32 s6[256] = {
 369        0xf6fa8f9d, 0x2cac6ce1, 0x4ca34867, 0xe2337f7c, 0x95db08e7,
 370        0x016843b4, 0xeced5cbc, 0x325553ac,
 371        0xbf9f0960, 0xdfa1e2ed, 0x83f0579d, 0x63ed86b9, 0x1ab6a6b8,
 372        0xde5ebe39, 0xf38ff732, 0x8989b138,
 373        0x33f14961, 0xc01937bd, 0xf506c6da, 0xe4625e7e, 0xa308ea99,
 374        0x4e23e33c, 0x79cbd7cc, 0x48a14367,
 375        0xa3149619, 0xfec94bd5, 0xa114174a, 0xeaa01866, 0xa084db2d,
 376        0x09a8486f, 0xa888614a, 0x2900af98,
 377        0x01665991, 0xe1992863, 0xc8f30c60, 0x2e78ef3c, 0xd0d51932,
 378        0xcf0fec14, 0xf7ca07d2, 0xd0a82072,
 379        0xfd41197e, 0x9305a6b0, 0xe86be3da, 0x74bed3cd, 0x372da53c,
 380        0x4c7f4448, 0xdab5d440, 0x6dba0ec3,
 381        0x083919a7, 0x9fbaeed9, 0x49dbcfb0, 0x4e670c53, 0x5c3d9c01,
 382        0x64bdb941, 0x2c0e636a, 0xba7dd9cd,
 383        0xea6f7388, 0xe70bc762, 0x35f29adb, 0x5c4cdd8d, 0xf0d48d8c,
 384        0xb88153e2, 0x08a19866, 0x1ae2eac8,
 385        0x284caf89, 0xaa928223, 0x9334be53, 0x3b3a21bf, 0x16434be3,
 386        0x9aea3906, 0xefe8c36e, 0xf890cdd9,
 387        0x80226dae, 0xc340a4a3, 0xdf7e9c09, 0xa694a807, 0x5b7c5ecc,
 388        0x221db3a6, 0x9a69a02f, 0x68818a54,
 389        0xceb2296f, 0x53c0843a, 0xfe893655, 0x25bfe68a, 0xb4628abc,
 390        0xcf222ebf, 0x25ac6f48, 0xa9a99387,
 391        0x53bddb65, 0xe76ffbe7, 0xe967fd78, 0x0ba93563, 0x8e342bc1,
 392        0xe8a11be9, 0x4980740d, 0xc8087dfc,
 393        0x8de4bf99, 0xa11101a0, 0x7fd37975, 0xda5a26c0, 0xe81f994f,
 394        0x9528cd89, 0xfd339fed, 0xb87834bf,
 395        0x5f04456d, 0x22258698, 0xc9c4c83b, 0x2dc156be, 0x4f628daa,
 396        0x57f55ec5, 0xe2220abe, 0xd2916ebf,
 397        0x4ec75b95, 0x24f2c3c0, 0x42d15d99, 0xcd0d7fa0, 0x7b6e27ff,
 398        0xa8dc8af0, 0x7345c106, 0xf41e232f,
 399        0x35162386, 0xe6ea8926, 0x3333b094, 0x157ec6f2, 0x372b74af,
 400        0x692573e4, 0xe9a9d848, 0xf3160289,
 401        0x3a62ef1d, 0xa787e238, 0xf3a5f676, 0x74364853, 0x20951063,
 402        0x4576698d, 0xb6fad407, 0x592af950,
 403        0x36f73523, 0x4cfb6e87, 0x7da4cec0, 0x6c152daa, 0xcb0396a8,
 404        0xc50dfe5d, 0xfcd707ab, 0x0921c42f,
 405        0x89dff0bb, 0x5fe2be78, 0x448f4f33, 0x754613c9, 0x2b05d08d,
 406        0x48b9d585, 0xdc049441, 0xc8098f9b,
 407        0x7dede786, 0xc39a3373, 0x42410005, 0x6a091751, 0x0ef3c8a6,
 408        0x890072d6, 0x28207682, 0xa9a9f7be,
 409        0xbf32679d, 0xd45b5b75, 0xb353fd00, 0xcbb0e358, 0x830f220a,
 410        0x1f8fb214, 0xd372cf08, 0xcc3c4a13,
 411        0x8cf63166, 0x061c87be, 0x88c98f88, 0x6062e397, 0x47cf8e7a,
 412        0xb6c85283, 0x3cc2acfb, 0x3fc06976,
 413        0x4e8f0252, 0x64d8314d, 0xda3870e3, 0x1e665459, 0xc10908f0,
 414        0x513021a5, 0x6c5b68b7, 0x822f8aa0,
 415        0x3007cd3e, 0x74719eef, 0xdc872681, 0x073340d4, 0x7e432fd9,
 416        0x0c5ec241, 0x8809286c, 0xf592d891,
 417        0x08a930f6, 0x957ef305, 0xb7fbffbd, 0xc266e96f, 0x6fe4ac98,
 418        0xb173ecc0, 0xbc60b42a, 0x953498da,
 419        0xfba1ae12, 0x2d4bd736, 0x0f25faab, 0xa4f3fceb, 0xe2969123,
 420        0x257f0c3d, 0x9348af49, 0x361400bc,
 421        0xe8816f4a, 0x3814f200, 0xa3f94043, 0x9c7a54c2, 0xbc704f57,
 422        0xda41e7f9, 0xc25ad33a, 0x54f4a084,
 423        0xb17f5505, 0x59357cbe, 0xedbd15c8, 0x7f97c5ab, 0xba5ac7b5,
 424        0xb6f6deaf, 0x3a479c3a, 0x5302da25,
 425        0x653d7e6a, 0x54268d49, 0x51a477ea, 0x5017d55b, 0xd7d25d88,
 426        0x44136c76, 0x0404a8c8, 0xb8e5a121,
 427        0xb81a928a, 0x60ed5869, 0x97c55b96, 0xeaec991b, 0x29935913,
 428        0x01fdb7f1, 0x088e8dfa, 0x9ab6f6f5,
 429        0x3b4cbf9f, 0x4a5de3ab, 0xe6051d35, 0xa0e1d855, 0xd36b4cf1,
 430        0xf544edeb, 0xb0e93524, 0xbebb8fbd,
 431        0xa2d762cf, 0x49c92f54, 0x38b5f331, 0x7128a454, 0x48392905,
 432        0xa65b1db8, 0x851c97bd, 0xd675cf2f
 433};
 434static const u32 s7[256] = {
 435        0x85e04019, 0x332bf567, 0x662dbfff, 0xcfc65693, 0x2a8d7f6f,
 436        0xab9bc912, 0xde6008a1, 0x2028da1f,
 437        0x0227bce7, 0x4d642916, 0x18fac300, 0x50f18b82, 0x2cb2cb11,
 438        0xb232e75c, 0x4b3695f2, 0xb28707de,
 439        0xa05fbcf6, 0xcd4181e9, 0xe150210c, 0xe24ef1bd, 0xb168c381,
 440        0xfde4e789, 0x5c79b0d8, 0x1e8bfd43,
 441        0x4d495001, 0x38be4341, 0x913cee1d, 0x92a79c3f, 0x089766be,
 442        0xbaeeadf4, 0x1286becf, 0xb6eacb19,
 443        0x2660c200, 0x7565bde4, 0x64241f7a, 0x8248dca9, 0xc3b3ad66,
 444        0x28136086, 0x0bd8dfa8, 0x356d1cf2,
 445        0x107789be, 0xb3b2e9ce, 0x0502aa8f, 0x0bc0351e, 0x166bf52a,
 446        0xeb12ff82, 0xe3486911, 0xd34d7516,
 447        0x4e7b3aff, 0x5f43671b, 0x9cf6e037, 0x4981ac83, 0x334266ce,
 448        0x8c9341b7, 0xd0d854c0, 0xcb3a6c88,
 449        0x47bc2829, 0x4725ba37, 0xa66ad22b, 0x7ad61f1e, 0x0c5cbafa,
 450        0x4437f107, 0xb6e79962, 0x42d2d816,
 451        0x0a961288, 0xe1a5c06e, 0x13749e67, 0x72fc081a, 0xb1d139f7,
 452        0xf9583745, 0xcf19df58, 0xbec3f756,
 453        0xc06eba30, 0x07211b24, 0x45c28829, 0xc95e317f, 0xbc8ec511,
 454        0x38bc46e9, 0xc6e6fa14, 0xbae8584a,
 455        0xad4ebc46, 0x468f508b, 0x7829435f, 0xf124183b, 0x821dba9f,
 456        0xaff60ff4, 0xea2c4e6d, 0x16e39264,
 457        0x92544a8b, 0x009b4fc3, 0xaba68ced, 0x9ac96f78, 0x06a5b79a,
 458        0xb2856e6e, 0x1aec3ca9, 0xbe838688,
 459        0x0e0804e9, 0x55f1be56, 0xe7e5363b, 0xb3a1f25d, 0xf7debb85,
 460        0x61fe033c, 0x16746233, 0x3c034c28,
 461        0xda6d0c74, 0x79aac56c, 0x3ce4e1ad, 0x51f0c802, 0x98f8f35a,
 462        0x1626a49f, 0xeed82b29, 0x1d382fe3,
 463        0x0c4fb99a, 0xbb325778, 0x3ec6d97b, 0x6e77a6a9, 0xcb658b5c,
 464        0xd45230c7, 0x2bd1408b, 0x60c03eb7,
 465        0xb9068d78, 0xa33754f4, 0xf430c87d, 0xc8a71302, 0xb96d8c32,
 466        0xebd4e7be, 0xbe8b9d2d, 0x7979fb06,
 467        0xe7225308, 0x8b75cf77, 0x11ef8da4, 0xe083c858, 0x8d6b786f,
 468        0x5a6317a6, 0xfa5cf7a0, 0x5dda0033,
 469        0xf28ebfb0, 0xf5b9c310, 0xa0eac280, 0x08b9767a, 0xa3d9d2b0,
 470        0x79d34217, 0x021a718d, 0x9ac6336a,
 471        0x2711fd60, 0x438050e3, 0x069908a8, 0x3d7fedc4, 0x826d2bef,
 472        0x4eeb8476, 0x488dcf25, 0x36c9d566,
 473        0x28e74e41, 0xc2610aca, 0x3d49a9cf, 0xbae3b9df, 0xb65f8de6,
 474        0x92aeaf64, 0x3ac7d5e6, 0x9ea80509,
 475        0xf22b017d, 0xa4173f70, 0xdd1e16c3, 0x15e0d7f9, 0x50b1b887,
 476        0x2b9f4fd5, 0x625aba82, 0x6a017962,
 477        0x2ec01b9c, 0x15488aa9, 0xd716e740, 0x40055a2c, 0x93d29a22,
 478        0xe32dbf9a, 0x058745b9, 0x3453dc1e,
 479        0xd699296e, 0x496cff6f, 0x1c9f4986, 0xdfe2ed07, 0xb87242d1,
 480        0x19de7eae, 0x053e561a, 0x15ad6f8c,
 481        0x66626c1c, 0x7154c24c, 0xea082b2a, 0x93eb2939, 0x17dcb0f0,
 482        0x58d4f2ae, 0x9ea294fb, 0x52cf564c,
 483        0x9883fe66, 0x2ec40581, 0x763953c3, 0x01d6692e, 0xd3a0c108,
 484        0xa1e7160e, 0xe4f2dfa6, 0x693ed285,
 485        0x74904698, 0x4c2b0edd, 0x4f757656, 0x5d393378, 0xa132234f,
 486        0x3d321c5d, 0xc3f5e194, 0x4b269301,
 487        0xc79f022f, 0x3c997e7e, 0x5e4f9504, 0x3ffafbbd, 0x76f7ad0e,
 488        0x296693f4, 0x3d1fce6f, 0xc61e45be,
 489        0xd3b5ab34, 0xf72bf9b7, 0x1b0434c0, 0x4e72b567, 0x5592a33d,
 490        0xb5229301, 0xcfd2a87f, 0x60aeb767,
 491        0x1814386b, 0x30bcc33d, 0x38a0c07d, 0xfd1606f2, 0xc363519b,
 492        0x589dd390, 0x5479f8e6, 0x1cb8d647,
 493        0x97fd61a9, 0xea7759f4, 0x2d57539d, 0x569a58cf, 0xe84e63ad,
 494        0x462e1b78, 0x6580f87e, 0xf3817914,
 495        0x91da55f4, 0x40a230f3, 0xd1988f35, 0xb6e318d2, 0x3ffa50bc,
 496        0x3d40f021, 0xc3c0bdae, 0x4958c24c,
 497        0x518f36b2, 0x84b1d370, 0x0fedce83, 0x878ddada, 0xf2a279c7,
 498        0x94e01be8, 0x90716f4b, 0x954b8aa3
 499};
 500static const u32 sb8[256] = {
 501        0xe216300d, 0xbbddfffc, 0xa7ebdabd, 0x35648095, 0x7789f8b7,
 502        0xe6c1121b, 0x0e241600, 0x052ce8b5,
 503        0x11a9cfb0, 0xe5952f11, 0xece7990a, 0x9386d174, 0x2a42931c,
 504        0x76e38111, 0xb12def3a, 0x37ddddfc,
 505        0xde9adeb1, 0x0a0cc32c, 0xbe197029, 0x84a00940, 0xbb243a0f,
 506        0xb4d137cf, 0xb44e79f0, 0x049eedfd,
 507        0x0b15a15d, 0x480d3168, 0x8bbbde5a, 0x669ded42, 0xc7ece831,
 508        0x3f8f95e7, 0x72df191b, 0x7580330d,
 509        0x94074251, 0x5c7dcdfa, 0xabbe6d63, 0xaa402164, 0xb301d40a,
 510        0x02e7d1ca, 0x53571dae, 0x7a3182a2,
 511        0x12a8ddec, 0xfdaa335d, 0x176f43e8, 0x71fb46d4, 0x38129022,
 512        0xce949ad4, 0xb84769ad, 0x965bd862,
 513        0x82f3d055, 0x66fb9767, 0x15b80b4e, 0x1d5b47a0, 0x4cfde06f,
 514        0xc28ec4b8, 0x57e8726e, 0x647a78fc,
 515        0x99865d44, 0x608bd593, 0x6c200e03, 0x39dc5ff6, 0x5d0b00a3,
 516        0xae63aff2, 0x7e8bd632, 0x70108c0c,
 517        0xbbd35049, 0x2998df04, 0x980cf42a, 0x9b6df491, 0x9e7edd53,
 518        0x06918548, 0x58cb7e07, 0x3b74ef2e,
 519        0x522fffb1, 0xd24708cc, 0x1c7e27cd, 0xa4eb215b, 0x3cf1d2e2,
 520        0x19b47a38, 0x424f7618, 0x35856039,
 521        0x9d17dee7, 0x27eb35e6, 0xc9aff67b, 0x36baf5b8, 0x09c467cd,
 522        0xc18910b1, 0xe11dbf7b, 0x06cd1af8,
 523        0x7170c608, 0x2d5e3354, 0xd4de495a, 0x64c6d006, 0xbcc0c62c,
 524        0x3dd00db3, 0x708f8f34, 0x77d51b42,
 525        0x264f620f, 0x24b8d2bf, 0x15c1b79e, 0x46a52564, 0xf8d7e54e,
 526        0x3e378160, 0x7895cda5, 0x859c15a5,
 527        0xe6459788, 0xc37bc75f, 0xdb07ba0c, 0x0676a3ab, 0x7f229b1e,
 528        0x31842e7b, 0x24259fd7, 0xf8bef472,
 529        0x835ffcb8, 0x6df4c1f2, 0x96f5b195, 0xfd0af0fc, 0xb0fe134c,
 530        0xe2506d3d, 0x4f9b12ea, 0xf215f225,
 531        0xa223736f, 0x9fb4c428, 0x25d04979, 0x34c713f8, 0xc4618187,
 532        0xea7a6e98, 0x7cd16efc, 0x1436876c,
 533        0xf1544107, 0xbedeee14, 0x56e9af27, 0xa04aa441, 0x3cf7c899,
 534        0x92ecbae6, 0xdd67016d, 0x151682eb,
 535        0xa842eedf, 0xfdba60b4, 0xf1907b75, 0x20e3030f, 0x24d8c29e,
 536        0xe139673b, 0xefa63fb8, 0x71873054,
 537        0xb6f2cf3b, 0x9f326442, 0xcb15a4cc, 0xb01a4504, 0xf1e47d8d,
 538        0x844a1be5, 0xbae7dfdc, 0x42cbda70,
 539        0xcd7dae0a, 0x57e85b7a, 0xd53f5af6, 0x20cf4d8c, 0xcea4d428,
 540        0x79d130a4, 0x3486ebfb, 0x33d3cddc,
 541        0x77853b53, 0x37effcb5, 0xc5068778, 0xe580b3e6, 0x4e68b8f4,
 542        0xc5c8b37e, 0x0d809ea2, 0x398feb7c,
 543        0x132a4f94, 0x43b7950e, 0x2fee7d1c, 0x223613bd, 0xdd06caa2,
 544        0x37df932b, 0xc4248289, 0xacf3ebc3,
 545        0x5715f6b7, 0xef3478dd, 0xf267616f, 0xc148cbe4, 0x9052815e,
 546        0x5e410fab, 0xb48a2465, 0x2eda7fa4,
 547        0xe87b40e4, 0xe98ea084, 0x5889e9e1, 0xefd390fc, 0xdd07d35b,
 548        0xdb485694, 0x38d7e5b2, 0x57720101,
 549        0x730edebc, 0x5b643113, 0x94917e4f, 0x503c2fba, 0x646f1282,
 550        0x7523d24a, 0xe0779695, 0xf9c17a8f,
 551        0x7a5b2121, 0xd187b896, 0x29263a4d, 0xba510cdf, 0x81f47c9f,
 552        0xad1163ed, 0xea7b5965, 0x1a00726e,
 553        0x11403092, 0x00da6d77, 0x4a0cdd61, 0xad1f4603, 0x605bdfb0,
 554        0x9eedc364, 0x22ebe6a8, 0xcee7d28a,
 555        0xa0e736a0, 0x5564a6b9, 0x10853209, 0xc7eb8f37, 0x2de705ca,
 556        0x8951570f, 0xdf09822b, 0xbd691a6c,
 557        0xaa12e4f2, 0x87451c0f, 0xe0f6a27a, 0x3ada4819, 0x4cf1764f,
 558        0x0d771c2b, 0x67cdb156, 0x350d8384,
 559        0x5938fa0f, 0x42399ef3, 0x36997b07, 0x0e84093d, 0x4aa93e61,
 560        0x8360d87b, 0x1fa98b0c, 0x1149382c,
 561        0xe97625a5, 0x0614d1b7, 0x0e25244b, 0x0c768347, 0x589e8d82,
 562        0x0d2059d1, 0xa466bb1e, 0xf8da0a82,
 563        0x04f19130, 0xba6e4ec0, 0x99265164, 0x1ee7230d, 0x50b2ad80,
 564        0xeaee6801, 0x8db2a283, 0xea8bf59e
 565};
 566
 567#define s1 cast5_s1
 568#define s2 cast5_s2
 569#define s3 cast5_s3
 570#define s4 cast5_s4
 571
 572#define F1(D, m, r)  ((I = ((m) + (D))), (I = rol32(I, (r))),   \
 573        (((s1[I >> 24] ^ s2[(I>>16)&0xff]) - s3[(I>>8)&0xff]) + s4[I&0xff]))
 574#define F2(D, m, r)  ((I = ((m) ^ (D))), (I = rol32(I, (r))),   \
 575        (((s1[I >> 24] - s2[(I>>16)&0xff]) + s3[(I>>8)&0xff]) ^ s4[I&0xff]))
 576#define F3(D, m, r)  ((I = ((m) - (D))), (I = rol32(I, (r))),   \
 577        (((s1[I >> 24] + s2[(I>>16)&0xff]) ^ s3[(I>>8)&0xff]) - s4[I&0xff]))
 578
 579
 580void __cast5_encrypt(struct cast5_ctx *c, u8 *outbuf, const u8 *inbuf)
 581{
 582        const __be32 *src = (const __be32 *)inbuf;
 583        __be32 *dst = (__be32 *)outbuf;
 584        u32 l, r, t;
 585        u32 I;                  /* used by the Fx macros */
 586        u32 *Km;
 587        u8 *Kr;
 588
 589        Km = c->Km;
 590        Kr = c->Kr;
 591
 592        /* (L0,R0) <-- (m1...m64).  (Split the plaintext into left and
 593         * right 32-bit halves L0 = m1...m32 and R0 = m33...m64.)
 594         */
 595        l = be32_to_cpu(src[0]);
 596        r = be32_to_cpu(src[1]);
 597
 598        /* (16 rounds) for i from 1 to 16, compute Li and Ri as follows:
 599         *  Li = Ri-1;
 600         *  Ri = Li-1 ^ f(Ri-1,Kmi,Kri), where f is defined in Section 2.2
 601         * Rounds 1, 4, 7, 10, 13, and 16 use f function Type 1.
 602         * Rounds 2, 5, 8, 11, and 14 use f function Type 2.
 603         * Rounds 3, 6, 9, 12, and 15 use f function Type 3.
 604         */
 605
 606        t = l; l = r; r = t ^ F1(r, Km[0], Kr[0]);
 607        t = l; l = r; r = t ^ F2(r, Km[1], Kr[1]);
 608        t = l; l = r; r = t ^ F3(r, Km[2], Kr[2]);
 609        t = l; l = r; r = t ^ F1(r, Km[3], Kr[3]);
 610        t = l; l = r; r = t ^ F2(r, Km[4], Kr[4]);
 611        t = l; l = r; r = t ^ F3(r, Km[5], Kr[5]);
 612        t = l; l = r; r = t ^ F1(r, Km[6], Kr[6]);
 613        t = l; l = r; r = t ^ F2(r, Km[7], Kr[7]);
 614        t = l; l = r; r = t ^ F3(r, Km[8], Kr[8]);
 615        t = l; l = r; r = t ^ F1(r, Km[9], Kr[9]);
 616        t = l; l = r; r = t ^ F2(r, Km[10], Kr[10]);
 617        t = l; l = r; r = t ^ F3(r, Km[11], Kr[11]);
 618        if (!(c->rr)) {
 619                t = l; l = r; r = t ^ F1(r, Km[12], Kr[12]);
 620                t = l; l = r; r = t ^ F2(r, Km[13], Kr[13]);
 621                t = l; l = r; r = t ^ F3(r, Km[14], Kr[14]);
 622                t = l; l = r; r = t ^ F1(r, Km[15], Kr[15]);
 623        }
 624
 625        /* c1...c64 <-- (R16,L16).  (Exchange final blocks L16, R16 and
 626         *  concatenate to form the ciphertext.) */
 627        dst[0] = cpu_to_be32(r);
 628        dst[1] = cpu_to_be32(l);
 629}
 630EXPORT_SYMBOL_GPL(__cast5_encrypt);
 631
 632static void cast5_encrypt(struct crypto_tfm *tfm, u8 *outbuf, const u8 *inbuf)
 633{
 634        __cast5_encrypt(crypto_tfm_ctx(tfm), outbuf, inbuf);
 635}
 636
 637void __cast5_decrypt(struct cast5_ctx *c, u8 *outbuf, const u8 *inbuf)
 638{
 639        const __be32 *src = (const __be32 *)inbuf;
 640        __be32 *dst = (__be32 *)outbuf;
 641        u32 l, r, t;
 642        u32 I;
 643        u32 *Km;
 644        u8 *Kr;
 645
 646        Km = c->Km;
 647        Kr = c->Kr;
 648
 649        l = be32_to_cpu(src[0]);
 650        r = be32_to_cpu(src[1]);
 651
 652        if (!(c->rr)) {
 653                t = l; l = r; r = t ^ F1(r, Km[15], Kr[15]);
 654                t = l; l = r; r = t ^ F3(r, Km[14], Kr[14]);
 655                t = l; l = r; r = t ^ F2(r, Km[13], Kr[13]);
 656                t = l; l = r; r = t ^ F1(r, Km[12], Kr[12]);
 657        }
 658        t = l; l = r; r = t ^ F3(r, Km[11], Kr[11]);
 659        t = l; l = r; r = t ^ F2(r, Km[10], Kr[10]);
 660        t = l; l = r; r = t ^ F1(r, Km[9], Kr[9]);
 661        t = l; l = r; r = t ^ F3(r, Km[8], Kr[8]);
 662        t = l; l = r; r = t ^ F2(r, Km[7], Kr[7]);
 663        t = l; l = r; r = t ^ F1(r, Km[6], Kr[6]);
 664        t = l; l = r; r = t ^ F3(r, Km[5], Kr[5]);
 665        t = l; l = r; r = t ^ F2(r, Km[4], Kr[4]);
 666        t = l; l = r; r = t ^ F1(r, Km[3], Kr[3]);
 667        t = l; l = r; r = t ^ F3(r, Km[2], Kr[2]);
 668        t = l; l = r; r = t ^ F2(r, Km[1], Kr[1]);
 669        t = l; l = r; r = t ^ F1(r, Km[0], Kr[0]);
 670
 671        dst[0] = cpu_to_be32(r);
 672        dst[1] = cpu_to_be32(l);
 673}
 674EXPORT_SYMBOL_GPL(__cast5_decrypt);
 675
 676static void cast5_decrypt(struct crypto_tfm *tfm, u8 *outbuf, const u8 *inbuf)
 677{
 678        __cast5_decrypt(crypto_tfm_ctx(tfm), outbuf, inbuf);
 679}
 680
 681static void key_schedule(u32 *x, u32 *z, u32 *k)
 682{
 683
 684#define xi(i)   ((x[(i)/4] >> (8*(3-((i)%4)))) & 0xff)
 685#define zi(i)   ((z[(i)/4] >> (8*(3-((i)%4)))) & 0xff)
 686
 687        z[0] = x[0] ^ s5[xi(13)] ^ s6[xi(15)] ^ s7[xi(12)] ^ sb8[xi(14)] ^
 688            s7[xi(8)];
 689        z[1] = x[2] ^ s5[zi(0)] ^ s6[zi(2)] ^ s7[zi(1)] ^ sb8[zi(3)] ^
 690            sb8[xi(10)];
 691        z[2] = x[3] ^ s5[zi(7)] ^ s6[zi(6)] ^ s7[zi(5)] ^ sb8[zi(4)] ^
 692            s5[xi(9)];
 693        z[3] = x[1] ^ s5[zi(10)] ^ s6[zi(9)] ^ s7[zi(11)] ^ sb8[zi(8)] ^
 694            s6[xi(11)];
 695        k[0] = s5[zi(8)] ^ s6[zi(9)] ^ s7[zi(7)] ^ sb8[zi(6)] ^ s5[zi(2)];
 696        k[1] = s5[zi(10)] ^ s6[zi(11)] ^ s7[zi(5)] ^ sb8[zi(4)] ^
 697            s6[zi(6)];
 698        k[2] = s5[zi(12)] ^ s6[zi(13)] ^ s7[zi(3)] ^ sb8[zi(2)] ^
 699            s7[zi(9)];
 700        k[3] = s5[zi(14)] ^ s6[zi(15)] ^ s7[zi(1)] ^ sb8[zi(0)] ^
 701            sb8[zi(12)];
 702
 703        x[0] = z[2] ^ s5[zi(5)] ^ s6[zi(7)] ^ s7[zi(4)] ^ sb8[zi(6)] ^
 704            s7[zi(0)];
 705        x[1] = z[0] ^ s5[xi(0)] ^ s6[xi(2)] ^ s7[xi(1)] ^ sb8[xi(3)] ^
 706            sb8[zi(2)];
 707        x[2] = z[1] ^ s5[xi(7)] ^ s6[xi(6)] ^ s7[xi(5)] ^ sb8[xi(4)] ^
 708            s5[zi(1)];
 709        x[3] = z[3] ^ s5[xi(10)] ^ s6[xi(9)] ^ s7[xi(11)] ^ sb8[xi(8)] ^
 710            s6[zi(3)];
 711        k[4] = s5[xi(3)] ^ s6[xi(2)] ^ s7[xi(12)] ^ sb8[xi(13)] ^
 712            s5[xi(8)];
 713        k[5] = s5[xi(1)] ^ s6[xi(0)] ^ s7[xi(14)] ^ sb8[xi(15)] ^
 714            s6[xi(13)];
 715        k[6] = s5[xi(7)] ^ s6[xi(6)] ^ s7[xi(8)] ^ sb8[xi(9)] ^ s7[xi(3)];
 716        k[7] = s5[xi(5)] ^ s6[xi(4)] ^ s7[xi(10)] ^ sb8[xi(11)] ^
 717            sb8[xi(7)];
 718
 719        z[0] = x[0] ^ s5[xi(13)] ^ s6[xi(15)] ^ s7[xi(12)] ^ sb8[xi(14)] ^
 720            s7[xi(8)];
 721        z[1] = x[2] ^ s5[zi(0)] ^ s6[zi(2)] ^ s7[zi(1)] ^ sb8[zi(3)] ^
 722            sb8[xi(10)];
 723        z[2] = x[3] ^ s5[zi(7)] ^ s6[zi(6)] ^ s7[zi(5)] ^ sb8[zi(4)] ^
 724            s5[xi(9)];
 725        z[3] = x[1] ^ s5[zi(10)] ^ s6[zi(9)] ^ s7[zi(11)] ^ sb8[zi(8)] ^
 726            s6[xi(11)];
 727        k[8] = s5[zi(3)] ^ s6[zi(2)] ^ s7[zi(12)] ^ sb8[zi(13)] ^
 728            s5[zi(9)];
 729        k[9] = s5[zi(1)] ^ s6[zi(0)] ^ s7[zi(14)] ^ sb8[zi(15)] ^
 730            s6[zi(12)];
 731        k[10] = s5[zi(7)] ^ s6[zi(6)] ^ s7[zi(8)] ^ sb8[zi(9)] ^ s7[zi(2)];
 732        k[11] = s5[zi(5)] ^ s6[zi(4)] ^ s7[zi(10)] ^ sb8[zi(11)] ^
 733            sb8[zi(6)];
 734
 735        x[0] = z[2] ^ s5[zi(5)] ^ s6[zi(7)] ^ s7[zi(4)] ^ sb8[zi(6)] ^
 736            s7[zi(0)];
 737        x[1] = z[0] ^ s5[xi(0)] ^ s6[xi(2)] ^ s7[xi(1)] ^ sb8[xi(3)] ^
 738            sb8[zi(2)];
 739        x[2] = z[1] ^ s5[xi(7)] ^ s6[xi(6)] ^ s7[xi(5)] ^ sb8[xi(4)] ^
 740            s5[zi(1)];
 741        x[3] = z[3] ^ s5[xi(10)] ^ s6[xi(9)] ^ s7[xi(11)] ^ sb8[xi(8)] ^
 742            s6[zi(3)];
 743        k[12] = s5[xi(8)] ^ s6[xi(9)] ^ s7[xi(7)] ^ sb8[xi(6)] ^ s5[xi(3)];
 744        k[13] = s5[xi(10)] ^ s6[xi(11)] ^ s7[xi(5)] ^ sb8[xi(4)] ^
 745            s6[xi(7)];
 746        k[14] = s5[xi(12)] ^ s6[xi(13)] ^ s7[xi(3)] ^ sb8[xi(2)] ^
 747            s7[xi(8)];
 748        k[15] = s5[xi(14)] ^ s6[xi(15)] ^ s7[xi(1)] ^ sb8[xi(0)] ^
 749            sb8[xi(13)];
 750
 751#undef xi
 752#undef zi
 753}
 754
 755
 756int cast5_setkey(struct crypto_tfm *tfm, const u8 *key, unsigned int key_len)
 757{
 758        struct cast5_ctx *c = crypto_tfm_ctx(tfm);
 759        int i;
 760        u32 x[4];
 761        u32 z[4];
 762        u32 k[16];
 763        __be32 p_key[4];
 764
 765        c->rr = key_len <= 10 ? 1 : 0;
 766
 767        memset(p_key, 0, 16);
 768        memcpy(p_key, key, key_len);
 769
 770
 771        x[0] = be32_to_cpu(p_key[0]);
 772        x[1] = be32_to_cpu(p_key[1]);
 773        x[2] = be32_to_cpu(p_key[2]);
 774        x[3] = be32_to_cpu(p_key[3]);
 775
 776        key_schedule(x, z, k);
 777        for (i = 0; i < 16; i++)
 778                c->Km[i] = k[i];
 779        key_schedule(x, z, k);
 780        for (i = 0; i < 16; i++)
 781                c->Kr[i] = k[i] & 0x1f;
 782        return 0;
 783}
 784EXPORT_SYMBOL_GPL(cast5_setkey);
 785
 786static struct crypto_alg alg = {
 787        .cra_name               = "cast5",
 788        .cra_driver_name        = "cast5-generic",
 789        .cra_priority           = 100,
 790        .cra_flags              = CRYPTO_ALG_TYPE_CIPHER,
 791        .cra_blocksize          = CAST5_BLOCK_SIZE,
 792        .cra_ctxsize            = sizeof(struct cast5_ctx),
 793        .cra_alignmask          = 3,
 794        .cra_module             = THIS_MODULE,
 795        .cra_u                  = {
 796                .cipher = {
 797                        .cia_min_keysize = CAST5_MIN_KEY_SIZE,
 798                        .cia_max_keysize = CAST5_MAX_KEY_SIZE,
 799                        .cia_setkey  = cast5_setkey,
 800                        .cia_encrypt = cast5_encrypt,
 801                        .cia_decrypt = cast5_decrypt
 802                }
 803        }
 804};
 805
 806static int __init cast5_mod_init(void)
 807{
 808        return crypto_register_alg(&alg);
 809}
 810
 811static void __exit cast5_mod_fini(void)
 812{
 813        crypto_unregister_alg(&alg);
 814}
 815
 816module_init(cast5_mod_init);
 817module_exit(cast5_mod_fini);
 818
 819MODULE_LICENSE("GPL");
 820MODULE_DESCRIPTION("Cast5 Cipher Algorithm");
 821MODULE_ALIAS("cast5");
 822
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.