1 /* 2 * Glue Code for assembler optimized version of Camellia 3 * 4 * Copyright (c) 2012 Jussi Kivilinna <jussi.kivilinna@mbnet.fi> 5 * 6 * Camellia parts based on code by: 7 * Copyright (C) 2006 NTT (Nippon Telegraph and Telephone Corporation) 8 * 9 * This program is free software; you can redistribute it and/or modify 10 * it under the terms of the GNU General Public License as published by 11 * the Free Software Foundation; either version 2 of the License, or 12 * (at your option) any later version. 13 * 14 * This program is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 * GNU General Public License for more details. 18 * 19 * You should have received a copy of the GNU General Public License 20 * along with this program; if not, write to the Free Software 21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 22 * USA 23 * 24 */ 25 26 #include <asm/processor.h> 27 #include <asm/unaligned.h> 28 #include <linux/crypto.h> 29 #include <linux/init.h> 30 #include <linux/module.h> 31 #include <linux/types.h> 32 #include <crypto/algapi.h> 33 #include <crypto/lrw.h> 34 #include <crypto/xts.h> 35 #include <asm/crypto/glue_helper.h> 36 37 #define CAMELLIA_MIN_KEY_SIZE 16 38 #define CAMELLIA_MAX_KEY_SIZE 32 39 #define CAMELLIA_BLOCK_SIZE 16 40 #define CAMELLIA_TABLE_BYTE_LEN 272 41 42 struct camellia_ctx { 43 u64 key_table[CAMELLIA_TABLE_BYTE_LEN / sizeof(u64)]; 44 u32 key_length; 45 }; 46 47 /* regular block cipher functions */ 48 asmlinkage void __camellia_enc_blk(struct camellia_ctx *ctx, u8 *dst, 49 const u8 *src, bool xor); 50 asmlinkage void camellia_dec_blk(struct camellia_ctx *ctx, u8 *dst, 51 const u8 *src); 52 53 /* 2-way parallel cipher functions */ 54 asmlinkage void __camellia_enc_blk_2way(struct camellia_ctx *ctx, u8 *dst, 55 const u8 *src, bool xor); 56 asmlinkage void camellia_dec_blk_2way(struct camellia_ctx *ctx, u8 *dst, 57 const u8 *src); 58 59 static inline void camellia_enc_blk(struct camellia_ctx *ctx, u8 *dst, 60 const u8 *src) 61 { 62 __camellia_enc_blk(ctx, dst, src, false); 63 } 64 65 static inline void camellia_enc_blk_xor(struct camellia_ctx *ctx, u8 *dst, 66 const u8 *src) 67 { 68 __camellia_enc_blk(ctx, dst, src, true); 69 } 70 71 static inline void camellia_enc_blk_2way(struct camellia_ctx *ctx, u8 *dst, 72 const u8 *src) 73 { 74 __camellia_enc_blk_2way(ctx, dst, src, false); 75 } 76 77 static inline void camellia_enc_blk_xor_2way(struct camellia_ctx *ctx, u8 *dst, 78 const u8 *src) 79 { 80 __camellia_enc_blk_2way(ctx, dst, src, true); 81 } 82 83 static void camellia_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) 84 { 85 camellia_enc_blk(crypto_tfm_ctx(tfm), dst, src); 86 } 87 88 static void camellia_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) 89 { 90 camellia_dec_blk(crypto_tfm_ctx(tfm), dst, src); 91 } 92 93 /* camellia sboxes */ 94 const u64 camellia_sp10011110[256] = { 95 0x7000007070707000, 0x8200008282828200, 0x2c00002c2c2c2c00, 96 0xec0000ecececec00, 0xb30000b3b3b3b300, 0x2700002727272700, 97 0xc00000c0c0c0c000, 0xe50000e5e5e5e500, 0xe40000e4e4e4e400, 98 0x8500008585858500, 0x5700005757575700, 0x3500003535353500, 99 0xea0000eaeaeaea00, 0x0c00000c0c0c0c00, 0xae0000aeaeaeae00, 100 0x4100004141414100, 0x2300002323232300, 0xef0000efefefef00, 101 0x6b00006b6b6b6b00, 0x9300009393939300, 0x4500004545454500, 102 0x1900001919191900, 0xa50000a5a5a5a500, 0x2100002121212100, 103 0xed0000edededed00, 0x0e00000e0e0e0e00, 0x4f00004f4f4f4f00, 104 0x4e00004e4e4e4e00, 0x1d00001d1d1d1d00, 0x6500006565656500, 105 0x9200009292929200, 0xbd0000bdbdbdbd00, 0x8600008686868600, 106 0xb80000b8b8b8b800, 0xaf0000afafafaf00, 0x8f00008f8f8f8f00, 107 0x7c00007c7c7c7c00, 0xeb0000ebebebeb00, 0x1f00001f1f1f1f00, 108 0xce0000cececece00, 0x3e00003e3e3e3e00, 0x3000003030303000, 109 0xdc0000dcdcdcdc00, 0x5f00005f5f5f5f00, 0x5e00005e5e5e5e00, 110 0xc50000c5c5c5c500, 0x0b00000b0b0b0b00, 0x1a00001a1a1a1a00, 111 0xa60000a6a6a6a600, 0xe10000e1e1e1e100, 0x3900003939393900, 112 0xca0000cacacaca00, 0xd50000d5d5d5d500, 0x4700004747474700, 113 0x5d00005d5d5d5d00, 0x3d00003d3d3d3d00, 0xd90000d9d9d9d900, 114 0x0100000101010100, 0x5a00005a5a5a5a00, 0xd60000d6d6d6d600, 115 0x5100005151515100, 0x5600005656565600, 0x6c00006c6c6c6c00, 116 0x4d00004d4d4d4d00, 0x8b00008b8b8b8b00, 0x0d00000d0d0d0d00, 117 0x9a00009a9a9a9a00, 0x6600006666666600, 0xfb0000fbfbfbfb00, 118 0xcc0000cccccccc00, 0xb00000b0b0b0b000, 0x2d00002d2d2d2d00, 119 0x7400007474747400, 0x1200001212121200, 0x2b00002b2b2b2b00, 120 0x2000002020202000, 0xf00000f0f0f0f000, 0xb10000b1b1b1b100, 121 0x8400008484848400, 0x9900009999999900, 0xdf0000dfdfdfdf00, 122 0x4c00004c4c4c4c00, 0xcb0000cbcbcbcb00, 0xc20000c2c2c2c200, 123 0x3400003434343400, 0x7e00007e7e7e7e00, 0x7600007676767600, 124 0x0500000505050500, 0x6d00006d6d6d6d00, 0xb70000b7b7b7b700, 125 0xa90000a9a9a9a900, 0x3100003131313100, 0xd10000d1d1d1d100, 126 0x1700001717171700, 0x0400000404040400, 0xd70000d7d7d7d700, 127 0x1400001414141400, 0x5800005858585800, 0x3a00003a3a3a3a00, 128 0x6100006161616100, 0xde0000dededede00, 0x1b00001b1b1b1b00, 129 0x1100001111111100, 0x1c00001c1c1c1c00, 0x3200003232323200, 130 0x0f00000f0f0f0f00, 0x9c00009c9c9c9c00, 0x1600001616161600, 131 0x5300005353535300, 0x1800001818181800, 0xf20000f2f2f2f200, 132 0x2200002222222200, 0xfe0000fefefefe00, 0x4400004444444400, 133 0xcf0000cfcfcfcf00, 0xb20000b2b2b2b200, 0xc30000c3c3c3c300, 134 0xb50000b5b5b5b500, 0x7a00007a7a7a7a00, 0x9100009191919100, 135 0x2400002424242400, 0x0800000808080800, 0xe80000e8e8e8e800, 136 0xa80000a8a8a8a800, 0x6000006060606000, 0xfc0000fcfcfcfc00, 137 0x6900006969696900, 0x5000005050505000, 0xaa0000aaaaaaaa00, 138 0xd00000d0d0d0d000, 0xa00000a0a0a0a000, 0x7d00007d7d7d7d00, 139 0xa10000a1a1a1a100, 0x8900008989898900, 0x6200006262626200, 140 0x9700009797979700, 0x5400005454545400, 0x5b00005b5b5b5b00, 141 0x1e00001e1e1e1e00, 0x9500009595959500, 0xe00000e0e0e0e000, 142 0xff0000ffffffff00, 0x6400006464646400, 0xd20000d2d2d2d200, 143 0x1000001010101000, 0xc40000c4c4c4c400, 0x0000000000000000, 144 0x4800004848484800, 0xa30000a3a3a3a300, 0xf70000f7f7f7f700, 145 0x7500007575757500, 0xdb0000dbdbdbdb00, 0x8a00008a8a8a8a00, 146 0x0300000303030300, 0xe60000e6e6e6e600, 0xda0000dadadada00, 147 0x0900000909090900, 0x3f00003f3f3f3f00, 0xdd0000dddddddd00, 148 0x9400009494949400, 0x8700008787878700, 0x5c00005c5c5c5c00, 149 0x8300008383838300, 0x0200000202020200, 0xcd0000cdcdcdcd00, 150 0x4a00004a4a4a4a00, 0x9000009090909000, 0x3300003333333300, 151 0x7300007373737300, 0x6700006767676700, 0xf60000f6f6f6f600, 152 0xf30000f3f3f3f300, 0x9d00009d9d9d9d00, 0x7f00007f7f7f7f00, 153 0xbf0000bfbfbfbf00, 0xe20000e2e2e2e200, 0x5200005252525200, 154 0x9b00009b9b9b9b00, 0xd80000d8d8d8d800, 0x2600002626262600, 155 0xc80000c8c8c8c800, 0x3700003737373700, 0xc60000c6c6c6c600, 156 0x3b00003b3b3b3b00, 0x8100008181818100, 0x9600009696969600, 157 0x6f00006f6f6f6f00, 0x4b00004b4b4b4b00, 0x1300001313131300, 158 0xbe0000bebebebe00, 0x6300006363636300, 0x2e00002e2e2e2e00, 159 0xe90000e9e9e9e900, 0x7900007979797900, 0xa70000a7a7a7a700, 160 0x8c00008c8c8c8c00, 0x9f00009f9f9f9f00, 0x6e00006e6e6e6e00, 161 0xbc0000bcbcbcbc00, 0x8e00008e8e8e8e00, 0x2900002929292900, 162 0xf50000f5f5f5f500, 0xf90000f9f9f9f900, 0xb60000b6b6b6b600, 163 0x2f00002f2f2f2f00, 0xfd0000fdfdfdfd00, 0xb40000b4b4b4b400, 164 0x5900005959595900, 0x7800007878787800, 0x9800009898989800, 165 0x0600000606060600, 0x6a00006a6a6a6a00, 0xe70000e7e7e7e700, 166 0x4600004646464600, 0x7100007171717100, 0xba0000babababa00, 167 0xd40000d4d4d4d400, 0x2500002525252500, 0xab0000abababab00, 168 0x4200004242424200, 0x8800008888888800, 0xa20000a2a2a2a200, 169 0x8d00008d8d8d8d00, 0xfa0000fafafafa00, 0x7200007272727200, 170 0x0700000707070700, 0xb90000b9b9b9b900, 0x5500005555555500, 171 0xf80000f8f8f8f800, 0xee0000eeeeeeee00, 0xac0000acacacac00, 172 0x0a00000a0a0a0a00, 0x3600003636363600, 0x4900004949494900, 173 0x2a00002a2a2a2a00, 0x6800006868686800, 0x3c00003c3c3c3c00, 174 0x3800003838383800, 0xf10000f1f1f1f100, 0xa40000a4a4a4a400, 175 0x4000004040404000, 0x2800002828282800, 0xd30000d3d3d3d300, 176 0x7b00007b7b7b7b00, 0xbb0000bbbbbbbb00, 0xc90000c9c9c9c900, 177 0x4300004343434300, 0xc10000c1c1c1c100, 0x1500001515151500, 178 0xe30000e3e3e3e300, 0xad0000adadadad00, 0xf40000f4f4f4f400, 179 0x7700007777777700, 0xc70000c7c7c7c700, 0x8000008080808000, 180 0x9e00009e9e9e9e00, 181 }; 182 183 const u64 camellia_sp22000222[256] = { 184 0xe0e0000000e0e0e0, 0x0505000000050505, 0x5858000000585858, 185 0xd9d9000000d9d9d9, 0x6767000000676767, 0x4e4e0000004e4e4e, 186 0x8181000000818181, 0xcbcb000000cbcbcb, 0xc9c9000000c9c9c9, 187 0x0b0b0000000b0b0b, 0xaeae000000aeaeae, 0x6a6a0000006a6a6a, 188 0xd5d5000000d5d5d5, 0x1818000000181818, 0x5d5d0000005d5d5d, 189 0x8282000000828282, 0x4646000000464646, 0xdfdf000000dfdfdf, 190 0xd6d6000000d6d6d6, 0x2727000000272727, 0x8a8a0000008a8a8a, 191 0x3232000000323232, 0x4b4b0000004b4b4b, 0x4242000000424242, 192 0xdbdb000000dbdbdb, 0x1c1c0000001c1c1c, 0x9e9e0000009e9e9e, 193 0x9c9c0000009c9c9c, 0x3a3a0000003a3a3a, 0xcaca000000cacaca, 194 0x2525000000252525, 0x7b7b0000007b7b7b, 0x0d0d0000000d0d0d, 195 0x7171000000717171, 0x5f5f0000005f5f5f, 0x1f1f0000001f1f1f, 196 0xf8f8000000f8f8f8, 0xd7d7000000d7d7d7, 0x3e3e0000003e3e3e, 197 0x9d9d0000009d9d9d, 0x7c7c0000007c7c7c, 0x6060000000606060, 198 0xb9b9000000b9b9b9, 0xbebe000000bebebe, 0xbcbc000000bcbcbc, 199 0x8b8b0000008b8b8b, 0x1616000000161616, 0x3434000000343434, 200 0x4d4d0000004d4d4d, 0xc3c3000000c3c3c3, 0x7272000000727272, 201 0x9595000000959595, 0xabab000000ababab, 0x8e8e0000008e8e8e, 202 0xbaba000000bababa, 0x7a7a0000007a7a7a, 0xb3b3000000b3b3b3, 203 0x0202000000020202, 0xb4b4000000b4b4b4, 0xadad000000adadad, 204 0xa2a2000000a2a2a2, 0xacac000000acacac, 0xd8d8000000d8d8d8, 205 0x9a9a0000009a9a9a, 0x1717000000171717, 0x1a1a0000001a1a1a, 206 0x3535000000353535, 0xcccc000000cccccc, 0xf7f7000000f7f7f7, 207 0x9999000000999999, 0x6161000000616161, 0x5a5a0000005a5a5a, 208 0xe8e8000000e8e8e8, 0x2424000000242424, 0x5656000000565656, 209 0x4040000000404040, 0xe1e1000000e1e1e1, 0x6363000000636363, 210 0x0909000000090909, 0x3333000000333333, 0xbfbf000000bfbfbf, 211 0x9898000000989898, 0x9797000000979797, 0x8585000000858585, 212 0x6868000000686868, 0xfcfc000000fcfcfc, 0xecec000000ececec, 213 0x0a0a0000000a0a0a, 0xdada000000dadada, 0x6f6f0000006f6f6f, 214 0x5353000000535353, 0x6262000000626262, 0xa3a3000000a3a3a3, 215 0x2e2e0000002e2e2e, 0x0808000000080808, 0xafaf000000afafaf, 216 0x2828000000282828, 0xb0b0000000b0b0b0, 0x7474000000747474, 217 0xc2c2000000c2c2c2, 0xbdbd000000bdbdbd, 0x3636000000363636, 218 0x2222000000222222, 0x3838000000383838, 0x6464000000646464, 219 0x1e1e0000001e1e1e, 0x3939000000393939, 0x2c2c0000002c2c2c, 220 0xa6a6000000a6a6a6, 0x3030000000303030, 0xe5e5000000e5e5e5, 221 0x4444000000444444, 0xfdfd000000fdfdfd, 0x8888000000888888, 222 0x9f9f0000009f9f9f, 0x6565000000656565, 0x8787000000878787, 223 0x6b6b0000006b6b6b, 0xf4f4000000f4f4f4, 0x2323000000232323, 224 0x4848000000484848, 0x1010000000101010, 0xd1d1000000d1d1d1, 225 0x5151000000515151, 0xc0c0000000c0c0c0, 0xf9f9000000f9f9f9, 226 0xd2d2000000d2d2d2, 0xa0a0000000a0a0a0, 0x5555000000555555, 227 0xa1a1000000a1a1a1, 0x4141000000414141, 0xfafa000000fafafa, 228 0x4343000000434343, 0x1313000000131313, 0xc4c4000000c4c4c4, 229 0x2f2f0000002f2f2f, 0xa8a8000000a8a8a8, 0xb6b6000000b6b6b6, 230 0x3c3c0000003c3c3c, 0x2b2b0000002b2b2b, 0xc1c1000000c1c1c1, 231 0xffff000000ffffff, 0xc8c8000000c8c8c8, 0xa5a5000000a5a5a5, 232 0x2020000000202020, 0x8989000000898989, 0x0000000000000000, 233 0x9090000000909090, 0x4747000000474747, 0xefef000000efefef, 234 0xeaea000000eaeaea, 0xb7b7000000b7b7b7, 0x1515000000151515, 235 0x0606000000060606, 0xcdcd000000cdcdcd, 0xb5b5000000b5b5b5, 236 0x1212000000121212, 0x7e7e0000007e7e7e, 0xbbbb000000bbbbbb, 237 0x2929000000292929, 0x0f0f0000000f0f0f, 0xb8b8000000b8b8b8, 238 0x0707000000070707, 0x0404000000040404, 0x9b9b0000009b9b9b, 239 0x9494000000949494, 0x2121000000212121, 0x6666000000666666, 240 0xe6e6000000e6e6e6, 0xcece000000cecece, 0xeded000000ededed, 241 0xe7e7000000e7e7e7, 0x3b3b0000003b3b3b, 0xfefe000000fefefe, 242 0x7f7f0000007f7f7f, 0xc5c5000000c5c5c5, 0xa4a4000000a4a4a4, 243 0x3737000000373737, 0xb1b1000000b1b1b1, 0x4c4c0000004c4c4c, 244 0x9191000000919191, 0x6e6e0000006e6e6e, 0x8d8d0000008d8d8d, 245 0x7676000000767676, 0x0303000000030303, 0x2d2d0000002d2d2d, 246 0xdede000000dedede, 0x9696000000969696, 0x2626000000262626, 247 0x7d7d0000007d7d7d, 0xc6c6000000c6c6c6, 0x5c5c0000005c5c5c, 248 0xd3d3000000d3d3d3, 0xf2f2000000f2f2f2, 0x4f4f0000004f4f4f, 249 0x1919000000191919, 0x3f3f0000003f3f3f, 0xdcdc000000dcdcdc, 250 0x7979000000797979, 0x1d1d0000001d1d1d, 0x5252000000525252, 251 0xebeb000000ebebeb, 0xf3f3000000f3f3f3, 0x6d6d0000006d6d6d, 252 0x5e5e0000005e5e5e, 0xfbfb000000fbfbfb, 0x6969000000696969, 253 0xb2b2000000b2b2b2, 0xf0f0000000f0f0f0, 0x3131000000313131, 254 0x0c0c0000000c0c0c, 0xd4d4000000d4d4d4, 0xcfcf000000cfcfcf, 255 0x8c8c0000008c8c8c, 0xe2e2000000e2e2e2, 0x7575000000757575, 256 0xa9a9000000a9a9a9, 0x4a4a0000004a4a4a, 0x5757000000575757, 257 0x8484000000848484, 0x1111000000111111, 0x4545000000454545, 258 0x1b1b0000001b1b1b, 0xf5f5000000f5f5f5, 0xe4e4000000e4e4e4, 259 0x0e0e0000000e0e0e, 0x7373000000737373, 0xaaaa000000aaaaaa, 260 0xf1f1000000f1f1f1, 0xdddd000000dddddd, 0x5959000000595959, 261 0x1414000000141414, 0x6c6c0000006c6c6c, 0x9292000000929292, 262 0x5454000000545454, 0xd0d0000000d0d0d0, 0x7878000000787878, 263 0x7070000000707070, 0xe3e3000000e3e3e3, 0x4949000000494949, 264 0x8080000000808080, 0x5050000000505050, 0xa7a7000000a7a7a7, 265 0xf6f6000000f6f6f6, 0x7777000000777777, 0x9393000000939393, 266 0x8686000000868686, 0x8383000000838383, 0x2a2a0000002a2a2a, 267 0xc7c7000000c7c7c7, 0x5b5b0000005b5b5b, 0xe9e9000000e9e9e9, 268 0xeeee000000eeeeee, 0x8f8f0000008f8f8f, 0x0101000000010101, 269 0x3d3d0000003d3d3d, 270 }; 271 272 const u64 camellia_sp03303033[256] = { 273 0x0038380038003838, 0x0041410041004141, 0x0016160016001616, 274 0x0076760076007676, 0x00d9d900d900d9d9, 0x0093930093009393, 275 0x0060600060006060, 0x00f2f200f200f2f2, 0x0072720072007272, 276 0x00c2c200c200c2c2, 0x00abab00ab00abab, 0x009a9a009a009a9a, 277 0x0075750075007575, 0x0006060006000606, 0x0057570057005757, 278 0x00a0a000a000a0a0, 0x0091910091009191, 0x00f7f700f700f7f7, 279 0x00b5b500b500b5b5, 0x00c9c900c900c9c9, 0x00a2a200a200a2a2, 280 0x008c8c008c008c8c, 0x00d2d200d200d2d2, 0x0090900090009090, 281 0x00f6f600f600f6f6, 0x0007070007000707, 0x00a7a700a700a7a7, 282 0x0027270027002727, 0x008e8e008e008e8e, 0x00b2b200b200b2b2, 283 0x0049490049004949, 0x00dede00de00dede, 0x0043430043004343, 284 0x005c5c005c005c5c, 0x00d7d700d700d7d7, 0x00c7c700c700c7c7, 285 0x003e3e003e003e3e, 0x00f5f500f500f5f5, 0x008f8f008f008f8f, 286 0x0067670067006767, 0x001f1f001f001f1f, 0x0018180018001818, 287 0x006e6e006e006e6e, 0x00afaf00af00afaf, 0x002f2f002f002f2f, 288 0x00e2e200e200e2e2, 0x0085850085008585, 0x000d0d000d000d0d, 289 0x0053530053005353, 0x00f0f000f000f0f0, 0x009c9c009c009c9c, 290 0x0065650065006565, 0x00eaea00ea00eaea, 0x00a3a300a300a3a3, 291 0x00aeae00ae00aeae, 0x009e9e009e009e9e, 0x00ecec00ec00ecec, 292 0x0080800080008080, 0x002d2d002d002d2d, 0x006b6b006b006b6b, 293 0x00a8a800a800a8a8, 0x002b2b002b002b2b, 0x0036360036003636, 294 0x00a6a600a600a6a6, 0x00c5c500c500c5c5, 0x0086860086008686, 295 0x004d4d004d004d4d, 0x0033330033003333, 0x00fdfd00fd00fdfd, 296 0x0066660066006666, 0x0058580058005858, 0x0096960096009696, 297 0x003a3a003a003a3a, 0x0009090009000909, 0x0095950095009595, 298 0x0010100010001010, 0x0078780078007878, 0x00d8d800d800d8d8, 299 0x0042420042004242, 0x00cccc00cc00cccc, 0x00efef00ef00efef, 300 0x0026260026002626, 0x00e5e500e500e5e5, 0x0061610061006161, 301 0x001a1a001a001a1a, 0x003f3f003f003f3f, 0x003b3b003b003b3b, 302 0x0082820082008282, 0x00b6b600b600b6b6, 0x00dbdb00db00dbdb, 303 0x00d4d400d400d4d4, 0x0098980098009898, 0x00e8e800e800e8e8, 304 0x008b8b008b008b8b, 0x0002020002000202, 0x00ebeb00eb00ebeb, 305 0x000a0a000a000a0a, 0x002c2c002c002c2c, 0x001d1d001d001d1d, 306 0x00b0b000b000b0b0, 0x006f6f006f006f6f, 0x008d8d008d008d8d, 307 0x0088880088008888, 0x000e0e000e000e0e, 0x0019190019001919, 308 0x0087870087008787, 0x004e4e004e004e4e, 0x000b0b000b000b0b, 309 0x00a9a900a900a9a9, 0x000c0c000c000c0c, 0x0079790079007979, 310 0x0011110011001111, 0x007f7f007f007f7f, 0x0022220022002222, 311 0x00e7e700e700e7e7, 0x0059590059005959, 0x00e1e100e100e1e1, 312 0x00dada00da00dada, 0x003d3d003d003d3d, 0x00c8c800c800c8c8, 313 0x0012120012001212, 0x0004040004000404, 0x0074740074007474, 314 0x0054540054005454, 0x0030300030003030, 0x007e7e007e007e7e, 315 0x00b4b400b400b4b4, 0x0028280028002828, 0x0055550055005555, 316 0x0068680068006868, 0x0050500050005050, 0x00bebe00be00bebe, 317 0x00d0d000d000d0d0, 0x00c4c400c400c4c4, 0x0031310031003131, 318 0x00cbcb00cb00cbcb, 0x002a2a002a002a2a, 0x00adad00ad00adad, 319 0x000f0f000f000f0f, 0x00caca00ca00caca, 0x0070700070007070, 320 0x00ffff00ff00ffff, 0x0032320032003232, 0x0069690069006969, 321 0x0008080008000808, 0x0062620062006262, 0x0000000000000000, 322 0x0024240024002424, 0x00d1d100d100d1d1, 0x00fbfb00fb00fbfb, 323 0x00baba00ba00baba, 0x00eded00ed00eded, 0x0045450045004545, 324 0x0081810081008181, 0x0073730073007373, 0x006d6d006d006d6d, 325 0x0084840084008484, 0x009f9f009f009f9f, 0x00eeee00ee00eeee, 326 0x004a4a004a004a4a, 0x00c3c300c300c3c3, 0x002e2e002e002e2e, 327 0x00c1c100c100c1c1, 0x0001010001000101, 0x00e6e600e600e6e6, 328 0x0025250025002525, 0x0048480048004848, 0x0099990099009999, 329 0x00b9b900b900b9b9, 0x00b3b300b300b3b3, 0x007b7b007b007b7b, 330 0x00f9f900f900f9f9, 0x00cece00ce00cece, 0x00bfbf00bf00bfbf, 331 0x00dfdf00df00dfdf, 0x0071710071007171, 0x0029290029002929, 332 0x00cdcd00cd00cdcd, 0x006c6c006c006c6c, 0x0013130013001313, 333 0x0064640064006464, 0x009b9b009b009b9b, 0x0063630063006363, 334 0x009d9d009d009d9d, 0x00c0c000c000c0c0, 0x004b4b004b004b4b, 335 0x00b7b700b700b7b7, 0x00a5a500a500a5a5, 0x0089890089008989, 336 0x005f5f005f005f5f, 0x00b1b100b100b1b1, 0x0017170017001717, 337 0x00f4f400f400f4f4, 0x00bcbc00bc00bcbc, 0x00d3d300d300d3d3, 338 0x0046460046004646, 0x00cfcf00cf00cfcf, 0x0037370037003737, 339 0x005e5e005e005e5e, 0x0047470047004747, 0x0094940094009494, 340 0x00fafa00fa00fafa, 0x00fcfc00fc00fcfc, 0x005b5b005b005b5b, 341 0x0097970097009797, 0x00fefe00fe00fefe, 0x005a5a005a005a5a, 342 0x00acac00ac00acac, 0x003c3c003c003c3c, 0x004c4c004c004c4c, 343 0x0003030003000303, 0x0035350035003535, 0x00f3f300f300f3f3, 344 0x0023230023002323, 0x00b8b800b800b8b8, 0x005d5d005d005d5d, 345 0x006a6a006a006a6a, 0x0092920092009292, 0x00d5d500d500d5d5, 346 0x0021210021002121, 0x0044440044004444, 0x0051510051005151, 347 0x00c6c600c600c6c6, 0x007d7d007d007d7d, 0x0039390039003939, 348 0x0083830083008383, 0x00dcdc00dc00dcdc, 0x00aaaa00aa00aaaa, 349 0x007c7c007c007c7c, 0x0077770077007777, 0x0056560056005656, 350 0x0005050005000505, 0x001b1b001b001b1b, 0x00a4a400a400a4a4, 351 0x0015150015001515, 0x0034340034003434, 0x001e1e001e001e1e, 352 0x001c1c001c001c1c, 0x00f8f800f800f8f8, 0x0052520052005252, 353 0x0020200020002020, 0x0014140014001414, 0x00e9e900e900e9e9, 354 0x00bdbd00bd00bdbd, 0x00dddd00dd00dddd, 0x00e4e400e400e4e4, 355 0x00a1a100a100a1a1, 0x00e0e000e000e0e0, 0x008a8a008a008a8a, 356 0x00f1f100f100f1f1, 0x00d6d600d600d6d6, 0x007a7a007a007a7a, 357 0x00bbbb00bb00bbbb, 0x00e3e300e300e3e3, 0x0040400040004040, 358 0x004f4f004f004f4f, 359 }; 360 361 const u64 camellia_sp00444404[256] = { 362 0x0000707070700070, 0x00002c2c2c2c002c, 0x0000b3b3b3b300b3, 363 0x0000c0c0c0c000c0, 0x0000e4e4e4e400e4, 0x0000575757570057, 364 0x0000eaeaeaea00ea, 0x0000aeaeaeae00ae, 0x0000232323230023, 365 0x00006b6b6b6b006b, 0x0000454545450045, 0x0000a5a5a5a500a5, 366 0x0000edededed00ed, 0x00004f4f4f4f004f, 0x00001d1d1d1d001d, 367 0x0000929292920092, 0x0000868686860086, 0x0000afafafaf00af, 368 0x00007c7c7c7c007c, 0x00001f1f1f1f001f, 0x00003e3e3e3e003e, 369 0x0000dcdcdcdc00dc, 0x00005e5e5e5e005e, 0x00000b0b0b0b000b, 370 0x0000a6a6a6a600a6, 0x0000393939390039, 0x0000d5d5d5d500d5, 371 0x00005d5d5d5d005d, 0x0000d9d9d9d900d9, 0x00005a5a5a5a005a, 372 0x0000515151510051, 0x00006c6c6c6c006c, 0x00008b8b8b8b008b, 373 0x00009a9a9a9a009a, 0x0000fbfbfbfb00fb, 0x0000b0b0b0b000b0, 374 0x0000747474740074, 0x00002b2b2b2b002b, 0x0000f0f0f0f000f0, 375 0x0000848484840084, 0x0000dfdfdfdf00df, 0x0000cbcbcbcb00cb, 376 0x0000343434340034, 0x0000767676760076, 0x00006d6d6d6d006d, 377 0x0000a9a9a9a900a9, 0x0000d1d1d1d100d1, 0x0000040404040004, 378 0x0000141414140014, 0x00003a3a3a3a003a, 0x0000dededede00de, 379 0x0000111111110011, 0x0000323232320032, 0x00009c9c9c9c009c, 380 0x0000535353530053, 0x0000f2f2f2f200f2, 0x0000fefefefe00fe, 381 0x0000cfcfcfcf00cf, 0x0000c3c3c3c300c3, 0x00007a7a7a7a007a, 382 0x0000242424240024, 0x0000e8e8e8e800e8, 0x0000606060600060, 383 0x0000696969690069, 0x0000aaaaaaaa00aa, 0x0000a0a0a0a000a0, 384 0x0000a1a1a1a100a1, 0x0000626262620062, 0x0000545454540054, 385 0x00001e1e1e1e001e, 0x0000e0e0e0e000e0, 0x0000646464640064, 386 0x0000101010100010, 0x0000000000000000, 0x0000a3a3a3a300a3, 387 0x0000757575750075, 0x00008a8a8a8a008a, 0x0000e6e6e6e600e6, 388 0x0000090909090009, 0x0000dddddddd00dd, 0x0000878787870087, 389 0x0000838383830083, 0x0000cdcdcdcd00cd, 0x0000909090900090, 390 0x0000737373730073, 0x0000f6f6f6f600f6, 0x00009d9d9d9d009d, 391 0x0000bfbfbfbf00bf, 0x0000525252520052, 0x0000d8d8d8d800d8, 392 0x0000c8c8c8c800c8, 0x0000c6c6c6c600c6, 0x0000818181810081, 393 0x00006f6f6f6f006f, 0x0000131313130013, 0x0000636363630063, 394 0x0000e9e9e9e900e9, 0x0000a7a7a7a700a7, 0x00009f9f9f9f009f, 395 0x0000bcbcbcbc00bc, 0x0000292929290029, 0x0000f9f9f9f900f9, 396 0x00002f2f2f2f002f, 0x0000b4b4b4b400b4, 0x0000787878780078, 397 0x0000060606060006, 0x0000e7e7e7e700e7, 0x0000717171710071, 398 0x0000d4d4d4d400d4, 0x0000abababab00ab, 0x0000888888880088, 399 0x00008d8d8d8d008d, 0x0000727272720072, 0x0000b9b9b9b900b9, 400 0x0000f8f8f8f800f8, 0x0000acacacac00ac, 0x0000363636360036, 401 0x00002a2a2a2a002a, 0x00003c3c3c3c003c, 0x0000f1f1f1f100f1, 402 0x0000404040400040, 0x0000d3d3d3d300d3, 0x0000bbbbbbbb00bb, 403 0x0000434343430043, 0x0000151515150015, 0x0000adadadad00ad, 404 0x0000777777770077, 0x0000808080800080, 0x0000828282820082, 405 0x0000ecececec00ec, 0x0000272727270027, 0x0000e5e5e5e500e5, 406 0x0000858585850085, 0x0000353535350035, 0x00000c0c0c0c000c, 407 0x0000414141410041, 0x0000efefefef00ef, 0x0000939393930093, 408 0x0000191919190019, 0x0000212121210021, 0x00000e0e0e0e000e, 409 0x00004e4e4e4e004e, 0x0000656565650065, 0x0000bdbdbdbd00bd, 410 0x0000b8b8b8b800b8, 0x00008f8f8f8f008f, 0x0000ebebebeb00eb, 411 0x0000cececece00ce, 0x0000303030300030, 0x00005f5f5f5f005f, 412 0x0000c5c5c5c500c5, 0x00001a1a1a1a001a, 0x0000e1e1e1e100e1, 413 0x0000cacacaca00ca, 0x0000474747470047, 0x00003d3d3d3d003d, 414 0x0000010101010001, 0x0000d6d6d6d600d6, 0x0000565656560056, 415 0x00004d4d4d4d004d, 0x00000d0d0d0d000d, 0x0000666666660066, 416 0x0000cccccccc00cc, 0x00002d2d2d2d002d, 0x0000121212120012, 417 0x0000202020200020, 0x0000b1b1b1b100b1, 0x0000999999990099, 418 0x00004c4c4c4c004c, 0x0000c2c2c2c200c2, 0x00007e7e7e7e007e, 419 0x0000050505050005, 0x0000b7b7b7b700b7, 0x0000313131310031, 420 0x0000171717170017, 0x0000d7d7d7d700d7, 0x0000585858580058, 421 0x0000616161610061, 0x00001b1b1b1b001b, 0x00001c1c1c1c001c, 422 0x00000f0f0f0f000f, 0x0000161616160016, 0x0000181818180018, 423 0x0000222222220022, 0x0000444444440044, 0x0000b2b2b2b200b2, 424 0x0000b5b5b5b500b5, 0x0000919191910091, 0x0000080808080008, 425 0x0000a8a8a8a800a8, 0x0000fcfcfcfc00fc, 0x0000505050500050, 426 0x0000d0d0d0d000d0, 0x00007d7d7d7d007d, 0x0000898989890089, 427 0x0000979797970097, 0x00005b5b5b5b005b, 0x0000959595950095, 428 0x0000ffffffff00ff, 0x0000d2d2d2d200d2, 0x0000c4c4c4c400c4, 429 0x0000484848480048, 0x0000f7f7f7f700f7, 0x0000dbdbdbdb00db, 430 0x0000030303030003, 0x0000dadadada00da, 0x00003f3f3f3f003f, 431 0x0000949494940094, 0x00005c5c5c5c005c, 0x0000020202020002, 432 0x00004a4a4a4a004a, 0x0000333333330033, 0x0000676767670067, 433 0x0000f3f3f3f300f3, 0x00007f7f7f7f007f, 0x0000e2e2e2e200e2, 434 0x00009b9b9b9b009b, 0x0000262626260026, 0x0000373737370037, 435 0x00003b3b3b3b003b, 0x0000969696960096, 0x00004b4b4b4b004b, 436 0x0000bebebebe00be, 0x00002e2e2e2e002e, 0x0000797979790079, 437 0x00008c8c8c8c008c, 0x00006e6e6e6e006e, 0x00008e8e8e8e008e, 438 0x0000f5f5f5f500f5, 0x0000b6b6b6b600b6, 0x0000fdfdfdfd00fd, 439 0x0000595959590059, 0x0000989898980098, 0x00006a6a6a6a006a, 440 0x0000464646460046, 0x0000babababa00ba, 0x0000252525250025, 441 0x0000424242420042, 0x0000a2a2a2a200a2, 0x0000fafafafa00fa, 442 0x0000070707070007, 0x0000555555550055, 0x0000eeeeeeee00ee, 443 0x00000a0a0a0a000a, 0x0000494949490049, 0x0000686868680068, 444 0x0000383838380038, 0x0000a4a4a4a400a4, 0x0000282828280028, 445 0x00007b7b7b7b007b, 0x0000c9c9c9c900c9, 0x0000c1c1c1c100c1, 446 0x0000e3e3e3e300e3, 0x0000f4f4f4f400f4, 0x0000c7c7c7c700c7, 447 0x00009e9e9e9e009e, 448 }; 449 450 const u64 camellia_sp02220222[256] = { 451 0x00e0e0e000e0e0e0, 0x0005050500050505, 0x0058585800585858, 452 0x00d9d9d900d9d9d9, 0x0067676700676767, 0x004e4e4e004e4e4e, 453 0x0081818100818181, 0x00cbcbcb00cbcbcb, 0x00c9c9c900c9c9c9, 454 0x000b0b0b000b0b0b, 0x00aeaeae00aeaeae, 0x006a6a6a006a6a6a, 455 0x00d5d5d500d5d5d5, 0x0018181800181818, 0x005d5d5d005d5d5d, 456 0x0082828200828282, 0x0046464600464646, 0x00dfdfdf00dfdfdf, 457 0x00d6d6d600d6d6d6, 0x0027272700272727, 0x008a8a8a008a8a8a, 458 0x0032323200323232, 0x004b4b4b004b4b4b, 0x0042424200424242, 459 0x00dbdbdb00dbdbdb, 0x001c1c1c001c1c1c, 0x009e9e9e009e9e9e, 460 0x009c9c9c009c9c9c, 0x003a3a3a003a3a3a, 0x00cacaca00cacaca, 461 0x0025252500252525, 0x007b7b7b007b7b7b, 0x000d0d0d000d0d0d, 462 0x0071717100717171, 0x005f5f5f005f5f5f, 0x001f1f1f001f1f1f, 463 0x00f8f8f800f8f8f8, 0x00d7d7d700d7d7d7, 0x003e3e3e003e3e3e, 464 0x009d9d9d009d9d9d, 0x007c7c7c007c7c7c, 0x0060606000606060, 465 0x00b9b9b900b9b9b9, 0x00bebebe00bebebe, 0x00bcbcbc00bcbcbc, 466 0x008b8b8b008b8b8b, 0x0016161600161616, 0x0034343400343434, 467 0x004d4d4d004d4d4d, 0x00c3c3c300c3c3c3, 0x0072727200727272, 468 0x0095959500959595, 0x00ababab00ababab, 0x008e8e8e008e8e8e, 469 0x00bababa00bababa, 0x007a7a7a007a7a7a, 0x00b3b3b300b3b3b3, 470 0x0002020200020202, 0x00b4b4b400b4b4b4, 0x00adadad00adadad, 471 0x00a2a2a200a2a2a2, 0x00acacac00acacac, 0x00d8d8d800d8d8d8, 472 0x009a9a9a009a9a9a, 0x0017171700171717, 0x001a1a1a001a1a1a, 473 0x0035353500353535, 0x00cccccc00cccccc, 0x00f7f7f700f7f7f7, 474 0x0099999900999999, 0x0061616100616161, 0x005a5a5a005a5a5a, 475 0x00e8e8e800e8e8e8, 0x0024242400242424, 0x0056565600565656, 476 0x0040404000404040, 0x00e1e1e100e1e1e1, 0x0063636300636363, 477 0x0009090900090909, 0x0033333300333333, 0x00bfbfbf00bfbfbf, 478 0x0098989800989898, 0x0097979700979797, 0x0085858500858585, 479 0x0068686800686868, 0x00fcfcfc00fcfcfc, 0x00ececec00ececec, 480 0x000a0a0a000a0a0a, 0x00dadada00dadada, 0x006f6f6f006f6f6f, 481 0x0053535300535353, 0x0062626200626262, 0x00a3a3a300a3a3a3, 482 0x002e2e2e002e2e2e, 0x0008080800080808, 0x00afafaf00afafaf, 483 0x0028282800282828, 0x00b0b0b000b0b0b0, 0x0074747400747474, 484 0x00c2c2c200c2c2c2, 0x00bdbdbd00bdbdbd, 0x0036363600363636, 485 0x0022222200222222, 0x0038383800383838, 0x0064646400646464, 486 0x001e1e1e001e1e1e, 0x0039393900393939, 0x002c2c2c002c2c2c, 487 0x00a6a6a600a6a6a6, 0x0030303000303030, 0x00e5e5e500e5e5e5, 488 0x0044444400444444, 0x00fdfdfd00fdfdfd, 0x0088888800888888, 489 0x009f9f9f009f9f9f, 0x0065656500656565, 0x0087878700878787, 490 0x006b6b6b006b6b6b, 0x00f4f4f400f4f4f4, 0x0023232300232323, 491 0x0048484800484848, 0x0010101000101010, 0x00d1d1d100d1d1d1, 492 0x0051515100515151, 0x00c0c0c000c0c0c0, 0x00f9f9f900f9f9f9, 493 0x00d2d2d200d2d2d2, 0x00a0a0a000a0a0a0, 0x0055555500555555, 494 0x00a1a1a100a1a1a1, 0x0041414100414141, 0x00fafafa00fafafa, 495 0x0043434300434343, 0x0013131300131313, 0x00c4c4c400c4c4c4, 496 0x002f2f2f002f2f2f, 0x00a8a8a800a8a8a8, 0x00b6b6b600b6b6b6, 497 0x003c3c3c003c3c3c, 0x002b2b2b002b2b2b, 0x00c1c1c100c1c1c1, 498 0x00ffffff00ffffff, 0x00c8c8c800c8c8c8, 0x00a5a5a500a5a5a5, 499 0x0020202000202020, 0x0089898900898989, 0x0000000000000000, 500 0x0090909000909090, 0x0047474700474747, 0x00efefef00efefef, 501 0x00eaeaea00eaeaea, 0x00b7b7b700b7b7b7, 0x0015151500151515, 502 0x0006060600060606, 0x00cdcdcd00cdcdcd, 0x00b5b5b500b5b5b5, 503 0x0012121200121212, 0x007e7e7e007e7e7e, 0x00bbbbbb00bbbbbb, 504 0x0029292900292929, 0x000f0f0f000f0f0f, 0x00b8b8b800b8b8b8, 505 0x0007070700070707, 0x0004040400040404, 0x009b9b9b009b9b9b, 506 0x0094949400949494, 0x0021212100212121, 0x0066666600666666, 507 0x00e6e6e600e6e6e6, 0x00cecece00cecece, 0x00ededed00ededed, 508 0x00e7e7e700e7e7e7, 0x003b3b3b003b3b3b, 0x00fefefe00fefefe, 509 0x007f7f7f007f7f7f, 0x00c5c5c500c5c5c5, 0x00a4a4a400a4a4a4, 510 0x0037373700373737, 0x00b1b1b100b1b1b1, 0x004c4c4c004c4c4c, 511 0x0091919100919191, 0x006e6e6e006e6e6e, 0x008d8d8d008d8d8d, 512 0x0076767600767676, 0x0003030300030303, 0x002d2d2d002d2d2d, 513 0x00dedede00dedede, 0x0096969600969696, 0x0026262600262626, 514 0x007d7d7d007d7d7d, 0x00c6c6c600c6c6c6, 0x005c5c5c005c5c5c, 515 0x00d3d3d300d3d3d3, 0x00f2f2f200f2f2f2, 0x004f4f4f004f4f4f, 516 0x0019191900191919, 0x003f3f3f003f3f3f, 0x00dcdcdc00dcdcdc, 517 0x0079797900797979, 0x001d1d1d001d1d1d, 0x0052525200525252, 518 0x00ebebeb00ebebeb, 0x00f3f3f300f3f3f3, 0x006d6d6d006d6d6d, 519 0x005e5e5e005e5e5e, 0x00fbfbfb00fbfbfb, 0x0069696900696969, 520 0x00b2b2b200b2b2b2, 0x00f0f0f000f0f0f0, 0x0031313100313131, 521 0x000c0c0c000c0c0c, 0x00d4d4d400d4d4d4, 0x00cfcfcf00cfcfcf, 522 0x008c8c8c008c8c8c, 0x00e2e2e200e2e2e2, 0x0075757500757575, 523 0x00a9a9a900a9a9a9, 0x004a4a4a004a4a4a, 0x0057575700575757, 524 0x0084848400848484, 0x0011111100111111, 0x0045454500454545, 525 0x001b1b1b001b1b1b, 0x00f5f5f500f5f5f5, 0x00e4e4e400e4e4e4, 526 0x000e0e0e000e0e0e, 0x0073737300737373, 0x00aaaaaa00aaaaaa, 527 0x00f1f1f100f1f1f1, 0x00dddddd00dddddd, 0x0059595900595959, 528 0x0014141400141414, 0x006c6c6c006c6c6c, 0x0092929200929292, 529 0x0054545400545454, 0x00d0d0d000d0d0d0, 0x0078787800787878, 530 0x0070707000707070, 0x00e3e3e300e3e3e3, 0x0049494900494949, 531 0x0080808000808080, 0x0050505000505050, 0x00a7a7a700a7a7a7, 532 0x00f6f6f600f6f6f6, 0x0077777700777777, 0x0093939300939393, 533 0x0086868600868686, 0x0083838300838383, 0x002a2a2a002a2a2a, 534 0x00c7c7c700c7c7c7, 0x005b5b5b005b5b5b, 0x00e9e9e900e9e9e9, 535 0x00eeeeee00eeeeee, 0x008f8f8f008f8f8f, 0x0001010100010101, 536 0x003d3d3d003d3d3d, 537 }; 538 539 const u64 camellia_sp30333033[256] = { 540 0x3800383838003838, 0x4100414141004141, 0x1600161616001616, 541 0x7600767676007676, 0xd900d9d9d900d9d9, 0x9300939393009393, 542 0x6000606060006060, 0xf200f2f2f200f2f2, 0x7200727272007272, 543 0xc200c2c2c200c2c2, 0xab00ababab00abab, 0x9a009a9a9a009a9a, 544 0x7500757575007575, 0x0600060606000606, 0x5700575757005757, 545 0xa000a0a0a000a0a0, 0x9100919191009191, 0xf700f7f7f700f7f7, 546 0xb500b5b5b500b5b5, 0xc900c9c9c900c9c9, 0xa200a2a2a200a2a2, 547 0x8c008c8c8c008c8c, 0xd200d2d2d200d2d2, 0x9000909090009090, 548 0xf600f6f6f600f6f6, 0x0700070707000707, 0xa700a7a7a700a7a7, 549 0x2700272727002727, 0x8e008e8e8e008e8e, 0xb200b2b2b200b2b2, 550 0x4900494949004949, 0xde00dedede00dede, 0x4300434343004343, 551 0x5c005c5c5c005c5c, 0xd700d7d7d700d7d7, 0xc700c7c7c700c7c7, 552 0x3e003e3e3e003e3e, 0xf500f5f5f500f5f5, 0x8f008f8f8f008f8f, 553 0x6700676767006767, 0x1f001f1f1f001f1f, 0x1800181818001818, 554 0x6e006e6e6e006e6e, 0xaf00afafaf00afaf, 0x2f002f2f2f002f2f, 555 0xe200e2e2e200e2e2, 0x8500858585008585, 0x0d000d0d0d000d0d, 556 0x5300535353005353, 0xf000f0f0f000f0f0, 0x9c009c9c9c009c9c, 557 0x6500656565006565, 0xea00eaeaea00eaea, 0xa300a3a3a300a3a3, 558 0xae00aeaeae00aeae, 0x9e009e9e9e009e9e, 0xec00ececec00ecec, 559 0x8000808080008080, 0x2d002d2d2d002d2d, 0x6b006b6b6b006b6b, 560 0xa800a8a8a800a8a8, 0x2b002b2b2b002b2b, 0x3600363636003636, 561 0xa600a6a6a600a6a6, 0xc500c5c5c500c5c5, 0x8600868686008686, 562 0x4d004d4d4d004d4d, 0x3300333333003333, 0xfd00fdfdfd00fdfd, 563 0x6600666666006666, 0x5800585858005858, 0x9600969696009696, 564 0x3a003a3a3a003a3a, 0x0900090909000909, 0x9500959595009595, 565 0x1000101010001010, 0x7800787878007878, 0xd800d8d8d800d8d8, 566 0x4200424242004242, 0xcc00cccccc00cccc, 0xef00efefef00efef, 567 0x2600262626002626, 0xe500e5e5e500e5e5, 0x6100616161006161, 568 0x1a001a1a1a001a1a, 0x3f003f3f3f003f3f, 0x3b003b3b3b003b3b, 569 0x8200828282008282, 0xb600b6b6b600b6b6, 0xdb00dbdbdb00dbdb, 570 0xd400d4d4d400d4d4, 0x9800989898009898, 0xe800e8e8e800e8e8, 571 0x8b008b8b8b008b8b, 0x0200020202000202, 0xeb00ebebeb00ebeb, 572 0x0a000a0a0a000a0a, 0x2c002c2c2c002c2c, 0x1d001d1d1d001d1d, 573 0xb000b0b0b000b0b0, 0x6f006f6f6f006f6f, 0x8d008d8d8d008d8d, 574 0x8800888888008888, 0x0e000e0e0e000e0e, 0x1900191919001919, 575 0x8700878787008787, 0x4e004e4e4e004e4e, 0x0b000b0b0b000b0b, 576 0xa900a9a9a900a9a9, 0x0c000c0c0c000c0c, 0x7900797979007979, 577 0x1100111111001111, 0x7f007f7f7f007f7f, 0x2200222222002222, 578 0xe700e7e7e700e7e7, 0x5900595959005959, 0xe100e1e1e100e1e1, 579 0xda00dadada00dada, 0x3d003d3d3d003d3d, 0xc800c8c8c800c8c8, 580 0x1200121212001212, 0x0400040404000404, 0x7400747474007474, 581 0x5400545454005454, 0x3000303030003030, 0x7e007e7e7e007e7e, 582 0xb400b4b4b400b4b4, 0x2800282828002828, 0x5500555555005555, 583 0x6800686868006868, 0x5000505050005050, 0xbe00bebebe00bebe, 584 0xd000d0d0d000d0d0, 0xc400c4c4c400c4c4, 0x3100313131003131, 585 0xcb00cbcbcb00cbcb, 0x2a002a2a2a002a2a, 0xad00adadad00adad, 586 0x0f000f0f0f000f0f, 0xca00cacaca00caca, 0x7000707070007070, 587 0xff00ffffff00ffff, 0x3200323232003232, 0x6900696969006969, 588 0x0800080808000808, 0x6200626262006262, 0x0000000000000000, 589 0x2400242424002424, 0xd100d1d1d100d1d1, 0xfb00fbfbfb00fbfb, 590 0xba00bababa00baba, 0xed00ededed00eded, 0x4500454545004545, 591 0x8100818181008181, 0x7300737373007373, 0x6d006d6d6d006d6d, 592 0x8400848484008484, 0x9f009f9f9f009f9f, 0xee00eeeeee00eeee, 593 0x4a004a4a4a004a4a, 0xc300c3c3c300c3c3, 0x2e002e2e2e002e2e, 594 0xc100c1c1c100c1c1, 0x0100010101000101, 0xe600e6e6e600e6e6, 595 0x2500252525002525, 0x4800484848004848, 0x9900999999009999, 596 0xb900b9b9b900b9b9, 0xb300b3b3b300b3b3, 0x7b007b7b7b007b7b, 597 0xf900f9f9f900f9f9, 0xce00cecece00cece, 0xbf00bfbfbf00bfbf, 598 0xdf00dfdfdf00dfdf, 0x7100717171007171, 0x2900292929002929, 599 0xcd00cdcdcd00cdcd, 0x6c006c6c6c006c6c, 0x1300131313001313, 600 0x6400646464006464, 0x9b009b9b9b009b9b, 0x6300636363006363, 601 0x9d009d9d9d009d9d, 0xc000c0c0c000c0c0, 0x4b004b4b4b004b4b, 602 0xb700b7b7b700b7b7, 0xa500a5a5a500a5a5, 0x8900898989008989, 603 0x5f005f5f5f005f5f, 0xb100b1b1b100b1b1, 0x1700171717001717, 604 0xf400f4f4f400f4f4, 0xbc00bcbcbc00bcbc, 0xd300d3d3d300d3d3, 605 0x4600464646004646, 0xcf00cfcfcf00cfcf, 0x3700373737003737, 606 0x5e005e5e5e005e5e, 0x4700474747004747, 0x9400949494009494, 607 0xfa00fafafa00fafa, 0xfc00fcfcfc00fcfc, 0x5b005b5b5b005b5b, 608 0x9700979797009797, 0xfe00fefefe00fefe, 0x5a005a5a5a005a5a, 609 0xac00acacac00acac, 0x3c003c3c3c003c3c, 0x4c004c4c4c004c4c, 610 0x0300030303000303, 0x3500353535003535, 0xf300f3f3f300f3f3, 611 0x2300232323002323, 0xb800b8b8b800b8b8, 0x5d005d5d5d005d5d, 612 0x6a006a6a6a006a6a, 0x9200929292009292, 0xd500d5d5d500d5d5, 613 0x2100212121002121, 0x4400444444004444, 0x5100515151005151, 614 0xc600c6c6c600c6c6, 0x7d007d7d7d007d7d, 0x3900393939003939, 615 0x8300838383008383, 0xdc00dcdcdc00dcdc, 0xaa00aaaaaa00aaaa, 616 0x7c007c7c7c007c7c, 0x7700777777007777, 0x5600565656005656, 617 0x0500050505000505, 0x1b001b1b1b001b1b, 0xa400a4a4a400a4a4, 618 0x1500151515001515, 0x3400343434003434, 0x1e001e1e1e001e1e, 619 0x1c001c1c1c001c1c, 0xf800f8f8f800f8f8, 0x5200525252005252, 620 0x2000202020002020, 0x1400141414001414, 0xe900e9e9e900e9e9, 621 0xbd00bdbdbd00bdbd, 0xdd00dddddd00dddd, 0xe400e4e4e400e4e4, 622 0xa100a1a1a100a1a1, 0xe000e0e0e000e0e0, 0x8a008a8a8a008a8a, 623 0xf100f1f1f100f1f1, 0xd600d6d6d600d6d6, 0x7a007a7a7a007a7a, 624 0xbb00bbbbbb00bbbb, 0xe300e3e3e300e3e3, 0x4000404040004040, 625 0x4f004f4f4f004f4f, 626 }; 627 628 const u64 camellia_sp44044404[256] = { 629 0x7070007070700070, 0x2c2c002c2c2c002c, 0xb3b300b3b3b300b3, 630 0xc0c000c0c0c000c0, 0xe4e400e4e4e400e4, 0x5757005757570057, 631 0xeaea00eaeaea00ea, 0xaeae00aeaeae00ae, 0x2323002323230023, 632 0x6b6b006b6b6b006b, 0x4545004545450045, 0xa5a500a5a5a500a5, 633 0xeded00ededed00ed, 0x4f4f004f4f4f004f, 0x1d1d001d1d1d001d, 634 0x9292009292920092, 0x8686008686860086, 0xafaf00afafaf00af, 635 0x7c7c007c7c7c007c, 0x1f1f001f1f1f001f, 0x3e3e003e3e3e003e, 636 0xdcdc00dcdcdc00dc, 0x5e5e005e5e5e005e, 0x0b0b000b0b0b000b, 637 0xa6a600a6a6a600a6, 0x3939003939390039, 0xd5d500d5d5d500d5, 638 0x5d5d005d5d5d005d, 0xd9d900d9d9d900d9, 0x5a5a005a5a5a005a, 639 0x5151005151510051, 0x6c6c006c6c6c006c, 0x8b8b008b8b8b008b, 640 0x9a9a009a9a9a009a, 0xfbfb00fbfbfb00fb, 0xb0b000b0b0b000b0, 641 0x7474007474740074, 0x2b2b002b2b2b002b, 0xf0f000f0f0f000f0, 642 0x8484008484840084, 0xdfdf00dfdfdf00df, 0xcbcb00cbcbcb00cb, 643 0x3434003434340034, 0x7676007676760076, 0x6d6d006d6d6d006d, 644 0xa9a900a9a9a900a9, 0xd1d100d1d1d100d1, 0x0404000404040004, 645 0x1414001414140014, 0x3a3a003a3a3a003a, 0xdede00dedede00de, 646 0x1111001111110011, 0x3232003232320032, 0x9c9c009c9c9c009c, 647 0x5353005353530053, 0xf2f200f2f2f200f2, 0xfefe00fefefe00fe, 648 0xcfcf00cfcfcf00cf, 0xc3c300c3c3c300c3, 0x7a7a007a7a7a007a, 649 0x2424002424240024, 0xe8e800e8e8e800e8, 0x6060006060600060, 650 0x6969006969690069, 0xaaaa00aaaaaa00aa, 0xa0a000a0a0a000a0, 651 0xa1a100a1a1a100a1, 0x6262006262620062, 0x5454005454540054, 652 0x1e1e001e1e1e001e, 0xe0e000e0e0e000e0, 0x6464006464640064, 653 0x1010001010100010, 0x0000000000000000, 0xa3a300a3a3a300a3, 654 0x7575007575750075, 0x8a8a008a8a8a008a, 0xe6e600e6e6e600e6, 655 0x0909000909090009, 0xdddd00dddddd00dd, 0x8787008787870087, 656 0x8383008383830083, 0xcdcd00cdcdcd00cd, 0x9090009090900090, 657 0x7373007373730073, 0xf6f600f6f6f600f6, 0x9d9d009d9d9d009d, 658 0xbfbf00bfbfbf00bf, 0x5252005252520052, 0xd8d800d8d8d800d8, 659 0xc8c800c8c8c800c8, 0xc6c600c6c6c600c6, 0x8181008181810081, 660 0x6f6f006f6f6f006f, 0x1313001313130013, 0x6363006363630063, 661 0xe9e900e9e9e900e9, 0xa7a700a7a7a700a7, 0x9f9f009f9f9f009f, 662 0xbcbc00bcbcbc00bc, 0x2929002929290029, 0xf9f900f9f9f900f9, 663 0x2f2f002f2f2f002f, 0xb4b400b4b4b400b4, 0x7878007878780078, 664 0x0606000606060006, 0xe7e700e7e7e700e7, 0x7171007171710071, 665 0xd4d400d4d4d400d4, 0xabab00ababab00ab, 0x8888008888880088, 666 0x8d8d008d8d8d008d, 0x7272007272720072, 0xb9b900b9b9b900b9, 667 0xf8f800f8f8f800f8, 0xacac00acacac00ac, 0x3636003636360036, 668 0x2a2a002a2a2a002a, 0x3c3c003c3c3c003c, 0xf1f100f1f1f100f1, 669 0x4040004040400040, 0xd3d300d3d3d300d3, 0xbbbb00bbbbbb00bb, 670 0x4343004343430043, 0x1515001515150015, 0xadad00adadad00ad, 671 0x7777007777770077, 0x8080008080800080, 0x8282008282820082, 672 0xecec00ececec00ec, 0x2727002727270027, 0xe5e500e5e5e500e5, 673 0x8585008585850085, 0x3535003535350035, 0x0c0c000c0c0c000c, 674 0x4141004141410041, 0xefef00efefef00ef, 0x9393009393930093, 675 0x1919001919190019, 0x2121002121210021, 0x0e0e000e0e0e000e, 676 0x4e4e004e4e4e004e, 0x6565006565650065, 0xbdbd00bdbdbd00bd, 677 0xb8b800b8b8b800b8, 0x8f8f008f8f8f008f, 0xebeb00ebebeb00eb, 678 0xcece00cecece00ce, 0x3030003030300030, 0x5f5f005f5f5f005f, 679 0xc5c500c5c5c500c5, 0x1a1a001a1a1a001a, 0xe1e100e1e1e100e1, 680 0xcaca00cacaca00ca, 0x4747004747470047, 0x3d3d003d3d3d003d, 681 0x0101000101010001, 0xd6d600d6d6d600d6, 0x5656005656560056, 682 0x4d4d004d4d4d004d, 0x0d0d000d0d0d000d, 0x6666006666660066, 683 0xcccc00cccccc00cc, 0x2d2d002d2d2d002d, 0x1212001212120012, 684 0x2020002020200020, 0xb1b100b1b1b100b1, 0x9999009999990099, 685 0x4c4c004c4c4c004c, 0xc2c200c2c2c200c2, 0x7e7e007e7e7e007e, 686 0x0505000505050005, 0xb7b700b7b7b700b7, 0x3131003131310031, 687 0x1717001717170017, 0xd7d700d7d7d700d7, 0x5858005858580058, 688 0x6161006161610061, 0x1b1b001b1b1b001b, 0x1c1c001c1c1c001c, 689 0x0f0f000f0f0f000f, 0x1616001616160016, 0x1818001818180018, 690 0x2222002222220022, 0x4444004444440044, 0xb2b200b2b2b200b2, 691 0xb5b500b5b5b500b5, 0x9191009191910091, 0x0808000808080008, 692 0xa8a800a8a8a800a8, 0xfcfc00fcfcfc00fc, 0x5050005050500050, 693 0xd0d000d0d0d000d0, 0x7d7d007d7d7d007d, 0x8989008989890089, 694 0x9797009797970097, 0x5b5b005b5b5b005b, 0x9595009595950095, 695 0xffff00ffffff00ff, 0xd2d200d2d2d200d2, 0xc4c400c4c4c400c4, 696 0x4848004848480048, 0xf7f700f7f7f700f7, 0xdbdb00dbdbdb00db, 697 0x0303000303030003, 0xdada00dadada00da, 0x3f3f003f3f3f003f, 698 0x9494009494940094, 0x5c5c005c5c5c005c, 0x0202000202020002, 699 0x4a4a004a4a4a004a, 0x3333003333330033, 0x6767006767670067, 700 0xf3f300f3f3f300f3, 0x7f7f007f7f7f007f, 0xe2e200e2e2e200e2, 701 0x9b9b009b9b9b009b, 0x2626002626260026, 0x3737003737370037, 702 0x3b3b003b3b3b003b, 0x9696009696960096, 0x4b4b004b4b4b004b, 703 0xbebe00bebebe00be, 0x2e2e002e2e2e002e, 0x7979007979790079, 704 0x8c8c008c8c8c008c, 0x6e6e006e6e6e006e, 0x8e8e008e8e8e008e, 705 0xf5f500f5f5f500f5, 0xb6b600b6b6b600b6, 0xfdfd00fdfdfd00fd, 706 0x5959005959590059, 0x9898009898980098, 0x6a6a006a6a6a006a, 707 0x4646004646460046, 0xbaba00bababa00ba, 0x2525002525250025, 708 0x4242004242420042, 0xa2a200a2a2a200a2, 0xfafa00fafafa00fa, 709 0x0707000707070007, 0x5555005555550055, 0xeeee00eeeeee00ee, 710 0x0a0a000a0a0a000a, 0x4949004949490049, 0x6868006868680068, 711 0x3838003838380038, 0xa4a400a4a4a400a4, 0x2828002828280028, 712 0x7b7b007b7b7b007b, 0xc9c900c9c9c900c9, 0xc1c100c1c1c100c1, 713 0xe3e300e3e3e300e3, 0xf4f400f4f4f400f4, 0xc7c700c7c7c700c7, 714 0x9e9e009e9e9e009e, 715 }; 716 717 const u64 camellia_sp11101110[256] = { 718 0x7070700070707000, 0x8282820082828200, 0x2c2c2c002c2c2c00, 719 0xececec00ececec00, 0xb3b3b300b3b3b300, 0x2727270027272700, 720 0xc0c0c000c0c0c000, 0xe5e5e500e5e5e500, 0xe4e4e400e4e4e400, 721 0x8585850085858500, 0x5757570057575700, 0x3535350035353500, 722 0xeaeaea00eaeaea00, 0x0c0c0c000c0c0c00, 0xaeaeae00aeaeae00, 723 0x4141410041414100, 0x2323230023232300, 0xefefef00efefef00, 724 0x6b6b6b006b6b6b00, 0x9393930093939300, 0x4545450045454500, 725 0x1919190019191900, 0xa5a5a500a5a5a500, 0x2121210021212100, 726 0xededed00ededed00, 0x0e0e0e000e0e0e00, 0x4f4f4f004f4f4f00, 727 0x4e4e4e004e4e4e00, 0x1d1d1d001d1d1d00, 0x6565650065656500, 728 0x9292920092929200, 0xbdbdbd00bdbdbd00, 0x8686860086868600, 729 0xb8b8b800b8b8b800, 0xafafaf00afafaf00, 0x8f8f8f008f8f8f00, 730 0x7c7c7c007c7c7c00, 0xebebeb00ebebeb00, 0x1f1f1f001f1f1f00, 731 0xcecece00cecece00, 0x3e3e3e003e3e3e00, 0x3030300030303000, 732 0xdcdcdc00dcdcdc00, 0x5f5f5f005f5f5f00, 0x5e5e5e005e5e5e00, 733 0xc5c5c500c5c5c500, 0x0b0b0b000b0b0b00, 0x1a1a1a001a1a1a00, 734 0xa6a6a600a6a6a600, 0xe1e1e100e1e1e100, 0x3939390039393900, 735 0xcacaca00cacaca00, 0xd5d5d500d5d5d500, 0x4747470047474700, 736 0x5d5d5d005d5d5d00, 0x3d3d3d003d3d3d00, 0xd9d9d900d9d9d900, 737 0x0101010001010100, 0x5a5a5a005a5a5a00, 0xd6d6d600d6d6d600, 738 0x5151510051515100, 0x5656560056565600, 0x6c6c6c006c6c6c00, 739 0x4d4d4d004d4d4d00, 0x8b8b8b008b8b8b00, 0x0d0d0d000d0d0d00, 740 0x9a9a9a009a9a9a00, 0x6666660066666600, 0xfbfbfb00fbfbfb00, 741 0xcccccc00cccccc00, 0xb0b0b000b0b0b000, 0x2d2d2d002d2d2d00, 742 0x7474740074747400, 0x1212120012121200, 0x2b2b2b002b2b2b00, 743 0x2020200020202000, 0xf0f0f000f0f0f000, 0xb1b1b100b1b1b100, 744 0x8484840084848400, 0x9999990099999900, 0xdfdfdf00dfdfdf00, 745 0x4c4c4c004c4c4c00, 0xcbcbcb00cbcbcb00, 0xc2c2c200c2c2c200, 746 0x3434340034343400, 0x7e7e7e007e7e7e00, 0x7676760076767600, 747 0x0505050005050500, 0x6d6d6d006d6d6d00, 0xb7b7b700b7b7b700, 748 0xa9a9a900a9a9a900, 0x3131310031313100, 0xd1d1d100d1d1d100, 749 0x1717170017171700, 0x0404040004040400, 0xd7d7d700d7d7d700, 750 0x1414140014141400, 0x5858580058585800, 0x3a3a3a003a3a3a00, 751 0x6161610061616100, 0xdedede00dedede00, 0x1b1b1b001b1b1b00, 752 0x1111110011111100, 0x1c1c1c001c1c1c00, 0x3232320032323200, 753 0x0f0f0f000f0f0f00, 0x9c9c9c009c9c9c00, 0x1616160016161600, 754 0x5353530053535300, 0x1818180018181800, 0xf2f2f200f2f2f200, 755 0x2222220022222200, 0xfefefe00fefefe00, 0x4444440044444400, 756 0xcfcfcf00cfcfcf00, 0xb2b2b200b2b2b200, 0xc3c3c300c3c3c300, 757 0xb5b5b500b5b5b500, 0x7a7a7a007a7a7a00, 0x9191910091919100, 758 0x2424240024242400, 0x0808080008080800, 0xe8e8e800e8e8e800, 759 0xa8a8a800a8a8a800, 0x6060600060606000, 0xfcfcfc00fcfcfc00, 760 0x6969690069696900, 0x5050500050505000, 0xaaaaaa00aaaaaa00, 761 0xd0d0d000d0d0d000, 0xa0a0a000a0a0a000, 0x7d7d7d007d7d7d00, 762 0xa1a1a100a1a1a100, 0x8989890089898900, 0x6262620062626200, 763 0x9797970097979700, 0x5454540054545400, 0x5b5b5b005b5b5b00, 764 0x1e1e1e001e1e1e00, 0x9595950095959500, 0xe0e0e000e0e0e000, 765 0xffffff00ffffff00, 0x6464640064646400, 0xd2d2d200d2d2d200, 766 0x1010100010101000, 0xc4c4c400c4c4c400, 0x0000000000000000, 767 0x4848480048484800, 0xa3a3a300a3a3a300, 0xf7f7f700f7f7f700, 768 0x7575750075757500, 0xdbdbdb00dbdbdb00, 0x8a8a8a008a8a8a00, 769 0x0303030003030300, 0xe6e6e600e6e6e600, 0xdadada00dadada00, 770 0x0909090009090900, 0x3f3f3f003f3f3f00, 0xdddddd00dddddd00, 771 0x9494940094949400, 0x8787870087878700, 0x5c5c5c005c5c5c00, 772 0x8383830083838300, 0x0202020002020200, 0xcdcdcd00cdcdcd00, 773 0x4a4a4a004a4a4a00, 0x9090900090909000, 0x3333330033333300, 774 0x7373730073737300, 0x6767670067676700, 0xf6f6f600f6f6f600, 775 0xf3f3f300f3f3f300, 0x9d9d9d009d9d9d00, 0x7f7f7f007f7f7f00, 776 0xbfbfbf00bfbfbf00, 0xe2e2e200e2e2e200, 0x5252520052525200, 777 0x9b9b9b009b9b9b00, 0xd8d8d800d8d8d800, 0x2626260026262600, 778 0xc8c8c800c8c8c800, 0x3737370037373700, 0xc6c6c600c6c6c600, 779 0x3b3b3b003b3b3b00, 0x8181810081818100, 0x9696960096969600, 780 0x6f6f6f006f6f6f00, 0x4b4b4b004b4b4b00, 0x1313130013131300, 781 0xbebebe00bebebe00, 0x6363630063636300, 0x2e2e2e002e2e2e00, 782 0xe9e9e900e9e9e900, 0x7979790079797900, 0xa7a7a700a7a7a700, 783 0x8c8c8c008c8c8c00, 0x9f9f9f009f9f9f00, 0x6e6e6e006e6e6e00, 784 0xbcbcbc00bcbcbc00, 0x8e8e8e008e8e8e00, 0x2929290029292900, 785 0xf5f5f500f5f5f500, 0xf9f9f900f9f9f900, 0xb6b6b600b6b6b600, 786 0x2f2f2f002f2f2f00, 0xfdfdfd00fdfdfd00, 0xb4b4b400b4b4b400, 787 0x5959590059595900, 0x7878780078787800, 0x9898980098989800, 788 0x0606060006060600, 0x6a6a6a006a6a6a00, 0xe7e7e700e7e7e700, 789 0x4646460046464600, 0x7171710071717100, 0xbababa00bababa00, 790 0xd4d4d400d4d4d400, 0x2525250025252500, 0xababab00ababab00, 791 0x4242420042424200, 0x8888880088888800, 0xa2a2a200a2a2a200, 792 0x8d8d8d008d8d8d00, 0xfafafa00fafafa00, 0x7272720072727200, 793 0x0707070007070700, 0xb9b9b900b9b9b900, 0x5555550055555500, 794 0xf8f8f800f8f8f800, 0xeeeeee00eeeeee00, 0xacacac00acacac00, 795 0x0a0a0a000a0a0a00, 0x3636360036363600, 0x4949490049494900, 796 0x2a2a2a002a2a2a00, 0x6868680068686800, 0x3c3c3c003c3c3c00, 797 0x3838380038383800, 0xf1f1f100f1f1f100, 0xa4a4a400a4a4a400, 798 0x4040400040404000, 0x2828280028282800, 0xd3d3d300d3d3d300, 799 0x7b7b7b007b7b7b00, 0xbbbbbb00bbbbbb00, 0xc9c9c900c9c9c900, 800 0x4343430043434300, 0xc1c1c100c1c1c100, 0x1515150015151500, 801 0xe3e3e300e3e3e300, 0xadadad00adadad00, 0xf4f4f400f4f4f400, 802 0x7777770077777700, 0xc7c7c700c7c7c700, 0x8080800080808000, 803 0x9e9e9e009e9e9e00, 804 }; 805 806 /* key constants */ 807 #define CAMELLIA_SIGMA1L (0xA09E667FL) 808 #define CAMELLIA_SIGMA1R (0x3BCC908BL) 809 #define CAMELLIA_SIGMA2L (0xB67AE858L) 810 #define CAMELLIA_SIGMA2R (0x4CAA73B2L) 811 #define CAMELLIA_SIGMA3L (0xC6EF372FL) 812 #define CAMELLIA_SIGMA3R (0xE94F82BEL) 813 #define CAMELLIA_SIGMA4L (0x54FF53A5L) 814 #define CAMELLIA_SIGMA4R (0xF1D36F1CL) 815 #define CAMELLIA_SIGMA5L (0x10E527FAL) 816 #define CAMELLIA_SIGMA5R (0xDE682D1DL) 817 #define CAMELLIA_SIGMA6L (0xB05688C2L) 818 #define CAMELLIA_SIGMA6R (0xB3E6C1FDL) 819 820 /* macros */ 821 #define ROLDQ(l, r, bits) ({ \ 822 u64 t = l; \ 823 l = (l << bits) | (r >> (64 - bits)); \ 824 r = (r << bits) | (t >> (64 - bits)); \ 825 }) 826 827 #define CAMELLIA_F(x, kl, kr, y) ({ \ 828 u64 ii = x ^ (((u64)kl << 32) | kr); \ 829 y = camellia_sp11101110[(uint8_t)ii]; \ 830 y ^= camellia_sp44044404[(uint8_t)(ii >> 8)]; \ 831 ii >>= 16; \ 832 y ^= camellia_sp30333033[(uint8_t)ii]; \ 833 y ^= camellia_sp02220222[(uint8_t)(ii >> 8)]; \ 834 ii >>= 16; \ 835 y ^= camellia_sp00444404[(uint8_t)ii]; \ 836 y ^= camellia_sp03303033[(uint8_t)(ii >> 8)]; \ 837 ii >>= 16; \ 838 y ^= camellia_sp22000222[(uint8_t)ii]; \ 839 y ^= camellia_sp10011110[(uint8_t)(ii >> 8)]; \ 840 y = ror64(y, 32); \ 841 }) 842 843 #define SET_SUBKEY_LR(INDEX, sRL) (subkey[(INDEX)] = ror64((sRL), 32)) 844 845 static void camellia_setup_tail(u64 *subkey, u64 *subRL, int max) 846 { 847 u64 kw4, tt; 848 u32 dw, tl, tr; 849 850 /* absorb kw2 to other subkeys */ 851 /* round 2 */ 852 subRL[3] ^= subRL[1]; 853 /* round 4 */ 854 subRL[5] ^= subRL[1]; 855 /* round 6 */ 856 subRL[7] ^= subRL[1]; 857 858 subRL[1] ^= (subRL[1] & ~subRL[9]) << 32; 859 /* modified for FLinv(kl2) */ 860 dw = (subRL[1] & subRL[9]) >> 32, 861 subRL[1] ^= rol32(dw, 1); 862 863 /* round 8 */ 864 subRL[11] ^= subRL[1]; 865 /* round 10 */ 866 subRL[13] ^= subRL[1]; 867 /* round 12 */ 868 subRL[15] ^= subRL[1]; 869 870 subRL[1] ^= (subRL[1] & ~subRL[17]) << 32; 871 /* modified for FLinv(kl4) */ 872 dw = (subRL[1] & subRL[17]) >> 32, 873 subRL[1] ^= rol32(dw, 1); 874 875 /* round 14 */ 876 subRL[19] ^= subRL[1]; 877 /* round 16 */ 878 subRL[21] ^= subRL[1]; 879 /* round 18 */ 880 subRL[23] ^= subRL[1]; 881 882 if (max == 24) { 883 /* kw3 */ 884 subRL[24] ^= subRL[1]; 885 886 /* absorb kw4 to other subkeys */ 887 kw4 = subRL[25]; 888 } else { 889 subRL[1] ^= (subRL[1] & ~subRL[25]) << 32; 890 /* modified for FLinv(kl6) */ 891 dw = (subRL[1] & subRL[25]) >> 32, 892 subRL[1] ^= rol32(dw, 1); 893 894 /* round 20 */ 895 subRL[27] ^= subRL[1]; 896 /* round 22 */ 897 subRL[29] ^= subRL[1]; 898 /* round 24 */ 899 subRL[31] ^= subRL[1]; 900 /* kw3 */ 901 subRL[32] ^= subRL[1]; 902 903 /* absorb kw4 to other subkeys */ 904 kw4 = subRL[33]; 905 /* round 23 */ 906 subRL[30] ^= kw4; 907 /* round 21 */ 908 subRL[28] ^= kw4; 909 /* round 19 */ 910 subRL[26] ^= kw4; 911 912 kw4 ^= (kw4 & ~subRL[24]) << 32; 913 /* modified for FL(kl5) */ 914 dw = (kw4 & subRL[24]) >> 32, 915 kw4 ^= rol32(dw, 1); 916 } 917 918 /* round 17 */ 919 subRL[22] ^= kw4; 920 /* round 15 */ 921 subRL[20] ^= kw4; 922 /* round 13 */ 923 subRL[18] ^= kw4; 924 925 kw4 ^= (kw4 & ~subRL[16]) << 32; 926 /* modified for FL(kl3) */ 927 dw = (kw4 & subRL[16]) >> 32, 928 kw4 ^= rol32(dw, 1); 929 930 /* round 11 */ 931 subRL[14] ^= kw4; 932 /* round 9 */ 933 subRL[12] ^= kw4; 934 /* round 7 */ 935 subRL[10] ^= kw4; 936 937 kw4 ^= (kw4 & ~subRL[8]) << 32; 938 /* modified for FL(kl1) */ 939 dw = (kw4 & subRL[8]) >> 32, 940 kw4 ^= rol32(dw, 1); 941 942 /* round 5 */ 943 subRL[6] ^= kw4; 944 /* round 3 */ 945 subRL[4] ^= kw4; 946 /* round 1 */ 947 subRL[2] ^= kw4; 948 /* kw1 */ 949 subRL[0] ^= kw4; 950 951 /* key XOR is end of F-function */ 952 SET_SUBKEY_LR(0, subRL[0] ^ subRL[2]); /* kw1 */ 953 SET_SUBKEY_LR(2, subRL[3]); /* round 1 */ 954 SET_SUBKEY_LR(3, subRL[2] ^ subRL[4]); /* round 2 */ 955 SET_SUBKEY_LR(4, subRL[3] ^ subRL[5]); /* round 3 */ 956 SET_SUBKEY_LR(5, subRL[4] ^ subRL[6]); /* round 4 */ 957 SET_SUBKEY_LR(6, subRL[5] ^ subRL[7]); /* round 5 */ 958 959 tl = (subRL[10] >> 32) ^ (subRL[10] & ~subRL[8]); 960 dw = tl & (subRL[8] >> 32), /* FL(kl1) */ 961 tr = subRL[10] ^ rol32(dw, 1); 962 tt = (tr | ((u64)tl << 32)); 963 964 SET_SUBKEY_LR(7, subRL[6] ^ tt); /* round 6 */ 965 SET_SUBKEY_LR(8, subRL[8]); /* FL(kl1) */ 966 SET_SUBKEY_LR(9, subRL[9]); /* FLinv(kl2) */ 967 968 tl = (subRL[7] >> 32) ^ (subRL[7] & ~subRL[9]); 969 dw = tl & (subRL[9] >> 32), /* FLinv(kl2) */ 970 tr = subRL[7] ^ rol32(dw, 1); 971 tt = (tr | ((u64)tl << 32)); 972 973 SET_SUBKEY_LR(10, subRL[11] ^ tt); /* round 7 */ 974 SET_SUBKEY_LR(11, subRL[10] ^ subRL[12]); /* round 8 */ 975 SET_SUBKEY_LR(12, subRL[11] ^ subRL[13]); /* round 9 */ 976 SET_SUBKEY_LR(13, subRL[12] ^ subRL[14]); /* round 10 */ 977 SET_SUBKEY_LR(14, subRL[13] ^ subRL[15]); /* round 11 */ 978 979 tl = (subRL[18] >> 32) ^ (subRL[18] & ~subRL[16]); 980 dw = tl & (subRL[16] >> 32), /* FL(kl3) */ 981 tr = subRL[18] ^ rol32(dw, 1); 982 tt = (tr | ((u64)tl << 32)); 983 984 SET_SUBKEY_LR(15, subRL[14] ^ tt); /* round 12 */ 985 SET_SUBKEY_LR(16, subRL[16]); /* FL(kl3) */ 986 SET_SUBKEY_LR(17, subRL[17]); /* FLinv(kl4) */ 987 988 tl = (subRL[15] >> 32) ^ (subRL[15] & ~subRL[17]); 989 dw = tl & (subRL[17] >> 32), /* FLinv(kl4) */ 990 tr = subRL[15] ^ rol32(dw, 1); 991 tt = (tr | ((u64)tl << 32)); 992 993 SET_SUBKEY_LR(18, subRL[19] ^ tt); /* round 13 */ 994 SET_SUBKEY_LR(19, subRL[18] ^ subRL[20]); /* round 14 */ 995 SET_SUBKEY_LR(20, subRL[19] ^ subRL[21]); /* round 15 */ 996 SET_SUBKEY_LR(21, subRL[20] ^ subRL[22]); /* round 16 */ 997 SET_SUBKEY_LR(22, subRL[21] ^ subRL[23]); /* round 17 */ 998 999 if (max == 24) { 1000 SET_SUBKEY_LR(23, subRL[22]); /* round 18 */ 1001 SET_SUBKEY_LR(24, subRL[24] ^ subRL[23]); /* kw3 */ 1002 } else { 1003 tl = (subRL[26] >> 32) ^ (subRL[26] & ~subRL[24]); 1004 dw = tl & (subRL[24] >> 32), /* FL(kl5) */ 1005 tr = subRL[26] ^ rol32(dw, 1); 1006 tt = (tr | ((u64)tl << 32)); 1007 1008 SET_SUBKEY_LR(23, subRL[22] ^ tt); /* round 18 */ 1009 SET_SUBKEY_LR(24, subRL[24]); /* FL(kl5) */ 1010 SET_SUBKEY_LR(25, subRL[25]); /* FLinv(kl6) */ 1011 1012 tl = (subRL[23] >> 32) ^ (subRL[23] & ~subRL[25]); 1013 dw = tl & (subRL[25] >> 32), /* FLinv(kl6) */ 1014 tr = subRL[23] ^ rol32(dw, 1); 1015 tt = (tr | ((u64)tl << 32)); 1016 1017 SET_SUBKEY_LR(26, subRL[27] ^ tt); /* round 19 */ 1018 SET_SUBKEY_LR(27, subRL[26] ^ subRL[28]); /* round 20 */ 1019 SET_SUBKEY_LR(28, subRL[27] ^ subRL[29]); /* round 21 */ 1020 SET_SUBKEY_LR(29, subRL[28] ^ subRL[30]); /* round 22 */ 1021 SET_SUBKEY_LR(30, subRL[29] ^ subRL[31]); /* round 23 */ 1022 SET_SUBKEY_LR(31, subRL[30]); /* round 24 */ 1023 SET_SUBKEY_LR(32, subRL[32] ^ subRL[31]); /* kw3 */ 1024 } 1025 } 1026 1027 static void camellia_setup128(const unsigned char *key, u64 *subkey) 1028 { 1029 u64 kl, kr, ww; 1030 u64 subRL[26]; 1031 1032 /** 1033 * k == kl || kr (|| is concatenation) 1034 */ 1035 kl = get_unaligned_be64(key); 1036 kr = get_unaligned_be64(key + 8); 1037 1038 /* generate KL dependent subkeys */ 1039 /* kw1 */ 1040 subRL[0] = kl; 1041 /* kw2 */ 1042 subRL[1] = kr; 1043 1044 /* rotation left shift 15bit */ 1045 ROLDQ(kl, kr, 15); 1046 1047 /* k3 */ 1048 subRL[4] = kl; 1049 /* k4 */ 1050 subRL[5] = kr; 1051 1052 /* rotation left shift 15+30bit */ 1053 ROLDQ(kl, kr, 30); 1054 1055 /* k7 */ 1056 subRL[10] = kl; 1057 /* k8 */ 1058 subRL[11] = kr; 1059 1060 /* rotation left shift 15+30+15bit */ 1061 ROLDQ(kl, kr, 15); 1062 1063 /* k10 */ 1064 subRL[13] = kr; 1065 /* rotation left shift 15+30+15+17 bit */ 1066 ROLDQ(kl, kr, 17); 1067 1068 /* kl3 */ 1069 subRL[16] = kl; 1070 /* kl4 */ 1071 subRL[17] = kr; 1072 1073 /* rotation left shift 15+30+15+17+17 bit */ 1074 ROLDQ(kl, kr, 17); 1075 1076 /* k13 */ 1077 subRL[18] = kl; 1078 /* k14 */ 1079 subRL[19] = kr; 1080 1081 /* rotation left shift 15+30+15+17+17+17 bit */ 1082 ROLDQ(kl, kr, 17); 1083 1084 /* k17 */ 1085 subRL[22] = kl; 1086 /* k18 */ 1087 subRL[23] = kr; 1088 1089 /* generate KA */ 1090 kl = subRL[0]; 1091 kr = subRL[1]; 1092 CAMELLIA_F(kl, CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R, ww); 1093 kr ^= ww; 1094 CAMELLIA_F(kr, CAMELLIA_SIGMA2L, CAMELLIA_SIGMA2R, kl); 1095 1096 /* current status == (kll, klr, w0, w1) */ 1097 CAMELLIA_F(kl, CAMELLIA_SIGMA3L, CAMELLIA_SIGMA3R, kr); 1098 kr ^= ww; 1099 CAMELLIA_F(kr, CAMELLIA_SIGMA4L, CAMELLIA_SIGMA4R, ww); 1100 kl ^= ww; 1101 1102 /* generate KA dependent subkeys */ 1103 /* k1, k2 */ 1104 subRL[2] = kl; 1105 subRL[3] = kr; 1106 ROLDQ(kl, kr, 15); 1107 /* k5,k6 */ 1108 subRL[6] = kl; 1109 subRL[7] = kr; 1110 ROLDQ(kl, kr, 15); 1111 /* kl1, kl2 */ 1112 subRL[8] = kl; 1113 subRL[9] = kr; 1114 ROLDQ(kl, kr, 15); 1115 /* k9 */ 1116 subRL[12] = kl; 1117 ROLDQ(kl, kr, 15); 1118 /* k11, k12 */ 1119 subRL[14] = kl; 1120 subRL[15] = kr; 1121 ROLDQ(kl, kr, 34); 1122 /* k15, k16 */ 1123 subRL[20] = kl; 1124 subRL[21] = kr; 1125 ROLDQ(kl, kr, 17); 1126 /* kw3, kw4 */ 1127 subRL[24] = kl; 1128 subRL[25] = kr; 1129 1130 camellia_setup_tail(subkey, subRL, 24); 1131 } 1132 1133 static void camellia_setup256(const unsigned char *key, u64 *subkey) 1134 { 1135 u64 kl, kr; /* left half of key */ 1136 u64 krl, krr; /* right half of key */ 1137 u64 ww; /* temporary variables */ 1138 u64 subRL[34]; 1139 1140 /** 1141 * key = (kl || kr || krl || krr) (|| is concatenation) 1142 */ 1143 kl = get_unaligned_be64(key); 1144 kr = get_unaligned_be64(key + 8); 1145 krl = get_unaligned_be64(key + 16); 1146 krr = get_unaligned_be64(key + 24); 1147 1148 /* generate KL dependent subkeys */ 1149 /* kw1 */ 1150 subRL[0] = kl; 1151 /* kw2 */ 1152 subRL[1] = kr; 1153 ROLDQ(kl, kr, 45); 1154 /* k9 */ 1155 subRL[12] = kl; 1156 /* k10 */ 1157 subRL[13] = kr; 1158 ROLDQ(kl, kr, 15); 1159 /* kl3 */ 1160 subRL[16] = kl; 1161 /* kl4 */ 1162 subRL[17] = kr; 1163 ROLDQ(kl, kr, 17); 1164 /* k17 */ 1165 subRL[22] = kl; 1166 /* k18 */ 1167 subRL[23] = kr; 1168 ROLDQ(kl, kr, 34); 1169 /* k23 */ 1170 subRL[30] = kl; 1171 /* k24 */ 1172 subRL[31] = kr; 1173 1174 /* generate KR dependent subkeys */ 1175 ROLDQ(krl, krr, 15); 1176 /* k3 */ 1177 subRL[4] = krl; 1178 /* k4 */ 1179 subRL[5] = krr; 1180 ROLDQ(krl, krr, 15); 1181 /* kl1 */ 1182 subRL[8] = krl; 1183 /* kl2 */ 1184 subRL[9] = krr; 1185 ROLDQ(krl, krr, 30); 1186 /* k13 */ 1187 subRL[18] = krl; 1188 /* k14 */ 1189 subRL[19] = krr; 1190 ROLDQ(krl, krr, 34); 1191 /* k19 */ 1192 subRL[26] = krl; 1193 /* k20 */ 1194 subRL[27] = krr; 1195 ROLDQ(krl, krr, 34); 1196 1197 /* generate KA */ 1198 kl = subRL[0] ^ krl; 1199 kr = subRL[1] ^ krr; 1200 1201 CAMELLIA_F(kl, CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R, ww); 1202 kr ^= ww; 1203 CAMELLIA_F(kr, CAMELLIA_SIGMA2L, CAMELLIA_SIGMA2R, kl); 1204 kl ^= krl; 1205 CAMELLIA_F(kl, CAMELLIA_SIGMA3L, CAMELLIA_SIGMA3R, kr); 1206 kr ^= ww ^ krr; 1207 CAMELLIA_F(kr, CAMELLIA_SIGMA4L, CAMELLIA_SIGMA4R, ww); 1208 kl ^= ww; 1209 1210 /* generate KB */ 1211 krl ^= kl; 1212 krr ^= kr; 1213 CAMELLIA_F(krl, CAMELLIA_SIGMA5L, CAMELLIA_SIGMA5R, ww); 1214 krr ^= ww; 1215 CAMELLIA_F(krr, CAMELLIA_SIGMA6L, CAMELLIA_SIGMA6R, ww); 1216 krl ^= ww; 1217 1218 /* generate KA dependent subkeys */ 1219 ROLDQ(kl, kr, 15); 1220 /* k5 */ 1221 subRL[6] = kl; 1222 /* k6 */ 1223 subRL[7] = kr; 1224 ROLDQ(kl, kr, 30); 1225 /* k11 */ 1226 subRL[14] = kl; 1227 /* k12 */ 1228 subRL[15] = kr; 1229 /* rotation left shift 32bit */ 1230 ROLDQ(kl, kr, 32); 1231 /* kl5 */ 1232 subRL[24] = kl; 1233 /* kl6 */ 1234 subRL[25] = kr; 1235 /* rotation left shift 17 from k11,k12 -> k21,k22 */ 1236 ROLDQ(kl, kr, 17); 1237 /* k21 */ 1238 subRL[28] = kl; 1239 /* k22 */ 1240 subRL[29] = kr; 1241 1242 /* generate KB dependent subkeys */ 1243 /* k1 */ 1244 subRL[2] = krl; 1245 /* k2 */ 1246 subRL[3] = krr; 1247 ROLDQ(krl, krr, 30); 1248 /* k7 */ 1249 subRL[10] = krl; 1250 /* k8 */ 1251 subRL[11] = krr; 1252 ROLDQ(krl, krr, 30); 1253 /* k15 */ 1254 subRL[20] = krl; 1255 /* k16 */ 1256 subRL[21] = krr; 1257 ROLDQ(krl, krr, 51); 1258 /* kw3 */ 1259 subRL[32] = krl; 1260 /* kw4 */ 1261 subRL[33] = krr; 1262 1263 camellia_setup_tail(subkey, subRL, 32); 1264 } 1265 1266 static void camellia_setup192(const unsigned char *key, u64 *subkey) 1267 { 1268 unsigned char kk[32]; 1269 u64 krl, krr; 1270 1271 memcpy(kk, key, 24); 1272 memcpy((unsigned char *)&krl, key+16, 8); 1273 krr = ~krl; 1274 memcpy(kk+24, (unsigned char *)&krr, 8); 1275 camellia_setup256(kk, subkey); 1276 } 1277 1278 static int __camellia_setkey(struct camellia_ctx *cctx, 1279 const unsigned char *key, 1280 unsigned int key_len, u32 *flags) 1281 { 1282 if (key_len != 16 && key_len != 24 && key_len != 32) { 1283 *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN; 1284 return -EINVAL; 1285 } 1286 1287 cctx->key_length = key_len; 1288 1289 switch (key_len) { 1290 case 16: 1291 camellia_setup128(key, cctx->key_table); 1292 break; 1293 case 24: 1294 camellia_setup192(key, cctx->key_table); 1295 break; 1296 case 32: 1297 camellia_setup256(key, cctx->key_table); 1298 break; 1299 } 1300 1301 return 0; 1302 } 1303 1304 static int camellia_setkey(struct crypto_tfm *tfm, const u8 *in_key, 1305 unsigned int key_len) 1306 { 1307 return __camellia_setkey(crypto_tfm_ctx(tfm), in_key, key_len, 1308 &tfm->crt_flags); 1309 } 1310 1311 static void camellia_decrypt_cbc_2way(void *ctx, u128 *dst, const u128 *src) 1312 { 1313 u128 iv = *src; 1314 1315 camellia_dec_blk_2way(ctx, (u8 *)dst, (u8 *)src); 1316 1317 u128_xor(&dst[1], &dst[1], &iv); 1318 } 1319 1320 static void camellia_crypt_ctr(void *ctx, u128 *dst, const u128 *src, u128 *iv) 1321 { 1322 be128 ctrblk; 1323 1324 if (dst != src) 1325 *dst = *src; 1326 1327 u128_to_be128(&ctrblk, iv); 1328 u128_inc(iv); 1329 1330 camellia_enc_blk_xor(ctx, (u8 *)dst, (u8 *)&ctrblk); 1331 } 1332 1333 static void camellia_crypt_ctr_2way(void *ctx, u128 *dst, const u128 *src, 1334 u128 *iv) 1335 { 1336 be128 ctrblks[2]; 1337 1338 if (dst != src) { 1339 dst[0] = src[0]; 1340 dst[1] = src[1]; 1341 } 1342 1343 u128_to_be128(&ctrblks[0], iv); 1344 u128_inc(iv); 1345 u128_to_be128(&ctrblks[1], iv); 1346 u128_inc(iv); 1347 1348 camellia_enc_blk_xor_2way(ctx, (u8 *)dst, (u8 *)ctrblks); 1349 } 1350 1351 static const struct common_glue_ctx camellia_enc = { 1352 .num_funcs = 2, 1353 .fpu_blocks_limit = -1, 1354 1355 .funcs = { { 1356 .num_blocks = 2, 1357 .fn_u = { .ecb = GLUE_FUNC_CAST(camellia_enc_blk_2way) } 1358 }, { 1359 .num_blocks = 1, 1360 .fn_u = { .ecb = GLUE_FUNC_CAST(camellia_enc_blk) } 1361 } } 1362 }; 1363 1364 static const struct common_glue_ctx camellia_ctr = { 1365 .num_funcs = 2, 1366 .fpu_blocks_limit = -1, 1367 1368 .funcs = { { 1369 .num_blocks = 2, 1370 .fn_u = { .ctr = GLUE_CTR_FUNC_CAST(camellia_crypt_ctr_2way) } 1371 }, { 1372 .num_blocks = 1, 1373 .fn_u = { .ctr = GLUE_CTR_FUNC_CAST(camellia_crypt_ctr) } 1374 } } 1375 }; 1376 1377 static const struct common_glue_ctx camellia_dec = { 1378 .num_funcs = 2, 1379 .fpu_blocks_limit = -1, 1380 1381 .funcs = { { 1382 .num_blocks = 2, 1383 .fn_u = { .ecb = GLUE_FUNC_CAST(camellia_dec_blk_2way) } 1384 }, { 1385 .num_blocks = 1, 1386 .fn_u = { .ecb = GLUE_FUNC_CAST(camellia_dec_blk) } 1387 } } 1388 }; 1389 1390 static const struct common_glue_ctx camellia_dec_cbc = { 1391 .num_funcs = 2, 1392 .fpu_blocks_limit = -1, 1393 1394 .funcs = { { 1395 .num_blocks = 2, 1396 .fn_u = { .cbc = GLUE_CBC_FUNC_CAST(camellia_decrypt_cbc_2way) } 1397 }, { 1398 .num_blocks = 1, 1399 .fn_u = { .cbc = GLUE_CBC_FUNC_CAST(camellia_dec_blk) } 1400 } } 1401 }; 1402 1403 static int ecb_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst, 1404 struct scatterlist *src, unsigned int nbytes) 1405 { 1406 return glue_ecb_crypt_128bit(&camellia_enc, desc, dst, src, nbytes); 1407 } 1408 1409 static int ecb_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst, 1410 struct scatterlist *src, unsigned int nbytes) 1411 { 1412 return glue_ecb_crypt_128bit(&camellia_dec, desc, dst, src, nbytes); 1413 } 1414 1415 static int cbc_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst, 1416 struct scatterlist *src, unsigned int nbytes) 1417 { 1418 return glue_cbc_encrypt_128bit(GLUE_FUNC_CAST(camellia_enc_blk), desc, 1419 dst, src, nbytes); 1420 } 1421 1422 static int cbc_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst, 1423 struct scatterlist *src, unsigned int nbytes) 1424 { 1425 return glue_cbc_decrypt_128bit(&camellia_dec_cbc, desc, dst, src, 1426 nbytes); 1427 } 1428 1429 static int ctr_crypt(struct blkcipher_desc *desc, struct scatterlist *dst, 1430 struct scatterlist *src, unsigned int nbytes) 1431 { 1432 return glue_ctr_crypt_128bit(&camellia_ctr, desc, dst, src, nbytes); 1433 } 1434 1435 static void encrypt_callback(void *priv, u8 *srcdst, unsigned int nbytes) 1436 { 1437 const unsigned int bsize = CAMELLIA_BLOCK_SIZE; 1438 struct camellia_ctx *ctx = priv; 1439 int i; 1440 1441 while (nbytes >= 2 * bsize) { 1442 camellia_enc_blk_2way(ctx, srcdst, srcdst); 1443 srcdst += bsize * 2; 1444 nbytes -= bsize * 2; 1445 } 1446 1447 for (i = 0; i < nbytes / bsize; i++, srcdst += bsize) 1448 camellia_enc_blk(ctx, srcdst, srcdst); 1449 } 1450 1451 static void decrypt_callback(void *priv, u8 *srcdst, unsigned int nbytes) 1452 { 1453 const unsigned int bsize = CAMELLIA_BLOCK_SIZE; 1454 struct camellia_ctx *ctx = priv; 1455 int i; 1456 1457 while (nbytes >= 2 * bsize) { 1458 camellia_dec_blk_2way(ctx, srcdst, srcdst); 1459 srcdst += bsize * 2; 1460 nbytes -= bsize * 2; 1461 } 1462 1463 for (i = 0; i < nbytes / bsize; i++, srcdst += bsize) 1464 camellia_dec_blk(ctx, srcdst, srcdst); 1465 } 1466 1467 struct camellia_lrw_ctx { 1468 struct lrw_table_ctx lrw_table; 1469 struct camellia_ctx camellia_ctx; 1470 }; 1471 1472 static int lrw_camellia_setkey(struct crypto_tfm *tfm, const u8 *key, 1473 unsigned int keylen) 1474 { 1475 struct camellia_lrw_ctx *ctx = crypto_tfm_ctx(tfm); 1476 int err; 1477 1478 err = __camellia_setkey(&ctx->camellia_ctx, key, 1479 keylen - CAMELLIA_BLOCK_SIZE, 1480 &tfm->crt_flags); 1481 if (err) 1482 return err; 1483 1484 return lrw_init_table(&ctx->lrw_table, 1485 key + keylen - CAMELLIA_BLOCK_SIZE); 1486 } 1487 1488 static int lrw_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst, 1489 struct scatterlist *src, unsigned int nbytes) 1490 { 1491 struct camellia_lrw_ctx *ctx = crypto_blkcipher_ctx(desc->tfm); 1492 be128 buf[2 * 4]; 1493 struct lrw_crypt_req req = { 1494 .tbuf = buf, 1495 .tbuflen = sizeof(buf), 1496 1497 .table_ctx = &ctx->lrw_table, 1498 .crypt_ctx = &ctx->camellia_ctx, 1499 .crypt_fn = encrypt_callback, 1500 }; 1501 1502 return lrw_crypt(desc, dst, src, nbytes, &req); 1503 } 1504 1505 static int lrw_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst, 1506 struct scatterlist *src, unsigned int nbytes) 1507 { 1508 struct camellia_lrw_ctx *ctx = crypto_blkcipher_ctx(desc->tfm); 1509 be128 buf[2 * 4]; 1510 struct lrw_crypt_req req = { 1511 .tbuf = buf, 1512 .tbuflen = sizeof(buf), 1513 1514 .table_ctx = &ctx->lrw_table, 1515 .crypt_ctx = &ctx->camellia_ctx, 1516 .crypt_fn = decrypt_callback, 1517 }; 1518 1519 return lrw_crypt(desc, dst, src, nbytes, &req); 1520 } 1521 1522 static void lrw_exit_tfm(struct crypto_tfm *tfm) 1523 { 1524 struct camellia_lrw_ctx *ctx = crypto_tfm_ctx(tfm); 1525 1526 lrw_free_table(&ctx->lrw_table); 1527 } 1528 1529 struct camellia_xts_ctx { 1530 struct camellia_ctx tweak_ctx; 1531 struct camellia_ctx crypt_ctx; 1532 }; 1533 1534 static int xts_camellia_setkey(struct crypto_tfm *tfm, const u8 *key, 1535 unsigned int keylen) 1536 { 1537 struct camellia_xts_ctx *ctx = crypto_tfm_ctx(tfm); 1538 u32 *flags = &tfm->crt_flags; 1539 int err; 1540 1541 /* key consists of keys of equal size concatenated, therefore 1542 * the length must be even 1543 */ 1544 if (keylen % 2) { 1545 *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN; 1546 return -EINVAL; 1547 } 1548 1549 /* first half of xts-key is for crypt */ 1550 err = __camellia_setkey(&ctx->crypt_ctx, key, keylen / 2, flags); 1551 if (err) 1552 return err; 1553 1554 /* second half of xts-key is for tweak */ 1555 return __camellia_setkey(&ctx->tweak_ctx, key + keylen / 2, keylen / 2, 1556 flags); 1557 } 1558 1559 static int xts_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst, 1560 struct scatterlist *src, unsigned int nbytes) 1561 { 1562 struct camellia_xts_ctx *ctx = crypto_blkcipher_ctx(desc->tfm); 1563 be128 buf[2 * 4]; 1564 struct xts_crypt_req req = { 1565 .tbuf = buf, 1566 .tbuflen = sizeof(buf), 1567 1568 .tweak_ctx = &ctx->tweak_ctx, 1569 .tweak_fn = XTS_TWEAK_CAST(camellia_enc_blk), 1570 .crypt_ctx = &ctx->crypt_ctx, 1571 .crypt_fn = encrypt_callback, 1572 }; 1573 1574 return xts_crypt(desc, dst, src, nbytes, &req); 1575 } 1576 1577 static int xts_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst, 1578 struct scatterlist *src, unsigned int nbytes) 1579 { 1580 struct camellia_xts_ctx *ctx = crypto_blkcipher_ctx(desc->tfm); 1581 be128 buf[2 * 4]; 1582 struct xts_crypt_req req = { 1583 .tbuf = buf, 1584 .tbuflen = sizeof(buf), 1585 1586 .tweak_ctx = &ctx->tweak_ctx, 1587 .tweak_fn = XTS_TWEAK_CAST(camellia_enc_blk), 1588 .crypt_ctx = &ctx->crypt_ctx, 1589 .crypt_fn = decrypt_callback, 1590 }; 1591 1592 return xts_crypt(desc, dst, src, nbytes, &req); 1593 } 1594 1595 static struct crypto_alg camellia_algs[6] = { { 1596 .cra_name = "camellia", 1597 .cra_driver_name = "camellia-asm", 1598 .cra_priority = 200, 1599 .cra_flags = CRYPTO_ALG_TYPE_CIPHER, 1600 .cra_blocksize = CAMELLIA_BLOCK_SIZE, 1601 .cra_ctxsize = sizeof(struct camellia_ctx), 1602 .cra_alignmask = 0, 1603 .cra_module = THIS_MODULE, 1604 .cra_list = LIST_HEAD_INIT(camellia_algs[0].cra_list), 1605 .cra_u = { 1606 .cipher = { 1607 .cia_min_keysize = CAMELLIA_MIN_KEY_SIZE, 1608 .cia_max_keysize = CAMELLIA_MAX_KEY_SIZE, 1609 .cia_setkey = camellia_setkey, 1610 .cia_encrypt = camellia_encrypt, 1611 .cia_decrypt = camellia_decrypt 1612 } 1613 } 1614 }, { 1615 .cra_name = "ecb(camellia)", 1616 .cra_driver_name = "ecb-camellia-asm", 1617 .cra_priority = 300, 1618 .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER, 1619 .cra_blocksize = CAMELLIA_BLOCK_SIZE, 1620 .cra_ctxsize = sizeof(struct camellia_ctx), 1621 .cra_alignmask = 0, 1622 .cra_type = &crypto_blkcipher_type, 1623 .cra_module = THIS_MODULE, 1624 .cra_list = LIST_HEAD_INIT(camellia_algs[1].cra_list), 1625 .cra_u = { 1626 .blkcipher = { 1627 .min_keysize = CAMELLIA_MIN_KEY_SIZE, 1628 .max_keysize = CAMELLIA_MAX_KEY_SIZE, 1629 .setkey = camellia_setkey, 1630 .encrypt = ecb_encrypt, 1631 .decrypt = ecb_decrypt, 1632 }, 1633 }, 1634 }, { 1635 .cra_name = "cbc(camellia)", 1636 .cra_driver_name = "cbc-camellia-asm", 1637 .cra_priority = 300, 1638 .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER, 1639 .cra_blocksize = CAMELLIA_BLOCK_SIZE, 1640 .cra_ctxsize = sizeof(struct camellia_ctx), 1641 .cra_alignmask = 0, 1642 .cra_type = &crypto_blkcipher_type, 1643 .cra_module = THIS_MODULE, 1644 .cra_list = LIST_HEAD_INIT(camellia_algs[2].cra_list), 1645 .cra_u = { 1646 .blkcipher = { 1647 .min_keysize = CAMELLIA_MIN_KEY_SIZE, 1648 .max_keysize = CAMELLIA_MAX_KEY_SIZE, 1649 .ivsize = CAMELLIA_BLOCK_SIZE, 1650 .setkey = camellia_setkey, 1651 .encrypt = cbc_encrypt, 1652 .decrypt = cbc_decrypt, 1653 }, 1654 }, 1655 }, { 1656 .cra_name = "ctr(camellia)", 1657 .cra_driver_name = "ctr-camellia-asm", 1658 .cra_priority = 300, 1659 .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER, 1660 .cra_blocksize = 1, 1661 .cra_ctxsize = sizeof(struct camellia_ctx), 1662 .cra_alignmask = 0, 1663 .cra_type = &crypto_blkcipher_type, 1664 .cra_module = THIS_MODULE, 1665 .cra_list = LIST_HEAD_INIT(camellia_algs[3].cra_list), 1666 .cra_u = { 1667 .blkcipher = { 1668 .min_keysize = CAMELLIA_MIN_KEY_SIZE, 1669 .max_keysize = CAMELLIA_MAX_KEY_SIZE, 1670 .ivsize = CAMELLIA_BLOCK_SIZE, 1671 .setkey = camellia_setkey, 1672 .encrypt = ctr_crypt, 1673 .decrypt = ctr_crypt, 1674 }, 1675 }, 1676 }, { 1677 .cra_name = "lrw(camellia)", 1678 .cra_driver_name = "lrw-camellia-asm", 1679 .cra_priority = 300, 1680 .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER, 1681 .cra_blocksize = CAMELLIA_BLOCK_SIZE, 1682 .cra_ctxsize = sizeof(struct camellia_lrw_ctx), 1683 .cra_alignmask = 0, 1684 .cra_type = &crypto_blkcipher_type, 1685 .cra_module = THIS_MODULE, 1686 .cra_list = LIST_HEAD_INIT(camellia_algs[4].cra_list), 1687 .cra_exit = lrw_exit_tfm, 1688 .cra_u = { 1689 .blkcipher = { 1690 .min_keysize = CAMELLIA_MIN_KEY_SIZE + 1691 CAMELLIA_BLOCK_SIZE, 1692 .max_keysize = CAMELLIA_MAX_KEY_SIZE + 1693 CAMELLIA_BLOCK_SIZE, 1694 .ivsize = CAMELLIA_BLOCK_SIZE, 1695 .setkey = lrw_camellia_setkey, 1696 .encrypt = lrw_encrypt, 1697 .decrypt = lrw_decrypt, 1698 }, 1699 }, 1700 }, { 1701 .cra_name = "xts(camellia)", 1702 .cra_driver_name = "xts-camellia-asm", 1703 .cra_priority = 300, 1704 .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER, 1705 .cra_blocksize = CAMELLIA_BLOCK_SIZE, 1706 .cra_ctxsize = sizeof(struct camellia_xts_ctx), 1707 .cra_alignmask = 0, 1708 .cra_type = &crypto_blkcipher_type, 1709 .cra_module = THIS_MODULE, 1710 .cra_list = LIST_HEAD_INIT(camellia_algs[5].cra_list), 1711 .cra_u = { 1712 .blkcipher = { 1713 .min_keysize = CAMELLIA_MIN_KEY_SIZE * 2, 1714 .max_keysize = CAMELLIA_MAX_KEY_SIZE * 2, 1715 .ivsize = CAMELLIA_BLOCK_SIZE, 1716 .setkey = xts_camellia_setkey, 1717 .encrypt = xts_encrypt, 1718 .decrypt = xts_decrypt, 1719 }, 1720 }, 1721 } }; 1722 1723 static bool is_blacklisted_cpu(void) 1724 { 1725 if (boot_cpu_data.x86_vendor != X86_VENDOR_INTEL) 1726 return false; 1727 1728 if (boot_cpu_data.x86 == 0x0f) { 1729 /* 1730 * On Pentium 4, camellia-asm is slower than original assembler 1731 * implementation because excessive uses of 64bit rotate and 1732 * left-shifts (which are really slow on P4) needed to store and 1733 * handle 128bit block in two 64bit registers. 1734 */ 1735 return true; 1736 } 1737 1738 return false; 1739 } 1740 1741 static int force; 1742 module_param(force, int, 0); 1743 MODULE_PARM_DESC(force, "Force module load, ignore CPU blacklist"); 1744 1745 static int __init init(void) 1746 { 1747 if (!force && is_blacklisted_cpu()) { 1748 printk(KERN_INFO 1749 "camellia-x86_64: performance on this CPU " 1750 "would be suboptimal: disabling " 1751 "camellia-x86_64.\n"); 1752 return -ENODEV; 1753 } 1754 1755 return crypto_register_algs(camellia_algs, ARRAY_SIZE(camellia_algs)); 1756 } 1757 1758 static void __exit fini(void) 1759 { 1760 crypto_unregister_algs(camellia_algs, ARRAY_SIZE(camellia_algs)); 1761 } 1762 1763 module_init(init); 1764 module_exit(fini); 1765 1766 MODULE_LICENSE("GPL"); 1767 MODULE_DESCRIPTION("Camellia Cipher Algorithm, asm optimized"); 1768 MODULE_ALIAS("camellia"); 1769 MODULE_ALIAS("camellia-asm"); 1770