1 // SPDX-License-Identifier: GPL-2.0-or-later 1 2 /* 3 * Glue Code for assembler optimized version o 4 * 5 * Copyright (c) 2012 Jussi Kivilinna <jussi.k 6 * 7 * Camellia parts based on code by: 8 * Copyright (C) 2006 NTT (Nippon Telegraph a 9 */ 10 11 #include <asm/unaligned.h> 12 #include <linux/crypto.h> 13 #include <linux/init.h> 14 #include <linux/module.h> 15 #include <linux/types.h> 16 #include <crypto/algapi.h> 17 18 #include "camellia.h" 19 #include "ecb_cbc_helpers.h" 20 21 /* regular block cipher functions */ 22 asmlinkage void __camellia_enc_blk(const void 23 bool xor); 24 EXPORT_SYMBOL_GPL(__camellia_enc_blk); 25 asmlinkage void camellia_dec_blk(const void *c 26 EXPORT_SYMBOL_GPL(camellia_dec_blk); 27 28 /* 2-way parallel cipher functions */ 29 asmlinkage void __camellia_enc_blk_2way(const 30 bool x 31 EXPORT_SYMBOL_GPL(__camellia_enc_blk_2way); 32 asmlinkage void camellia_dec_blk_2way(const vo 33 EXPORT_SYMBOL_GPL(camellia_dec_blk_2way); 34 35 static void camellia_encrypt(struct crypto_tfm 36 { 37 camellia_enc_blk(crypto_tfm_ctx(tfm), 38 } 39 40 static void camellia_decrypt(struct crypto_tfm 41 { 42 camellia_dec_blk(crypto_tfm_ctx(tfm), 43 } 44 45 /* camellia sboxes */ 46 __visible const u64 camellia_sp10011110[256] = 47 0x7000007070707000ULL, 0x8200008282828 48 0xec0000ecececec00ULL, 0xb30000b3b3b3b 49 0xc00000c0c0c0c000ULL, 0xe50000e5e5e5e 50 0x8500008585858500ULL, 0x5700005757575 51 0xea0000eaeaeaea00ULL, 0x0c00000c0c0c0 52 0x4100004141414100ULL, 0x2300002323232 53 0x6b00006b6b6b6b00ULL, 0x9300009393939 54 0x1900001919191900ULL, 0xa50000a5a5a5a 55 0xed0000edededed00ULL, 0x0e00000e0e0e0 56 0x4e00004e4e4e4e00ULL, 0x1d00001d1d1d1 57 0x9200009292929200ULL, 0xbd0000bdbdbdb 58 0xb80000b8b8b8b800ULL, 0xaf0000afafafa 59 0x7c00007c7c7c7c00ULL, 0xeb0000ebebebe 60 0xce0000cececece00ULL, 0x3e00003e3e3e3 61 0xdc0000dcdcdcdc00ULL, 0x5f00005f5f5f5 62 0xc50000c5c5c5c500ULL, 0x0b00000b0b0b0 63 0xa60000a6a6a6a600ULL, 0xe10000e1e1e1e 64 0xca0000cacacaca00ULL, 0xd50000d5d5d5d 65 0x5d00005d5d5d5d00ULL, 0x3d00003d3d3d3 66 0x0100000101010100ULL, 0x5a00005a5a5a5 67 0x5100005151515100ULL, 0x5600005656565 68 0x4d00004d4d4d4d00ULL, 0x8b00008b8b8b8 69 0x9a00009a9a9a9a00ULL, 0x6600006666666 70 0xcc0000cccccccc00ULL, 0xb00000b0b0b0b 71 0x7400007474747400ULL, 0x1200001212121 72 0x2000002020202000ULL, 0xf00000f0f0f0f 73 0x8400008484848400ULL, 0x9900009999999 74 0x4c00004c4c4c4c00ULL, 0xcb0000cbcbcbc 75 0x3400003434343400ULL, 0x7e00007e7e7e7 76 0x0500000505050500ULL, 0x6d00006d6d6d6 77 0xa90000a9a9a9a900ULL, 0x3100003131313 78 0x1700001717171700ULL, 0x0400000404040 79 0x1400001414141400ULL, 0x5800005858585 80 0x6100006161616100ULL, 0xde0000dededed 81 0x1100001111111100ULL, 0x1c00001c1c1c1 82 0x0f00000f0f0f0f00ULL, 0x9c00009c9c9c9 83 0x5300005353535300ULL, 0x1800001818181 84 0x2200002222222200ULL, 0xfe0000fefefef 85 0xcf0000cfcfcfcf00ULL, 0xb20000b2b2b2b 86 0xb50000b5b5b5b500ULL, 0x7a00007a7a7a7 87 0x2400002424242400ULL, 0x0800000808080 88 0xa80000a8a8a8a800ULL, 0x6000006060606 89 0x6900006969696900ULL, 0x5000005050505 90 0xd00000d0d0d0d000ULL, 0xa00000a0a0a0a 91 0xa10000a1a1a1a100ULL, 0x8900008989898 92 0x9700009797979700ULL, 0x5400005454545 93 0x1e00001e1e1e1e00ULL, 0x9500009595959 94 0xff0000ffffffff00ULL, 0x6400006464646 95 0x1000001010101000ULL, 0xc40000c4c4c4c 96 0x4800004848484800ULL, 0xa30000a3a3a3a 97 0x7500007575757500ULL, 0xdb0000dbdbdbd 98 0x0300000303030300ULL, 0xe60000e6e6e6e 99 0x0900000909090900ULL, 0x3f00003f3f3f3 100 0x9400009494949400ULL, 0x8700008787878 101 0x8300008383838300ULL, 0x0200000202020 102 0x4a00004a4a4a4a00ULL, 0x9000009090909 103 0x7300007373737300ULL, 0x6700006767676 104 0xf30000f3f3f3f300ULL, 0x9d00009d9d9d9 105 0xbf0000bfbfbfbf00ULL, 0xe20000e2e2e2e 106 0x9b00009b9b9b9b00ULL, 0xd80000d8d8d8d 107 0xc80000c8c8c8c800ULL, 0x3700003737373 108 0x3b00003b3b3b3b00ULL, 0x8100008181818 109 0x6f00006f6f6f6f00ULL, 0x4b00004b4b4b4 110 0xbe0000bebebebe00ULL, 0x6300006363636 111 0xe90000e9e9e9e900ULL, 0x7900007979797 112 0x8c00008c8c8c8c00ULL, 0x9f00009f9f9f9 113 0xbc0000bcbcbcbc00ULL, 0x8e00008e8e8e8 114 0xf50000f5f5f5f500ULL, 0xf90000f9f9f9f 115 0x2f00002f2f2f2f00ULL, 0xfd0000fdfdfdf 116 0x5900005959595900ULL, 0x7800007878787 117 0x0600000606060600ULL, 0x6a00006a6a6a6 118 0x4600004646464600ULL, 0x7100007171717 119 0xd40000d4d4d4d400ULL, 0x2500002525252 120 0x4200004242424200ULL, 0x8800008888888 121 0x8d00008d8d8d8d00ULL, 0xfa0000fafafaf 122 0x0700000707070700ULL, 0xb90000b9b9b9b 123 0xf80000f8f8f8f800ULL, 0xee0000eeeeeee 124 0x0a00000a0a0a0a00ULL, 0x3600003636363 125 0x2a00002a2a2a2a00ULL, 0x6800006868686 126 0x3800003838383800ULL, 0xf10000f1f1f1f 127 0x4000004040404000ULL, 0x2800002828282 128 0x7b00007b7b7b7b00ULL, 0xbb0000bbbbbbb 129 0x4300004343434300ULL, 0xc10000c1c1c1c 130 0xe30000e3e3e3e300ULL, 0xad0000adadada 131 0x7700007777777700ULL, 0xc70000c7c7c7c 132 0x9e00009e9e9e9e00ULL, 133 }; 134 135 __visible const u64 camellia_sp22000222[256] = 136 0xe0e0000000e0e0e0ULL, 0x0505000000050 137 0xd9d9000000d9d9d9ULL, 0x6767000000676 138 0x8181000000818181ULL, 0xcbcb000000cbc 139 0x0b0b0000000b0b0bULL, 0xaeae000000aea 140 0xd5d5000000d5d5d5ULL, 0x1818000000181 141 0x8282000000828282ULL, 0x4646000000464 142 0xd6d6000000d6d6d6ULL, 0x2727000000272 143 0x3232000000323232ULL, 0x4b4b0000004b4 144 0xdbdb000000dbdbdbULL, 0x1c1c0000001c1 145 0x9c9c0000009c9c9cULL, 0x3a3a0000003a3 146 0x2525000000252525ULL, 0x7b7b0000007b7 147 0x7171000000717171ULL, 0x5f5f0000005f5 148 0xf8f8000000f8f8f8ULL, 0xd7d7000000d7d 149 0x9d9d0000009d9d9dULL, 0x7c7c0000007c7 150 0xb9b9000000b9b9b9ULL, 0xbebe000000beb 151 0x8b8b0000008b8b8bULL, 0x1616000000161 152 0x4d4d0000004d4d4dULL, 0xc3c3000000c3c 153 0x9595000000959595ULL, 0xabab000000aba 154 0xbaba000000bababaULL, 0x7a7a0000007a7 155 0x0202000000020202ULL, 0xb4b4000000b4b 156 0xa2a2000000a2a2a2ULL, 0xacac000000aca 157 0x9a9a0000009a9a9aULL, 0x1717000000171 158 0x3535000000353535ULL, 0xcccc000000ccc 159 0x9999000000999999ULL, 0x6161000000616 160 0xe8e8000000e8e8e8ULL, 0x2424000000242 161 0x4040000000404040ULL, 0xe1e1000000e1e 162 0x0909000000090909ULL, 0x3333000000333 163 0x9898000000989898ULL, 0x9797000000979 164 0x6868000000686868ULL, 0xfcfc000000fcf 165 0x0a0a0000000a0a0aULL, 0xdada000000dad 166 0x5353000000535353ULL, 0x6262000000626 167 0x2e2e0000002e2e2eULL, 0x0808000000080 168 0x2828000000282828ULL, 0xb0b0000000b0b 169 0xc2c2000000c2c2c2ULL, 0xbdbd000000bdb 170 0x2222000000222222ULL, 0x3838000000383 171 0x1e1e0000001e1e1eULL, 0x3939000000393 172 0xa6a6000000a6a6a6ULL, 0x3030000000303 173 0x4444000000444444ULL, 0xfdfd000000fdf 174 0x9f9f0000009f9f9fULL, 0x6565000000656 175 0x6b6b0000006b6b6bULL, 0xf4f4000000f4f 176 0x4848000000484848ULL, 0x1010000000101 177 0x5151000000515151ULL, 0xc0c0000000c0c 178 0xd2d2000000d2d2d2ULL, 0xa0a0000000a0a 179 0xa1a1000000a1a1a1ULL, 0x4141000000414 180 0x4343000000434343ULL, 0x1313000000131 181 0x2f2f0000002f2f2fULL, 0xa8a8000000a8a 182 0x3c3c0000003c3c3cULL, 0x2b2b0000002b2 183 0xffff000000ffffffULL, 0xc8c8000000c8c 184 0x2020000000202020ULL, 0x8989000000898 185 0x9090000000909090ULL, 0x4747000000474 186 0xeaea000000eaeaeaULL, 0xb7b7000000b7b 187 0x0606000000060606ULL, 0xcdcd000000cdc 188 0x1212000000121212ULL, 0x7e7e0000007e7 189 0x2929000000292929ULL, 0x0f0f0000000f0 190 0x0707000000070707ULL, 0x0404000000040 191 0x9494000000949494ULL, 0x2121000000212 192 0xe6e6000000e6e6e6ULL, 0xcece000000cec 193 0xe7e7000000e7e7e7ULL, 0x3b3b0000003b3 194 0x7f7f0000007f7f7fULL, 0xc5c5000000c5c 195 0x3737000000373737ULL, 0xb1b1000000b1b 196 0x9191000000919191ULL, 0x6e6e0000006e6 197 0x7676000000767676ULL, 0x0303000000030 198 0xdede000000dededeULL, 0x9696000000969 199 0x7d7d0000007d7d7dULL, 0xc6c6000000c6c 200 0xd3d3000000d3d3d3ULL, 0xf2f2000000f2f 201 0x1919000000191919ULL, 0x3f3f0000003f3 202 0x7979000000797979ULL, 0x1d1d0000001d1 203 0xebeb000000ebebebULL, 0xf3f3000000f3f 204 0x5e5e0000005e5e5eULL, 0xfbfb000000fbf 205 0xb2b2000000b2b2b2ULL, 0xf0f0000000f0f 206 0x0c0c0000000c0c0cULL, 0xd4d4000000d4d 207 0x8c8c0000008c8c8cULL, 0xe2e2000000e2e 208 0xa9a9000000a9a9a9ULL, 0x4a4a0000004a4 209 0x8484000000848484ULL, 0x1111000000111 210 0x1b1b0000001b1b1bULL, 0xf5f5000000f5f 211 0x0e0e0000000e0e0eULL, 0x7373000000737 212 0xf1f1000000f1f1f1ULL, 0xdddd000000ddd 213 0x1414000000141414ULL, 0x6c6c0000006c6 214 0x5454000000545454ULL, 0xd0d0000000d0d 215 0x7070000000707070ULL, 0xe3e3000000e3e 216 0x8080000000808080ULL, 0x5050000000505 217 0xf6f6000000f6f6f6ULL, 0x7777000000777 218 0x8686000000868686ULL, 0x8383000000838 219 0xc7c7000000c7c7c7ULL, 0x5b5b0000005b5 220 0xeeee000000eeeeeeULL, 0x8f8f0000008f8 221 0x3d3d0000003d3d3dULL, 222 }; 223 224 __visible const u64 camellia_sp03303033[256] = 225 0x0038380038003838ULL, 0x0041410041004 226 0x0076760076007676ULL, 0x00d9d900d900d 227 0x0060600060006060ULL, 0x00f2f200f200f 228 0x00c2c200c200c2c2ULL, 0x00abab00ab00a 229 0x0075750075007575ULL, 0x0006060006000 230 0x00a0a000a000a0a0ULL, 0x0091910091009 231 0x00b5b500b500b5b5ULL, 0x00c9c900c900c 232 0x008c8c008c008c8cULL, 0x00d2d200d200d 233 0x00f6f600f600f6f6ULL, 0x0007070007000 234 0x0027270027002727ULL, 0x008e8e008e008 235 0x0049490049004949ULL, 0x00dede00de00d 236 0x005c5c005c005c5cULL, 0x00d7d700d700d 237 0x003e3e003e003e3eULL, 0x00f5f500f500f 238 0x0067670067006767ULL, 0x001f1f001f001 239 0x006e6e006e006e6eULL, 0x00afaf00af00a 240 0x00e2e200e200e2e2ULL, 0x0085850085008 241 0x0053530053005353ULL, 0x00f0f000f000f 242 0x0065650065006565ULL, 0x00eaea00ea00e 243 0x00aeae00ae00aeaeULL, 0x009e9e009e009 244 0x0080800080008080ULL, 0x002d2d002d002 245 0x00a8a800a800a8a8ULL, 0x002b2b002b002 246 0x00a6a600a600a6a6ULL, 0x00c5c500c500c 247 0x004d4d004d004d4dULL, 0x0033330033003 248 0x0066660066006666ULL, 0x0058580058005 249 0x003a3a003a003a3aULL, 0x0009090009000 250 0x0010100010001010ULL, 0x0078780078007 251 0x0042420042004242ULL, 0x00cccc00cc00c 252 0x0026260026002626ULL, 0x00e5e500e500e 253 0x001a1a001a001a1aULL, 0x003f3f003f003 254 0x0082820082008282ULL, 0x00b6b600b600b 255 0x00d4d400d400d4d4ULL, 0x0098980098009 256 0x008b8b008b008b8bULL, 0x0002020002000 257 0x000a0a000a000a0aULL, 0x002c2c002c002 258 0x00b0b000b000b0b0ULL, 0x006f6f006f006 259 0x0088880088008888ULL, 0x000e0e000e000 260 0x0087870087008787ULL, 0x004e4e004e004 261 0x00a9a900a900a9a9ULL, 0x000c0c000c000 262 0x0011110011001111ULL, 0x007f7f007f007 263 0x00e7e700e700e7e7ULL, 0x0059590059005 264 0x00dada00da00dadaULL, 0x003d3d003d003 265 0x0012120012001212ULL, 0x0004040004000 266 0x0054540054005454ULL, 0x0030300030003 267 0x00b4b400b400b4b4ULL, 0x0028280028002 268 0x0068680068006868ULL, 0x0050500050005 269 0x00d0d000d000d0d0ULL, 0x00c4c400c400c 270 0x00cbcb00cb00cbcbULL, 0x002a2a002a002 271 0x000f0f000f000f0fULL, 0x00caca00ca00c 272 0x00ffff00ff00ffffULL, 0x0032320032003 273 0x0008080008000808ULL, 0x0062620062006 274 0x0024240024002424ULL, 0x00d1d100d100d 275 0x00baba00ba00babaULL, 0x00eded00ed00e 276 0x0081810081008181ULL, 0x0073730073007 277 0x0084840084008484ULL, 0x009f9f009f009 278 0x004a4a004a004a4aULL, 0x00c3c300c300c 279 0x00c1c100c100c1c1ULL, 0x0001010001000 280 0x0025250025002525ULL, 0x0048480048004 281 0x00b9b900b900b9b9ULL, 0x00b3b300b300b 282 0x00f9f900f900f9f9ULL, 0x00cece00ce00c 283 0x00dfdf00df00dfdfULL, 0x0071710071007 284 0x00cdcd00cd00cdcdULL, 0x006c6c006c006 285 0x0064640064006464ULL, 0x009b9b009b009 286 0x009d9d009d009d9dULL, 0x00c0c000c000c 287 0x00b7b700b700b7b7ULL, 0x00a5a500a500a 288 0x005f5f005f005f5fULL, 0x00b1b100b100b 289 0x00f4f400f400f4f4ULL, 0x00bcbc00bc00b 290 0x0046460046004646ULL, 0x00cfcf00cf00c 291 0x005e5e005e005e5eULL, 0x0047470047004 292 0x00fafa00fa00fafaULL, 0x00fcfc00fc00f 293 0x0097970097009797ULL, 0x00fefe00fe00f 294 0x00acac00ac00acacULL, 0x003c3c003c003 295 0x0003030003000303ULL, 0x0035350035003 296 0x0023230023002323ULL, 0x00b8b800b800b 297 0x006a6a006a006a6aULL, 0x0092920092009 298 0x0021210021002121ULL, 0x0044440044004 299 0x00c6c600c600c6c6ULL, 0x007d7d007d007 300 0x0083830083008383ULL, 0x00dcdc00dc00d 301 0x007c7c007c007c7cULL, 0x0077770077007 302 0x0005050005000505ULL, 0x001b1b001b001 303 0x0015150015001515ULL, 0x0034340034003 304 0x001c1c001c001c1cULL, 0x00f8f800f800f 305 0x0020200020002020ULL, 0x0014140014001 306 0x00bdbd00bd00bdbdULL, 0x00dddd00dd00d 307 0x00a1a100a100a1a1ULL, 0x00e0e000e000e 308 0x00f1f100f100f1f1ULL, 0x00d6d600d600d 309 0x00bbbb00bb00bbbbULL, 0x00e3e300e300e 310 0x004f4f004f004f4fULL, 311 }; 312 313 __visible const u64 camellia_sp00444404[256] = 314 0x0000707070700070ULL, 0x00002c2c2c2c0 315 0x0000c0c0c0c000c0ULL, 0x0000e4e4e4e40 316 0x0000eaeaeaea00eaULL, 0x0000aeaeaeae0 317 0x00006b6b6b6b006bULL, 0x0000454545450 318 0x0000edededed00edULL, 0x00004f4f4f4f0 319 0x0000929292920092ULL, 0x0000868686860 320 0x00007c7c7c7c007cULL, 0x00001f1f1f1f0 321 0x0000dcdcdcdc00dcULL, 0x00005e5e5e5e0 322 0x0000a6a6a6a600a6ULL, 0x0000393939390 323 0x00005d5d5d5d005dULL, 0x0000d9d9d9d90 324 0x0000515151510051ULL, 0x00006c6c6c6c0 325 0x00009a9a9a9a009aULL, 0x0000fbfbfbfb0 326 0x0000747474740074ULL, 0x00002b2b2b2b0 327 0x0000848484840084ULL, 0x0000dfdfdfdf0 328 0x0000343434340034ULL, 0x0000767676760 329 0x0000a9a9a9a900a9ULL, 0x0000d1d1d1d10 330 0x0000141414140014ULL, 0x00003a3a3a3a0 331 0x0000111111110011ULL, 0x0000323232320 332 0x0000535353530053ULL, 0x0000f2f2f2f20 333 0x0000cfcfcfcf00cfULL, 0x0000c3c3c3c30 334 0x0000242424240024ULL, 0x0000e8e8e8e80 335 0x0000696969690069ULL, 0x0000aaaaaaaa0 336 0x0000a1a1a1a100a1ULL, 0x0000626262620 337 0x00001e1e1e1e001eULL, 0x0000e0e0e0e00 338 0x0000101010100010ULL, 0x0000000000000 339 0x0000757575750075ULL, 0x00008a8a8a8a0 340 0x0000090909090009ULL, 0x0000dddddddd0 341 0x0000838383830083ULL, 0x0000cdcdcdcd0 342 0x0000737373730073ULL, 0x0000f6f6f6f60 343 0x0000bfbfbfbf00bfULL, 0x0000525252520 344 0x0000c8c8c8c800c8ULL, 0x0000c6c6c6c60 345 0x00006f6f6f6f006fULL, 0x0000131313130 346 0x0000e9e9e9e900e9ULL, 0x0000a7a7a7a70 347 0x0000bcbcbcbc00bcULL, 0x0000292929290 348 0x00002f2f2f2f002fULL, 0x0000b4b4b4b40 349 0x0000060606060006ULL, 0x0000e7e7e7e70 350 0x0000d4d4d4d400d4ULL, 0x0000abababab0 351 0x00008d8d8d8d008dULL, 0x0000727272720 352 0x0000f8f8f8f800f8ULL, 0x0000acacacac0 353 0x00002a2a2a2a002aULL, 0x00003c3c3c3c0 354 0x0000404040400040ULL, 0x0000d3d3d3d30 355 0x0000434343430043ULL, 0x0000151515150 356 0x0000777777770077ULL, 0x0000808080800 357 0x0000ecececec00ecULL, 0x0000272727270 358 0x0000858585850085ULL, 0x0000353535350 359 0x0000414141410041ULL, 0x0000efefefef0 360 0x0000191919190019ULL, 0x0000212121210 361 0x00004e4e4e4e004eULL, 0x0000656565650 362 0x0000b8b8b8b800b8ULL, 0x00008f8f8f8f0 363 0x0000cececece00ceULL, 0x0000303030300 364 0x0000c5c5c5c500c5ULL, 0x00001a1a1a1a0 365 0x0000cacacaca00caULL, 0x0000474747470 366 0x0000010101010001ULL, 0x0000d6d6d6d60 367 0x00004d4d4d4d004dULL, 0x00000d0d0d0d0 368 0x0000cccccccc00ccULL, 0x00002d2d2d2d0 369 0x0000202020200020ULL, 0x0000b1b1b1b10 370 0x00004c4c4c4c004cULL, 0x0000c2c2c2c20 371 0x0000050505050005ULL, 0x0000b7b7b7b70 372 0x0000171717170017ULL, 0x0000d7d7d7d70 373 0x0000616161610061ULL, 0x00001b1b1b1b0 374 0x00000f0f0f0f000fULL, 0x0000161616160 375 0x0000222222220022ULL, 0x0000444444440 376 0x0000b5b5b5b500b5ULL, 0x0000919191910 377 0x0000a8a8a8a800a8ULL, 0x0000fcfcfcfc0 378 0x0000d0d0d0d000d0ULL, 0x00007d7d7d7d0 379 0x0000979797970097ULL, 0x00005b5b5b5b0 380 0x0000ffffffff00ffULL, 0x0000d2d2d2d20 381 0x0000484848480048ULL, 0x0000f7f7f7f70 382 0x0000030303030003ULL, 0x0000dadadada0 383 0x0000949494940094ULL, 0x00005c5c5c5c0 384 0x00004a4a4a4a004aULL, 0x0000333333330 385 0x0000f3f3f3f300f3ULL, 0x00007f7f7f7f0 386 0x00009b9b9b9b009bULL, 0x0000262626260 387 0x00003b3b3b3b003bULL, 0x0000969696960 388 0x0000bebebebe00beULL, 0x00002e2e2e2e0 389 0x00008c8c8c8c008cULL, 0x00006e6e6e6e0 390 0x0000f5f5f5f500f5ULL, 0x0000b6b6b6b60 391 0x0000595959590059ULL, 0x0000989898980 392 0x0000464646460046ULL, 0x0000babababa0 393 0x0000424242420042ULL, 0x0000a2a2a2a20 394 0x0000070707070007ULL, 0x0000555555550 395 0x00000a0a0a0a000aULL, 0x0000494949490 396 0x0000383838380038ULL, 0x0000a4a4a4a40 397 0x00007b7b7b7b007bULL, 0x0000c9c9c9c90 398 0x0000e3e3e3e300e3ULL, 0x0000f4f4f4f40 399 0x00009e9e9e9e009eULL, 400 }; 401 402 __visible const u64 camellia_sp02220222[256] = 403 0x00e0e0e000e0e0e0ULL, 0x0005050500050 404 0x00d9d9d900d9d9d9ULL, 0x0067676700676 405 0x0081818100818181ULL, 0x00cbcbcb00cbc 406 0x000b0b0b000b0b0bULL, 0x00aeaeae00aea 407 0x00d5d5d500d5d5d5ULL, 0x0018181800181 408 0x0082828200828282ULL, 0x0046464600464 409 0x00d6d6d600d6d6d6ULL, 0x0027272700272 410 0x0032323200323232ULL, 0x004b4b4b004b4 411 0x00dbdbdb00dbdbdbULL, 0x001c1c1c001c1 412 0x009c9c9c009c9c9cULL, 0x003a3a3a003a3 413 0x0025252500252525ULL, 0x007b7b7b007b7 414 0x0071717100717171ULL, 0x005f5f5f005f5 415 0x00f8f8f800f8f8f8ULL, 0x00d7d7d700d7d 416 0x009d9d9d009d9d9dULL, 0x007c7c7c007c7 417 0x00b9b9b900b9b9b9ULL, 0x00bebebe00beb 418 0x008b8b8b008b8b8bULL, 0x0016161600161 419 0x004d4d4d004d4d4dULL, 0x00c3c3c300c3c 420 0x0095959500959595ULL, 0x00ababab00aba 421 0x00bababa00bababaULL, 0x007a7a7a007a7 422 0x0002020200020202ULL, 0x00b4b4b400b4b 423 0x00a2a2a200a2a2a2ULL, 0x00acacac00aca 424 0x009a9a9a009a9a9aULL, 0x0017171700171 425 0x0035353500353535ULL, 0x00cccccc00ccc 426 0x0099999900999999ULL, 0x0061616100616 427 0x00e8e8e800e8e8e8ULL, 0x0024242400242 428 0x0040404000404040ULL, 0x00e1e1e100e1e 429 0x0009090900090909ULL, 0x0033333300333 430 0x0098989800989898ULL, 0x0097979700979 431 0x0068686800686868ULL, 0x00fcfcfc00fcf 432 0x000a0a0a000a0a0aULL, 0x00dadada00dad 433 0x0053535300535353ULL, 0x0062626200626 434 0x002e2e2e002e2e2eULL, 0x0008080800080 435 0x0028282800282828ULL, 0x00b0b0b000b0b 436 0x00c2c2c200c2c2c2ULL, 0x00bdbdbd00bdb 437 0x0022222200222222ULL, 0x0038383800383 438 0x001e1e1e001e1e1eULL, 0x0039393900393 439 0x00a6a6a600a6a6a6ULL, 0x0030303000303 440 0x0044444400444444ULL, 0x00fdfdfd00fdf 441 0x009f9f9f009f9f9fULL, 0x0065656500656 442 0x006b6b6b006b6b6bULL, 0x00f4f4f400f4f 443 0x0048484800484848ULL, 0x0010101000101 444 0x0051515100515151ULL, 0x00c0c0c000c0c 445 0x00d2d2d200d2d2d2ULL, 0x00a0a0a000a0a 446 0x00a1a1a100a1a1a1ULL, 0x0041414100414 447 0x0043434300434343ULL, 0x0013131300131 448 0x002f2f2f002f2f2fULL, 0x00a8a8a800a8a 449 0x003c3c3c003c3c3cULL, 0x002b2b2b002b2 450 0x00ffffff00ffffffULL, 0x00c8c8c800c8c 451 0x0020202000202020ULL, 0x0089898900898 452 0x0090909000909090ULL, 0x0047474700474 453 0x00eaeaea00eaeaeaULL, 0x00b7b7b700b7b 454 0x0006060600060606ULL, 0x00cdcdcd00cdc 455 0x0012121200121212ULL, 0x007e7e7e007e7 456 0x0029292900292929ULL, 0x000f0f0f000f0 457 0x0007070700070707ULL, 0x0004040400040 458 0x0094949400949494ULL, 0x0021212100212 459 0x00e6e6e600e6e6e6ULL, 0x00cecece00cec 460 0x00e7e7e700e7e7e7ULL, 0x003b3b3b003b3 461 0x007f7f7f007f7f7fULL, 0x00c5c5c500c5c 462 0x0037373700373737ULL, 0x00b1b1b100b1b 463 0x0091919100919191ULL, 0x006e6e6e006e6 464 0x0076767600767676ULL, 0x0003030300030 465 0x00dedede00dededeULL, 0x0096969600969 466 0x007d7d7d007d7d7dULL, 0x00c6c6c600c6c 467 0x00d3d3d300d3d3d3ULL, 0x00f2f2f200f2f 468 0x0019191900191919ULL, 0x003f3f3f003f3 469 0x0079797900797979ULL, 0x001d1d1d001d1 470 0x00ebebeb00ebebebULL, 0x00f3f3f300f3f 471 0x005e5e5e005e5e5eULL, 0x00fbfbfb00fbf 472 0x00b2b2b200b2b2b2ULL, 0x00f0f0f000f0f 473 0x000c0c0c000c0c0cULL, 0x00d4d4d400d4d 474 0x008c8c8c008c8c8cULL, 0x00e2e2e200e2e 475 0x00a9a9a900a9a9a9ULL, 0x004a4a4a004a4 476 0x0084848400848484ULL, 0x0011111100111 477 0x001b1b1b001b1b1bULL, 0x00f5f5f500f5f 478 0x000e0e0e000e0e0eULL, 0x0073737300737 479 0x00f1f1f100f1f1f1ULL, 0x00dddddd00ddd 480 0x0014141400141414ULL, 0x006c6c6c006c6 481 0x0054545400545454ULL, 0x00d0d0d000d0d 482 0x0070707000707070ULL, 0x00e3e3e300e3e 483 0x0080808000808080ULL, 0x0050505000505 484 0x00f6f6f600f6f6f6ULL, 0x0077777700777 485 0x0086868600868686ULL, 0x0083838300838 486 0x00c7c7c700c7c7c7ULL, 0x005b5b5b005b5 487 0x00eeeeee00eeeeeeULL, 0x008f8f8f008f8 488 0x003d3d3d003d3d3dULL, 489 }; 490 491 __visible const u64 camellia_sp30333033[256] = 492 0x3800383838003838ULL, 0x4100414141004 493 0x7600767676007676ULL, 0xd900d9d9d900d 494 0x6000606060006060ULL, 0xf200f2f2f200f 495 0xc200c2c2c200c2c2ULL, 0xab00ababab00a 496 0x7500757575007575ULL, 0x0600060606000 497 0xa000a0a0a000a0a0ULL, 0x9100919191009 498 0xb500b5b5b500b5b5ULL, 0xc900c9c9c900c 499 0x8c008c8c8c008c8cULL, 0xd200d2d2d200d 500 0xf600f6f6f600f6f6ULL, 0x0700070707000 501 0x2700272727002727ULL, 0x8e008e8e8e008 502 0x4900494949004949ULL, 0xde00dedede00d 503 0x5c005c5c5c005c5cULL, 0xd700d7d7d700d 504 0x3e003e3e3e003e3eULL, 0xf500f5f5f500f 505 0x6700676767006767ULL, 0x1f001f1f1f001 506 0x6e006e6e6e006e6eULL, 0xaf00afafaf00a 507 0xe200e2e2e200e2e2ULL, 0x8500858585008 508 0x5300535353005353ULL, 0xf000f0f0f000f 509 0x6500656565006565ULL, 0xea00eaeaea00e 510 0xae00aeaeae00aeaeULL, 0x9e009e9e9e009 511 0x8000808080008080ULL, 0x2d002d2d2d002 512 0xa800a8a8a800a8a8ULL, 0x2b002b2b2b002 513 0xa600a6a6a600a6a6ULL, 0xc500c5c5c500c 514 0x4d004d4d4d004d4dULL, 0x3300333333003 515 0x6600666666006666ULL, 0x5800585858005 516 0x3a003a3a3a003a3aULL, 0x0900090909000 517 0x1000101010001010ULL, 0x7800787878007 518 0x4200424242004242ULL, 0xcc00cccccc00c 519 0x2600262626002626ULL, 0xe500e5e5e500e 520 0x1a001a1a1a001a1aULL, 0x3f003f3f3f003 521 0x8200828282008282ULL, 0xb600b6b6b600b 522 0xd400d4d4d400d4d4ULL, 0x9800989898009 523 0x8b008b8b8b008b8bULL, 0x0200020202000 524 0x0a000a0a0a000a0aULL, 0x2c002c2c2c002 525 0xb000b0b0b000b0b0ULL, 0x6f006f6f6f006 526 0x8800888888008888ULL, 0x0e000e0e0e000 527 0x8700878787008787ULL, 0x4e004e4e4e004 528 0xa900a9a9a900a9a9ULL, 0x0c000c0c0c000 529 0x1100111111001111ULL, 0x7f007f7f7f007 530 0xe700e7e7e700e7e7ULL, 0x5900595959005 531 0xda00dadada00dadaULL, 0x3d003d3d3d003 532 0x1200121212001212ULL, 0x0400040404000 533 0x5400545454005454ULL, 0x3000303030003 534 0xb400b4b4b400b4b4ULL, 0x2800282828002 535 0x6800686868006868ULL, 0x5000505050005 536 0xd000d0d0d000d0d0ULL, 0xc400c4c4c400c 537 0xcb00cbcbcb00cbcbULL, 0x2a002a2a2a002 538 0x0f000f0f0f000f0fULL, 0xca00cacaca00c 539 0xff00ffffff00ffffULL, 0x3200323232003 540 0x0800080808000808ULL, 0x6200626262006 541 0x2400242424002424ULL, 0xd100d1d1d100d 542 0xba00bababa00babaULL, 0xed00ededed00e 543 0x8100818181008181ULL, 0x7300737373007 544 0x8400848484008484ULL, 0x9f009f9f9f009 545 0x4a004a4a4a004a4aULL, 0xc300c3c3c300c 546 0xc100c1c1c100c1c1ULL, 0x0100010101000 547 0x2500252525002525ULL, 0x4800484848004 548 0xb900b9b9b900b9b9ULL, 0xb300b3b3b300b 549 0xf900f9f9f900f9f9ULL, 0xce00cecece00c 550 0xdf00dfdfdf00dfdfULL, 0x7100717171007 551 0xcd00cdcdcd00cdcdULL, 0x6c006c6c6c006 552 0x6400646464006464ULL, 0x9b009b9b9b009 553 0x9d009d9d9d009d9dULL, 0xc000c0c0c000c 554 0xb700b7b7b700b7b7ULL, 0xa500a5a5a500a 555 0x5f005f5f5f005f5fULL, 0xb100b1b1b100b 556 0xf400f4f4f400f4f4ULL, 0xbc00bcbcbc00b 557 0x4600464646004646ULL, 0xcf00cfcfcf00c 558 0x5e005e5e5e005e5eULL, 0x4700474747004 559 0xfa00fafafa00fafaULL, 0xfc00fcfcfc00f 560 0x9700979797009797ULL, 0xfe00fefefe00f 561 0xac00acacac00acacULL, 0x3c003c3c3c003 562 0x0300030303000303ULL, 0x3500353535003 563 0x2300232323002323ULL, 0xb800b8b8b800b 564 0x6a006a6a6a006a6aULL, 0x9200929292009 565 0x2100212121002121ULL, 0x4400444444004 566 0xc600c6c6c600c6c6ULL, 0x7d007d7d7d007 567 0x8300838383008383ULL, 0xdc00dcdcdc00d 568 0x7c007c7c7c007c7cULL, 0x7700777777007 569 0x0500050505000505ULL, 0x1b001b1b1b001 570 0x1500151515001515ULL, 0x3400343434003 571 0x1c001c1c1c001c1cULL, 0xf800f8f8f800f 572 0x2000202020002020ULL, 0x1400141414001 573 0xbd00bdbdbd00bdbdULL, 0xdd00dddddd00d 574 0xa100a1a1a100a1a1ULL, 0xe000e0e0e000e 575 0xf100f1f1f100f1f1ULL, 0xd600d6d6d600d 576 0xbb00bbbbbb00bbbbULL, 0xe300e3e3e300e 577 0x4f004f4f4f004f4fULL, 578 }; 579 580 __visible const u64 camellia_sp44044404[256] = 581 0x7070007070700070ULL, 0x2c2c002c2c2c0 582 0xc0c000c0c0c000c0ULL, 0xe4e400e4e4e40 583 0xeaea00eaeaea00eaULL, 0xaeae00aeaeae0 584 0x6b6b006b6b6b006bULL, 0x4545004545450 585 0xeded00ededed00edULL, 0x4f4f004f4f4f0 586 0x9292009292920092ULL, 0x8686008686860 587 0x7c7c007c7c7c007cULL, 0x1f1f001f1f1f0 588 0xdcdc00dcdcdc00dcULL, 0x5e5e005e5e5e0 589 0xa6a600a6a6a600a6ULL, 0x3939003939390 590 0x5d5d005d5d5d005dULL, 0xd9d900d9d9d90 591 0x5151005151510051ULL, 0x6c6c006c6c6c0 592 0x9a9a009a9a9a009aULL, 0xfbfb00fbfbfb0 593 0x7474007474740074ULL, 0x2b2b002b2b2b0 594 0x8484008484840084ULL, 0xdfdf00dfdfdf0 595 0x3434003434340034ULL, 0x7676007676760 596 0xa9a900a9a9a900a9ULL, 0xd1d100d1d1d10 597 0x1414001414140014ULL, 0x3a3a003a3a3a0 598 0x1111001111110011ULL, 0x3232003232320 599 0x5353005353530053ULL, 0xf2f200f2f2f20 600 0xcfcf00cfcfcf00cfULL, 0xc3c300c3c3c30 601 0x2424002424240024ULL, 0xe8e800e8e8e80 602 0x6969006969690069ULL, 0xaaaa00aaaaaa0 603 0xa1a100a1a1a100a1ULL, 0x6262006262620 604 0x1e1e001e1e1e001eULL, 0xe0e000e0e0e00 605 0x1010001010100010ULL, 0x0000000000000 606 0x7575007575750075ULL, 0x8a8a008a8a8a0 607 0x0909000909090009ULL, 0xdddd00dddddd0 608 0x8383008383830083ULL, 0xcdcd00cdcdcd0 609 0x7373007373730073ULL, 0xf6f600f6f6f60 610 0xbfbf00bfbfbf00bfULL, 0x5252005252520 611 0xc8c800c8c8c800c8ULL, 0xc6c600c6c6c60 612 0x6f6f006f6f6f006fULL, 0x1313001313130 613 0xe9e900e9e9e900e9ULL, 0xa7a700a7a7a70 614 0xbcbc00bcbcbc00bcULL, 0x2929002929290 615 0x2f2f002f2f2f002fULL, 0xb4b400b4b4b40 616 0x0606000606060006ULL, 0xe7e700e7e7e70 617 0xd4d400d4d4d400d4ULL, 0xabab00ababab0 618 0x8d8d008d8d8d008dULL, 0x7272007272720 619 0xf8f800f8f8f800f8ULL, 0xacac00acacac0 620 0x2a2a002a2a2a002aULL, 0x3c3c003c3c3c0 621 0x4040004040400040ULL, 0xd3d300d3d3d30 622 0x4343004343430043ULL, 0x1515001515150 623 0x7777007777770077ULL, 0x8080008080800 624 0xecec00ececec00ecULL, 0x2727002727270 625 0x8585008585850085ULL, 0x3535003535350 626 0x4141004141410041ULL, 0xefef00efefef0 627 0x1919001919190019ULL, 0x2121002121210 628 0x4e4e004e4e4e004eULL, 0x6565006565650 629 0xb8b800b8b8b800b8ULL, 0x8f8f008f8f8f0 630 0xcece00cecece00ceULL, 0x3030003030300 631 0xc5c500c5c5c500c5ULL, 0x1a1a001a1a1a0 632 0xcaca00cacaca00caULL, 0x4747004747470 633 0x0101000101010001ULL, 0xd6d600d6d6d60 634 0x4d4d004d4d4d004dULL, 0x0d0d000d0d0d0 635 0xcccc00cccccc00ccULL, 0x2d2d002d2d2d0 636 0x2020002020200020ULL, 0xb1b100b1b1b10 637 0x4c4c004c4c4c004cULL, 0xc2c200c2c2c20 638 0x0505000505050005ULL, 0xb7b700b7b7b70 639 0x1717001717170017ULL, 0xd7d700d7d7d70 640 0x6161006161610061ULL, 0x1b1b001b1b1b0 641 0x0f0f000f0f0f000fULL, 0x1616001616160 642 0x2222002222220022ULL, 0x4444004444440 643 0xb5b500b5b5b500b5ULL, 0x9191009191910 644 0xa8a800a8a8a800a8ULL, 0xfcfc00fcfcfc0 645 0xd0d000d0d0d000d0ULL, 0x7d7d007d7d7d0 646 0x9797009797970097ULL, 0x5b5b005b5b5b0 647 0xffff00ffffff00ffULL, 0xd2d200d2d2d20 648 0x4848004848480048ULL, 0xf7f700f7f7f70 649 0x0303000303030003ULL, 0xdada00dadada0 650 0x9494009494940094ULL, 0x5c5c005c5c5c0 651 0x4a4a004a4a4a004aULL, 0x3333003333330 652 0xf3f300f3f3f300f3ULL, 0x7f7f007f7f7f0 653 0x9b9b009b9b9b009bULL, 0x2626002626260 654 0x3b3b003b3b3b003bULL, 0x9696009696960 655 0xbebe00bebebe00beULL, 0x2e2e002e2e2e0 656 0x8c8c008c8c8c008cULL, 0x6e6e006e6e6e0 657 0xf5f500f5f5f500f5ULL, 0xb6b600b6b6b60 658 0x5959005959590059ULL, 0x9898009898980 659 0x4646004646460046ULL, 0xbaba00bababa0 660 0x4242004242420042ULL, 0xa2a200a2a2a20 661 0x0707000707070007ULL, 0x5555005555550 662 0x0a0a000a0a0a000aULL, 0x4949004949490 663 0x3838003838380038ULL, 0xa4a400a4a4a40 664 0x7b7b007b7b7b007bULL, 0xc9c900c9c9c90 665 0xe3e300e3e3e300e3ULL, 0xf4f400f4f4f40 666 0x9e9e009e9e9e009eULL, 667 }; 668 669 __visible const u64 camellia_sp11101110[256] = 670 0x7070700070707000ULL, 0x8282820082828 671 0xececec00ececec00ULL, 0xb3b3b300b3b3b 672 0xc0c0c000c0c0c000ULL, 0xe5e5e500e5e5e 673 0x8585850085858500ULL, 0x5757570057575 674 0xeaeaea00eaeaea00ULL, 0x0c0c0c000c0c0 675 0x4141410041414100ULL, 0x2323230023232 676 0x6b6b6b006b6b6b00ULL, 0x9393930093939 677 0x1919190019191900ULL, 0xa5a5a500a5a5a 678 0xededed00ededed00ULL, 0x0e0e0e000e0e0 679 0x4e4e4e004e4e4e00ULL, 0x1d1d1d001d1d1 680 0x9292920092929200ULL, 0xbdbdbd00bdbdb 681 0xb8b8b800b8b8b800ULL, 0xafafaf00afafa 682 0x7c7c7c007c7c7c00ULL, 0xebebeb00ebebe 683 0xcecece00cecece00ULL, 0x3e3e3e003e3e3 684 0xdcdcdc00dcdcdc00ULL, 0x5f5f5f005f5f5 685 0xc5c5c500c5c5c500ULL, 0x0b0b0b000b0b0 686 0xa6a6a600a6a6a600ULL, 0xe1e1e100e1e1e 687 0xcacaca00cacaca00ULL, 0xd5d5d500d5d5d 688 0x5d5d5d005d5d5d00ULL, 0x3d3d3d003d3d3 689 0x0101010001010100ULL, 0x5a5a5a005a5a5 690 0x5151510051515100ULL, 0x5656560056565 691 0x4d4d4d004d4d4d00ULL, 0x8b8b8b008b8b8 692 0x9a9a9a009a9a9a00ULL, 0x6666660066666 693 0xcccccc00cccccc00ULL, 0xb0b0b000b0b0b 694 0x7474740074747400ULL, 0x1212120012121 695 0x2020200020202000ULL, 0xf0f0f000f0f0f 696 0x8484840084848400ULL, 0x9999990099999 697 0x4c4c4c004c4c4c00ULL, 0xcbcbcb00cbcbc 698 0x3434340034343400ULL, 0x7e7e7e007e7e7 699 0x0505050005050500ULL, 0x6d6d6d006d6d6 700 0xa9a9a900a9a9a900ULL, 0x3131310031313 701 0x1717170017171700ULL, 0x0404040004040 702 0x1414140014141400ULL, 0x5858580058585 703 0x6161610061616100ULL, 0xdedede00deded 704 0x1111110011111100ULL, 0x1c1c1c001c1c1 705 0x0f0f0f000f0f0f00ULL, 0x9c9c9c009c9c9 706 0x5353530053535300ULL, 0x1818180018181 707 0x2222220022222200ULL, 0xfefefe00fefef 708 0xcfcfcf00cfcfcf00ULL, 0xb2b2b200b2b2b 709 0xb5b5b500b5b5b500ULL, 0x7a7a7a007a7a7 710 0x2424240024242400ULL, 0x0808080008080 711 0xa8a8a800a8a8a800ULL, 0x6060600060606 712 0x6969690069696900ULL, 0x5050500050505 713 0xd0d0d000d0d0d000ULL, 0xa0a0a000a0a0a 714 0xa1a1a100a1a1a100ULL, 0x8989890089898 715 0x9797970097979700ULL, 0x5454540054545 716 0x1e1e1e001e1e1e00ULL, 0x9595950095959 717 0xffffff00ffffff00ULL, 0x6464640064646 718 0x1010100010101000ULL, 0xc4c4c400c4c4c 719 0x4848480048484800ULL, 0xa3a3a300a3a3a 720 0x7575750075757500ULL, 0xdbdbdb00dbdbd 721 0x0303030003030300ULL, 0xe6e6e600e6e6e 722 0x0909090009090900ULL, 0x3f3f3f003f3f3 723 0x9494940094949400ULL, 0x8787870087878 724 0x8383830083838300ULL, 0x0202020002020 725 0x4a4a4a004a4a4a00ULL, 0x9090900090909 726 0x7373730073737300ULL, 0x6767670067676 727 0xf3f3f300f3f3f300ULL, 0x9d9d9d009d9d9 728 0xbfbfbf00bfbfbf00ULL, 0xe2e2e200e2e2e 729 0x9b9b9b009b9b9b00ULL, 0xd8d8d800d8d8d 730 0xc8c8c800c8c8c800ULL, 0x3737370037373 731 0x3b3b3b003b3b3b00ULL, 0x8181810081818 732 0x6f6f6f006f6f6f00ULL, 0x4b4b4b004b4b4 733 0xbebebe00bebebe00ULL, 0x6363630063636 734 0xe9e9e900e9e9e900ULL, 0x7979790079797 735 0x8c8c8c008c8c8c00ULL, 0x9f9f9f009f9f9 736 0xbcbcbc00bcbcbc00ULL, 0x8e8e8e008e8e8 737 0xf5f5f500f5f5f500ULL, 0xf9f9f900f9f9f 738 0x2f2f2f002f2f2f00ULL, 0xfdfdfd00fdfdf 739 0x5959590059595900ULL, 0x7878780078787 740 0x0606060006060600ULL, 0x6a6a6a006a6a6 741 0x4646460046464600ULL, 0x7171710071717 742 0xd4d4d400d4d4d400ULL, 0x2525250025252 743 0x4242420042424200ULL, 0x8888880088888 744 0x8d8d8d008d8d8d00ULL, 0xfafafa00fafaf 745 0x0707070007070700ULL, 0xb9b9b900b9b9b 746 0xf8f8f800f8f8f800ULL, 0xeeeeee00eeeee 747 0x0a0a0a000a0a0a00ULL, 0x3636360036363 748 0x2a2a2a002a2a2a00ULL, 0x6868680068686 749 0x3838380038383800ULL, 0xf1f1f100f1f1f 750 0x4040400040404000ULL, 0x2828280028282 751 0x7b7b7b007b7b7b00ULL, 0xbbbbbb00bbbbb 752 0x4343430043434300ULL, 0xc1c1c100c1c1c 753 0xe3e3e300e3e3e300ULL, 0xadadad00adada 754 0x7777770077777700ULL, 0xc7c7c700c7c7c 755 0x9e9e9e009e9e9e00ULL, 756 }; 757 758 /* key constants */ 759 #define CAMELLIA_SIGMA1L (0xA09E667FL) 760 #define CAMELLIA_SIGMA1R (0x3BCC908BL) 761 #define CAMELLIA_SIGMA2L (0xB67AE858L) 762 #define CAMELLIA_SIGMA2R (0x4CAA73B2L) 763 #define CAMELLIA_SIGMA3L (0xC6EF372FL) 764 #define CAMELLIA_SIGMA3R (0xE94F82BEL) 765 #define CAMELLIA_SIGMA4L (0x54FF53A5L) 766 #define CAMELLIA_SIGMA4R (0xF1D36F1CL) 767 #define CAMELLIA_SIGMA5L (0x10E527FAL) 768 #define CAMELLIA_SIGMA5R (0xDE682D1DL) 769 #define CAMELLIA_SIGMA6L (0xB05688C2L) 770 #define CAMELLIA_SIGMA6R (0xB3E6C1FDL) 771 772 /* macros */ 773 #define ROLDQ(l, r, bits) ({ \ 774 u64 t = l; 775 l = (l << bits) | (r >> (64 - bits)); 776 r = (r << bits) | (t >> (64 - bits)); 777 }) 778 779 #define CAMELLIA_F(x, kl, kr, y) ({ \ 780 u64 ii = x ^ (((u64)kl << 32) | kr); 781 y = camellia_sp11101110[(uint8_t)ii]; 782 y ^= camellia_sp44044404[(uint8_t)(ii 783 ii >>= 16; 784 y ^= camellia_sp30333033[(uint8_t)ii]; 785 y ^= camellia_sp02220222[(uint8_t)(ii 786 ii >>= 16; 787 y ^= camellia_sp00444404[(uint8_t)ii]; 788 y ^= camellia_sp03303033[(uint8_t)(ii 789 ii >>= 16; 790 y ^= camellia_sp22000222[(uint8_t)ii]; 791 y ^= camellia_sp10011110[(uint8_t)(ii 792 y = ror64(y, 32); 793 }) 794 795 #define SET_SUBKEY_LR(INDEX, sRL) (subkey[(IND 796 797 static void camellia_setup_tail(u64 *subkey, u 798 { 799 u64 kw4, tt; 800 u32 dw, tl, tr; 801 802 /* absorb kw2 to other subkeys */ 803 /* round 2 */ 804 subRL[3] ^= subRL[1]; 805 /* round 4 */ 806 subRL[5] ^= subRL[1]; 807 /* round 6 */ 808 subRL[7] ^= subRL[1]; 809 810 subRL[1] ^= (subRL[1] & ~subRL[9]) << 811 /* modified for FLinv(kl2) */ 812 dw = (subRL[1] & subRL[9]) >> 32; 813 subRL[1] ^= rol32(dw, 1); 814 815 /* round 8 */ 816 subRL[11] ^= subRL[1]; 817 /* round 10 */ 818 subRL[13] ^= subRL[1]; 819 /* round 12 */ 820 subRL[15] ^= subRL[1]; 821 822 subRL[1] ^= (subRL[1] & ~subRL[17]) << 823 /* modified for FLinv(kl4) */ 824 dw = (subRL[1] & subRL[17]) >> 32; 825 subRL[1] ^= rol32(dw, 1); 826 827 /* round 14 */ 828 subRL[19] ^= subRL[1]; 829 /* round 16 */ 830 subRL[21] ^= subRL[1]; 831 /* round 18 */ 832 subRL[23] ^= subRL[1]; 833 834 if (max == 24) { 835 /* kw3 */ 836 subRL[24] ^= subRL[1]; 837 838 /* absorb kw4 to other subkeys 839 kw4 = subRL[25]; 840 } else { 841 subRL[1] ^= (subRL[1] & ~subRL 842 /* modified for FLinv(kl6) */ 843 dw = (subRL[1] & subRL[25]) >> 844 subRL[1] ^= rol32(dw, 1); 845 846 /* round 20 */ 847 subRL[27] ^= subRL[1]; 848 /* round 22 */ 849 subRL[29] ^= subRL[1]; 850 /* round 24 */ 851 subRL[31] ^= subRL[1]; 852 /* kw3 */ 853 subRL[32] ^= subRL[1]; 854 855 /* absorb kw4 to other subkeys 856 kw4 = subRL[33]; 857 /* round 23 */ 858 subRL[30] ^= kw4; 859 /* round 21 */ 860 subRL[28] ^= kw4; 861 /* round 19 */ 862 subRL[26] ^= kw4; 863 864 kw4 ^= (kw4 & ~subRL[24]) << 3 865 /* modified for FL(kl5) */ 866 dw = (kw4 & subRL[24]) >> 32; 867 kw4 ^= rol32(dw, 1); 868 } 869 870 /* round 17 */ 871 subRL[22] ^= kw4; 872 /* round 15 */ 873 subRL[20] ^= kw4; 874 /* round 13 */ 875 subRL[18] ^= kw4; 876 877 kw4 ^= (kw4 & ~subRL[16]) << 32; 878 /* modified for FL(kl3) */ 879 dw = (kw4 & subRL[16]) >> 32; 880 kw4 ^= rol32(dw, 1); 881 882 /* round 11 */ 883 subRL[14] ^= kw4; 884 /* round 9 */ 885 subRL[12] ^= kw4; 886 /* round 7 */ 887 subRL[10] ^= kw4; 888 889 kw4 ^= (kw4 & ~subRL[8]) << 32; 890 /* modified for FL(kl1) */ 891 dw = (kw4 & subRL[8]) >> 32; 892 kw4 ^= rol32(dw, 1); 893 894 /* round 5 */ 895 subRL[6] ^= kw4; 896 /* round 3 */ 897 subRL[4] ^= kw4; 898 /* round 1 */ 899 subRL[2] ^= kw4; 900 /* kw1 */ 901 subRL[0] ^= kw4; 902 903 /* key XOR is end of F-function */ 904 SET_SUBKEY_LR(0, subRL[0] ^ subRL[2]); 905 SET_SUBKEY_LR(2, subRL[3]); 906 SET_SUBKEY_LR(3, subRL[2] ^ subRL[4]); 907 SET_SUBKEY_LR(4, subRL[3] ^ subRL[5]); 908 SET_SUBKEY_LR(5, subRL[4] ^ subRL[6]); 909 SET_SUBKEY_LR(6, subRL[5] ^ subRL[7]); 910 911 tl = (subRL[10] >> 32) ^ (subRL[10] & 912 dw = tl & (subRL[8] >> 32); 913 tr = subRL[10] ^ rol32(dw, 1); 914 tt = (tr | ((u64)tl << 32)); 915 916 SET_SUBKEY_LR(7, subRL[6] ^ tt); 917 SET_SUBKEY_LR(8, subRL[8]); 918 SET_SUBKEY_LR(9, subRL[9]); 919 920 tl = (subRL[7] >> 32) ^ (subRL[7] & ~s 921 dw = tl & (subRL[9] >> 32); 922 tr = subRL[7] ^ rol32(dw, 1); 923 tt = (tr | ((u64)tl << 32)); 924 925 SET_SUBKEY_LR(10, subRL[11] ^ tt); 926 SET_SUBKEY_LR(11, subRL[10] ^ subRL[12 927 SET_SUBKEY_LR(12, subRL[11] ^ subRL[13 928 SET_SUBKEY_LR(13, subRL[12] ^ subRL[14 929 SET_SUBKEY_LR(14, subRL[13] ^ subRL[15 930 931 tl = (subRL[18] >> 32) ^ (subRL[18] & 932 dw = tl & (subRL[16] >> 32); 933 tr = subRL[18] ^ rol32(dw, 1); 934 tt = (tr | ((u64)tl << 32)); 935 936 SET_SUBKEY_LR(15, subRL[14] ^ tt); 937 SET_SUBKEY_LR(16, subRL[16]); 938 SET_SUBKEY_LR(17, subRL[17]); 939 940 tl = (subRL[15] >> 32) ^ (subRL[15] & 941 dw = tl & (subRL[17] >> 32); 942 tr = subRL[15] ^ rol32(dw, 1); 943 tt = (tr | ((u64)tl << 32)); 944 945 SET_SUBKEY_LR(18, subRL[19] ^ tt); 946 SET_SUBKEY_LR(19, subRL[18] ^ subRL[20 947 SET_SUBKEY_LR(20, subRL[19] ^ subRL[21 948 SET_SUBKEY_LR(21, subRL[20] ^ subRL[22 949 SET_SUBKEY_LR(22, subRL[21] ^ subRL[23 950 951 if (max == 24) { 952 SET_SUBKEY_LR(23, subRL[22]); 953 SET_SUBKEY_LR(24, subRL[24] ^ 954 } else { 955 tl = (subRL[26] >> 32) ^ (subR 956 dw = tl & (subRL[24] >> 32); 957 tr = subRL[26] ^ rol32(dw, 1); 958 tt = (tr | ((u64)tl << 32)); 959 960 SET_SUBKEY_LR(23, subRL[22] ^ 961 SET_SUBKEY_LR(24, subRL[24]); 962 SET_SUBKEY_LR(25, subRL[25]); 963 964 tl = (subRL[23] >> 32) ^ (subR 965 dw = tl & (subRL[25] >> 32); 966 tr = subRL[23] ^ rol32(dw, 1); 967 tt = (tr | ((u64)tl << 32)); 968 969 SET_SUBKEY_LR(26, subRL[27] ^ 970 SET_SUBKEY_LR(27, subRL[26] ^ 971 SET_SUBKEY_LR(28, subRL[27] ^ 972 SET_SUBKEY_LR(29, subRL[28] ^ 973 SET_SUBKEY_LR(30, subRL[29] ^ 974 SET_SUBKEY_LR(31, subRL[30]); 975 SET_SUBKEY_LR(32, subRL[32] ^ 976 } 977 } 978 979 static void camellia_setup128(const unsigned c 980 { 981 u64 kl, kr, ww; 982 u64 subRL[26]; 983 984 /** 985 * k == kl || kr (|| is concatenation 986 */ 987 kl = get_unaligned_be64(key); 988 kr = get_unaligned_be64(key + 8); 989 990 /* generate KL dependent subkeys */ 991 /* kw1 */ 992 subRL[0] = kl; 993 /* kw2 */ 994 subRL[1] = kr; 995 996 /* rotation left shift 15bit */ 997 ROLDQ(kl, kr, 15); 998 999 /* k3 */ 1000 subRL[4] = kl; 1001 /* k4 */ 1002 subRL[5] = kr; 1003 1004 /* rotation left shift 15+30bit */ 1005 ROLDQ(kl, kr, 30); 1006 1007 /* k7 */ 1008 subRL[10] = kl; 1009 /* k8 */ 1010 subRL[11] = kr; 1011 1012 /* rotation left shift 15+30+15bit */ 1013 ROLDQ(kl, kr, 15); 1014 1015 /* k10 */ 1016 subRL[13] = kr; 1017 /* rotation left shift 15+30+15+17 bi 1018 ROLDQ(kl, kr, 17); 1019 1020 /* kl3 */ 1021 subRL[16] = kl; 1022 /* kl4 */ 1023 subRL[17] = kr; 1024 1025 /* rotation left shift 15+30+15+17+17 1026 ROLDQ(kl, kr, 17); 1027 1028 /* k13 */ 1029 subRL[18] = kl; 1030 /* k14 */ 1031 subRL[19] = kr; 1032 1033 /* rotation left shift 15+30+15+17+17 1034 ROLDQ(kl, kr, 17); 1035 1036 /* k17 */ 1037 subRL[22] = kl; 1038 /* k18 */ 1039 subRL[23] = kr; 1040 1041 /* generate KA */ 1042 kl = subRL[0]; 1043 kr = subRL[1]; 1044 CAMELLIA_F(kl, CAMELLIA_SIGMA1L, CAME 1045 kr ^= ww; 1046 CAMELLIA_F(kr, CAMELLIA_SIGMA2L, CAME 1047 1048 /* current status == (kll, klr, w0, w 1049 CAMELLIA_F(kl, CAMELLIA_SIGMA3L, CAME 1050 kr ^= ww; 1051 CAMELLIA_F(kr, CAMELLIA_SIGMA4L, CAME 1052 kl ^= ww; 1053 1054 /* generate KA dependent subkeys */ 1055 /* k1, k2 */ 1056 subRL[2] = kl; 1057 subRL[3] = kr; 1058 ROLDQ(kl, kr, 15); 1059 /* k5,k6 */ 1060 subRL[6] = kl; 1061 subRL[7] = kr; 1062 ROLDQ(kl, kr, 15); 1063 /* kl1, kl2 */ 1064 subRL[8] = kl; 1065 subRL[9] = kr; 1066 ROLDQ(kl, kr, 15); 1067 /* k9 */ 1068 subRL[12] = kl; 1069 ROLDQ(kl, kr, 15); 1070 /* k11, k12 */ 1071 subRL[14] = kl; 1072 subRL[15] = kr; 1073 ROLDQ(kl, kr, 34); 1074 /* k15, k16 */ 1075 subRL[20] = kl; 1076 subRL[21] = kr; 1077 ROLDQ(kl, kr, 17); 1078 /* kw3, kw4 */ 1079 subRL[24] = kl; 1080 subRL[25] = kr; 1081 1082 camellia_setup_tail(subkey, subRL, 24 1083 } 1084 1085 static void camellia_setup256(const unsigned 1086 { 1087 u64 kl, kr; /* le 1088 u64 krl, krr; /* ri 1089 u64 ww; /* te 1090 u64 subRL[34]; 1091 1092 /** 1093 * key = (kl || kr || krl || krr) (| 1094 */ 1095 kl = get_unaligned_be64(key); 1096 kr = get_unaligned_be64(key + 8); 1097 krl = get_unaligned_be64(key + 16); 1098 krr = get_unaligned_be64(key + 24); 1099 1100 /* generate KL dependent subkeys */ 1101 /* kw1 */ 1102 subRL[0] = kl; 1103 /* kw2 */ 1104 subRL[1] = kr; 1105 ROLDQ(kl, kr, 45); 1106 /* k9 */ 1107 subRL[12] = kl; 1108 /* k10 */ 1109 subRL[13] = kr; 1110 ROLDQ(kl, kr, 15); 1111 /* kl3 */ 1112 subRL[16] = kl; 1113 /* kl4 */ 1114 subRL[17] = kr; 1115 ROLDQ(kl, kr, 17); 1116 /* k17 */ 1117 subRL[22] = kl; 1118 /* k18 */ 1119 subRL[23] = kr; 1120 ROLDQ(kl, kr, 34); 1121 /* k23 */ 1122 subRL[30] = kl; 1123 /* k24 */ 1124 subRL[31] = kr; 1125 1126 /* generate KR dependent subkeys */ 1127 ROLDQ(krl, krr, 15); 1128 /* k3 */ 1129 subRL[4] = krl; 1130 /* k4 */ 1131 subRL[5] = krr; 1132 ROLDQ(krl, krr, 15); 1133 /* kl1 */ 1134 subRL[8] = krl; 1135 /* kl2 */ 1136 subRL[9] = krr; 1137 ROLDQ(krl, krr, 30); 1138 /* k13 */ 1139 subRL[18] = krl; 1140 /* k14 */ 1141 subRL[19] = krr; 1142 ROLDQ(krl, krr, 34); 1143 /* k19 */ 1144 subRL[26] = krl; 1145 /* k20 */ 1146 subRL[27] = krr; 1147 ROLDQ(krl, krr, 34); 1148 1149 /* generate KA */ 1150 kl = subRL[0] ^ krl; 1151 kr = subRL[1] ^ krr; 1152 1153 CAMELLIA_F(kl, CAMELLIA_SIGMA1L, CAME 1154 kr ^= ww; 1155 CAMELLIA_F(kr, CAMELLIA_SIGMA2L, CAME 1156 kl ^= krl; 1157 CAMELLIA_F(kl, CAMELLIA_SIGMA3L, CAME 1158 kr ^= ww ^ krr; 1159 CAMELLIA_F(kr, CAMELLIA_SIGMA4L, CAME 1160 kl ^= ww; 1161 1162 /* generate KB */ 1163 krl ^= kl; 1164 krr ^= kr; 1165 CAMELLIA_F(krl, CAMELLIA_SIGMA5L, CAM 1166 krr ^= ww; 1167 CAMELLIA_F(krr, CAMELLIA_SIGMA6L, CAM 1168 krl ^= ww; 1169 1170 /* generate KA dependent subkeys */ 1171 ROLDQ(kl, kr, 15); 1172 /* k5 */ 1173 subRL[6] = kl; 1174 /* k6 */ 1175 subRL[7] = kr; 1176 ROLDQ(kl, kr, 30); 1177 /* k11 */ 1178 subRL[14] = kl; 1179 /* k12 */ 1180 subRL[15] = kr; 1181 /* rotation left shift 32bit */ 1182 ROLDQ(kl, kr, 32); 1183 /* kl5 */ 1184 subRL[24] = kl; 1185 /* kl6 */ 1186 subRL[25] = kr; 1187 /* rotation left shift 17 from k11,k1 1188 ROLDQ(kl, kr, 17); 1189 /* k21 */ 1190 subRL[28] = kl; 1191 /* k22 */ 1192 subRL[29] = kr; 1193 1194 /* generate KB dependent subkeys */ 1195 /* k1 */ 1196 subRL[2] = krl; 1197 /* k2 */ 1198 subRL[3] = krr; 1199 ROLDQ(krl, krr, 30); 1200 /* k7 */ 1201 subRL[10] = krl; 1202 /* k8 */ 1203 subRL[11] = krr; 1204 ROLDQ(krl, krr, 30); 1205 /* k15 */ 1206 subRL[20] = krl; 1207 /* k16 */ 1208 subRL[21] = krr; 1209 ROLDQ(krl, krr, 51); 1210 /* kw3 */ 1211 subRL[32] = krl; 1212 /* kw4 */ 1213 subRL[33] = krr; 1214 1215 camellia_setup_tail(subkey, subRL, 32 1216 } 1217 1218 static void camellia_setup192(const unsigned 1219 { 1220 unsigned char kk[32]; 1221 u64 krl, krr; 1222 1223 memcpy(kk, key, 24); 1224 memcpy((unsigned char *)&krl, key+16, 1225 krr = ~krl; 1226 memcpy(kk+24, (unsigned char *)&krr, 1227 camellia_setup256(kk, subkey); 1228 } 1229 1230 int __camellia_setkey(struct camellia_ctx *cc 1231 unsigned int key_len) 1232 { 1233 if (key_len != 16 && key_len != 24 && 1234 return -EINVAL; 1235 1236 cctx->key_length = key_len; 1237 1238 switch (key_len) { 1239 case 16: 1240 camellia_setup128(key, cctx-> 1241 break; 1242 case 24: 1243 camellia_setup192(key, cctx-> 1244 break; 1245 case 32: 1246 camellia_setup256(key, cctx-> 1247 break; 1248 } 1249 1250 return 0; 1251 } 1252 EXPORT_SYMBOL_GPL(__camellia_setkey); 1253 1254 static int camellia_setkey(struct crypto_tfm 1255 unsigned int key_l 1256 { 1257 return __camellia_setkey(crypto_tfm_c 1258 } 1259 1260 static int camellia_setkey_skcipher(struct cr 1261 unsigned 1262 { 1263 return camellia_setkey(&tfm->base, ke 1264 } 1265 1266 void camellia_decrypt_cbc_2way(const void *ct 1267 { 1268 u8 buf[CAMELLIA_BLOCK_SIZE]; 1269 const u8 *iv = src; 1270 1271 if (dst == src) 1272 iv = memcpy(buf, iv, sizeof(b 1273 camellia_dec_blk_2way(ctx, dst, src); 1274 crypto_xor(dst + CAMELLIA_BLOCK_SIZE, 1275 } 1276 EXPORT_SYMBOL_GPL(camellia_decrypt_cbc_2way); 1277 1278 static int ecb_encrypt(struct skcipher_reques 1279 { 1280 ECB_WALK_START(req, CAMELLIA_BLOCK_SI 1281 ECB_BLOCK(2, camellia_enc_blk_2way); 1282 ECB_BLOCK(1, camellia_enc_blk); 1283 ECB_WALK_END(); 1284 } 1285 1286 static int ecb_decrypt(struct skcipher_reques 1287 { 1288 ECB_WALK_START(req, CAMELLIA_BLOCK_SI 1289 ECB_BLOCK(2, camellia_dec_blk_2way); 1290 ECB_BLOCK(1, camellia_dec_blk); 1291 ECB_WALK_END(); 1292 } 1293 1294 static int cbc_encrypt(struct skcipher_reques 1295 { 1296 CBC_WALK_START(req, CAMELLIA_BLOCK_SI 1297 CBC_ENC_BLOCK(camellia_enc_blk); 1298 CBC_WALK_END(); 1299 } 1300 1301 static int cbc_decrypt(struct skcipher_reques 1302 { 1303 CBC_WALK_START(req, CAMELLIA_BLOCK_SI 1304 CBC_DEC_BLOCK(2, camellia_decrypt_cbc 1305 CBC_DEC_BLOCK(1, camellia_dec_blk); 1306 CBC_WALK_END(); 1307 } 1308 1309 static struct crypto_alg camellia_cipher_alg 1310 .cra_name = "camellia", 1311 .cra_driver_name = "camellia-a 1312 .cra_priority = 200, 1313 .cra_flags = CRYPTO_ALG_ 1314 .cra_blocksize = CAMELLIA_BL 1315 .cra_ctxsize = sizeof(stru 1316 .cra_alignmask = 0, 1317 .cra_module = THIS_MODULE 1318 .cra_u = { 1319 .cipher = { 1320 .cia_min_keysize = CA 1321 .cia_max_keysize = CA 1322 .cia_setkey = ca 1323 .cia_encrypt = ca 1324 .cia_decrypt = ca 1325 } 1326 } 1327 }; 1328 1329 static struct skcipher_alg camellia_skcipher_ 1330 { 1331 .base.cra_name = "ec 1332 .base.cra_driver_name = "ec 1333 .base.cra_priority = 300 1334 .base.cra_blocksize = CAM 1335 .base.cra_ctxsize = siz 1336 .base.cra_module = THI 1337 .min_keysize = CAM 1338 .max_keysize = CAM 1339 .setkey = cam 1340 .encrypt = ecb 1341 .decrypt = ecb 1342 }, { 1343 .base.cra_name = "cb 1344 .base.cra_driver_name = "cb 1345 .base.cra_priority = 300 1346 .base.cra_blocksize = CAM 1347 .base.cra_ctxsize = siz 1348 .base.cra_module = THI 1349 .min_keysize = CAM 1350 .max_keysize = CAM 1351 .ivsize = CAM 1352 .setkey = cam 1353 .encrypt = cbc 1354 .decrypt = cbc 1355 } 1356 }; 1357 1358 static bool is_blacklisted_cpu(void) 1359 { 1360 if (boot_cpu_data.x86_vendor != X86_V 1361 return false; 1362 1363 if (boot_cpu_data.x86 == 0x0f) { 1364 /* 1365 * On Pentium 4, camellia-asm 1366 * implementation because exc 1367 * left-shifts (which are rea 1368 * handle 128bit block in two 1369 */ 1370 return true; 1371 } 1372 1373 return false; 1374 } 1375 1376 static int force; 1377 module_param(force, int, 0); 1378 MODULE_PARM_DESC(force, "Force module load, i 1379 1380 static int __init camellia_init(void) 1381 { 1382 int err; 1383 1384 if (!force && is_blacklisted_cpu()) { 1385 printk(KERN_INFO 1386 "camellia-x86_64: per 1387 "would be suboptimal: 1388 "camellia-x86_64.\n") 1389 return -ENODEV; 1390 } 1391 1392 err = crypto_register_alg(&camellia_c 1393 if (err) 1394 return err; 1395 1396 err = crypto_register_skciphers(camel 1397 ARRAY 1398 if (err) 1399 crypto_unregister_alg(&camell 1400 1401 return err; 1402 } 1403 1404 static void __exit camellia_fini(void) 1405 { 1406 crypto_unregister_alg(&camellia_ciphe 1407 crypto_unregister_skciphers(camellia_ 1408 ARRAY_SIZ 1409 } 1410 1411 module_init(camellia_init); 1412 module_exit(camellia_fini); 1413 1414 MODULE_LICENSE("GPL"); 1415 MODULE_DESCRIPTION("Camellia Cipher Algorithm 1416 MODULE_ALIAS_CRYPTO("camellia"); 1417 MODULE_ALIAS_CRYPTO("camellia-asm"); 1418
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.