1*8411e6adSJerome Forissier /* LibTomCrypt, modular cryptographic library -- Tom St Denis */
2*8411e6adSJerome Forissier /* SPDX-License-Identifier: Unlicense */
35a913ee7SJerome Forissier
45a913ee7SJerome Forissier /**
55a913ee7SJerome Forissier @file anubis.c
65a913ee7SJerome Forissier Anubis implementation derived from public domain source
75a913ee7SJerome Forissier Authors: Paulo S.L.M. Barreto and Vincent Rijmen.
85a913ee7SJerome Forissier */
95a913ee7SJerome Forissier
105a913ee7SJerome Forissier #include "tomcrypt_private.h"
115a913ee7SJerome Forissier
125a913ee7SJerome Forissier #ifdef LTC_ANUBIS
135a913ee7SJerome Forissier
145a913ee7SJerome Forissier const struct ltc_cipher_descriptor anubis_desc = {
155a913ee7SJerome Forissier "anubis",
165a913ee7SJerome Forissier 19,
175a913ee7SJerome Forissier 16, 40, 16, 12,
185a913ee7SJerome Forissier &anubis_setup,
195a913ee7SJerome Forissier &anubis_ecb_encrypt,
205a913ee7SJerome Forissier &anubis_ecb_decrypt,
215a913ee7SJerome Forissier &anubis_test,
225a913ee7SJerome Forissier &anubis_done,
235a913ee7SJerome Forissier &anubis_keysize,
245a913ee7SJerome Forissier NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
255a913ee7SJerome Forissier };
265a913ee7SJerome Forissier
275a913ee7SJerome Forissier #define MAX_N 10
285a913ee7SJerome Forissier
295a913ee7SJerome Forissier /*
305a913ee7SJerome Forissier * Though Anubis is endianness-neutral, the encryption tables are listed
315a913ee7SJerome Forissier * in BIG-ENDIAN format, which is adopted throughout this implementation
325a913ee7SJerome Forissier * (but little-endian notation would be equally suitable if consistently
335a913ee7SJerome Forissier * employed).
345a913ee7SJerome Forissier */
355a913ee7SJerome Forissier #if defined(LTC_ANUBIS_TWEAK)
365a913ee7SJerome Forissier
375a913ee7SJerome Forissier static const ulong32 T0[256] = {
385a913ee7SJerome Forissier 0xba69d2bbU, 0x54a84de5U, 0x2f5ebce2U, 0x74e8cd25U,
395a913ee7SJerome Forissier 0x53a651f7U, 0xd3bb6bd0U, 0xd2b96fd6U, 0x4d9a29b3U,
405a913ee7SJerome Forissier 0x50a05dfdU, 0xac458acfU, 0x8d070e09U, 0xbf63c6a5U,
415a913ee7SJerome Forissier 0x70e0dd3dU, 0x52a455f1U, 0x9a29527bU, 0x4c982db5U,
425a913ee7SJerome Forissier 0xeac98f46U, 0xd5b773c4U, 0x97336655U, 0xd1bf63dcU,
435a913ee7SJerome Forissier 0x3366ccaaU, 0x51a259fbU, 0x5bb671c7U, 0xa651a2f3U,
445a913ee7SJerome Forissier 0xdea15ffeU, 0x48903dadU, 0xa84d9ad7U, 0x992f5e71U,
455a913ee7SJerome Forissier 0xdbab4be0U, 0x3264c8acU, 0xb773e695U, 0xfce5d732U,
465a913ee7SJerome Forissier 0xe3dbab70U, 0x9e214263U, 0x913f7e41U, 0x9b2b567dU,
475a913ee7SJerome Forissier 0xe2d9af76U, 0xbb6bd6bdU, 0x4182199bU, 0x6edca579U,
485a913ee7SJerome Forissier 0xa557aef9U, 0xcb8b0b80U, 0x6bd6b167U, 0x95376e59U,
495a913ee7SJerome Forissier 0xa15fbee1U, 0xf3fbeb10U, 0xb17ffe81U, 0x0204080cU,
505a913ee7SJerome Forissier 0xcc851792U, 0xc49537a2U, 0x1d3a744eU, 0x14285078U,
515a913ee7SJerome Forissier 0xc39b2bb0U, 0x63c69157U, 0xdaa94fe6U, 0x5dba69d3U,
525a913ee7SJerome Forissier 0x5fbe61dfU, 0xdca557f2U, 0x7dfae913U, 0xcd871394U,
535a913ee7SJerome Forissier 0x7ffee11fU, 0x5ab475c1U, 0x6cd8ad75U, 0x5cb86dd5U,
545a913ee7SJerome Forissier 0xf7f3fb08U, 0x264c98d4U, 0xffe3db38U, 0xedc79354U,
555a913ee7SJerome Forissier 0xe8cd874aU, 0x9d274e69U, 0x6fdea17fU, 0x8e010203U,
565a913ee7SJerome Forissier 0x19326456U, 0xa05dbae7U, 0xf0fde71aU, 0x890f1e11U,
575a913ee7SJerome Forissier 0x0f1e3c22U, 0x070e1c12U, 0xaf4386c5U, 0xfbebcb20U,
585a913ee7SJerome Forissier 0x08102030U, 0x152a547eU, 0x0d1a342eU, 0x04081018U,
595a913ee7SJerome Forissier 0x01020406U, 0x64c88d45U, 0xdfa35bf8U, 0x76ecc529U,
605a913ee7SJerome Forissier 0x79f2f90bU, 0xdda753f4U, 0x3d7af48eU, 0x162c5874U,
615a913ee7SJerome Forissier 0x3f7efc82U, 0x376edcb2U, 0x6ddaa973U, 0x3870e090U,
625a913ee7SJerome Forissier 0xb96fdeb1U, 0x73e6d137U, 0xe9cf834cU, 0x356ad4beU,
635a913ee7SJerome Forissier 0x55aa49e3U, 0x71e2d93bU, 0x7bf6f107U, 0x8c050a0fU,
645a913ee7SJerome Forissier 0x72e4d531U, 0x880d1a17U, 0xf6f1ff0eU, 0x2a54a8fcU,
655a913ee7SJerome Forissier 0x3e7cf884U, 0x5ebc65d9U, 0x274e9cd2U, 0x468c0589U,
665a913ee7SJerome Forissier 0x0c183028U, 0x65ca8943U, 0x68d0bd6dU, 0x61c2995bU,
675a913ee7SJerome Forissier 0x03060c0aU, 0xc19f23bcU, 0x57ae41efU, 0xd6b17fceU,
685a913ee7SJerome Forissier 0xd9af43ecU, 0x58b07dcdU, 0xd8ad47eaU, 0x66cc8549U,
695a913ee7SJerome Forissier 0xd7b37bc8U, 0x3a74e89cU, 0xc88d078aU, 0x3c78f088U,
705a913ee7SJerome Forissier 0xfae9cf26U, 0x96316253U, 0xa753a6f5U, 0x982d5a77U,
715a913ee7SJerome Forissier 0xecc59752U, 0xb86ddab7U, 0xc7933ba8U, 0xae4182c3U,
725a913ee7SJerome Forissier 0x69d2b96bU, 0x4b9631a7U, 0xab4b96ddU, 0xa94f9ed1U,
735a913ee7SJerome Forissier 0x67ce814fU, 0x0a14283cU, 0x478e018fU, 0xf2f9ef16U,
745a913ee7SJerome Forissier 0xb577ee99U, 0x224488ccU, 0xe5d7b364U, 0xeec19f5eU,
755a913ee7SJerome Forissier 0xbe61c2a3U, 0x2b56acfaU, 0x811f3e21U, 0x1224486cU,
765a913ee7SJerome Forissier 0x831b362dU, 0x1b366c5aU, 0x0e1c3824U, 0x23468ccaU,
775a913ee7SJerome Forissier 0xf5f7f304U, 0x458a0983U, 0x214284c6U, 0xce811f9eU,
785a913ee7SJerome Forissier 0x499239abU, 0x2c58b0e8U, 0xf9efc32cU, 0xe6d1bf6eU,
795a913ee7SJerome Forissier 0xb671e293U, 0x2850a0f0U, 0x172e5c72U, 0x8219322bU,
805a913ee7SJerome Forissier 0x1a34685cU, 0x8b0b161dU, 0xfee1df3eU, 0x8a09121bU,
815a913ee7SJerome Forissier 0x09122436U, 0xc98f038cU, 0x87132635U, 0x4e9c25b9U,
825a913ee7SJerome Forissier 0xe1dfa37cU, 0x2e5cb8e4U, 0xe4d5b762U, 0xe0dda77aU,
835a913ee7SJerome Forissier 0xebcb8b40U, 0x903d7a47U, 0xa455aaffU, 0x1e3c7844U,
845a913ee7SJerome Forissier 0x85172e39U, 0x60c09d5dU, 0x00000000U, 0x254a94deU,
855a913ee7SJerome Forissier 0xf4f5f702U, 0xf1ffe31cU, 0x94356a5fU, 0x0b162c3aU,
865a913ee7SJerome Forissier 0xe7d3bb68U, 0x75eac923U, 0xefc39b58U, 0x3468d0b8U,
875a913ee7SJerome Forissier 0x3162c4a6U, 0xd4b577c2U, 0xd0bd67daU, 0x86112233U,
885a913ee7SJerome Forissier 0x7efce519U, 0xad478ec9U, 0xfde7d334U, 0x2952a4f6U,
895a913ee7SJerome Forissier 0x3060c0a0U, 0x3b76ec9aU, 0x9f234665U, 0xf8edc72aU,
905a913ee7SJerome Forissier 0xc6913faeU, 0x13264c6aU, 0x060c1814U, 0x050a141eU,
915a913ee7SJerome Forissier 0xc59733a4U, 0x11224466U, 0x77eec12fU, 0x7cf8ed15U,
925a913ee7SJerome Forissier 0x7af4f501U, 0x78f0fd0dU, 0x366cd8b4U, 0x1c387048U,
935a913ee7SJerome Forissier 0x3972e496U, 0x59b279cbU, 0x18306050U, 0x56ac45e9U,
945a913ee7SJerome Forissier 0xb37bf68dU, 0xb07dfa87U, 0x244890d8U, 0x204080c0U,
955a913ee7SJerome Forissier 0xb279f28bU, 0x9239724bU, 0xa35bb6edU, 0xc09d27baU,
965a913ee7SJerome Forissier 0x44880d85U, 0x62c49551U, 0x10204060U, 0xb475ea9fU,
975a913ee7SJerome Forissier 0x84152a3fU, 0x43861197U, 0x933b764dU, 0xc2992fb6U,
985a913ee7SJerome Forissier 0x4a9435a1U, 0xbd67cea9U, 0x8f030605U, 0x2d5ab4eeU,
995a913ee7SJerome Forissier 0xbc65caafU, 0x9c254a6fU, 0x6ad4b561U, 0x40801d9dU,
1005a913ee7SJerome Forissier 0xcf831b98U, 0xa259b2ebU, 0x801d3a27U, 0x4f9e21bfU,
1015a913ee7SJerome Forissier 0x1f3e7c42U, 0xca890f86U, 0xaa4992dbU, 0x42841591U,
1025a913ee7SJerome Forissier };
1035a913ee7SJerome Forissier
1045a913ee7SJerome Forissier static const ulong32 T1[256] = {
1055a913ee7SJerome Forissier 0x69babbd2U, 0xa854e54dU, 0x5e2fe2bcU, 0xe87425cdU,
1065a913ee7SJerome Forissier 0xa653f751U, 0xbbd3d06bU, 0xb9d2d66fU, 0x9a4db329U,
1075a913ee7SJerome Forissier 0xa050fd5dU, 0x45accf8aU, 0x078d090eU, 0x63bfa5c6U,
1085a913ee7SJerome Forissier 0xe0703dddU, 0xa452f155U, 0x299a7b52U, 0x984cb52dU,
1095a913ee7SJerome Forissier 0xc9ea468fU, 0xb7d5c473U, 0x33975566U, 0xbfd1dc63U,
1105a913ee7SJerome Forissier 0x6633aaccU, 0xa251fb59U, 0xb65bc771U, 0x51a6f3a2U,
1115a913ee7SJerome Forissier 0xa1defe5fU, 0x9048ad3dU, 0x4da8d79aU, 0x2f99715eU,
1125a913ee7SJerome Forissier 0xabdbe04bU, 0x6432acc8U, 0x73b795e6U, 0xe5fc32d7U,
1135a913ee7SJerome Forissier 0xdbe370abU, 0x219e6342U, 0x3f91417eU, 0x2b9b7d56U,
1145a913ee7SJerome Forissier 0xd9e276afU, 0x6bbbbdd6U, 0x82419b19U, 0xdc6e79a5U,
1155a913ee7SJerome Forissier 0x57a5f9aeU, 0x8bcb800bU, 0xd66b67b1U, 0x3795596eU,
1165a913ee7SJerome Forissier 0x5fa1e1beU, 0xfbf310ebU, 0x7fb181feU, 0x04020c08U,
1175a913ee7SJerome Forissier 0x85cc9217U, 0x95c4a237U, 0x3a1d4e74U, 0x28147850U,
1185a913ee7SJerome Forissier 0x9bc3b02bU, 0xc6635791U, 0xa9dae64fU, 0xba5dd369U,
1195a913ee7SJerome Forissier 0xbe5fdf61U, 0xa5dcf257U, 0xfa7d13e9U, 0x87cd9413U,
1205a913ee7SJerome Forissier 0xfe7f1fe1U, 0xb45ac175U, 0xd86c75adU, 0xb85cd56dU,
1215a913ee7SJerome Forissier 0xf3f708fbU, 0x4c26d498U, 0xe3ff38dbU, 0xc7ed5493U,
1225a913ee7SJerome Forissier 0xcde84a87U, 0x279d694eU, 0xde6f7fa1U, 0x018e0302U,
1235a913ee7SJerome Forissier 0x32195664U, 0x5da0e7baU, 0xfdf01ae7U, 0x0f89111eU,
1245a913ee7SJerome Forissier 0x1e0f223cU, 0x0e07121cU, 0x43afc586U, 0xebfb20cbU,
1255a913ee7SJerome Forissier 0x10083020U, 0x2a157e54U, 0x1a0d2e34U, 0x08041810U,
1265a913ee7SJerome Forissier 0x02010604U, 0xc864458dU, 0xa3dff85bU, 0xec7629c5U,
1275a913ee7SJerome Forissier 0xf2790bf9U, 0xa7ddf453U, 0x7a3d8ef4U, 0x2c167458U,
1285a913ee7SJerome Forissier 0x7e3f82fcU, 0x6e37b2dcU, 0xda6d73a9U, 0x703890e0U,
1295a913ee7SJerome Forissier 0x6fb9b1deU, 0xe67337d1U, 0xcfe94c83U, 0x6a35bed4U,
1305a913ee7SJerome Forissier 0xaa55e349U, 0xe2713bd9U, 0xf67b07f1U, 0x058c0f0aU,
1315a913ee7SJerome Forissier 0xe47231d5U, 0x0d88171aU, 0xf1f60effU, 0x542afca8U,
1325a913ee7SJerome Forissier 0x7c3e84f8U, 0xbc5ed965U, 0x4e27d29cU, 0x8c468905U,
1335a913ee7SJerome Forissier 0x180c2830U, 0xca654389U, 0xd0686dbdU, 0xc2615b99U,
1345a913ee7SJerome Forissier 0x06030a0cU, 0x9fc1bc23U, 0xae57ef41U, 0xb1d6ce7fU,
1355a913ee7SJerome Forissier 0xafd9ec43U, 0xb058cd7dU, 0xadd8ea47U, 0xcc664985U,
1365a913ee7SJerome Forissier 0xb3d7c87bU, 0x743a9ce8U, 0x8dc88a07U, 0x783c88f0U,
1375a913ee7SJerome Forissier 0xe9fa26cfU, 0x31965362U, 0x53a7f5a6U, 0x2d98775aU,
1385a913ee7SJerome Forissier 0xc5ec5297U, 0x6db8b7daU, 0x93c7a83bU, 0x41aec382U,
1395a913ee7SJerome Forissier 0xd2696bb9U, 0x964ba731U, 0x4babdd96U, 0x4fa9d19eU,
1405a913ee7SJerome Forissier 0xce674f81U, 0x140a3c28U, 0x8e478f01U, 0xf9f216efU,
1415a913ee7SJerome Forissier 0x77b599eeU, 0x4422cc88U, 0xd7e564b3U, 0xc1ee5e9fU,
1425a913ee7SJerome Forissier 0x61bea3c2U, 0x562bfaacU, 0x1f81213eU, 0x24126c48U,
1435a913ee7SJerome Forissier 0x1b832d36U, 0x361b5a6cU, 0x1c0e2438U, 0x4623ca8cU,
1445a913ee7SJerome Forissier 0xf7f504f3U, 0x8a458309U, 0x4221c684U, 0x81ce9e1fU,
1455a913ee7SJerome Forissier 0x9249ab39U, 0x582ce8b0U, 0xeff92cc3U, 0xd1e66ebfU,
1465a913ee7SJerome Forissier 0x71b693e2U, 0x5028f0a0U, 0x2e17725cU, 0x19822b32U,
1475a913ee7SJerome Forissier 0x341a5c68U, 0x0b8b1d16U, 0xe1fe3edfU, 0x098a1b12U,
1485a913ee7SJerome Forissier 0x12093624U, 0x8fc98c03U, 0x13873526U, 0x9c4eb925U,
1495a913ee7SJerome Forissier 0xdfe17ca3U, 0x5c2ee4b8U, 0xd5e462b7U, 0xdde07aa7U,
1505a913ee7SJerome Forissier 0xcbeb408bU, 0x3d90477aU, 0x55a4ffaaU, 0x3c1e4478U,
1515a913ee7SJerome Forissier 0x1785392eU, 0xc0605d9dU, 0x00000000U, 0x4a25de94U,
1525a913ee7SJerome Forissier 0xf5f402f7U, 0xfff11ce3U, 0x35945f6aU, 0x160b3a2cU,
1535a913ee7SJerome Forissier 0xd3e768bbU, 0xea7523c9U, 0xc3ef589bU, 0x6834b8d0U,
1545a913ee7SJerome Forissier 0x6231a6c4U, 0xb5d4c277U, 0xbdd0da67U, 0x11863322U,
1555a913ee7SJerome Forissier 0xfc7e19e5U, 0x47adc98eU, 0xe7fd34d3U, 0x5229f6a4U,
1565a913ee7SJerome Forissier 0x6030a0c0U, 0x763b9aecU, 0x239f6546U, 0xedf82ac7U,
1575a913ee7SJerome Forissier 0x91c6ae3fU, 0x26136a4cU, 0x0c061418U, 0x0a051e14U,
1585a913ee7SJerome Forissier 0x97c5a433U, 0x22116644U, 0xee772fc1U, 0xf87c15edU,
1595a913ee7SJerome Forissier 0xf47a01f5U, 0xf0780dfdU, 0x6c36b4d8U, 0x381c4870U,
1605a913ee7SJerome Forissier 0x723996e4U, 0xb259cb79U, 0x30185060U, 0xac56e945U,
1615a913ee7SJerome Forissier 0x7bb38df6U, 0x7db087faU, 0x4824d890U, 0x4020c080U,
1625a913ee7SJerome Forissier 0x79b28bf2U, 0x39924b72U, 0x5ba3edb6U, 0x9dc0ba27U,
1635a913ee7SJerome Forissier 0x8844850dU, 0xc4625195U, 0x20106040U, 0x75b49feaU,
1645a913ee7SJerome Forissier 0x15843f2aU, 0x86439711U, 0x3b934d76U, 0x99c2b62fU,
1655a913ee7SJerome Forissier 0x944aa135U, 0x67bda9ceU, 0x038f0506U, 0x5a2deeb4U,
1665a913ee7SJerome Forissier 0x65bcafcaU, 0x259c6f4aU, 0xd46a61b5U, 0x80409d1dU,
1675a913ee7SJerome Forissier 0x83cf981bU, 0x59a2ebb2U, 0x1d80273aU, 0x9e4fbf21U,
1685a913ee7SJerome Forissier 0x3e1f427cU, 0x89ca860fU, 0x49aadb92U, 0x84429115U,
1695a913ee7SJerome Forissier };
1705a913ee7SJerome Forissier
1715a913ee7SJerome Forissier static const ulong32 T2[256] = {
1725a913ee7SJerome Forissier 0xd2bbba69U, 0x4de554a8U, 0xbce22f5eU, 0xcd2574e8U,
1735a913ee7SJerome Forissier 0x51f753a6U, 0x6bd0d3bbU, 0x6fd6d2b9U, 0x29b34d9aU,
1745a913ee7SJerome Forissier 0x5dfd50a0U, 0x8acfac45U, 0x0e098d07U, 0xc6a5bf63U,
1755a913ee7SJerome Forissier 0xdd3d70e0U, 0x55f152a4U, 0x527b9a29U, 0x2db54c98U,
1765a913ee7SJerome Forissier 0x8f46eac9U, 0x73c4d5b7U, 0x66559733U, 0x63dcd1bfU,
1775a913ee7SJerome Forissier 0xccaa3366U, 0x59fb51a2U, 0x71c75bb6U, 0xa2f3a651U,
1785a913ee7SJerome Forissier 0x5ffedea1U, 0x3dad4890U, 0x9ad7a84dU, 0x5e71992fU,
1795a913ee7SJerome Forissier 0x4be0dbabU, 0xc8ac3264U, 0xe695b773U, 0xd732fce5U,
1805a913ee7SJerome Forissier 0xab70e3dbU, 0x42639e21U, 0x7e41913fU, 0x567d9b2bU,
1815a913ee7SJerome Forissier 0xaf76e2d9U, 0xd6bdbb6bU, 0x199b4182U, 0xa5796edcU,
1825a913ee7SJerome Forissier 0xaef9a557U, 0x0b80cb8bU, 0xb1676bd6U, 0x6e599537U,
1835a913ee7SJerome Forissier 0xbee1a15fU, 0xeb10f3fbU, 0xfe81b17fU, 0x080c0204U,
1845a913ee7SJerome Forissier 0x1792cc85U, 0x37a2c495U, 0x744e1d3aU, 0x50781428U,
1855a913ee7SJerome Forissier 0x2bb0c39bU, 0x915763c6U, 0x4fe6daa9U, 0x69d35dbaU,
1865a913ee7SJerome Forissier 0x61df5fbeU, 0x57f2dca5U, 0xe9137dfaU, 0x1394cd87U,
1875a913ee7SJerome Forissier 0xe11f7ffeU, 0x75c15ab4U, 0xad756cd8U, 0x6dd55cb8U,
1885a913ee7SJerome Forissier 0xfb08f7f3U, 0x98d4264cU, 0xdb38ffe3U, 0x9354edc7U,
1895a913ee7SJerome Forissier 0x874ae8cdU, 0x4e699d27U, 0xa17f6fdeU, 0x02038e01U,
1905a913ee7SJerome Forissier 0x64561932U, 0xbae7a05dU, 0xe71af0fdU, 0x1e11890fU,
1915a913ee7SJerome Forissier 0x3c220f1eU, 0x1c12070eU, 0x86c5af43U, 0xcb20fbebU,
1925a913ee7SJerome Forissier 0x20300810U, 0x547e152aU, 0x342e0d1aU, 0x10180408U,
1935a913ee7SJerome Forissier 0x04060102U, 0x8d4564c8U, 0x5bf8dfa3U, 0xc52976ecU,
1945a913ee7SJerome Forissier 0xf90b79f2U, 0x53f4dda7U, 0xf48e3d7aU, 0x5874162cU,
1955a913ee7SJerome Forissier 0xfc823f7eU, 0xdcb2376eU, 0xa9736ddaU, 0xe0903870U,
1965a913ee7SJerome Forissier 0xdeb1b96fU, 0xd13773e6U, 0x834ce9cfU, 0xd4be356aU,
1975a913ee7SJerome Forissier 0x49e355aaU, 0xd93b71e2U, 0xf1077bf6U, 0x0a0f8c05U,
1985a913ee7SJerome Forissier 0xd53172e4U, 0x1a17880dU, 0xff0ef6f1U, 0xa8fc2a54U,
1995a913ee7SJerome Forissier 0xf8843e7cU, 0x65d95ebcU, 0x9cd2274eU, 0x0589468cU,
2005a913ee7SJerome Forissier 0x30280c18U, 0x894365caU, 0xbd6d68d0U, 0x995b61c2U,
2015a913ee7SJerome Forissier 0x0c0a0306U, 0x23bcc19fU, 0x41ef57aeU, 0x7fced6b1U,
2025a913ee7SJerome Forissier 0x43ecd9afU, 0x7dcd58b0U, 0x47ead8adU, 0x854966ccU,
2035a913ee7SJerome Forissier 0x7bc8d7b3U, 0xe89c3a74U, 0x078ac88dU, 0xf0883c78U,
2045a913ee7SJerome Forissier 0xcf26fae9U, 0x62539631U, 0xa6f5a753U, 0x5a77982dU,
2055a913ee7SJerome Forissier 0x9752ecc5U, 0xdab7b86dU, 0x3ba8c793U, 0x82c3ae41U,
2065a913ee7SJerome Forissier 0xb96b69d2U, 0x31a74b96U, 0x96ddab4bU, 0x9ed1a94fU,
2075a913ee7SJerome Forissier 0x814f67ceU, 0x283c0a14U, 0x018f478eU, 0xef16f2f9U,
2085a913ee7SJerome Forissier 0xee99b577U, 0x88cc2244U, 0xb364e5d7U, 0x9f5eeec1U,
2095a913ee7SJerome Forissier 0xc2a3be61U, 0xacfa2b56U, 0x3e21811fU, 0x486c1224U,
2105a913ee7SJerome Forissier 0x362d831bU, 0x6c5a1b36U, 0x38240e1cU, 0x8cca2346U,
2115a913ee7SJerome Forissier 0xf304f5f7U, 0x0983458aU, 0x84c62142U, 0x1f9ece81U,
2125a913ee7SJerome Forissier 0x39ab4992U, 0xb0e82c58U, 0xc32cf9efU, 0xbf6ee6d1U,
2135a913ee7SJerome Forissier 0xe293b671U, 0xa0f02850U, 0x5c72172eU, 0x322b8219U,
2145a913ee7SJerome Forissier 0x685c1a34U, 0x161d8b0bU, 0xdf3efee1U, 0x121b8a09U,
2155a913ee7SJerome Forissier 0x24360912U, 0x038cc98fU, 0x26358713U, 0x25b94e9cU,
2165a913ee7SJerome Forissier 0xa37ce1dfU, 0xb8e42e5cU, 0xb762e4d5U, 0xa77ae0ddU,
2175a913ee7SJerome Forissier 0x8b40ebcbU, 0x7a47903dU, 0xaaffa455U, 0x78441e3cU,
2185a913ee7SJerome Forissier 0x2e398517U, 0x9d5d60c0U, 0x00000000U, 0x94de254aU,
2195a913ee7SJerome Forissier 0xf702f4f5U, 0xe31cf1ffU, 0x6a5f9435U, 0x2c3a0b16U,
2205a913ee7SJerome Forissier 0xbb68e7d3U, 0xc92375eaU, 0x9b58efc3U, 0xd0b83468U,
2215a913ee7SJerome Forissier 0xc4a63162U, 0x77c2d4b5U, 0x67dad0bdU, 0x22338611U,
2225a913ee7SJerome Forissier 0xe5197efcU, 0x8ec9ad47U, 0xd334fde7U, 0xa4f62952U,
2235a913ee7SJerome Forissier 0xc0a03060U, 0xec9a3b76U, 0x46659f23U, 0xc72af8edU,
2245a913ee7SJerome Forissier 0x3faec691U, 0x4c6a1326U, 0x1814060cU, 0x141e050aU,
2255a913ee7SJerome Forissier 0x33a4c597U, 0x44661122U, 0xc12f77eeU, 0xed157cf8U,
2265a913ee7SJerome Forissier 0xf5017af4U, 0xfd0d78f0U, 0xd8b4366cU, 0x70481c38U,
2275a913ee7SJerome Forissier 0xe4963972U, 0x79cb59b2U, 0x60501830U, 0x45e956acU,
2285a913ee7SJerome Forissier 0xf68db37bU, 0xfa87b07dU, 0x90d82448U, 0x80c02040U,
2295a913ee7SJerome Forissier 0xf28bb279U, 0x724b9239U, 0xb6eda35bU, 0x27bac09dU,
2305a913ee7SJerome Forissier 0x0d854488U, 0x955162c4U, 0x40601020U, 0xea9fb475U,
2315a913ee7SJerome Forissier 0x2a3f8415U, 0x11974386U, 0x764d933bU, 0x2fb6c299U,
2325a913ee7SJerome Forissier 0x35a14a94U, 0xcea9bd67U, 0x06058f03U, 0xb4ee2d5aU,
2335a913ee7SJerome Forissier 0xcaafbc65U, 0x4a6f9c25U, 0xb5616ad4U, 0x1d9d4080U,
2345a913ee7SJerome Forissier 0x1b98cf83U, 0xb2eba259U, 0x3a27801dU, 0x21bf4f9eU,
2355a913ee7SJerome Forissier 0x7c421f3eU, 0x0f86ca89U, 0x92dbaa49U, 0x15914284U,
2365a913ee7SJerome Forissier };
2375a913ee7SJerome Forissier
2385a913ee7SJerome Forissier static const ulong32 T3[256] = {
2395a913ee7SJerome Forissier 0xbbd269baU, 0xe54da854U, 0xe2bc5e2fU, 0x25cde874U,
2405a913ee7SJerome Forissier 0xf751a653U, 0xd06bbbd3U, 0xd66fb9d2U, 0xb3299a4dU,
2415a913ee7SJerome Forissier 0xfd5da050U, 0xcf8a45acU, 0x090e078dU, 0xa5c663bfU,
2425a913ee7SJerome Forissier 0x3ddde070U, 0xf155a452U, 0x7b52299aU, 0xb52d984cU,
2435a913ee7SJerome Forissier 0x468fc9eaU, 0xc473b7d5U, 0x55663397U, 0xdc63bfd1U,
2445a913ee7SJerome Forissier 0xaacc6633U, 0xfb59a251U, 0xc771b65bU, 0xf3a251a6U,
2455a913ee7SJerome Forissier 0xfe5fa1deU, 0xad3d9048U, 0xd79a4da8U, 0x715e2f99U,
2465a913ee7SJerome Forissier 0xe04babdbU, 0xacc86432U, 0x95e673b7U, 0x32d7e5fcU,
2475a913ee7SJerome Forissier 0x70abdbe3U, 0x6342219eU, 0x417e3f91U, 0x7d562b9bU,
2485a913ee7SJerome Forissier 0x76afd9e2U, 0xbdd66bbbU, 0x9b198241U, 0x79a5dc6eU,
2495a913ee7SJerome Forissier 0xf9ae57a5U, 0x800b8bcbU, 0x67b1d66bU, 0x596e3795U,
2505a913ee7SJerome Forissier 0xe1be5fa1U, 0x10ebfbf3U, 0x81fe7fb1U, 0x0c080402U,
2515a913ee7SJerome Forissier 0x921785ccU, 0xa23795c4U, 0x4e743a1dU, 0x78502814U,
2525a913ee7SJerome Forissier 0xb02b9bc3U, 0x5791c663U, 0xe64fa9daU, 0xd369ba5dU,
2535a913ee7SJerome Forissier 0xdf61be5fU, 0xf257a5dcU, 0x13e9fa7dU, 0x941387cdU,
2545a913ee7SJerome Forissier 0x1fe1fe7fU, 0xc175b45aU, 0x75add86cU, 0xd56db85cU,
2555a913ee7SJerome Forissier 0x08fbf3f7U, 0xd4984c26U, 0x38dbe3ffU, 0x5493c7edU,
2565a913ee7SJerome Forissier 0x4a87cde8U, 0x694e279dU, 0x7fa1de6fU, 0x0302018eU,
2575a913ee7SJerome Forissier 0x56643219U, 0xe7ba5da0U, 0x1ae7fdf0U, 0x111e0f89U,
2585a913ee7SJerome Forissier 0x223c1e0fU, 0x121c0e07U, 0xc58643afU, 0x20cbebfbU,
2595a913ee7SJerome Forissier 0x30201008U, 0x7e542a15U, 0x2e341a0dU, 0x18100804U,
2605a913ee7SJerome Forissier 0x06040201U, 0x458dc864U, 0xf85ba3dfU, 0x29c5ec76U,
2615a913ee7SJerome Forissier 0x0bf9f279U, 0xf453a7ddU, 0x8ef47a3dU, 0x74582c16U,
2625a913ee7SJerome Forissier 0x82fc7e3fU, 0xb2dc6e37U, 0x73a9da6dU, 0x90e07038U,
2635a913ee7SJerome Forissier 0xb1de6fb9U, 0x37d1e673U, 0x4c83cfe9U, 0xbed46a35U,
2645a913ee7SJerome Forissier 0xe349aa55U, 0x3bd9e271U, 0x07f1f67bU, 0x0f0a058cU,
2655a913ee7SJerome Forissier 0x31d5e472U, 0x171a0d88U, 0x0efff1f6U, 0xfca8542aU,
2665a913ee7SJerome Forissier 0x84f87c3eU, 0xd965bc5eU, 0xd29c4e27U, 0x89058c46U,
2675a913ee7SJerome Forissier 0x2830180cU, 0x4389ca65U, 0x6dbdd068U, 0x5b99c261U,
2685a913ee7SJerome Forissier 0x0a0c0603U, 0xbc239fc1U, 0xef41ae57U, 0xce7fb1d6U,
2695a913ee7SJerome Forissier 0xec43afd9U, 0xcd7db058U, 0xea47add8U, 0x4985cc66U,
2705a913ee7SJerome Forissier 0xc87bb3d7U, 0x9ce8743aU, 0x8a078dc8U, 0x88f0783cU,
2715a913ee7SJerome Forissier 0x26cfe9faU, 0x53623196U, 0xf5a653a7U, 0x775a2d98U,
2725a913ee7SJerome Forissier 0x5297c5ecU, 0xb7da6db8U, 0xa83b93c7U, 0xc38241aeU,
2735a913ee7SJerome Forissier 0x6bb9d269U, 0xa731964bU, 0xdd964babU, 0xd19e4fa9U,
2745a913ee7SJerome Forissier 0x4f81ce67U, 0x3c28140aU, 0x8f018e47U, 0x16eff9f2U,
2755a913ee7SJerome Forissier 0x99ee77b5U, 0xcc884422U, 0x64b3d7e5U, 0x5e9fc1eeU,
2765a913ee7SJerome Forissier 0xa3c261beU, 0xfaac562bU, 0x213e1f81U, 0x6c482412U,
2775a913ee7SJerome Forissier 0x2d361b83U, 0x5a6c361bU, 0x24381c0eU, 0xca8c4623U,
2785a913ee7SJerome Forissier 0x04f3f7f5U, 0x83098a45U, 0xc6844221U, 0x9e1f81ceU,
2795a913ee7SJerome Forissier 0xab399249U, 0xe8b0582cU, 0x2cc3eff9U, 0x6ebfd1e6U,
2805a913ee7SJerome Forissier 0x93e271b6U, 0xf0a05028U, 0x725c2e17U, 0x2b321982U,
2815a913ee7SJerome Forissier 0x5c68341aU, 0x1d160b8bU, 0x3edfe1feU, 0x1b12098aU,
2825a913ee7SJerome Forissier 0x36241209U, 0x8c038fc9U, 0x35261387U, 0xb9259c4eU,
2835a913ee7SJerome Forissier 0x7ca3dfe1U, 0xe4b85c2eU, 0x62b7d5e4U, 0x7aa7dde0U,
2845a913ee7SJerome Forissier 0x408bcbebU, 0x477a3d90U, 0xffaa55a4U, 0x44783c1eU,
2855a913ee7SJerome Forissier 0x392e1785U, 0x5d9dc060U, 0x00000000U, 0xde944a25U,
2865a913ee7SJerome Forissier 0x02f7f5f4U, 0x1ce3fff1U, 0x5f6a3594U, 0x3a2c160bU,
2875a913ee7SJerome Forissier 0x68bbd3e7U, 0x23c9ea75U, 0x589bc3efU, 0xb8d06834U,
2885a913ee7SJerome Forissier 0xa6c46231U, 0xc277b5d4U, 0xda67bdd0U, 0x33221186U,
2895a913ee7SJerome Forissier 0x19e5fc7eU, 0xc98e47adU, 0x34d3e7fdU, 0xf6a45229U,
2905a913ee7SJerome Forissier 0xa0c06030U, 0x9aec763bU, 0x6546239fU, 0x2ac7edf8U,
2915a913ee7SJerome Forissier 0xae3f91c6U, 0x6a4c2613U, 0x14180c06U, 0x1e140a05U,
2925a913ee7SJerome Forissier 0xa43397c5U, 0x66442211U, 0x2fc1ee77U, 0x15edf87cU,
2935a913ee7SJerome Forissier 0x01f5f47aU, 0x0dfdf078U, 0xb4d86c36U, 0x4870381cU,
2945a913ee7SJerome Forissier 0x96e47239U, 0xcb79b259U, 0x50603018U, 0xe945ac56U,
2955a913ee7SJerome Forissier 0x8df67bb3U, 0x87fa7db0U, 0xd8904824U, 0xc0804020U,
2965a913ee7SJerome Forissier 0x8bf279b2U, 0x4b723992U, 0xedb65ba3U, 0xba279dc0U,
2975a913ee7SJerome Forissier 0x850d8844U, 0x5195c462U, 0x60402010U, 0x9fea75b4U,
2985a913ee7SJerome Forissier 0x3f2a1584U, 0x97118643U, 0x4d763b93U, 0xb62f99c2U,
2995a913ee7SJerome Forissier 0xa135944aU, 0xa9ce67bdU, 0x0506038fU, 0xeeb45a2dU,
3005a913ee7SJerome Forissier 0xafca65bcU, 0x6f4a259cU, 0x61b5d46aU, 0x9d1d8040U,
3015a913ee7SJerome Forissier 0x981b83cfU, 0xebb259a2U, 0x273a1d80U, 0xbf219e4fU,
3025a913ee7SJerome Forissier 0x427c3e1fU, 0x860f89caU, 0xdb9249aaU, 0x91158442U,
3035a913ee7SJerome Forissier };
3045a913ee7SJerome Forissier
3055a913ee7SJerome Forissier static const ulong32 T4[256] = {
3065a913ee7SJerome Forissier 0xbabababaU, 0x54545454U, 0x2f2f2f2fU, 0x74747474U,
3075a913ee7SJerome Forissier 0x53535353U, 0xd3d3d3d3U, 0xd2d2d2d2U, 0x4d4d4d4dU,
3085a913ee7SJerome Forissier 0x50505050U, 0xacacacacU, 0x8d8d8d8dU, 0xbfbfbfbfU,
3095a913ee7SJerome Forissier 0x70707070U, 0x52525252U, 0x9a9a9a9aU, 0x4c4c4c4cU,
3105a913ee7SJerome Forissier 0xeaeaeaeaU, 0xd5d5d5d5U, 0x97979797U, 0xd1d1d1d1U,
3115a913ee7SJerome Forissier 0x33333333U, 0x51515151U, 0x5b5b5b5bU, 0xa6a6a6a6U,
3125a913ee7SJerome Forissier 0xdedededeU, 0x48484848U, 0xa8a8a8a8U, 0x99999999U,
3135a913ee7SJerome Forissier 0xdbdbdbdbU, 0x32323232U, 0xb7b7b7b7U, 0xfcfcfcfcU,
3145a913ee7SJerome Forissier 0xe3e3e3e3U, 0x9e9e9e9eU, 0x91919191U, 0x9b9b9b9bU,
3155a913ee7SJerome Forissier 0xe2e2e2e2U, 0xbbbbbbbbU, 0x41414141U, 0x6e6e6e6eU,
3165a913ee7SJerome Forissier 0xa5a5a5a5U, 0xcbcbcbcbU, 0x6b6b6b6bU, 0x95959595U,
3175a913ee7SJerome Forissier 0xa1a1a1a1U, 0xf3f3f3f3U, 0xb1b1b1b1U, 0x02020202U,
3185a913ee7SJerome Forissier 0xccccccccU, 0xc4c4c4c4U, 0x1d1d1d1dU, 0x14141414U,
3195a913ee7SJerome Forissier 0xc3c3c3c3U, 0x63636363U, 0xdadadadaU, 0x5d5d5d5dU,
3205a913ee7SJerome Forissier 0x5f5f5f5fU, 0xdcdcdcdcU, 0x7d7d7d7dU, 0xcdcdcdcdU,
3215a913ee7SJerome Forissier 0x7f7f7f7fU, 0x5a5a5a5aU, 0x6c6c6c6cU, 0x5c5c5c5cU,
3225a913ee7SJerome Forissier 0xf7f7f7f7U, 0x26262626U, 0xffffffffU, 0xededededU,
3235a913ee7SJerome Forissier 0xe8e8e8e8U, 0x9d9d9d9dU, 0x6f6f6f6fU, 0x8e8e8e8eU,
3245a913ee7SJerome Forissier 0x19191919U, 0xa0a0a0a0U, 0xf0f0f0f0U, 0x89898989U,
3255a913ee7SJerome Forissier 0x0f0f0f0fU, 0x07070707U, 0xafafafafU, 0xfbfbfbfbU,
3265a913ee7SJerome Forissier 0x08080808U, 0x15151515U, 0x0d0d0d0dU, 0x04040404U,
3275a913ee7SJerome Forissier 0x01010101U, 0x64646464U, 0xdfdfdfdfU, 0x76767676U,
3285a913ee7SJerome Forissier 0x79797979U, 0xddddddddU, 0x3d3d3d3dU, 0x16161616U,
3295a913ee7SJerome Forissier 0x3f3f3f3fU, 0x37373737U, 0x6d6d6d6dU, 0x38383838U,
3305a913ee7SJerome Forissier 0xb9b9b9b9U, 0x73737373U, 0xe9e9e9e9U, 0x35353535U,
3315a913ee7SJerome Forissier 0x55555555U, 0x71717171U, 0x7b7b7b7bU, 0x8c8c8c8cU,
3325a913ee7SJerome Forissier 0x72727272U, 0x88888888U, 0xf6f6f6f6U, 0x2a2a2a2aU,
3335a913ee7SJerome Forissier 0x3e3e3e3eU, 0x5e5e5e5eU, 0x27272727U, 0x46464646U,
3345a913ee7SJerome Forissier 0x0c0c0c0cU, 0x65656565U, 0x68686868U, 0x61616161U,
3355a913ee7SJerome Forissier 0x03030303U, 0xc1c1c1c1U, 0x57575757U, 0xd6d6d6d6U,
3365a913ee7SJerome Forissier 0xd9d9d9d9U, 0x58585858U, 0xd8d8d8d8U, 0x66666666U,
3375a913ee7SJerome Forissier 0xd7d7d7d7U, 0x3a3a3a3aU, 0xc8c8c8c8U, 0x3c3c3c3cU,
3385a913ee7SJerome Forissier 0xfafafafaU, 0x96969696U, 0xa7a7a7a7U, 0x98989898U,
3395a913ee7SJerome Forissier 0xececececU, 0xb8b8b8b8U, 0xc7c7c7c7U, 0xaeaeaeaeU,
3405a913ee7SJerome Forissier 0x69696969U, 0x4b4b4b4bU, 0xababababU, 0xa9a9a9a9U,
3415a913ee7SJerome Forissier 0x67676767U, 0x0a0a0a0aU, 0x47474747U, 0xf2f2f2f2U,
3425a913ee7SJerome Forissier 0xb5b5b5b5U, 0x22222222U, 0xe5e5e5e5U, 0xeeeeeeeeU,
3435a913ee7SJerome Forissier 0xbebebebeU, 0x2b2b2b2bU, 0x81818181U, 0x12121212U,
3445a913ee7SJerome Forissier 0x83838383U, 0x1b1b1b1bU, 0x0e0e0e0eU, 0x23232323U,
3455a913ee7SJerome Forissier 0xf5f5f5f5U, 0x45454545U, 0x21212121U, 0xcecececeU,
3465a913ee7SJerome Forissier 0x49494949U, 0x2c2c2c2cU, 0xf9f9f9f9U, 0xe6e6e6e6U,
3475a913ee7SJerome Forissier 0xb6b6b6b6U, 0x28282828U, 0x17171717U, 0x82828282U,
3485a913ee7SJerome Forissier 0x1a1a1a1aU, 0x8b8b8b8bU, 0xfefefefeU, 0x8a8a8a8aU,
3495a913ee7SJerome Forissier 0x09090909U, 0xc9c9c9c9U, 0x87878787U, 0x4e4e4e4eU,
3505a913ee7SJerome Forissier 0xe1e1e1e1U, 0x2e2e2e2eU, 0xe4e4e4e4U, 0xe0e0e0e0U,
3515a913ee7SJerome Forissier 0xebebebebU, 0x90909090U, 0xa4a4a4a4U, 0x1e1e1e1eU,
3525a913ee7SJerome Forissier 0x85858585U, 0x60606060U, 0x00000000U, 0x25252525U,
3535a913ee7SJerome Forissier 0xf4f4f4f4U, 0xf1f1f1f1U, 0x94949494U, 0x0b0b0b0bU,
3545a913ee7SJerome Forissier 0xe7e7e7e7U, 0x75757575U, 0xefefefefU, 0x34343434U,
3555a913ee7SJerome Forissier 0x31313131U, 0xd4d4d4d4U, 0xd0d0d0d0U, 0x86868686U,
3565a913ee7SJerome Forissier 0x7e7e7e7eU, 0xadadadadU, 0xfdfdfdfdU, 0x29292929U,
3575a913ee7SJerome Forissier 0x30303030U, 0x3b3b3b3bU, 0x9f9f9f9fU, 0xf8f8f8f8U,
3585a913ee7SJerome Forissier 0xc6c6c6c6U, 0x13131313U, 0x06060606U, 0x05050505U,
3595a913ee7SJerome Forissier 0xc5c5c5c5U, 0x11111111U, 0x77777777U, 0x7c7c7c7cU,
3605a913ee7SJerome Forissier 0x7a7a7a7aU, 0x78787878U, 0x36363636U, 0x1c1c1c1cU,
3615a913ee7SJerome Forissier 0x39393939U, 0x59595959U, 0x18181818U, 0x56565656U,
3625a913ee7SJerome Forissier 0xb3b3b3b3U, 0xb0b0b0b0U, 0x24242424U, 0x20202020U,
3635a913ee7SJerome Forissier 0xb2b2b2b2U, 0x92929292U, 0xa3a3a3a3U, 0xc0c0c0c0U,
3645a913ee7SJerome Forissier 0x44444444U, 0x62626262U, 0x10101010U, 0xb4b4b4b4U,
3655a913ee7SJerome Forissier 0x84848484U, 0x43434343U, 0x93939393U, 0xc2c2c2c2U,
3665a913ee7SJerome Forissier 0x4a4a4a4aU, 0xbdbdbdbdU, 0x8f8f8f8fU, 0x2d2d2d2dU,
3675a913ee7SJerome Forissier 0xbcbcbcbcU, 0x9c9c9c9cU, 0x6a6a6a6aU, 0x40404040U,
3685a913ee7SJerome Forissier 0xcfcfcfcfU, 0xa2a2a2a2U, 0x80808080U, 0x4f4f4f4fU,
3695a913ee7SJerome Forissier 0x1f1f1f1fU, 0xcacacacaU, 0xaaaaaaaaU, 0x42424242U,
3705a913ee7SJerome Forissier };
3715a913ee7SJerome Forissier
3725a913ee7SJerome Forissier static const ulong32 T5[256] = {
3735a913ee7SJerome Forissier 0x00000000U, 0x01020608U, 0x02040c10U, 0x03060a18U,
3745a913ee7SJerome Forissier 0x04081820U, 0x050a1e28U, 0x060c1430U, 0x070e1238U,
3755a913ee7SJerome Forissier 0x08103040U, 0x09123648U, 0x0a143c50U, 0x0b163a58U,
3765a913ee7SJerome Forissier 0x0c182860U, 0x0d1a2e68U, 0x0e1c2470U, 0x0f1e2278U,
3775a913ee7SJerome Forissier 0x10206080U, 0x11226688U, 0x12246c90U, 0x13266a98U,
3785a913ee7SJerome Forissier 0x142878a0U, 0x152a7ea8U, 0x162c74b0U, 0x172e72b8U,
3795a913ee7SJerome Forissier 0x183050c0U, 0x193256c8U, 0x1a345cd0U, 0x1b365ad8U,
3805a913ee7SJerome Forissier 0x1c3848e0U, 0x1d3a4ee8U, 0x1e3c44f0U, 0x1f3e42f8U,
3815a913ee7SJerome Forissier 0x2040c01dU, 0x2142c615U, 0x2244cc0dU, 0x2346ca05U,
3825a913ee7SJerome Forissier 0x2448d83dU, 0x254ade35U, 0x264cd42dU, 0x274ed225U,
3835a913ee7SJerome Forissier 0x2850f05dU, 0x2952f655U, 0x2a54fc4dU, 0x2b56fa45U,
3845a913ee7SJerome Forissier 0x2c58e87dU, 0x2d5aee75U, 0x2e5ce46dU, 0x2f5ee265U,
3855a913ee7SJerome Forissier 0x3060a09dU, 0x3162a695U, 0x3264ac8dU, 0x3366aa85U,
3865a913ee7SJerome Forissier 0x3468b8bdU, 0x356abeb5U, 0x366cb4adU, 0x376eb2a5U,
3875a913ee7SJerome Forissier 0x387090ddU, 0x397296d5U, 0x3a749ccdU, 0x3b769ac5U,
3885a913ee7SJerome Forissier 0x3c7888fdU, 0x3d7a8ef5U, 0x3e7c84edU, 0x3f7e82e5U,
3895a913ee7SJerome Forissier 0x40809d3aU, 0x41829b32U, 0x4284912aU, 0x43869722U,
3905a913ee7SJerome Forissier 0x4488851aU, 0x458a8312U, 0x468c890aU, 0x478e8f02U,
3915a913ee7SJerome Forissier 0x4890ad7aU, 0x4992ab72U, 0x4a94a16aU, 0x4b96a762U,
3925a913ee7SJerome Forissier 0x4c98b55aU, 0x4d9ab352U, 0x4e9cb94aU, 0x4f9ebf42U,
3935a913ee7SJerome Forissier 0x50a0fdbaU, 0x51a2fbb2U, 0x52a4f1aaU, 0x53a6f7a2U,
3945a913ee7SJerome Forissier 0x54a8e59aU, 0x55aae392U, 0x56ace98aU, 0x57aeef82U,
3955a913ee7SJerome Forissier 0x58b0cdfaU, 0x59b2cbf2U, 0x5ab4c1eaU, 0x5bb6c7e2U,
3965a913ee7SJerome Forissier 0x5cb8d5daU, 0x5dbad3d2U, 0x5ebcd9caU, 0x5fbedfc2U,
3975a913ee7SJerome Forissier 0x60c05d27U, 0x61c25b2fU, 0x62c45137U, 0x63c6573fU,
3985a913ee7SJerome Forissier 0x64c84507U, 0x65ca430fU, 0x66cc4917U, 0x67ce4f1fU,
3995a913ee7SJerome Forissier 0x68d06d67U, 0x69d26b6fU, 0x6ad46177U, 0x6bd6677fU,
4005a913ee7SJerome Forissier 0x6cd87547U, 0x6dda734fU, 0x6edc7957U, 0x6fde7f5fU,
4015a913ee7SJerome Forissier 0x70e03da7U, 0x71e23bafU, 0x72e431b7U, 0x73e637bfU,
4025a913ee7SJerome Forissier 0x74e82587U, 0x75ea238fU, 0x76ec2997U, 0x77ee2f9fU,
4035a913ee7SJerome Forissier 0x78f00de7U, 0x79f20befU, 0x7af401f7U, 0x7bf607ffU,
4045a913ee7SJerome Forissier 0x7cf815c7U, 0x7dfa13cfU, 0x7efc19d7U, 0x7ffe1fdfU,
4055a913ee7SJerome Forissier 0x801d2774U, 0x811f217cU, 0x82192b64U, 0x831b2d6cU,
4065a913ee7SJerome Forissier 0x84153f54U, 0x8517395cU, 0x86113344U, 0x8713354cU,
4075a913ee7SJerome Forissier 0x880d1734U, 0x890f113cU, 0x8a091b24U, 0x8b0b1d2cU,
4085a913ee7SJerome Forissier 0x8c050f14U, 0x8d07091cU, 0x8e010304U, 0x8f03050cU,
4095a913ee7SJerome Forissier 0x903d47f4U, 0x913f41fcU, 0x92394be4U, 0x933b4decU,
4105a913ee7SJerome Forissier 0x94355fd4U, 0x953759dcU, 0x963153c4U, 0x973355ccU,
4115a913ee7SJerome Forissier 0x982d77b4U, 0x992f71bcU, 0x9a297ba4U, 0x9b2b7dacU,
4125a913ee7SJerome Forissier 0x9c256f94U, 0x9d27699cU, 0x9e216384U, 0x9f23658cU,
4135a913ee7SJerome Forissier 0xa05de769U, 0xa15fe161U, 0xa259eb79U, 0xa35bed71U,
4145a913ee7SJerome Forissier 0xa455ff49U, 0xa557f941U, 0xa651f359U, 0xa753f551U,
4155a913ee7SJerome Forissier 0xa84dd729U, 0xa94fd121U, 0xaa49db39U, 0xab4bdd31U,
4165a913ee7SJerome Forissier 0xac45cf09U, 0xad47c901U, 0xae41c319U, 0xaf43c511U,
4175a913ee7SJerome Forissier 0xb07d87e9U, 0xb17f81e1U, 0xb2798bf9U, 0xb37b8df1U,
4185a913ee7SJerome Forissier 0xb4759fc9U, 0xb57799c1U, 0xb67193d9U, 0xb77395d1U,
4195a913ee7SJerome Forissier 0xb86db7a9U, 0xb96fb1a1U, 0xba69bbb9U, 0xbb6bbdb1U,
4205a913ee7SJerome Forissier 0xbc65af89U, 0xbd67a981U, 0xbe61a399U, 0xbf63a591U,
4215a913ee7SJerome Forissier 0xc09dba4eU, 0xc19fbc46U, 0xc299b65eU, 0xc39bb056U,
4225a913ee7SJerome Forissier 0xc495a26eU, 0xc597a466U, 0xc691ae7eU, 0xc793a876U,
4235a913ee7SJerome Forissier 0xc88d8a0eU, 0xc98f8c06U, 0xca89861eU, 0xcb8b8016U,
4245a913ee7SJerome Forissier 0xcc85922eU, 0xcd879426U, 0xce819e3eU, 0xcf839836U,
4255a913ee7SJerome Forissier 0xd0bddaceU, 0xd1bfdcc6U, 0xd2b9d6deU, 0xd3bbd0d6U,
4265a913ee7SJerome Forissier 0xd4b5c2eeU, 0xd5b7c4e6U, 0xd6b1cefeU, 0xd7b3c8f6U,
4275a913ee7SJerome Forissier 0xd8adea8eU, 0xd9afec86U, 0xdaa9e69eU, 0xdbabe096U,
4285a913ee7SJerome Forissier 0xdca5f2aeU, 0xdda7f4a6U, 0xdea1febeU, 0xdfa3f8b6U,
4295a913ee7SJerome Forissier 0xe0dd7a53U, 0xe1df7c5bU, 0xe2d97643U, 0xe3db704bU,
4305a913ee7SJerome Forissier 0xe4d56273U, 0xe5d7647bU, 0xe6d16e63U, 0xe7d3686bU,
4315a913ee7SJerome Forissier 0xe8cd4a13U, 0xe9cf4c1bU, 0xeac94603U, 0xebcb400bU,
4325a913ee7SJerome Forissier 0xecc55233U, 0xedc7543bU, 0xeec15e23U, 0xefc3582bU,
4335a913ee7SJerome Forissier 0xf0fd1ad3U, 0xf1ff1cdbU, 0xf2f916c3U, 0xf3fb10cbU,
4345a913ee7SJerome Forissier 0xf4f502f3U, 0xf5f704fbU, 0xf6f10ee3U, 0xf7f308ebU,
4355a913ee7SJerome Forissier 0xf8ed2a93U, 0xf9ef2c9bU, 0xfae92683U, 0xfbeb208bU,
4365a913ee7SJerome Forissier 0xfce532b3U, 0xfde734bbU, 0xfee13ea3U, 0xffe338abU,
4375a913ee7SJerome Forissier };
4385a913ee7SJerome Forissier
4395a913ee7SJerome Forissier /**
4405a913ee7SJerome Forissier * The round constants.
4415a913ee7SJerome Forissier */
4425a913ee7SJerome Forissier static const ulong32 rc[] = {
4435a913ee7SJerome Forissier 0xba542f74U, 0x53d3d24dU, 0x50ac8dbfU, 0x70529a4cU,
4445a913ee7SJerome Forissier 0xead597d1U, 0x33515ba6U, 0xde48a899U, 0xdb32b7fcU,
4455a913ee7SJerome Forissier 0xe39e919bU, 0xe2bb416eU, 0xa5cb6b95U, 0xa1f3b102U,
4465a913ee7SJerome Forissier 0xccc41d14U, 0xc363da5dU, 0x5fdc7dcdU, 0x7f5a6c5cU,
4475a913ee7SJerome Forissier 0xf726ffedU, 0xe89d6f8eU, 0x19a0f089U,
4485a913ee7SJerome Forissier };
4495a913ee7SJerome Forissier
4505a913ee7SJerome Forissier
4515a913ee7SJerome Forissier
4525a913ee7SJerome Forissier #else
4535a913ee7SJerome Forissier
4545a913ee7SJerome Forissier
4555a913ee7SJerome Forissier static const ulong32 T0[256] = {
4565a913ee7SJerome Forissier 0xa753a6f5U, 0xd3bb6bd0U, 0xe6d1bf6eU, 0x71e2d93bU,
4575a913ee7SJerome Forissier 0xd0bd67daU, 0xac458acfU, 0x4d9a29b3U, 0x79f2f90bU,
4585a913ee7SJerome Forissier 0x3a74e89cU, 0xc98f038cU, 0x913f7e41U, 0xfce5d732U,
4595a913ee7SJerome Forissier 0x1e3c7844U, 0x478e018fU, 0x54a84de5U, 0xbd67cea9U,
4605a913ee7SJerome Forissier 0x8c050a0fU, 0xa557aef9U, 0x7af4f501U, 0xfbebcb20U,
4615a913ee7SJerome Forissier 0x63c69157U, 0xb86ddab7U, 0xdda753f4U, 0xd4b577c2U,
4625a913ee7SJerome Forissier 0xe5d7b364U, 0xb37bf68dU, 0xc59733a4U, 0xbe61c2a3U,
4635a913ee7SJerome Forissier 0xa94f9ed1U, 0x880d1a17U, 0x0c183028U, 0xa259b2ebU,
4645a913ee7SJerome Forissier 0x3972e496U, 0xdfa35bf8U, 0x2952a4f6U, 0xdaa94fe6U,
4655a913ee7SJerome Forissier 0x2b56acfaU, 0xa84d9ad7U, 0xcb8b0b80U, 0x4c982db5U,
4665a913ee7SJerome Forissier 0x4b9631a7U, 0x224488ccU, 0xaa4992dbU, 0x244890d8U,
4675a913ee7SJerome Forissier 0x4182199bU, 0x70e0dd3dU, 0xa651a2f3U, 0xf9efc32cU,
4685a913ee7SJerome Forissier 0x5ab475c1U, 0xe2d9af76U, 0xb07dfa87U, 0x366cd8b4U,
4695a913ee7SJerome Forissier 0x7dfae913U, 0xe4d5b762U, 0x3366ccaaU, 0xffe3db38U,
4705a913ee7SJerome Forissier 0x60c09d5dU, 0x204080c0U, 0x08102030U, 0x8b0b161dU,
4715a913ee7SJerome Forissier 0x5ebc65d9U, 0xab4b96ddU, 0x7ffee11fU, 0x78f0fd0dU,
4725a913ee7SJerome Forissier 0x7cf8ed15U, 0x2c58b0e8U, 0x57ae41efU, 0xd2b96fd6U,
4735a913ee7SJerome Forissier 0xdca557f2U, 0x6ddaa973U, 0x7efce519U, 0x0d1a342eU,
4745a913ee7SJerome Forissier 0x53a651f7U, 0x94356a5fU, 0xc39b2bb0U, 0x2850a0f0U,
4755a913ee7SJerome Forissier 0x274e9cd2U, 0x060c1814U, 0x5fbe61dfU, 0xad478ec9U,
4765a913ee7SJerome Forissier 0x67ce814fU, 0x5cb86dd5U, 0x55aa49e3U, 0x48903dadU,
4775a913ee7SJerome Forissier 0x0e1c3824U, 0x52a455f1U, 0xeac98f46U, 0x42841591U,
4785a913ee7SJerome Forissier 0x5bb671c7U, 0x5dba69d3U, 0x3060c0a0U, 0x58b07dcdU,
4795a913ee7SJerome Forissier 0x51a259fbU, 0x59b279cbU, 0x3c78f088U, 0x4e9c25b9U,
4805a913ee7SJerome Forissier 0x3870e090U, 0x8a09121bU, 0x72e4d531U, 0x14285078U,
4815a913ee7SJerome Forissier 0xe7d3bb68U, 0xc6913faeU, 0xdea15ffeU, 0x50a05dfdU,
4825a913ee7SJerome Forissier 0x8e010203U, 0x9239724bU, 0xd1bf63dcU, 0x77eec12fU,
4835a913ee7SJerome Forissier 0x933b764dU, 0x458a0983U, 0x9a29527bU, 0xce811f9eU,
4845a913ee7SJerome Forissier 0x2d5ab4eeU, 0x03060c0aU, 0x62c49551U, 0xb671e293U,
4855a913ee7SJerome Forissier 0xb96fdeb1U, 0xbf63c6a5U, 0x96316253U, 0x6bd6b167U,
4865a913ee7SJerome Forissier 0x3f7efc82U, 0x070e1c12U, 0x1224486cU, 0xae4182c3U,
4875a913ee7SJerome Forissier 0x40801d9dU, 0x3468d0b8U, 0x468c0589U, 0x3e7cf884U,
4885a913ee7SJerome Forissier 0xdbab4be0U, 0xcf831b98U, 0xecc59752U, 0xcc851792U,
4895a913ee7SJerome Forissier 0xc19f23bcU, 0xa15fbee1U, 0xc09d27baU, 0xd6b17fceU,
4905a913ee7SJerome Forissier 0x1d3a744eU, 0xf4f5f702U, 0x61c2995bU, 0x3b76ec9aU,
4915a913ee7SJerome Forissier 0x10204060U, 0xd8ad47eaU, 0x68d0bd6dU, 0xa05dbae7U,
4925a913ee7SJerome Forissier 0xb17ffe81U, 0x0a14283cU, 0x69d2b96bU, 0x6cd8ad75U,
4935a913ee7SJerome Forissier 0x499239abU, 0xfae9cf26U, 0x76ecc529U, 0xc49537a2U,
4945a913ee7SJerome Forissier 0x9e214263U, 0x9b2b567dU, 0x6edca579U, 0x992f5e71U,
4955a913ee7SJerome Forissier 0xc2992fb6U, 0xb773e695U, 0x982d5a77U, 0xbc65caafU,
4965a913ee7SJerome Forissier 0x8f030605U, 0x85172e39U, 0x1f3e7c42U, 0xb475ea9fU,
4975a913ee7SJerome Forissier 0xf8edc72aU, 0x11224466U, 0x2e5cb8e4U, 0x00000000U,
4985a913ee7SJerome Forissier 0x254a94deU, 0x1c387048U, 0x2a54a8fcU, 0x3d7af48eU,
4995a913ee7SJerome Forissier 0x050a141eU, 0x4f9e21bfU, 0x7bf6f107U, 0xb279f28bU,
5005a913ee7SJerome Forissier 0x3264c8acU, 0x903d7a47U, 0xaf4386c5U, 0x19326456U,
5015a913ee7SJerome Forissier 0xa35bb6edU, 0xf7f3fb08U, 0x73e6d137U, 0x9d274e69U,
5025a913ee7SJerome Forissier 0x152a547eU, 0x74e8cd25U, 0xeec19f5eU, 0xca890f86U,
5035a913ee7SJerome Forissier 0x9f234665U, 0x0f1e3c22U, 0x1b366c5aU, 0x75eac923U,
5045a913ee7SJerome Forissier 0x86112233U, 0x84152a3fU, 0x9c254a6fU, 0x4a9435a1U,
5055a913ee7SJerome Forissier 0x97336655U, 0x1a34685cU, 0x65ca8943U, 0xf6f1ff0eU,
5065a913ee7SJerome Forissier 0xedc79354U, 0x09122436U, 0xbb6bd6bdU, 0x264c98d4U,
5075a913ee7SJerome Forissier 0x831b362dU, 0xebcb8b40U, 0x6fdea17fU, 0x811f3e21U,
5085a913ee7SJerome Forissier 0x04081018U, 0x6ad4b561U, 0x43861197U, 0x01020406U,
5095a913ee7SJerome Forissier 0x172e5c72U, 0xe1dfa37cU, 0x87132635U, 0xf5f7f304U,
5105a913ee7SJerome Forissier 0x8d070e09U, 0xe3dbab70U, 0x23468ccaU, 0x801d3a27U,
5115a913ee7SJerome Forissier 0x44880d85U, 0x162c5874U, 0x66cc8549U, 0x214284c6U,
5125a913ee7SJerome Forissier 0xfee1df3eU, 0xd5b773c4U, 0x3162c4a6U, 0xd9af43ecU,
5135a913ee7SJerome Forissier 0x356ad4beU, 0x18306050U, 0x0204080cU, 0x64c88d45U,
5145a913ee7SJerome Forissier 0xf2f9ef16U, 0xf1ffe31cU, 0x56ac45e9U, 0xcd871394U,
5155a913ee7SJerome Forissier 0x8219322bU, 0xc88d078aU, 0xba69d2bbU, 0xf0fde71aU,
5165a913ee7SJerome Forissier 0xefc39b58U, 0xe9cf834cU, 0xe8cd874aU, 0xfde7d334U,
5175a913ee7SJerome Forissier 0x890f1e11U, 0xd7b37bc8U, 0xc7933ba8U, 0xb577ee99U,
5185a913ee7SJerome Forissier 0xa455aaffU, 0x2f5ebce2U, 0x95376e59U, 0x13264c6aU,
5195a913ee7SJerome Forissier 0x0b162c3aU, 0xf3fbeb10U, 0xe0dda77aU, 0x376edcb2U,
5205a913ee7SJerome Forissier };
5215a913ee7SJerome Forissier
5225a913ee7SJerome Forissier static const ulong32 T1[256] = {
5235a913ee7SJerome Forissier 0x53a7f5a6U, 0xbbd3d06bU, 0xd1e66ebfU, 0xe2713bd9U,
5245a913ee7SJerome Forissier 0xbdd0da67U, 0x45accf8aU, 0x9a4db329U, 0xf2790bf9U,
5255a913ee7SJerome Forissier 0x743a9ce8U, 0x8fc98c03U, 0x3f91417eU, 0xe5fc32d7U,
5265a913ee7SJerome Forissier 0x3c1e4478U, 0x8e478f01U, 0xa854e54dU, 0x67bda9ceU,
5275a913ee7SJerome Forissier 0x058c0f0aU, 0x57a5f9aeU, 0xf47a01f5U, 0xebfb20cbU,
5285a913ee7SJerome Forissier 0xc6635791U, 0x6db8b7daU, 0xa7ddf453U, 0xb5d4c277U,
5295a913ee7SJerome Forissier 0xd7e564b3U, 0x7bb38df6U, 0x97c5a433U, 0x61bea3c2U,
5305a913ee7SJerome Forissier 0x4fa9d19eU, 0x0d88171aU, 0x180c2830U, 0x59a2ebb2U,
5315a913ee7SJerome Forissier 0x723996e4U, 0xa3dff85bU, 0x5229f6a4U, 0xa9dae64fU,
5325a913ee7SJerome Forissier 0x562bfaacU, 0x4da8d79aU, 0x8bcb800bU, 0x984cb52dU,
5335a913ee7SJerome Forissier 0x964ba731U, 0x4422cc88U, 0x49aadb92U, 0x4824d890U,
5345a913ee7SJerome Forissier 0x82419b19U, 0xe0703dddU, 0x51a6f3a2U, 0xeff92cc3U,
5355a913ee7SJerome Forissier 0xb45ac175U, 0xd9e276afU, 0x7db087faU, 0x6c36b4d8U,
5365a913ee7SJerome Forissier 0xfa7d13e9U, 0xd5e462b7U, 0x6633aaccU, 0xe3ff38dbU,
5375a913ee7SJerome Forissier 0xc0605d9dU, 0x4020c080U, 0x10083020U, 0x0b8b1d16U,
5385a913ee7SJerome Forissier 0xbc5ed965U, 0x4babdd96U, 0xfe7f1fe1U, 0xf0780dfdU,
5395a913ee7SJerome Forissier 0xf87c15edU, 0x582ce8b0U, 0xae57ef41U, 0xb9d2d66fU,
5405a913ee7SJerome Forissier 0xa5dcf257U, 0xda6d73a9U, 0xfc7e19e5U, 0x1a0d2e34U,
5415a913ee7SJerome Forissier 0xa653f751U, 0x35945f6aU, 0x9bc3b02bU, 0x5028f0a0U,
5425a913ee7SJerome Forissier 0x4e27d29cU, 0x0c061418U, 0xbe5fdf61U, 0x47adc98eU,
5435a913ee7SJerome Forissier 0xce674f81U, 0xb85cd56dU, 0xaa55e349U, 0x9048ad3dU,
5445a913ee7SJerome Forissier 0x1c0e2438U, 0xa452f155U, 0xc9ea468fU, 0x84429115U,
5455a913ee7SJerome Forissier 0xb65bc771U, 0xba5dd369U, 0x6030a0c0U, 0xb058cd7dU,
5465a913ee7SJerome Forissier 0xa251fb59U, 0xb259cb79U, 0x783c88f0U, 0x9c4eb925U,
5475a913ee7SJerome Forissier 0x703890e0U, 0x098a1b12U, 0xe47231d5U, 0x28147850U,
5485a913ee7SJerome Forissier 0xd3e768bbU, 0x91c6ae3fU, 0xa1defe5fU, 0xa050fd5dU,
5495a913ee7SJerome Forissier 0x018e0302U, 0x39924b72U, 0xbfd1dc63U, 0xee772fc1U,
5505a913ee7SJerome Forissier 0x3b934d76U, 0x8a458309U, 0x299a7b52U, 0x81ce9e1fU,
5515a913ee7SJerome Forissier 0x5a2deeb4U, 0x06030a0cU, 0xc4625195U, 0x71b693e2U,
5525a913ee7SJerome Forissier 0x6fb9b1deU, 0x63bfa5c6U, 0x31965362U, 0xd66b67b1U,
5535a913ee7SJerome Forissier 0x7e3f82fcU, 0x0e07121cU, 0x24126c48U, 0x41aec382U,
5545a913ee7SJerome Forissier 0x80409d1dU, 0x6834b8d0U, 0x8c468905U, 0x7c3e84f8U,
5555a913ee7SJerome Forissier 0xabdbe04bU, 0x83cf981bU, 0xc5ec5297U, 0x85cc9217U,
5565a913ee7SJerome Forissier 0x9fc1bc23U, 0x5fa1e1beU, 0x9dc0ba27U, 0xb1d6ce7fU,
5575a913ee7SJerome Forissier 0x3a1d4e74U, 0xf5f402f7U, 0xc2615b99U, 0x763b9aecU,
5585a913ee7SJerome Forissier 0x20106040U, 0xadd8ea47U, 0xd0686dbdU, 0x5da0e7baU,
5595a913ee7SJerome Forissier 0x7fb181feU, 0x140a3c28U, 0xd2696bb9U, 0xd86c75adU,
5605a913ee7SJerome Forissier 0x9249ab39U, 0xe9fa26cfU, 0xec7629c5U, 0x95c4a237U,
5615a913ee7SJerome Forissier 0x219e6342U, 0x2b9b7d56U, 0xdc6e79a5U, 0x2f99715eU,
5625a913ee7SJerome Forissier 0x99c2b62fU, 0x73b795e6U, 0x2d98775aU, 0x65bcafcaU,
5635a913ee7SJerome Forissier 0x038f0506U, 0x1785392eU, 0x3e1f427cU, 0x75b49feaU,
5645a913ee7SJerome Forissier 0xedf82ac7U, 0x22116644U, 0x5c2ee4b8U, 0x00000000U,
5655a913ee7SJerome Forissier 0x4a25de94U, 0x381c4870U, 0x542afca8U, 0x7a3d8ef4U,
5665a913ee7SJerome Forissier 0x0a051e14U, 0x9e4fbf21U, 0xf67b07f1U, 0x79b28bf2U,
5675a913ee7SJerome Forissier 0x6432acc8U, 0x3d90477aU, 0x43afc586U, 0x32195664U,
5685a913ee7SJerome Forissier 0x5ba3edb6U, 0xf3f708fbU, 0xe67337d1U, 0x279d694eU,
5695a913ee7SJerome Forissier 0x2a157e54U, 0xe87425cdU, 0xc1ee5e9fU, 0x89ca860fU,
5705a913ee7SJerome Forissier 0x239f6546U, 0x1e0f223cU, 0x361b5a6cU, 0xea7523c9U,
5715a913ee7SJerome Forissier 0x11863322U, 0x15843f2aU, 0x259c6f4aU, 0x944aa135U,
5725a913ee7SJerome Forissier 0x33975566U, 0x341a5c68U, 0xca654389U, 0xf1f60effU,
5735a913ee7SJerome Forissier 0xc7ed5493U, 0x12093624U, 0x6bbbbdd6U, 0x4c26d498U,
5745a913ee7SJerome Forissier 0x1b832d36U, 0xcbeb408bU, 0xde6f7fa1U, 0x1f81213eU,
5755a913ee7SJerome Forissier 0x08041810U, 0xd46a61b5U, 0x86439711U, 0x02010604U,
5765a913ee7SJerome Forissier 0x2e17725cU, 0xdfe17ca3U, 0x13873526U, 0xf7f504f3U,
5775a913ee7SJerome Forissier 0x078d090eU, 0xdbe370abU, 0x4623ca8cU, 0x1d80273aU,
5785a913ee7SJerome Forissier 0x8844850dU, 0x2c167458U, 0xcc664985U, 0x4221c684U,
5795a913ee7SJerome Forissier 0xe1fe3edfU, 0xb7d5c473U, 0x6231a6c4U, 0xafd9ec43U,
5805a913ee7SJerome Forissier 0x6a35bed4U, 0x30185060U, 0x04020c08U, 0xc864458dU,
5815a913ee7SJerome Forissier 0xf9f216efU, 0xfff11ce3U, 0xac56e945U, 0x87cd9413U,
5825a913ee7SJerome Forissier 0x19822b32U, 0x8dc88a07U, 0x69babbd2U, 0xfdf01ae7U,
5835a913ee7SJerome Forissier 0xc3ef589bU, 0xcfe94c83U, 0xcde84a87U, 0xe7fd34d3U,
5845a913ee7SJerome Forissier 0x0f89111eU, 0xb3d7c87bU, 0x93c7a83bU, 0x77b599eeU,
5855a913ee7SJerome Forissier 0x55a4ffaaU, 0x5e2fe2bcU, 0x3795596eU, 0x26136a4cU,
5865a913ee7SJerome Forissier 0x160b3a2cU, 0xfbf310ebU, 0xdde07aa7U, 0x6e37b2dcU,
5875a913ee7SJerome Forissier };
5885a913ee7SJerome Forissier
5895a913ee7SJerome Forissier static const ulong32 T2[256] = {
5905a913ee7SJerome Forissier 0xa6f5a753U, 0x6bd0d3bbU, 0xbf6ee6d1U, 0xd93b71e2U,
5915a913ee7SJerome Forissier 0x67dad0bdU, 0x8acfac45U, 0x29b34d9aU, 0xf90b79f2U,
5925a913ee7SJerome Forissier 0xe89c3a74U, 0x038cc98fU, 0x7e41913fU, 0xd732fce5U,
5935a913ee7SJerome Forissier 0x78441e3cU, 0x018f478eU, 0x4de554a8U, 0xcea9bd67U,
5945a913ee7SJerome Forissier 0x0a0f8c05U, 0xaef9a557U, 0xf5017af4U, 0xcb20fbebU,
5955a913ee7SJerome Forissier 0x915763c6U, 0xdab7b86dU, 0x53f4dda7U, 0x77c2d4b5U,
5965a913ee7SJerome Forissier 0xb364e5d7U, 0xf68db37bU, 0x33a4c597U, 0xc2a3be61U,
5975a913ee7SJerome Forissier 0x9ed1a94fU, 0x1a17880dU, 0x30280c18U, 0xb2eba259U,
5985a913ee7SJerome Forissier 0xe4963972U, 0x5bf8dfa3U, 0xa4f62952U, 0x4fe6daa9U,
5995a913ee7SJerome Forissier 0xacfa2b56U, 0x9ad7a84dU, 0x0b80cb8bU, 0x2db54c98U,
6005a913ee7SJerome Forissier 0x31a74b96U, 0x88cc2244U, 0x92dbaa49U, 0x90d82448U,
6015a913ee7SJerome Forissier 0x199b4182U, 0xdd3d70e0U, 0xa2f3a651U, 0xc32cf9efU,
6025a913ee7SJerome Forissier 0x75c15ab4U, 0xaf76e2d9U, 0xfa87b07dU, 0xd8b4366cU,
6035a913ee7SJerome Forissier 0xe9137dfaU, 0xb762e4d5U, 0xccaa3366U, 0xdb38ffe3U,
6045a913ee7SJerome Forissier 0x9d5d60c0U, 0x80c02040U, 0x20300810U, 0x161d8b0bU,
6055a913ee7SJerome Forissier 0x65d95ebcU, 0x96ddab4bU, 0xe11f7ffeU, 0xfd0d78f0U,
6065a913ee7SJerome Forissier 0xed157cf8U, 0xb0e82c58U, 0x41ef57aeU, 0x6fd6d2b9U,
6075a913ee7SJerome Forissier 0x57f2dca5U, 0xa9736ddaU, 0xe5197efcU, 0x342e0d1aU,
6085a913ee7SJerome Forissier 0x51f753a6U, 0x6a5f9435U, 0x2bb0c39bU, 0xa0f02850U,
6095a913ee7SJerome Forissier 0x9cd2274eU, 0x1814060cU, 0x61df5fbeU, 0x8ec9ad47U,
6105a913ee7SJerome Forissier 0x814f67ceU, 0x6dd55cb8U, 0x49e355aaU, 0x3dad4890U,
6115a913ee7SJerome Forissier 0x38240e1cU, 0x55f152a4U, 0x8f46eac9U, 0x15914284U,
6125a913ee7SJerome Forissier 0x71c75bb6U, 0x69d35dbaU, 0xc0a03060U, 0x7dcd58b0U,
6135a913ee7SJerome Forissier 0x59fb51a2U, 0x79cb59b2U, 0xf0883c78U, 0x25b94e9cU,
6145a913ee7SJerome Forissier 0xe0903870U, 0x121b8a09U, 0xd53172e4U, 0x50781428U,
6155a913ee7SJerome Forissier 0xbb68e7d3U, 0x3faec691U, 0x5ffedea1U, 0x5dfd50a0U,
6165a913ee7SJerome Forissier 0x02038e01U, 0x724b9239U, 0x63dcd1bfU, 0xc12f77eeU,
6175a913ee7SJerome Forissier 0x764d933bU, 0x0983458aU, 0x527b9a29U, 0x1f9ece81U,
6185a913ee7SJerome Forissier 0xb4ee2d5aU, 0x0c0a0306U, 0x955162c4U, 0xe293b671U,
6195a913ee7SJerome Forissier 0xdeb1b96fU, 0xc6a5bf63U, 0x62539631U, 0xb1676bd6U,
6205a913ee7SJerome Forissier 0xfc823f7eU, 0x1c12070eU, 0x486c1224U, 0x82c3ae41U,
6215a913ee7SJerome Forissier 0x1d9d4080U, 0xd0b83468U, 0x0589468cU, 0xf8843e7cU,
6225a913ee7SJerome Forissier 0x4be0dbabU, 0x1b98cf83U, 0x9752ecc5U, 0x1792cc85U,
6235a913ee7SJerome Forissier 0x23bcc19fU, 0xbee1a15fU, 0x27bac09dU, 0x7fced6b1U,
6245a913ee7SJerome Forissier 0x744e1d3aU, 0xf702f4f5U, 0x995b61c2U, 0xec9a3b76U,
6255a913ee7SJerome Forissier 0x40601020U, 0x47ead8adU, 0xbd6d68d0U, 0xbae7a05dU,
6265a913ee7SJerome Forissier 0xfe81b17fU, 0x283c0a14U, 0xb96b69d2U, 0xad756cd8U,
6275a913ee7SJerome Forissier 0x39ab4992U, 0xcf26fae9U, 0xc52976ecU, 0x37a2c495U,
6285a913ee7SJerome Forissier 0x42639e21U, 0x567d9b2bU, 0xa5796edcU, 0x5e71992fU,
6295a913ee7SJerome Forissier 0x2fb6c299U, 0xe695b773U, 0x5a77982dU, 0xcaafbc65U,
6305a913ee7SJerome Forissier 0x06058f03U, 0x2e398517U, 0x7c421f3eU, 0xea9fb475U,
6315a913ee7SJerome Forissier 0xc72af8edU, 0x44661122U, 0xb8e42e5cU, 0x00000000U,
6325a913ee7SJerome Forissier 0x94de254aU, 0x70481c38U, 0xa8fc2a54U, 0xf48e3d7aU,
6335a913ee7SJerome Forissier 0x141e050aU, 0x21bf4f9eU, 0xf1077bf6U, 0xf28bb279U,
6345a913ee7SJerome Forissier 0xc8ac3264U, 0x7a47903dU, 0x86c5af43U, 0x64561932U,
6355a913ee7SJerome Forissier 0xb6eda35bU, 0xfb08f7f3U, 0xd13773e6U, 0x4e699d27U,
6365a913ee7SJerome Forissier 0x547e152aU, 0xcd2574e8U, 0x9f5eeec1U, 0x0f86ca89U,
6375a913ee7SJerome Forissier 0x46659f23U, 0x3c220f1eU, 0x6c5a1b36U, 0xc92375eaU,
6385a913ee7SJerome Forissier 0x22338611U, 0x2a3f8415U, 0x4a6f9c25U, 0x35a14a94U,
6395a913ee7SJerome Forissier 0x66559733U, 0x685c1a34U, 0x894365caU, 0xff0ef6f1U,
6405a913ee7SJerome Forissier 0x9354edc7U, 0x24360912U, 0xd6bdbb6bU, 0x98d4264cU,
6415a913ee7SJerome Forissier 0x362d831bU, 0x8b40ebcbU, 0xa17f6fdeU, 0x3e21811fU,
6425a913ee7SJerome Forissier 0x10180408U, 0xb5616ad4U, 0x11974386U, 0x04060102U,
6435a913ee7SJerome Forissier 0x5c72172eU, 0xa37ce1dfU, 0x26358713U, 0xf304f5f7U,
6445a913ee7SJerome Forissier 0x0e098d07U, 0xab70e3dbU, 0x8cca2346U, 0x3a27801dU,
6455a913ee7SJerome Forissier 0x0d854488U, 0x5874162cU, 0x854966ccU, 0x84c62142U,
6465a913ee7SJerome Forissier 0xdf3efee1U, 0x73c4d5b7U, 0xc4a63162U, 0x43ecd9afU,
6475a913ee7SJerome Forissier 0xd4be356aU, 0x60501830U, 0x080c0204U, 0x8d4564c8U,
6485a913ee7SJerome Forissier 0xef16f2f9U, 0xe31cf1ffU, 0x45e956acU, 0x1394cd87U,
6495a913ee7SJerome Forissier 0x322b8219U, 0x078ac88dU, 0xd2bbba69U, 0xe71af0fdU,
6505a913ee7SJerome Forissier 0x9b58efc3U, 0x834ce9cfU, 0x874ae8cdU, 0xd334fde7U,
6515a913ee7SJerome Forissier 0x1e11890fU, 0x7bc8d7b3U, 0x3ba8c793U, 0xee99b577U,
6525a913ee7SJerome Forissier 0xaaffa455U, 0xbce22f5eU, 0x6e599537U, 0x4c6a1326U,
6535a913ee7SJerome Forissier 0x2c3a0b16U, 0xeb10f3fbU, 0xa77ae0ddU, 0xdcb2376eU,
6545a913ee7SJerome Forissier };
6555a913ee7SJerome Forissier
6565a913ee7SJerome Forissier static const ulong32 T3[256] = {
6575a913ee7SJerome Forissier 0xf5a653a7U, 0xd06bbbd3U, 0x6ebfd1e6U, 0x3bd9e271U,
6585a913ee7SJerome Forissier 0xda67bdd0U, 0xcf8a45acU, 0xb3299a4dU, 0x0bf9f279U,
6595a913ee7SJerome Forissier 0x9ce8743aU, 0x8c038fc9U, 0x417e3f91U, 0x32d7e5fcU,
6605a913ee7SJerome Forissier 0x44783c1eU, 0x8f018e47U, 0xe54da854U, 0xa9ce67bdU,
6615a913ee7SJerome Forissier 0x0f0a058cU, 0xf9ae57a5U, 0x01f5f47aU, 0x20cbebfbU,
6625a913ee7SJerome Forissier 0x5791c663U, 0xb7da6db8U, 0xf453a7ddU, 0xc277b5d4U,
6635a913ee7SJerome Forissier 0x64b3d7e5U, 0x8df67bb3U, 0xa43397c5U, 0xa3c261beU,
6645a913ee7SJerome Forissier 0xd19e4fa9U, 0x171a0d88U, 0x2830180cU, 0xebb259a2U,
6655a913ee7SJerome Forissier 0x96e47239U, 0xf85ba3dfU, 0xf6a45229U, 0xe64fa9daU,
6665a913ee7SJerome Forissier 0xfaac562bU, 0xd79a4da8U, 0x800b8bcbU, 0xb52d984cU,
6675a913ee7SJerome Forissier 0xa731964bU, 0xcc884422U, 0xdb9249aaU, 0xd8904824U,
6685a913ee7SJerome Forissier 0x9b198241U, 0x3ddde070U, 0xf3a251a6U, 0x2cc3eff9U,
6695a913ee7SJerome Forissier 0xc175b45aU, 0x76afd9e2U, 0x87fa7db0U, 0xb4d86c36U,
6705a913ee7SJerome Forissier 0x13e9fa7dU, 0x62b7d5e4U, 0xaacc6633U, 0x38dbe3ffU,
6715a913ee7SJerome Forissier 0x5d9dc060U, 0xc0804020U, 0x30201008U, 0x1d160b8bU,
6725a913ee7SJerome Forissier 0xd965bc5eU, 0xdd964babU, 0x1fe1fe7fU, 0x0dfdf078U,
6735a913ee7SJerome Forissier 0x15edf87cU, 0xe8b0582cU, 0xef41ae57U, 0xd66fb9d2U,
6745a913ee7SJerome Forissier 0xf257a5dcU, 0x73a9da6dU, 0x19e5fc7eU, 0x2e341a0dU,
6755a913ee7SJerome Forissier 0xf751a653U, 0x5f6a3594U, 0xb02b9bc3U, 0xf0a05028U,
6765a913ee7SJerome Forissier 0xd29c4e27U, 0x14180c06U, 0xdf61be5fU, 0xc98e47adU,
6775a913ee7SJerome Forissier 0x4f81ce67U, 0xd56db85cU, 0xe349aa55U, 0xad3d9048U,
6785a913ee7SJerome Forissier 0x24381c0eU, 0xf155a452U, 0x468fc9eaU, 0x91158442U,
6795a913ee7SJerome Forissier 0xc771b65bU, 0xd369ba5dU, 0xa0c06030U, 0xcd7db058U,
6805a913ee7SJerome Forissier 0xfb59a251U, 0xcb79b259U, 0x88f0783cU, 0xb9259c4eU,
6815a913ee7SJerome Forissier 0x90e07038U, 0x1b12098aU, 0x31d5e472U, 0x78502814U,
6825a913ee7SJerome Forissier 0x68bbd3e7U, 0xae3f91c6U, 0xfe5fa1deU, 0xfd5da050U,
6835a913ee7SJerome Forissier 0x0302018eU, 0x4b723992U, 0xdc63bfd1U, 0x2fc1ee77U,
6845a913ee7SJerome Forissier 0x4d763b93U, 0x83098a45U, 0x7b52299aU, 0x9e1f81ceU,
6855a913ee7SJerome Forissier 0xeeb45a2dU, 0x0a0c0603U, 0x5195c462U, 0x93e271b6U,
6865a913ee7SJerome Forissier 0xb1de6fb9U, 0xa5c663bfU, 0x53623196U, 0x67b1d66bU,
6875a913ee7SJerome Forissier 0x82fc7e3fU, 0x121c0e07U, 0x6c482412U, 0xc38241aeU,
6885a913ee7SJerome Forissier 0x9d1d8040U, 0xb8d06834U, 0x89058c46U, 0x84f87c3eU,
6895a913ee7SJerome Forissier 0xe04babdbU, 0x981b83cfU, 0x5297c5ecU, 0x921785ccU,
6905a913ee7SJerome Forissier 0xbc239fc1U, 0xe1be5fa1U, 0xba279dc0U, 0xce7fb1d6U,
6915a913ee7SJerome Forissier 0x4e743a1dU, 0x02f7f5f4U, 0x5b99c261U, 0x9aec763bU,
6925a913ee7SJerome Forissier 0x60402010U, 0xea47add8U, 0x6dbdd068U, 0xe7ba5da0U,
6935a913ee7SJerome Forissier 0x81fe7fb1U, 0x3c28140aU, 0x6bb9d269U, 0x75add86cU,
6945a913ee7SJerome Forissier 0xab399249U, 0x26cfe9faU, 0x29c5ec76U, 0xa23795c4U,
6955a913ee7SJerome Forissier 0x6342219eU, 0x7d562b9bU, 0x79a5dc6eU, 0x715e2f99U,
6965a913ee7SJerome Forissier 0xb62f99c2U, 0x95e673b7U, 0x775a2d98U, 0xafca65bcU,
6975a913ee7SJerome Forissier 0x0506038fU, 0x392e1785U, 0x427c3e1fU, 0x9fea75b4U,
6985a913ee7SJerome Forissier 0x2ac7edf8U, 0x66442211U, 0xe4b85c2eU, 0x00000000U,
6995a913ee7SJerome Forissier 0xde944a25U, 0x4870381cU, 0xfca8542aU, 0x8ef47a3dU,
7005a913ee7SJerome Forissier 0x1e140a05U, 0xbf219e4fU, 0x07f1f67bU, 0x8bf279b2U,
7015a913ee7SJerome Forissier 0xacc86432U, 0x477a3d90U, 0xc58643afU, 0x56643219U,
7025a913ee7SJerome Forissier 0xedb65ba3U, 0x08fbf3f7U, 0x37d1e673U, 0x694e279dU,
7035a913ee7SJerome Forissier 0x7e542a15U, 0x25cde874U, 0x5e9fc1eeU, 0x860f89caU,
7045a913ee7SJerome Forissier 0x6546239fU, 0x223c1e0fU, 0x5a6c361bU, 0x23c9ea75U,
7055a913ee7SJerome Forissier 0x33221186U, 0x3f2a1584U, 0x6f4a259cU, 0xa135944aU,
7065a913ee7SJerome Forissier 0x55663397U, 0x5c68341aU, 0x4389ca65U, 0x0efff1f6U,
7075a913ee7SJerome Forissier 0x5493c7edU, 0x36241209U, 0xbdd66bbbU, 0xd4984c26U,
7085a913ee7SJerome Forissier 0x2d361b83U, 0x408bcbebU, 0x7fa1de6fU, 0x213e1f81U,
7095a913ee7SJerome Forissier 0x18100804U, 0x61b5d46aU, 0x97118643U, 0x06040201U,
7105a913ee7SJerome Forissier 0x725c2e17U, 0x7ca3dfe1U, 0x35261387U, 0x04f3f7f5U,
7115a913ee7SJerome Forissier 0x090e078dU, 0x70abdbe3U, 0xca8c4623U, 0x273a1d80U,
7125a913ee7SJerome Forissier 0x850d8844U, 0x74582c16U, 0x4985cc66U, 0xc6844221U,
7135a913ee7SJerome Forissier 0x3edfe1feU, 0xc473b7d5U, 0xa6c46231U, 0xec43afd9U,
7145a913ee7SJerome Forissier 0xbed46a35U, 0x50603018U, 0x0c080402U, 0x458dc864U,
7155a913ee7SJerome Forissier 0x16eff9f2U, 0x1ce3fff1U, 0xe945ac56U, 0x941387cdU,
7165a913ee7SJerome Forissier 0x2b321982U, 0x8a078dc8U, 0xbbd269baU, 0x1ae7fdf0U,
7175a913ee7SJerome Forissier 0x589bc3efU, 0x4c83cfe9U, 0x4a87cde8U, 0x34d3e7fdU,
7185a913ee7SJerome Forissier 0x111e0f89U, 0xc87bb3d7U, 0xa83b93c7U, 0x99ee77b5U,
7195a913ee7SJerome Forissier 0xffaa55a4U, 0xe2bc5e2fU, 0x596e3795U, 0x6a4c2613U,
7205a913ee7SJerome Forissier 0x3a2c160bU, 0x10ebfbf3U, 0x7aa7dde0U, 0xb2dc6e37U,
7215a913ee7SJerome Forissier };
7225a913ee7SJerome Forissier
7235a913ee7SJerome Forissier static const ulong32 T4[256] = {
7245a913ee7SJerome Forissier 0xa7a7a7a7U, 0xd3d3d3d3U, 0xe6e6e6e6U, 0x71717171U,
7255a913ee7SJerome Forissier 0xd0d0d0d0U, 0xacacacacU, 0x4d4d4d4dU, 0x79797979U,
7265a913ee7SJerome Forissier 0x3a3a3a3aU, 0xc9c9c9c9U, 0x91919191U, 0xfcfcfcfcU,
7275a913ee7SJerome Forissier 0x1e1e1e1eU, 0x47474747U, 0x54545454U, 0xbdbdbdbdU,
7285a913ee7SJerome Forissier 0x8c8c8c8cU, 0xa5a5a5a5U, 0x7a7a7a7aU, 0xfbfbfbfbU,
7295a913ee7SJerome Forissier 0x63636363U, 0xb8b8b8b8U, 0xddddddddU, 0xd4d4d4d4U,
7305a913ee7SJerome Forissier 0xe5e5e5e5U, 0xb3b3b3b3U, 0xc5c5c5c5U, 0xbebebebeU,
7315a913ee7SJerome Forissier 0xa9a9a9a9U, 0x88888888U, 0x0c0c0c0cU, 0xa2a2a2a2U,
7325a913ee7SJerome Forissier 0x39393939U, 0xdfdfdfdfU, 0x29292929U, 0xdadadadaU,
7335a913ee7SJerome Forissier 0x2b2b2b2bU, 0xa8a8a8a8U, 0xcbcbcbcbU, 0x4c4c4c4cU,
7345a913ee7SJerome Forissier 0x4b4b4b4bU, 0x22222222U, 0xaaaaaaaaU, 0x24242424U,
7355a913ee7SJerome Forissier 0x41414141U, 0x70707070U, 0xa6a6a6a6U, 0xf9f9f9f9U,
7365a913ee7SJerome Forissier 0x5a5a5a5aU, 0xe2e2e2e2U, 0xb0b0b0b0U, 0x36363636U,
7375a913ee7SJerome Forissier 0x7d7d7d7dU, 0xe4e4e4e4U, 0x33333333U, 0xffffffffU,
7385a913ee7SJerome Forissier 0x60606060U, 0x20202020U, 0x08080808U, 0x8b8b8b8bU,
7395a913ee7SJerome Forissier 0x5e5e5e5eU, 0xababababU, 0x7f7f7f7fU, 0x78787878U,
7405a913ee7SJerome Forissier 0x7c7c7c7cU, 0x2c2c2c2cU, 0x57575757U, 0xd2d2d2d2U,
7415a913ee7SJerome Forissier 0xdcdcdcdcU, 0x6d6d6d6dU, 0x7e7e7e7eU, 0x0d0d0d0dU,
7425a913ee7SJerome Forissier 0x53535353U, 0x94949494U, 0xc3c3c3c3U, 0x28282828U,
7435a913ee7SJerome Forissier 0x27272727U, 0x06060606U, 0x5f5f5f5fU, 0xadadadadU,
7445a913ee7SJerome Forissier 0x67676767U, 0x5c5c5c5cU, 0x55555555U, 0x48484848U,
7455a913ee7SJerome Forissier 0x0e0e0e0eU, 0x52525252U, 0xeaeaeaeaU, 0x42424242U,
7465a913ee7SJerome Forissier 0x5b5b5b5bU, 0x5d5d5d5dU, 0x30303030U, 0x58585858U,
7475a913ee7SJerome Forissier 0x51515151U, 0x59595959U, 0x3c3c3c3cU, 0x4e4e4e4eU,
7485a913ee7SJerome Forissier 0x38383838U, 0x8a8a8a8aU, 0x72727272U, 0x14141414U,
7495a913ee7SJerome Forissier 0xe7e7e7e7U, 0xc6c6c6c6U, 0xdedededeU, 0x50505050U,
7505a913ee7SJerome Forissier 0x8e8e8e8eU, 0x92929292U, 0xd1d1d1d1U, 0x77777777U,
7515a913ee7SJerome Forissier 0x93939393U, 0x45454545U, 0x9a9a9a9aU, 0xcecececeU,
7525a913ee7SJerome Forissier 0x2d2d2d2dU, 0x03030303U, 0x62626262U, 0xb6b6b6b6U,
7535a913ee7SJerome Forissier 0xb9b9b9b9U, 0xbfbfbfbfU, 0x96969696U, 0x6b6b6b6bU,
7545a913ee7SJerome Forissier 0x3f3f3f3fU, 0x07070707U, 0x12121212U, 0xaeaeaeaeU,
7555a913ee7SJerome Forissier 0x40404040U, 0x34343434U, 0x46464646U, 0x3e3e3e3eU,
7565a913ee7SJerome Forissier 0xdbdbdbdbU, 0xcfcfcfcfU, 0xececececU, 0xccccccccU,
7575a913ee7SJerome Forissier 0xc1c1c1c1U, 0xa1a1a1a1U, 0xc0c0c0c0U, 0xd6d6d6d6U,
7585a913ee7SJerome Forissier 0x1d1d1d1dU, 0xf4f4f4f4U, 0x61616161U, 0x3b3b3b3bU,
7595a913ee7SJerome Forissier 0x10101010U, 0xd8d8d8d8U, 0x68686868U, 0xa0a0a0a0U,
7605a913ee7SJerome Forissier 0xb1b1b1b1U, 0x0a0a0a0aU, 0x69696969U, 0x6c6c6c6cU,
7615a913ee7SJerome Forissier 0x49494949U, 0xfafafafaU, 0x76767676U, 0xc4c4c4c4U,
7625a913ee7SJerome Forissier 0x9e9e9e9eU, 0x9b9b9b9bU, 0x6e6e6e6eU, 0x99999999U,
7635a913ee7SJerome Forissier 0xc2c2c2c2U, 0xb7b7b7b7U, 0x98989898U, 0xbcbcbcbcU,
7645a913ee7SJerome Forissier 0x8f8f8f8fU, 0x85858585U, 0x1f1f1f1fU, 0xb4b4b4b4U,
7655a913ee7SJerome Forissier 0xf8f8f8f8U, 0x11111111U, 0x2e2e2e2eU, 0x00000000U,
7665a913ee7SJerome Forissier 0x25252525U, 0x1c1c1c1cU, 0x2a2a2a2aU, 0x3d3d3d3dU,
7675a913ee7SJerome Forissier 0x05050505U, 0x4f4f4f4fU, 0x7b7b7b7bU, 0xb2b2b2b2U,
7685a913ee7SJerome Forissier 0x32323232U, 0x90909090U, 0xafafafafU, 0x19191919U,
7695a913ee7SJerome Forissier 0xa3a3a3a3U, 0xf7f7f7f7U, 0x73737373U, 0x9d9d9d9dU,
7705a913ee7SJerome Forissier 0x15151515U, 0x74747474U, 0xeeeeeeeeU, 0xcacacacaU,
7715a913ee7SJerome Forissier 0x9f9f9f9fU, 0x0f0f0f0fU, 0x1b1b1b1bU, 0x75757575U,
7725a913ee7SJerome Forissier 0x86868686U, 0x84848484U, 0x9c9c9c9cU, 0x4a4a4a4aU,
7735a913ee7SJerome Forissier 0x97979797U, 0x1a1a1a1aU, 0x65656565U, 0xf6f6f6f6U,
7745a913ee7SJerome Forissier 0xededededU, 0x09090909U, 0xbbbbbbbbU, 0x26262626U,
7755a913ee7SJerome Forissier 0x83838383U, 0xebebebebU, 0x6f6f6f6fU, 0x81818181U,
7765a913ee7SJerome Forissier 0x04040404U, 0x6a6a6a6aU, 0x43434343U, 0x01010101U,
7775a913ee7SJerome Forissier 0x17171717U, 0xe1e1e1e1U, 0x87878787U, 0xf5f5f5f5U,
7785a913ee7SJerome Forissier 0x8d8d8d8dU, 0xe3e3e3e3U, 0x23232323U, 0x80808080U,
7795a913ee7SJerome Forissier 0x44444444U, 0x16161616U, 0x66666666U, 0x21212121U,
7805a913ee7SJerome Forissier 0xfefefefeU, 0xd5d5d5d5U, 0x31313131U, 0xd9d9d9d9U,
7815a913ee7SJerome Forissier 0x35353535U, 0x18181818U, 0x02020202U, 0x64646464U,
7825a913ee7SJerome Forissier 0xf2f2f2f2U, 0xf1f1f1f1U, 0x56565656U, 0xcdcdcdcdU,
7835a913ee7SJerome Forissier 0x82828282U, 0xc8c8c8c8U, 0xbabababaU, 0xf0f0f0f0U,
7845a913ee7SJerome Forissier 0xefefefefU, 0xe9e9e9e9U, 0xe8e8e8e8U, 0xfdfdfdfdU,
7855a913ee7SJerome Forissier 0x89898989U, 0xd7d7d7d7U, 0xc7c7c7c7U, 0xb5b5b5b5U,
7865a913ee7SJerome Forissier 0xa4a4a4a4U, 0x2f2f2f2fU, 0x95959595U, 0x13131313U,
7875a913ee7SJerome Forissier 0x0b0b0b0bU, 0xf3f3f3f3U, 0xe0e0e0e0U, 0x37373737U,
7885a913ee7SJerome Forissier };
7895a913ee7SJerome Forissier
7905a913ee7SJerome Forissier static const ulong32 T5[256] = {
7915a913ee7SJerome Forissier 0x00000000U, 0x01020608U, 0x02040c10U, 0x03060a18U,
7925a913ee7SJerome Forissier 0x04081820U, 0x050a1e28U, 0x060c1430U, 0x070e1238U,
7935a913ee7SJerome Forissier 0x08103040U, 0x09123648U, 0x0a143c50U, 0x0b163a58U,
7945a913ee7SJerome Forissier 0x0c182860U, 0x0d1a2e68U, 0x0e1c2470U, 0x0f1e2278U,
7955a913ee7SJerome Forissier 0x10206080U, 0x11226688U, 0x12246c90U, 0x13266a98U,
7965a913ee7SJerome Forissier 0x142878a0U, 0x152a7ea8U, 0x162c74b0U, 0x172e72b8U,
7975a913ee7SJerome Forissier 0x183050c0U, 0x193256c8U, 0x1a345cd0U, 0x1b365ad8U,
7985a913ee7SJerome Forissier 0x1c3848e0U, 0x1d3a4ee8U, 0x1e3c44f0U, 0x1f3e42f8U,
7995a913ee7SJerome Forissier 0x2040c01dU, 0x2142c615U, 0x2244cc0dU, 0x2346ca05U,
8005a913ee7SJerome Forissier 0x2448d83dU, 0x254ade35U, 0x264cd42dU, 0x274ed225U,
8015a913ee7SJerome Forissier 0x2850f05dU, 0x2952f655U, 0x2a54fc4dU, 0x2b56fa45U,
8025a913ee7SJerome Forissier 0x2c58e87dU, 0x2d5aee75U, 0x2e5ce46dU, 0x2f5ee265U,
8035a913ee7SJerome Forissier 0x3060a09dU, 0x3162a695U, 0x3264ac8dU, 0x3366aa85U,
8045a913ee7SJerome Forissier 0x3468b8bdU, 0x356abeb5U, 0x366cb4adU, 0x376eb2a5U,
8055a913ee7SJerome Forissier 0x387090ddU, 0x397296d5U, 0x3a749ccdU, 0x3b769ac5U,
8065a913ee7SJerome Forissier 0x3c7888fdU, 0x3d7a8ef5U, 0x3e7c84edU, 0x3f7e82e5U,
8075a913ee7SJerome Forissier 0x40809d3aU, 0x41829b32U, 0x4284912aU, 0x43869722U,
8085a913ee7SJerome Forissier 0x4488851aU, 0x458a8312U, 0x468c890aU, 0x478e8f02U,
8095a913ee7SJerome Forissier 0x4890ad7aU, 0x4992ab72U, 0x4a94a16aU, 0x4b96a762U,
8105a913ee7SJerome Forissier 0x4c98b55aU, 0x4d9ab352U, 0x4e9cb94aU, 0x4f9ebf42U,
8115a913ee7SJerome Forissier 0x50a0fdbaU, 0x51a2fbb2U, 0x52a4f1aaU, 0x53a6f7a2U,
8125a913ee7SJerome Forissier 0x54a8e59aU, 0x55aae392U, 0x56ace98aU, 0x57aeef82U,
8135a913ee7SJerome Forissier 0x58b0cdfaU, 0x59b2cbf2U, 0x5ab4c1eaU, 0x5bb6c7e2U,
8145a913ee7SJerome Forissier 0x5cb8d5daU, 0x5dbad3d2U, 0x5ebcd9caU, 0x5fbedfc2U,
8155a913ee7SJerome Forissier 0x60c05d27U, 0x61c25b2fU, 0x62c45137U, 0x63c6573fU,
8165a913ee7SJerome Forissier 0x64c84507U, 0x65ca430fU, 0x66cc4917U, 0x67ce4f1fU,
8175a913ee7SJerome Forissier 0x68d06d67U, 0x69d26b6fU, 0x6ad46177U, 0x6bd6677fU,
8185a913ee7SJerome Forissier 0x6cd87547U, 0x6dda734fU, 0x6edc7957U, 0x6fde7f5fU,
8195a913ee7SJerome Forissier 0x70e03da7U, 0x71e23bafU, 0x72e431b7U, 0x73e637bfU,
8205a913ee7SJerome Forissier 0x74e82587U, 0x75ea238fU, 0x76ec2997U, 0x77ee2f9fU,
8215a913ee7SJerome Forissier 0x78f00de7U, 0x79f20befU, 0x7af401f7U, 0x7bf607ffU,
8225a913ee7SJerome Forissier 0x7cf815c7U, 0x7dfa13cfU, 0x7efc19d7U, 0x7ffe1fdfU,
8235a913ee7SJerome Forissier 0x801d2774U, 0x811f217cU, 0x82192b64U, 0x831b2d6cU,
8245a913ee7SJerome Forissier 0x84153f54U, 0x8517395cU, 0x86113344U, 0x8713354cU,
8255a913ee7SJerome Forissier 0x880d1734U, 0x890f113cU, 0x8a091b24U, 0x8b0b1d2cU,
8265a913ee7SJerome Forissier 0x8c050f14U, 0x8d07091cU, 0x8e010304U, 0x8f03050cU,
8275a913ee7SJerome Forissier 0x903d47f4U, 0x913f41fcU, 0x92394be4U, 0x933b4decU,
8285a913ee7SJerome Forissier 0x94355fd4U, 0x953759dcU, 0x963153c4U, 0x973355ccU,
8295a913ee7SJerome Forissier 0x982d77b4U, 0x992f71bcU, 0x9a297ba4U, 0x9b2b7dacU,
8305a913ee7SJerome Forissier 0x9c256f94U, 0x9d27699cU, 0x9e216384U, 0x9f23658cU,
8315a913ee7SJerome Forissier 0xa05de769U, 0xa15fe161U, 0xa259eb79U, 0xa35bed71U,
8325a913ee7SJerome Forissier 0xa455ff49U, 0xa557f941U, 0xa651f359U, 0xa753f551U,
8335a913ee7SJerome Forissier 0xa84dd729U, 0xa94fd121U, 0xaa49db39U, 0xab4bdd31U,
8345a913ee7SJerome Forissier 0xac45cf09U, 0xad47c901U, 0xae41c319U, 0xaf43c511U,
8355a913ee7SJerome Forissier 0xb07d87e9U, 0xb17f81e1U, 0xb2798bf9U, 0xb37b8df1U,
8365a913ee7SJerome Forissier 0xb4759fc9U, 0xb57799c1U, 0xb67193d9U, 0xb77395d1U,
8375a913ee7SJerome Forissier 0xb86db7a9U, 0xb96fb1a1U, 0xba69bbb9U, 0xbb6bbdb1U,
8385a913ee7SJerome Forissier 0xbc65af89U, 0xbd67a981U, 0xbe61a399U, 0xbf63a591U,
8395a913ee7SJerome Forissier 0xc09dba4eU, 0xc19fbc46U, 0xc299b65eU, 0xc39bb056U,
8405a913ee7SJerome Forissier 0xc495a26eU, 0xc597a466U, 0xc691ae7eU, 0xc793a876U,
8415a913ee7SJerome Forissier 0xc88d8a0eU, 0xc98f8c06U, 0xca89861eU, 0xcb8b8016U,
8425a913ee7SJerome Forissier 0xcc85922eU, 0xcd879426U, 0xce819e3eU, 0xcf839836U,
8435a913ee7SJerome Forissier 0xd0bddaceU, 0xd1bfdcc6U, 0xd2b9d6deU, 0xd3bbd0d6U,
8445a913ee7SJerome Forissier 0xd4b5c2eeU, 0xd5b7c4e6U, 0xd6b1cefeU, 0xd7b3c8f6U,
8455a913ee7SJerome Forissier 0xd8adea8eU, 0xd9afec86U, 0xdaa9e69eU, 0xdbabe096U,
8465a913ee7SJerome Forissier 0xdca5f2aeU, 0xdda7f4a6U, 0xdea1febeU, 0xdfa3f8b6U,
8475a913ee7SJerome Forissier 0xe0dd7a53U, 0xe1df7c5bU, 0xe2d97643U, 0xe3db704bU,
8485a913ee7SJerome Forissier 0xe4d56273U, 0xe5d7647bU, 0xe6d16e63U, 0xe7d3686bU,
8495a913ee7SJerome Forissier 0xe8cd4a13U, 0xe9cf4c1bU, 0xeac94603U, 0xebcb400bU,
8505a913ee7SJerome Forissier 0xecc55233U, 0xedc7543bU, 0xeec15e23U, 0xefc3582bU,
8515a913ee7SJerome Forissier 0xf0fd1ad3U, 0xf1ff1cdbU, 0xf2f916c3U, 0xf3fb10cbU,
8525a913ee7SJerome Forissier 0xf4f502f3U, 0xf5f704fbU, 0xf6f10ee3U, 0xf7f308ebU,
8535a913ee7SJerome Forissier 0xf8ed2a93U, 0xf9ef2c9bU, 0xfae92683U, 0xfbeb208bU,
8545a913ee7SJerome Forissier 0xfce532b3U, 0xfde734bbU, 0xfee13ea3U, 0xffe338abU,
8555a913ee7SJerome Forissier };
8565a913ee7SJerome Forissier
8575a913ee7SJerome Forissier /**
8585a913ee7SJerome Forissier * The round constants.
8595a913ee7SJerome Forissier */
8605a913ee7SJerome Forissier static const ulong32 rc[] = {
8615a913ee7SJerome Forissier 0xa7d3e671U, 0xd0ac4d79U, 0x3ac991fcU, 0x1e4754bdU,
8625a913ee7SJerome Forissier 0x8ca57afbU, 0x63b8ddd4U, 0xe5b3c5beU, 0xa9880ca2U,
8635a913ee7SJerome Forissier 0x39df29daU, 0x2ba8cb4cU, 0x4b22aa24U, 0x4170a6f9U,
8645a913ee7SJerome Forissier 0x5ae2b036U, 0x7de433ffU, 0x6020088bU, 0x5eab7f78U,
8655a913ee7SJerome Forissier 0x7c2c57d2U, 0xdc6d7e0dU, 0x5394c328U,
8665a913ee7SJerome Forissier };
8675a913ee7SJerome Forissier
8685a913ee7SJerome Forissier #endif
8695a913ee7SJerome Forissier
8705a913ee7SJerome Forissier /**
8715a913ee7SJerome Forissier Initialize the Anubis block cipher
8725a913ee7SJerome Forissier @param key The symmetric key you wish to pass
8735a913ee7SJerome Forissier @param keylen The key length in bytes
8745a913ee7SJerome Forissier @param num_rounds The number of rounds desired (0 for default)
8755a913ee7SJerome Forissier @param skey The key in as scheduled by this function.
8765a913ee7SJerome Forissier @return CRYPT_OK if successful
8775a913ee7SJerome Forissier */
8785a913ee7SJerome Forissier #ifdef LTC_CLEAN_STACK
s_anubis_setup(const unsigned char * key,int keylen,int num_rounds,symmetric_key * skey)879*8411e6adSJerome Forissier static int s_anubis_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey)
8805a913ee7SJerome Forissier #else
8815a913ee7SJerome Forissier int anubis_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey)
8825a913ee7SJerome Forissier #endif
8835a913ee7SJerome Forissier {
8845a913ee7SJerome Forissier int N, R, i, pos, r;
8855a913ee7SJerome Forissier ulong32 kappa[MAX_N];
8865a913ee7SJerome Forissier ulong32 inter[MAX_N] = { 0 }; /* initialize as all zeroes */
8875a913ee7SJerome Forissier ulong32 v, K0, K1, K2, K3;
8885a913ee7SJerome Forissier
8895a913ee7SJerome Forissier LTC_ARGCHK(key != NULL);
8905a913ee7SJerome Forissier LTC_ARGCHK(skey != NULL);
8915a913ee7SJerome Forissier
8925a913ee7SJerome Forissier /* Valid sizes (in bytes) are 16, 20, 24, 28, 32, 36, and 40. */
8935a913ee7SJerome Forissier if ((keylen & 3) || (keylen < 16) || (keylen > 40)) {
8945a913ee7SJerome Forissier return CRYPT_INVALID_KEYSIZE;
8955a913ee7SJerome Forissier }
8965a913ee7SJerome Forissier skey->anubis.keyBits = keylen*8;
8975a913ee7SJerome Forissier
8985a913ee7SJerome Forissier /*
8995a913ee7SJerome Forissier * determine the N length parameter:
9005a913ee7SJerome Forissier * (N.B. it is assumed that the key length is valid!)
9015a913ee7SJerome Forissier */
9025a913ee7SJerome Forissier N = skey->anubis.keyBits >> 5;
9035a913ee7SJerome Forissier
9045a913ee7SJerome Forissier /*
9055a913ee7SJerome Forissier * determine number of rounds from key size:
9065a913ee7SJerome Forissier */
9075a913ee7SJerome Forissier skey->anubis.R = R = 8 + N;
9085a913ee7SJerome Forissier
9095a913ee7SJerome Forissier if (num_rounds != 0 && num_rounds != skey->anubis.R) {
9105a913ee7SJerome Forissier return CRYPT_INVALID_ROUNDS;
9115a913ee7SJerome Forissier }
9125a913ee7SJerome Forissier
9135a913ee7SJerome Forissier /*
9145a913ee7SJerome Forissier * map cipher key to initial key state (mu):
9155a913ee7SJerome Forissier */
9165a913ee7SJerome Forissier for (i = 0, pos = 0; i < N; i++, pos += 4) {
9175a913ee7SJerome Forissier kappa[i] =
9185a913ee7SJerome Forissier (((ulong32)key[pos ]) << 24) ^
9195a913ee7SJerome Forissier (((ulong32)key[pos + 1]) << 16) ^
9205a913ee7SJerome Forissier (((ulong32)key[pos + 2]) << 8) ^
9215a913ee7SJerome Forissier (((ulong32)key[pos + 3]) );
9225a913ee7SJerome Forissier }
9235a913ee7SJerome Forissier
9245a913ee7SJerome Forissier /*
9255a913ee7SJerome Forissier * generate R + 1 round keys:
9265a913ee7SJerome Forissier */
9275a913ee7SJerome Forissier for (r = 0; r <= R; r++) {
9285a913ee7SJerome Forissier /*
9295a913ee7SJerome Forissier * generate r-th round key K^r:
9305a913ee7SJerome Forissier */
9315a913ee7SJerome Forissier K0 = T4[(kappa[N - 1] >> 24) & 0xff];
9325a913ee7SJerome Forissier K1 = T4[(kappa[N - 1] >> 16) & 0xff];
9335a913ee7SJerome Forissier K2 = T4[(kappa[N - 1] >> 8) & 0xff];
9345a913ee7SJerome Forissier K3 = T4[(kappa[N - 1] ) & 0xff];
9355a913ee7SJerome Forissier for (i = N - 2; i >= 0; i--) {
9365a913ee7SJerome Forissier K0 = T4[(kappa[i] >> 24) & 0xff] ^
9375a913ee7SJerome Forissier (T5[(K0 >> 24) & 0xff] & 0xff000000U) ^
9385a913ee7SJerome Forissier (T5[(K0 >> 16) & 0xff] & 0x00ff0000U) ^
9395a913ee7SJerome Forissier (T5[(K0 >> 8) & 0xff] & 0x0000ff00U) ^
9405a913ee7SJerome Forissier (T5[(K0 ) & 0xff] & 0x000000ffU);
9415a913ee7SJerome Forissier K1 = T4[(kappa[i] >> 16) & 0xff] ^
9425a913ee7SJerome Forissier (T5[(K1 >> 24) & 0xff] & 0xff000000U) ^
9435a913ee7SJerome Forissier (T5[(K1 >> 16) & 0xff] & 0x00ff0000U) ^
9445a913ee7SJerome Forissier (T5[(K1 >> 8) & 0xff] & 0x0000ff00U) ^
9455a913ee7SJerome Forissier (T5[(K1 ) & 0xff] & 0x000000ffU);
9465a913ee7SJerome Forissier K2 = T4[(kappa[i] >> 8) & 0xff] ^
9475a913ee7SJerome Forissier (T5[(K2 >> 24) & 0xff] & 0xff000000U) ^
9485a913ee7SJerome Forissier (T5[(K2 >> 16) & 0xff] & 0x00ff0000U) ^
9495a913ee7SJerome Forissier (T5[(K2 >> 8) & 0xff] & 0x0000ff00U) ^
9505a913ee7SJerome Forissier (T5[(K2 ) & 0xff] & 0x000000ffU);
9515a913ee7SJerome Forissier K3 = T4[(kappa[i] ) & 0xff] ^
9525a913ee7SJerome Forissier (T5[(K3 >> 24) & 0xff] & 0xff000000U) ^
9535a913ee7SJerome Forissier (T5[(K3 >> 16) & 0xff] & 0x00ff0000U) ^
9545a913ee7SJerome Forissier (T5[(K3 >> 8) & 0xff] & 0x0000ff00U) ^
9555a913ee7SJerome Forissier (T5[(K3 ) & 0xff] & 0x000000ffU);
9565a913ee7SJerome Forissier }
9575a913ee7SJerome Forissier /*
9585a913ee7SJerome Forissier -- this is the code to use with the large U tables:
9595a913ee7SJerome Forissier K0 = K1 = K2 = K3 = 0;
9605a913ee7SJerome Forissier for (i = 0; i < N; i++) {
9615a913ee7SJerome Forissier K0 ^= U[i][(kappa[i] >> 24) & 0xff];
9625a913ee7SJerome Forissier K1 ^= U[i][(kappa[i] >> 16) & 0xff];
9635a913ee7SJerome Forissier K2 ^= U[i][(kappa[i] >> 8) & 0xff];
9645a913ee7SJerome Forissier K3 ^= U[i][(kappa[i] ) & 0xff];
9655a913ee7SJerome Forissier }
9665a913ee7SJerome Forissier */
9675a913ee7SJerome Forissier skey->anubis.roundKeyEnc[r][0] = K0;
9685a913ee7SJerome Forissier skey->anubis.roundKeyEnc[r][1] = K1;
9695a913ee7SJerome Forissier skey->anubis.roundKeyEnc[r][2] = K2;
9705a913ee7SJerome Forissier skey->anubis.roundKeyEnc[r][3] = K3;
9715a913ee7SJerome Forissier
9725a913ee7SJerome Forissier /*
9735a913ee7SJerome Forissier * compute kappa^{r+1} from kappa^r:
9745a913ee7SJerome Forissier */
9755a913ee7SJerome Forissier if (r == R) {
9765a913ee7SJerome Forissier break;
9775a913ee7SJerome Forissier }
9785a913ee7SJerome Forissier for (i = 0; i < N; i++) {
9795a913ee7SJerome Forissier int j = i;
9805a913ee7SJerome Forissier inter[i] = T0[(kappa[j--] >> 24) & 0xff]; if (j < 0) j = N - 1;
9815a913ee7SJerome Forissier inter[i] ^= T1[(kappa[j--] >> 16) & 0xff]; if (j < 0) j = N - 1;
9825a913ee7SJerome Forissier inter[i] ^= T2[(kappa[j--] >> 8) & 0xff]; if (j < 0) j = N - 1;
9835a913ee7SJerome Forissier inter[i] ^= T3[(kappa[j ] ) & 0xff];
9845a913ee7SJerome Forissier }
9855a913ee7SJerome Forissier kappa[0] = inter[0] ^ rc[r];
9865a913ee7SJerome Forissier for (i = 1; i < N; i++) {
9875a913ee7SJerome Forissier kappa[i] = inter[i];
9885a913ee7SJerome Forissier }
9895a913ee7SJerome Forissier }
9905a913ee7SJerome Forissier
9915a913ee7SJerome Forissier /*
9925a913ee7SJerome Forissier * generate inverse key schedule: K'^0 = K^R, K'^R = K^0, K'^r = theta(K^{R-r}):
9935a913ee7SJerome Forissier */
9945a913ee7SJerome Forissier for (i = 0; i < 4; i++) {
9955a913ee7SJerome Forissier skey->anubis.roundKeyDec[0][i] = skey->anubis.roundKeyEnc[R][i];
9965a913ee7SJerome Forissier skey->anubis.roundKeyDec[R][i] = skey->anubis.roundKeyEnc[0][i];
9975a913ee7SJerome Forissier }
9985a913ee7SJerome Forissier for (r = 1; r < R; r++) {
9995a913ee7SJerome Forissier for (i = 0; i < 4; i++) {
10005a913ee7SJerome Forissier v = skey->anubis.roundKeyEnc[R - r][i];
10015a913ee7SJerome Forissier skey->anubis.roundKeyDec[r][i] =
10025a913ee7SJerome Forissier T0[T4[(v >> 24) & 0xff] & 0xff] ^
10035a913ee7SJerome Forissier T1[T4[(v >> 16) & 0xff] & 0xff] ^
10045a913ee7SJerome Forissier T2[T4[(v >> 8) & 0xff] & 0xff] ^
10055a913ee7SJerome Forissier T3[T4[(v ) & 0xff] & 0xff];
10065a913ee7SJerome Forissier }
10075a913ee7SJerome Forissier }
10085a913ee7SJerome Forissier
10095a913ee7SJerome Forissier return CRYPT_OK;
10105a913ee7SJerome Forissier }
10115a913ee7SJerome Forissier
10125a913ee7SJerome Forissier #ifdef LTC_CLEAN_STACK
anubis_setup(const unsigned char * key,int keylen,int num_rounds,symmetric_key * skey)10135a913ee7SJerome Forissier int anubis_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey)
10145a913ee7SJerome Forissier {
10155a913ee7SJerome Forissier int err;
1016*8411e6adSJerome Forissier err = s_anubis_setup(key, keylen, num_rounds, skey);
10175a913ee7SJerome Forissier burn_stack(sizeof(int) * 5 + sizeof(ulong32) * (MAX_N + MAX_N + 5));
10185a913ee7SJerome Forissier return err;
10195a913ee7SJerome Forissier }
10205a913ee7SJerome Forissier #endif
10215a913ee7SJerome Forissier
10225a913ee7SJerome Forissier
anubis_crypt(const unsigned char * plaintext,unsigned char * ciphertext,const ulong32 roundKey[18+1][4],int R)10235a913ee7SJerome Forissier static void anubis_crypt(const unsigned char *plaintext, unsigned char *ciphertext,
10245a913ee7SJerome Forissier const ulong32 roundKey[18 + 1][4], int R) {
10255a913ee7SJerome Forissier int i, pos, r;
10265a913ee7SJerome Forissier ulong32 state[4];
10275a913ee7SJerome Forissier ulong32 inter[4];
10285a913ee7SJerome Forissier
10295a913ee7SJerome Forissier /*
10305a913ee7SJerome Forissier * map plaintext block to cipher state (mu)
10315a913ee7SJerome Forissier * and add initial round key (sigma[K^0]):
10325a913ee7SJerome Forissier */
10335a913ee7SJerome Forissier for (i = 0, pos = 0; i < 4; i++, pos += 4) {
10345a913ee7SJerome Forissier state[i] =
10355a913ee7SJerome Forissier (((ulong32)plaintext[pos ]) << 24) ^
10365a913ee7SJerome Forissier (((ulong32)plaintext[pos + 1]) << 16) ^
10375a913ee7SJerome Forissier (((ulong32)plaintext[pos + 2]) << 8) ^
10385a913ee7SJerome Forissier (((ulong32)plaintext[pos + 3]) ) ^
10395a913ee7SJerome Forissier roundKey[0][i];
10405a913ee7SJerome Forissier }
10415a913ee7SJerome Forissier
10425a913ee7SJerome Forissier /*
10435a913ee7SJerome Forissier * R - 1 full rounds:
10445a913ee7SJerome Forissier */
10455a913ee7SJerome Forissier for (r = 1; r < R; r++) {
10465a913ee7SJerome Forissier inter[0] =
10475a913ee7SJerome Forissier T0[(state[0] >> 24) & 0xff] ^
10485a913ee7SJerome Forissier T1[(state[1] >> 24) & 0xff] ^
10495a913ee7SJerome Forissier T2[(state[2] >> 24) & 0xff] ^
10505a913ee7SJerome Forissier T3[(state[3] >> 24) & 0xff] ^
10515a913ee7SJerome Forissier roundKey[r][0];
10525a913ee7SJerome Forissier inter[1] =
10535a913ee7SJerome Forissier T0[(state[0] >> 16) & 0xff] ^
10545a913ee7SJerome Forissier T1[(state[1] >> 16) & 0xff] ^
10555a913ee7SJerome Forissier T2[(state[2] >> 16) & 0xff] ^
10565a913ee7SJerome Forissier T3[(state[3] >> 16) & 0xff] ^
10575a913ee7SJerome Forissier roundKey[r][1];
10585a913ee7SJerome Forissier inter[2] =
10595a913ee7SJerome Forissier T0[(state[0] >> 8) & 0xff] ^
10605a913ee7SJerome Forissier T1[(state[1] >> 8) & 0xff] ^
10615a913ee7SJerome Forissier T2[(state[2] >> 8) & 0xff] ^
10625a913ee7SJerome Forissier T3[(state[3] >> 8) & 0xff] ^
10635a913ee7SJerome Forissier roundKey[r][2];
10645a913ee7SJerome Forissier inter[3] =
10655a913ee7SJerome Forissier T0[(state[0] ) & 0xff] ^
10665a913ee7SJerome Forissier T1[(state[1] ) & 0xff] ^
10675a913ee7SJerome Forissier T2[(state[2] ) & 0xff] ^
10685a913ee7SJerome Forissier T3[(state[3] ) & 0xff] ^
10695a913ee7SJerome Forissier roundKey[r][3];
10705a913ee7SJerome Forissier state[0] = inter[0];
10715a913ee7SJerome Forissier state[1] = inter[1];
10725a913ee7SJerome Forissier state[2] = inter[2];
10735a913ee7SJerome Forissier state[3] = inter[3];
10745a913ee7SJerome Forissier }
10755a913ee7SJerome Forissier
10765a913ee7SJerome Forissier /*
10775a913ee7SJerome Forissier * last round:
10785a913ee7SJerome Forissier */
10795a913ee7SJerome Forissier inter[0] =
10805a913ee7SJerome Forissier (T0[(state[0] >> 24) & 0xff] & 0xff000000U) ^
10815a913ee7SJerome Forissier (T1[(state[1] >> 24) & 0xff] & 0x00ff0000U) ^
10825a913ee7SJerome Forissier (T2[(state[2] >> 24) & 0xff] & 0x0000ff00U) ^
10835a913ee7SJerome Forissier (T3[(state[3] >> 24) & 0xff] & 0x000000ffU) ^
10845a913ee7SJerome Forissier roundKey[R][0];
10855a913ee7SJerome Forissier inter[1] =
10865a913ee7SJerome Forissier (T0[(state[0] >> 16) & 0xff] & 0xff000000U) ^
10875a913ee7SJerome Forissier (T1[(state[1] >> 16) & 0xff] & 0x00ff0000U) ^
10885a913ee7SJerome Forissier (T2[(state[2] >> 16) & 0xff] & 0x0000ff00U) ^
10895a913ee7SJerome Forissier (T3[(state[3] >> 16) & 0xff] & 0x000000ffU) ^
10905a913ee7SJerome Forissier roundKey[R][1];
10915a913ee7SJerome Forissier inter[2] =
10925a913ee7SJerome Forissier (T0[(state[0] >> 8) & 0xff] & 0xff000000U) ^
10935a913ee7SJerome Forissier (T1[(state[1] >> 8) & 0xff] & 0x00ff0000U) ^
10945a913ee7SJerome Forissier (T2[(state[2] >> 8) & 0xff] & 0x0000ff00U) ^
10955a913ee7SJerome Forissier (T3[(state[3] >> 8) & 0xff] & 0x000000ffU) ^
10965a913ee7SJerome Forissier roundKey[R][2];
10975a913ee7SJerome Forissier inter[3] =
10985a913ee7SJerome Forissier (T0[(state[0] ) & 0xff] & 0xff000000U) ^
10995a913ee7SJerome Forissier (T1[(state[1] ) & 0xff] & 0x00ff0000U) ^
11005a913ee7SJerome Forissier (T2[(state[2] ) & 0xff] & 0x0000ff00U) ^
11015a913ee7SJerome Forissier (T3[(state[3] ) & 0xff] & 0x000000ffU) ^
11025a913ee7SJerome Forissier roundKey[R][3];
11035a913ee7SJerome Forissier
11045a913ee7SJerome Forissier /*
11055a913ee7SJerome Forissier * map cipher state to ciphertext block (mu^{-1}):
11065a913ee7SJerome Forissier */
11075a913ee7SJerome Forissier for (i = 0, pos = 0; i < 4; i++, pos += 4) {
11085a913ee7SJerome Forissier ulong32 w = inter[i];
11095a913ee7SJerome Forissier ciphertext[pos ] = (unsigned char)(w >> 24);
11105a913ee7SJerome Forissier ciphertext[pos + 1] = (unsigned char)(w >> 16);
11115a913ee7SJerome Forissier ciphertext[pos + 2] = (unsigned char)(w >> 8);
11125a913ee7SJerome Forissier ciphertext[pos + 3] = (unsigned char)(w );
11135a913ee7SJerome Forissier }
11145a913ee7SJerome Forissier }
11155a913ee7SJerome Forissier
11165a913ee7SJerome Forissier /**
11175a913ee7SJerome Forissier Encrypts a block of text with Anubis
11185a913ee7SJerome Forissier @param pt The input plaintext (16 bytes)
11195a913ee7SJerome Forissier @param ct The output ciphertext (16 bytes)
11205a913ee7SJerome Forissier @param skey The key as scheduled
11215a913ee7SJerome Forissier @return CRYPT_OK if successful
11225a913ee7SJerome Forissier */
anubis_ecb_encrypt(const unsigned char * pt,unsigned char * ct,const symmetric_key * skey)11235a913ee7SJerome Forissier int anubis_ecb_encrypt(const unsigned char *pt, unsigned char *ct, const symmetric_key *skey)
11245a913ee7SJerome Forissier {
11255a913ee7SJerome Forissier LTC_ARGCHK(pt != NULL);
11265a913ee7SJerome Forissier LTC_ARGCHK(ct != NULL);
11275a913ee7SJerome Forissier LTC_ARGCHK(skey != NULL);
1128*8411e6adSJerome Forissier
1129*8411e6adSJerome Forissier if (skey->anubis.R < 12 || skey->anubis.R > 18) {
1130*8411e6adSJerome Forissier return CRYPT_INVALID_ROUNDS;
1131*8411e6adSJerome Forissier }
1132*8411e6adSJerome Forissier
11335a913ee7SJerome Forissier anubis_crypt(pt, ct, skey->anubis.roundKeyEnc, skey->anubis.R);
11345a913ee7SJerome Forissier return CRYPT_OK;
11355a913ee7SJerome Forissier }
11365a913ee7SJerome Forissier
11375a913ee7SJerome Forissier /**
11385a913ee7SJerome Forissier Decrypts a block of text with Anubis
11395a913ee7SJerome Forissier @param ct The input ciphertext (16 bytes)
11405a913ee7SJerome Forissier @param pt The output plaintext (16 bytes)
11415a913ee7SJerome Forissier @param skey The key as scheduled
11425a913ee7SJerome Forissier @return CRYPT_OK if successful
11435a913ee7SJerome Forissier */
anubis_ecb_decrypt(const unsigned char * ct,unsigned char * pt,const symmetric_key * skey)11445a913ee7SJerome Forissier int anubis_ecb_decrypt(const unsigned char *ct, unsigned char *pt, const symmetric_key *skey)
11455a913ee7SJerome Forissier {
11465a913ee7SJerome Forissier LTC_ARGCHK(pt != NULL);
11475a913ee7SJerome Forissier LTC_ARGCHK(ct != NULL);
11485a913ee7SJerome Forissier LTC_ARGCHK(skey != NULL);
1149*8411e6adSJerome Forissier
1150*8411e6adSJerome Forissier if (skey->anubis.R < 12 || skey->anubis.R > 18) {
1151*8411e6adSJerome Forissier return CRYPT_INVALID_ROUNDS;
1152*8411e6adSJerome Forissier }
1153*8411e6adSJerome Forissier
11545a913ee7SJerome Forissier anubis_crypt(ct, pt, skey->anubis.roundKeyDec, skey->anubis.R);
11555a913ee7SJerome Forissier return CRYPT_OK;
11565a913ee7SJerome Forissier }
11575a913ee7SJerome Forissier
11585a913ee7SJerome Forissier /**
11595a913ee7SJerome Forissier Performs a self-test of the Anubis block cipher
11605a913ee7SJerome Forissier @return CRYPT_OK if functional, CRYPT_NOP if self-test has been disabled
11615a913ee7SJerome Forissier */
anubis_test(void)11625a913ee7SJerome Forissier int anubis_test(void)
11635a913ee7SJerome Forissier {
11645a913ee7SJerome Forissier #if !defined(LTC_TEST)
11655a913ee7SJerome Forissier return CRYPT_NOP;
11665a913ee7SJerome Forissier #else
11675a913ee7SJerome Forissier static const struct test {
11685a913ee7SJerome Forissier int keylen;
11695a913ee7SJerome Forissier unsigned char pt[16], ct[16], key[40];
11705a913ee7SJerome Forissier } tests[] = {
11715a913ee7SJerome Forissier #ifndef LTC_ANUBIS_TWEAK
11725a913ee7SJerome Forissier /**** ORIGINAL LTC_ANUBIS ****/
11735a913ee7SJerome Forissier /* 128 bit keys */
11745a913ee7SJerome Forissier {
11755a913ee7SJerome Forissier 16,
11765a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
11775a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
11785a913ee7SJerome Forissier { 0xF0, 0x68, 0x60, 0xFC, 0x67, 0x30, 0xE8, 0x18,
11795a913ee7SJerome Forissier 0xF1, 0x32, 0xC7, 0x8A, 0xF4, 0x13, 0x2A, 0xFE },
11805a913ee7SJerome Forissier { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
11815a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
11825a913ee7SJerome Forissier }, {
11835a913ee7SJerome Forissier 16,
11845a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
11855a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
11865a913ee7SJerome Forissier { 0xA8, 0x66, 0x84, 0x80, 0x07, 0x74, 0x5C, 0x89,
11875a913ee7SJerome Forissier 0xFC, 0x5E, 0xB5, 0xBA, 0xD4, 0xFE, 0x32, 0x6D },
11885a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
11895a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }
11905a913ee7SJerome Forissier },
11915a913ee7SJerome Forissier
11925a913ee7SJerome Forissier /* 160-bit keys */
11935a913ee7SJerome Forissier {
11945a913ee7SJerome Forissier 20,
11955a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
11965a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
11975a913ee7SJerome Forissier { 0xBD, 0x5E, 0x32, 0xBE, 0x51, 0x67, 0xA8, 0xE2,
11985a913ee7SJerome Forissier 0x72, 0xD7, 0x95, 0x0F, 0x83, 0xC6, 0x8C, 0x31 },
11995a913ee7SJerome Forissier { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12005a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12015a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00 }
12025a913ee7SJerome Forissier }, {
12035a913ee7SJerome Forissier 20,
12045a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12055a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
12065a913ee7SJerome Forissier { 0x4C, 0x1F, 0x86, 0x2E, 0x11, 0xEB, 0xCE, 0xEB,
12075a913ee7SJerome Forissier 0xFE, 0xB9, 0x73, 0xC9, 0xDF, 0xEF, 0x7A, 0xDB },
12085a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12095a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12105a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x01 }
12115a913ee7SJerome Forissier },
12125a913ee7SJerome Forissier
12135a913ee7SJerome Forissier /* 192-bit keys */
12145a913ee7SJerome Forissier {
12155a913ee7SJerome Forissier 24,
12165a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12175a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
12185a913ee7SJerome Forissier { 0x17, 0xAC, 0x57, 0x44, 0x9D, 0x59, 0x61, 0x66,
12195a913ee7SJerome Forissier 0xD0, 0xC7, 0x9E, 0x04, 0x7C, 0xC7, 0x58, 0xF0 },
12205a913ee7SJerome Forissier { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12215a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12225a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
12235a913ee7SJerome Forissier }, {
12245a913ee7SJerome Forissier 24,
12255a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12265a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
12275a913ee7SJerome Forissier { 0x71, 0x52, 0xB4, 0xEB, 0x1D, 0xAA, 0x36, 0xFD,
12285a913ee7SJerome Forissier 0x57, 0x14, 0x5F, 0x57, 0x04, 0x9F, 0x70, 0x74 },
12295a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12305a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12315a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }
12325a913ee7SJerome Forissier },
12335a913ee7SJerome Forissier
12345a913ee7SJerome Forissier /* 224-bit keys */
12355a913ee7SJerome Forissier {
12365a913ee7SJerome Forissier 28,
12375a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12385a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
12395a913ee7SJerome Forissier { 0xA2, 0xF0, 0xA6, 0xB9, 0x17, 0x93, 0x2A, 0x3B,
12405a913ee7SJerome Forissier 0xEF, 0x08, 0xE8, 0x7A, 0x58, 0xD6, 0xF8, 0x53 },
12415a913ee7SJerome Forissier { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12425a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12435a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12445a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00 }
12455a913ee7SJerome Forissier }, {
12465a913ee7SJerome Forissier 28,
12475a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12485a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
12495a913ee7SJerome Forissier { 0xF0, 0xCA, 0xFC, 0x78, 0x8B, 0x4B, 0x4E, 0x53,
12505a913ee7SJerome Forissier 0x8B, 0xC4, 0x32, 0x6A, 0xF5, 0xB9, 0x1B, 0x5F },
12515a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12525a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12535a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12545a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x01 }
12555a913ee7SJerome Forissier },
12565a913ee7SJerome Forissier
12575a913ee7SJerome Forissier /* 256-bit keys */
12585a913ee7SJerome Forissier {
12595a913ee7SJerome Forissier 32,
12605a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12615a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
12625a913ee7SJerome Forissier { 0xE0, 0x86, 0xAC, 0x45, 0x6B, 0x3C, 0xE5, 0x13,
12635a913ee7SJerome Forissier 0xED, 0xF5, 0xDF, 0xDD, 0xD6, 0x3B, 0x71, 0x93 },
12645a913ee7SJerome Forissier { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12655a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12665a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12675a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
12685a913ee7SJerome Forissier }, {
12695a913ee7SJerome Forissier 32,
12705a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12715a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
12725a913ee7SJerome Forissier { 0x50, 0x01, 0xB9, 0xF5, 0x21, 0xC1, 0xC1, 0x29,
12735a913ee7SJerome Forissier 0x00, 0xD5, 0xEC, 0x98, 0x2B, 0x9E, 0xE8, 0x21 },
12745a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12755a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12765a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12775a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }
12785a913ee7SJerome Forissier },
12795a913ee7SJerome Forissier
12805a913ee7SJerome Forissier /* 288-bit keys */
12815a913ee7SJerome Forissier {
12825a913ee7SJerome Forissier 36,
12835a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12845a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
12855a913ee7SJerome Forissier { 0xE8, 0xF4, 0xAF, 0x2B, 0x21, 0xA0, 0x87, 0x9B,
12865a913ee7SJerome Forissier 0x41, 0x95, 0xB9, 0x71, 0x75, 0x79, 0x04, 0x7C },
12875a913ee7SJerome Forissier { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12885a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12895a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12905a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12915a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00 }
12925a913ee7SJerome Forissier }, {
12935a913ee7SJerome Forissier 36,
12945a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12955a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
12965a913ee7SJerome Forissier { 0xE6, 0xA6, 0xA5, 0xBC, 0x8B, 0x63, 0x6F, 0xE2,
12975a913ee7SJerome Forissier 0xBD, 0xA7, 0xA7, 0x53, 0xAB, 0x40, 0x22, 0xE0 },
12985a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12995a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13005a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13015a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13025a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x01 }
13035a913ee7SJerome Forissier },
13045a913ee7SJerome Forissier
13055a913ee7SJerome Forissier /* 320-bit keys */
13065a913ee7SJerome Forissier {
13075a913ee7SJerome Forissier 40,
13085a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13095a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
13105a913ee7SJerome Forissier { 0x17, 0x04, 0xD7, 0x2C, 0xC6, 0x85, 0x76, 0x02,
13115a913ee7SJerome Forissier 0x4B, 0xCC, 0x39, 0x80, 0xD8, 0x22, 0xEA, 0xA4 },
13125a913ee7SJerome Forissier { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13135a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13145a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13155a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13165a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
13175a913ee7SJerome Forissier }, {
13185a913ee7SJerome Forissier 40,
13195a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13205a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
13215a913ee7SJerome Forissier { 0x7A, 0x41, 0xE6, 0x7D, 0x4F, 0xD8, 0x64, 0xF0,
13225a913ee7SJerome Forissier 0x44, 0xA8, 0x3C, 0x73, 0x81, 0x7E, 0x53, 0xD8 },
13235a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13245a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13255a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13265a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13275a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }
13285a913ee7SJerome Forissier }
13295a913ee7SJerome Forissier #else
13305a913ee7SJerome Forissier /**** Tweaked LTC_ANUBIS ****/
13315a913ee7SJerome Forissier /* 128 bit keys */
13325a913ee7SJerome Forissier {
13335a913ee7SJerome Forissier 16,
13345a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13355a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
13365a913ee7SJerome Forissier { 0xB8, 0x35, 0xBD, 0xC3, 0x34, 0x82, 0x9D, 0x83,
13375a913ee7SJerome Forissier 0x71, 0xBF, 0xA3, 0x71, 0xE4, 0xB3, 0xC4, 0xFD },
13385a913ee7SJerome Forissier { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13395a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
13405a913ee7SJerome Forissier }, {
13415a913ee7SJerome Forissier 16,
13425a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13435a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
13445a913ee7SJerome Forissier { 0xE6, 0x14, 0x1E, 0xAF, 0xEB, 0xE0, 0x59, 0x3C,
13455a913ee7SJerome Forissier 0x48, 0xE1, 0xCD, 0xF2, 0x1B, 0xBA, 0xA1, 0x89 },
13465a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13475a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }
13485a913ee7SJerome Forissier },
13495a913ee7SJerome Forissier
13505a913ee7SJerome Forissier /* 160-bit keys */
13515a913ee7SJerome Forissier {
13525a913ee7SJerome Forissier 20,
13535a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13545a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
13555a913ee7SJerome Forissier { 0x97, 0x59, 0x79, 0x4B, 0x5C, 0xA0, 0x70, 0x73,
13565a913ee7SJerome Forissier 0x24, 0xEF, 0xB3, 0x58, 0x67, 0xCA, 0xD4, 0xB3 },
13575a913ee7SJerome Forissier { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13585a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13595a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00 }
13605a913ee7SJerome Forissier }, {
13615a913ee7SJerome Forissier 20,
13625a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13635a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
13645a913ee7SJerome Forissier { 0xB8, 0x0D, 0xFB, 0x9B, 0xE4, 0xA1, 0x58, 0x87,
13655a913ee7SJerome Forissier 0xB3, 0x76, 0xD5, 0x02, 0x18, 0x95, 0xC1, 0x2E },
13665a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13675a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13685a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x01 }
13695a913ee7SJerome Forissier },
13705a913ee7SJerome Forissier
13715a913ee7SJerome Forissier /* 192-bit keys */
13725a913ee7SJerome Forissier {
13735a913ee7SJerome Forissier 24,
13745a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13755a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
13765a913ee7SJerome Forissier { 0x7D, 0x62, 0x3B, 0x52, 0xC7, 0x4C, 0x64, 0xD8,
13775a913ee7SJerome Forissier 0xEB, 0xC7, 0x2D, 0x57, 0x97, 0x85, 0x43, 0x8F },
13785a913ee7SJerome Forissier { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13795a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13805a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
13815a913ee7SJerome Forissier }, {
13825a913ee7SJerome Forissier 24,
13835a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13845a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
13855a913ee7SJerome Forissier { 0xB1, 0x0A, 0x59, 0xDD, 0x5D, 0x5D, 0x8D, 0x67,
13865a913ee7SJerome Forissier 0xEC, 0xEE, 0x4A, 0xC4, 0xBE, 0x4F, 0xA8, 0x4F },
13875a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13885a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13895a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }
13905a913ee7SJerome Forissier },
13915a913ee7SJerome Forissier
13925a913ee7SJerome Forissier /* 224-bit keys */
13935a913ee7SJerome Forissier {
13945a913ee7SJerome Forissier 28,
13955a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13965a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
13975a913ee7SJerome Forissier { 0x68, 0x9E, 0x05, 0x94, 0x6A, 0x94, 0x43, 0x8F,
13985a913ee7SJerome Forissier 0xE7, 0x8E, 0x37, 0x3D, 0x24, 0x97, 0x92, 0xF5 },
13995a913ee7SJerome Forissier { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14005a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14015a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14025a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00 }
14035a913ee7SJerome Forissier }, {
14045a913ee7SJerome Forissier 28,
14055a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14065a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
14075a913ee7SJerome Forissier { 0xDD, 0xB7, 0xB0, 0xB4, 0xE9, 0xB4, 0x9B, 0x9C,
14085a913ee7SJerome Forissier 0x38, 0x20, 0x25, 0x0B, 0x47, 0xC2, 0x1F, 0x89 },
14095a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14105a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14115a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14125a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x01 }
14135a913ee7SJerome Forissier },
14145a913ee7SJerome Forissier
14155a913ee7SJerome Forissier /* 256-bit keys */
14165a913ee7SJerome Forissier {
14175a913ee7SJerome Forissier 32,
14185a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14195a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
14205a913ee7SJerome Forissier { 0x96, 0x00, 0xF0, 0x76, 0x91, 0x69, 0x29, 0x87,
14215a913ee7SJerome Forissier 0xF5, 0xE5, 0x97, 0xDB, 0xDB, 0xAF, 0x1B, 0x0A },
14225a913ee7SJerome Forissier { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14235a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14245a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14255a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
14265a913ee7SJerome Forissier }, {
14275a913ee7SJerome Forissier 32,
14285a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14295a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
14305a913ee7SJerome Forissier { 0x69, 0x9C, 0xAF, 0xDD, 0x94, 0xC7, 0xBC, 0x60,
14315a913ee7SJerome Forissier 0x44, 0xFE, 0x02, 0x05, 0x8A, 0x6E, 0xEF, 0xBD },
14325a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14335a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14345a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14355a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }
14365a913ee7SJerome Forissier },
14375a913ee7SJerome Forissier
14385a913ee7SJerome Forissier /* 288-bit keys */
14395a913ee7SJerome Forissier {
14405a913ee7SJerome Forissier 36,
14415a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14425a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
14435a913ee7SJerome Forissier { 0x0F, 0xC7, 0xA2, 0xC0, 0x11, 0x17, 0xAC, 0x43,
14445a913ee7SJerome Forissier 0x52, 0x5E, 0xDF, 0x6C, 0xF3, 0x96, 0x33, 0x6C },
14455a913ee7SJerome Forissier { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14465a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14475a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14485a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14495a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00 }
14505a913ee7SJerome Forissier }, {
14515a913ee7SJerome Forissier 36,
14525a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14535a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
14545a913ee7SJerome Forissier { 0xAD, 0x08, 0x4F, 0xED, 0x55, 0xA6, 0x94, 0x3E,
14555a913ee7SJerome Forissier 0x7E, 0x5E, 0xED, 0x05, 0xA1, 0x9D, 0x41, 0xB4 },
14565a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14575a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14585a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14595a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14605a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x01 }
14615a913ee7SJerome Forissier },
14625a913ee7SJerome Forissier
14635a913ee7SJerome Forissier /* 320-bit keys */
14645a913ee7SJerome Forissier {
14655a913ee7SJerome Forissier 40,
14665a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14675a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
14685a913ee7SJerome Forissier { 0xFE, 0xE2, 0x0E, 0x2A, 0x9D, 0xC5, 0x83, 0xBA,
14695a913ee7SJerome Forissier 0xA3, 0xA6, 0xD6, 0xA6, 0xF2, 0xE8, 0x06, 0xA5 },
14705a913ee7SJerome Forissier { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14715a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14725a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14735a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14745a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
14755a913ee7SJerome Forissier }, {
14765a913ee7SJerome Forissier 40,
14775a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14785a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
14795a913ee7SJerome Forissier { 0x86, 0x3D, 0xCC, 0x4A, 0x60, 0x34, 0x9C, 0x28,
14805a913ee7SJerome Forissier 0xA7, 0xDA, 0xA4, 0x3B, 0x0A, 0xD7, 0xFD, 0xC7 },
14815a913ee7SJerome Forissier { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14825a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14835a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14845a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14855a913ee7SJerome Forissier 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }
14865a913ee7SJerome Forissier }
14875a913ee7SJerome Forissier #endif
14885a913ee7SJerome Forissier };
14895a913ee7SJerome Forissier int x, y;
14905a913ee7SJerome Forissier unsigned char buf[2][16];
14915a913ee7SJerome Forissier symmetric_key skey;
14925a913ee7SJerome Forissier
14935a913ee7SJerome Forissier for (x = 0; x < (int)(sizeof(tests)/sizeof(tests[0])); x++) {
14945a913ee7SJerome Forissier anubis_setup(tests[x].key, tests[x].keylen, 0, &skey);
14955a913ee7SJerome Forissier anubis_ecb_encrypt(tests[x].pt, buf[0], &skey);
14965a913ee7SJerome Forissier anubis_ecb_decrypt(buf[0], buf[1], &skey);
14975a913ee7SJerome Forissier if (compare_testvector(buf[0], 16, tests[x].ct, 16, "Anubis Encrypt", x) ||
14985a913ee7SJerome Forissier compare_testvector(buf[1], 16, tests[x].pt, 16, "Anubis Decrypt", x)) {
14995a913ee7SJerome Forissier return CRYPT_FAIL_TESTVECTOR;
15005a913ee7SJerome Forissier }
15015a913ee7SJerome Forissier
15025a913ee7SJerome Forissier for (y = 0; y < 1000; y++) anubis_ecb_encrypt(buf[0], buf[0], &skey);
15035a913ee7SJerome Forissier for (y = 0; y < 1000; y++) anubis_ecb_decrypt(buf[0], buf[0], &skey);
15045a913ee7SJerome Forissier if (compare_testvector(buf[0], 16, tests[x].ct, 16, "Anubis 1000", 1000)) {
15055a913ee7SJerome Forissier return CRYPT_FAIL_TESTVECTOR;
15065a913ee7SJerome Forissier }
15075a913ee7SJerome Forissier
15085a913ee7SJerome Forissier }
15095a913ee7SJerome Forissier return CRYPT_OK;
15105a913ee7SJerome Forissier #endif
15115a913ee7SJerome Forissier }
15125a913ee7SJerome Forissier
15135a913ee7SJerome Forissier /** Terminate the context
15145a913ee7SJerome Forissier @param skey The scheduled key
15155a913ee7SJerome Forissier */
anubis_done(symmetric_key * skey)15165a913ee7SJerome Forissier void anubis_done(symmetric_key *skey)
15175a913ee7SJerome Forissier {
15185a913ee7SJerome Forissier LTC_UNUSED_PARAM(skey);
15195a913ee7SJerome Forissier }
15205a913ee7SJerome Forissier
15215a913ee7SJerome Forissier /**
15225a913ee7SJerome Forissier Gets suitable key size
15235a913ee7SJerome Forissier @param keysize [in/out] The length of the recommended key (in bytes). This function will store the suitable size back in this variable.
15245a913ee7SJerome Forissier @return CRYPT_OK if the input key size is acceptable.
15255a913ee7SJerome Forissier */
anubis_keysize(int * keysize)15265a913ee7SJerome Forissier int anubis_keysize(int *keysize)
15275a913ee7SJerome Forissier {
15285a913ee7SJerome Forissier LTC_ARGCHK(keysize != NULL);
15295a913ee7SJerome Forissier if (*keysize >= 40) {
15305a913ee7SJerome Forissier *keysize = 40;
15315a913ee7SJerome Forissier } else if (*keysize >= 36) {
15325a913ee7SJerome Forissier *keysize = 36;
15335a913ee7SJerome Forissier } else if (*keysize >= 32) {
15345a913ee7SJerome Forissier *keysize = 32;
15355a913ee7SJerome Forissier } else if (*keysize >= 28) {
15365a913ee7SJerome Forissier *keysize = 28;
15375a913ee7SJerome Forissier } else if (*keysize >= 24) {
15385a913ee7SJerome Forissier *keysize = 24;
15395a913ee7SJerome Forissier } else if (*keysize >= 20) {
15405a913ee7SJerome Forissier *keysize = 20;
15415a913ee7SJerome Forissier } else if (*keysize >= 16) {
15425a913ee7SJerome Forissier *keysize = 16;
15435a913ee7SJerome Forissier } else {
15445a913ee7SJerome Forissier return CRYPT_INVALID_KEYSIZE;
15455a913ee7SJerome Forissier }
15465a913ee7SJerome Forissier return CRYPT_OK;
15475a913ee7SJerome Forissier }
15485a913ee7SJerome Forissier
15495a913ee7SJerome Forissier #endif
15505a913ee7SJerome Forissier
1551