anubis.c 67 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567
  1. /* LibTomCrypt, modular cryptographic library -- Tom St Denis */
  2. /* SPDX-License-Identifier: Unlicense */
  3. /**
  4. @file anubis.c
  5. Anubis implementation derived from public domain source
  6. Authors: Paulo S.L.M. Barreto and Vincent Rijmen.
  7. */
  8. #include "tomcrypt_private.h"
  9. #ifdef LTC_ANUBIS
  10. const struct ltc_cipher_descriptor anubis_desc = {
  11. "anubis",
  12. 19,
  13. 16, 40, 16, 12,
  14. &anubis_setup,
  15. &anubis_ecb_encrypt,
  16. &anubis_ecb_decrypt,
  17. &anubis_test,
  18. &anubis_done,
  19. &anubis_keysize,
  20. NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
  21. };
  22. #define MAX_N 10
  23. #define T0 anubis_T0
  24. #define T1 anubis_T1
  25. #define T2 anubis_T2
  26. #define T3 anubis_T3
  27. #define T4 anubis_T4
  28. #define T5 anubis_T5
  29. #define rc anubis_rc
  30. /*
  31. * Though Anubis is endianness-neutral, the encryption tables are listed
  32. * in BIG-ENDIAN format, which is adopted throughout this implementation
  33. * (but little-endian notation would be equally suitable if consistently
  34. * employed).
  35. */
  36. #if defined(LTC_ANUBIS_TWEAK)
  37. static const ulong32 T0[256] = {
  38. 0xba69d2bbU, 0x54a84de5U, 0x2f5ebce2U, 0x74e8cd25U,
  39. 0x53a651f7U, 0xd3bb6bd0U, 0xd2b96fd6U, 0x4d9a29b3U,
  40. 0x50a05dfdU, 0xac458acfU, 0x8d070e09U, 0xbf63c6a5U,
  41. 0x70e0dd3dU, 0x52a455f1U, 0x9a29527bU, 0x4c982db5U,
  42. 0xeac98f46U, 0xd5b773c4U, 0x97336655U, 0xd1bf63dcU,
  43. 0x3366ccaaU, 0x51a259fbU, 0x5bb671c7U, 0xa651a2f3U,
  44. 0xdea15ffeU, 0x48903dadU, 0xa84d9ad7U, 0x992f5e71U,
  45. 0xdbab4be0U, 0x3264c8acU, 0xb773e695U, 0xfce5d732U,
  46. 0xe3dbab70U, 0x9e214263U, 0x913f7e41U, 0x9b2b567dU,
  47. 0xe2d9af76U, 0xbb6bd6bdU, 0x4182199bU, 0x6edca579U,
  48. 0xa557aef9U, 0xcb8b0b80U, 0x6bd6b167U, 0x95376e59U,
  49. 0xa15fbee1U, 0xf3fbeb10U, 0xb17ffe81U, 0x0204080cU,
  50. 0xcc851792U, 0xc49537a2U, 0x1d3a744eU, 0x14285078U,
  51. 0xc39b2bb0U, 0x63c69157U, 0xdaa94fe6U, 0x5dba69d3U,
  52. 0x5fbe61dfU, 0xdca557f2U, 0x7dfae913U, 0xcd871394U,
  53. 0x7ffee11fU, 0x5ab475c1U, 0x6cd8ad75U, 0x5cb86dd5U,
  54. 0xf7f3fb08U, 0x264c98d4U, 0xffe3db38U, 0xedc79354U,
  55. 0xe8cd874aU, 0x9d274e69U, 0x6fdea17fU, 0x8e010203U,
  56. 0x19326456U, 0xa05dbae7U, 0xf0fde71aU, 0x890f1e11U,
  57. 0x0f1e3c22U, 0x070e1c12U, 0xaf4386c5U, 0xfbebcb20U,
  58. 0x08102030U, 0x152a547eU, 0x0d1a342eU, 0x04081018U,
  59. 0x01020406U, 0x64c88d45U, 0xdfa35bf8U, 0x76ecc529U,
  60. 0x79f2f90bU, 0xdda753f4U, 0x3d7af48eU, 0x162c5874U,
  61. 0x3f7efc82U, 0x376edcb2U, 0x6ddaa973U, 0x3870e090U,
  62. 0xb96fdeb1U, 0x73e6d137U, 0xe9cf834cU, 0x356ad4beU,
  63. 0x55aa49e3U, 0x71e2d93bU, 0x7bf6f107U, 0x8c050a0fU,
  64. 0x72e4d531U, 0x880d1a17U, 0xf6f1ff0eU, 0x2a54a8fcU,
  65. 0x3e7cf884U, 0x5ebc65d9U, 0x274e9cd2U, 0x468c0589U,
  66. 0x0c183028U, 0x65ca8943U, 0x68d0bd6dU, 0x61c2995bU,
  67. 0x03060c0aU, 0xc19f23bcU, 0x57ae41efU, 0xd6b17fceU,
  68. 0xd9af43ecU, 0x58b07dcdU, 0xd8ad47eaU, 0x66cc8549U,
  69. 0xd7b37bc8U, 0x3a74e89cU, 0xc88d078aU, 0x3c78f088U,
  70. 0xfae9cf26U, 0x96316253U, 0xa753a6f5U, 0x982d5a77U,
  71. 0xecc59752U, 0xb86ddab7U, 0xc7933ba8U, 0xae4182c3U,
  72. 0x69d2b96bU, 0x4b9631a7U, 0xab4b96ddU, 0xa94f9ed1U,
  73. 0x67ce814fU, 0x0a14283cU, 0x478e018fU, 0xf2f9ef16U,
  74. 0xb577ee99U, 0x224488ccU, 0xe5d7b364U, 0xeec19f5eU,
  75. 0xbe61c2a3U, 0x2b56acfaU, 0x811f3e21U, 0x1224486cU,
  76. 0x831b362dU, 0x1b366c5aU, 0x0e1c3824U, 0x23468ccaU,
  77. 0xf5f7f304U, 0x458a0983U, 0x214284c6U, 0xce811f9eU,
  78. 0x499239abU, 0x2c58b0e8U, 0xf9efc32cU, 0xe6d1bf6eU,
  79. 0xb671e293U, 0x2850a0f0U, 0x172e5c72U, 0x8219322bU,
  80. 0x1a34685cU, 0x8b0b161dU, 0xfee1df3eU, 0x8a09121bU,
  81. 0x09122436U, 0xc98f038cU, 0x87132635U, 0x4e9c25b9U,
  82. 0xe1dfa37cU, 0x2e5cb8e4U, 0xe4d5b762U, 0xe0dda77aU,
  83. 0xebcb8b40U, 0x903d7a47U, 0xa455aaffU, 0x1e3c7844U,
  84. 0x85172e39U, 0x60c09d5dU, 0x00000000U, 0x254a94deU,
  85. 0xf4f5f702U, 0xf1ffe31cU, 0x94356a5fU, 0x0b162c3aU,
  86. 0xe7d3bb68U, 0x75eac923U, 0xefc39b58U, 0x3468d0b8U,
  87. 0x3162c4a6U, 0xd4b577c2U, 0xd0bd67daU, 0x86112233U,
  88. 0x7efce519U, 0xad478ec9U, 0xfde7d334U, 0x2952a4f6U,
  89. 0x3060c0a0U, 0x3b76ec9aU, 0x9f234665U, 0xf8edc72aU,
  90. 0xc6913faeU, 0x13264c6aU, 0x060c1814U, 0x050a141eU,
  91. 0xc59733a4U, 0x11224466U, 0x77eec12fU, 0x7cf8ed15U,
  92. 0x7af4f501U, 0x78f0fd0dU, 0x366cd8b4U, 0x1c387048U,
  93. 0x3972e496U, 0x59b279cbU, 0x18306050U, 0x56ac45e9U,
  94. 0xb37bf68dU, 0xb07dfa87U, 0x244890d8U, 0x204080c0U,
  95. 0xb279f28bU, 0x9239724bU, 0xa35bb6edU, 0xc09d27baU,
  96. 0x44880d85U, 0x62c49551U, 0x10204060U, 0xb475ea9fU,
  97. 0x84152a3fU, 0x43861197U, 0x933b764dU, 0xc2992fb6U,
  98. 0x4a9435a1U, 0xbd67cea9U, 0x8f030605U, 0x2d5ab4eeU,
  99. 0xbc65caafU, 0x9c254a6fU, 0x6ad4b561U, 0x40801d9dU,
  100. 0xcf831b98U, 0xa259b2ebU, 0x801d3a27U, 0x4f9e21bfU,
  101. 0x1f3e7c42U, 0xca890f86U, 0xaa4992dbU, 0x42841591U,
  102. };
  103. static const ulong32 T1[256] = {
  104. 0x69babbd2U, 0xa854e54dU, 0x5e2fe2bcU, 0xe87425cdU,
  105. 0xa653f751U, 0xbbd3d06bU, 0xb9d2d66fU, 0x9a4db329U,
  106. 0xa050fd5dU, 0x45accf8aU, 0x078d090eU, 0x63bfa5c6U,
  107. 0xe0703dddU, 0xa452f155U, 0x299a7b52U, 0x984cb52dU,
  108. 0xc9ea468fU, 0xb7d5c473U, 0x33975566U, 0xbfd1dc63U,
  109. 0x6633aaccU, 0xa251fb59U, 0xb65bc771U, 0x51a6f3a2U,
  110. 0xa1defe5fU, 0x9048ad3dU, 0x4da8d79aU, 0x2f99715eU,
  111. 0xabdbe04bU, 0x6432acc8U, 0x73b795e6U, 0xe5fc32d7U,
  112. 0xdbe370abU, 0x219e6342U, 0x3f91417eU, 0x2b9b7d56U,
  113. 0xd9e276afU, 0x6bbbbdd6U, 0x82419b19U, 0xdc6e79a5U,
  114. 0x57a5f9aeU, 0x8bcb800bU, 0xd66b67b1U, 0x3795596eU,
  115. 0x5fa1e1beU, 0xfbf310ebU, 0x7fb181feU, 0x04020c08U,
  116. 0x85cc9217U, 0x95c4a237U, 0x3a1d4e74U, 0x28147850U,
  117. 0x9bc3b02bU, 0xc6635791U, 0xa9dae64fU, 0xba5dd369U,
  118. 0xbe5fdf61U, 0xa5dcf257U, 0xfa7d13e9U, 0x87cd9413U,
  119. 0xfe7f1fe1U, 0xb45ac175U, 0xd86c75adU, 0xb85cd56dU,
  120. 0xf3f708fbU, 0x4c26d498U, 0xe3ff38dbU, 0xc7ed5493U,
  121. 0xcde84a87U, 0x279d694eU, 0xde6f7fa1U, 0x018e0302U,
  122. 0x32195664U, 0x5da0e7baU, 0xfdf01ae7U, 0x0f89111eU,
  123. 0x1e0f223cU, 0x0e07121cU, 0x43afc586U, 0xebfb20cbU,
  124. 0x10083020U, 0x2a157e54U, 0x1a0d2e34U, 0x08041810U,
  125. 0x02010604U, 0xc864458dU, 0xa3dff85bU, 0xec7629c5U,
  126. 0xf2790bf9U, 0xa7ddf453U, 0x7a3d8ef4U, 0x2c167458U,
  127. 0x7e3f82fcU, 0x6e37b2dcU, 0xda6d73a9U, 0x703890e0U,
  128. 0x6fb9b1deU, 0xe67337d1U, 0xcfe94c83U, 0x6a35bed4U,
  129. 0xaa55e349U, 0xe2713bd9U, 0xf67b07f1U, 0x058c0f0aU,
  130. 0xe47231d5U, 0x0d88171aU, 0xf1f60effU, 0x542afca8U,
  131. 0x7c3e84f8U, 0xbc5ed965U, 0x4e27d29cU, 0x8c468905U,
  132. 0x180c2830U, 0xca654389U, 0xd0686dbdU, 0xc2615b99U,
  133. 0x06030a0cU, 0x9fc1bc23U, 0xae57ef41U, 0xb1d6ce7fU,
  134. 0xafd9ec43U, 0xb058cd7dU, 0xadd8ea47U, 0xcc664985U,
  135. 0xb3d7c87bU, 0x743a9ce8U, 0x8dc88a07U, 0x783c88f0U,
  136. 0xe9fa26cfU, 0x31965362U, 0x53a7f5a6U, 0x2d98775aU,
  137. 0xc5ec5297U, 0x6db8b7daU, 0x93c7a83bU, 0x41aec382U,
  138. 0xd2696bb9U, 0x964ba731U, 0x4babdd96U, 0x4fa9d19eU,
  139. 0xce674f81U, 0x140a3c28U, 0x8e478f01U, 0xf9f216efU,
  140. 0x77b599eeU, 0x4422cc88U, 0xd7e564b3U, 0xc1ee5e9fU,
  141. 0x61bea3c2U, 0x562bfaacU, 0x1f81213eU, 0x24126c48U,
  142. 0x1b832d36U, 0x361b5a6cU, 0x1c0e2438U, 0x4623ca8cU,
  143. 0xf7f504f3U, 0x8a458309U, 0x4221c684U, 0x81ce9e1fU,
  144. 0x9249ab39U, 0x582ce8b0U, 0xeff92cc3U, 0xd1e66ebfU,
  145. 0x71b693e2U, 0x5028f0a0U, 0x2e17725cU, 0x19822b32U,
  146. 0x341a5c68U, 0x0b8b1d16U, 0xe1fe3edfU, 0x098a1b12U,
  147. 0x12093624U, 0x8fc98c03U, 0x13873526U, 0x9c4eb925U,
  148. 0xdfe17ca3U, 0x5c2ee4b8U, 0xd5e462b7U, 0xdde07aa7U,
  149. 0xcbeb408bU, 0x3d90477aU, 0x55a4ffaaU, 0x3c1e4478U,
  150. 0x1785392eU, 0xc0605d9dU, 0x00000000U, 0x4a25de94U,
  151. 0xf5f402f7U, 0xfff11ce3U, 0x35945f6aU, 0x160b3a2cU,
  152. 0xd3e768bbU, 0xea7523c9U, 0xc3ef589bU, 0x6834b8d0U,
  153. 0x6231a6c4U, 0xb5d4c277U, 0xbdd0da67U, 0x11863322U,
  154. 0xfc7e19e5U, 0x47adc98eU, 0xe7fd34d3U, 0x5229f6a4U,
  155. 0x6030a0c0U, 0x763b9aecU, 0x239f6546U, 0xedf82ac7U,
  156. 0x91c6ae3fU, 0x26136a4cU, 0x0c061418U, 0x0a051e14U,
  157. 0x97c5a433U, 0x22116644U, 0xee772fc1U, 0xf87c15edU,
  158. 0xf47a01f5U, 0xf0780dfdU, 0x6c36b4d8U, 0x381c4870U,
  159. 0x723996e4U, 0xb259cb79U, 0x30185060U, 0xac56e945U,
  160. 0x7bb38df6U, 0x7db087faU, 0x4824d890U, 0x4020c080U,
  161. 0x79b28bf2U, 0x39924b72U, 0x5ba3edb6U, 0x9dc0ba27U,
  162. 0x8844850dU, 0xc4625195U, 0x20106040U, 0x75b49feaU,
  163. 0x15843f2aU, 0x86439711U, 0x3b934d76U, 0x99c2b62fU,
  164. 0x944aa135U, 0x67bda9ceU, 0x038f0506U, 0x5a2deeb4U,
  165. 0x65bcafcaU, 0x259c6f4aU, 0xd46a61b5U, 0x80409d1dU,
  166. 0x83cf981bU, 0x59a2ebb2U, 0x1d80273aU, 0x9e4fbf21U,
  167. 0x3e1f427cU, 0x89ca860fU, 0x49aadb92U, 0x84429115U,
  168. };
  169. static const ulong32 T2[256] = {
  170. 0xd2bbba69U, 0x4de554a8U, 0xbce22f5eU, 0xcd2574e8U,
  171. 0x51f753a6U, 0x6bd0d3bbU, 0x6fd6d2b9U, 0x29b34d9aU,
  172. 0x5dfd50a0U, 0x8acfac45U, 0x0e098d07U, 0xc6a5bf63U,
  173. 0xdd3d70e0U, 0x55f152a4U, 0x527b9a29U, 0x2db54c98U,
  174. 0x8f46eac9U, 0x73c4d5b7U, 0x66559733U, 0x63dcd1bfU,
  175. 0xccaa3366U, 0x59fb51a2U, 0x71c75bb6U, 0xa2f3a651U,
  176. 0x5ffedea1U, 0x3dad4890U, 0x9ad7a84dU, 0x5e71992fU,
  177. 0x4be0dbabU, 0xc8ac3264U, 0xe695b773U, 0xd732fce5U,
  178. 0xab70e3dbU, 0x42639e21U, 0x7e41913fU, 0x567d9b2bU,
  179. 0xaf76e2d9U, 0xd6bdbb6bU, 0x199b4182U, 0xa5796edcU,
  180. 0xaef9a557U, 0x0b80cb8bU, 0xb1676bd6U, 0x6e599537U,
  181. 0xbee1a15fU, 0xeb10f3fbU, 0xfe81b17fU, 0x080c0204U,
  182. 0x1792cc85U, 0x37a2c495U, 0x744e1d3aU, 0x50781428U,
  183. 0x2bb0c39bU, 0x915763c6U, 0x4fe6daa9U, 0x69d35dbaU,
  184. 0x61df5fbeU, 0x57f2dca5U, 0xe9137dfaU, 0x1394cd87U,
  185. 0xe11f7ffeU, 0x75c15ab4U, 0xad756cd8U, 0x6dd55cb8U,
  186. 0xfb08f7f3U, 0x98d4264cU, 0xdb38ffe3U, 0x9354edc7U,
  187. 0x874ae8cdU, 0x4e699d27U, 0xa17f6fdeU, 0x02038e01U,
  188. 0x64561932U, 0xbae7a05dU, 0xe71af0fdU, 0x1e11890fU,
  189. 0x3c220f1eU, 0x1c12070eU, 0x86c5af43U, 0xcb20fbebU,
  190. 0x20300810U, 0x547e152aU, 0x342e0d1aU, 0x10180408U,
  191. 0x04060102U, 0x8d4564c8U, 0x5bf8dfa3U, 0xc52976ecU,
  192. 0xf90b79f2U, 0x53f4dda7U, 0xf48e3d7aU, 0x5874162cU,
  193. 0xfc823f7eU, 0xdcb2376eU, 0xa9736ddaU, 0xe0903870U,
  194. 0xdeb1b96fU, 0xd13773e6U, 0x834ce9cfU, 0xd4be356aU,
  195. 0x49e355aaU, 0xd93b71e2U, 0xf1077bf6U, 0x0a0f8c05U,
  196. 0xd53172e4U, 0x1a17880dU, 0xff0ef6f1U, 0xa8fc2a54U,
  197. 0xf8843e7cU, 0x65d95ebcU, 0x9cd2274eU, 0x0589468cU,
  198. 0x30280c18U, 0x894365caU, 0xbd6d68d0U, 0x995b61c2U,
  199. 0x0c0a0306U, 0x23bcc19fU, 0x41ef57aeU, 0x7fced6b1U,
  200. 0x43ecd9afU, 0x7dcd58b0U, 0x47ead8adU, 0x854966ccU,
  201. 0x7bc8d7b3U, 0xe89c3a74U, 0x078ac88dU, 0xf0883c78U,
  202. 0xcf26fae9U, 0x62539631U, 0xa6f5a753U, 0x5a77982dU,
  203. 0x9752ecc5U, 0xdab7b86dU, 0x3ba8c793U, 0x82c3ae41U,
  204. 0xb96b69d2U, 0x31a74b96U, 0x96ddab4bU, 0x9ed1a94fU,
  205. 0x814f67ceU, 0x283c0a14U, 0x018f478eU, 0xef16f2f9U,
  206. 0xee99b577U, 0x88cc2244U, 0xb364e5d7U, 0x9f5eeec1U,
  207. 0xc2a3be61U, 0xacfa2b56U, 0x3e21811fU, 0x486c1224U,
  208. 0x362d831bU, 0x6c5a1b36U, 0x38240e1cU, 0x8cca2346U,
  209. 0xf304f5f7U, 0x0983458aU, 0x84c62142U, 0x1f9ece81U,
  210. 0x39ab4992U, 0xb0e82c58U, 0xc32cf9efU, 0xbf6ee6d1U,
  211. 0xe293b671U, 0xa0f02850U, 0x5c72172eU, 0x322b8219U,
  212. 0x685c1a34U, 0x161d8b0bU, 0xdf3efee1U, 0x121b8a09U,
  213. 0x24360912U, 0x038cc98fU, 0x26358713U, 0x25b94e9cU,
  214. 0xa37ce1dfU, 0xb8e42e5cU, 0xb762e4d5U, 0xa77ae0ddU,
  215. 0x8b40ebcbU, 0x7a47903dU, 0xaaffa455U, 0x78441e3cU,
  216. 0x2e398517U, 0x9d5d60c0U, 0x00000000U, 0x94de254aU,
  217. 0xf702f4f5U, 0xe31cf1ffU, 0x6a5f9435U, 0x2c3a0b16U,
  218. 0xbb68e7d3U, 0xc92375eaU, 0x9b58efc3U, 0xd0b83468U,
  219. 0xc4a63162U, 0x77c2d4b5U, 0x67dad0bdU, 0x22338611U,
  220. 0xe5197efcU, 0x8ec9ad47U, 0xd334fde7U, 0xa4f62952U,
  221. 0xc0a03060U, 0xec9a3b76U, 0x46659f23U, 0xc72af8edU,
  222. 0x3faec691U, 0x4c6a1326U, 0x1814060cU, 0x141e050aU,
  223. 0x33a4c597U, 0x44661122U, 0xc12f77eeU, 0xed157cf8U,
  224. 0xf5017af4U, 0xfd0d78f0U, 0xd8b4366cU, 0x70481c38U,
  225. 0xe4963972U, 0x79cb59b2U, 0x60501830U, 0x45e956acU,
  226. 0xf68db37bU, 0xfa87b07dU, 0x90d82448U, 0x80c02040U,
  227. 0xf28bb279U, 0x724b9239U, 0xb6eda35bU, 0x27bac09dU,
  228. 0x0d854488U, 0x955162c4U, 0x40601020U, 0xea9fb475U,
  229. 0x2a3f8415U, 0x11974386U, 0x764d933bU, 0x2fb6c299U,
  230. 0x35a14a94U, 0xcea9bd67U, 0x06058f03U, 0xb4ee2d5aU,
  231. 0xcaafbc65U, 0x4a6f9c25U, 0xb5616ad4U, 0x1d9d4080U,
  232. 0x1b98cf83U, 0xb2eba259U, 0x3a27801dU, 0x21bf4f9eU,
  233. 0x7c421f3eU, 0x0f86ca89U, 0x92dbaa49U, 0x15914284U,
  234. };
  235. static const ulong32 T3[256] = {
  236. 0xbbd269baU, 0xe54da854U, 0xe2bc5e2fU, 0x25cde874U,
  237. 0xf751a653U, 0xd06bbbd3U, 0xd66fb9d2U, 0xb3299a4dU,
  238. 0xfd5da050U, 0xcf8a45acU, 0x090e078dU, 0xa5c663bfU,
  239. 0x3ddde070U, 0xf155a452U, 0x7b52299aU, 0xb52d984cU,
  240. 0x468fc9eaU, 0xc473b7d5U, 0x55663397U, 0xdc63bfd1U,
  241. 0xaacc6633U, 0xfb59a251U, 0xc771b65bU, 0xf3a251a6U,
  242. 0xfe5fa1deU, 0xad3d9048U, 0xd79a4da8U, 0x715e2f99U,
  243. 0xe04babdbU, 0xacc86432U, 0x95e673b7U, 0x32d7e5fcU,
  244. 0x70abdbe3U, 0x6342219eU, 0x417e3f91U, 0x7d562b9bU,
  245. 0x76afd9e2U, 0xbdd66bbbU, 0x9b198241U, 0x79a5dc6eU,
  246. 0xf9ae57a5U, 0x800b8bcbU, 0x67b1d66bU, 0x596e3795U,
  247. 0xe1be5fa1U, 0x10ebfbf3U, 0x81fe7fb1U, 0x0c080402U,
  248. 0x921785ccU, 0xa23795c4U, 0x4e743a1dU, 0x78502814U,
  249. 0xb02b9bc3U, 0x5791c663U, 0xe64fa9daU, 0xd369ba5dU,
  250. 0xdf61be5fU, 0xf257a5dcU, 0x13e9fa7dU, 0x941387cdU,
  251. 0x1fe1fe7fU, 0xc175b45aU, 0x75add86cU, 0xd56db85cU,
  252. 0x08fbf3f7U, 0xd4984c26U, 0x38dbe3ffU, 0x5493c7edU,
  253. 0x4a87cde8U, 0x694e279dU, 0x7fa1de6fU, 0x0302018eU,
  254. 0x56643219U, 0xe7ba5da0U, 0x1ae7fdf0U, 0x111e0f89U,
  255. 0x223c1e0fU, 0x121c0e07U, 0xc58643afU, 0x20cbebfbU,
  256. 0x30201008U, 0x7e542a15U, 0x2e341a0dU, 0x18100804U,
  257. 0x06040201U, 0x458dc864U, 0xf85ba3dfU, 0x29c5ec76U,
  258. 0x0bf9f279U, 0xf453a7ddU, 0x8ef47a3dU, 0x74582c16U,
  259. 0x82fc7e3fU, 0xb2dc6e37U, 0x73a9da6dU, 0x90e07038U,
  260. 0xb1de6fb9U, 0x37d1e673U, 0x4c83cfe9U, 0xbed46a35U,
  261. 0xe349aa55U, 0x3bd9e271U, 0x07f1f67bU, 0x0f0a058cU,
  262. 0x31d5e472U, 0x171a0d88U, 0x0efff1f6U, 0xfca8542aU,
  263. 0x84f87c3eU, 0xd965bc5eU, 0xd29c4e27U, 0x89058c46U,
  264. 0x2830180cU, 0x4389ca65U, 0x6dbdd068U, 0x5b99c261U,
  265. 0x0a0c0603U, 0xbc239fc1U, 0xef41ae57U, 0xce7fb1d6U,
  266. 0xec43afd9U, 0xcd7db058U, 0xea47add8U, 0x4985cc66U,
  267. 0xc87bb3d7U, 0x9ce8743aU, 0x8a078dc8U, 0x88f0783cU,
  268. 0x26cfe9faU, 0x53623196U, 0xf5a653a7U, 0x775a2d98U,
  269. 0x5297c5ecU, 0xb7da6db8U, 0xa83b93c7U, 0xc38241aeU,
  270. 0x6bb9d269U, 0xa731964bU, 0xdd964babU, 0xd19e4fa9U,
  271. 0x4f81ce67U, 0x3c28140aU, 0x8f018e47U, 0x16eff9f2U,
  272. 0x99ee77b5U, 0xcc884422U, 0x64b3d7e5U, 0x5e9fc1eeU,
  273. 0xa3c261beU, 0xfaac562bU, 0x213e1f81U, 0x6c482412U,
  274. 0x2d361b83U, 0x5a6c361bU, 0x24381c0eU, 0xca8c4623U,
  275. 0x04f3f7f5U, 0x83098a45U, 0xc6844221U, 0x9e1f81ceU,
  276. 0xab399249U, 0xe8b0582cU, 0x2cc3eff9U, 0x6ebfd1e6U,
  277. 0x93e271b6U, 0xf0a05028U, 0x725c2e17U, 0x2b321982U,
  278. 0x5c68341aU, 0x1d160b8bU, 0x3edfe1feU, 0x1b12098aU,
  279. 0x36241209U, 0x8c038fc9U, 0x35261387U, 0xb9259c4eU,
  280. 0x7ca3dfe1U, 0xe4b85c2eU, 0x62b7d5e4U, 0x7aa7dde0U,
  281. 0x408bcbebU, 0x477a3d90U, 0xffaa55a4U, 0x44783c1eU,
  282. 0x392e1785U, 0x5d9dc060U, 0x00000000U, 0xde944a25U,
  283. 0x02f7f5f4U, 0x1ce3fff1U, 0x5f6a3594U, 0x3a2c160bU,
  284. 0x68bbd3e7U, 0x23c9ea75U, 0x589bc3efU, 0xb8d06834U,
  285. 0xa6c46231U, 0xc277b5d4U, 0xda67bdd0U, 0x33221186U,
  286. 0x19e5fc7eU, 0xc98e47adU, 0x34d3e7fdU, 0xf6a45229U,
  287. 0xa0c06030U, 0x9aec763bU, 0x6546239fU, 0x2ac7edf8U,
  288. 0xae3f91c6U, 0x6a4c2613U, 0x14180c06U, 0x1e140a05U,
  289. 0xa43397c5U, 0x66442211U, 0x2fc1ee77U, 0x15edf87cU,
  290. 0x01f5f47aU, 0x0dfdf078U, 0xb4d86c36U, 0x4870381cU,
  291. 0x96e47239U, 0xcb79b259U, 0x50603018U, 0xe945ac56U,
  292. 0x8df67bb3U, 0x87fa7db0U, 0xd8904824U, 0xc0804020U,
  293. 0x8bf279b2U, 0x4b723992U, 0xedb65ba3U, 0xba279dc0U,
  294. 0x850d8844U, 0x5195c462U, 0x60402010U, 0x9fea75b4U,
  295. 0x3f2a1584U, 0x97118643U, 0x4d763b93U, 0xb62f99c2U,
  296. 0xa135944aU, 0xa9ce67bdU, 0x0506038fU, 0xeeb45a2dU,
  297. 0xafca65bcU, 0x6f4a259cU, 0x61b5d46aU, 0x9d1d8040U,
  298. 0x981b83cfU, 0xebb259a2U, 0x273a1d80U, 0xbf219e4fU,
  299. 0x427c3e1fU, 0x860f89caU, 0xdb9249aaU, 0x91158442U,
  300. };
  301. static const ulong32 T4[256] = {
  302. 0xbabababaU, 0x54545454U, 0x2f2f2f2fU, 0x74747474U,
  303. 0x53535353U, 0xd3d3d3d3U, 0xd2d2d2d2U, 0x4d4d4d4dU,
  304. 0x50505050U, 0xacacacacU, 0x8d8d8d8dU, 0xbfbfbfbfU,
  305. 0x70707070U, 0x52525252U, 0x9a9a9a9aU, 0x4c4c4c4cU,
  306. 0xeaeaeaeaU, 0xd5d5d5d5U, 0x97979797U, 0xd1d1d1d1U,
  307. 0x33333333U, 0x51515151U, 0x5b5b5b5bU, 0xa6a6a6a6U,
  308. 0xdedededeU, 0x48484848U, 0xa8a8a8a8U, 0x99999999U,
  309. 0xdbdbdbdbU, 0x32323232U, 0xb7b7b7b7U, 0xfcfcfcfcU,
  310. 0xe3e3e3e3U, 0x9e9e9e9eU, 0x91919191U, 0x9b9b9b9bU,
  311. 0xe2e2e2e2U, 0xbbbbbbbbU, 0x41414141U, 0x6e6e6e6eU,
  312. 0xa5a5a5a5U, 0xcbcbcbcbU, 0x6b6b6b6bU, 0x95959595U,
  313. 0xa1a1a1a1U, 0xf3f3f3f3U, 0xb1b1b1b1U, 0x02020202U,
  314. 0xccccccccU, 0xc4c4c4c4U, 0x1d1d1d1dU, 0x14141414U,
  315. 0xc3c3c3c3U, 0x63636363U, 0xdadadadaU, 0x5d5d5d5dU,
  316. 0x5f5f5f5fU, 0xdcdcdcdcU, 0x7d7d7d7dU, 0xcdcdcdcdU,
  317. 0x7f7f7f7fU, 0x5a5a5a5aU, 0x6c6c6c6cU, 0x5c5c5c5cU,
  318. 0xf7f7f7f7U, 0x26262626U, 0xffffffffU, 0xededededU,
  319. 0xe8e8e8e8U, 0x9d9d9d9dU, 0x6f6f6f6fU, 0x8e8e8e8eU,
  320. 0x19191919U, 0xa0a0a0a0U, 0xf0f0f0f0U, 0x89898989U,
  321. 0x0f0f0f0fU, 0x07070707U, 0xafafafafU, 0xfbfbfbfbU,
  322. 0x08080808U, 0x15151515U, 0x0d0d0d0dU, 0x04040404U,
  323. 0x01010101U, 0x64646464U, 0xdfdfdfdfU, 0x76767676U,
  324. 0x79797979U, 0xddddddddU, 0x3d3d3d3dU, 0x16161616U,
  325. 0x3f3f3f3fU, 0x37373737U, 0x6d6d6d6dU, 0x38383838U,
  326. 0xb9b9b9b9U, 0x73737373U, 0xe9e9e9e9U, 0x35353535U,
  327. 0x55555555U, 0x71717171U, 0x7b7b7b7bU, 0x8c8c8c8cU,
  328. 0x72727272U, 0x88888888U, 0xf6f6f6f6U, 0x2a2a2a2aU,
  329. 0x3e3e3e3eU, 0x5e5e5e5eU, 0x27272727U, 0x46464646U,
  330. 0x0c0c0c0cU, 0x65656565U, 0x68686868U, 0x61616161U,
  331. 0x03030303U, 0xc1c1c1c1U, 0x57575757U, 0xd6d6d6d6U,
  332. 0xd9d9d9d9U, 0x58585858U, 0xd8d8d8d8U, 0x66666666U,
  333. 0xd7d7d7d7U, 0x3a3a3a3aU, 0xc8c8c8c8U, 0x3c3c3c3cU,
  334. 0xfafafafaU, 0x96969696U, 0xa7a7a7a7U, 0x98989898U,
  335. 0xececececU, 0xb8b8b8b8U, 0xc7c7c7c7U, 0xaeaeaeaeU,
  336. 0x69696969U, 0x4b4b4b4bU, 0xababababU, 0xa9a9a9a9U,
  337. 0x67676767U, 0x0a0a0a0aU, 0x47474747U, 0xf2f2f2f2U,
  338. 0xb5b5b5b5U, 0x22222222U, 0xe5e5e5e5U, 0xeeeeeeeeU,
  339. 0xbebebebeU, 0x2b2b2b2bU, 0x81818181U, 0x12121212U,
  340. 0x83838383U, 0x1b1b1b1bU, 0x0e0e0e0eU, 0x23232323U,
  341. 0xf5f5f5f5U, 0x45454545U, 0x21212121U, 0xcecececeU,
  342. 0x49494949U, 0x2c2c2c2cU, 0xf9f9f9f9U, 0xe6e6e6e6U,
  343. 0xb6b6b6b6U, 0x28282828U, 0x17171717U, 0x82828282U,
  344. 0x1a1a1a1aU, 0x8b8b8b8bU, 0xfefefefeU, 0x8a8a8a8aU,
  345. 0x09090909U, 0xc9c9c9c9U, 0x87878787U, 0x4e4e4e4eU,
  346. 0xe1e1e1e1U, 0x2e2e2e2eU, 0xe4e4e4e4U, 0xe0e0e0e0U,
  347. 0xebebebebU, 0x90909090U, 0xa4a4a4a4U, 0x1e1e1e1eU,
  348. 0x85858585U, 0x60606060U, 0x00000000U, 0x25252525U,
  349. 0xf4f4f4f4U, 0xf1f1f1f1U, 0x94949494U, 0x0b0b0b0bU,
  350. 0xe7e7e7e7U, 0x75757575U, 0xefefefefU, 0x34343434U,
  351. 0x31313131U, 0xd4d4d4d4U, 0xd0d0d0d0U, 0x86868686U,
  352. 0x7e7e7e7eU, 0xadadadadU, 0xfdfdfdfdU, 0x29292929U,
  353. 0x30303030U, 0x3b3b3b3bU, 0x9f9f9f9fU, 0xf8f8f8f8U,
  354. 0xc6c6c6c6U, 0x13131313U, 0x06060606U, 0x05050505U,
  355. 0xc5c5c5c5U, 0x11111111U, 0x77777777U, 0x7c7c7c7cU,
  356. 0x7a7a7a7aU, 0x78787878U, 0x36363636U, 0x1c1c1c1cU,
  357. 0x39393939U, 0x59595959U, 0x18181818U, 0x56565656U,
  358. 0xb3b3b3b3U, 0xb0b0b0b0U, 0x24242424U, 0x20202020U,
  359. 0xb2b2b2b2U, 0x92929292U, 0xa3a3a3a3U, 0xc0c0c0c0U,
  360. 0x44444444U, 0x62626262U, 0x10101010U, 0xb4b4b4b4U,
  361. 0x84848484U, 0x43434343U, 0x93939393U, 0xc2c2c2c2U,
  362. 0x4a4a4a4aU, 0xbdbdbdbdU, 0x8f8f8f8fU, 0x2d2d2d2dU,
  363. 0xbcbcbcbcU, 0x9c9c9c9cU, 0x6a6a6a6aU, 0x40404040U,
  364. 0xcfcfcfcfU, 0xa2a2a2a2U, 0x80808080U, 0x4f4f4f4fU,
  365. 0x1f1f1f1fU, 0xcacacacaU, 0xaaaaaaaaU, 0x42424242U,
  366. };
  367. static const ulong32 T5[256] = {
  368. 0x00000000U, 0x01020608U, 0x02040c10U, 0x03060a18U,
  369. 0x04081820U, 0x050a1e28U, 0x060c1430U, 0x070e1238U,
  370. 0x08103040U, 0x09123648U, 0x0a143c50U, 0x0b163a58U,
  371. 0x0c182860U, 0x0d1a2e68U, 0x0e1c2470U, 0x0f1e2278U,
  372. 0x10206080U, 0x11226688U, 0x12246c90U, 0x13266a98U,
  373. 0x142878a0U, 0x152a7ea8U, 0x162c74b0U, 0x172e72b8U,
  374. 0x183050c0U, 0x193256c8U, 0x1a345cd0U, 0x1b365ad8U,
  375. 0x1c3848e0U, 0x1d3a4ee8U, 0x1e3c44f0U, 0x1f3e42f8U,
  376. 0x2040c01dU, 0x2142c615U, 0x2244cc0dU, 0x2346ca05U,
  377. 0x2448d83dU, 0x254ade35U, 0x264cd42dU, 0x274ed225U,
  378. 0x2850f05dU, 0x2952f655U, 0x2a54fc4dU, 0x2b56fa45U,
  379. 0x2c58e87dU, 0x2d5aee75U, 0x2e5ce46dU, 0x2f5ee265U,
  380. 0x3060a09dU, 0x3162a695U, 0x3264ac8dU, 0x3366aa85U,
  381. 0x3468b8bdU, 0x356abeb5U, 0x366cb4adU, 0x376eb2a5U,
  382. 0x387090ddU, 0x397296d5U, 0x3a749ccdU, 0x3b769ac5U,
  383. 0x3c7888fdU, 0x3d7a8ef5U, 0x3e7c84edU, 0x3f7e82e5U,
  384. 0x40809d3aU, 0x41829b32U, 0x4284912aU, 0x43869722U,
  385. 0x4488851aU, 0x458a8312U, 0x468c890aU, 0x478e8f02U,
  386. 0x4890ad7aU, 0x4992ab72U, 0x4a94a16aU, 0x4b96a762U,
  387. 0x4c98b55aU, 0x4d9ab352U, 0x4e9cb94aU, 0x4f9ebf42U,
  388. 0x50a0fdbaU, 0x51a2fbb2U, 0x52a4f1aaU, 0x53a6f7a2U,
  389. 0x54a8e59aU, 0x55aae392U, 0x56ace98aU, 0x57aeef82U,
  390. 0x58b0cdfaU, 0x59b2cbf2U, 0x5ab4c1eaU, 0x5bb6c7e2U,
  391. 0x5cb8d5daU, 0x5dbad3d2U, 0x5ebcd9caU, 0x5fbedfc2U,
  392. 0x60c05d27U, 0x61c25b2fU, 0x62c45137U, 0x63c6573fU,
  393. 0x64c84507U, 0x65ca430fU, 0x66cc4917U, 0x67ce4f1fU,
  394. 0x68d06d67U, 0x69d26b6fU, 0x6ad46177U, 0x6bd6677fU,
  395. 0x6cd87547U, 0x6dda734fU, 0x6edc7957U, 0x6fde7f5fU,
  396. 0x70e03da7U, 0x71e23bafU, 0x72e431b7U, 0x73e637bfU,
  397. 0x74e82587U, 0x75ea238fU, 0x76ec2997U, 0x77ee2f9fU,
  398. 0x78f00de7U, 0x79f20befU, 0x7af401f7U, 0x7bf607ffU,
  399. 0x7cf815c7U, 0x7dfa13cfU, 0x7efc19d7U, 0x7ffe1fdfU,
  400. 0x801d2774U, 0x811f217cU, 0x82192b64U, 0x831b2d6cU,
  401. 0x84153f54U, 0x8517395cU, 0x86113344U, 0x8713354cU,
  402. 0x880d1734U, 0x890f113cU, 0x8a091b24U, 0x8b0b1d2cU,
  403. 0x8c050f14U, 0x8d07091cU, 0x8e010304U, 0x8f03050cU,
  404. 0x903d47f4U, 0x913f41fcU, 0x92394be4U, 0x933b4decU,
  405. 0x94355fd4U, 0x953759dcU, 0x963153c4U, 0x973355ccU,
  406. 0x982d77b4U, 0x992f71bcU, 0x9a297ba4U, 0x9b2b7dacU,
  407. 0x9c256f94U, 0x9d27699cU, 0x9e216384U, 0x9f23658cU,
  408. 0xa05de769U, 0xa15fe161U, 0xa259eb79U, 0xa35bed71U,
  409. 0xa455ff49U, 0xa557f941U, 0xa651f359U, 0xa753f551U,
  410. 0xa84dd729U, 0xa94fd121U, 0xaa49db39U, 0xab4bdd31U,
  411. 0xac45cf09U, 0xad47c901U, 0xae41c319U, 0xaf43c511U,
  412. 0xb07d87e9U, 0xb17f81e1U, 0xb2798bf9U, 0xb37b8df1U,
  413. 0xb4759fc9U, 0xb57799c1U, 0xb67193d9U, 0xb77395d1U,
  414. 0xb86db7a9U, 0xb96fb1a1U, 0xba69bbb9U, 0xbb6bbdb1U,
  415. 0xbc65af89U, 0xbd67a981U, 0xbe61a399U, 0xbf63a591U,
  416. 0xc09dba4eU, 0xc19fbc46U, 0xc299b65eU, 0xc39bb056U,
  417. 0xc495a26eU, 0xc597a466U, 0xc691ae7eU, 0xc793a876U,
  418. 0xc88d8a0eU, 0xc98f8c06U, 0xca89861eU, 0xcb8b8016U,
  419. 0xcc85922eU, 0xcd879426U, 0xce819e3eU, 0xcf839836U,
  420. 0xd0bddaceU, 0xd1bfdcc6U, 0xd2b9d6deU, 0xd3bbd0d6U,
  421. 0xd4b5c2eeU, 0xd5b7c4e6U, 0xd6b1cefeU, 0xd7b3c8f6U,
  422. 0xd8adea8eU, 0xd9afec86U, 0xdaa9e69eU, 0xdbabe096U,
  423. 0xdca5f2aeU, 0xdda7f4a6U, 0xdea1febeU, 0xdfa3f8b6U,
  424. 0xe0dd7a53U, 0xe1df7c5bU, 0xe2d97643U, 0xe3db704bU,
  425. 0xe4d56273U, 0xe5d7647bU, 0xe6d16e63U, 0xe7d3686bU,
  426. 0xe8cd4a13U, 0xe9cf4c1bU, 0xeac94603U, 0xebcb400bU,
  427. 0xecc55233U, 0xedc7543bU, 0xeec15e23U, 0xefc3582bU,
  428. 0xf0fd1ad3U, 0xf1ff1cdbU, 0xf2f916c3U, 0xf3fb10cbU,
  429. 0xf4f502f3U, 0xf5f704fbU, 0xf6f10ee3U, 0xf7f308ebU,
  430. 0xf8ed2a93U, 0xf9ef2c9bU, 0xfae92683U, 0xfbeb208bU,
  431. 0xfce532b3U, 0xfde734bbU, 0xfee13ea3U, 0xffe338abU,
  432. };
  433. /**
  434. * The round constants.
  435. */
  436. static const ulong32 rc[] = {
  437. 0xba542f74U, 0x53d3d24dU, 0x50ac8dbfU, 0x70529a4cU,
  438. 0xead597d1U, 0x33515ba6U, 0xde48a899U, 0xdb32b7fcU,
  439. 0xe39e919bU, 0xe2bb416eU, 0xa5cb6b95U, 0xa1f3b102U,
  440. 0xccc41d14U, 0xc363da5dU, 0x5fdc7dcdU, 0x7f5a6c5cU,
  441. 0xf726ffedU, 0xe89d6f8eU, 0x19a0f089U,
  442. };
  443. #else
  444. static const ulong32 T0[256] = {
  445. 0xa753a6f5U, 0xd3bb6bd0U, 0xe6d1bf6eU, 0x71e2d93bU,
  446. 0xd0bd67daU, 0xac458acfU, 0x4d9a29b3U, 0x79f2f90bU,
  447. 0x3a74e89cU, 0xc98f038cU, 0x913f7e41U, 0xfce5d732U,
  448. 0x1e3c7844U, 0x478e018fU, 0x54a84de5U, 0xbd67cea9U,
  449. 0x8c050a0fU, 0xa557aef9U, 0x7af4f501U, 0xfbebcb20U,
  450. 0x63c69157U, 0xb86ddab7U, 0xdda753f4U, 0xd4b577c2U,
  451. 0xe5d7b364U, 0xb37bf68dU, 0xc59733a4U, 0xbe61c2a3U,
  452. 0xa94f9ed1U, 0x880d1a17U, 0x0c183028U, 0xa259b2ebU,
  453. 0x3972e496U, 0xdfa35bf8U, 0x2952a4f6U, 0xdaa94fe6U,
  454. 0x2b56acfaU, 0xa84d9ad7U, 0xcb8b0b80U, 0x4c982db5U,
  455. 0x4b9631a7U, 0x224488ccU, 0xaa4992dbU, 0x244890d8U,
  456. 0x4182199bU, 0x70e0dd3dU, 0xa651a2f3U, 0xf9efc32cU,
  457. 0x5ab475c1U, 0xe2d9af76U, 0xb07dfa87U, 0x366cd8b4U,
  458. 0x7dfae913U, 0xe4d5b762U, 0x3366ccaaU, 0xffe3db38U,
  459. 0x60c09d5dU, 0x204080c0U, 0x08102030U, 0x8b0b161dU,
  460. 0x5ebc65d9U, 0xab4b96ddU, 0x7ffee11fU, 0x78f0fd0dU,
  461. 0x7cf8ed15U, 0x2c58b0e8U, 0x57ae41efU, 0xd2b96fd6U,
  462. 0xdca557f2U, 0x6ddaa973U, 0x7efce519U, 0x0d1a342eU,
  463. 0x53a651f7U, 0x94356a5fU, 0xc39b2bb0U, 0x2850a0f0U,
  464. 0x274e9cd2U, 0x060c1814U, 0x5fbe61dfU, 0xad478ec9U,
  465. 0x67ce814fU, 0x5cb86dd5U, 0x55aa49e3U, 0x48903dadU,
  466. 0x0e1c3824U, 0x52a455f1U, 0xeac98f46U, 0x42841591U,
  467. 0x5bb671c7U, 0x5dba69d3U, 0x3060c0a0U, 0x58b07dcdU,
  468. 0x51a259fbU, 0x59b279cbU, 0x3c78f088U, 0x4e9c25b9U,
  469. 0x3870e090U, 0x8a09121bU, 0x72e4d531U, 0x14285078U,
  470. 0xe7d3bb68U, 0xc6913faeU, 0xdea15ffeU, 0x50a05dfdU,
  471. 0x8e010203U, 0x9239724bU, 0xd1bf63dcU, 0x77eec12fU,
  472. 0x933b764dU, 0x458a0983U, 0x9a29527bU, 0xce811f9eU,
  473. 0x2d5ab4eeU, 0x03060c0aU, 0x62c49551U, 0xb671e293U,
  474. 0xb96fdeb1U, 0xbf63c6a5U, 0x96316253U, 0x6bd6b167U,
  475. 0x3f7efc82U, 0x070e1c12U, 0x1224486cU, 0xae4182c3U,
  476. 0x40801d9dU, 0x3468d0b8U, 0x468c0589U, 0x3e7cf884U,
  477. 0xdbab4be0U, 0xcf831b98U, 0xecc59752U, 0xcc851792U,
  478. 0xc19f23bcU, 0xa15fbee1U, 0xc09d27baU, 0xd6b17fceU,
  479. 0x1d3a744eU, 0xf4f5f702U, 0x61c2995bU, 0x3b76ec9aU,
  480. 0x10204060U, 0xd8ad47eaU, 0x68d0bd6dU, 0xa05dbae7U,
  481. 0xb17ffe81U, 0x0a14283cU, 0x69d2b96bU, 0x6cd8ad75U,
  482. 0x499239abU, 0xfae9cf26U, 0x76ecc529U, 0xc49537a2U,
  483. 0x9e214263U, 0x9b2b567dU, 0x6edca579U, 0x992f5e71U,
  484. 0xc2992fb6U, 0xb773e695U, 0x982d5a77U, 0xbc65caafU,
  485. 0x8f030605U, 0x85172e39U, 0x1f3e7c42U, 0xb475ea9fU,
  486. 0xf8edc72aU, 0x11224466U, 0x2e5cb8e4U, 0x00000000U,
  487. 0x254a94deU, 0x1c387048U, 0x2a54a8fcU, 0x3d7af48eU,
  488. 0x050a141eU, 0x4f9e21bfU, 0x7bf6f107U, 0xb279f28bU,
  489. 0x3264c8acU, 0x903d7a47U, 0xaf4386c5U, 0x19326456U,
  490. 0xa35bb6edU, 0xf7f3fb08U, 0x73e6d137U, 0x9d274e69U,
  491. 0x152a547eU, 0x74e8cd25U, 0xeec19f5eU, 0xca890f86U,
  492. 0x9f234665U, 0x0f1e3c22U, 0x1b366c5aU, 0x75eac923U,
  493. 0x86112233U, 0x84152a3fU, 0x9c254a6fU, 0x4a9435a1U,
  494. 0x97336655U, 0x1a34685cU, 0x65ca8943U, 0xf6f1ff0eU,
  495. 0xedc79354U, 0x09122436U, 0xbb6bd6bdU, 0x264c98d4U,
  496. 0x831b362dU, 0xebcb8b40U, 0x6fdea17fU, 0x811f3e21U,
  497. 0x04081018U, 0x6ad4b561U, 0x43861197U, 0x01020406U,
  498. 0x172e5c72U, 0xe1dfa37cU, 0x87132635U, 0xf5f7f304U,
  499. 0x8d070e09U, 0xe3dbab70U, 0x23468ccaU, 0x801d3a27U,
  500. 0x44880d85U, 0x162c5874U, 0x66cc8549U, 0x214284c6U,
  501. 0xfee1df3eU, 0xd5b773c4U, 0x3162c4a6U, 0xd9af43ecU,
  502. 0x356ad4beU, 0x18306050U, 0x0204080cU, 0x64c88d45U,
  503. 0xf2f9ef16U, 0xf1ffe31cU, 0x56ac45e9U, 0xcd871394U,
  504. 0x8219322bU, 0xc88d078aU, 0xba69d2bbU, 0xf0fde71aU,
  505. 0xefc39b58U, 0xe9cf834cU, 0xe8cd874aU, 0xfde7d334U,
  506. 0x890f1e11U, 0xd7b37bc8U, 0xc7933ba8U, 0xb577ee99U,
  507. 0xa455aaffU, 0x2f5ebce2U, 0x95376e59U, 0x13264c6aU,
  508. 0x0b162c3aU, 0xf3fbeb10U, 0xe0dda77aU, 0x376edcb2U,
  509. };
  510. static const ulong32 T1[256] = {
  511. 0x53a7f5a6U, 0xbbd3d06bU, 0xd1e66ebfU, 0xe2713bd9U,
  512. 0xbdd0da67U, 0x45accf8aU, 0x9a4db329U, 0xf2790bf9U,
  513. 0x743a9ce8U, 0x8fc98c03U, 0x3f91417eU, 0xe5fc32d7U,
  514. 0x3c1e4478U, 0x8e478f01U, 0xa854e54dU, 0x67bda9ceU,
  515. 0x058c0f0aU, 0x57a5f9aeU, 0xf47a01f5U, 0xebfb20cbU,
  516. 0xc6635791U, 0x6db8b7daU, 0xa7ddf453U, 0xb5d4c277U,
  517. 0xd7e564b3U, 0x7bb38df6U, 0x97c5a433U, 0x61bea3c2U,
  518. 0x4fa9d19eU, 0x0d88171aU, 0x180c2830U, 0x59a2ebb2U,
  519. 0x723996e4U, 0xa3dff85bU, 0x5229f6a4U, 0xa9dae64fU,
  520. 0x562bfaacU, 0x4da8d79aU, 0x8bcb800bU, 0x984cb52dU,
  521. 0x964ba731U, 0x4422cc88U, 0x49aadb92U, 0x4824d890U,
  522. 0x82419b19U, 0xe0703dddU, 0x51a6f3a2U, 0xeff92cc3U,
  523. 0xb45ac175U, 0xd9e276afU, 0x7db087faU, 0x6c36b4d8U,
  524. 0xfa7d13e9U, 0xd5e462b7U, 0x6633aaccU, 0xe3ff38dbU,
  525. 0xc0605d9dU, 0x4020c080U, 0x10083020U, 0x0b8b1d16U,
  526. 0xbc5ed965U, 0x4babdd96U, 0xfe7f1fe1U, 0xf0780dfdU,
  527. 0xf87c15edU, 0x582ce8b0U, 0xae57ef41U, 0xb9d2d66fU,
  528. 0xa5dcf257U, 0xda6d73a9U, 0xfc7e19e5U, 0x1a0d2e34U,
  529. 0xa653f751U, 0x35945f6aU, 0x9bc3b02bU, 0x5028f0a0U,
  530. 0x4e27d29cU, 0x0c061418U, 0xbe5fdf61U, 0x47adc98eU,
  531. 0xce674f81U, 0xb85cd56dU, 0xaa55e349U, 0x9048ad3dU,
  532. 0x1c0e2438U, 0xa452f155U, 0xc9ea468fU, 0x84429115U,
  533. 0xb65bc771U, 0xba5dd369U, 0x6030a0c0U, 0xb058cd7dU,
  534. 0xa251fb59U, 0xb259cb79U, 0x783c88f0U, 0x9c4eb925U,
  535. 0x703890e0U, 0x098a1b12U, 0xe47231d5U, 0x28147850U,
  536. 0xd3e768bbU, 0x91c6ae3fU, 0xa1defe5fU, 0xa050fd5dU,
  537. 0x018e0302U, 0x39924b72U, 0xbfd1dc63U, 0xee772fc1U,
  538. 0x3b934d76U, 0x8a458309U, 0x299a7b52U, 0x81ce9e1fU,
  539. 0x5a2deeb4U, 0x06030a0cU, 0xc4625195U, 0x71b693e2U,
  540. 0x6fb9b1deU, 0x63bfa5c6U, 0x31965362U, 0xd66b67b1U,
  541. 0x7e3f82fcU, 0x0e07121cU, 0x24126c48U, 0x41aec382U,
  542. 0x80409d1dU, 0x6834b8d0U, 0x8c468905U, 0x7c3e84f8U,
  543. 0xabdbe04bU, 0x83cf981bU, 0xc5ec5297U, 0x85cc9217U,
  544. 0x9fc1bc23U, 0x5fa1e1beU, 0x9dc0ba27U, 0xb1d6ce7fU,
  545. 0x3a1d4e74U, 0xf5f402f7U, 0xc2615b99U, 0x763b9aecU,
  546. 0x20106040U, 0xadd8ea47U, 0xd0686dbdU, 0x5da0e7baU,
  547. 0x7fb181feU, 0x140a3c28U, 0xd2696bb9U, 0xd86c75adU,
  548. 0x9249ab39U, 0xe9fa26cfU, 0xec7629c5U, 0x95c4a237U,
  549. 0x219e6342U, 0x2b9b7d56U, 0xdc6e79a5U, 0x2f99715eU,
  550. 0x99c2b62fU, 0x73b795e6U, 0x2d98775aU, 0x65bcafcaU,
  551. 0x038f0506U, 0x1785392eU, 0x3e1f427cU, 0x75b49feaU,
  552. 0xedf82ac7U, 0x22116644U, 0x5c2ee4b8U, 0x00000000U,
  553. 0x4a25de94U, 0x381c4870U, 0x542afca8U, 0x7a3d8ef4U,
  554. 0x0a051e14U, 0x9e4fbf21U, 0xf67b07f1U, 0x79b28bf2U,
  555. 0x6432acc8U, 0x3d90477aU, 0x43afc586U, 0x32195664U,
  556. 0x5ba3edb6U, 0xf3f708fbU, 0xe67337d1U, 0x279d694eU,
  557. 0x2a157e54U, 0xe87425cdU, 0xc1ee5e9fU, 0x89ca860fU,
  558. 0x239f6546U, 0x1e0f223cU, 0x361b5a6cU, 0xea7523c9U,
  559. 0x11863322U, 0x15843f2aU, 0x259c6f4aU, 0x944aa135U,
  560. 0x33975566U, 0x341a5c68U, 0xca654389U, 0xf1f60effU,
  561. 0xc7ed5493U, 0x12093624U, 0x6bbbbdd6U, 0x4c26d498U,
  562. 0x1b832d36U, 0xcbeb408bU, 0xde6f7fa1U, 0x1f81213eU,
  563. 0x08041810U, 0xd46a61b5U, 0x86439711U, 0x02010604U,
  564. 0x2e17725cU, 0xdfe17ca3U, 0x13873526U, 0xf7f504f3U,
  565. 0x078d090eU, 0xdbe370abU, 0x4623ca8cU, 0x1d80273aU,
  566. 0x8844850dU, 0x2c167458U, 0xcc664985U, 0x4221c684U,
  567. 0xe1fe3edfU, 0xb7d5c473U, 0x6231a6c4U, 0xafd9ec43U,
  568. 0x6a35bed4U, 0x30185060U, 0x04020c08U, 0xc864458dU,
  569. 0xf9f216efU, 0xfff11ce3U, 0xac56e945U, 0x87cd9413U,
  570. 0x19822b32U, 0x8dc88a07U, 0x69babbd2U, 0xfdf01ae7U,
  571. 0xc3ef589bU, 0xcfe94c83U, 0xcde84a87U, 0xe7fd34d3U,
  572. 0x0f89111eU, 0xb3d7c87bU, 0x93c7a83bU, 0x77b599eeU,
  573. 0x55a4ffaaU, 0x5e2fe2bcU, 0x3795596eU, 0x26136a4cU,
  574. 0x160b3a2cU, 0xfbf310ebU, 0xdde07aa7U, 0x6e37b2dcU,
  575. };
  576. static const ulong32 T2[256] = {
  577. 0xa6f5a753U, 0x6bd0d3bbU, 0xbf6ee6d1U, 0xd93b71e2U,
  578. 0x67dad0bdU, 0x8acfac45U, 0x29b34d9aU, 0xf90b79f2U,
  579. 0xe89c3a74U, 0x038cc98fU, 0x7e41913fU, 0xd732fce5U,
  580. 0x78441e3cU, 0x018f478eU, 0x4de554a8U, 0xcea9bd67U,
  581. 0x0a0f8c05U, 0xaef9a557U, 0xf5017af4U, 0xcb20fbebU,
  582. 0x915763c6U, 0xdab7b86dU, 0x53f4dda7U, 0x77c2d4b5U,
  583. 0xb364e5d7U, 0xf68db37bU, 0x33a4c597U, 0xc2a3be61U,
  584. 0x9ed1a94fU, 0x1a17880dU, 0x30280c18U, 0xb2eba259U,
  585. 0xe4963972U, 0x5bf8dfa3U, 0xa4f62952U, 0x4fe6daa9U,
  586. 0xacfa2b56U, 0x9ad7a84dU, 0x0b80cb8bU, 0x2db54c98U,
  587. 0x31a74b96U, 0x88cc2244U, 0x92dbaa49U, 0x90d82448U,
  588. 0x199b4182U, 0xdd3d70e0U, 0xa2f3a651U, 0xc32cf9efU,
  589. 0x75c15ab4U, 0xaf76e2d9U, 0xfa87b07dU, 0xd8b4366cU,
  590. 0xe9137dfaU, 0xb762e4d5U, 0xccaa3366U, 0xdb38ffe3U,
  591. 0x9d5d60c0U, 0x80c02040U, 0x20300810U, 0x161d8b0bU,
  592. 0x65d95ebcU, 0x96ddab4bU, 0xe11f7ffeU, 0xfd0d78f0U,
  593. 0xed157cf8U, 0xb0e82c58U, 0x41ef57aeU, 0x6fd6d2b9U,
  594. 0x57f2dca5U, 0xa9736ddaU, 0xe5197efcU, 0x342e0d1aU,
  595. 0x51f753a6U, 0x6a5f9435U, 0x2bb0c39bU, 0xa0f02850U,
  596. 0x9cd2274eU, 0x1814060cU, 0x61df5fbeU, 0x8ec9ad47U,
  597. 0x814f67ceU, 0x6dd55cb8U, 0x49e355aaU, 0x3dad4890U,
  598. 0x38240e1cU, 0x55f152a4U, 0x8f46eac9U, 0x15914284U,
  599. 0x71c75bb6U, 0x69d35dbaU, 0xc0a03060U, 0x7dcd58b0U,
  600. 0x59fb51a2U, 0x79cb59b2U, 0xf0883c78U, 0x25b94e9cU,
  601. 0xe0903870U, 0x121b8a09U, 0xd53172e4U, 0x50781428U,
  602. 0xbb68e7d3U, 0x3faec691U, 0x5ffedea1U, 0x5dfd50a0U,
  603. 0x02038e01U, 0x724b9239U, 0x63dcd1bfU, 0xc12f77eeU,
  604. 0x764d933bU, 0x0983458aU, 0x527b9a29U, 0x1f9ece81U,
  605. 0xb4ee2d5aU, 0x0c0a0306U, 0x955162c4U, 0xe293b671U,
  606. 0xdeb1b96fU, 0xc6a5bf63U, 0x62539631U, 0xb1676bd6U,
  607. 0xfc823f7eU, 0x1c12070eU, 0x486c1224U, 0x82c3ae41U,
  608. 0x1d9d4080U, 0xd0b83468U, 0x0589468cU, 0xf8843e7cU,
  609. 0x4be0dbabU, 0x1b98cf83U, 0x9752ecc5U, 0x1792cc85U,
  610. 0x23bcc19fU, 0xbee1a15fU, 0x27bac09dU, 0x7fced6b1U,
  611. 0x744e1d3aU, 0xf702f4f5U, 0x995b61c2U, 0xec9a3b76U,
  612. 0x40601020U, 0x47ead8adU, 0xbd6d68d0U, 0xbae7a05dU,
  613. 0xfe81b17fU, 0x283c0a14U, 0xb96b69d2U, 0xad756cd8U,
  614. 0x39ab4992U, 0xcf26fae9U, 0xc52976ecU, 0x37a2c495U,
  615. 0x42639e21U, 0x567d9b2bU, 0xa5796edcU, 0x5e71992fU,
  616. 0x2fb6c299U, 0xe695b773U, 0x5a77982dU, 0xcaafbc65U,
  617. 0x06058f03U, 0x2e398517U, 0x7c421f3eU, 0xea9fb475U,
  618. 0xc72af8edU, 0x44661122U, 0xb8e42e5cU, 0x00000000U,
  619. 0x94de254aU, 0x70481c38U, 0xa8fc2a54U, 0xf48e3d7aU,
  620. 0x141e050aU, 0x21bf4f9eU, 0xf1077bf6U, 0xf28bb279U,
  621. 0xc8ac3264U, 0x7a47903dU, 0x86c5af43U, 0x64561932U,
  622. 0xb6eda35bU, 0xfb08f7f3U, 0xd13773e6U, 0x4e699d27U,
  623. 0x547e152aU, 0xcd2574e8U, 0x9f5eeec1U, 0x0f86ca89U,
  624. 0x46659f23U, 0x3c220f1eU, 0x6c5a1b36U, 0xc92375eaU,
  625. 0x22338611U, 0x2a3f8415U, 0x4a6f9c25U, 0x35a14a94U,
  626. 0x66559733U, 0x685c1a34U, 0x894365caU, 0xff0ef6f1U,
  627. 0x9354edc7U, 0x24360912U, 0xd6bdbb6bU, 0x98d4264cU,
  628. 0x362d831bU, 0x8b40ebcbU, 0xa17f6fdeU, 0x3e21811fU,
  629. 0x10180408U, 0xb5616ad4U, 0x11974386U, 0x04060102U,
  630. 0x5c72172eU, 0xa37ce1dfU, 0x26358713U, 0xf304f5f7U,
  631. 0x0e098d07U, 0xab70e3dbU, 0x8cca2346U, 0x3a27801dU,
  632. 0x0d854488U, 0x5874162cU, 0x854966ccU, 0x84c62142U,
  633. 0xdf3efee1U, 0x73c4d5b7U, 0xc4a63162U, 0x43ecd9afU,
  634. 0xd4be356aU, 0x60501830U, 0x080c0204U, 0x8d4564c8U,
  635. 0xef16f2f9U, 0xe31cf1ffU, 0x45e956acU, 0x1394cd87U,
  636. 0x322b8219U, 0x078ac88dU, 0xd2bbba69U, 0xe71af0fdU,
  637. 0x9b58efc3U, 0x834ce9cfU, 0x874ae8cdU, 0xd334fde7U,
  638. 0x1e11890fU, 0x7bc8d7b3U, 0x3ba8c793U, 0xee99b577U,
  639. 0xaaffa455U, 0xbce22f5eU, 0x6e599537U, 0x4c6a1326U,
  640. 0x2c3a0b16U, 0xeb10f3fbU, 0xa77ae0ddU, 0xdcb2376eU,
  641. };
  642. static const ulong32 T3[256] = {
  643. 0xf5a653a7U, 0xd06bbbd3U, 0x6ebfd1e6U, 0x3bd9e271U,
  644. 0xda67bdd0U, 0xcf8a45acU, 0xb3299a4dU, 0x0bf9f279U,
  645. 0x9ce8743aU, 0x8c038fc9U, 0x417e3f91U, 0x32d7e5fcU,
  646. 0x44783c1eU, 0x8f018e47U, 0xe54da854U, 0xa9ce67bdU,
  647. 0x0f0a058cU, 0xf9ae57a5U, 0x01f5f47aU, 0x20cbebfbU,
  648. 0x5791c663U, 0xb7da6db8U, 0xf453a7ddU, 0xc277b5d4U,
  649. 0x64b3d7e5U, 0x8df67bb3U, 0xa43397c5U, 0xa3c261beU,
  650. 0xd19e4fa9U, 0x171a0d88U, 0x2830180cU, 0xebb259a2U,
  651. 0x96e47239U, 0xf85ba3dfU, 0xf6a45229U, 0xe64fa9daU,
  652. 0xfaac562bU, 0xd79a4da8U, 0x800b8bcbU, 0xb52d984cU,
  653. 0xa731964bU, 0xcc884422U, 0xdb9249aaU, 0xd8904824U,
  654. 0x9b198241U, 0x3ddde070U, 0xf3a251a6U, 0x2cc3eff9U,
  655. 0xc175b45aU, 0x76afd9e2U, 0x87fa7db0U, 0xb4d86c36U,
  656. 0x13e9fa7dU, 0x62b7d5e4U, 0xaacc6633U, 0x38dbe3ffU,
  657. 0x5d9dc060U, 0xc0804020U, 0x30201008U, 0x1d160b8bU,
  658. 0xd965bc5eU, 0xdd964babU, 0x1fe1fe7fU, 0x0dfdf078U,
  659. 0x15edf87cU, 0xe8b0582cU, 0xef41ae57U, 0xd66fb9d2U,
  660. 0xf257a5dcU, 0x73a9da6dU, 0x19e5fc7eU, 0x2e341a0dU,
  661. 0xf751a653U, 0x5f6a3594U, 0xb02b9bc3U, 0xf0a05028U,
  662. 0xd29c4e27U, 0x14180c06U, 0xdf61be5fU, 0xc98e47adU,
  663. 0x4f81ce67U, 0xd56db85cU, 0xe349aa55U, 0xad3d9048U,
  664. 0x24381c0eU, 0xf155a452U, 0x468fc9eaU, 0x91158442U,
  665. 0xc771b65bU, 0xd369ba5dU, 0xa0c06030U, 0xcd7db058U,
  666. 0xfb59a251U, 0xcb79b259U, 0x88f0783cU, 0xb9259c4eU,
  667. 0x90e07038U, 0x1b12098aU, 0x31d5e472U, 0x78502814U,
  668. 0x68bbd3e7U, 0xae3f91c6U, 0xfe5fa1deU, 0xfd5da050U,
  669. 0x0302018eU, 0x4b723992U, 0xdc63bfd1U, 0x2fc1ee77U,
  670. 0x4d763b93U, 0x83098a45U, 0x7b52299aU, 0x9e1f81ceU,
  671. 0xeeb45a2dU, 0x0a0c0603U, 0x5195c462U, 0x93e271b6U,
  672. 0xb1de6fb9U, 0xa5c663bfU, 0x53623196U, 0x67b1d66bU,
  673. 0x82fc7e3fU, 0x121c0e07U, 0x6c482412U, 0xc38241aeU,
  674. 0x9d1d8040U, 0xb8d06834U, 0x89058c46U, 0x84f87c3eU,
  675. 0xe04babdbU, 0x981b83cfU, 0x5297c5ecU, 0x921785ccU,
  676. 0xbc239fc1U, 0xe1be5fa1U, 0xba279dc0U, 0xce7fb1d6U,
  677. 0x4e743a1dU, 0x02f7f5f4U, 0x5b99c261U, 0x9aec763bU,
  678. 0x60402010U, 0xea47add8U, 0x6dbdd068U, 0xe7ba5da0U,
  679. 0x81fe7fb1U, 0x3c28140aU, 0x6bb9d269U, 0x75add86cU,
  680. 0xab399249U, 0x26cfe9faU, 0x29c5ec76U, 0xa23795c4U,
  681. 0x6342219eU, 0x7d562b9bU, 0x79a5dc6eU, 0x715e2f99U,
  682. 0xb62f99c2U, 0x95e673b7U, 0x775a2d98U, 0xafca65bcU,
  683. 0x0506038fU, 0x392e1785U, 0x427c3e1fU, 0x9fea75b4U,
  684. 0x2ac7edf8U, 0x66442211U, 0xe4b85c2eU, 0x00000000U,
  685. 0xde944a25U, 0x4870381cU, 0xfca8542aU, 0x8ef47a3dU,
  686. 0x1e140a05U, 0xbf219e4fU, 0x07f1f67bU, 0x8bf279b2U,
  687. 0xacc86432U, 0x477a3d90U, 0xc58643afU, 0x56643219U,
  688. 0xedb65ba3U, 0x08fbf3f7U, 0x37d1e673U, 0x694e279dU,
  689. 0x7e542a15U, 0x25cde874U, 0x5e9fc1eeU, 0x860f89caU,
  690. 0x6546239fU, 0x223c1e0fU, 0x5a6c361bU, 0x23c9ea75U,
  691. 0x33221186U, 0x3f2a1584U, 0x6f4a259cU, 0xa135944aU,
  692. 0x55663397U, 0x5c68341aU, 0x4389ca65U, 0x0efff1f6U,
  693. 0x5493c7edU, 0x36241209U, 0xbdd66bbbU, 0xd4984c26U,
  694. 0x2d361b83U, 0x408bcbebU, 0x7fa1de6fU, 0x213e1f81U,
  695. 0x18100804U, 0x61b5d46aU, 0x97118643U, 0x06040201U,
  696. 0x725c2e17U, 0x7ca3dfe1U, 0x35261387U, 0x04f3f7f5U,
  697. 0x090e078dU, 0x70abdbe3U, 0xca8c4623U, 0x273a1d80U,
  698. 0x850d8844U, 0x74582c16U, 0x4985cc66U, 0xc6844221U,
  699. 0x3edfe1feU, 0xc473b7d5U, 0xa6c46231U, 0xec43afd9U,
  700. 0xbed46a35U, 0x50603018U, 0x0c080402U, 0x458dc864U,
  701. 0x16eff9f2U, 0x1ce3fff1U, 0xe945ac56U, 0x941387cdU,
  702. 0x2b321982U, 0x8a078dc8U, 0xbbd269baU, 0x1ae7fdf0U,
  703. 0x589bc3efU, 0x4c83cfe9U, 0x4a87cde8U, 0x34d3e7fdU,
  704. 0x111e0f89U, 0xc87bb3d7U, 0xa83b93c7U, 0x99ee77b5U,
  705. 0xffaa55a4U, 0xe2bc5e2fU, 0x596e3795U, 0x6a4c2613U,
  706. 0x3a2c160bU, 0x10ebfbf3U, 0x7aa7dde0U, 0xb2dc6e37U,
  707. };
  708. static const ulong32 T4[256] = {
  709. 0xa7a7a7a7U, 0xd3d3d3d3U, 0xe6e6e6e6U, 0x71717171U,
  710. 0xd0d0d0d0U, 0xacacacacU, 0x4d4d4d4dU, 0x79797979U,
  711. 0x3a3a3a3aU, 0xc9c9c9c9U, 0x91919191U, 0xfcfcfcfcU,
  712. 0x1e1e1e1eU, 0x47474747U, 0x54545454U, 0xbdbdbdbdU,
  713. 0x8c8c8c8cU, 0xa5a5a5a5U, 0x7a7a7a7aU, 0xfbfbfbfbU,
  714. 0x63636363U, 0xb8b8b8b8U, 0xddddddddU, 0xd4d4d4d4U,
  715. 0xe5e5e5e5U, 0xb3b3b3b3U, 0xc5c5c5c5U, 0xbebebebeU,
  716. 0xa9a9a9a9U, 0x88888888U, 0x0c0c0c0cU, 0xa2a2a2a2U,
  717. 0x39393939U, 0xdfdfdfdfU, 0x29292929U, 0xdadadadaU,
  718. 0x2b2b2b2bU, 0xa8a8a8a8U, 0xcbcbcbcbU, 0x4c4c4c4cU,
  719. 0x4b4b4b4bU, 0x22222222U, 0xaaaaaaaaU, 0x24242424U,
  720. 0x41414141U, 0x70707070U, 0xa6a6a6a6U, 0xf9f9f9f9U,
  721. 0x5a5a5a5aU, 0xe2e2e2e2U, 0xb0b0b0b0U, 0x36363636U,
  722. 0x7d7d7d7dU, 0xe4e4e4e4U, 0x33333333U, 0xffffffffU,
  723. 0x60606060U, 0x20202020U, 0x08080808U, 0x8b8b8b8bU,
  724. 0x5e5e5e5eU, 0xababababU, 0x7f7f7f7fU, 0x78787878U,
  725. 0x7c7c7c7cU, 0x2c2c2c2cU, 0x57575757U, 0xd2d2d2d2U,
  726. 0xdcdcdcdcU, 0x6d6d6d6dU, 0x7e7e7e7eU, 0x0d0d0d0dU,
  727. 0x53535353U, 0x94949494U, 0xc3c3c3c3U, 0x28282828U,
  728. 0x27272727U, 0x06060606U, 0x5f5f5f5fU, 0xadadadadU,
  729. 0x67676767U, 0x5c5c5c5cU, 0x55555555U, 0x48484848U,
  730. 0x0e0e0e0eU, 0x52525252U, 0xeaeaeaeaU, 0x42424242U,
  731. 0x5b5b5b5bU, 0x5d5d5d5dU, 0x30303030U, 0x58585858U,
  732. 0x51515151U, 0x59595959U, 0x3c3c3c3cU, 0x4e4e4e4eU,
  733. 0x38383838U, 0x8a8a8a8aU, 0x72727272U, 0x14141414U,
  734. 0xe7e7e7e7U, 0xc6c6c6c6U, 0xdedededeU, 0x50505050U,
  735. 0x8e8e8e8eU, 0x92929292U, 0xd1d1d1d1U, 0x77777777U,
  736. 0x93939393U, 0x45454545U, 0x9a9a9a9aU, 0xcecececeU,
  737. 0x2d2d2d2dU, 0x03030303U, 0x62626262U, 0xb6b6b6b6U,
  738. 0xb9b9b9b9U, 0xbfbfbfbfU, 0x96969696U, 0x6b6b6b6bU,
  739. 0x3f3f3f3fU, 0x07070707U, 0x12121212U, 0xaeaeaeaeU,
  740. 0x40404040U, 0x34343434U, 0x46464646U, 0x3e3e3e3eU,
  741. 0xdbdbdbdbU, 0xcfcfcfcfU, 0xececececU, 0xccccccccU,
  742. 0xc1c1c1c1U, 0xa1a1a1a1U, 0xc0c0c0c0U, 0xd6d6d6d6U,
  743. 0x1d1d1d1dU, 0xf4f4f4f4U, 0x61616161U, 0x3b3b3b3bU,
  744. 0x10101010U, 0xd8d8d8d8U, 0x68686868U, 0xa0a0a0a0U,
  745. 0xb1b1b1b1U, 0x0a0a0a0aU, 0x69696969U, 0x6c6c6c6cU,
  746. 0x49494949U, 0xfafafafaU, 0x76767676U, 0xc4c4c4c4U,
  747. 0x9e9e9e9eU, 0x9b9b9b9bU, 0x6e6e6e6eU, 0x99999999U,
  748. 0xc2c2c2c2U, 0xb7b7b7b7U, 0x98989898U, 0xbcbcbcbcU,
  749. 0x8f8f8f8fU, 0x85858585U, 0x1f1f1f1fU, 0xb4b4b4b4U,
  750. 0xf8f8f8f8U, 0x11111111U, 0x2e2e2e2eU, 0x00000000U,
  751. 0x25252525U, 0x1c1c1c1cU, 0x2a2a2a2aU, 0x3d3d3d3dU,
  752. 0x05050505U, 0x4f4f4f4fU, 0x7b7b7b7bU, 0xb2b2b2b2U,
  753. 0x32323232U, 0x90909090U, 0xafafafafU, 0x19191919U,
  754. 0xa3a3a3a3U, 0xf7f7f7f7U, 0x73737373U, 0x9d9d9d9dU,
  755. 0x15151515U, 0x74747474U, 0xeeeeeeeeU, 0xcacacacaU,
  756. 0x9f9f9f9fU, 0x0f0f0f0fU, 0x1b1b1b1bU, 0x75757575U,
  757. 0x86868686U, 0x84848484U, 0x9c9c9c9cU, 0x4a4a4a4aU,
  758. 0x97979797U, 0x1a1a1a1aU, 0x65656565U, 0xf6f6f6f6U,
  759. 0xededededU, 0x09090909U, 0xbbbbbbbbU, 0x26262626U,
  760. 0x83838383U, 0xebebebebU, 0x6f6f6f6fU, 0x81818181U,
  761. 0x04040404U, 0x6a6a6a6aU, 0x43434343U, 0x01010101U,
  762. 0x17171717U, 0xe1e1e1e1U, 0x87878787U, 0xf5f5f5f5U,
  763. 0x8d8d8d8dU, 0xe3e3e3e3U, 0x23232323U, 0x80808080U,
  764. 0x44444444U, 0x16161616U, 0x66666666U, 0x21212121U,
  765. 0xfefefefeU, 0xd5d5d5d5U, 0x31313131U, 0xd9d9d9d9U,
  766. 0x35353535U, 0x18181818U, 0x02020202U, 0x64646464U,
  767. 0xf2f2f2f2U, 0xf1f1f1f1U, 0x56565656U, 0xcdcdcdcdU,
  768. 0x82828282U, 0xc8c8c8c8U, 0xbabababaU, 0xf0f0f0f0U,
  769. 0xefefefefU, 0xe9e9e9e9U, 0xe8e8e8e8U, 0xfdfdfdfdU,
  770. 0x89898989U, 0xd7d7d7d7U, 0xc7c7c7c7U, 0xb5b5b5b5U,
  771. 0xa4a4a4a4U, 0x2f2f2f2fU, 0x95959595U, 0x13131313U,
  772. 0x0b0b0b0bU, 0xf3f3f3f3U, 0xe0e0e0e0U, 0x37373737U,
  773. };
  774. static const ulong32 T5[256] = {
  775. 0x00000000U, 0x01020608U, 0x02040c10U, 0x03060a18U,
  776. 0x04081820U, 0x050a1e28U, 0x060c1430U, 0x070e1238U,
  777. 0x08103040U, 0x09123648U, 0x0a143c50U, 0x0b163a58U,
  778. 0x0c182860U, 0x0d1a2e68U, 0x0e1c2470U, 0x0f1e2278U,
  779. 0x10206080U, 0x11226688U, 0x12246c90U, 0x13266a98U,
  780. 0x142878a0U, 0x152a7ea8U, 0x162c74b0U, 0x172e72b8U,
  781. 0x183050c0U, 0x193256c8U, 0x1a345cd0U, 0x1b365ad8U,
  782. 0x1c3848e0U, 0x1d3a4ee8U, 0x1e3c44f0U, 0x1f3e42f8U,
  783. 0x2040c01dU, 0x2142c615U, 0x2244cc0dU, 0x2346ca05U,
  784. 0x2448d83dU, 0x254ade35U, 0x264cd42dU, 0x274ed225U,
  785. 0x2850f05dU, 0x2952f655U, 0x2a54fc4dU, 0x2b56fa45U,
  786. 0x2c58e87dU, 0x2d5aee75U, 0x2e5ce46dU, 0x2f5ee265U,
  787. 0x3060a09dU, 0x3162a695U, 0x3264ac8dU, 0x3366aa85U,
  788. 0x3468b8bdU, 0x356abeb5U, 0x366cb4adU, 0x376eb2a5U,
  789. 0x387090ddU, 0x397296d5U, 0x3a749ccdU, 0x3b769ac5U,
  790. 0x3c7888fdU, 0x3d7a8ef5U, 0x3e7c84edU, 0x3f7e82e5U,
  791. 0x40809d3aU, 0x41829b32U, 0x4284912aU, 0x43869722U,
  792. 0x4488851aU, 0x458a8312U, 0x468c890aU, 0x478e8f02U,
  793. 0x4890ad7aU, 0x4992ab72U, 0x4a94a16aU, 0x4b96a762U,
  794. 0x4c98b55aU, 0x4d9ab352U, 0x4e9cb94aU, 0x4f9ebf42U,
  795. 0x50a0fdbaU, 0x51a2fbb2U, 0x52a4f1aaU, 0x53a6f7a2U,
  796. 0x54a8e59aU, 0x55aae392U, 0x56ace98aU, 0x57aeef82U,
  797. 0x58b0cdfaU, 0x59b2cbf2U, 0x5ab4c1eaU, 0x5bb6c7e2U,
  798. 0x5cb8d5daU, 0x5dbad3d2U, 0x5ebcd9caU, 0x5fbedfc2U,
  799. 0x60c05d27U, 0x61c25b2fU, 0x62c45137U, 0x63c6573fU,
  800. 0x64c84507U, 0x65ca430fU, 0x66cc4917U, 0x67ce4f1fU,
  801. 0x68d06d67U, 0x69d26b6fU, 0x6ad46177U, 0x6bd6677fU,
  802. 0x6cd87547U, 0x6dda734fU, 0x6edc7957U, 0x6fde7f5fU,
  803. 0x70e03da7U, 0x71e23bafU, 0x72e431b7U, 0x73e637bfU,
  804. 0x74e82587U, 0x75ea238fU, 0x76ec2997U, 0x77ee2f9fU,
  805. 0x78f00de7U, 0x79f20befU, 0x7af401f7U, 0x7bf607ffU,
  806. 0x7cf815c7U, 0x7dfa13cfU, 0x7efc19d7U, 0x7ffe1fdfU,
  807. 0x801d2774U, 0x811f217cU, 0x82192b64U, 0x831b2d6cU,
  808. 0x84153f54U, 0x8517395cU, 0x86113344U, 0x8713354cU,
  809. 0x880d1734U, 0x890f113cU, 0x8a091b24U, 0x8b0b1d2cU,
  810. 0x8c050f14U, 0x8d07091cU, 0x8e010304U, 0x8f03050cU,
  811. 0x903d47f4U, 0x913f41fcU, 0x92394be4U, 0x933b4decU,
  812. 0x94355fd4U, 0x953759dcU, 0x963153c4U, 0x973355ccU,
  813. 0x982d77b4U, 0x992f71bcU, 0x9a297ba4U, 0x9b2b7dacU,
  814. 0x9c256f94U, 0x9d27699cU, 0x9e216384U, 0x9f23658cU,
  815. 0xa05de769U, 0xa15fe161U, 0xa259eb79U, 0xa35bed71U,
  816. 0xa455ff49U, 0xa557f941U, 0xa651f359U, 0xa753f551U,
  817. 0xa84dd729U, 0xa94fd121U, 0xaa49db39U, 0xab4bdd31U,
  818. 0xac45cf09U, 0xad47c901U, 0xae41c319U, 0xaf43c511U,
  819. 0xb07d87e9U, 0xb17f81e1U, 0xb2798bf9U, 0xb37b8df1U,
  820. 0xb4759fc9U, 0xb57799c1U, 0xb67193d9U, 0xb77395d1U,
  821. 0xb86db7a9U, 0xb96fb1a1U, 0xba69bbb9U, 0xbb6bbdb1U,
  822. 0xbc65af89U, 0xbd67a981U, 0xbe61a399U, 0xbf63a591U,
  823. 0xc09dba4eU, 0xc19fbc46U, 0xc299b65eU, 0xc39bb056U,
  824. 0xc495a26eU, 0xc597a466U, 0xc691ae7eU, 0xc793a876U,
  825. 0xc88d8a0eU, 0xc98f8c06U, 0xca89861eU, 0xcb8b8016U,
  826. 0xcc85922eU, 0xcd879426U, 0xce819e3eU, 0xcf839836U,
  827. 0xd0bddaceU, 0xd1bfdcc6U, 0xd2b9d6deU, 0xd3bbd0d6U,
  828. 0xd4b5c2eeU, 0xd5b7c4e6U, 0xd6b1cefeU, 0xd7b3c8f6U,
  829. 0xd8adea8eU, 0xd9afec86U, 0xdaa9e69eU, 0xdbabe096U,
  830. 0xdca5f2aeU, 0xdda7f4a6U, 0xdea1febeU, 0xdfa3f8b6U,
  831. 0xe0dd7a53U, 0xe1df7c5bU, 0xe2d97643U, 0xe3db704bU,
  832. 0xe4d56273U, 0xe5d7647bU, 0xe6d16e63U, 0xe7d3686bU,
  833. 0xe8cd4a13U, 0xe9cf4c1bU, 0xeac94603U, 0xebcb400bU,
  834. 0xecc55233U, 0xedc7543bU, 0xeec15e23U, 0xefc3582bU,
  835. 0xf0fd1ad3U, 0xf1ff1cdbU, 0xf2f916c3U, 0xf3fb10cbU,
  836. 0xf4f502f3U, 0xf5f704fbU, 0xf6f10ee3U, 0xf7f308ebU,
  837. 0xf8ed2a93U, 0xf9ef2c9bU, 0xfae92683U, 0xfbeb208bU,
  838. 0xfce532b3U, 0xfde734bbU, 0xfee13ea3U, 0xffe338abU,
  839. };
  840. /**
  841. * The round constants.
  842. */
  843. static const ulong32 rc[] = {
  844. 0xa7d3e671U, 0xd0ac4d79U, 0x3ac991fcU, 0x1e4754bdU,
  845. 0x8ca57afbU, 0x63b8ddd4U, 0xe5b3c5beU, 0xa9880ca2U,
  846. 0x39df29daU, 0x2ba8cb4cU, 0x4b22aa24U, 0x4170a6f9U,
  847. 0x5ae2b036U, 0x7de433ffU, 0x6020088bU, 0x5eab7f78U,
  848. 0x7c2c57d2U, 0xdc6d7e0dU, 0x5394c328U,
  849. };
  850. #endif
  851. /**
  852. Initialize the Anubis block cipher
  853. @param key The symmetric key you wish to pass
  854. @param keylen The key length in bytes
  855. @param num_rounds The number of rounds desired (0 for default)
  856. @param skey The key in as scheduled by this function.
  857. @return CRYPT_OK if successful
  858. */
  859. #ifdef LTC_CLEAN_STACK
  860. static int s_anubis_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey)
  861. #else
  862. int anubis_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey)
  863. #endif
  864. {
  865. int N, R, i, pos, r;
  866. ulong32 kappa[MAX_N];
  867. ulong32 inter[MAX_N] = { 0 }; /* initialize as all zeroes */
  868. ulong32 v, K0, K1, K2, K3;
  869. LTC_ARGCHK(key != NULL);
  870. LTC_ARGCHK(skey != NULL);
  871. /* Valid sizes (in bytes) are 16, 20, 24, 28, 32, 36, and 40. */
  872. if ((keylen & 3) || (keylen < 16) || (keylen > 40)) {
  873. return CRYPT_INVALID_KEYSIZE;
  874. }
  875. skey->anubis.keyBits = keylen*8;
  876. /*
  877. * determine the N length parameter:
  878. * (N.B. it is assumed that the key length is valid!)
  879. */
  880. N = skey->anubis.keyBits >> 5;
  881. /*
  882. * determine number of rounds from key size:
  883. */
  884. skey->anubis.R = R = 8 + N;
  885. if (num_rounds != 0 && num_rounds != skey->anubis.R) {
  886. return CRYPT_INVALID_ROUNDS;
  887. }
  888. /*
  889. * map cipher key to initial key state (mu):
  890. */
  891. for (i = 0, pos = 0; i < N; i++, pos += 4) {
  892. kappa[i] =
  893. (((ulong32)key[pos ]) << 24) ^
  894. (((ulong32)key[pos + 1]) << 16) ^
  895. (((ulong32)key[pos + 2]) << 8) ^
  896. (((ulong32)key[pos + 3]) );
  897. }
  898. /*
  899. * generate R + 1 round keys:
  900. */
  901. for (r = 0; r <= R; r++) {
  902. /*
  903. * generate r-th round key K^r:
  904. */
  905. K0 = T4[(kappa[N - 1] >> 24) & 0xff];
  906. K1 = T4[(kappa[N - 1] >> 16) & 0xff];
  907. K2 = T4[(kappa[N - 1] >> 8) & 0xff];
  908. K3 = T4[(kappa[N - 1] ) & 0xff];
  909. for (i = N - 2; i >= 0; i--) {
  910. K0 = T4[(kappa[i] >> 24) & 0xff] ^
  911. (T5[(K0 >> 24) & 0xff] & 0xff000000U) ^
  912. (T5[(K0 >> 16) & 0xff] & 0x00ff0000U) ^
  913. (T5[(K0 >> 8) & 0xff] & 0x0000ff00U) ^
  914. (T5[(K0 ) & 0xff] & 0x000000ffU);
  915. K1 = T4[(kappa[i] >> 16) & 0xff] ^
  916. (T5[(K1 >> 24) & 0xff] & 0xff000000U) ^
  917. (T5[(K1 >> 16) & 0xff] & 0x00ff0000U) ^
  918. (T5[(K1 >> 8) & 0xff] & 0x0000ff00U) ^
  919. (T5[(K1 ) & 0xff] & 0x000000ffU);
  920. K2 = T4[(kappa[i] >> 8) & 0xff] ^
  921. (T5[(K2 >> 24) & 0xff] & 0xff000000U) ^
  922. (T5[(K2 >> 16) & 0xff] & 0x00ff0000U) ^
  923. (T5[(K2 >> 8) & 0xff] & 0x0000ff00U) ^
  924. (T5[(K2 ) & 0xff] & 0x000000ffU);
  925. K3 = T4[(kappa[i] ) & 0xff] ^
  926. (T5[(K3 >> 24) & 0xff] & 0xff000000U) ^
  927. (T5[(K3 >> 16) & 0xff] & 0x00ff0000U) ^
  928. (T5[(K3 >> 8) & 0xff] & 0x0000ff00U) ^
  929. (T5[(K3 ) & 0xff] & 0x000000ffU);
  930. }
  931. /*
  932. -- this is the code to use with the large U tables:
  933. K0 = K1 = K2 = K3 = 0;
  934. for (i = 0; i < N; i++) {
  935. K0 ^= U[i][(kappa[i] >> 24) & 0xff];
  936. K1 ^= U[i][(kappa[i] >> 16) & 0xff];
  937. K2 ^= U[i][(kappa[i] >> 8) & 0xff];
  938. K3 ^= U[i][(kappa[i] ) & 0xff];
  939. }
  940. */
  941. skey->anubis.roundKeyEnc[r][0] = K0;
  942. skey->anubis.roundKeyEnc[r][1] = K1;
  943. skey->anubis.roundKeyEnc[r][2] = K2;
  944. skey->anubis.roundKeyEnc[r][3] = K3;
  945. /*
  946. * compute kappa^{r+1} from kappa^r:
  947. */
  948. if (r == R) {
  949. break;
  950. }
  951. for (i = 0; i < N; i++) {
  952. int j = i;
  953. inter[i] = T0[(kappa[j--] >> 24) & 0xff]; if (j < 0) j = N - 1;
  954. inter[i] ^= T1[(kappa[j--] >> 16) & 0xff]; if (j < 0) j = N - 1;
  955. inter[i] ^= T2[(kappa[j--] >> 8) & 0xff]; if (j < 0) j = N - 1;
  956. inter[i] ^= T3[(kappa[j ] ) & 0xff];
  957. }
  958. kappa[0] = inter[0] ^ rc[r];
  959. for (i = 1; i < N; i++) {
  960. kappa[i] = inter[i];
  961. }
  962. }
  963. /*
  964. * generate inverse key schedule: K'^0 = K^R, K'^R = K^0, K'^r = theta(K^{R-r}):
  965. */
  966. for (i = 0; i < 4; i++) {
  967. skey->anubis.roundKeyDec[0][i] = skey->anubis.roundKeyEnc[R][i];
  968. skey->anubis.roundKeyDec[R][i] = skey->anubis.roundKeyEnc[0][i];
  969. }
  970. for (r = 1; r < R; r++) {
  971. for (i = 0; i < 4; i++) {
  972. v = skey->anubis.roundKeyEnc[R - r][i];
  973. skey->anubis.roundKeyDec[r][i] =
  974. T0[T4[(v >> 24) & 0xff] & 0xff] ^
  975. T1[T4[(v >> 16) & 0xff] & 0xff] ^
  976. T2[T4[(v >> 8) & 0xff] & 0xff] ^
  977. T3[T4[(v ) & 0xff] & 0xff];
  978. }
  979. }
  980. return CRYPT_OK;
  981. }
  982. #ifdef LTC_CLEAN_STACK
  983. int anubis_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey)
  984. {
  985. int err;
  986. err = s_anubis_setup(key, keylen, num_rounds, skey);
  987. burn_stack(sizeof(int) * 5 + sizeof(ulong32) * (MAX_N + MAX_N + 5));
  988. return err;
  989. }
  990. #endif
  991. static void anubis_crypt(const unsigned char *plaintext, unsigned char *ciphertext,
  992. const ulong32 roundKey[18 + 1][4], int R) {
  993. int i, pos, r;
  994. ulong32 state[4];
  995. ulong32 inter[4];
  996. /*
  997. * map plaintext block to cipher state (mu)
  998. * and add initial round key (sigma[K^0]):
  999. */
  1000. for (i = 0, pos = 0; i < 4; i++, pos += 4) {
  1001. state[i] =
  1002. (((ulong32)plaintext[pos ]) << 24) ^
  1003. (((ulong32)plaintext[pos + 1]) << 16) ^
  1004. (((ulong32)plaintext[pos + 2]) << 8) ^
  1005. (((ulong32)plaintext[pos + 3]) ) ^
  1006. roundKey[0][i];
  1007. }
  1008. /*
  1009. * R - 1 full rounds:
  1010. */
  1011. for (r = 1; r < R; r++) {
  1012. inter[0] =
  1013. T0[(state[0] >> 24) & 0xff] ^
  1014. T1[(state[1] >> 24) & 0xff] ^
  1015. T2[(state[2] >> 24) & 0xff] ^
  1016. T3[(state[3] >> 24) & 0xff] ^
  1017. roundKey[r][0];
  1018. inter[1] =
  1019. T0[(state[0] >> 16) & 0xff] ^
  1020. T1[(state[1] >> 16) & 0xff] ^
  1021. T2[(state[2] >> 16) & 0xff] ^
  1022. T3[(state[3] >> 16) & 0xff] ^
  1023. roundKey[r][1];
  1024. inter[2] =
  1025. T0[(state[0] >> 8) & 0xff] ^
  1026. T1[(state[1] >> 8) & 0xff] ^
  1027. T2[(state[2] >> 8) & 0xff] ^
  1028. T3[(state[3] >> 8) & 0xff] ^
  1029. roundKey[r][2];
  1030. inter[3] =
  1031. T0[(state[0] ) & 0xff] ^
  1032. T1[(state[1] ) & 0xff] ^
  1033. T2[(state[2] ) & 0xff] ^
  1034. T3[(state[3] ) & 0xff] ^
  1035. roundKey[r][3];
  1036. state[0] = inter[0];
  1037. state[1] = inter[1];
  1038. state[2] = inter[2];
  1039. state[3] = inter[3];
  1040. }
  1041. /*
  1042. * last round:
  1043. */
  1044. inter[0] =
  1045. (T0[(state[0] >> 24) & 0xff] & 0xff000000U) ^
  1046. (T1[(state[1] >> 24) & 0xff] & 0x00ff0000U) ^
  1047. (T2[(state[2] >> 24) & 0xff] & 0x0000ff00U) ^
  1048. (T3[(state[3] >> 24) & 0xff] & 0x000000ffU) ^
  1049. roundKey[R][0];
  1050. inter[1] =
  1051. (T0[(state[0] >> 16) & 0xff] & 0xff000000U) ^
  1052. (T1[(state[1] >> 16) & 0xff] & 0x00ff0000U) ^
  1053. (T2[(state[2] >> 16) & 0xff] & 0x0000ff00U) ^
  1054. (T3[(state[3] >> 16) & 0xff] & 0x000000ffU) ^
  1055. roundKey[R][1];
  1056. inter[2] =
  1057. (T0[(state[0] >> 8) & 0xff] & 0xff000000U) ^
  1058. (T1[(state[1] >> 8) & 0xff] & 0x00ff0000U) ^
  1059. (T2[(state[2] >> 8) & 0xff] & 0x0000ff00U) ^
  1060. (T3[(state[3] >> 8) & 0xff] & 0x000000ffU) ^
  1061. roundKey[R][2];
  1062. inter[3] =
  1063. (T0[(state[0] ) & 0xff] & 0xff000000U) ^
  1064. (T1[(state[1] ) & 0xff] & 0x00ff0000U) ^
  1065. (T2[(state[2] ) & 0xff] & 0x0000ff00U) ^
  1066. (T3[(state[3] ) & 0xff] & 0x000000ffU) ^
  1067. roundKey[R][3];
  1068. /*
  1069. * map cipher state to ciphertext block (mu^{-1}):
  1070. */
  1071. for (i = 0, pos = 0; i < 4; i++, pos += 4) {
  1072. ulong32 w = inter[i];
  1073. ciphertext[pos ] = (unsigned char)(w >> 24);
  1074. ciphertext[pos + 1] = (unsigned char)(w >> 16);
  1075. ciphertext[pos + 2] = (unsigned char)(w >> 8);
  1076. ciphertext[pos + 3] = (unsigned char)(w );
  1077. }
  1078. }
  1079. /**
  1080. Encrypts a block of text with Anubis
  1081. @param pt The input plaintext (16 bytes)
  1082. @param ct The output ciphertext (16 bytes)
  1083. @param skey The key as scheduled
  1084. @return CRYPT_OK if successful
  1085. */
  1086. int anubis_ecb_encrypt(const unsigned char *pt, unsigned char *ct, const symmetric_key *skey)
  1087. {
  1088. LTC_ARGCHK(pt != NULL);
  1089. LTC_ARGCHK(ct != NULL);
  1090. LTC_ARGCHK(skey != NULL);
  1091. if (skey->anubis.R < 12 || skey->anubis.R > 18) {
  1092. return CRYPT_INVALID_ROUNDS;
  1093. }
  1094. anubis_crypt(pt, ct, skey->anubis.roundKeyEnc, skey->anubis.R);
  1095. return CRYPT_OK;
  1096. }
  1097. /**
  1098. Decrypts a block of text with Anubis
  1099. @param ct The input ciphertext (16 bytes)
  1100. @param pt The output plaintext (16 bytes)
  1101. @param skey The key as scheduled
  1102. @return CRYPT_OK if successful
  1103. */
  1104. int anubis_ecb_decrypt(const unsigned char *ct, unsigned char *pt, const symmetric_key *skey)
  1105. {
  1106. LTC_ARGCHK(pt != NULL);
  1107. LTC_ARGCHK(ct != NULL);
  1108. LTC_ARGCHK(skey != NULL);
  1109. if (skey->anubis.R < 12 || skey->anubis.R > 18) {
  1110. return CRYPT_INVALID_ROUNDS;
  1111. }
  1112. anubis_crypt(ct, pt, skey->anubis.roundKeyDec, skey->anubis.R);
  1113. return CRYPT_OK;
  1114. }
  1115. /**
  1116. Performs a self-test of the Anubis block cipher
  1117. @return CRYPT_OK if functional, CRYPT_NOP if self-test has been disabled
  1118. */
  1119. int anubis_test(void)
  1120. {
  1121. #if !defined(LTC_TEST)
  1122. return CRYPT_NOP;
  1123. #else
  1124. static const struct test {
  1125. int keylen;
  1126. unsigned char pt[16], ct[16], key[40];
  1127. } tests[] = {
  1128. #ifndef LTC_ANUBIS_TWEAK
  1129. /**** ORIGINAL LTC_ANUBIS ****/
  1130. /* 128 bit keys */
  1131. {
  1132. 16,
  1133. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1134. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  1135. { 0xF0, 0x68, 0x60, 0xFC, 0x67, 0x30, 0xE8, 0x18,
  1136. 0xF1, 0x32, 0xC7, 0x8A, 0xF4, 0x13, 0x2A, 0xFE },
  1137. { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1138. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
  1139. }, {
  1140. 16,
  1141. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1142. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  1143. { 0xA8, 0x66, 0x84, 0x80, 0x07, 0x74, 0x5C, 0x89,
  1144. 0xFC, 0x5E, 0xB5, 0xBA, 0xD4, 0xFE, 0x32, 0x6D },
  1145. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1146. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }
  1147. },
  1148. /* 160-bit keys */
  1149. {
  1150. 20,
  1151. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1152. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  1153. { 0xBD, 0x5E, 0x32, 0xBE, 0x51, 0x67, 0xA8, 0xE2,
  1154. 0x72, 0xD7, 0x95, 0x0F, 0x83, 0xC6, 0x8C, 0x31 },
  1155. { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1156. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1157. 0x00, 0x00, 0x00, 0x00 }
  1158. }, {
  1159. 20,
  1160. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1161. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  1162. { 0x4C, 0x1F, 0x86, 0x2E, 0x11, 0xEB, 0xCE, 0xEB,
  1163. 0xFE, 0xB9, 0x73, 0xC9, 0xDF, 0xEF, 0x7A, 0xDB },
  1164. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1165. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1166. 0x00, 0x00, 0x00, 0x01 }
  1167. },
  1168. /* 192-bit keys */
  1169. {
  1170. 24,
  1171. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1172. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  1173. { 0x17, 0xAC, 0x57, 0x44, 0x9D, 0x59, 0x61, 0x66,
  1174. 0xD0, 0xC7, 0x9E, 0x04, 0x7C, 0xC7, 0x58, 0xF0 },
  1175. { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1176. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1177. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
  1178. }, {
  1179. 24,
  1180. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1181. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  1182. { 0x71, 0x52, 0xB4, 0xEB, 0x1D, 0xAA, 0x36, 0xFD,
  1183. 0x57, 0x14, 0x5F, 0x57, 0x04, 0x9F, 0x70, 0x74 },
  1184. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1185. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1186. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }
  1187. },
  1188. /* 224-bit keys */
  1189. {
  1190. 28,
  1191. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1192. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  1193. { 0xA2, 0xF0, 0xA6, 0xB9, 0x17, 0x93, 0x2A, 0x3B,
  1194. 0xEF, 0x08, 0xE8, 0x7A, 0x58, 0xD6, 0xF8, 0x53 },
  1195. { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1196. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1197. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1198. 0x00, 0x00, 0x00, 0x00 }
  1199. }, {
  1200. 28,
  1201. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1202. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  1203. { 0xF0, 0xCA, 0xFC, 0x78, 0x8B, 0x4B, 0x4E, 0x53,
  1204. 0x8B, 0xC4, 0x32, 0x6A, 0xF5, 0xB9, 0x1B, 0x5F },
  1205. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1206. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1207. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1208. 0x00, 0x00, 0x00, 0x01 }
  1209. },
  1210. /* 256-bit keys */
  1211. {
  1212. 32,
  1213. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1214. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  1215. { 0xE0, 0x86, 0xAC, 0x45, 0x6B, 0x3C, 0xE5, 0x13,
  1216. 0xED, 0xF5, 0xDF, 0xDD, 0xD6, 0x3B, 0x71, 0x93 },
  1217. { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1218. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1219. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1220. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
  1221. }, {
  1222. 32,
  1223. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1224. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  1225. { 0x50, 0x01, 0xB9, 0xF5, 0x21, 0xC1, 0xC1, 0x29,
  1226. 0x00, 0xD5, 0xEC, 0x98, 0x2B, 0x9E, 0xE8, 0x21 },
  1227. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1228. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1229. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1230. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }
  1231. },
  1232. /* 288-bit keys */
  1233. {
  1234. 36,
  1235. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1236. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  1237. { 0xE8, 0xF4, 0xAF, 0x2B, 0x21, 0xA0, 0x87, 0x9B,
  1238. 0x41, 0x95, 0xB9, 0x71, 0x75, 0x79, 0x04, 0x7C },
  1239. { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1240. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1241. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1242. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1243. 0x00, 0x00, 0x00, 0x00 }
  1244. }, {
  1245. 36,
  1246. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1247. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  1248. { 0xE6, 0xA6, 0xA5, 0xBC, 0x8B, 0x63, 0x6F, 0xE2,
  1249. 0xBD, 0xA7, 0xA7, 0x53, 0xAB, 0x40, 0x22, 0xE0 },
  1250. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1251. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1252. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1253. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1254. 0x00, 0x00, 0x00, 0x01 }
  1255. },
  1256. /* 320-bit keys */
  1257. {
  1258. 40,
  1259. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1260. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  1261. { 0x17, 0x04, 0xD7, 0x2C, 0xC6, 0x85, 0x76, 0x02,
  1262. 0x4B, 0xCC, 0x39, 0x80, 0xD8, 0x22, 0xEA, 0xA4 },
  1263. { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1264. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1265. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1266. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1267. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
  1268. }, {
  1269. 40,
  1270. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1271. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  1272. { 0x7A, 0x41, 0xE6, 0x7D, 0x4F, 0xD8, 0x64, 0xF0,
  1273. 0x44, 0xA8, 0x3C, 0x73, 0x81, 0x7E, 0x53, 0xD8 },
  1274. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1275. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1276. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1277. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1278. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }
  1279. }
  1280. #else
  1281. /**** Tweaked LTC_ANUBIS ****/
  1282. /* 128 bit keys */
  1283. {
  1284. 16,
  1285. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1286. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  1287. { 0xB8, 0x35, 0xBD, 0xC3, 0x34, 0x82, 0x9D, 0x83,
  1288. 0x71, 0xBF, 0xA3, 0x71, 0xE4, 0xB3, 0xC4, 0xFD },
  1289. { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1290. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
  1291. }, {
  1292. 16,
  1293. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1294. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  1295. { 0xE6, 0x14, 0x1E, 0xAF, 0xEB, 0xE0, 0x59, 0x3C,
  1296. 0x48, 0xE1, 0xCD, 0xF2, 0x1B, 0xBA, 0xA1, 0x89 },
  1297. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1298. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }
  1299. },
  1300. /* 160-bit keys */
  1301. {
  1302. 20,
  1303. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1304. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  1305. { 0x97, 0x59, 0x79, 0x4B, 0x5C, 0xA0, 0x70, 0x73,
  1306. 0x24, 0xEF, 0xB3, 0x58, 0x67, 0xCA, 0xD4, 0xB3 },
  1307. { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1308. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1309. 0x00, 0x00, 0x00, 0x00 }
  1310. }, {
  1311. 20,
  1312. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1313. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  1314. { 0xB8, 0x0D, 0xFB, 0x9B, 0xE4, 0xA1, 0x58, 0x87,
  1315. 0xB3, 0x76, 0xD5, 0x02, 0x18, 0x95, 0xC1, 0x2E },
  1316. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1317. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1318. 0x00, 0x00, 0x00, 0x01 }
  1319. },
  1320. /* 192-bit keys */
  1321. {
  1322. 24,
  1323. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1324. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  1325. { 0x7D, 0x62, 0x3B, 0x52, 0xC7, 0x4C, 0x64, 0xD8,
  1326. 0xEB, 0xC7, 0x2D, 0x57, 0x97, 0x85, 0x43, 0x8F },
  1327. { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1328. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1329. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
  1330. }, {
  1331. 24,
  1332. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1333. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  1334. { 0xB1, 0x0A, 0x59, 0xDD, 0x5D, 0x5D, 0x8D, 0x67,
  1335. 0xEC, 0xEE, 0x4A, 0xC4, 0xBE, 0x4F, 0xA8, 0x4F },
  1336. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1337. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1338. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }
  1339. },
  1340. /* 224-bit keys */
  1341. {
  1342. 28,
  1343. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1344. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  1345. { 0x68, 0x9E, 0x05, 0x94, 0x6A, 0x94, 0x43, 0x8F,
  1346. 0xE7, 0x8E, 0x37, 0x3D, 0x24, 0x97, 0x92, 0xF5 },
  1347. { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1348. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1349. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1350. 0x00, 0x00, 0x00, 0x00 }
  1351. }, {
  1352. 28,
  1353. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1354. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  1355. { 0xDD, 0xB7, 0xB0, 0xB4, 0xE9, 0xB4, 0x9B, 0x9C,
  1356. 0x38, 0x20, 0x25, 0x0B, 0x47, 0xC2, 0x1F, 0x89 },
  1357. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1358. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1359. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1360. 0x00, 0x00, 0x00, 0x01 }
  1361. },
  1362. /* 256-bit keys */
  1363. {
  1364. 32,
  1365. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1366. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  1367. { 0x96, 0x00, 0xF0, 0x76, 0x91, 0x69, 0x29, 0x87,
  1368. 0xF5, 0xE5, 0x97, 0xDB, 0xDB, 0xAF, 0x1B, 0x0A },
  1369. { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1370. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1371. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1372. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
  1373. }, {
  1374. 32,
  1375. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1376. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  1377. { 0x69, 0x9C, 0xAF, 0xDD, 0x94, 0xC7, 0xBC, 0x60,
  1378. 0x44, 0xFE, 0x02, 0x05, 0x8A, 0x6E, 0xEF, 0xBD },
  1379. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1380. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1381. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1382. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }
  1383. },
  1384. /* 288-bit keys */
  1385. {
  1386. 36,
  1387. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1388. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  1389. { 0x0F, 0xC7, 0xA2, 0xC0, 0x11, 0x17, 0xAC, 0x43,
  1390. 0x52, 0x5E, 0xDF, 0x6C, 0xF3, 0x96, 0x33, 0x6C },
  1391. { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1392. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1393. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1394. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1395. 0x00, 0x00, 0x00, 0x00 }
  1396. }, {
  1397. 36,
  1398. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1399. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  1400. { 0xAD, 0x08, 0x4F, 0xED, 0x55, 0xA6, 0x94, 0x3E,
  1401. 0x7E, 0x5E, 0xED, 0x05, 0xA1, 0x9D, 0x41, 0xB4 },
  1402. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1403. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1404. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1405. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1406. 0x00, 0x00, 0x00, 0x01 }
  1407. },
  1408. /* 320-bit keys */
  1409. {
  1410. 40,
  1411. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1412. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  1413. { 0xFE, 0xE2, 0x0E, 0x2A, 0x9D, 0xC5, 0x83, 0xBA,
  1414. 0xA3, 0xA6, 0xD6, 0xA6, 0xF2, 0xE8, 0x06, 0xA5 },
  1415. { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1416. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1417. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1418. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1419. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
  1420. }, {
  1421. 40,
  1422. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1423. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  1424. { 0x86, 0x3D, 0xCC, 0x4A, 0x60, 0x34, 0x9C, 0x28,
  1425. 0xA7, 0xDA, 0xA4, 0x3B, 0x0A, 0xD7, 0xFD, 0xC7 },
  1426. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1427. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1428. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1429. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1430. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }
  1431. }
  1432. #endif
  1433. };
  1434. int x, y;
  1435. unsigned char buf[2][16];
  1436. symmetric_key skey;
  1437. for (x = 0; x < (int)LTC_ARRAY_SIZE(tests); x++) {
  1438. anubis_setup(tests[x].key, tests[x].keylen, 0, &skey);
  1439. anubis_ecb_encrypt(tests[x].pt, buf[0], &skey);
  1440. anubis_ecb_decrypt(buf[0], buf[1], &skey);
  1441. if (ltc_compare_testvector(buf[0], 16, tests[x].ct, 16, "Anubis Encrypt", x) ||
  1442. ltc_compare_testvector(buf[1], 16, tests[x].pt, 16, "Anubis Decrypt", x)) {
  1443. return CRYPT_FAIL_TESTVECTOR;
  1444. }
  1445. for (y = 0; y < 1000; y++) anubis_ecb_encrypt(buf[0], buf[0], &skey);
  1446. for (y = 0; y < 1000; y++) anubis_ecb_decrypt(buf[0], buf[0], &skey);
  1447. if (ltc_compare_testvector(buf[0], 16, tests[x].ct, 16, "Anubis 1000", 1000)) {
  1448. return CRYPT_FAIL_TESTVECTOR;
  1449. }
  1450. }
  1451. return CRYPT_OK;
  1452. #endif
  1453. }
  1454. /** Terminate the context
  1455. @param skey The scheduled key
  1456. */
  1457. void anubis_done(symmetric_key *skey)
  1458. {
  1459. LTC_UNUSED_PARAM(skey);
  1460. }
  1461. /**
  1462. Gets suitable key size
  1463. @param keysize [in/out] The length of the recommended key (in bytes). This function will store the suitable size back in this variable.
  1464. @return CRYPT_OK if the input key size is acceptable.
  1465. */
  1466. int anubis_keysize(int *keysize)
  1467. {
  1468. LTC_ARGCHK(keysize != NULL);
  1469. if (*keysize >= 40) {
  1470. *keysize = 40;
  1471. } else if (*keysize >= 36) {
  1472. *keysize = 36;
  1473. } else if (*keysize >= 32) {
  1474. *keysize = 32;
  1475. } else if (*keysize >= 28) {
  1476. *keysize = 28;
  1477. } else if (*keysize >= 24) {
  1478. *keysize = 24;
  1479. } else if (*keysize >= 20) {
  1480. *keysize = 20;
  1481. } else if (*keysize >= 16) {
  1482. *keysize = 16;
  1483. } else {
  1484. return CRYPT_INVALID_KEYSIZE;
  1485. }
  1486. return CRYPT_OK;
  1487. }
  1488. #undef MAX_N
  1489. #undef T0
  1490. #undef T1
  1491. #undef T2
  1492. #undef T3
  1493. #undef T4
  1494. #undef T5
  1495. #undef rc
  1496. #endif