2005-04-17 02:20:36 +04:00
/*
* Cryptographic API .
*
* Khazad Algorithm
*
* The Khazad algorithm was developed by Paulo S . L . M . Barreto and
* Vincent Rijmen . It was a finalist in the NESSIE encryption contest .
*
* The original authors have disclaimed all copyright interest in this
* code and thus put it in the public domain . The subsequent authors
* have put this under the GNU General Public License .
*
* By Aaron Grothe ajgrothe @ yahoo . com , August 1 , 2004
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*
*/
# include <linux/init.h>
# include <linux/module.h>
# include <linux/mm.h>
2005-10-30 13:25:15 +03:00
# include <asm/byteorder.h>
2005-04-17 02:20:36 +04:00
# include <linux/crypto.h>
2005-10-30 13:25:15 +03:00
# include <linux/types.h>
2005-04-17 02:20:36 +04:00
# define KHAZAD_KEY_SIZE 16
# define KHAZAD_BLOCK_SIZE 8
# define KHAZAD_ROUNDS 8
struct khazad_ctx {
u64 E [ KHAZAD_ROUNDS + 1 ] ;
u64 D [ KHAZAD_ROUNDS + 1 ] ;
} ;
static const u64 T0 [ 256 ] = {
0xbad3d268bbb96a01ULL , 0x54fc4d19e59a66b1ULL , 0x2f71bc93e26514cdULL ,
0x749ccdb925871b51ULL , 0x53f55102f7a257a4ULL , 0xd3686bb8d0d6be03ULL ,
0xd26b6fbdd6deb504ULL , 0x4dd72964b35285feULL , 0x50f05d0dfdba4aadULL ,
0xace98a26cf09e063ULL , 0x8d8a0e83091c9684ULL , 0xbfdcc679a5914d1aULL ,
0x7090ddad3da7374dULL , 0x52f65507f1aa5ca3ULL , 0x9ab352c87ba417e1ULL ,
0x4cd42d61b55a8ef9ULL , 0xea238f65460320acULL , 0xd56273a6c4e68411ULL ,
0x97a466f155cc68c2ULL , 0xd16e63b2dcc6a80dULL , 0x3355ccffaa85d099ULL ,
0x51f35908fbb241aaULL , 0x5bed712ac7e20f9cULL , 0xa6f7a204f359ae55ULL ,
0xde7f5f81febec120ULL , 0x48d83d75ad7aa2e5ULL , 0xa8e59a32d729cc7fULL ,
0x99b65ec771bc0ae8ULL , 0xdb704b90e096e63bULL , 0x3256c8faac8ddb9eULL ,
0xb7c4e65195d11522ULL , 0xfc19d72b32b3aaceULL , 0xe338ab48704b7393ULL ,
0x9ebf42dc63843bfdULL , 0x91ae7eef41fc52d0ULL , 0x9bb056cd7dac1ce6ULL ,
0xe23baf4d76437894ULL , 0xbbd0d66dbdb16106ULL , 0x41c319589b32f1daULL ,
0x6eb2a5cb7957e517ULL , 0xa5f2ae0bf941b35cULL , 0xcb400bc08016564bULL ,
0x6bbdb1da677fc20cULL , 0x95a26efb59dc7eccULL , 0xa1febe1fe1619f40ULL ,
0xf308eb1810cbc3e3ULL , 0xb1cefe4f81e12f30ULL , 0x0206080a0c10160eULL ,
0xcc4917db922e675eULL , 0xc45137f3a26e3f66ULL , 0x1d2774694ee8cf53ULL ,
0x143c504478a09c6cULL , 0xc3582be8b0560e73ULL , 0x63a591f2573f9a34ULL ,
0xda734f95e69eed3cULL , 0x5de76934d3d2358eULL , 0x5fe1613edfc22380ULL ,
0xdc79578bf2aed72eULL , 0x7d87e99413cf486eULL , 0xcd4a13de94266c59ULL ,
0x7f81e19e1fdf5e60ULL , 0x5aee752fc1ea049bULL , 0x6cb4adc17547f319ULL ,
0x5ce46d31d5da3e89ULL , 0xf704fb0c08ebefffULL , 0x266a98bed42d47f2ULL ,
0xff1cdb2438abb7c7ULL , 0xed2a937e543b11b9ULL , 0xe825876f4a1336a2ULL ,
0x9dba4ed3699c26f4ULL , 0x6fb1a1ce7f5fee10ULL , 0x8e8f028c03048b8dULL ,
0x192b647d56c8e34fULL , 0xa0fdba1ae7699447ULL , 0xf00de7171ad3deeaULL ,
0x89861e97113cba98ULL , 0x0f113c332278692dULL , 0x07091c1b12383115ULL ,
0xafec8629c511fd6aULL , 0xfb10cb30208b9bdbULL , 0x0818202830405838ULL ,
0x153f54417ea8976bULL , 0x0d1734392e687f23ULL , 0x040c101418202c1cULL ,
0x0103040506080b07ULL , 0x64ac8de94507ab21ULL , 0xdf7c5b84f8b6ca27ULL ,
0x769ac5b329970d5fULL , 0x798bf9800bef6472ULL , 0xdd7a538ef4a6dc29ULL ,
0x3d47f4c98ef5b2b3ULL , 0x163a584e74b08a62ULL , 0x3f41fcc382e5a4bdULL ,
0x3759dcebb2a5fc85ULL , 0x6db7a9c4734ff81eULL , 0x3848e0d890dd95a8ULL ,
0xb9d6de67b1a17708ULL , 0x7395d1a237bf2a44ULL , 0xe926836a4c1b3da5ULL ,
0x355fd4e1beb5ea8bULL , 0x55ff491ce3926db6ULL , 0x7193d9a83baf3c4aULL ,
0x7b8df18a07ff727cULL , 0x8c890a860f149d83ULL , 0x7296d5a731b72143ULL ,
0x88851a921734b19fULL , 0xf607ff090ee3e4f8ULL , 0x2a7ea882fc4d33d6ULL ,
0x3e42f8c684edafbaULL , 0x5ee2653bd9ca2887ULL , 0x27699cbbd2254cf5ULL ,
0x46ca0543890ac0cfULL , 0x0c14303c28607424ULL , 0x65af89ec430fa026ULL ,
0x68b8bdd56d67df05ULL , 0x61a399f85b2f8c3aULL , 0x03050c0f0a181d09ULL ,
0xc15e23e2bc46187dULL , 0x57f94116ef827bb8ULL , 0xd6677fa9cefe9918ULL ,
0xd976439aec86f035ULL , 0x58e87d25cdfa1295ULL , 0xd875479fea8efb32ULL ,
0x66aa85e34917bd2fULL , 0xd7647bacc8f6921fULL , 0x3a4ee8d29ccd83a6ULL ,
0xc84507cf8a0e4b42ULL , 0x3c44f0cc88fdb9b4ULL , 0xfa13cf35268390dcULL ,
0x96a762f453c463c5ULL , 0xa7f4a601f551a552ULL , 0x98b55ac277b401efULL ,
0xec29977b52331abeULL , 0xb8d5da62b7a97c0fULL , 0xc7543bfca876226fULL ,
0xaeef822cc319f66dULL , 0x69bbb9d06b6fd402ULL , 0x4bdd317aa762bfecULL ,
0xabe0963ddd31d176ULL , 0xa9e69e37d121c778ULL , 0x67a981e64f1fb628ULL ,
0x0a1e28223c504e36ULL , 0x47c901468f02cbc8ULL , 0xf20bef1d16c3c8e4ULL ,
0xb5c2ee5b99c1032cULL , 0x226688aacc0d6beeULL , 0xe532b356647b4981ULL ,
0xee2f9f715e230cb0ULL , 0xbedfc27ca399461dULL , 0x2b7dac87fa4538d1ULL ,
0x819e3ebf217ce2a0ULL , 0x1236485a6c90a67eULL , 0x839836b52d6cf4aeULL ,
0x1b2d6c775ad8f541ULL , 0x0e1238362470622aULL , 0x23658cafca0560e9ULL ,
0xf502f30604fbf9f1ULL , 0x45cf094c8312ddc6ULL , 0x216384a5c61576e7ULL ,
0xce4f1fd19e3e7150ULL , 0x49db3970ab72a9e2ULL , 0x2c74b09ce87d09c4ULL ,
0xf916c33a2c9b8dd5ULL , 0xe637bf596e635488ULL , 0xb6c7e25493d91e25ULL ,
0x2878a088f05d25d8ULL , 0x17395c4b72b88165ULL , 0x829b32b02b64ffa9ULL ,
0x1a2e68725cd0fe46ULL , 0x8b80169d1d2cac96ULL , 0xfe1fdf213ea3bcc0ULL ,
0x8a8312981b24a791ULL , 0x091b242d3648533fULL , 0xc94603ca8c064045ULL ,
0x879426a1354cd8b2ULL , 0x4ed2256bb94a98f7ULL , 0xe13ea3427c5b659dULL ,
0x2e72b896e46d1fcaULL , 0xe431b75362734286ULL , 0xe03da7477a536e9aULL ,
0xeb208b60400b2babULL , 0x90ad7aea47f459d7ULL , 0xa4f1aa0eff49b85bULL ,
0x1e22786644f0d25aULL , 0x85922eab395ccebcULL , 0x60a09dfd5d27873dULL ,
0x0000000000000000ULL , 0x256f94b1de355afbULL , 0xf401f70302f3f2f6ULL ,
0xf10ee3121cdbd5edULL , 0x94a16afe5fd475cbULL , 0x0b1d2c273a584531ULL ,
0xe734bb5c686b5f8fULL , 0x759fc9bc238f1056ULL , 0xef2c9b74582b07b7ULL ,
0x345cd0e4b8bde18cULL , 0x3153c4f5a695c697ULL , 0xd46177a3c2ee8f16ULL ,
0xd06d67b7dacea30aULL , 0x869722a43344d3b5ULL , 0x7e82e59b19d75567ULL ,
0xadea8e23c901eb64ULL , 0xfd1ad32e34bba1c9ULL , 0x297ba48df6552edfULL ,
0x3050c0f0a09dcd90ULL , 0x3b4decd79ac588a1ULL , 0x9fbc46d9658c30faULL ,
0xf815c73f2a9386d2ULL , 0xc6573ff9ae7e2968ULL , 0x13354c5f6a98ad79ULL ,
0x060a181e14303a12ULL , 0x050f14111e28271bULL , 0xc55233f6a4663461ULL ,
0x113344556688bb77ULL , 0x7799c1b62f9f0658ULL , 0x7c84ed9115c74369ULL ,
0x7a8ef58f01f7797bULL , 0x7888fd850de76f75ULL , 0x365ad8eeb4adf782ULL ,
0x1c24706c48e0c454ULL , 0x394be4dd96d59eafULL , 0x59eb7920cbf21992ULL ,
0x1828607850c0e848ULL , 0x56fa4513e98a70bfULL , 0xb3c8f6458df1393eULL ,
0xb0cdfa4a87e92437ULL , 0x246c90b4d83d51fcULL , 0x206080a0c01d7de0ULL ,
0xb2cbf2408bf93239ULL , 0x92ab72e04be44fd9ULL , 0xa3f8b615ed71894eULL ,
0xc05d27e7ba4e137aULL , 0x44cc0d49851ad6c1ULL , 0x62a695f751379133ULL ,
0x103040506080b070ULL , 0xb4c1ea5e9fc9082bULL , 0x84912aae3f54c5bbULL ,
0x43c511529722e7d4ULL , 0x93a876e54dec44deULL , 0xc25b2fedb65e0574ULL ,
0x4ade357fa16ab4ebULL , 0xbddace73a9815b14ULL , 0x8f8c0689050c808aULL ,
0x2d77b499ee7502c3ULL , 0xbcd9ca76af895013ULL , 0x9cb94ad66f942df3ULL ,
0x6abeb5df6177c90bULL , 0x40c01d5d9d3afaddULL , 0xcf4c1bd498367a57ULL ,
0xa2fbb210eb798249ULL , 0x809d3aba2774e9a7ULL , 0x4fd1216ebf4293f0ULL ,
0x1f217c6342f8d95dULL , 0xca430fc5861e5d4cULL , 0xaae39238db39da71ULL ,
0x42c61557912aecd3ULL
} ;
static const u64 T1 [ 256 ] = {
0xd3ba68d2b9bb016aULL , 0xfc54194d9ae5b166ULL , 0x712f93bc65e2cd14ULL ,
0x9c74b9cd8725511bULL , 0xf5530251a2f7a457ULL , 0x68d3b86bd6d003beULL ,
0x6bd2bd6fded604b5ULL , 0xd74d642952b3fe85ULL , 0xf0500d5dbafdad4aULL ,
0xe9ac268a09cf63e0ULL , 0x8a8d830e1c098496ULL , 0xdcbf79c691a51a4dULL ,
0x9070addda73d4d37ULL , 0xf6520755aaf1a35cULL , 0xb39ac852a47be117ULL ,
0xd44c612d5ab5f98eULL , 0x23ea658f0346ac20ULL , 0x62d5a673e6c41184ULL ,
0xa497f166cc55c268ULL , 0x6ed1b263c6dc0da8ULL , 0x5533ffcc85aa99d0ULL ,
0xf3510859b2fbaa41ULL , 0xed5b2a71e2c79c0fULL , 0xf7a604a259f355aeULL ,
0x7fde815fbefe20c1ULL , 0xd848753d7aade5a2ULL , 0xe5a8329a29d77fccULL ,
0xb699c75ebc71e80aULL , 0x70db904b96e03be6ULL , 0x5632fac88dac9edbULL ,
0xc4b751e6d1952215ULL , 0x19fc2bd7b332ceaaULL , 0x38e348ab4b709373ULL ,
0xbf9edc428463fd3bULL , 0xae91ef7efc41d052ULL , 0xb09bcd56ac7de61cULL ,
0x3be24daf43769478ULL , 0xd0bb6dd6b1bd0661ULL , 0xc3415819329bdaf1ULL ,
0xb26ecba5577917e5ULL , 0xf2a50bae41f95cb3ULL , 0x40cbc00b16804b56ULL ,
0xbd6bdab17f670cc2ULL , 0xa295fb6edc59cc7eULL , 0xfea11fbe61e1409fULL ,
0x08f318ebcb10e3c3ULL , 0xceb14ffee181302fULL , 0x06020a08100c0e16ULL ,
0x49ccdb172e925e67ULL , 0x51c4f3376ea2663fULL , 0x271d6974e84e53cfULL ,
0x3c144450a0786c9cULL , 0x58c3e82b56b0730eULL , 0xa563f2913f57349aULL ,
0x73da954f9ee63cedULL , 0xe75d3469d2d38e35ULL , 0xe15f3e61c2df8023ULL ,
0x79dc8b57aef22ed7ULL , 0x877d94e9cf136e48ULL , 0x4acdde132694596cULL ,
0x817f9ee1df1f605eULL , 0xee5a2f75eac19b04ULL , 0xb46cc1ad477519f3ULL ,
0xe45c316ddad5893eULL , 0x04f70cfbeb08ffefULL , 0x6a26be982dd4f247ULL ,
0x1cff24dbab38c7b7ULL , 0x2aed7e933b54b911ULL , 0x25e86f87134aa236ULL ,
0xba9dd34e9c69f426ULL , 0xb16fcea15f7f10eeULL , 0x8f8e8c0204038d8bULL ,
0x2b197d64c8564fe3ULL , 0xfda01aba69e74794ULL , 0x0df017e7d31aeadeULL ,
0x8689971e3c1198baULL , 0x110f333c78222d69ULL , 0x09071b1c38121531ULL ,
0xecaf298611c56afdULL , 0x10fb30cb8b20db9bULL , 0x1808282040303858ULL ,
0x3f154154a87e6b97ULL , 0x170d3934682e237fULL , 0x0c04141020181c2cULL ,
0x030105040806070bULL , 0xac64e98d074521abULL , 0x7cdf845bb6f827caULL ,
0x9a76b3c597295f0dULL , 0x8b7980f9ef0b7264ULL , 0x7add8e53a6f429dcULL ,
0x473dc9f4f58eb3b2ULL , 0x3a164e58b074628aULL , 0x413fc3fce582bda4ULL ,
0x5937ebdca5b285fcULL , 0xb76dc4a94f731ef8ULL , 0x4838d8e0dd90a895ULL ,
0xd6b967dea1b10877ULL , 0x9573a2d1bf37442aULL , 0x26e96a831b4ca53dULL ,
0x5f35e1d4b5be8beaULL , 0xff551c4992e3b66dULL , 0x9371a8d9af3b4a3cULL ,
0x8d7b8af1ff077c72ULL , 0x898c860a140f839dULL , 0x9672a7d5b7314321ULL ,
0x8588921a34179fb1ULL , 0x07f609ffe30ef8e4ULL , 0x7e2a82a84dfcd633ULL ,
0x423ec6f8ed84baafULL , 0xe25e3b65cad98728ULL , 0x6927bb9c25d2f54cULL ,
0xca4643050a89cfc0ULL , 0x140c3c3060282474ULL , 0xaf65ec890f4326a0ULL ,
0xb868d5bd676d05dfULL , 0xa361f8992f5b3a8cULL , 0x05030f0c180a091dULL ,
0x5ec1e22346bc7d18ULL , 0xf957164182efb87bULL , 0x67d6a97ffece1899ULL ,
0x76d99a4386ec35f0ULL , 0xe858257dfacd9512ULL , 0x75d89f478eea32fbULL ,
0xaa66e38517492fbdULL , 0x64d7ac7bf6c81f92ULL , 0x4e3ad2e8cd9ca683ULL ,
0x45c8cf070e8a424bULL , 0x443cccf0fd88b4b9ULL , 0x13fa35cf8326dc90ULL ,
0xa796f462c453c563ULL , 0xf4a701a651f552a5ULL , 0xb598c25ab477ef01ULL ,
0x29ec7b973352be1aULL , 0xd5b862daa9b70f7cULL , 0x54c7fc3b76a86f22ULL ,
0xefae2c8219c36df6ULL , 0xbb69d0b96f6b02d4ULL , 0xdd4b7a3162a7ecbfULL ,
0xe0ab3d9631dd76d1ULL , 0xe6a9379e21d178c7ULL , 0xa967e6811f4f28b6ULL ,
0x1e0a2228503c364eULL , 0xc9474601028fc8cbULL , 0x0bf21defc316e4c8ULL ,
0xc2b55beec1992c03ULL , 0x6622aa880dccee6bULL , 0x32e556b37b648149ULL ,
0x2fee719f235eb00cULL , 0xdfbe7cc299a31d46ULL , 0x7d2b87ac45fad138ULL ,
0x9e81bf3e7c21a0e2ULL , 0x36125a48906c7ea6ULL , 0x9883b5366c2daef4ULL ,
0x2d1b776cd85a41f5ULL , 0x120e363870242a62ULL , 0x6523af8c05cae960ULL ,
0x02f506f3fb04f1f9ULL , 0xcf454c091283c6ddULL , 0x6321a58415c6e776ULL ,
0x4fced11f3e9e5071ULL , 0xdb49703972abe2a9ULL , 0x742c9cb07de8c409ULL ,
0x16f93ac39b2cd58dULL , 0x37e659bf636e8854ULL , 0xc7b654e2d993251eULL ,
0x782888a05df0d825ULL , 0x39174b5cb8726581ULL , 0x9b82b032642ba9ffULL ,
0x2e1a7268d05c46feULL , 0x808b9d162c1d96acULL , 0x1ffe21dfa33ec0bcULL ,
0x838a9812241b91a7ULL , 0x1b092d2448363f53ULL , 0x46c9ca03068c4540ULL ,
0x9487a1264c35b2d8ULL , 0xd24e6b254ab9f798ULL , 0x3ee142a35b7c9d65ULL ,
0x722e96b86de4ca1fULL , 0x31e453b773628642ULL , 0x3de047a7537a9a6eULL ,
0x20eb608b0b40ab2bULL , 0xad90ea7af447d759ULL , 0xf1a40eaa49ff5bb8ULL ,
0x221e6678f0445ad2ULL , 0x9285ab2e5c39bcceULL , 0xa060fd9d275d3d87ULL ,
0x0000000000000000ULL , 0x6f25b19435defb5aULL , 0x01f403f7f302f6f2ULL ,
0x0ef112e3db1cedd5ULL , 0xa194fe6ad45fcb75ULL , 0x1d0b272c583a3145ULL ,
0x34e75cbb6b688f5fULL , 0x9f75bcc98f235610ULL , 0x2cef749b2b58b707ULL ,
0x5c34e4d0bdb88ce1ULL , 0x5331f5c495a697c6ULL , 0x61d4a377eec2168fULL ,
0x6dd0b767ceda0aa3ULL , 0x9786a4224433b5d3ULL , 0x827e9be5d7196755ULL ,
0xeaad238e01c964ebULL , 0x1afd2ed3bb34c9a1ULL , 0x7b298da455f6df2eULL ,
0x5030f0c09da090cdULL , 0x4d3bd7ecc59aa188ULL , 0xbc9fd9468c65fa30ULL ,
0x15f83fc7932ad286ULL , 0x57c6f93f7eae6829ULL , 0x35135f4c986a79adULL ,
0x0a061e183014123aULL , 0x0f051114281e1b27ULL , 0x52c5f63366a46134ULL ,
0x33115544886677bbULL , 0x9977b6c19f2f5806ULL , 0x847c91edc7156943ULL ,
0x8e7a8ff5f7017b79ULL , 0x887885fde70d756fULL , 0x5a36eed8adb482f7ULL ,
0x241c6c70e04854c4ULL , 0x4b39dde4d596af9eULL , 0xeb592079f2cb9219ULL ,
0x28187860c05048e8ULL , 0xfa5613458ae9bf70ULL , 0xc8b345f6f18d3e39ULL ,
0xcdb04afae9873724ULL , 0x6c24b4903dd8fc51ULL , 0x6020a0801dc0e07dULL ,
0xcbb240f2f98b3932ULL , 0xab92e072e44bd94fULL , 0xf8a315b671ed4e89ULL ,
0x5dc0e7274eba7a13ULL , 0xcc44490d1a85c1d6ULL , 0xa662f79537513391ULL ,
0x30105040806070b0ULL , 0xc1b45eeac99f2b08ULL , 0x9184ae2a543fbbc5ULL ,
0xc54352112297d4e7ULL , 0xa893e576ec4dde44ULL , 0x5bc2ed2f5eb67405ULL ,
0xde4a7f356aa1ebb4ULL , 0xdabd73ce81a9145bULL , 0x8c8f89060c058a80ULL ,
0x772d99b475eec302ULL , 0xd9bc76ca89af1350ULL , 0xb99cd64a946ff32dULL ,
0xbe6adfb577610bc9ULL , 0xc0405d1d3a9dddfaULL , 0x4ccfd41b3698577aULL ,
0xfba210b279eb4982ULL , 0x9d80ba3a7427a7e9ULL , 0xd14f6e2142bff093ULL ,
0x211f637cf8425dd9ULL , 0x43cac50f1e864c5dULL , 0xe3aa389239db71daULL ,
0xc64257152a91d3ecULL
} ;
static const u64 T2 [ 256 ] = {
0xd268bad36a01bbb9ULL , 0x4d1954fc66b1e59aULL , 0xbc932f7114cde265ULL ,
0xcdb9749c1b512587ULL , 0x510253f557a4f7a2ULL , 0x6bb8d368be03d0d6ULL ,
0x6fbdd26bb504d6deULL , 0x29644dd785feb352ULL , 0x5d0d50f04aadfdbaULL ,
0x8a26ace9e063cf09ULL , 0x0e838d8a9684091cULL , 0xc679bfdc4d1aa591ULL ,
0xddad7090374d3da7ULL , 0x550752f65ca3f1aaULL , 0x52c89ab317e17ba4ULL ,
0x2d614cd48ef9b55aULL , 0x8f65ea2320ac4603ULL , 0x73a6d5628411c4e6ULL ,
0x66f197a468c255ccULL , 0x63b2d16ea80ddcc6ULL , 0xccff3355d099aa85ULL ,
0x590851f341aafbb2ULL , 0x712a5bed0f9cc7e2ULL , 0xa204a6f7ae55f359ULL ,
0x5f81de7fc120febeULL , 0x3d7548d8a2e5ad7aULL , 0x9a32a8e5cc7fd729ULL ,
0x5ec799b60ae871bcULL , 0x4b90db70e63be096ULL , 0xc8fa3256db9eac8dULL ,
0xe651b7c4152295d1ULL , 0xd72bfc19aace32b3ULL , 0xab48e3387393704bULL ,
0x42dc9ebf3bfd6384ULL , 0x7eef91ae52d041fcULL , 0x56cd9bb01ce67dacULL ,
0xaf4de23b78947643ULL , 0xd66dbbd06106bdb1ULL , 0x195841c3f1da9b32ULL ,
0xa5cb6eb2e5177957ULL , 0xae0ba5f2b35cf941ULL , 0x0bc0cb40564b8016ULL ,
0xb1da6bbdc20c677fULL , 0x6efb95a27ecc59dcULL , 0xbe1fa1fe9f40e161ULL ,
0xeb18f308c3e310cbULL , 0xfe4fb1ce2f3081e1ULL , 0x080a0206160e0c10ULL ,
0x17dbcc49675e922eULL , 0x37f3c4513f66a26eULL , 0x74691d27cf534ee8ULL ,
0x5044143c9c6c78a0ULL , 0x2be8c3580e73b056ULL , 0x91f263a59a34573fULL ,
0x4f95da73ed3ce69eULL , 0x69345de7358ed3d2ULL , 0x613e5fe12380dfc2ULL ,
0x578bdc79d72ef2aeULL , 0xe9947d87486e13cfULL , 0x13decd4a6c599426ULL ,
0xe19e7f815e601fdfULL , 0x752f5aee049bc1eaULL , 0xadc16cb4f3197547ULL ,
0x6d315ce43e89d5daULL , 0xfb0cf704efff08ebULL , 0x98be266a47f2d42dULL ,
0xdb24ff1cb7c738abULL , 0x937eed2a11b9543bULL , 0x876fe82536a24a13ULL ,
0x4ed39dba26f4699cULL , 0xa1ce6fb1ee107f5fULL , 0x028c8e8f8b8d0304ULL ,
0x647d192be34f56c8ULL , 0xba1aa0fd9447e769ULL , 0xe717f00ddeea1ad3ULL ,
0x1e978986ba98113cULL , 0x3c330f11692d2278ULL , 0x1c1b070931151238ULL ,
0x8629afecfd6ac511ULL , 0xcb30fb109bdb208bULL , 0x2028081858383040ULL ,
0x5441153f976b7ea8ULL , 0x34390d177f232e68ULL , 0x1014040c2c1c1820ULL ,
0x040501030b070608ULL , 0x8de964acab214507ULL , 0x5b84df7cca27f8b6ULL ,
0xc5b3769a0d5f2997ULL , 0xf980798b64720befULL , 0x538edd7adc29f4a6ULL ,
0xf4c93d47b2b38ef5ULL , 0x584e163a8a6274b0ULL , 0xfcc33f41a4bd82e5ULL ,
0xdceb3759fc85b2a5ULL , 0xa9c46db7f81e734fULL , 0xe0d8384895a890ddULL ,
0xde67b9d67708b1a1ULL , 0xd1a273952a4437bfULL , 0x836ae9263da54c1bULL ,
0xd4e1355fea8bbeb5ULL , 0x491c55ff6db6e392ULL , 0xd9a871933c4a3bafULL ,
0xf18a7b8d727c07ffULL , 0x0a868c899d830f14ULL , 0xd5a77296214331b7ULL ,
0x1a928885b19f1734ULL , 0xff09f607e4f80ee3ULL , 0xa8822a7e33d6fc4dULL ,
0xf8c63e42afba84edULL , 0x653b5ee22887d9caULL , 0x9cbb27694cf5d225ULL ,
0x054346cac0cf890aULL , 0x303c0c1474242860ULL , 0x89ec65afa026430fULL ,
0xbdd568b8df056d67ULL , 0x99f861a38c3a5b2fULL , 0x0c0f03051d090a18ULL ,
0x23e2c15e187dbc46ULL , 0x411657f97bb8ef82ULL , 0x7fa9d6679918cefeULL ,
0x439ad976f035ec86ULL , 0x7d2558e81295cdfaULL , 0x479fd875fb32ea8eULL ,
0x85e366aabd2f4917ULL , 0x7bacd764921fc8f6ULL , 0xe8d23a4e83a69ccdULL ,
0x07cfc8454b428a0eULL , 0xf0cc3c44b9b488fdULL , 0xcf35fa1390dc2683ULL ,
0x62f496a763c553c4ULL , 0xa601a7f4a552f551ULL , 0x5ac298b501ef77b4ULL ,
0x977bec291abe5233ULL , 0xda62b8d57c0fb7a9ULL , 0x3bfcc754226fa876ULL ,
0x822caeeff66dc319ULL , 0xb9d069bbd4026b6fULL , 0x317a4bddbfeca762ULL ,
0x963dabe0d176dd31ULL , 0x9e37a9e6c778d121ULL , 0x81e667a9b6284f1fULL ,
0x28220a1e4e363c50ULL , 0x014647c9cbc88f02ULL , 0xef1df20bc8e416c3ULL ,
0xee5bb5c2032c99c1ULL , 0x88aa22666beecc0dULL , 0xb356e5324981647bULL ,
0x9f71ee2f0cb05e23ULL , 0xc27cbedf461da399ULL , 0xac872b7d38d1fa45ULL ,
0x3ebf819ee2a0217cULL , 0x485a1236a67e6c90ULL , 0x36b58398f4ae2d6cULL ,
0x6c771b2df5415ad8ULL , 0x38360e12622a2470ULL , 0x8caf236560e9ca05ULL ,
0xf306f502f9f104fbULL , 0x094c45cfddc68312ULL , 0x84a5216376e7c615ULL ,
0x1fd1ce4f71509e3eULL , 0x397049dba9e2ab72ULL , 0xb09c2c7409c4e87dULL ,
0xc33af9168dd52c9bULL , 0xbf59e63754886e63ULL , 0xe254b6c71e2593d9ULL ,
0xa088287825d8f05dULL , 0x5c4b1739816572b8ULL , 0x32b0829bffa92b64ULL ,
0x68721a2efe465cd0ULL , 0x169d8b80ac961d2cULL , 0xdf21fe1fbcc03ea3ULL ,
0x12988a83a7911b24ULL , 0x242d091b533f3648ULL , 0x03cac94640458c06ULL ,
0x26a18794d8b2354cULL , 0x256b4ed298f7b94aULL , 0xa342e13e659d7c5bULL ,
0xb8962e721fcae46dULL , 0xb753e43142866273ULL , 0xa747e03d6e9a7a53ULL ,
0x8b60eb202bab400bULL , 0x7aea90ad59d747f4ULL , 0xaa0ea4f1b85bff49ULL ,
0x78661e22d25a44f0ULL , 0x2eab8592cebc395cULL , 0x9dfd60a0873d5d27ULL ,
0x0000000000000000ULL , 0x94b1256f5afbde35ULL , 0xf703f401f2f602f3ULL ,
0xe312f10ed5ed1cdbULL , 0x6afe94a175cb5fd4ULL , 0x2c270b1d45313a58ULL ,
0xbb5ce7345f8f686bULL , 0xc9bc759f1056238fULL , 0x9b74ef2c07b7582bULL ,
0xd0e4345ce18cb8bdULL , 0xc4f53153c697a695ULL , 0x77a3d4618f16c2eeULL ,
0x67b7d06da30adaceULL , 0x22a48697d3b53344ULL , 0xe59b7e82556719d7ULL ,
0x8e23adeaeb64c901ULL , 0xd32efd1aa1c934bbULL , 0xa48d297b2edff655ULL ,
0xc0f03050cd90a09dULL , 0xecd73b4d88a19ac5ULL , 0x46d99fbc30fa658cULL ,
0xc73ff81586d22a93ULL , 0x3ff9c6572968ae7eULL , 0x4c5f1335ad796a98ULL ,
0x181e060a3a121430ULL , 0x1411050f271b1e28ULL , 0x33f6c5523461a466ULL ,
0x44551133bb776688ULL , 0xc1b6779906582f9fULL , 0xed917c84436915c7ULL ,
0xf58f7a8e797b01f7ULL , 0xfd8578886f750de7ULL , 0xd8ee365af782b4adULL ,
0x706c1c24c45448e0ULL , 0xe4dd394b9eaf96d5ULL , 0x792059eb1992cbf2ULL ,
0x60781828e84850c0ULL , 0x451356fa70bfe98aULL , 0xf645b3c8393e8df1ULL ,
0xfa4ab0cd243787e9ULL , 0x90b4246c51fcd83dULL , 0x80a020607de0c01dULL ,
0xf240b2cb32398bf9ULL , 0x72e092ab4fd94be4ULL , 0xb615a3f8894eed71ULL ,
0x27e7c05d137aba4eULL , 0x0d4944ccd6c1851aULL , 0x95f762a691335137ULL ,
0x40501030b0706080ULL , 0xea5eb4c1082b9fc9ULL , 0x2aae8491c5bb3f54ULL ,
0x115243c5e7d49722ULL , 0x76e593a844de4decULL , 0x2fedc25b0574b65eULL ,
0x357f4adeb4eba16aULL , 0xce73bdda5b14a981ULL , 0x06898f8c808a050cULL ,
0xb4992d7702c3ee75ULL , 0xca76bcd95013af89ULL , 0x4ad69cb92df36f94ULL ,
0xb5df6abec90b6177ULL , 0x1d5d40c0fadd9d3aULL , 0x1bd4cf4c7a579836ULL ,
0xb210a2fb8249eb79ULL , 0x3aba809de9a72774ULL , 0x216e4fd193f0bf42ULL ,
0x7c631f21d95d42f8ULL , 0x0fc5ca435d4c861eULL , 0x9238aae3da71db39ULL ,
0x155742c6ecd3912aULL
} ;
static const u64 T3 [ 256 ] = {
0x68d2d3ba016ab9bbULL , 0x194dfc54b1669ae5ULL , 0x93bc712fcd1465e2ULL ,
0xb9cd9c74511b8725ULL , 0x0251f553a457a2f7ULL , 0xb86b68d303bed6d0ULL ,
0xbd6f6bd204b5ded6ULL , 0x6429d74dfe8552b3ULL , 0x0d5df050ad4abafdULL ,
0x268ae9ac63e009cfULL , 0x830e8a8d84961c09ULL , 0x79c6dcbf1a4d91a5ULL ,
0xaddd90704d37a73dULL , 0x0755f652a35caaf1ULL , 0xc852b39ae117a47bULL ,
0x612dd44cf98e5ab5ULL , 0x658f23eaac200346ULL , 0xa67362d51184e6c4ULL ,
0xf166a497c268cc55ULL , 0xb2636ed10da8c6dcULL , 0xffcc553399d085aaULL ,
0x0859f351aa41b2fbULL , 0x2a71ed5b9c0fe2c7ULL , 0x04a2f7a655ae59f3ULL ,
0x815f7fde20c1befeULL , 0x753dd848e5a27aadULL , 0x329ae5a87fcc29d7ULL ,
0xc75eb699e80abc71ULL , 0x904b70db3be696e0ULL , 0xfac856329edb8dacULL ,
0x51e6c4b72215d195ULL , 0x2bd719fcceaab332ULL , 0x48ab38e393734b70ULL ,
0xdc42bf9efd3b8463ULL , 0xef7eae91d052fc41ULL , 0xcd56b09be61cac7dULL ,
0x4daf3be294784376ULL , 0x6dd6d0bb0661b1bdULL , 0x5819c341daf1329bULL ,
0xcba5b26e17e55779ULL , 0x0baef2a55cb341f9ULL , 0xc00b40cb4b561680ULL ,
0xdab1bd6b0cc27f67ULL , 0xfb6ea295cc7edc59ULL , 0x1fbefea1409f61e1ULL ,
0x18eb08f3e3c3cb10ULL , 0x4ffeceb1302fe181ULL , 0x0a0806020e16100cULL ,
0xdb1749cc5e672e92ULL , 0xf33751c4663f6ea2ULL , 0x6974271d53cfe84eULL ,
0x44503c146c9ca078ULL , 0xe82b58c3730e56b0ULL , 0xf291a563349a3f57ULL ,
0x954f73da3ced9ee6ULL , 0x3469e75d8e35d2d3ULL , 0x3e61e15f8023c2dfULL ,
0x8b5779dc2ed7aef2ULL , 0x94e9877d6e48cf13ULL , 0xde134acd596c2694ULL ,
0x9ee1817f605edf1fULL , 0x2f75ee5a9b04eac1ULL , 0xc1adb46c19f34775ULL ,
0x316de45c893edad5ULL , 0x0cfb04f7ffefeb08ULL , 0xbe986a26f2472dd4ULL ,
0x24db1cffc7b7ab38ULL , 0x7e932aedb9113b54ULL , 0x6f8725e8a236134aULL ,
0xd34eba9df4269c69ULL , 0xcea1b16f10ee5f7fULL , 0x8c028f8e8d8b0403ULL ,
0x7d642b194fe3c856ULL , 0x1abafda0479469e7ULL , 0x17e70df0eaded31aULL ,
0x971e868998ba3c11ULL , 0x333c110f2d697822ULL , 0x1b1c090715313812ULL ,
0x2986ecaf6afd11c5ULL , 0x30cb10fbdb9b8b20ULL , 0x2820180838584030ULL ,
0x41543f156b97a87eULL , 0x3934170d237f682eULL , 0x14100c041c2c2018ULL ,
0x05040301070b0806ULL , 0xe98dac6421ab0745ULL , 0x845b7cdf27cab6f8ULL ,
0xb3c59a765f0d9729ULL , 0x80f98b797264ef0bULL , 0x8e537add29dca6f4ULL ,
0xc9f4473db3b2f58eULL , 0x4e583a16628ab074ULL , 0xc3fc413fbda4e582ULL ,
0xebdc593785fca5b2ULL , 0xc4a9b76d1ef84f73ULL , 0xd8e04838a895dd90ULL ,
0x67ded6b90877a1b1ULL , 0xa2d19573442abf37ULL , 0x6a8326e9a53d1b4cULL ,
0xe1d45f358beab5beULL , 0x1c49ff55b66d92e3ULL , 0xa8d993714a3caf3bULL ,
0x8af18d7b7c72ff07ULL , 0x860a898c839d140fULL , 0xa7d596724321b731ULL ,
0x921a85889fb13417ULL , 0x09ff07f6f8e4e30eULL , 0x82a87e2ad6334dfcULL ,
0xc6f8423ebaafed84ULL , 0x3b65e25e8728cad9ULL , 0xbb9c6927f54c25d2ULL ,
0x4305ca46cfc00a89ULL , 0x3c30140c24746028ULL , 0xec89af6526a00f43ULL ,
0xd5bdb86805df676dULL , 0xf899a3613a8c2f5bULL , 0x0f0c0503091d180aULL ,
0xe2235ec17d1846bcULL , 0x1641f957b87b82efULL , 0xa97f67d61899feceULL ,
0x9a4376d935f086ecULL , 0x257de8589512facdULL , 0x9f4775d832fb8eeaULL ,
0xe385aa662fbd1749ULL , 0xac7b64d71f92f6c8ULL , 0xd2e84e3aa683cd9cULL ,
0xcf0745c8424b0e8aULL , 0xccf0443cb4b9fd88ULL , 0x35cf13fadc908326ULL ,
0xf462a796c563c453ULL , 0x01a6f4a752a551f5ULL , 0xc25ab598ef01b477ULL ,
0x7b9729ecbe1a3352ULL , 0x62dad5b80f7ca9b7ULL , 0xfc3b54c76f2276a8ULL ,
0x2c82efae6df619c3ULL , 0xd0b9bb6902d46f6bULL , 0x7a31dd4becbf62a7ULL ,
0x3d96e0ab76d131ddULL , 0x379ee6a978c721d1ULL , 0xe681a96728b61f4fULL ,
0x22281e0a364e503cULL , 0x4601c947c8cb028fULL , 0x1def0bf2e4c8c316ULL ,
0x5beec2b52c03c199ULL , 0xaa886622ee6b0dccULL , 0x56b332e581497b64ULL ,
0x719f2feeb00c235eULL , 0x7cc2dfbe1d4699a3ULL , 0x87ac7d2bd13845faULL ,
0xbf3e9e81a0e27c21ULL , 0x5a4836127ea6906cULL , 0xb5369883aef46c2dULL ,
0x776c2d1b41f5d85aULL , 0x3638120e2a627024ULL , 0xaf8c6523e96005caULL ,
0x06f302f5f1f9fb04ULL , 0x4c09cf45c6dd1283ULL , 0xa5846321e77615c6ULL ,
0xd11f4fce50713e9eULL , 0x7039db49e2a972abULL , 0x9cb0742cc4097de8ULL ,
0x3ac316f9d58d9b2cULL , 0x59bf37e68854636eULL , 0x54e2c7b6251ed993ULL ,
0x88a07828d8255df0ULL , 0x4b5c39176581b872ULL , 0xb0329b82a9ff642bULL ,
0x72682e1a46fed05cULL , 0x9d16808b96ac2c1dULL , 0x21df1ffec0bca33eULL ,
0x9812838a91a7241bULL , 0x2d241b093f534836ULL , 0xca0346c94540068cULL ,
0xa1269487b2d84c35ULL , 0x6b25d24ef7984ab9ULL , 0x42a33ee19d655b7cULL ,
0x96b8722eca1f6de4ULL , 0x53b731e486427362ULL , 0x47a73de09a6e537aULL ,
0x608b20ebab2b0b40ULL , 0xea7aad90d759f447ULL , 0x0eaaf1a45bb849ffULL ,
0x6678221e5ad2f044ULL , 0xab2e9285bcce5c39ULL , 0xfd9da0603d87275dULL ,
0x0000000000000000ULL , 0xb1946f25fb5a35deULL , 0x03f701f4f6f2f302ULL ,
0x12e30ef1edd5db1cULL , 0xfe6aa194cb75d45fULL , 0x272c1d0b3145583aULL ,
0x5cbb34e78f5f6b68ULL , 0xbcc99f7556108f23ULL , 0x749b2cefb7072b58ULL ,
0xe4d05c348ce1bdb8ULL , 0xf5c4533197c695a6ULL , 0xa37761d4168feec2ULL ,
0xb7676dd00aa3cedaULL , 0xa4229786b5d34433ULL , 0x9be5827e6755d719ULL ,
0x238eeaad64eb01c9ULL , 0x2ed31afdc9a1bb34ULL , 0x8da47b29df2e55f6ULL ,
0xf0c0503090cd9da0ULL , 0xd7ec4d3ba188c59aULL , 0xd946bc9ffa308c65ULL ,
0x3fc715f8d286932aULL , 0xf93f57c668297eaeULL , 0x5f4c351379ad986aULL ,
0x1e180a06123a3014ULL , 0x11140f051b27281eULL , 0xf63352c5613466a4ULL ,
0x5544331177bb8866ULL , 0xb6c1997758069f2fULL , 0x91ed847c6943c715ULL ,
0x8ff58e7a7b79f701ULL , 0x85fd8878756fe70dULL , 0xeed85a3682f7adb4ULL ,
0x6c70241c54c4e048ULL , 0xdde44b39af9ed596ULL , 0x2079eb599219f2cbULL ,
0x7860281848e8c050ULL , 0x1345fa56bf708ae9ULL , 0x45f6c8b33e39f18dULL ,
0x4afacdb03724e987ULL , 0xb4906c24fc513dd8ULL , 0xa0806020e07d1dc0ULL ,
0x40f2cbb23932f98bULL , 0xe072ab92d94fe44bULL , 0x15b6f8a34e8971edULL ,
0xe7275dc07a134ebaULL , 0x490dcc44c1d61a85ULL , 0xf795a66233913751ULL ,
0x5040301070b08060ULL , 0x5eeac1b42b08c99fULL , 0xae2a9184bbc5543fULL ,
0x5211c543d4e72297ULL , 0xe576a893de44ec4dULL , 0xed2f5bc274055eb6ULL ,
0x7f35de4aebb46aa1ULL , 0x73cedabd145b81a9ULL , 0x89068c8f8a800c05ULL ,
0x99b4772dc30275eeULL , 0x76cad9bc135089afULL , 0xd64ab99cf32d946fULL ,
0xdfb5be6a0bc97761ULL , 0x5d1dc040ddfa3a9dULL , 0xd41b4ccf577a3698ULL ,
0x10b2fba2498279ebULL , 0xba3a9d80a7e97427ULL , 0x6e21d14ff09342bfULL ,
0x637c211f5dd9f842ULL , 0xc50f43ca4c5d1e86ULL , 0x3892e3aa71da39dbULL ,
0x5715c642d3ec2a91ULL
} ;
static const u64 T4 [ 256 ] = {
0xbbb96a01bad3d268ULL , 0xe59a66b154fc4d19ULL , 0xe26514cd2f71bc93ULL ,
0x25871b51749ccdb9ULL , 0xf7a257a453f55102ULL , 0xd0d6be03d3686bb8ULL ,
0xd6deb504d26b6fbdULL , 0xb35285fe4dd72964ULL , 0xfdba4aad50f05d0dULL ,
0xcf09e063ace98a26ULL , 0x091c96848d8a0e83ULL , 0xa5914d1abfdcc679ULL ,
0x3da7374d7090ddadULL , 0xf1aa5ca352f65507ULL , 0x7ba417e19ab352c8ULL ,
0xb55a8ef94cd42d61ULL , 0x460320acea238f65ULL , 0xc4e68411d56273a6ULL ,
0x55cc68c297a466f1ULL , 0xdcc6a80dd16e63b2ULL , 0xaa85d0993355ccffULL ,
0xfbb241aa51f35908ULL , 0xc7e20f9c5bed712aULL , 0xf359ae55a6f7a204ULL ,
0xfebec120de7f5f81ULL , 0xad7aa2e548d83d75ULL , 0xd729cc7fa8e59a32ULL ,
0x71bc0ae899b65ec7ULL , 0xe096e63bdb704b90ULL , 0xac8ddb9e3256c8faULL ,
0x95d11522b7c4e651ULL , 0x32b3aacefc19d72bULL , 0x704b7393e338ab48ULL ,
0x63843bfd9ebf42dcULL , 0x41fc52d091ae7eefULL , 0x7dac1ce69bb056cdULL ,
0x76437894e23baf4dULL , 0xbdb16106bbd0d66dULL , 0x9b32f1da41c31958ULL ,
0x7957e5176eb2a5cbULL , 0xf941b35ca5f2ae0bULL , 0x8016564bcb400bc0ULL ,
0x677fc20c6bbdb1daULL , 0x59dc7ecc95a26efbULL , 0xe1619f40a1febe1fULL ,
0x10cbc3e3f308eb18ULL , 0x81e12f30b1cefe4fULL , 0x0c10160e0206080aULL ,
0x922e675ecc4917dbULL , 0xa26e3f66c45137f3ULL , 0x4ee8cf531d277469ULL ,
0x78a09c6c143c5044ULL , 0xb0560e73c3582be8ULL , 0x573f9a3463a591f2ULL ,
0xe69eed3cda734f95ULL , 0xd3d2358e5de76934ULL , 0xdfc223805fe1613eULL ,
0xf2aed72edc79578bULL , 0x13cf486e7d87e994ULL , 0x94266c59cd4a13deULL ,
0x1fdf5e607f81e19eULL , 0xc1ea049b5aee752fULL , 0x7547f3196cb4adc1ULL ,
0xd5da3e895ce46d31ULL , 0x08ebeffff704fb0cULL , 0xd42d47f2266a98beULL ,
0x38abb7c7ff1cdb24ULL , 0x543b11b9ed2a937eULL , 0x4a1336a2e825876fULL ,
0x699c26f49dba4ed3ULL , 0x7f5fee106fb1a1ceULL , 0x03048b8d8e8f028cULL ,
0x56c8e34f192b647dULL , 0xe7699447a0fdba1aULL , 0x1ad3deeaf00de717ULL ,
0x113cba9889861e97ULL , 0x2278692d0f113c33ULL , 0x1238311507091c1bULL ,
0xc511fd6aafec8629ULL , 0x208b9bdbfb10cb30ULL , 0x3040583808182028ULL ,
0x7ea8976b153f5441ULL , 0x2e687f230d173439ULL , 0x18202c1c040c1014ULL ,
0x06080b0701030405ULL , 0x4507ab2164ac8de9ULL , 0xf8b6ca27df7c5b84ULL ,
0x29970d5f769ac5b3ULL , 0x0bef6472798bf980ULL , 0xf4a6dc29dd7a538eULL ,
0x8ef5b2b33d47f4c9ULL , 0x74b08a62163a584eULL , 0x82e5a4bd3f41fcc3ULL ,
0xb2a5fc853759dcebULL , 0x734ff81e6db7a9c4ULL , 0x90dd95a83848e0d8ULL ,
0xb1a17708b9d6de67ULL , 0x37bf2a447395d1a2ULL , 0x4c1b3da5e926836aULL ,
0xbeb5ea8b355fd4e1ULL , 0xe3926db655ff491cULL , 0x3baf3c4a7193d9a8ULL ,
0x07ff727c7b8df18aULL , 0x0f149d838c890a86ULL , 0x31b721437296d5a7ULL ,
0x1734b19f88851a92ULL , 0x0ee3e4f8f607ff09ULL , 0xfc4d33d62a7ea882ULL ,
0x84edafba3e42f8c6ULL , 0xd9ca28875ee2653bULL , 0xd2254cf527699cbbULL ,
0x890ac0cf46ca0543ULL , 0x286074240c14303cULL , 0x430fa02665af89ecULL ,
0x6d67df0568b8bdd5ULL , 0x5b2f8c3a61a399f8ULL , 0x0a181d0903050c0fULL ,
0xbc46187dc15e23e2ULL , 0xef827bb857f94116ULL , 0xcefe9918d6677fa9ULL ,
0xec86f035d976439aULL , 0xcdfa129558e87d25ULL , 0xea8efb32d875479fULL ,
0x4917bd2f66aa85e3ULL , 0xc8f6921fd7647bacULL , 0x9ccd83a63a4ee8d2ULL ,
0x8a0e4b42c84507cfULL , 0x88fdb9b43c44f0ccULL , 0x268390dcfa13cf35ULL ,
0x53c463c596a762f4ULL , 0xf551a552a7f4a601ULL , 0x77b401ef98b55ac2ULL ,
0x52331abeec29977bULL , 0xb7a97c0fb8d5da62ULL , 0xa876226fc7543bfcULL ,
0xc319f66daeef822cULL , 0x6b6fd40269bbb9d0ULL , 0xa762bfec4bdd317aULL ,
0xdd31d176abe0963dULL , 0xd121c778a9e69e37ULL , 0x4f1fb62867a981e6ULL ,
0x3c504e360a1e2822ULL , 0x8f02cbc847c90146ULL , 0x16c3c8e4f20bef1dULL ,
0x99c1032cb5c2ee5bULL , 0xcc0d6bee226688aaULL , 0x647b4981e532b356ULL ,
0x5e230cb0ee2f9f71ULL , 0xa399461dbedfc27cULL , 0xfa4538d12b7dac87ULL ,
0x217ce2a0819e3ebfULL , 0x6c90a67e1236485aULL , 0x2d6cf4ae839836b5ULL ,
0x5ad8f5411b2d6c77ULL , 0x2470622a0e123836ULL , 0xca0560e923658cafULL ,
0x04fbf9f1f502f306ULL , 0x8312ddc645cf094cULL , 0xc61576e7216384a5ULL ,
0x9e3e7150ce4f1fd1ULL , 0xab72a9e249db3970ULL , 0xe87d09c42c74b09cULL ,
0x2c9b8dd5f916c33aULL , 0x6e635488e637bf59ULL , 0x93d91e25b6c7e254ULL ,
0xf05d25d82878a088ULL , 0x72b8816517395c4bULL , 0x2b64ffa9829b32b0ULL ,
0x5cd0fe461a2e6872ULL , 0x1d2cac968b80169dULL , 0x3ea3bcc0fe1fdf21ULL ,
0x1b24a7918a831298ULL , 0x3648533f091b242dULL , 0x8c064045c94603caULL ,
0x354cd8b2879426a1ULL , 0xb94a98f74ed2256bULL , 0x7c5b659de13ea342ULL ,
0xe46d1fca2e72b896ULL , 0x62734286e431b753ULL , 0x7a536e9ae03da747ULL ,
0x400b2babeb208b60ULL , 0x47f459d790ad7aeaULL , 0xff49b85ba4f1aa0eULL ,
0x44f0d25a1e227866ULL , 0x395ccebc85922eabULL , 0x5d27873d60a09dfdULL ,
0x0000000000000000ULL , 0xde355afb256f94b1ULL , 0x02f3f2f6f401f703ULL ,
0x1cdbd5edf10ee312ULL , 0x5fd475cb94a16afeULL , 0x3a5845310b1d2c27ULL ,
0x686b5f8fe734bb5cULL , 0x238f1056759fc9bcULL , 0x582b07b7ef2c9b74ULL ,
0xb8bde18c345cd0e4ULL , 0xa695c6973153c4f5ULL , 0xc2ee8f16d46177a3ULL ,
0xdacea30ad06d67b7ULL , 0x3344d3b5869722a4ULL , 0x19d755677e82e59bULL ,
0xc901eb64adea8e23ULL , 0x34bba1c9fd1ad32eULL , 0xf6552edf297ba48dULL ,
0xa09dcd903050c0f0ULL , 0x9ac588a13b4decd7ULL , 0x658c30fa9fbc46d9ULL ,
0x2a9386d2f815c73fULL , 0xae7e2968c6573ff9ULL , 0x6a98ad7913354c5fULL ,
0x14303a12060a181eULL , 0x1e28271b050f1411ULL , 0xa4663461c55233f6ULL ,
0x6688bb7711334455ULL , 0x2f9f06587799c1b6ULL , 0x15c743697c84ed91ULL ,
0x01f7797b7a8ef58fULL , 0x0de76f757888fd85ULL , 0xb4adf782365ad8eeULL ,
0x48e0c4541c24706cULL , 0x96d59eaf394be4ddULL , 0xcbf2199259eb7920ULL ,
0x50c0e84818286078ULL , 0xe98a70bf56fa4513ULL , 0x8df1393eb3c8f645ULL ,
0x87e92437b0cdfa4aULL , 0xd83d51fc246c90b4ULL , 0xc01d7de0206080a0ULL ,
0x8bf93239b2cbf240ULL , 0x4be44fd992ab72e0ULL , 0xed71894ea3f8b615ULL ,
0xba4e137ac05d27e7ULL , 0x851ad6c144cc0d49ULL , 0x5137913362a695f7ULL ,
0x6080b07010304050ULL , 0x9fc9082bb4c1ea5eULL , 0x3f54c5bb84912aaeULL ,
0x9722e7d443c51152ULL , 0x4dec44de93a876e5ULL , 0xb65e0574c25b2fedULL ,
0xa16ab4eb4ade357fULL , 0xa9815b14bddace73ULL , 0x050c808a8f8c0689ULL ,
0xee7502c32d77b499ULL , 0xaf895013bcd9ca76ULL , 0x6f942df39cb94ad6ULL ,
0x6177c90b6abeb5dfULL , 0x9d3afadd40c01d5dULL , 0x98367a57cf4c1bd4ULL ,
0xeb798249a2fbb210ULL , 0x2774e9a7809d3abaULL , 0xbf4293f04fd1216eULL ,
0x42f8d95d1f217c63ULL , 0x861e5d4cca430fc5ULL , 0xdb39da71aae39238ULL ,
0x912aecd342c61557ULL
} ;
static const u64 T5 [ 256 ] = {
0xb9bb016ad3ba68d2ULL , 0x9ae5b166fc54194dULL , 0x65e2cd14712f93bcULL ,
0x8725511b9c74b9cdULL , 0xa2f7a457f5530251ULL , 0xd6d003be68d3b86bULL ,
0xded604b56bd2bd6fULL , 0x52b3fe85d74d6429ULL , 0xbafdad4af0500d5dULL ,
0x09cf63e0e9ac268aULL , 0x1c0984968a8d830eULL , 0x91a51a4ddcbf79c6ULL ,
0xa73d4d379070adddULL , 0xaaf1a35cf6520755ULL , 0xa47be117b39ac852ULL ,
0x5ab5f98ed44c612dULL , 0x0346ac2023ea658fULL , 0xe6c4118462d5a673ULL ,
0xcc55c268a497f166ULL , 0xc6dc0da86ed1b263ULL , 0x85aa99d05533ffccULL ,
0xb2fbaa41f3510859ULL , 0xe2c79c0fed5b2a71ULL , 0x59f355aef7a604a2ULL ,
0xbefe20c17fde815fULL , 0x7aade5a2d848753dULL , 0x29d77fcce5a8329aULL ,
0xbc71e80ab699c75eULL , 0x96e03be670db904bULL , 0x8dac9edb5632fac8ULL ,
0xd1952215c4b751e6ULL , 0xb332ceaa19fc2bd7ULL , 0x4b70937338e348abULL ,
0x8463fd3bbf9edc42ULL , 0xfc41d052ae91ef7eULL , 0xac7de61cb09bcd56ULL ,
0x437694783be24dafULL , 0xb1bd0661d0bb6dd6ULL , 0x329bdaf1c3415819ULL ,
0x577917e5b26ecba5ULL , 0x41f95cb3f2a50baeULL , 0x16804b5640cbc00bULL ,
0x7f670cc2bd6bdab1ULL , 0xdc59cc7ea295fb6eULL , 0x61e1409ffea11fbeULL ,
0xcb10e3c308f318ebULL , 0xe181302fceb14ffeULL , 0x100c0e1606020a08ULL ,
0x2e925e6749ccdb17ULL , 0x6ea2663f51c4f337ULL , 0xe84e53cf271d6974ULL ,
0xa0786c9c3c144450ULL , 0x56b0730e58c3e82bULL , 0x3f57349aa563f291ULL ,
0x9ee63ced73da954fULL , 0xd2d38e35e75d3469ULL , 0xc2df8023e15f3e61ULL ,
0xaef22ed779dc8b57ULL , 0xcf136e48877d94e9ULL , 0x2694596c4acdde13ULL ,
0xdf1f605e817f9ee1ULL , 0xeac19b04ee5a2f75ULL , 0x477519f3b46cc1adULL ,
0xdad5893ee45c316dULL , 0xeb08ffef04f70cfbULL , 0x2dd4f2476a26be98ULL ,
0xab38c7b71cff24dbULL , 0x3b54b9112aed7e93ULL , 0x134aa23625e86f87ULL ,
0x9c69f426ba9dd34eULL , 0x5f7f10eeb16fcea1ULL , 0x04038d8b8f8e8c02ULL ,
0xc8564fe32b197d64ULL , 0x69e74794fda01abaULL , 0xd31aeade0df017e7ULL ,
0x3c1198ba8689971eULL , 0x78222d69110f333cULL , 0x3812153109071b1cULL ,
0x11c56afdecaf2986ULL , 0x8b20db9b10fb30cbULL , 0x4030385818082820ULL ,
0xa87e6b973f154154ULL , 0x682e237f170d3934ULL , 0x20181c2c0c041410ULL ,
0x0806070b03010504ULL , 0x074521abac64e98dULL , 0xb6f827ca7cdf845bULL ,
0x97295f0d9a76b3c5ULL , 0xef0b72648b7980f9ULL , 0xa6f429dc7add8e53ULL ,
0xf58eb3b2473dc9f4ULL , 0xb074628a3a164e58ULL , 0xe582bda4413fc3fcULL ,
0xa5b285fc5937ebdcULL , 0x4f731ef8b76dc4a9ULL , 0xdd90a8954838d8e0ULL ,
0xa1b10877d6b967deULL , 0xbf37442a9573a2d1ULL , 0x1b4ca53d26e96a83ULL ,
0xb5be8bea5f35e1d4ULL , 0x92e3b66dff551c49ULL , 0xaf3b4a3c9371a8d9ULL ,
0xff077c728d7b8af1ULL , 0x140f839d898c860aULL , 0xb73143219672a7d5ULL ,
0x34179fb18588921aULL , 0xe30ef8e407f609ffULL , 0x4dfcd6337e2a82a8ULL ,
0xed84baaf423ec6f8ULL , 0xcad98728e25e3b65ULL , 0x25d2f54c6927bb9cULL ,
0x0a89cfc0ca464305ULL , 0x60282474140c3c30ULL , 0x0f4326a0af65ec89ULL ,
0x676d05dfb868d5bdULL , 0x2f5b3a8ca361f899ULL , 0x180a091d05030f0cULL ,
0x46bc7d185ec1e223ULL , 0x82efb87bf9571641ULL , 0xfece189967d6a97fULL ,
0x86ec35f076d99a43ULL , 0xfacd9512e858257dULL , 0x8eea32fb75d89f47ULL ,
0x17492fbdaa66e385ULL , 0xf6c81f9264d7ac7bULL , 0xcd9ca6834e3ad2e8ULL ,
0x0e8a424b45c8cf07ULL , 0xfd88b4b9443cccf0ULL , 0x8326dc9013fa35cfULL ,
0xc453c563a796f462ULL , 0x51f552a5f4a701a6ULL , 0xb477ef01b598c25aULL ,
0x3352be1a29ec7b97ULL , 0xa9b70f7cd5b862daULL , 0x76a86f2254c7fc3bULL ,
0x19c36df6efae2c82ULL , 0x6f6b02d4bb69d0b9ULL , 0x62a7ecbfdd4b7a31ULL ,
0x31dd76d1e0ab3d96ULL , 0x21d178c7e6a9379eULL , 0x1f4f28b6a967e681ULL ,
0x503c364e1e0a2228ULL , 0x028fc8cbc9474601ULL , 0xc316e4c80bf21defULL ,
0xc1992c03c2b55beeULL , 0x0dccee6b6622aa88ULL , 0x7b64814932e556b3ULL ,
0x235eb00c2fee719fULL , 0x99a31d46dfbe7cc2ULL , 0x45fad1387d2b87acULL ,
0x7c21a0e29e81bf3eULL , 0x906c7ea636125a48ULL , 0x6c2daef49883b536ULL ,
0xd85a41f52d1b776cULL , 0x70242a62120e3638ULL , 0x05cae9606523af8cULL ,
0xfb04f1f902f506f3ULL , 0x1283c6ddcf454c09ULL , 0x15c6e7766321a584ULL ,
0x3e9e50714fced11fULL , 0x72abe2a9db497039ULL , 0x7de8c409742c9cb0ULL ,
0x9b2cd58d16f93ac3ULL , 0x636e885437e659bfULL , 0xd993251ec7b654e2ULL ,
0x5df0d825782888a0ULL , 0xb872658139174b5cULL , 0x642ba9ff9b82b032ULL ,
0xd05c46fe2e1a7268ULL , 0x2c1d96ac808b9d16ULL , 0xa33ec0bc1ffe21dfULL ,
0x241b91a7838a9812ULL , 0x48363f531b092d24ULL , 0x068c454046c9ca03ULL ,
0x4c35b2d89487a126ULL , 0x4ab9f798d24e6b25ULL , 0x5b7c9d653ee142a3ULL ,
0x6de4ca1f722e96b8ULL , 0x7362864231e453b7ULL , 0x537a9a6e3de047a7ULL ,
0x0b40ab2b20eb608bULL , 0xf447d759ad90ea7aULL , 0x49ff5bb8f1a40eaaULL ,
0xf0445ad2221e6678ULL , 0x5c39bcce9285ab2eULL , 0x275d3d87a060fd9dULL ,
0x0000000000000000ULL , 0x35defb5a6f25b194ULL , 0xf302f6f201f403f7ULL ,
0xdb1cedd50ef112e3ULL , 0xd45fcb75a194fe6aULL , 0x583a31451d0b272cULL ,
0x6b688f5f34e75cbbULL , 0x8f2356109f75bcc9ULL , 0x2b58b7072cef749bULL ,
0xbdb88ce15c34e4d0ULL , 0x95a697c65331f5c4ULL , 0xeec2168f61d4a377ULL ,
0xceda0aa36dd0b767ULL , 0x4433b5d39786a422ULL , 0xd7196755827e9be5ULL ,
0x01c964ebeaad238eULL , 0xbb34c9a11afd2ed3ULL , 0x55f6df2e7b298da4ULL ,
0x9da090cd5030f0c0ULL , 0xc59aa1884d3bd7ecULL , 0x8c65fa30bc9fd946ULL ,
0x932ad28615f83fc7ULL , 0x7eae682957c6f93fULL , 0x986a79ad35135f4cULL ,
0x3014123a0a061e18ULL , 0x281e1b270f051114ULL , 0x66a4613452c5f633ULL ,
0x886677bb33115544ULL , 0x9f2f58069977b6c1ULL , 0xc7156943847c91edULL ,
0xf7017b798e7a8ff5ULL , 0xe70d756f887885fdULL , 0xadb482f75a36eed8ULL ,
0xe04854c4241c6c70ULL , 0xd596af9e4b39dde4ULL , 0xf2cb9219eb592079ULL ,
0xc05048e828187860ULL , 0x8ae9bf70fa561345ULL , 0xf18d3e39c8b345f6ULL ,
0xe9873724cdb04afaULL , 0x3dd8fc516c24b490ULL , 0x1dc0e07d6020a080ULL ,
0xf98b3932cbb240f2ULL , 0xe44bd94fab92e072ULL , 0x71ed4e89f8a315b6ULL ,
0x4eba7a135dc0e727ULL , 0x1a85c1d6cc44490dULL , 0x37513391a662f795ULL ,
0x806070b030105040ULL , 0xc99f2b08c1b45eeaULL , 0x543fbbc59184ae2aULL ,
0x2297d4e7c5435211ULL , 0xec4dde44a893e576ULL , 0x5eb674055bc2ed2fULL ,
0x6aa1ebb4de4a7f35ULL , 0x81a9145bdabd73ceULL , 0x0c058a808c8f8906ULL ,
0x75eec302772d99b4ULL , 0x89af1350d9bc76caULL , 0x946ff32db99cd64aULL ,
0x77610bc9be6adfb5ULL , 0x3a9dddfac0405d1dULL , 0x3698577a4ccfd41bULL ,
0x79eb4982fba210b2ULL , 0x7427a7e99d80ba3aULL , 0x42bff093d14f6e21ULL ,
0xf8425dd9211f637cULL , 0x1e864c5d43cac50fULL , 0x39db71dae3aa3892ULL ,
0x2a91d3ecc6425715ULL
} ;
static const u64 T6 [ 256 ] = {
0x6a01bbb9d268bad3ULL , 0x66b1e59a4d1954fcULL , 0x14cde265bc932f71ULL ,
0x1b512587cdb9749cULL , 0x57a4f7a2510253f5ULL , 0xbe03d0d66bb8d368ULL ,
0xb504d6de6fbdd26bULL , 0x85feb35229644dd7ULL , 0x4aadfdba5d0d50f0ULL ,
0xe063cf098a26ace9ULL , 0x9684091c0e838d8aULL , 0x4d1aa591c679bfdcULL ,
0x374d3da7ddad7090ULL , 0x5ca3f1aa550752f6ULL , 0x17e17ba452c89ab3ULL ,
0x8ef9b55a2d614cd4ULL , 0x20ac46038f65ea23ULL , 0x8411c4e673a6d562ULL ,
0x68c255cc66f197a4ULL , 0xa80ddcc663b2d16eULL , 0xd099aa85ccff3355ULL ,
0x41aafbb2590851f3ULL , 0x0f9cc7e2712a5bedULL , 0xae55f359a204a6f7ULL ,
0xc120febe5f81de7fULL , 0xa2e5ad7a3d7548d8ULL , 0xcc7fd7299a32a8e5ULL ,
0x0ae871bc5ec799b6ULL , 0xe63be0964b90db70ULL , 0xdb9eac8dc8fa3256ULL ,
0x152295d1e651b7c4ULL , 0xaace32b3d72bfc19ULL , 0x7393704bab48e338ULL ,
0x3bfd638442dc9ebfULL , 0x52d041fc7eef91aeULL , 0x1ce67dac56cd9bb0ULL ,
0x78947643af4de23bULL , 0x6106bdb1d66dbbd0ULL , 0xf1da9b32195841c3ULL ,
0xe5177957a5cb6eb2ULL , 0xb35cf941ae0ba5f2ULL , 0x564b80160bc0cb40ULL ,
0xc20c677fb1da6bbdULL , 0x7ecc59dc6efb95a2ULL , 0x9f40e161be1fa1feULL ,
0xc3e310cbeb18f308ULL , 0x2f3081e1fe4fb1ceULL , 0x160e0c10080a0206ULL ,
0x675e922e17dbcc49ULL , 0x3f66a26e37f3c451ULL , 0xcf534ee874691d27ULL ,
0x9c6c78a05044143cULL , 0x0e73b0562be8c358ULL , 0x9a34573f91f263a5ULL ,
0xed3ce69e4f95da73ULL , 0x358ed3d269345de7ULL , 0x2380dfc2613e5fe1ULL ,
0xd72ef2ae578bdc79ULL , 0x486e13cfe9947d87ULL , 0x6c59942613decd4aULL ,
0x5e601fdfe19e7f81ULL , 0x049bc1ea752f5aeeULL , 0xf3197547adc16cb4ULL ,
0x3e89d5da6d315ce4ULL , 0xefff08ebfb0cf704ULL , 0x47f2d42d98be266aULL ,
0xb7c738abdb24ff1cULL , 0x11b9543b937eed2aULL , 0x36a24a13876fe825ULL ,
0x26f4699c4ed39dbaULL , 0xee107f5fa1ce6fb1ULL , 0x8b8d0304028c8e8fULL ,
0xe34f56c8647d192bULL , 0x9447e769ba1aa0fdULL , 0xdeea1ad3e717f00dULL ,
0xba98113c1e978986ULL , 0x692d22783c330f11ULL , 0x311512381c1b0709ULL ,
0xfd6ac5118629afecULL , 0x9bdb208bcb30fb10ULL , 0x5838304020280818ULL ,
0x976b7ea85441153fULL , 0x7f232e6834390d17ULL , 0x2c1c18201014040cULL ,
0x0b07060804050103ULL , 0xab2145078de964acULL , 0xca27f8b65b84df7cULL ,
0x0d5f2997c5b3769aULL , 0x64720beff980798bULL , 0xdc29f4a6538edd7aULL ,
0xb2b38ef5f4c93d47ULL , 0x8a6274b0584e163aULL , 0xa4bd82e5fcc33f41ULL ,
0xfc85b2a5dceb3759ULL , 0xf81e734fa9c46db7ULL , 0x95a890dde0d83848ULL ,
0x7708b1a1de67b9d6ULL , 0x2a4437bfd1a27395ULL , 0x3da54c1b836ae926ULL ,
0xea8bbeb5d4e1355fULL , 0x6db6e392491c55ffULL , 0x3c4a3bafd9a87193ULL ,
0x727c07fff18a7b8dULL , 0x9d830f140a868c89ULL , 0x214331b7d5a77296ULL ,
0xb19f17341a928885ULL , 0xe4f80ee3ff09f607ULL , 0x33d6fc4da8822a7eULL ,
0xafba84edf8c63e42ULL , 0x2887d9ca653b5ee2ULL , 0x4cf5d2259cbb2769ULL ,
0xc0cf890a054346caULL , 0x74242860303c0c14ULL , 0xa026430f89ec65afULL ,
0xdf056d67bdd568b8ULL , 0x8c3a5b2f99f861a3ULL , 0x1d090a180c0f0305ULL ,
0x187dbc4623e2c15eULL , 0x7bb8ef82411657f9ULL , 0x9918cefe7fa9d667ULL ,
0xf035ec86439ad976ULL , 0x1295cdfa7d2558e8ULL , 0xfb32ea8e479fd875ULL ,
0xbd2f491785e366aaULL , 0x921fc8f67bacd764ULL , 0x83a69ccde8d23a4eULL ,
0x4b428a0e07cfc845ULL , 0xb9b488fdf0cc3c44ULL , 0x90dc2683cf35fa13ULL ,
0x63c553c462f496a7ULL , 0xa552f551a601a7f4ULL , 0x01ef77b45ac298b5ULL ,
0x1abe5233977bec29ULL , 0x7c0fb7a9da62b8d5ULL , 0x226fa8763bfcc754ULL ,
0xf66dc319822caeefULL , 0xd4026b6fb9d069bbULL , 0xbfeca762317a4bddULL ,
0xd176dd31963dabe0ULL , 0xc778d1219e37a9e6ULL , 0xb6284f1f81e667a9ULL ,
0x4e363c5028220a1eULL , 0xcbc88f02014647c9ULL , 0xc8e416c3ef1df20bULL ,
0x032c99c1ee5bb5c2ULL , 0x6beecc0d88aa2266ULL , 0x4981647bb356e532ULL ,
0x0cb05e239f71ee2fULL , 0x461da399c27cbedfULL , 0x38d1fa45ac872b7dULL ,
0xe2a0217c3ebf819eULL , 0xa67e6c90485a1236ULL , 0xf4ae2d6c36b58398ULL ,
0xf5415ad86c771b2dULL , 0x622a247038360e12ULL , 0x60e9ca058caf2365ULL ,
0xf9f104fbf306f502ULL , 0xddc68312094c45cfULL , 0x76e7c61584a52163ULL ,
0x71509e3e1fd1ce4fULL , 0xa9e2ab72397049dbULL , 0x09c4e87db09c2c74ULL ,
0x8dd52c9bc33af916ULL , 0x54886e63bf59e637ULL , 0x1e2593d9e254b6c7ULL ,
0x25d8f05da0882878ULL , 0x816572b85c4b1739ULL , 0xffa92b6432b0829bULL ,
0xfe465cd068721a2eULL , 0xac961d2c169d8b80ULL , 0xbcc03ea3df21fe1fULL ,
0xa7911b2412988a83ULL , 0x533f3648242d091bULL , 0x40458c0603cac946ULL ,
0xd8b2354c26a18794ULL , 0x98f7b94a256b4ed2ULL , 0x659d7c5ba342e13eULL ,
0x1fcae46db8962e72ULL , 0x42866273b753e431ULL , 0x6e9a7a53a747e03dULL ,
0x2bab400b8b60eb20ULL , 0x59d747f47aea90adULL , 0xb85bff49aa0ea4f1ULL ,
0xd25a44f078661e22ULL , 0xcebc395c2eab8592ULL , 0x873d5d279dfd60a0ULL ,
0x0000000000000000ULL , 0x5afbde3594b1256fULL , 0xf2f602f3f703f401ULL ,
0xd5ed1cdbe312f10eULL , 0x75cb5fd46afe94a1ULL , 0x45313a582c270b1dULL ,
0x5f8f686bbb5ce734ULL , 0x1056238fc9bc759fULL , 0x07b7582b9b74ef2cULL ,
0xe18cb8bdd0e4345cULL , 0xc697a695c4f53153ULL , 0x8f16c2ee77a3d461ULL ,
0xa30adace67b7d06dULL , 0xd3b5334422a48697ULL , 0x556719d7e59b7e82ULL ,
0xeb64c9018e23adeaULL , 0xa1c934bbd32efd1aULL , 0x2edff655a48d297bULL ,
0xcd90a09dc0f03050ULL , 0x88a19ac5ecd73b4dULL , 0x30fa658c46d99fbcULL ,
0x86d22a93c73ff815ULL , 0x2968ae7e3ff9c657ULL , 0xad796a984c5f1335ULL ,
0x3a121430181e060aULL , 0x271b1e281411050fULL , 0x3461a46633f6c552ULL ,
0xbb77668844551133ULL , 0x06582f9fc1b67799ULL , 0x436915c7ed917c84ULL ,
0x797b01f7f58f7a8eULL , 0x6f750de7fd857888ULL , 0xf782b4add8ee365aULL ,
0xc45448e0706c1c24ULL , 0x9eaf96d5e4dd394bULL , 0x1992cbf2792059ebULL ,
0xe84850c060781828ULL , 0x70bfe98a451356faULL , 0x393e8df1f645b3c8ULL ,
0x243787e9fa4ab0cdULL , 0x51fcd83d90b4246cULL , 0x7de0c01d80a02060ULL ,
0x32398bf9f240b2cbULL , 0x4fd94be472e092abULL , 0x894eed71b615a3f8ULL ,
0x137aba4e27e7c05dULL , 0xd6c1851a0d4944ccULL , 0x9133513795f762a6ULL ,
0xb070608040501030ULL , 0x082b9fc9ea5eb4c1ULL , 0xc5bb3f542aae8491ULL ,
0xe7d49722115243c5ULL , 0x44de4dec76e593a8ULL , 0x0574b65e2fedc25bULL ,
0xb4eba16a357f4adeULL , 0x5b14a981ce73bddaULL , 0x808a050c06898f8cULL ,
0x02c3ee75b4992d77ULL , 0x5013af89ca76bcd9ULL , 0x2df36f944ad69cb9ULL ,
0xc90b6177b5df6abeULL , 0xfadd9d3a1d5d40c0ULL , 0x7a5798361bd4cf4cULL ,
0x8249eb79b210a2fbULL , 0xe9a727743aba809dULL , 0x93f0bf42216e4fd1ULL ,
0xd95d42f87c631f21ULL , 0x5d4c861e0fc5ca43ULL , 0xda71db399238aae3ULL ,
0xecd3912a155742c6ULL
} ;
static const u64 T7 [ 256 ] = {
0x016ab9bb68d2d3baULL , 0xb1669ae5194dfc54ULL , 0xcd1465e293bc712fULL ,
0x511b8725b9cd9c74ULL , 0xa457a2f70251f553ULL , 0x03bed6d0b86b68d3ULL ,
0x04b5ded6bd6f6bd2ULL , 0xfe8552b36429d74dULL , 0xad4abafd0d5df050ULL ,
0x63e009cf268ae9acULL , 0x84961c09830e8a8dULL , 0x1a4d91a579c6dcbfULL ,
0x4d37a73daddd9070ULL , 0xa35caaf10755f652ULL , 0xe117a47bc852b39aULL ,
0xf98e5ab5612dd44cULL , 0xac200346658f23eaULL , 0x1184e6c4a67362d5ULL ,
0xc268cc55f166a497ULL , 0x0da8c6dcb2636ed1ULL , 0x99d085aaffcc5533ULL ,
0xaa41b2fb0859f351ULL , 0x9c0fe2c72a71ed5bULL , 0x55ae59f304a2f7a6ULL ,
0x20c1befe815f7fdeULL , 0xe5a27aad753dd848ULL , 0x7fcc29d7329ae5a8ULL ,
0xe80abc71c75eb699ULL , 0x3be696e0904b70dbULL , 0x9edb8dacfac85632ULL ,
0x2215d19551e6c4b7ULL , 0xceaab3322bd719fcULL , 0x93734b7048ab38e3ULL ,
0xfd3b8463dc42bf9eULL , 0xd052fc41ef7eae91ULL , 0xe61cac7dcd56b09bULL ,
0x947843764daf3be2ULL , 0x0661b1bd6dd6d0bbULL , 0xdaf1329b5819c341ULL ,
0x17e55779cba5b26eULL , 0x5cb341f90baef2a5ULL , 0x4b561680c00b40cbULL ,
0x0cc27f67dab1bd6bULL , 0xcc7edc59fb6ea295ULL , 0x409f61e11fbefea1ULL ,
0xe3c3cb1018eb08f3ULL , 0x302fe1814ffeceb1ULL , 0x0e16100c0a080602ULL ,
0x5e672e92db1749ccULL , 0x663f6ea2f33751c4ULL , 0x53cfe84e6974271dULL ,
0x6c9ca07844503c14ULL , 0x730e56b0e82b58c3ULL , 0x349a3f57f291a563ULL ,
0x3ced9ee6954f73daULL , 0x8e35d2d33469e75dULL , 0x8023c2df3e61e15fULL ,
0x2ed7aef28b5779dcULL , 0x6e48cf1394e9877dULL , 0x596c2694de134acdULL ,
0x605edf1f9ee1817fULL , 0x9b04eac12f75ee5aULL , 0x19f34775c1adb46cULL ,
0x893edad5316de45cULL , 0xffefeb080cfb04f7ULL , 0xf2472dd4be986a26ULL ,
0xc7b7ab3824db1cffULL , 0xb9113b547e932aedULL , 0xa236134a6f8725e8ULL ,
0xf4269c69d34eba9dULL , 0x10ee5f7fcea1b16fULL , 0x8d8b04038c028f8eULL ,
0x4fe3c8567d642b19ULL , 0x479469e71abafda0ULL , 0xeaded31a17e70df0ULL ,
0x98ba3c11971e8689ULL , 0x2d697822333c110fULL , 0x153138121b1c0907ULL ,
0x6afd11c52986ecafULL , 0xdb9b8b2030cb10fbULL , 0x3858403028201808ULL ,
0x6b97a87e41543f15ULL , 0x237f682e3934170dULL , 0x1c2c201814100c04ULL ,
0x070b080605040301ULL , 0x21ab0745e98dac64ULL , 0x27cab6f8845b7cdfULL ,
0x5f0d9729b3c59a76ULL , 0x7264ef0b80f98b79ULL , 0x29dca6f48e537addULL ,
0xb3b2f58ec9f4473dULL , 0x628ab0744e583a16ULL , 0xbda4e582c3fc413fULL ,
0x85fca5b2ebdc5937ULL , 0x1ef84f73c4a9b76dULL , 0xa895dd90d8e04838ULL ,
0x0877a1b167ded6b9ULL , 0x442abf37a2d19573ULL , 0xa53d1b4c6a8326e9ULL ,
0x8beab5bee1d45f35ULL , 0xb66d92e31c49ff55ULL , 0x4a3caf3ba8d99371ULL ,
0x7c72ff078af18d7bULL , 0x839d140f860a898cULL , 0x4321b731a7d59672ULL ,
0x9fb13417921a8588ULL , 0xf8e4e30e09ff07f6ULL , 0xd6334dfc82a87e2aULL ,
0xbaafed84c6f8423eULL , 0x8728cad93b65e25eULL , 0xf54c25d2bb9c6927ULL ,
0xcfc00a894305ca46ULL , 0x247460283c30140cULL , 0x26a00f43ec89af65ULL ,
0x05df676dd5bdb868ULL , 0x3a8c2f5bf899a361ULL , 0x091d180a0f0c0503ULL ,
0x7d1846bce2235ec1ULL , 0xb87b82ef1641f957ULL , 0x1899fecea97f67d6ULL ,
0x35f086ec9a4376d9ULL , 0x9512facd257de858ULL , 0x32fb8eea9f4775d8ULL ,
0x2fbd1749e385aa66ULL , 0x1f92f6c8ac7b64d7ULL , 0xa683cd9cd2e84e3aULL ,
0x424b0e8acf0745c8ULL , 0xb4b9fd88ccf0443cULL , 0xdc90832635cf13faULL ,
0xc563c453f462a796ULL , 0x52a551f501a6f4a7ULL , 0xef01b477c25ab598ULL ,
0xbe1a33527b9729ecULL , 0x0f7ca9b762dad5b8ULL , 0x6f2276a8fc3b54c7ULL ,
0x6df619c32c82efaeULL , 0x02d46f6bd0b9bb69ULL , 0xecbf62a77a31dd4bULL ,
0x76d131dd3d96e0abULL , 0x78c721d1379ee6a9ULL , 0x28b61f4fe681a967ULL ,
0x364e503c22281e0aULL , 0xc8cb028f4601c947ULL , 0xe4c8c3161def0bf2ULL ,
0x2c03c1995beec2b5ULL , 0xee6b0dccaa886622ULL , 0x81497b6456b332e5ULL ,
0xb00c235e719f2feeULL , 0x1d4699a37cc2dfbeULL , 0xd13845fa87ac7d2bULL ,
0xa0e27c21bf3e9e81ULL , 0x7ea6906c5a483612ULL , 0xaef46c2db5369883ULL ,
0x41f5d85a776c2d1bULL , 0x2a6270243638120eULL , 0xe96005caaf8c6523ULL ,
0xf1f9fb0406f302f5ULL , 0xc6dd12834c09cf45ULL , 0xe77615c6a5846321ULL ,
0x50713e9ed11f4fceULL , 0xe2a972ab7039db49ULL , 0xc4097de89cb0742cULL ,
0xd58d9b2c3ac316f9ULL , 0x8854636e59bf37e6ULL , 0x251ed99354e2c7b6ULL ,
0xd8255df088a07828ULL , 0x6581b8724b5c3917ULL , 0xa9ff642bb0329b82ULL ,
0x46fed05c72682e1aULL , 0x96ac2c1d9d16808bULL , 0xc0bca33e21df1ffeULL ,
0x91a7241b9812838aULL , 0x3f5348362d241b09ULL , 0x4540068cca0346c9ULL ,
0xb2d84c35a1269487ULL , 0xf7984ab96b25d24eULL , 0x9d655b7c42a33ee1ULL ,
0xca1f6de496b8722eULL , 0x8642736253b731e4ULL , 0x9a6e537a47a73de0ULL ,
0xab2b0b40608b20ebULL , 0xd759f447ea7aad90ULL , 0x5bb849ff0eaaf1a4ULL ,
0x5ad2f0446678221eULL , 0xbcce5c39ab2e9285ULL , 0x3d87275dfd9da060ULL ,
0x0000000000000000ULL , 0xfb5a35deb1946f25ULL , 0xf6f2f30203f701f4ULL ,
0xedd5db1c12e30ef1ULL , 0xcb75d45ffe6aa194ULL , 0x3145583a272c1d0bULL ,
0x8f5f6b685cbb34e7ULL , 0x56108f23bcc99f75ULL , 0xb7072b58749b2cefULL ,
0x8ce1bdb8e4d05c34ULL , 0x97c695a6f5c45331ULL , 0x168feec2a37761d4ULL ,
0x0aa3cedab7676dd0ULL , 0xb5d34433a4229786ULL , 0x6755d7199be5827eULL ,
0x64eb01c9238eeaadULL , 0xc9a1bb342ed31afdULL , 0xdf2e55f68da47b29ULL ,
0x90cd9da0f0c05030ULL , 0xa188c59ad7ec4d3bULL , 0xfa308c65d946bc9fULL ,
0xd286932a3fc715f8ULL , 0x68297eaef93f57c6ULL , 0x79ad986a5f4c3513ULL ,
0x123a30141e180a06ULL , 0x1b27281e11140f05ULL , 0x613466a4f63352c5ULL ,
0x77bb886655443311ULL , 0x58069f2fb6c19977ULL , 0x6943c71591ed847cULL ,
0x7b79f7018ff58e7aULL , 0x756fe70d85fd8878ULL , 0x82f7adb4eed85a36ULL ,
0x54c4e0486c70241cULL , 0xaf9ed596dde44b39ULL , 0x9219f2cb2079eb59ULL ,
0x48e8c05078602818ULL , 0xbf708ae91345fa56ULL , 0x3e39f18d45f6c8b3ULL ,
0x3724e9874afacdb0ULL , 0xfc513dd8b4906c24ULL , 0xe07d1dc0a0806020ULL ,
0x3932f98b40f2cbb2ULL , 0xd94fe44be072ab92ULL , 0x4e8971ed15b6f8a3ULL ,
0x7a134ebae7275dc0ULL , 0xc1d61a85490dcc44ULL , 0x33913751f795a662ULL ,
0x70b0806050403010ULL , 0x2b08c99f5eeac1b4ULL , 0xbbc5543fae2a9184ULL ,
0xd4e722975211c543ULL , 0xde44ec4de576a893ULL , 0x74055eb6ed2f5bc2ULL ,
0xebb46aa17f35de4aULL , 0x145b81a973cedabdULL , 0x8a800c0589068c8fULL ,
0xc30275ee99b4772dULL , 0x135089af76cad9bcULL , 0xf32d946fd64ab99cULL ,
0x0bc97761dfb5be6aULL , 0xddfa3a9d5d1dc040ULL , 0x577a3698d41b4ccfULL ,
0x498279eb10b2fba2ULL , 0xa7e97427ba3a9d80ULL , 0xf09342bf6e21d14fULL ,
0x5dd9f842637c211fULL , 0x4c5d1e86c50f43caULL , 0x71da39db3892e3aaULL ,
0xd3ec2a915715c642ULL
} ;
static const u64 c [ KHAZAD_ROUNDS + 1 ] = {
0xba542f7453d3d24dULL , 0x50ac8dbf70529a4cULL , 0xead597d133515ba6ULL ,
0xde48a899db32b7fcULL , 0xe39e919be2bb416eULL , 0xa5cb6b95a1f3b102ULL ,
0xccc41d14c363da5dULL , 0x5fdc7dcd7f5a6c5cULL , 0xf726ffede89d6f8eULL
} ;
2006-05-16 16:09:29 +04:00
static int khazad_setkey ( struct crypto_tfm * tfm , const u8 * in_key ,
2006-08-13 08:16:39 +04:00
unsigned int key_len )
2005-04-17 02:20:36 +04:00
{
2006-05-16 16:09:29 +04:00
struct khazad_ctx * ctx = crypto_tfm_ctx ( tfm ) ;
2006-04-05 21:26:01 +04:00
const __be32 * key = ( const __be32 * ) in_key ;
2005-04-17 02:20:36 +04:00
int r ;
const u64 * S = T7 ;
u64 K2 , K1 ;
2006-04-05 21:26:01 +04:00
/* key is supposed to be 32-bit aligned */
K2 = ( ( u64 ) be32_to_cpu ( key [ 0 ] ) < < 32 ) | be32_to_cpu ( key [ 1 ] ) ;
K1 = ( ( u64 ) be32_to_cpu ( key [ 2 ] ) < < 32 ) | be32_to_cpu ( key [ 3 ] ) ;
2005-04-17 02:20:36 +04:00
/* setup the encrypt key */
for ( r = 0 ; r < = KHAZAD_ROUNDS ; r + + ) {
ctx - > E [ r ] = T0 [ ( int ) ( K1 > > 56 ) ] ^
T1 [ ( int ) ( K1 > > 48 ) & 0xff ] ^
T2 [ ( int ) ( K1 > > 40 ) & 0xff ] ^
T3 [ ( int ) ( K1 > > 32 ) & 0xff ] ^
T4 [ ( int ) ( K1 > > 24 ) & 0xff ] ^
T5 [ ( int ) ( K1 > > 16 ) & 0xff ] ^
T6 [ ( int ) ( K1 > > 8 ) & 0xff ] ^
T7 [ ( int ) ( K1 ) & 0xff ] ^
c [ r ] ^ K2 ;
K2 = K1 ;
K1 = ctx - > E [ r ] ;
}
/* Setup the decrypt key */
ctx - > D [ 0 ] = ctx - > E [ KHAZAD_ROUNDS ] ;
for ( r = 1 ; r < KHAZAD_ROUNDS ; r + + ) {
K1 = ctx - > E [ KHAZAD_ROUNDS - r ] ;
ctx - > D [ r ] = T0 [ ( int ) S [ ( int ) ( K1 > > 56 ) ] & 0xff ] ^
T1 [ ( int ) S [ ( int ) ( K1 > > 48 ) & 0xff ] & 0xff ] ^
T2 [ ( int ) S [ ( int ) ( K1 > > 40 ) & 0xff ] & 0xff ] ^
T3 [ ( int ) S [ ( int ) ( K1 > > 32 ) & 0xff ] & 0xff ] ^
T4 [ ( int ) S [ ( int ) ( K1 > > 24 ) & 0xff ] & 0xff ] ^
T5 [ ( int ) S [ ( int ) ( K1 > > 16 ) & 0xff ] & 0xff ] ^
T6 [ ( int ) S [ ( int ) ( K1 > > 8 ) & 0xff ] & 0xff ] ^
T7 [ ( int ) S [ ( int ) ( K1 ) & 0xff ] & 0xff ] ;
}
ctx - > D [ KHAZAD_ROUNDS ] = ctx - > E [ 0 ] ;
return 0 ;
}
static void khazad_crypt ( const u64 roundKey [ KHAZAD_ROUNDS + 1 ] ,
u8 * ciphertext , const u8 * plaintext )
{
2005-10-30 13:25:15 +03:00
const __be64 * src = ( const __be64 * ) plaintext ;
__be64 * dst = ( __be64 * ) ciphertext ;
2005-04-17 02:20:36 +04:00
int r ;
u64 state ;
2005-10-30 13:25:15 +03:00
state = be64_to_cpu ( * src ) ^ roundKey [ 0 ] ;
2005-04-17 02:20:36 +04:00
for ( r = 1 ; r < KHAZAD_ROUNDS ; r + + ) {
state = T0 [ ( int ) ( state > > 56 ) ] ^
T1 [ ( int ) ( state > > 48 ) & 0xff ] ^
T2 [ ( int ) ( state > > 40 ) & 0xff ] ^
T3 [ ( int ) ( state > > 32 ) & 0xff ] ^
T4 [ ( int ) ( state > > 24 ) & 0xff ] ^
T5 [ ( int ) ( state > > 16 ) & 0xff ] ^
T6 [ ( int ) ( state > > 8 ) & 0xff ] ^
T7 [ ( int ) ( state ) & 0xff ] ^
roundKey [ r ] ;
}
state = ( T0 [ ( int ) ( state > > 56 ) ] & 0xff00000000000000ULL ) ^
( T1 [ ( int ) ( state > > 48 ) & 0xff ] & 0x00ff000000000000ULL ) ^
( T2 [ ( int ) ( state > > 40 ) & 0xff ] & 0x0000ff0000000000ULL ) ^
( T3 [ ( int ) ( state > > 32 ) & 0xff ] & 0x000000ff00000000ULL ) ^
( T4 [ ( int ) ( state > > 24 ) & 0xff ] & 0x00000000ff000000ULL ) ^
( T5 [ ( int ) ( state > > 16 ) & 0xff ] & 0x0000000000ff0000ULL ) ^
( T6 [ ( int ) ( state > > 8 ) & 0xff ] & 0x000000000000ff00ULL ) ^
( T7 [ ( int ) ( state ) & 0xff ] & 0x00000000000000ffULL ) ^
roundKey [ KHAZAD_ROUNDS ] ;
2005-10-30 13:25:15 +03:00
* dst = cpu_to_be64 ( state ) ;
2005-04-17 02:20:36 +04:00
}
2006-05-16 16:09:29 +04:00
static void khazad_encrypt ( struct crypto_tfm * tfm , u8 * dst , const u8 * src )
2005-04-17 02:20:36 +04:00
{
2006-05-16 16:09:29 +04:00
struct khazad_ctx * ctx = crypto_tfm_ctx ( tfm ) ;
2005-04-17 02:20:36 +04:00
khazad_crypt ( ctx - > E , dst , src ) ;
}
2006-05-16 16:09:29 +04:00
static void khazad_decrypt ( struct crypto_tfm * tfm , u8 * dst , const u8 * src )
2005-04-17 02:20:36 +04:00
{
2006-05-16 16:09:29 +04:00
struct khazad_ctx * ctx = crypto_tfm_ctx ( tfm ) ;
2005-04-17 02:20:36 +04:00
khazad_crypt ( ctx - > D , dst , src ) ;
}
static struct crypto_alg khazad_alg = {
. cra_name = " khazad " ,
. cra_flags = CRYPTO_ALG_TYPE_CIPHER ,
. cra_blocksize = KHAZAD_BLOCK_SIZE ,
. cra_ctxsize = sizeof ( struct khazad_ctx ) ,
2006-01-07 08:38:15 +03:00
. cra_alignmask = 7 ,
2005-04-17 02:20:36 +04:00
. cra_module = THIS_MODULE ,
. cra_u = { . cipher = {
. cia_min_keysize = KHAZAD_KEY_SIZE ,
. cia_max_keysize = KHAZAD_KEY_SIZE ,
. cia_setkey = khazad_setkey ,
. cia_encrypt = khazad_encrypt ,
. cia_decrypt = khazad_decrypt } }
} ;
2008-04-05 17:00:57 +04:00
static int __init khazad_mod_init ( void )
2005-04-17 02:20:36 +04:00
{
int ret = 0 ;
ret = crypto_register_alg ( & khazad_alg ) ;
return ret ;
}
2008-04-05 17:00:57 +04:00
static void __exit khazad_mod_fini ( void )
2005-04-17 02:20:36 +04:00
{
crypto_unregister_alg ( & khazad_alg ) ;
}
2019-04-12 07:57:42 +03:00
subsys_initcall ( khazad_mod_init ) ;
2008-04-05 17:00:57 +04:00
module_exit ( khazad_mod_fini ) ;
2005-04-17 02:20:36 +04:00
MODULE_LICENSE ( " GPL " ) ;
MODULE_DESCRIPTION ( " Khazad Cryptographic Algorithm " ) ;
2014-11-21 04:05:53 +03:00
MODULE_ALIAS_CRYPTO ( " khazad " ) ;