mceliece6688128f.c 164 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674
  1. /* mceliece6688128f.c - Classic McEliece for libgcrypt
  2. * Copyright (C) 2023-2024 Simon Josefsson <simon@josefsson.org>
  3. *
  4. * This file is part of Libgcrypt.
  5. *
  6. * Libgcrypt is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU Lesser General Public License as
  8. * published by the Free Software Foundation; either version 2.1 of
  9. * the License, or (at your option) any later version.
  10. *
  11. * Libgcrypt is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public
  17. * License along with this program; if not, see <https://www.gnu.org/licenses/>.
  18. * SPDX-License-Identifier: LGPL-2.1-or-later
  19. *
  20. */
  21. /* This file is extracted from libmceliece. */
  22. /*
  23. * libmceliece is hereby placed into the public domain.
  24. *
  25. * [SPDX-License-Identifier](https://spdx.dev/ids/):
  26. * [LicenseRef-PD-hp](https://cr.yp.to/spdx.html)
  27. * OR
  28. * [CC0-1.0](https://spdx.org/licenses/CC0-1.0.html)
  29. * OR
  30. * [0BSD](https://spdx.org/licenses/0BSD.html)
  31. * OR
  32. * [MIT-0](https://spdx.org/licenses/MIT-0.html)
  33. * OR
  34. * [MIT](https://spdx.org/licenses/MIT.html)
  35. *
  36. * libmceliece is based on the official Classic McEliece software, which
  37. * was written by Tung Chou. See the following papers for the major
  38. * algorithms used for speed inside that software:
  39. *
  40. * * Daniel J. Bernstein, Tung Chou, Peter Schwabe. "McBits: fast
  41. * constant-time code-based cryptography." CHES 2013.
  42. * [https://tungchou.github.io/papers/mcbits.pdf](https://tungchou.github.io/papers/mcbits.pdf)
  43. *
  44. * * Tung Chou. "McBits revisited." CHES 2017.
  45. * [https://tungchou.github.io/papers/mcbits_revisited.pdf](https://tungchou.github.io/papers/mcbits_revisited.pdf)
  46. *
  47. * The official Classic McEliece software includes `ref`, `vec`, `sse`, and
  48. * `avx` implementations; libmceliece includes only `vec` and `avx`.
  49. *
  50. * The following components of libmceliece are from Daniel J. Bernstein:
  51. *
  52. * * Small [changes](download.html#changelog)
  53. * for namespacing, portability, etc.
  54. *
  55. * * Software to compute control bits (also used in the official software).
  56. * See the following paper: Daniel J. Bernstein. "Verified fast formulas
  57. * for control bits for permutation networks." 2020.
  58. * [https://cr.yp.to/papers.html#controlbits](https://cr.yp.to/papers.html#controlbits)
  59. *
  60. * * `crypto_sort/int32`. See [https://sorting.cr.yp.to](https://sorting.cr.yp.to).
  61. *
  62. * * Infrastructure to build a library with automatic run-time selection of
  63. * implementations based on the run-time CPU and a database of
  64. * benchmarks. This infrastructure was introduced in
  65. * [`lib25519`](https://lib25519.cr.yp.to), with some extensions and
  66. * adaptations in libmceliece.
  67. *
  68. * * Various software for tests and benchmarks. This is based on
  69. * public-domain code in the SUPERCOP benchmarking framework.
  70. *
  71. * This file is generated by mceliece6688128f.sh from these files:
  72. *
  73. * libmceliece-20230612/include-build/crypto_declassify.h
  74. * libmceliece-20230612/crypto_kem/6688128f/vec/params.h
  75. * libmceliece-20230612/inttypes/crypto_intN.h
  76. * libmceliece-20230612/inttypes/crypto_intN.h
  77. * libmceliece-20230612/inttypes/crypto_intN.h
  78. * libmceliece-20230612/inttypes/crypto_uintN.h
  79. * libmceliece-20230612/inttypes/crypto_uintN.h
  80. * libmceliece-20230612/inttypes/crypto_uintN.h
  81. * libmceliece-20230612/crypto_kem/6688128f/vec/vec.h
  82. * libmceliece-20230612/crypto_kem/6688128f/vec/benes.h
  83. * libmceliece-20230612/crypto_kem/6688128f/vec/bm.h
  84. * libmceliece-20230612/crypto_kem/6688128f/vec/controlbits.h
  85. * libmceliece-20230612/crypto_kem/6688128f/vec/decrypt.h
  86. * libmceliece-20230612/crypto_kem/6688128f/vec/encrypt.h
  87. * libmceliece-20230612/crypto_kem/6688128f/vec/fft_consts.h
  88. * libmceliece-20230612/crypto_kem/6688128f/vec/fft.h
  89. * libmceliece-20230612/crypto_kem/6688128f/vec/fft_powers.h
  90. * libmceliece-20230612/crypto_kem/6688128f/vec/fft_scalars_2x.h
  91. * libmceliece-20230612/crypto_kem/6688128f/vec/fft_scalars_4x.h
  92. * libmceliece-20230612/crypto_kem/6688128f/vec/fft_tr.h
  93. * libmceliece-20230612/crypto_kem/6688128f/vec/gf.h
  94. * libmceliece-20230612/crypto_kem/6688128f/vec/hash.h
  95. * libmceliece-20230612/crypto_kem/6688128f/vec/int32_sort.h
  96. * libmceliece-20230612/crypto_kem/6688128f/vec/operations.h
  97. * libmceliece-20230612/crypto_kem/6688128f/vec/pk_gen.h
  98. * libmceliece-20230612/crypto_kem/6688128f/vec/sk_gen.h
  99. * libmceliece-20230612/crypto_kem/6688128f/vec/transpose.h
  100. * libmceliece-20230612/crypto_kem/6688128f/vec/uint16_sort.h
  101. * libmceliece-20230612/crypto_kem/6688128f/vec/uint64_sort.h
  102. * libmceliece-20230612/crypto_kem/6688128f/vec/util.h
  103. * libmceliece-20230612/crypto_kem/6688128f/vec/benes.c
  104. * libmceliece-20230612/crypto_kem/6688128f/vec/bm.c
  105. * libmceliece-20230612/crypto_kem/6688128f/vec/controlbits.c
  106. * libmceliece-20230612/crypto_kem/6688128f/vec/decrypt.c
  107. * libmceliece-20230612/crypto_kem/6688128f/vec/encrypt.c
  108. * libmceliece-20230612/crypto_kem/6688128f/vec/shared-fft_consts.c
  109. * libmceliece-20230612/crypto_kem/6688128f/vec/shared-fft_powers.c
  110. * libmceliece-20230612/crypto_kem/6688128f/vec/shared-fft_scalars_2x.c
  111. * libmceliece-20230612/crypto_kem/6688128f/vec/shared-fft_scalars_4x.c
  112. * libmceliece-20230612/crypto_kem/6688128f/vec/fft.c
  113. * libmceliece-20230612/crypto_kem/6688128f/vec/fft_tr.c
  114. * libmceliece-20230612/crypto_kem/6688128f/vec/gf.c
  115. * libmceliece-20230612/crypto_kem/6688128f/vec/kem_dec.c
  116. * libmceliece-20230612/crypto_kem/6688128f/vec/kem_enc.c
  117. * libmceliece-20230612/crypto_kem/6688128f/vec/kem_keypair.c
  118. * libmceliece-20230612/crypto_kem/6688128f/vec/pk_gen.c
  119. * libmceliece-20230612/crypto_kem/6688128f/vec/sk_gen.c
  120. * libmceliece-20230612/crypto_kem/6688128f/vec/vec.c
  121. * libmceliece-20230612/crypto_kem/6688128f/vec/wrap_dec.c
  122. * libmceliece-20230612/crypto_kem/6688128f/vec/wrap_enc.c
  123. * libmceliece-20230612/crypto_kem/6688128f/vec/wrap_keypair.c
  124. *
  125. */
  126. #ifdef HAVE_CONFIG_H
  127. #include <config.h>
  128. #endif
  129. #include "g10lib.h"
  130. #include "mceliece6688128f.h"
  131. #define int8 crypto_int8
  132. #define uint8 crypto_uint8
  133. #define int16 crypto_int16
  134. #define uint16 crypto_uint16
  135. #define int32 crypto_int32
  136. #define uint32 crypto_uint32
  137. #define int64 crypto_int64
  138. #define uint64 crypto_uint64
  139. static void
  140. randombytes (uint8_t *out, size_t outlen)
  141. {
  142. _gcry_randomize (out, outlen, GCRY_STRONG_RANDOM);
  143. }
  144. /* from libmceliece-20230612/include-build/crypto_declassify.h */
  145. #ifndef crypto_declassify_h
  146. #define crypto_declassify_h
  147. static void crypto_declassify(void *crypto_declassify_v,long long crypto_declassify_vlen) {
  148. (void) crypto_declassify_v;
  149. (void) crypto_declassify_vlen;
  150. }
  151. #endif
  152. /* from libmceliece-20230612/crypto_kem/6688128f/vec/params.h */
  153. #ifndef PARAMS_H
  154. #define PARAMS_H
  155. #define GFBITS 13
  156. #define SYS_N 6688
  157. #define SYS_T 128
  158. #define COND_BYTES ((1 << (GFBITS-4))*(2*GFBITS - 1))
  159. #define IRR_BYTES (SYS_T * 2)
  160. #define PK_NROWS (SYS_T*GFBITS)
  161. #define PK_NCOLS (SYS_N - PK_NROWS)
  162. #define PK_ROW_BYTES ((PK_NCOLS + 7)/8)
  163. #define SYND_BYTES ((PK_NROWS + 7)/8)
  164. #define GFMASK ((1 << GFBITS) - 1)
  165. #endif
  166. /* from libmceliece-20230612/inttypes/crypto_intN.h */
  167. #ifndef crypto_int64_h
  168. #define crypto_int64_h
  169. #define crypto_int64 int64_t
  170. GCC_ATTR_UNUSED
  171. static crypto_int64 crypto_int64_negative_mask(crypto_int64 crypto_int64_x)
  172. {
  173. return crypto_int64_x >> (64-1);
  174. }
  175. GCC_ATTR_UNUSED
  176. static crypto_int64 crypto_int64_nonzero_mask(crypto_int64 crypto_int64_x)
  177. {
  178. return crypto_int64_negative_mask(crypto_int64_x) | crypto_int64_negative_mask(-crypto_int64_x);
  179. }
  180. GCC_ATTR_UNUSED
  181. static crypto_int64 crypto_int64_zero_mask(crypto_int64 crypto_int64_x)
  182. {
  183. return ~crypto_int64_nonzero_mask(crypto_int64_x);
  184. }
  185. GCC_ATTR_UNUSED
  186. static crypto_int64 crypto_int64_positive_mask(crypto_int64 crypto_int64_x)
  187. {
  188. crypto_int64 crypto_int64_z = -crypto_int64_x;
  189. crypto_int64_z ^= crypto_int64_x & crypto_int64_z;
  190. return crypto_int64_negative_mask(crypto_int64_z);
  191. }
  192. GCC_ATTR_UNUSED
  193. static crypto_int64 crypto_int64_unequal_mask(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_y)
  194. {
  195. crypto_int64 crypto_int64_xy = crypto_int64_x ^ crypto_int64_y;
  196. return crypto_int64_nonzero_mask(crypto_int64_xy);
  197. }
  198. GCC_ATTR_UNUSED
  199. static crypto_int64 crypto_int64_equal_mask(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_y)
  200. {
  201. return ~crypto_int64_unequal_mask(crypto_int64_x,crypto_int64_y);
  202. }
  203. GCC_ATTR_UNUSED
  204. static crypto_int64 crypto_int64_smaller_mask(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_y)
  205. {
  206. crypto_int64 crypto_int64_xy = crypto_int64_x ^ crypto_int64_y;
  207. crypto_int64 crypto_int64_z = crypto_int64_x - crypto_int64_y;
  208. crypto_int64_z ^= crypto_int64_xy & (crypto_int64_z ^ crypto_int64_x);
  209. return crypto_int64_negative_mask(crypto_int64_z);
  210. }
  211. GCC_ATTR_UNUSED
  212. static crypto_int64 crypto_int64_min(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_y)
  213. {
  214. crypto_int64 crypto_int64_xy = crypto_int64_y ^ crypto_int64_x;
  215. crypto_int64 crypto_int64_z = crypto_int64_y - crypto_int64_x;
  216. crypto_int64_z ^= crypto_int64_xy & (crypto_int64_z ^ crypto_int64_y);
  217. crypto_int64_z = crypto_int64_negative_mask(crypto_int64_z);
  218. crypto_int64_z &= crypto_int64_xy;
  219. return crypto_int64_x ^ crypto_int64_z;
  220. }
  221. GCC_ATTR_UNUSED
  222. static crypto_int64 crypto_int64_max(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_y)
  223. {
  224. crypto_int64 crypto_int64_xy = crypto_int64_y ^ crypto_int64_x;
  225. crypto_int64 crypto_int64_z = crypto_int64_y - crypto_int64_x;
  226. crypto_int64_z ^= crypto_int64_xy & (crypto_int64_z ^ crypto_int64_y);
  227. crypto_int64_z = crypto_int64_negative_mask(crypto_int64_z);
  228. crypto_int64_z &= crypto_int64_xy;
  229. return crypto_int64_y ^ crypto_int64_z;
  230. }
  231. GCC_ATTR_UNUSED
  232. static void crypto_int64_minmax(crypto_int64 *crypto_int64_a,crypto_int64 *crypto_int64_b)
  233. {
  234. crypto_int64 crypto_int64_x = *crypto_int64_a;
  235. crypto_int64 crypto_int64_y = *crypto_int64_b;
  236. crypto_int64 crypto_int64_xy = crypto_int64_y ^ crypto_int64_x;
  237. crypto_int64 crypto_int64_z = crypto_int64_y - crypto_int64_x;
  238. crypto_int64_z ^= crypto_int64_xy & (crypto_int64_z ^ crypto_int64_y);
  239. crypto_int64_z = crypto_int64_negative_mask(crypto_int64_z);
  240. crypto_int64_z &= crypto_int64_xy;
  241. *crypto_int64_a = crypto_int64_x ^ crypto_int64_z;
  242. *crypto_int64_b = crypto_int64_y ^ crypto_int64_z;
  243. }
  244. #endif
  245. /* from libmceliece-20230612/inttypes/crypto_intN.h */
  246. #ifndef crypto_int16_h
  247. #define crypto_int16_h
  248. #define crypto_int16 int16_t
  249. GCC_ATTR_UNUSED
  250. static crypto_int16 crypto_int16_negative_mask(crypto_int16 crypto_int16_x)
  251. {
  252. return crypto_int16_x >> (16-1);
  253. }
  254. GCC_ATTR_UNUSED
  255. static crypto_int16 crypto_int16_nonzero_mask(crypto_int16 crypto_int16_x)
  256. {
  257. return crypto_int16_negative_mask(crypto_int16_x) | crypto_int16_negative_mask(-crypto_int16_x);
  258. }
  259. GCC_ATTR_UNUSED
  260. static crypto_int16 crypto_int16_zero_mask(crypto_int16 crypto_int16_x)
  261. {
  262. return ~crypto_int16_nonzero_mask(crypto_int16_x);
  263. }
  264. GCC_ATTR_UNUSED
  265. static crypto_int16 crypto_int16_positive_mask(crypto_int16 crypto_int16_x)
  266. {
  267. crypto_int16 crypto_int16_z = -crypto_int16_x;
  268. crypto_int16_z ^= crypto_int16_x & crypto_int16_z;
  269. return crypto_int16_negative_mask(crypto_int16_z);
  270. }
  271. GCC_ATTR_UNUSED
  272. static crypto_int16 crypto_int16_unequal_mask(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_y)
  273. {
  274. crypto_int16 crypto_int16_xy = crypto_int16_x ^ crypto_int16_y;
  275. return crypto_int16_nonzero_mask(crypto_int16_xy);
  276. }
  277. GCC_ATTR_UNUSED
  278. static crypto_int16 crypto_int16_equal_mask(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_y)
  279. {
  280. return ~crypto_int16_unequal_mask(crypto_int16_x,crypto_int16_y);
  281. }
  282. GCC_ATTR_UNUSED
  283. static crypto_int16 crypto_int16_smaller_mask(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_y)
  284. {
  285. crypto_int16 crypto_int16_xy = crypto_int16_x ^ crypto_int16_y;
  286. crypto_int16 crypto_int16_z = crypto_int16_x - crypto_int16_y;
  287. crypto_int16_z ^= crypto_int16_xy & (crypto_int16_z ^ crypto_int16_x);
  288. return crypto_int16_negative_mask(crypto_int16_z);
  289. }
  290. GCC_ATTR_UNUSED
  291. static crypto_int16 crypto_int16_min(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_y)
  292. {
  293. crypto_int16 crypto_int16_xy = crypto_int16_y ^ crypto_int16_x;
  294. crypto_int16 crypto_int16_z = crypto_int16_y - crypto_int16_x;
  295. crypto_int16_z ^= crypto_int16_xy & (crypto_int16_z ^ crypto_int16_y);
  296. crypto_int16_z = crypto_int16_negative_mask(crypto_int16_z);
  297. crypto_int16_z &= crypto_int16_xy;
  298. return crypto_int16_x ^ crypto_int16_z;
  299. }
  300. GCC_ATTR_UNUSED
  301. static crypto_int16 crypto_int16_max(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_y)
  302. {
  303. crypto_int16 crypto_int16_xy = crypto_int16_y ^ crypto_int16_x;
  304. crypto_int16 crypto_int16_z = crypto_int16_y - crypto_int16_x;
  305. crypto_int16_z ^= crypto_int16_xy & (crypto_int16_z ^ crypto_int16_y);
  306. crypto_int16_z = crypto_int16_negative_mask(crypto_int16_z);
  307. crypto_int16_z &= crypto_int16_xy;
  308. return crypto_int16_y ^ crypto_int16_z;
  309. }
  310. GCC_ATTR_UNUSED
  311. static void crypto_int16_minmax(crypto_int16 *crypto_int16_a,crypto_int16 *crypto_int16_b)
  312. {
  313. crypto_int16 crypto_int16_x = *crypto_int16_a;
  314. crypto_int16 crypto_int16_y = *crypto_int16_b;
  315. crypto_int16 crypto_int16_xy = crypto_int16_y ^ crypto_int16_x;
  316. crypto_int16 crypto_int16_z = crypto_int16_y - crypto_int16_x;
  317. crypto_int16_z ^= crypto_int16_xy & (crypto_int16_z ^ crypto_int16_y);
  318. crypto_int16_z = crypto_int16_negative_mask(crypto_int16_z);
  319. crypto_int16_z &= crypto_int16_xy;
  320. *crypto_int16_a = crypto_int16_x ^ crypto_int16_z;
  321. *crypto_int16_b = crypto_int16_y ^ crypto_int16_z;
  322. }
  323. #endif
  324. /* from libmceliece-20230612/inttypes/crypto_intN.h */
  325. #ifndef crypto_int32_h
  326. #define crypto_int32_h
  327. #define crypto_int32 int32_t
  328. GCC_ATTR_UNUSED
  329. static crypto_int32 crypto_int32_negative_mask(crypto_int32 crypto_int32_x)
  330. {
  331. return crypto_int32_x >> (32-1);
  332. }
  333. GCC_ATTR_UNUSED
  334. static crypto_int32 crypto_int32_nonzero_mask(crypto_int32 crypto_int32_x)
  335. {
  336. return crypto_int32_negative_mask(crypto_int32_x) | crypto_int32_negative_mask(-crypto_int32_x);
  337. }
  338. GCC_ATTR_UNUSED
  339. static crypto_int32 crypto_int32_zero_mask(crypto_int32 crypto_int32_x)
  340. {
  341. return ~crypto_int32_nonzero_mask(crypto_int32_x);
  342. }
  343. GCC_ATTR_UNUSED
  344. static crypto_int32 crypto_int32_positive_mask(crypto_int32 crypto_int32_x)
  345. {
  346. crypto_int32 crypto_int32_z = -crypto_int32_x;
  347. crypto_int32_z ^= crypto_int32_x & crypto_int32_z;
  348. return crypto_int32_negative_mask(crypto_int32_z);
  349. }
  350. GCC_ATTR_UNUSED
  351. static crypto_int32 crypto_int32_unequal_mask(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_y)
  352. {
  353. crypto_int32 crypto_int32_xy = crypto_int32_x ^ crypto_int32_y;
  354. return crypto_int32_nonzero_mask(crypto_int32_xy);
  355. }
  356. GCC_ATTR_UNUSED
  357. static crypto_int32 crypto_int32_equal_mask(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_y)
  358. {
  359. return ~crypto_int32_unequal_mask(crypto_int32_x,crypto_int32_y);
  360. }
  361. GCC_ATTR_UNUSED
  362. static crypto_int32 crypto_int32_smaller_mask(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_y)
  363. {
  364. crypto_int32 crypto_int32_xy = crypto_int32_x ^ crypto_int32_y;
  365. crypto_int32 crypto_int32_z = crypto_int32_x - crypto_int32_y;
  366. crypto_int32_z ^= crypto_int32_xy & (crypto_int32_z ^ crypto_int32_x);
  367. return crypto_int32_negative_mask(crypto_int32_z);
  368. }
  369. GCC_ATTR_UNUSED
  370. static crypto_int32 crypto_int32_min(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_y)
  371. {
  372. crypto_int32 crypto_int32_xy = crypto_int32_y ^ crypto_int32_x;
  373. crypto_int32 crypto_int32_z = crypto_int32_y - crypto_int32_x;
  374. crypto_int32_z ^= crypto_int32_xy & (crypto_int32_z ^ crypto_int32_y);
  375. crypto_int32_z = crypto_int32_negative_mask(crypto_int32_z);
  376. crypto_int32_z &= crypto_int32_xy;
  377. return crypto_int32_x ^ crypto_int32_z;
  378. }
  379. GCC_ATTR_UNUSED
  380. static crypto_int32 crypto_int32_max(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_y)
  381. {
  382. crypto_int32 crypto_int32_xy = crypto_int32_y ^ crypto_int32_x;
  383. crypto_int32 crypto_int32_z = crypto_int32_y - crypto_int32_x;
  384. crypto_int32_z ^= crypto_int32_xy & (crypto_int32_z ^ crypto_int32_y);
  385. crypto_int32_z = crypto_int32_negative_mask(crypto_int32_z);
  386. crypto_int32_z &= crypto_int32_xy;
  387. return crypto_int32_y ^ crypto_int32_z;
  388. }
  389. GCC_ATTR_UNUSED
  390. static void crypto_int32_minmax(crypto_int32 *crypto_int32_a,crypto_int32 *crypto_int32_b)
  391. {
  392. crypto_int32 crypto_int32_x = *crypto_int32_a;
  393. crypto_int32 crypto_int32_y = *crypto_int32_b;
  394. crypto_int32 crypto_int32_xy = crypto_int32_y ^ crypto_int32_x;
  395. crypto_int32 crypto_int32_z = crypto_int32_y - crypto_int32_x;
  396. crypto_int32_z ^= crypto_int32_xy & (crypto_int32_z ^ crypto_int32_y);
  397. crypto_int32_z = crypto_int32_negative_mask(crypto_int32_z);
  398. crypto_int32_z &= crypto_int32_xy;
  399. *crypto_int32_a = crypto_int32_x ^ crypto_int32_z;
  400. *crypto_int32_b = crypto_int32_y ^ crypto_int32_z;
  401. }
  402. #endif
  403. /* from libmceliece-20230612/inttypes/crypto_uintN.h */
  404. #ifndef crypto_uint64_h
  405. #define crypto_uint64_h
  406. #define crypto_uint64 uint64_t
  407. #define crypto_uint64_signed int64_t
  408. GCC_ATTR_UNUSED
  409. static crypto_uint64_signed crypto_uint64_signed_negative_mask(crypto_uint64_signed crypto_uint64_signed_x)
  410. {
  411. return crypto_uint64_signed_x >> (64-1);
  412. }
  413. GCC_ATTR_UNUSED
  414. static crypto_uint64 crypto_uint64_nonzero_mask(crypto_uint64 crypto_uint64_x)
  415. {
  416. return crypto_uint64_signed_negative_mask(crypto_uint64_x) | crypto_uint64_signed_negative_mask(-crypto_uint64_x);
  417. }
  418. GCC_ATTR_UNUSED
  419. static crypto_uint64 crypto_uint64_zero_mask(crypto_uint64 crypto_uint64_x)
  420. {
  421. return ~crypto_uint64_nonzero_mask(crypto_uint64_x);
  422. }
  423. GCC_ATTR_UNUSED
  424. static crypto_uint64 crypto_uint64_unequal_mask(crypto_uint64 crypto_uint64_x,crypto_uint64 crypto_uint64_y)
  425. {
  426. crypto_uint64 crypto_uint64_xy = crypto_uint64_x ^ crypto_uint64_y;
  427. return crypto_uint64_nonzero_mask(crypto_uint64_xy);
  428. }
  429. GCC_ATTR_UNUSED
  430. static crypto_uint64 crypto_uint64_equal_mask(crypto_uint64 crypto_uint64_x,crypto_uint64 crypto_uint64_y)
  431. {
  432. return ~crypto_uint64_unequal_mask(crypto_uint64_x,crypto_uint64_y);
  433. }
  434. GCC_ATTR_UNUSED
  435. static crypto_uint64 crypto_uint64_smaller_mask(crypto_uint64 crypto_uint64_x,crypto_uint64 crypto_uint64_y)
  436. {
  437. crypto_uint64 crypto_uint64_xy = crypto_uint64_x ^ crypto_uint64_y;
  438. crypto_uint64 crypto_uint64_z = crypto_uint64_x - crypto_uint64_y;
  439. crypto_uint64_z ^= crypto_uint64_xy & (crypto_uint64_z ^ crypto_uint64_x ^ (((crypto_uint64) 1) << (64-1)));
  440. return crypto_uint64_signed_negative_mask(crypto_uint64_z);
  441. }
  442. GCC_ATTR_UNUSED
  443. static crypto_uint64 crypto_uint64_min(crypto_uint64 crypto_uint64_x,crypto_uint64 crypto_uint64_y)
  444. {
  445. crypto_uint64 crypto_uint64_xy = crypto_uint64_y ^ crypto_uint64_x;
  446. crypto_uint64 crypto_uint64_z = crypto_uint64_y - crypto_uint64_x;
  447. crypto_uint64_z ^= crypto_uint64_xy & (crypto_uint64_z ^ crypto_uint64_y ^ (((crypto_uint64) 1) << (64-1)));
  448. crypto_uint64_z = crypto_uint64_signed_negative_mask(crypto_uint64_z);
  449. crypto_uint64_z &= crypto_uint64_xy;
  450. return crypto_uint64_x ^ crypto_uint64_z;
  451. }
  452. GCC_ATTR_UNUSED
  453. static crypto_uint64 crypto_uint64_max(crypto_uint64 crypto_uint64_x,crypto_uint64 crypto_uint64_y)
  454. {
  455. crypto_uint64 crypto_uint64_xy = crypto_uint64_y ^ crypto_uint64_x;
  456. crypto_uint64 crypto_uint64_z = crypto_uint64_y - crypto_uint64_x;
  457. crypto_uint64_z ^= crypto_uint64_xy & (crypto_uint64_z ^ crypto_uint64_y ^ (((crypto_uint64) 1) << (64-1)));
  458. crypto_uint64_z = crypto_uint64_signed_negative_mask(crypto_uint64_z);
  459. crypto_uint64_z &= crypto_uint64_xy;
  460. return crypto_uint64_y ^ crypto_uint64_z;
  461. }
  462. GCC_ATTR_UNUSED
  463. static void crypto_uint64_minmax(crypto_uint64 *crypto_uint64_a,crypto_uint64 *crypto_uint64_b)
  464. {
  465. crypto_uint64 crypto_uint64_x = *crypto_uint64_a;
  466. crypto_uint64 crypto_uint64_y = *crypto_uint64_b;
  467. crypto_uint64 crypto_uint64_xy = crypto_uint64_y ^ crypto_uint64_x;
  468. crypto_uint64 crypto_uint64_z = crypto_uint64_y - crypto_uint64_x;
  469. crypto_uint64_z ^= crypto_uint64_xy & (crypto_uint64_z ^ crypto_uint64_y ^ (((crypto_uint64) 1) << (64-1)));
  470. crypto_uint64_z = crypto_uint64_signed_negative_mask(crypto_uint64_z);
  471. crypto_uint64_z &= crypto_uint64_xy;
  472. *crypto_uint64_a = crypto_uint64_x ^ crypto_uint64_z;
  473. *crypto_uint64_b = crypto_uint64_y ^ crypto_uint64_z;
  474. }
  475. #endif
  476. /* from libmceliece-20230612/inttypes/crypto_uintN.h */
  477. #ifndef crypto_uint16_h
  478. #define crypto_uint16_h
  479. #define crypto_uint16 uint16_t
  480. #define crypto_uint16_signed int16_t
  481. GCC_ATTR_UNUSED
  482. static crypto_uint16_signed crypto_uint16_signed_negative_mask(crypto_uint16_signed crypto_uint16_signed_x)
  483. {
  484. return crypto_uint16_signed_x >> (16-1);
  485. }
  486. GCC_ATTR_UNUSED
  487. static crypto_uint16 crypto_uint16_nonzero_mask(crypto_uint16 crypto_uint16_x)
  488. {
  489. return crypto_uint16_signed_negative_mask(crypto_uint16_x) | crypto_uint16_signed_negative_mask(-crypto_uint16_x);
  490. }
  491. GCC_ATTR_UNUSED
  492. static crypto_uint16 crypto_uint16_zero_mask(crypto_uint16 crypto_uint16_x)
  493. {
  494. return ~crypto_uint16_nonzero_mask(crypto_uint16_x);
  495. }
  496. GCC_ATTR_UNUSED
  497. static crypto_uint16 crypto_uint16_unequal_mask(crypto_uint16 crypto_uint16_x,crypto_uint16 crypto_uint16_y)
  498. {
  499. crypto_uint16 crypto_uint16_xy = crypto_uint16_x ^ crypto_uint16_y;
  500. return crypto_uint16_nonzero_mask(crypto_uint16_xy);
  501. }
  502. GCC_ATTR_UNUSED
  503. static crypto_uint16 crypto_uint16_equal_mask(crypto_uint16 crypto_uint16_x,crypto_uint16 crypto_uint16_y)
  504. {
  505. return ~crypto_uint16_unequal_mask(crypto_uint16_x,crypto_uint16_y);
  506. }
  507. GCC_ATTR_UNUSED
  508. static crypto_uint16 crypto_uint16_smaller_mask(crypto_uint16 crypto_uint16_x,crypto_uint16 crypto_uint16_y)
  509. {
  510. crypto_uint16 crypto_uint16_xy = crypto_uint16_x ^ crypto_uint16_y;
  511. crypto_uint16 crypto_uint16_z = crypto_uint16_x - crypto_uint16_y;
  512. crypto_uint16_z ^= crypto_uint16_xy & (crypto_uint16_z ^ crypto_uint16_x ^ (((crypto_uint16) 1) << (16-1)));
  513. return crypto_uint16_signed_negative_mask(crypto_uint16_z);
  514. }
  515. GCC_ATTR_UNUSED
  516. static crypto_uint16 crypto_uint16_min(crypto_uint16 crypto_uint16_x,crypto_uint16 crypto_uint16_y)
  517. {
  518. crypto_uint16 crypto_uint16_xy = crypto_uint16_y ^ crypto_uint16_x;
  519. crypto_uint16 crypto_uint16_z = crypto_uint16_y - crypto_uint16_x;
  520. crypto_uint16_z ^= crypto_uint16_xy & (crypto_uint16_z ^ crypto_uint16_y ^ (((crypto_uint16) 1) << (16-1)));
  521. crypto_uint16_z = crypto_uint16_signed_negative_mask(crypto_uint16_z);
  522. crypto_uint16_z &= crypto_uint16_xy;
  523. return crypto_uint16_x ^ crypto_uint16_z;
  524. }
  525. GCC_ATTR_UNUSED
  526. static crypto_uint16 crypto_uint16_max(crypto_uint16 crypto_uint16_x,crypto_uint16 crypto_uint16_y)
  527. {
  528. crypto_uint16 crypto_uint16_xy = crypto_uint16_y ^ crypto_uint16_x;
  529. crypto_uint16 crypto_uint16_z = crypto_uint16_y - crypto_uint16_x;
  530. crypto_uint16_z ^= crypto_uint16_xy & (crypto_uint16_z ^ crypto_uint16_y ^ (((crypto_uint16) 1) << (16-1)));
  531. crypto_uint16_z = crypto_uint16_signed_negative_mask(crypto_uint16_z);
  532. crypto_uint16_z &= crypto_uint16_xy;
  533. return crypto_uint16_y ^ crypto_uint16_z;
  534. }
  535. GCC_ATTR_UNUSED
  536. static void crypto_uint16_minmax(crypto_uint16 *crypto_uint16_a,crypto_uint16 *crypto_uint16_b)
  537. {
  538. crypto_uint16 crypto_uint16_x = *crypto_uint16_a;
  539. crypto_uint16 crypto_uint16_y = *crypto_uint16_b;
  540. crypto_uint16 crypto_uint16_xy = crypto_uint16_y ^ crypto_uint16_x;
  541. crypto_uint16 crypto_uint16_z = crypto_uint16_y - crypto_uint16_x;
  542. crypto_uint16_z ^= crypto_uint16_xy & (crypto_uint16_z ^ crypto_uint16_y ^ (((crypto_uint16) 1) << (16-1)));
  543. crypto_uint16_z = crypto_uint16_signed_negative_mask(crypto_uint16_z);
  544. crypto_uint16_z &= crypto_uint16_xy;
  545. *crypto_uint16_a = crypto_uint16_x ^ crypto_uint16_z;
  546. *crypto_uint16_b = crypto_uint16_y ^ crypto_uint16_z;
  547. }
  548. #endif
  549. /* from libmceliece-20230612/inttypes/crypto_uintN.h */
  550. #ifndef crypto_uint32_h
  551. #define crypto_uint32_h
  552. #define crypto_uint32 uint32_t
  553. #define crypto_uint32_signed int32_t
  554. GCC_ATTR_UNUSED
  555. static crypto_uint32_signed crypto_uint32_signed_negative_mask(crypto_uint32_signed crypto_uint32_signed_x)
  556. {
  557. return crypto_uint32_signed_x >> (32-1);
  558. }
  559. GCC_ATTR_UNUSED
  560. static crypto_uint32 crypto_uint32_nonzero_mask(crypto_uint32 crypto_uint32_x)
  561. {
  562. return crypto_uint32_signed_negative_mask(crypto_uint32_x) | crypto_uint32_signed_negative_mask(-crypto_uint32_x);
  563. }
  564. GCC_ATTR_UNUSED
  565. static crypto_uint32 crypto_uint32_zero_mask(crypto_uint32 crypto_uint32_x)
  566. {
  567. return ~crypto_uint32_nonzero_mask(crypto_uint32_x);
  568. }
  569. GCC_ATTR_UNUSED
  570. static crypto_uint32 crypto_uint32_unequal_mask(crypto_uint32 crypto_uint32_x,crypto_uint32 crypto_uint32_y)
  571. {
  572. crypto_uint32 crypto_uint32_xy = crypto_uint32_x ^ crypto_uint32_y;
  573. return crypto_uint32_nonzero_mask(crypto_uint32_xy);
  574. }
  575. GCC_ATTR_UNUSED
  576. static crypto_uint32 crypto_uint32_equal_mask(crypto_uint32 crypto_uint32_x,crypto_uint32 crypto_uint32_y)
  577. {
  578. return ~crypto_uint32_unequal_mask(crypto_uint32_x,crypto_uint32_y);
  579. }
  580. GCC_ATTR_UNUSED
  581. static crypto_uint32 crypto_uint32_smaller_mask(crypto_uint32 crypto_uint32_x,crypto_uint32 crypto_uint32_y)
  582. {
  583. crypto_uint32 crypto_uint32_xy = crypto_uint32_x ^ crypto_uint32_y;
  584. crypto_uint32 crypto_uint32_z = crypto_uint32_x - crypto_uint32_y;
  585. crypto_uint32_z ^= crypto_uint32_xy & (crypto_uint32_z ^ crypto_uint32_x ^ (((crypto_uint32) 1) << (32-1)));
  586. return crypto_uint32_signed_negative_mask(crypto_uint32_z);
  587. }
  588. GCC_ATTR_UNUSED
  589. static crypto_uint32 crypto_uint32_min(crypto_uint32 crypto_uint32_x,crypto_uint32 crypto_uint32_y)
  590. {
  591. crypto_uint32 crypto_uint32_xy = crypto_uint32_y ^ crypto_uint32_x;
  592. crypto_uint32 crypto_uint32_z = crypto_uint32_y - crypto_uint32_x;
  593. crypto_uint32_z ^= crypto_uint32_xy & (crypto_uint32_z ^ crypto_uint32_y ^ (((crypto_uint32) 1) << (32-1)));
  594. crypto_uint32_z = crypto_uint32_signed_negative_mask(crypto_uint32_z);
  595. crypto_uint32_z &= crypto_uint32_xy;
  596. return crypto_uint32_x ^ crypto_uint32_z;
  597. }
  598. GCC_ATTR_UNUSED
  599. static crypto_uint32 crypto_uint32_max(crypto_uint32 crypto_uint32_x,crypto_uint32 crypto_uint32_y)
  600. {
  601. crypto_uint32 crypto_uint32_xy = crypto_uint32_y ^ crypto_uint32_x;
  602. crypto_uint32 crypto_uint32_z = crypto_uint32_y - crypto_uint32_x;
  603. crypto_uint32_z ^= crypto_uint32_xy & (crypto_uint32_z ^ crypto_uint32_y ^ (((crypto_uint32) 1) << (32-1)));
  604. crypto_uint32_z = crypto_uint32_signed_negative_mask(crypto_uint32_z);
  605. crypto_uint32_z &= crypto_uint32_xy;
  606. return crypto_uint32_y ^ crypto_uint32_z;
  607. }
  608. GCC_ATTR_UNUSED
  609. static void crypto_uint32_minmax(crypto_uint32 *crypto_uint32_a,crypto_uint32 *crypto_uint32_b)
  610. {
  611. crypto_uint32 crypto_uint32_x = *crypto_uint32_a;
  612. crypto_uint32 crypto_uint32_y = *crypto_uint32_b;
  613. crypto_uint32 crypto_uint32_xy = crypto_uint32_y ^ crypto_uint32_x;
  614. crypto_uint32 crypto_uint32_z = crypto_uint32_y - crypto_uint32_x;
  615. crypto_uint32_z ^= crypto_uint32_xy & (crypto_uint32_z ^ crypto_uint32_y ^ (((crypto_uint32) 1) << (32-1)));
  616. crypto_uint32_z = crypto_uint32_signed_negative_mask(crypto_uint32_z);
  617. crypto_uint32_z &= crypto_uint32_xy;
  618. *crypto_uint32_a = crypto_uint32_x ^ crypto_uint32_z;
  619. *crypto_uint32_b = crypto_uint32_y ^ crypto_uint32_z;
  620. }
  621. #endif
  622. /* from libmceliece-20230612/crypto_kem/6688128f/vec/vec.h */
  623. #ifndef VEC_H
  624. #define VEC_H
  625. typedef uint64_t vec;
  626. static inline vec vec_setbits(vec b)
  627. {
  628. vec ret = -b;
  629. return ret;
  630. }
  631. static inline vec vec_set1_16b(uint16_t v)
  632. {
  633. vec ret;
  634. ret = v;
  635. ret |= ret << 16;
  636. ret |= ret << 32;
  637. return ret;
  638. }
  639. static inline void vec_copy(vec * out, vec * in)
  640. {
  641. int i;
  642. for (i = 0; i < GFBITS; i++)
  643. out[i] = in[i];
  644. }
  645. static inline vec vec_or_reduce(vec * a)
  646. {
  647. int i;
  648. vec ret;
  649. ret = a[0];
  650. for (i = 1; i < GFBITS; i++)
  651. ret |= a[i];
  652. return ret;
  653. }
  654. static inline int vec_testz(vec a)
  655. {
  656. a |= a >> 32;
  657. a |= a >> 16;
  658. a |= a >> 8;
  659. a |= a >> 4;
  660. a |= a >> 2;
  661. a |= a >> 1;
  662. return (a&1)^1;
  663. }
  664. static void vec_mul(vec *, const vec *, const vec *);
  665. static void vec_sq(vec *, vec *);
  666. static void vec_inv(vec *, vec *);
  667. #endif
  668. /* from libmceliece-20230612/crypto_kem/6688128f/vec/benes.h */
  669. /*
  670. This file is for Benes network related functions
  671. */
  672. #ifndef BENES_H
  673. #define BENES_H
  674. static void benes(vec *, const unsigned char *, int);
  675. #endif
  676. /* from libmceliece-20230612/crypto_kem/6688128f/vec/bm.h */
  677. /*
  678. This file is for the inversion-free Berlekamp-Massey algorithm
  679. see https://ieeexplore.ieee.org/document/87857
  680. */
  681. #ifndef BM_H
  682. #define BM_H
  683. static void bm(vec [][GFBITS], vec [][ GFBITS ]);
  684. #endif
  685. /* from libmceliece-20230612/crypto_kem/6688128f/vec/controlbits.h */
  686. /* This file is for implementing the Nassimi-Sahni algorithm */
  687. /* See David Nassimi, Sartaj Sahni "Parallel algorithms to set up the Benes permutationnetwork" */
  688. /* See also https://cr.yp.to/papers/controlbits-20200923.pdf */
  689. #ifndef CONTROLBITS_H
  690. #define CONTROLBITS_H
  691. #endif
  692. /* from libmceliece-20230612/crypto_kem/6688128f/vec/decrypt.h */
  693. /*
  694. This file is for Nieddereiter decryption
  695. */
  696. #ifndef DECRYPT_H
  697. #define DECRYPT_H
  698. static int decrypt(unsigned char *, const unsigned char *, const unsigned char *);
  699. #endif
  700. /* from libmceliece-20230612/crypto_kem/6688128f/vec/encrypt.h */
  701. /*
  702. This file is for Niederreiter encryption
  703. */
  704. /* 20230102 djb: rename encrypt() as pke_encrypt() */
  705. #ifndef ENCRYPT_H
  706. #define ENCRYPT_H
  707. static void pke_encrypt(unsigned char *, const unsigned char *, unsigned char *);
  708. #endif
  709. /* from libmceliece-20230612/crypto_kem/6688128f/vec/fft_consts.h */
  710. #ifndef fft_consts_h
  711. #define fft_consts_h
  712. #endif
  713. /* from libmceliece-20230612/crypto_kem/6688128f/vec/fft.h */
  714. /*
  715. This file is for the Gao-Mateer FFT
  716. sse http://www.math.clemson.edu/~sgao/papers/GM10.pdf
  717. */
  718. #ifndef FFT_H
  719. #define FFT_H
  720. static void fft(vec [][GFBITS], vec [][GFBITS]);
  721. #endif
  722. /* from libmceliece-20230612/crypto_kem/6688128f/vec/fft_powers.h */
  723. #ifndef fft_powers_h
  724. #define fft_powers_h
  725. #endif
  726. /* from libmceliece-20230612/crypto_kem/6688128f/vec/fft_scalars_2x.h */
  727. #ifndef fft_scalars_2x_h
  728. #define fft_scalars_2x_h
  729. #endif
  730. /* from libmceliece-20230612/crypto_kem/6688128f/vec/fft_scalars_4x.h */
  731. #ifndef fft_scalars_4x_h
  732. #define fft_scalars_4x_h
  733. #endif
  734. /* from libmceliece-20230612/crypto_kem/6688128f/vec/fft_tr.h */
  735. /*
  736. This file is for transpose of the Gao-Mateer FFT
  737. */
  738. #ifndef FFT_TR_H
  739. #define FFT_TR_H
  740. static void fft_tr(vec out[][GFBITS], vec in[][ GFBITS ]);
  741. #endif
  742. /* from libmceliece-20230612/crypto_kem/6688128f/vec/gf.h */
  743. /*
  744. This file is for functions for field arithmetic
  745. */
  746. /* 20221231 djb: const for GF_mul */
  747. #ifndef GF_H
  748. #define GF_H
  749. typedef uint16_t gf;
  750. gf gf_iszero(gf);
  751. gf gf_mul(gf, gf);
  752. gf gf_frac(gf, gf);
  753. gf gf_inv(gf);
  754. static void GF_mul(gf *, const gf *, const gf *);
  755. /* 2 field multiplications */
  756. static inline uint64_t gf_mul2(gf a, gf b0, gf b1)
  757. {
  758. int i;
  759. uint64_t tmp=0;
  760. uint64_t t0;
  761. uint64_t t1;
  762. uint64_t t;
  763. uint64_t mask = 0x0000000100000001;
  764. t0 = a;
  765. t1 = b1;
  766. t1 = (t1 << 32) | b0;
  767. for (i = 0; i < GFBITS; i++)
  768. {
  769. tmp ^= t0 * (t1 & mask);
  770. mask += mask;
  771. }
  772. /**/
  773. t = tmp & 0x01FF000001FF0000;
  774. tmp ^= (t >> 9) ^ (t >> 10) ^ (t >> 12) ^ (t >> 13);
  775. t = tmp & 0x0000E0000000E000;
  776. tmp ^= (t >> 9) ^ (t >> 10) ^ (t >> 12) ^ (t >> 13);
  777. return tmp & 0x00001FFF00001FFF;
  778. }
  779. #endif
  780. /* from libmceliece-20230612/crypto_kem/6688128f/vec/hash.h */
  781. #define shake crypto_xof_shake256
  782. #define crypto_hash_32b(out,in,inlen) \
  783. shake(out,32,in,inlen)
  784. /* from libmceliece-20230612/crypto_kem/6688128f/vec/int32_sort.h */
  785. #ifndef int32_sort_h
  786. #define int32_sort_h
  787. #define int32_MINMAX(a,b) \
  788. do { \
  789. int64_t ab = (int64_t)b ^ (int64_t)a; \
  790. int64_t c = (int64_t)b - (int64_t)a; \
  791. c ^= ab & (c ^ b); \
  792. c >>= 31; \
  793. c &= ab; \
  794. a ^= c; \
  795. b ^= c; \
  796. } while(0)
  797. static void int32_sort(int32_t *x,long long n)
  798. {
  799. long long top,p,q,r,i;
  800. if (n < 2) return;
  801. top = 1;
  802. while (top < n - top) top += top;
  803. for (p = top;p > 0;p >>= 1) {
  804. for (i = 0;i < n - p;++i)
  805. if (!(i & p))
  806. int32_MINMAX(x[i],x[i+p]);
  807. i = 0;
  808. for (q = top;q > p;q >>= 1) {
  809. for (;i < n - q;++i) {
  810. if (!(i & p)) {
  811. int32_t a = x[i + p];
  812. for (r = q;r > p;r >>= 1)
  813. int32_MINMAX(a,x[i+r]);
  814. x[i + p] = a;
  815. }
  816. }
  817. }
  818. }
  819. }
  820. #endif
  821. /* from libmceliece-20230612/crypto_kem/6688128f/vec/operations.h */
  822. #ifndef OPERATIONS_H
  823. #define OPERATIONS_H
  824. static void operation_enc(
  825. unsigned char *c,
  826. unsigned char *key,
  827. const unsigned char *pk
  828. );
  829. static void operation_dec(
  830. unsigned char *key,
  831. const unsigned char *c,
  832. const unsigned char *sk
  833. );
  834. static void operation_keypair
  835. (
  836. unsigned char *pk,
  837. unsigned char *sk
  838. );
  839. #endif
  840. /* from libmceliece-20230612/crypto_kem/6688128f/vec/pk_gen.h */
  841. /*
  842. This file is for public-key generation
  843. */
  844. #ifndef PK_GEN_H
  845. #define PK_GEN_H
  846. static int pk_gen(unsigned char *, const unsigned char *, uint32_t *, int16_t *, uint64_t *);
  847. #endif
  848. /* from libmceliece-20230612/crypto_kem/6688128f/vec/sk_gen.h */
  849. /*
  850. This file is for secret-key generation
  851. */
  852. #ifndef SK_GEN_H
  853. #define SK_GEN_H
  854. static int genpoly_gen(gf *, gf *);
  855. #endif
  856. /* from libmceliece-20230612/crypto_kem/6688128f/vec/transpose.h */
  857. /*
  858. This file is for matrix transposition
  859. */
  860. #ifndef TRANSPOSE_H
  861. #define TRANSPOSE_H
  862. /* input: in, a 64x64 matrix over GF(2) */
  863. /* output: out, transpose of in */
  864. static inline void transpose_64x64(uint64_t * out, uint64_t * in)
  865. {
  866. int i, j, s, d;
  867. uint64_t x, y;
  868. uint64_t masks[6][2] = {
  869. {0x5555555555555555, 0xAAAAAAAAAAAAAAAA},
  870. {0x3333333333333333, 0xCCCCCCCCCCCCCCCC},
  871. {0x0F0F0F0F0F0F0F0F, 0xF0F0F0F0F0F0F0F0},
  872. {0x00FF00FF00FF00FF, 0xFF00FF00FF00FF00},
  873. {0x0000FFFF0000FFFF, 0xFFFF0000FFFF0000},
  874. {0x00000000FFFFFFFF, 0xFFFFFFFF00000000}
  875. };
  876. for (i = 0; i < 64; i++)
  877. out[i] = in[i];
  878. for (d = 5; d >= 0; d--)
  879. {
  880. s = 1 << d;
  881. for (i = 0; i < 64; i += s*2)
  882. for (j = i; j < i+s; j++)
  883. {
  884. x = (out[j] & masks[d][0]) | ((out[j+s] & masks[d][0]) << s);
  885. y = ((out[j] & masks[d][1]) >> s) | (out[j+s] & masks[d][1]);
  886. out[j+0] = x;
  887. out[j+s] = y;
  888. }
  889. }
  890. }
  891. #endif
  892. /* from libmceliece-20230612/crypto_kem/6688128f/vec/uint16_sort.h */
  893. #ifndef uint16_sort_h
  894. #define uint16_sort_h
  895. #define uint16_MINMAX(a,b) \
  896. do { \
  897. uint16_t c = b - a; \
  898. c >>= 15; \
  899. c = -c; \
  900. c &= a ^ b; \
  901. a ^= c; \
  902. b ^= c; \
  903. } while(0)
  904. static void uint16_sort(uint16_t *x,long long n)
  905. {
  906. long long top,p,q,r,i;
  907. if (n < 2) return;
  908. top = 1;
  909. while (top < n - top) top += top;
  910. for (p = top;p > 0;p >>= 1) {
  911. for (i = 0;i < n - p;++i)
  912. if (!(i & p))
  913. uint16_MINMAX(x[i],x[i+p]);
  914. i = 0;
  915. for (q = top;q > p;q >>= 1) {
  916. for (;i < n - q;++i) {
  917. if (!(i & p)) {
  918. int16_t a = x[i + p];
  919. for (r = q;r > p;r >>= 1)
  920. uint16_MINMAX(a,x[i+r]);
  921. x[i + p] = a;
  922. }
  923. }
  924. }
  925. }
  926. }
  927. #endif
  928. /* from libmceliece-20230612/crypto_kem/6688128f/vec/uint64_sort.h */
  929. #ifndef uint64_sort_h
  930. #define uint64_sort_h
  931. #define uint64_MINMAX(a,b) \
  932. do { \
  933. uint64_t c = b - a; \
  934. c >>= 63; \
  935. c = -c; \
  936. c &= a ^ b; \
  937. a ^= c; \
  938. b ^= c; \
  939. } while(0)
  940. static void uint64_sort(uint64_t *x,long long n)
  941. {
  942. long long top,p,q,r,i;
  943. if (n < 2) return;
  944. top = 1;
  945. while (top < n - top) top += top;
  946. for (p = top;p > 0;p >>= 1) {
  947. for (i = 0;i < n - p;++i)
  948. if (!(i & p))
  949. uint64_MINMAX(x[i],x[i+p]);
  950. i = 0;
  951. for (q = top;q > p;q >>= 1) {
  952. for (;i < n - q;++i) {
  953. if (!(i & p)) {
  954. uint64_t a = x[i + p];
  955. for (r = q;r > p;r >>= 1)
  956. uint64_MINMAX(a,x[i+r]);
  957. x[i + p] = a;
  958. }
  959. }
  960. }
  961. }
  962. }
  963. #endif
  964. /* from libmceliece-20230612/crypto_kem/6688128f/vec/util.h */
  965. /*
  966. This file is for loading/storing data in a little-endian fashion
  967. */
  968. #ifndef UTIL_H
  969. #define UTIL_H
  970. static inline void store_i(unsigned char *out, uint64_t in, int i)
  971. {
  972. int j;
  973. for (j = 0; j < i; j++)
  974. out[j] = (in >> (j * 8)) & 0xFF;
  975. }
  976. static inline void store_gf(unsigned char *dest, uint16_t a)
  977. {
  978. dest[0] = a & 0xFF;
  979. dest[1] = a >> 8;
  980. }
  981. static inline uint16_t load_gf(const unsigned char *src)
  982. {
  983. uint16_t a;
  984. a = src[1];
  985. a <<= 8;
  986. a |= src[0];
  987. return a & GFMASK;
  988. }
  989. static inline uint32_t load4(const unsigned char *src)
  990. {
  991. uint32_t a;
  992. a = src[3]; a <<= 8;
  993. a |= src[2]; a <<= 8;
  994. a |= src[1]; a <<= 8;
  995. a |= src[0];
  996. return a;
  997. }
  998. static inline void irr_load(vec out[][GFBITS], const unsigned char * in)
  999. {
  1000. int i, j;
  1001. uint64_t v0 = 0, v1 = 0;
  1002. uint16_t irr[ SYS_T ];
  1003. for (i = 0; i < SYS_T; i++)
  1004. irr[i] = load_gf(in + i*2);
  1005. for (i = 0; i < GFBITS; i++)
  1006. {
  1007. for (j = 63; j >= 0; j--)
  1008. {
  1009. v0 <<= 1;
  1010. v1 <<= 1;
  1011. v0 |= (irr[j] >> i) & 1;
  1012. v1 |= (irr[j+64] >> i) & 1;
  1013. }
  1014. out[0][i] = v0;
  1015. out[1][i] = v1;
  1016. }
  1017. }
  1018. static inline void store8(unsigned char *out, uint64_t in)
  1019. {
  1020. out[0] = (in >> 0x00) & 0xFF;
  1021. out[1] = (in >> 0x08) & 0xFF;
  1022. out[2] = (in >> 0x10) & 0xFF;
  1023. out[3] = (in >> 0x18) & 0xFF;
  1024. out[4] = (in >> 0x20) & 0xFF;
  1025. out[5] = (in >> 0x28) & 0xFF;
  1026. out[6] = (in >> 0x30) & 0xFF;
  1027. out[7] = (in >> 0x38) & 0xFF;
  1028. }
  1029. static inline uint64_t load8(const unsigned char * in)
  1030. {
  1031. int i;
  1032. uint64_t ret = in[7];
  1033. for (i = 6; i >= 0; i--)
  1034. {
  1035. ret <<= 8;
  1036. ret |= in[i];
  1037. }
  1038. return ret;
  1039. }
  1040. #endif
  1041. static void crypto_xof_shake256(unsigned char *h,long long hlen,
  1042. const unsigned char *m,long long mlen)
  1043. {
  1044. gcry_md_hd_t mdh;
  1045. gcry_err_code_t ec;
  1046. ec = _gcry_md_open (&mdh, GCRY_MD_SHAKE256, 0);
  1047. if (ec)
  1048. log_fatal ("internal md_open failed: %d\n", ec);
  1049. _gcry_md_write (mdh, m, mlen);
  1050. _gcry_md_extract (mdh, GCRY_MD_SHAKE256, h, hlen);
  1051. _gcry_md_close (mdh);
  1052. }
  1053. /* from libmceliece-20230612/crypto_kem/6688128f/vec/benes.c */
  1054. /*
  1055. This file is for Benes network related functions
  1056. For the implementation strategy, see
  1057. https://eprint.iacr.org/2017/793.pdf
  1058. */
  1059. /* 20221230 djb: add linker lines */
  1060. /* linker define benes */
  1061. /* middle layers of the benes network */
  1062. static void layer_in(uint64_t data[2][64], uint64_t * bits, int lgs)
  1063. {
  1064. int i, j, s;
  1065. uint64_t d;
  1066. s = 1 << lgs;
  1067. for (i = 0; i < 64; i += s*2)
  1068. for (j = i; j < i+s; j++)
  1069. {
  1070. d = (data[0][j+0] ^ data[0][j+s]);
  1071. d &= (*bits++);
  1072. data[0][j+0] ^= d;
  1073. data[0][j+s] ^= d;
  1074. d = (data[1][j+0] ^ data[1][j+s]);
  1075. d &= (*bits++);
  1076. data[1][j+0] ^= d;
  1077. data[1][j+s] ^= d;
  1078. }
  1079. }
  1080. /* first and last layers of the benes network */
  1081. static void layer_ex(uint64_t * data, uint64_t * bits, int lgs)
  1082. {
  1083. int i, j, s;
  1084. uint64_t d;
  1085. s = 1 << lgs;
  1086. for (i = 0; i < 128; i += s*2)
  1087. for (j = i; j < i+s; j++)
  1088. {
  1089. d = (data[j+0] ^ data[j+s]);
  1090. d &= (*bits++);
  1091. data[j+0] ^= d;
  1092. data[j+s] ^= d;
  1093. }
  1094. }
  1095. /* input: r, sequence of bits to be permuted */
  1096. /* bits, condition bits of the Benes network */
  1097. /* rev, 0 for normal application; !0 for inverse */
  1098. /* output: r, permuted bits */
  1099. static void benes(vec * r, const unsigned char * bits, int rev)
  1100. {
  1101. int i, iter, inc;
  1102. const unsigned char *bits_ptr;
  1103. uint64_t r_int_v[2][64];
  1104. uint64_t r_int_h[2][64];
  1105. uint64_t b_int_v[64];
  1106. uint64_t b_int_h[64];
  1107. /**/
  1108. if (rev) { bits_ptr = bits + 12288; inc = -1024; }
  1109. else { bits_ptr = bits; inc = 0; }
  1110. for (i = 0; i < 64; i++)
  1111. {
  1112. r_int_v[0][i] = r[i*2 + 0];
  1113. r_int_v[1][i] = r[i*2 + 1];
  1114. }
  1115. transpose_64x64(r_int_h[0], r_int_v[0]);
  1116. transpose_64x64(r_int_h[1], r_int_v[1]);
  1117. for (iter = 0; iter <= 6; iter++)
  1118. {
  1119. for (i = 0; i < 64; i++)
  1120. {
  1121. b_int_v[i] = load8(bits_ptr); bits_ptr += 8;
  1122. }
  1123. bits_ptr += inc;
  1124. transpose_64x64(b_int_h, b_int_v);
  1125. layer_ex(r_int_h[0], b_int_h, iter);
  1126. }
  1127. transpose_64x64(r_int_v[0], r_int_h[0]);
  1128. transpose_64x64(r_int_v[1], r_int_h[1]);
  1129. for (iter = 0; iter <= 5; iter++)
  1130. {
  1131. for (i = 0; i < 64; i++) { b_int_v[i] = load8(bits_ptr); bits_ptr += 8; }
  1132. bits_ptr += inc;
  1133. layer_in(r_int_v, b_int_v, iter);
  1134. }
  1135. for (iter = 4; iter >= 0; iter--)
  1136. {
  1137. for (i = 0; i < 64; i++) { b_int_v[i] = load8(bits_ptr); bits_ptr += 8; }
  1138. bits_ptr += inc;
  1139. layer_in(r_int_v, b_int_v, iter);
  1140. }
  1141. transpose_64x64(r_int_h[0], r_int_v[0]);
  1142. transpose_64x64(r_int_h[1], r_int_v[1]);
  1143. for (iter = 6; iter >= 0; iter--)
  1144. {
  1145. for (i = 0; i < 64; i++)
  1146. {
  1147. b_int_v[i] = load8(bits_ptr); bits_ptr += 8;
  1148. }
  1149. bits_ptr += inc;
  1150. transpose_64x64(b_int_h, b_int_v);
  1151. layer_ex(r_int_h[0], b_int_h, iter);
  1152. }
  1153. transpose_64x64(r_int_v[0], r_int_h[0]);
  1154. transpose_64x64(r_int_v[1], r_int_h[1]);
  1155. for (i = 0; i < 64; i++)
  1156. {
  1157. r[i*2+0] = r_int_v[0][i];
  1158. r[i*2+1] = r_int_v[1][i];
  1159. }
  1160. }
  1161. /* from libmceliece-20230612/crypto_kem/6688128f/vec/bm.c */
  1162. /*
  1163. This file is for implementating the inversion-free Berlekamp-Massey algorithm
  1164. see https://ieeexplore.ieee.org/document/87857
  1165. For the implementation strategy, see
  1166. https://eprint.iacr.org/2017/793.pdf
  1167. */
  1168. /* 20221230 djb: add linker lines */
  1169. /* linker define bm */
  1170. /* linker use vec_mul */
  1171. /* linker use gf_inv */
  1172. static inline uint16_t mask_nonzero(gf a)
  1173. {
  1174. uint32_t ret = a;
  1175. ret -= 1;
  1176. ret >>= 31;
  1177. ret -= 1;
  1178. return ret;
  1179. }
  1180. static inline uint16_t mask_leq(uint16_t a, uint16_t b)
  1181. {
  1182. uint32_t a_tmp = a;
  1183. uint32_t b_tmp = b;
  1184. uint32_t ret = b_tmp - a_tmp;
  1185. ret >>= 31;
  1186. ret -= 1;
  1187. return ret;
  1188. }
  1189. static inline void vec_cmov(vec * out, vec * in, uint16_t mask)
  1190. {
  1191. int i;
  1192. vec m0, m1;
  1193. m0 = vec_set1_16b(mask);
  1194. m1 = ~m0;
  1195. for (i = 0; i < GFBITS; i++)
  1196. {
  1197. out[i] = (in[i] & m0) | (out[i] & m1);
  1198. out[i] = (in[i] & m0) | (out[i] & m1);
  1199. }
  1200. }
  1201. static inline void interleave(vec *in, int idx0, int idx1, vec *mask, int b)
  1202. {
  1203. int s = 1 << b;
  1204. vec x, y;
  1205. x = (in[idx0] & mask[0]) | ((in[idx1] & mask[0]) << s);
  1206. y = ((in[idx0] & mask[1]) >> s) | (in[idx1] & mask[1]);
  1207. in[idx0] = x;
  1208. in[idx1] = y;
  1209. }
  1210. /* input: in, field elements in bitsliced form */
  1211. /* output: out, field elements in non-bitsliced form */
  1212. static inline void get_coefs(gf *out, vec *in)
  1213. {
  1214. int i, k;
  1215. vec mask[4][2];
  1216. vec buf[16];
  1217. for (i = 0; i < 13; i++) buf[i] = in[i];
  1218. for (i = 13; i < 16; i++) buf[i] = 0;
  1219. mask[0][0] = vec_set1_16b(0x5555);
  1220. mask[0][1] = vec_set1_16b(0xAAAA);
  1221. mask[1][0] = vec_set1_16b(0x3333);
  1222. mask[1][1] = vec_set1_16b(0xCCCC);
  1223. mask[2][0] = vec_set1_16b(0x0F0F);
  1224. mask[2][1] = vec_set1_16b(0xF0F0);
  1225. mask[3][0] = vec_set1_16b(0x00FF);
  1226. mask[3][1] = vec_set1_16b(0xFF00);
  1227. interleave(buf, 0, 8, mask[3], 3);
  1228. interleave(buf, 1, 9, mask[3], 3);
  1229. interleave(buf, 2, 10, mask[3], 3);
  1230. interleave(buf, 3, 11, mask[3], 3);
  1231. interleave(buf, 4, 12, mask[3], 3);
  1232. interleave(buf, 5, 13, mask[3], 3);
  1233. interleave(buf, 6, 14, mask[3], 3);
  1234. interleave(buf, 7, 15, mask[3], 3);
  1235. interleave(buf, 0, 4, mask[2], 2);
  1236. interleave(buf, 1, 5, mask[2], 2);
  1237. interleave(buf, 2, 6, mask[2], 2);
  1238. interleave(buf, 3, 7, mask[2], 2);
  1239. interleave(buf, 8, 12, mask[2], 2);
  1240. interleave(buf, 9, 13, mask[2], 2);
  1241. interleave(buf, 10, 14, mask[2], 2);
  1242. interleave(buf, 11, 15, mask[2], 2);
  1243. interleave(buf, 0, 2, mask[1], 1);
  1244. interleave(buf, 1, 3, mask[1], 1);
  1245. interleave(buf, 4, 6, mask[1], 1);
  1246. interleave(buf, 5, 7, mask[1], 1);
  1247. interleave(buf, 8, 10, mask[1], 1);
  1248. interleave(buf, 9, 11, mask[1], 1);
  1249. interleave(buf, 12, 14, mask[1], 1);
  1250. interleave(buf, 13, 15, mask[1], 1);
  1251. interleave(buf, 0, 1, mask[0], 0);
  1252. interleave(buf, 2, 3, mask[0], 0);
  1253. interleave(buf, 4, 5, mask[0], 0);
  1254. interleave(buf, 6, 7, mask[0], 0);
  1255. interleave(buf, 8, 9, mask[0], 0);
  1256. interleave(buf, 10, 11, mask[0], 0);
  1257. interleave(buf, 12, 13, mask[0], 0);
  1258. interleave(buf, 14, 15, mask[0], 0);
  1259. for (i = 0; i < 16; i++)
  1260. for (k = 0; k < 4; k++)
  1261. out[ k*16 + i ] = (buf[i] >> (k*16)) & GFMASK;
  1262. }
  1263. static void update(vec in[][GFBITS], const gf e)
  1264. {
  1265. int i;
  1266. vec tmp;
  1267. for (i = 0; i < GFBITS; i++)
  1268. {
  1269. tmp = (e >> i) & 1;
  1270. in[0][i] = (in[0][i] >> 1) | (in[1][i] << 63);
  1271. in[1][i] = (in[1][i] >> 1) | (tmp << 63);
  1272. }
  1273. }
  1274. static inline gf vec_reduce(vec in[][GFBITS])
  1275. {
  1276. int i;
  1277. vec tmp;
  1278. gf ret = 0;
  1279. for (i = GFBITS-1; i >= 0; i--)
  1280. {
  1281. tmp = in[0][i] ^ in[1][i];
  1282. tmp ^= tmp >> 32;
  1283. tmp ^= tmp >> 16;
  1284. tmp ^= tmp >> 8;
  1285. tmp ^= tmp >> 4;
  1286. tmp ^= tmp >> 2;
  1287. tmp ^= tmp >> 1;
  1288. ret <<= 1;
  1289. ret |= tmp & 1;
  1290. }
  1291. return ret;
  1292. }
  1293. /* input: in, sequence of field elements */
  1294. /* output: out, minimal polynomial of in */
  1295. static void bm(vec out[][ GFBITS ], vec in[][ GFBITS ])
  1296. {
  1297. int i;
  1298. uint16_t N, L;
  1299. uint16_t mask;
  1300. uint64_t one = 1, t;
  1301. vec prod[2][GFBITS];
  1302. vec interval[2][GFBITS];
  1303. vec dd[2][GFBITS], bb[2][GFBITS];
  1304. vec B[2][GFBITS], C[2][GFBITS];
  1305. vec B_tmp[2][GFBITS], C_tmp[2][GFBITS];
  1306. vec v[GFBITS];
  1307. gf d, b, c0 = 1;
  1308. gf coefs[256];
  1309. /* initialization */
  1310. get_coefs(&coefs[ 0], in[0]);
  1311. get_coefs(&coefs[ 64], in[1]);
  1312. get_coefs(&coefs[128], in[2]);
  1313. get_coefs(&coefs[192], in[3]);
  1314. C[0][0] = 0;
  1315. C[1][0] = 0;
  1316. B[0][0] = 0;
  1317. B[1][0] = one << 63;
  1318. for (i = 1; i < GFBITS; i++)
  1319. C[0][i] = C[1][i] = B[0][i] = B[1][i] = 0;
  1320. b = 1;
  1321. L = 0;
  1322. /**/
  1323. for (i = 0; i < GFBITS; i++)
  1324. interval[0][i] = interval[1][i] = 0;
  1325. for (N = 0; N < 256; N++)
  1326. {
  1327. vec_mul(prod[0], C[0], interval[0]);
  1328. vec_mul(prod[1], C[1], interval[1]);
  1329. update(interval, coefs[N]);
  1330. d = vec_reduce(prod);
  1331. t = gf_mul2(c0, coefs[N], b);
  1332. d ^= t & 0xFFFFFFFF;
  1333. mask = mask_nonzero(d) & mask_leq(L*2, N);
  1334. for (i = 0; i < GFBITS; i++)
  1335. {
  1336. dd[0][i] = dd[1][i] = vec_setbits((d >> i) & 1);
  1337. bb[0][i] = bb[1][i] = vec_setbits((b >> i) & 1);
  1338. }
  1339. vec_mul(B_tmp[0], dd[0], B[0]);
  1340. vec_mul(B_tmp[1], dd[1], B[1]);
  1341. vec_mul(C_tmp[0], bb[0], C[0]);
  1342. vec_mul(C_tmp[1], bb[1], C[1]);
  1343. vec_cmov(B[0], C[0], mask);
  1344. vec_cmov(B[1], C[1], mask);
  1345. update(B, c0 & mask);
  1346. for (i = 0; i < GFBITS; i++)
  1347. {
  1348. C[0][i] = B_tmp[0][i] ^ C_tmp[0][i];
  1349. C[1][i] = B_tmp[1][i] ^ C_tmp[1][i];
  1350. }
  1351. c0 = t >> 32;
  1352. b = (d & mask) | (b & ~mask);
  1353. L = ((N+1-L) & mask) | (L & ~mask);
  1354. }
  1355. c0 = gf_inv(c0);
  1356. for (i = 0; i < GFBITS; i++)
  1357. v[i] = vec_setbits((c0 >> i) & 1);
  1358. vec_mul(out[0], C[0], v);
  1359. vec_mul(out[1], C[1], v);
  1360. }
  1361. /* from libmceliece-20230612/crypto_kem/6688128f/vec/controlbits.c */
  1362. /* This file is for implementing the Nassimi-Sahni algorithm */
  1363. /* See David Nassimi, Sartaj Sahni "Parallel algorithms to set up the Benes permutationnetwork" */
  1364. /* See also https://cr.yp.to/papers/controlbits-20200923.pdf */
  1365. /* 20221230 djb: add linker line */
  1366. /* linker define controlbitsfrompermutation */
  1367. typedef int16_t int16;
  1368. typedef int32_t int32;
  1369. #define int32_min crypto_int32_min
  1370. /* parameters: 1 <= w <= 14; n = 2^w */
  1371. /* input: permutation pi of {0,1,...,n-1} */
  1372. /* output: (2m-1)n/2 control bits at positions pos,pos+step,... */
  1373. /* output position pos is by definition 1&(out[pos/8]>>(pos&7)) */
  1374. /* caller must 0-initialize positions first */
  1375. /* temp must have space for int32[2*n] */
  1376. static void cbrecursion(unsigned char *out,long long pos,long long step,const int16 *pi,long long w,long long n,int32 *temp)
  1377. {
  1378. #define A temp
  1379. #define B (temp+n)
  1380. #define q ((int16 *) (temp+n+n/4))
  1381. /* q can start anywhere between temp+n and temp+n/2 */
  1382. long long x,i,j,k;
  1383. if (w == 1) {
  1384. out[pos>>3] ^= pi[0]<<(pos&7);
  1385. return;
  1386. }
  1387. for (x = 0;x < n;++x) A[x] = ((pi[x]^1)<<16)|pi[x^1];
  1388. int32_sort(A,n); /* A = (id<<16)+pibar */
  1389. for (x = 0;x < n;++x) {
  1390. int32 Ax = A[x];
  1391. int32 px = Ax&0xffff;
  1392. int32 cx = int32_min(px,x);
  1393. B[x] = (px<<16)|cx;
  1394. }
  1395. /* B = (p<<16)+c */
  1396. for (x = 0;x < n;++x) A[x] = (A[x]<<16)|x; /* A = (pibar<<16)+id */
  1397. int32_sort(A,n); /* A = (id<<16)+pibar^-1 */
  1398. for (x = 0;x < n;++x) A[x] = (A[x]<<16)+(B[x]>>16); /* A = (pibar^(-1)<<16)+pibar */
  1399. int32_sort(A,n); /* A = (id<<16)+pibar^2 */
  1400. if (w <= 10) {
  1401. for (x = 0;x < n;++x) B[x] = ((A[x]&0xffff)<<10)|(B[x]&0x3ff);
  1402. for (i = 1;i < w-1;++i) {
  1403. /* B = (p<<10)+c */
  1404. for (x = 0;x < n;++x) A[x] = ((B[x]&~0x3ff)<<6)|x; /* A = (p<<16)+id */
  1405. int32_sort(A,n); /* A = (id<<16)+p^{-1} */
  1406. for (x = 0;x < n;++x) A[x] = (A[x]<<20)|B[x]; /* A = (p^{-1}<<20)+(p<<10)+c */
  1407. int32_sort(A,n); /* A = (id<<20)+(pp<<10)+cp */
  1408. for (x = 0;x < n;++x) {
  1409. int32 ppcpx = A[x]&0xfffff;
  1410. int32 ppcx = (A[x]&0xffc00)|(B[x]&0x3ff);
  1411. B[x] = int32_min(ppcx,ppcpx);
  1412. }
  1413. }
  1414. for (x = 0;x < n;++x) B[x] &= 0x3ff;
  1415. } else {
  1416. for (x = 0;x < n;++x) B[x] = (A[x]<<16)|(B[x]&0xffff);
  1417. for (i = 1;i < w-1;++i) {
  1418. /* B = (p<<16)+c */
  1419. for (x = 0;x < n;++x) A[x] = (B[x]&~0xffff)|x;
  1420. int32_sort(A,n); /* A = (id<<16)+p^(-1) */
  1421. for (x = 0;x < n;++x) A[x] = (A[x]<<16)|(B[x]&0xffff);
  1422. /* A = p^(-1)<<16+c */
  1423. if (i < w-2) {
  1424. for (x = 0;x < n;++x) B[x] = (A[x]&~0xffff)|(B[x]>>16);
  1425. /* B = (p^(-1)<<16)+p */
  1426. int32_sort(B,n); /* B = (id<<16)+p^(-2) */
  1427. for (x = 0;x < n;++x) B[x] = (B[x]<<16)|(A[x]&0xffff);
  1428. /* B = (p^(-2)<<16)+c */
  1429. }
  1430. int32_sort(A,n);
  1431. /* A = id<<16+cp */
  1432. for (x = 0;x < n;++x) {
  1433. int32 cpx = (B[x]&~0xffff)|(A[x]&0xffff);
  1434. B[x] = int32_min(B[x],cpx);
  1435. }
  1436. }
  1437. for (x = 0;x < n;++x) B[x] &= 0xffff;
  1438. }
  1439. for (x = 0;x < n;++x) A[x] = (((int32)pi[x])<<16)+x;
  1440. int32_sort(A,n); /* A = (id<<16)+pi^(-1) */
  1441. for (j = 0;j < n/2;++j) {
  1442. long long lx = 2*j;
  1443. int32 fj = B[lx]&1; /* f[j] */
  1444. int32 Fx = lx+fj; /* F[x] */
  1445. int32 Fx1 = Fx^1; /* F[x+1] */
  1446. out[pos>>3] ^= fj<<(pos&7);
  1447. pos += step;
  1448. B[lx] = (A[lx]<<16)|Fx;
  1449. B[lx+1] = (A[lx+1]<<16)|Fx1;
  1450. }
  1451. /* B = (pi^(-1)<<16)+F */
  1452. int32_sort(B,n); /* B = (id<<16)+F(pi) */
  1453. pos += (2*w-3)*step*(n/2);
  1454. for (k = 0;k < n/2;++k) {
  1455. long long y = 2*k;
  1456. int32 lk = B[y]&1; /* l[k] */
  1457. int32 Ly = y+lk; /* L[y] */
  1458. int32 Ly1 = Ly^1; /* L[y+1] */
  1459. out[pos>>3] ^= lk<<(pos&7);
  1460. pos += step;
  1461. A[y] = (Ly<<16)|(B[y]&0xffff);
  1462. A[y+1] = (Ly1<<16)|(B[y+1]&0xffff);
  1463. }
  1464. /* A = (L<<16)+F(pi) */
  1465. int32_sort(A,n); /* A = (id<<16)+F(pi(L)) = (id<<16)+M */
  1466. pos -= (2*w-2)*step*(n/2);
  1467. for (j = 0;j < n/2;++j) {
  1468. q[j] = (A[2*j]&0xffff)>>1;
  1469. q[j+n/2] = (A[2*j+1]&0xffff)>>1;
  1470. }
  1471. cbrecursion(out,pos,step*2,q,w-1,n/2,temp);
  1472. cbrecursion(out,pos+step,step*2,q+n/2,w-1,n/2,temp);
  1473. }
  1474. /* input: p, an array of int16 */
  1475. /* input: n, length of p */
  1476. /* input: s, meaning that stride-2^s cswaps are performed */
  1477. /* input: cb, the control bits */
  1478. /* output: the result of apply the control bits to p */
  1479. static void layer(int16_t *p, const unsigned char *cb, int s, int n)
  1480. {
  1481. int i, j;
  1482. int stride = 1 << s;
  1483. int index = 0;
  1484. int16_t d, m;
  1485. for (i = 0; i < n; i += stride*2)
  1486. {
  1487. for (j = 0; j < stride; j++)
  1488. {
  1489. d = p[ i+j ] ^ p[ i+j+stride ];
  1490. m = (cb[ index >> 3 ] >> (index & 7)) & 1;
  1491. m = -m;
  1492. d &= m;
  1493. p[ i+j ] ^= d;
  1494. p[ i+j+stride ] ^= d;
  1495. index++;
  1496. }
  1497. }
  1498. }
  1499. /* parameters: 1 <= w <= 14; n = 2^w */
  1500. /* input: permutation pi of {0,1,...,n-1} */
  1501. /* output: (2m-1)n/2 control bits at positions 0,1,... */
  1502. /* output position pos is by definition 1&(out[pos/8]>>(pos&7)) */
  1503. static void controlbitsfrompermutation(unsigned char *out,const int16 *pi,long long w,long long n)
  1504. {
  1505. int32 temp[2*n];
  1506. int16 pi_test[n], diff;
  1507. int i;
  1508. unsigned char *ptr;
  1509. while (1)
  1510. {
  1511. memset(out,0,(((2*w-1)*n/2)+7)/8);
  1512. cbrecursion(out,0,1,pi,w,n,temp);
  1513. /* check for correctness */
  1514. for (i = 0; i < n; i++)
  1515. pi_test[i] = i;
  1516. ptr = out;
  1517. for (i = 0; i < w; i++)
  1518. {
  1519. layer(pi_test, ptr, i, n);
  1520. ptr += n >> 4;
  1521. }
  1522. for (i = w-2; i >= 0; i--)
  1523. {
  1524. layer(pi_test, ptr, i, n);
  1525. ptr += n >> 4;
  1526. }
  1527. diff = 0;
  1528. for (i = 0; i < n; i++)
  1529. diff |= pi[i] ^ pi_test[i];
  1530. diff = crypto_int16_nonzero_mask(diff);
  1531. crypto_declassify(&diff,sizeof diff);
  1532. if (diff == 0)
  1533. break;
  1534. }
  1535. }
  1536. #undef A
  1537. #undef B
  1538. #undef q
  1539. /* from libmceliece-20230612/crypto_kem/6688128f/vec/decrypt.c */
  1540. /*
  1541. This file is for Niederreiter decryption
  1542. */
  1543. /* 20221230 djb: add linker lines */
  1544. /* linker define decrypt */
  1545. /* linker use benes bm fft fft_tr */
  1546. /* linker use vec_mul vec_sq vec_inv */
  1547. static void scaling(vec out[][GFBITS], vec inv[][GFBITS], const unsigned char *sk, vec *recv)
  1548. {
  1549. int i, j;
  1550. vec irr_int[2][ GFBITS ];
  1551. vec eval[128][ GFBITS ];
  1552. vec tmp[ GFBITS ];
  1553. /**/
  1554. irr_load(irr_int, sk);
  1555. fft(eval, irr_int);
  1556. for (i = 0; i < 128; i++)
  1557. vec_sq(eval[i], eval[i]);
  1558. vec_copy(inv[0], eval[0]);
  1559. for (i = 1; i < 128; i++)
  1560. vec_mul(inv[i], inv[i-1], eval[i]);
  1561. vec_inv(tmp, inv[127]);
  1562. for (i = 126; i >= 0; i--)
  1563. {
  1564. vec_mul(inv[i+1], tmp, inv[i]);
  1565. vec_mul(tmp, tmp, eval[i+1]);
  1566. }
  1567. vec_copy(inv[0], tmp);
  1568. /**/
  1569. for (i = 0; i < 128; i++)
  1570. for (j = 0; j < GFBITS; j++)
  1571. out[i][j] = inv[i][j] & recv[i];
  1572. }
  1573. static void preprocess(vec *recv, const unsigned char *s)
  1574. {
  1575. int i;
  1576. unsigned char r[ 1024 ];
  1577. for (i = 0; i < SYND_BYTES; i++)
  1578. r[i] = s[i];
  1579. for (i = SYND_BYTES; i < 1024; i++)
  1580. r[i] = 0;
  1581. for (i = 0; i < 128; i++)
  1582. recv[i] = load8(r + i*8);
  1583. }
  1584. static void postprocess(unsigned char * e, vec * err)
  1585. {
  1586. int i;
  1587. unsigned char error8[ (1 << GFBITS)/8 ];
  1588. for (i = 0; i < 128; i++)
  1589. store8(error8 + i*8, err[i]);
  1590. for (i = 0; i < SYS_N/8; i++)
  1591. e[i] = error8[i];
  1592. }
  1593. static void scaling_inv(vec out[][GFBITS], vec inv[][GFBITS], vec *recv)
  1594. {
  1595. int i, j;
  1596. for (i = 0; i < 128; i++)
  1597. for (j = 0; j < GFBITS; j++)
  1598. out[i][j] = inv[i][j] & recv[i];
  1599. }
  1600. static int weight_check(unsigned char * e, vec * error)
  1601. {
  1602. int i;
  1603. uint16_t w0 = 0;
  1604. uint16_t w1 = 0;
  1605. uint16_t check;
  1606. for (i = 0; i < (1 << GFBITS); i++)
  1607. w0 += (error[i/64] >> (i%64)) & 1;
  1608. for (i = 0; i < SYS_N; i++)
  1609. w1 += (e[i/8] >> (i%8)) & 1;
  1610. check = (w0 ^ SYS_T) | (w1 ^ SYS_T);
  1611. check -= 1;
  1612. check >>= 15;
  1613. return check;
  1614. }
  1615. static uint16_t synd_cmp(vec s0[][ GFBITS ] , vec s1[][ GFBITS ])
  1616. {
  1617. int i, j;
  1618. vec diff = 0;
  1619. for (i = 0; i < 4; i++)
  1620. for (j = 0; j < GFBITS; j++)
  1621. diff |= (s0[i][j] ^ s1[i][j]);
  1622. return vec_testz(diff);
  1623. }
  1624. /* Niederreiter decryption with the Berlekamp decoder */
  1625. /* intput: sk, secret key */
  1626. /* s, ciphertext (syndrome) */
  1627. /* output: e, error vector */
  1628. /* return: 0 for success; 1 for failure */
  1629. static int decrypt(unsigned char *e, const unsigned char *sk, const unsigned char *s)
  1630. {
  1631. int i;
  1632. uint16_t check_synd;
  1633. uint16_t check_weight;
  1634. vec inv[ 128 ][ GFBITS ];
  1635. vec scaled[ 128 ][ GFBITS ];
  1636. vec eval[ 128 ][ GFBITS ];
  1637. vec error[ 128 ];
  1638. vec s_priv[ 4 ][ GFBITS ];
  1639. vec s_priv_cmp[ 4 ][ GFBITS ];
  1640. vec locator[2][ GFBITS ];
  1641. vec recv[ 128 ];
  1642. vec allone;
  1643. /* Berlekamp decoder */
  1644. preprocess(recv, s);
  1645. benes(recv, sk + IRR_BYTES, 1);
  1646. scaling(scaled, inv, sk, recv);
  1647. fft_tr(s_priv, scaled);
  1648. bm(locator, s_priv);
  1649. fft(eval, locator);
  1650. /* reencryption and weight check */
  1651. allone = vec_setbits(1);
  1652. for (i = 0; i < 128; i++)
  1653. {
  1654. error[i] = vec_or_reduce(eval[i]);
  1655. error[i] ^= allone;
  1656. }
  1657. scaling_inv(scaled, inv, error);
  1658. fft_tr(s_priv_cmp, scaled);
  1659. check_synd = synd_cmp(s_priv, s_priv_cmp);
  1660. /**/
  1661. benes(error, sk + IRR_BYTES, 0);
  1662. postprocess(e, error);
  1663. check_weight = weight_check(e, error);
  1664. #ifdef KAT
  1665. {
  1666. int k;
  1667. printf("decrypt e: positions");
  1668. for (k = 0;k < SYS_N;++k)
  1669. if (e[k/8] & (1 << (k&7)))
  1670. printf(" %d",k);
  1671. printf("\n");
  1672. }
  1673. #endif
  1674. return 1 - (check_synd & check_weight);
  1675. }
  1676. /* from libmceliece-20230612/crypto_kem/6688128f/vec/encrypt.c */
  1677. /* 20230102 djb: rename encrypt() as pke_encrypt() */
  1678. /* 20221231 djb: move encrypt.h last for macos portability; tnx thom wiggers */
  1679. /* 20221230 djb: add linker line */
  1680. /* linker define pke_encrypt */
  1681. /*
  1682. This file is for Niederreiter encryption
  1683. */
  1684. static inline crypto_uint16 uint16_is_smaller_declassify(uint16_t t,uint16_t u)
  1685. {
  1686. crypto_uint16 mask = crypto_uint16_smaller_mask(t,u);
  1687. crypto_declassify(&mask,sizeof mask);
  1688. return mask;
  1689. }
  1690. static inline crypto_uint32 uint32_is_equal_declassify(uint32_t t,uint32_t u)
  1691. {
  1692. crypto_uint32 mask = crypto_uint32_equal_mask(t,u);
  1693. crypto_declassify(&mask,sizeof mask);
  1694. return mask;
  1695. }
  1696. /* output: e, an error vector of weight t */
  1697. static void gen_e(unsigned char *e)
  1698. {
  1699. int i, j, eq, count;
  1700. union
  1701. {
  1702. uint16_t nums[ SYS_T*2 ];
  1703. unsigned char bytes[ SYS_T*2 * sizeof(uint16_t) ];
  1704. } buf;
  1705. uint16_t ind[ SYS_T ];
  1706. uint64_t e_int[ (SYS_N+63)/64 ];
  1707. uint64_t one = 1;
  1708. uint64_t mask;
  1709. uint64_t val[ SYS_T ];
  1710. while (1)
  1711. {
  1712. randombytes(buf.bytes, sizeof(buf));
  1713. for (i = 0; i < SYS_T*2; i++)
  1714. buf.nums[i] = load_gf(buf.bytes + i*2);
  1715. /* moving and counting indices in the correct range */
  1716. count = 0;
  1717. for (i = 0; i < SYS_T*2 && count < SYS_T; i++)
  1718. if (uint16_is_smaller_declassify(buf.nums[i],SYS_N))
  1719. ind[ count++ ] = buf.nums[i];
  1720. if (count < SYS_T) continue;
  1721. /* check for repetition */
  1722. uint16_sort(ind, SYS_T);
  1723. eq = 0;
  1724. for (i = 1; i < SYS_T; i++)
  1725. if (uint32_is_equal_declassify(ind[i-1],ind[i]))
  1726. eq = 1;
  1727. if (eq == 0)
  1728. break;
  1729. }
  1730. for (j = 0; j < SYS_T; j++)
  1731. val[j] = one << (ind[j] & 63);
  1732. for (i = 0; i < (SYS_N+63)/64; i++)
  1733. {
  1734. e_int[i] = 0;
  1735. for (j = 0; j < SYS_T; j++)
  1736. {
  1737. mask = i ^ (ind[j] >> 6);
  1738. mask -= 1;
  1739. mask >>= 63;
  1740. mask = -mask;
  1741. e_int[i] |= val[j] & mask;
  1742. }
  1743. }
  1744. for (i = 0; i < (SYS_N+63)/64 - 1; i++)
  1745. { store8(e, e_int[i]); e += 8; }
  1746. for (j = 0; j < (SYS_N % 64); j+=8)
  1747. e[ j/8 ] = (e_int[i] >> j) & 0xFF;
  1748. }
  1749. /* input: public key pk, error vector e */
  1750. /* output: syndrome s */
  1751. static void syndrome(unsigned char *s, const unsigned char *pk, unsigned char *e)
  1752. {
  1753. uint64_t b;
  1754. const uint64_t *pk_ptr;
  1755. const uint64_t *e_ptr = ((uint64_t *) (e + SYND_BYTES));
  1756. int i, j;
  1757. /**/
  1758. for (i = 0; i < SYND_BYTES; i++)
  1759. s[i] = e[i];
  1760. for (i = 0; i < PK_NROWS; i++)
  1761. {
  1762. pk_ptr = ((uint64_t *) (pk + PK_ROW_BYTES * i));
  1763. b = 0;
  1764. for (j = 0; j < PK_NCOLS/64; j++)
  1765. b ^= pk_ptr[j] & e_ptr[j];
  1766. b ^= ((uint32_t *) &pk_ptr[j])[0] & ((uint32_t *) &e_ptr[j])[0];
  1767. b ^= b >> 32;
  1768. b ^= b >> 16;
  1769. b ^= b >> 8;
  1770. b ^= b >> 4;
  1771. b ^= b >> 2;
  1772. b ^= b >> 1;
  1773. b &= 1;
  1774. s[ i/8 ] ^= (b << (i%8));
  1775. }
  1776. }
  1777. /* input: public key pk */
  1778. /* output: error vector e, syndrome s */
  1779. static void pke_encrypt(unsigned char *s, const unsigned char *pk, unsigned char *e)
  1780. {
  1781. gen_e(e);
  1782. #ifdef KAT
  1783. {
  1784. int k;
  1785. printf("encrypt e: positions");
  1786. for (k = 0;k < SYS_N;++k)
  1787. if (e[k/8] & (1 << (k&7)))
  1788. printf(" %d",k);
  1789. printf("\n");
  1790. }
  1791. #endif
  1792. syndrome(s, pk, e);
  1793. }
  1794. /* from libmceliece-20230612/crypto_kem/6688128f/vec/shared-fft_consts.c */
  1795. /* linker define fft_consts */
  1796. const vec fft_consts[128][GFBITS] = {
  1797. { 0x6969969669699696, 0x9966669966999966, 0x9966669966999966, 0xFF0000FF00FFFF00, 0xCC3333CCCC3333CC, 0x9966669966999966, 0x6666666666666666, 0xA55AA55AA55AA55A, 0xCCCC33333333CCCC, 0x5A5A5A5A5A5A5A5A, 0x55AAAA55AA5555AA, 0x0FF0F00FF00F0FF0, 0x5AA55AA5A55AA55A }, { 0x6969969669699696, 0x9966669966999966, 0x9966669966999966, 0xFF0000FF00FFFF00, 0xCC3333CCCC3333CC, 0x9966669966999966, 0x6666666666666666, 0xA55AA55AA55AA55A, 0xCCCC33333333CCCC, 0x5A5A5A5A5A5A5A5A, 0x55AAAA55AA5555AA, 0x0FF0F00FF00F0FF0, 0x5AA55AA5A55AA55A }, { 0xA55A5AA55AA5A55A, 0x6969696996969696, 0x5AA55AA5A55AA55A, 0x9999999966666666, 0x3C3CC3C3C3C33C3C, 0xFFFF0000FFFF0000, 0x0000000000000000, 0xCC33CC3333CC33CC, 0x0000000000000000, 0x3C3C3C3C3C3C3C3C, 0xAA5555AAAA5555AA, 0xC33C3CC33CC3C33C, 0x00FFFF0000FFFF00 }, { 0xA55A5AA55AA5A55A, 0x6969696996969696, 0x5AA55AA5A55AA55A, 0x6666666699999999, 0xC3C33C3C3C3CC3C3, 0x0000FFFF0000FFFF, 0x0000000000000000, 0x33CC33CCCC33CC33, 0x0000000000000000, 0x3C3C3C3C3C3C3C3C, 0xAA5555AAAA5555AA, 0xC33C3CC33CC3C33C, 0xFF0000FFFF0000FF }, { 0xFFFFFFFF00000000, 0xA5A5A5A55A5A5A5A, 0x0FF0F00FF00F0FF0, 0x9669966969966996, 0x0000FFFFFFFF0000, 0x33333333CCCCCCCC, 0xA55A5AA55AA5A55A, 0x00FFFF0000FFFF00, 0x0000000000000000, 0xC33CC33CC33CC33C, 0x0F0FF0F00F0FF0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAA55555555AAAA }, { 0xFFFFFFFF00000000, 0xA5A5A5A55A5A5A5A, 0x0FF0F00FF00F0FF0, 0x6996699696699669, 0xFFFF00000000FFFF, 0x33333333CCCCCCCC, 0x5AA5A55AA55A5AA5, 0xFF0000FFFF0000FF, 0xFFFFFFFFFFFFFFFF, 0xC33CC33CC33CC33C, 0x0F0FF0F00F0FF0F0, 0xCCCCCCCCCCCCCCCC, 0x5555AAAAAAAA5555 }, { 0xFFFFFFFF00000000, 0x5A5A5A5AA5A5A5A5, 0xF00F0FF00FF0F00F, 0x6996699696699669, 0x0000FFFFFFFF0000, 0x33333333CCCCCCCC, 0x5AA5A55AA55A5AA5, 0xFF0000FFFF0000FF, 0xFFFFFFFFFFFFFFFF, 0xC33CC33CC33CC33C, 0x0F0FF0F00F0FF0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAA55555555AAAA }, { 0xFFFFFFFF00000000, 0x5A5A5A5AA5A5A5A5, 0xF00F0FF00FF0F00F, 0x9669966969966996, 0xFFFF00000000FFFF, 0x33333333CCCCCCCC, 0xA55A5AA55AA5A55A, 0x00FFFF0000FFFF00, 0x0000000000000000, 0xC33CC33CC33CC33C, 0x0F0FF0F00F0FF0F0, 0xCCCCCCCCCCCCCCCC, 0x5555AAAAAAAA5555 }, { 0xC33C3CC33CC3C33C, 0x9966669966999966, 0x9966996699669966, 0x6969969669699696, 0xAA55AA5555AA55AA, 0x9966996699669966, 0x5AA5A55A5AA5A55A, 0xC3C3C3C33C3C3C3C, 0x3CC33CC3C33CC33C, 0x3333CCCC3333CCCC, 0x9999999966666666, 0xC33CC33CC33CC33C, 0x6666999999996666 }, { 0x3CC3C33CC33C3CC3, 0x6699996699666699, 0x6699669966996699, 0x6969969669699696, 0xAA55AA5555AA55AA, 0x9966996699669966, 0xA55A5AA5A55A5AA5, 0xC3C3C3C33C3C3C3C, 0x3CC33CC3C33CC33C, 0x3333CCCC3333CCCC, 0x6666666699999999, 0x3CC33CC33CC33CC3, 0x9999666666669999 }, { 0xC33C3CC33CC3C33C, 0x9966669966999966, 0x6699669966996699, 0x6969969669699696, 0xAA55AA5555AA55AA, 0x6699669966996699, 0x5AA5A55A5AA5A55A, 0x3C3C3C3CC3C3C3C3, 0xC33CC33C3CC33CC3, 0xCCCC3333CCCC3333, 0x6666666699999999, 0xC33CC33CC33CC33C, 0x9999666666669999 }, { 0x3CC3C33CC33C3CC3, 0x6699996699666699, 0x9966996699669966, 0x6969969669699696, 0xAA55AA5555AA55AA, 0x6699669966996699, 0xA55A5AA5A55A5AA5, 0x3C3C3C3CC3C3C3C3, 0xC33CC33C3CC33CC3, 0xCCCC3333CCCC3333, 0x9999999966666666, 0x3CC33CC33CC33CC3, 0x6666999999996666 }, { 0xC33C3CC33CC3C33C, 0x6699996699666699, 0x6699669966996699, 0x6969969669699696, 0x55AA55AAAA55AA55, 0x9966996699669966, 0x5AA5A55A5AA5A55A, 0xC3C3C3C33C3C3C3C, 0xC33CC33C3CC33CC3, 0x3333CCCC3333CCCC, 0x9999999966666666, 0xC33CC33CC33CC33C, 0x6666999999996666 }, { 0x3CC3C33CC33C3CC3, 0x9966669966999966, 0x9966996699669966, 0x6969969669699696, 0x55AA55AAAA55AA55, 0x9966996699669966, 0xA55A5AA5A55A5AA5, 0xC3C3C3C33C3C3C3C, 0xC33CC33C3CC33CC3, 0x3333CCCC3333CCCC, 0x6666666699999999, 0x3CC33CC33CC33CC3, 0x9999666666669999 }, { 0xC33C3CC33CC3C33C, 0x6699996699666699, 0x9966996699669966, 0x6969969669699696, 0x55AA55AAAA55AA55, 0x6699669966996699, 0x5AA5A55A5AA5A55A, 0x3C3C3C3CC3C3C3C3, 0x3CC33CC3C33CC33C, 0xCCCC3333CCCC3333, 0x6666666699999999, 0xC33CC33CC33CC33C, 0x9999666666669999 }, { 0x3CC3C33CC33C3CC3, 0x9966669966999966, 0x6699669966996699, 0x6969969669699696, 0x55AA55AAAA55AA55, 0x6699669966996699, 0xA55A5AA5A55A5AA5, 0x3C3C3C3CC3C3C3C3, 0x3CC33CC3C33CC33C, 0xCCCC3333CCCC3333, 0x9999999966666666, 0x3CC33CC33CC33CC3, 0x6666999999996666 }, { 0x3C3CC3C3C3C33C3C, 0x55555555AAAAAAAA, 0xF00FF00F0FF00FF0, 0x5AA55AA5A55AA55A, 0x55AAAA55AA5555AA, 0xF00F0FF0F00F0FF0, 0x9669699696696996, 0xA55AA55AA55AA55A, 0x55555555AAAAAAAA, 0xCCCC33333333CCCC, 0x0000FFFFFFFF0000, 0xFF0000FF00FFFF00, 0x6996699669966996 }, { 0xC3C33C3C3C3CC3C3, 0x55555555AAAAAAAA, 0x0FF00FF0F00FF00F, 0x5AA55AA5A55AA55A, 0x55AAAA55AA5555AA, 0xF00F0FF0F00F0FF0, 0x9669699696696996, 0x5AA55AA55AA55AA5, 0x55555555AAAAAAAA, 0x3333CCCCCCCC3333, 0x0000FFFFFFFF0000, 0x00FFFF00FF0000FF, 0x9669966996699669 }, { 0x3C3CC3C3C3C33C3C, 0x55555555AAAAAAAA, 0xF00FF00F0FF00FF0, 0xA55AA55A5AA55AA5, 0xAA5555AA55AAAA55, 0x0FF0F00F0FF0F00F, 0x9669699696696996, 0x5AA55AA55AA55AA5, 0xAAAAAAAA55555555, 0x3333CCCCCCCC3333, 0xFFFF00000000FFFF, 0xFF0000FF00FFFF00, 0x9669966996699669 }, { 0xC3C33C3C3C3CC3C3, 0x55555555AAAAAAAA, 0x0FF00FF0F00FF00F, 0xA55AA55A5AA55AA5, 0xAA5555AA55AAAA55, 0x0FF0F00F0FF0F00F, 0x9669699696696996, 0xA55AA55AA55AA55A, 0xAAAAAAAA55555555, 0xCCCC33333333CCCC, 0xFFFF00000000FFFF, 0x00FFFF00FF0000FF, 0x6996699669966996 }, { 0x3C3CC3C3C3C33C3C, 0x55555555AAAAAAAA, 0x0FF00FF0F00FF00F, 0xA55AA55A5AA55AA5, 0xAA5555AA55AAAA55, 0x0FF0F00F0FF0F00F, 0x6996966969969669, 0xA55AA55AA55AA55A, 0xAAAAAAAA55555555, 0xCCCC33333333CCCC, 0x0000FFFFFFFF0000, 0xFF0000FF00FFFF00, 0x6996699669966996 }, { 0xC3C33C3C3C3CC3C3, 0x55555555AAAAAAAA, 0xF00FF00F0FF00FF0, 0xA55AA55A5AA55AA5, 0xAA5555AA55AAAA55, 0x0FF0F00F0FF0F00F, 0x6996966969969669, 0x5AA55AA55AA55AA5, 0xAAAAAAAA55555555, 0x3333CCCCCCCC3333, 0x0000FFFFFFFF0000, 0x00FFFF00FF0000FF, 0x9669966996699669 }, { 0x3C3CC3C3C3C33C3C, 0x55555555AAAAAAAA, 0x0FF00FF0F00FF00F, 0x5AA55AA5A55AA55A, 0x55AAAA55AA5555AA, 0xF00F0FF0F00F0FF0, 0x6996966969969669, 0x5AA55AA55AA55AA5, 0x55555555AAAAAAAA, 0x3333CCCCCCCC3333, 0xFFFF00000000FFFF, 0xFF0000FF00FFFF00, 0x9669966996699669 }, { 0xC3C33C3C3C3CC3C3, 0x55555555AAAAAAAA, 0xF00FF00F0FF00FF0, 0x5AA55AA5A55AA55A, 0x55AAAA55AA5555AA, 0xF00F0FF0F00F0FF0, 0x6996966969969669, 0xA55AA55AA55AA55A, 0x55555555AAAAAAAA, 0xCCCC33333333CCCC, 0xFFFF00000000FFFF, 0x00FFFF00FF0000FF, 0x6996699669966996 }, { 0x3C3CC3C3C3C33C3C, 0xAAAAAAAA55555555, 0x0FF00FF0F00FF00F, 0x5AA55AA5A55AA55A, 0xAA5555AA55AAAA55, 0xF00F0FF0F00F0FF0, 0x9669699696696996, 0xA55AA55AA55AA55A, 0x55555555AAAAAAAA, 0xCCCC33333333CCCC, 0x0000FFFFFFFF0000, 0xFF0000FF00FFFF00, 0x6996699669966996 }, { 0xC3C33C3C3C3CC3C3, 0xAAAAAAAA55555555, 0xF00FF00F0FF00FF0, 0x5AA55AA5A55AA55A, 0xAA5555AA55AAAA55, 0xF00F0FF0F00F0FF0, 0x9669699696696996, 0x5AA55AA55AA55AA5, 0x55555555AAAAAAAA, 0x3333CCCCCCCC3333, 0x0000FFFFFFFF0000, 0x00FFFF00FF0000FF, 0x9669966996699669 }, { 0x3C3CC3C3C3C33C3C, 0xAAAAAAAA55555555, 0x0FF00FF0F00FF00F, 0xA55AA55A5AA55AA5, 0x55AAAA55AA5555AA, 0x0FF0F00F0FF0F00F, 0x9669699696696996, 0x5AA55AA55AA55AA5, 0xAAAAAAAA55555555, 0x3333CCCCCCCC3333, 0xFFFF00000000FFFF, 0xFF0000FF00FFFF00, 0x9669966996699669 }, { 0xC3C33C3C3C3CC3C3, 0xAAAAAAAA55555555, 0xF00FF00F0FF00FF0, 0xA55AA55A5AA55AA5, 0x55AAAA55AA5555AA, 0x0FF0F00F0FF0F00F, 0x9669699696696996, 0xA55AA55AA55AA55A, 0xAAAAAAAA55555555, 0xCCCC33333333CCCC, 0xFFFF00000000FFFF, 0x00FFFF00FF0000FF, 0x6996699669966996 }, { 0x3C3CC3C3C3C33C3C, 0xAAAAAAAA55555555, 0xF00FF00F0FF00FF0, 0xA55AA55A5AA55AA5, 0x55AAAA55AA5555AA, 0x0FF0F00F0FF0F00F, 0x6996966969969669, 0xA55AA55AA55AA55A, 0xAAAAAAAA55555555, 0xCCCC33333333CCCC, 0x0000FFFFFFFF0000, 0xFF0000FF00FFFF00, 0x6996699669966996 }, { 0xC3C33C3C3C3CC3C3, 0xAAAAAAAA55555555, 0x0FF00FF0F00FF00F, 0xA55AA55A5AA55AA5, 0x55AAAA55AA5555AA, 0x0FF0F00F0FF0F00F, 0x6996966969969669, 0x5AA55AA55AA55AA5, 0xAAAAAAAA55555555, 0x3333CCCCCCCC3333, 0x0000FFFFFFFF0000, 0x00FFFF00FF0000FF, 0x9669966996699669 }, { 0x3C3CC3C3C3C33C3C, 0xAAAAAAAA55555555, 0xF00FF00F0FF00FF0, 0x5AA55AA5A55AA55A, 0xAA5555AA55AAAA55, 0xF00F0FF0F00F0FF0, 0x6996966969969669, 0x5AA55AA55AA55AA5, 0x55555555AAAAAAAA, 0x3333CCCCCCCC3333, 0xFFFF00000000FFFF, 0xFF0000FF00FFFF00, 0x9669966996699669 }, { 0xC3C33C3C3C3CC3C3, 0xAAAAAAAA55555555, 0x0FF00FF0F00FF00F, 0x5AA55AA5A55AA55A, 0xAA5555AA55AAAA55, 0xF00F0FF0F00F0FF0, 0x6996966969969669, 0xA55AA55AA55AA55A, 0x55555555AAAAAAAA, 0xCCCC33333333CCCC, 0xFFFF00000000FFFF, 0x00FFFF00FF0000FF, 0x6996699669966996 }, { 0x3CC3C33C3CC3C33C, 0xAAAAAAAAAAAAAAAA, 0xFFFF0000FFFF0000, 0x3CC3C33C3CC3C33C, 0x55AA55AA55AA55AA, 0xFFFF0000FFFF0000, 0x0F0F0F0FF0F0F0F0, 0xFF0000FF00FFFF00, 0x33CCCC33CC3333CC, 0xFF0000FF00FFFF00, 0x6996966996696996, 0xA55A5AA55AA5A55A, 0x6996966996696996 }, { 0x3CC3C33C3CC3C33C, 0xAAAAAAAAAAAAAAAA, 0xFFFF0000FFFF0000, 0x3CC3C33C3CC3C33C, 0x55AA55AA55AA55AA, 0x0000FFFF0000FFFF, 0xF0F0F0F00F0F0F0F, 0x00FFFF00FF0000FF, 0xCC3333CC33CCCC33, 0x00FFFF00FF0000FF, 0x9669699669969669, 0xA55A5AA55AA5A55A, 0x6996966996696996 }, { 0x3CC3C33C3CC3C33C, 0xAAAAAAAAAAAAAAAA, 0xFFFF0000FFFF0000, 0x3CC3C33C3CC3C33C, 0xAA55AA55AA55AA55, 0x0000FFFF0000FFFF, 0xF0F0F0F00F0F0F0F, 0x00FFFF00FF0000FF, 0xCC3333CC33CCCC33, 0xFF0000FF00FFFF00, 0x6996966996696996, 0xA55A5AA55AA5A55A, 0x6996966996696996 }, { 0x3CC3C33C3CC3C33C, 0xAAAAAAAAAAAAAAAA, 0xFFFF0000FFFF0000, 0x3CC3C33C3CC3C33C, 0xAA55AA55AA55AA55, 0xFFFF0000FFFF0000, 0x0F0F0F0FF0F0F0F0, 0xFF0000FF00FFFF00, 0x33CCCC33CC3333CC, 0x00FFFF00FF0000FF, 0x9669699669969669, 0xA55A5AA55AA5A55A, 0x6996966996696996 }, { 0x3CC3C33C3CC3C33C, 0xAAAAAAAAAAAAAAAA, 0xFFFF0000FFFF0000, 0xC33C3CC3C33C3CC3, 0xAA55AA55AA55AA55, 0x0000FFFF0000FFFF, 0xF0F0F0F00F0F0F0F, 0xFF0000FF00FFFF00, 0x33CCCC33CC3333CC, 0xFF0000FF00FFFF00, 0x6996966996696996, 0xA55A5AA55AA5A55A, 0x6996966996696996 }, { 0x3CC3C33C3CC3C33C, 0xAAAAAAAAAAAAAAAA, 0xFFFF0000FFFF0000, 0xC33C3CC3C33C3CC3, 0xAA55AA55AA55AA55, 0xFFFF0000FFFF0000, 0x0F0F0F0FF0F0F0F0, 0x00FFFF00FF0000FF, 0xCC3333CC33CCCC33, 0x00FFFF00FF0000FF, 0x9669699669969669, 0xA55A5AA55AA5A55A, 0x6996966996696996 }, { 0x3CC3C33C3CC3C33C, 0xAAAAAAAAAAAAAAAA, 0xFFFF0000FFFF0000, 0xC33C3CC3C33C3CC3, 0x55AA55AA55AA55AA, 0xFFFF0000FFFF0000, 0x0F0F0F0FF0F0F0F0, 0x00FFFF00FF0000FF, 0xCC3333CC33CCCC33, 0xFF0000FF00FFFF00, 0x6996966996696996, 0xA55A5AA55AA5A55A, 0x6996966996696996 }, { 0x3CC3C33C3CC3C33C, 0xAAAAAAAAAAAAAAAA, 0xFFFF0000FFFF0000, 0xC33C3CC3C33C3CC3, 0x55AA55AA55AA55AA, 0x0000FFFF0000FFFF, 0xF0F0F0F00F0F0F0F, 0xFF0000FF00FFFF00, 0x33CCCC33CC3333CC, 0x00FFFF00FF0000FF, 0x9669699669969669, 0xA55A5AA55AA5A55A, 0x6996966996696996 }, { 0x3CC3C33C3CC3C33C, 0xAAAAAAAAAAAAAAAA, 0x0000FFFF0000FFFF, 0xC33C3CC3C33C3CC3, 0xAA55AA55AA55AA55, 0xFFFF0000FFFF0000, 0x0F0F0F0FF0F0F0F0, 0xFF0000FF00FFFF00, 0x33CCCC33CC3333CC, 0xFF0000FF00FFFF00, 0x6996966996696996, 0xA55A5AA55AA5A55A, 0x6996966996696996 }, { 0x3CC3C33C3CC3C33C, 0xAAAAAAAAAAAAAAAA, 0x0000FFFF0000FFFF, 0xC33C3CC3C33C3CC3, 0xAA55AA55AA55AA55, 0x0000FFFF0000FFFF, 0xF0F0F0F00F0F0F0F, 0x00FFFF00FF0000FF, 0xCC3333CC33CCCC33, 0x00FFFF00FF0000FF, 0x9669699669969669, 0xA55A5AA55AA5A55A, 0x6996966996696996 }, { 0x3CC3C33C3CC3C33C, 0xAAAAAAAAAAAAAAAA, 0x0000FFFF0000FFFF, 0xC33C3CC3C33C3CC3, 0x55AA55AA55AA55AA, 0x0000FFFF0000FFFF, 0xF0F0F0F00F0F0F0F, 0x00FFFF00FF0000FF, 0xCC3333CC33CCCC33, 0xFF0000FF00FFFF00, 0x6996966996696996, 0xA55A5AA55AA5A55A, 0x6996966996696996 }, { 0x3CC3C33C3CC3C33C, 0xAAAAAAAAAAAAAAAA, 0x0000FFFF0000FFFF, 0xC33C3CC3C33C3CC3, 0x55AA55AA55AA55AA, 0xFFFF0000FFFF0000, 0x0F0F0F0FF0F0F0F0, 0xFF0000FF00FFFF00, 0x33CCCC33CC3333CC, 0x00FFFF00FF0000FF, 0x9669699669969669, 0xA55A5AA55AA5A55A, 0x6996966996696996 }, { 0x3CC3C33C3CC3C33C, 0xAAAAAAAAAAAAAAAA, 0x0000FFFF0000FFFF, 0x3CC3C33C3CC3C33C, 0x55AA55AA55AA55AA, 0x0000FFFF0000FFFF, 0xF0F0F0F00F0F0F0F, 0xFF0000FF00FFFF00, 0x33CCCC33CC3333CC, 0xFF0000FF00FFFF00, 0x6996966996696996, 0xA55A5AA55AA5A55A, 0x6996966996696996 }, { 0x3CC3C33C3CC3C33C, 0xAAAAAAAAAAAAAAAA, 0x0000FFFF0000FFFF, 0x3CC3C33C3CC3C33C, 0x55AA55AA55AA55AA, 0xFFFF0000FFFF0000, 0x0F0F0F0FF0F0F0F0, 0x00FFFF00FF0000FF, 0xCC3333CC33CCCC33, 0x00FFFF00FF0000FF, 0x9669699669969669, 0xA55A5AA55AA5A55A, 0x6996966996696996 }, { 0x3CC3C33C3CC3C33C, 0xAAAAAAAAAAAAAAAA, 0x0000FFFF0000FFFF, 0x3CC3C33C3CC3C33C, 0xAA55AA55AA55AA55, 0xFFFF0000FFFF0000, 0x0F0F0F0FF0F0F0F0, 0x00FFFF00FF0000FF, 0xCC3333CC33CCCC33, 0xFF0000FF00FFFF00, 0x6996966996696996, 0xA55A5AA55AA5A55A, 0x6996966996696996 }, { 0x3CC3C33C3CC3C33C, 0xAAAAAAAAAAAAAAAA, 0x0000FFFF0000FFFF, 0x3CC3C33C3CC3C33C, 0xAA55AA55AA55AA55, 0x0000FFFF0000FFFF, 0xF0F0F0F00F0F0F0F, 0xFF0000FF00FFFF00, 0x33CCCC33CC3333CC, 0x00FFFF00FF0000FF, 0x9669699669969669, 0xA55A5AA55AA5A55A, 0x6996966996696996 }, { 0x3CC3C33C3CC3C33C, 0x5555555555555555, 0x0000FFFF0000FFFF, 0x3CC3C33C3CC3C33C, 0x55AA55AA55AA55AA, 0xFFFF0000FFFF0000, 0x0F0F0F0FF0F0F0F0, 0xFF0000FF00FFFF00, 0x33CCCC33CC3333CC, 0xFF0000FF00FFFF00, 0x6996966996696996, 0xA55A5AA55AA5A55A, 0x6996966996696996 }, { 0x3CC3C33C3CC3C33C, 0x5555555555555555, 0x0000FFFF0000FFFF, 0x3CC3C33C3CC3C33C, 0x55AA55AA55AA55AA, 0x0000FFFF0000FFFF, 0xF0F0F0F00F0F0F0F, 0x00FFFF00FF0000FF, 0xCC3333CC33CCCC33, 0x00FFFF00FF0000FF, 0x9669699669969669, 0xA55A5AA55AA5A55A, 0x6996966996696996 }, { 0x3CC3C33C3CC3C33C, 0x5555555555555555, 0x0000FFFF0000FFFF, 0x3CC3C33C3CC3C33C, 0xAA55AA55AA55AA55, 0x0000FFFF0000FFFF, 0xF0F0F0F00F0F0F0F, 0x00FFFF00FF0000FF, 0xCC3333CC33CCCC33, 0xFF0000FF00FFFF00, 0x6996966996696996, 0xA55A5AA55AA5A55A, 0x6996966996696996 }, { 0x3CC3C33C3CC3C33C, 0x5555555555555555, 0x0000FFFF0000FFFF, 0x3CC3C33C3CC3C33C, 0xAA55AA55AA55AA55, 0xFFFF0000FFFF0000, 0x0F0F0F0FF0F0F0F0, 0xFF0000FF00FFFF00, 0x33CCCC33CC3333CC, 0x00FFFF00FF0000FF, 0x9669699669969669, 0xA55A5AA55AA5A55A, 0x6996966996696996 }, { 0x3CC3C33C3CC3C33C, 0x5555555555555555, 0x0000FFFF0000FFFF, 0xC33C3CC3C33C3CC3, 0xAA55AA55AA55AA55, 0x0000FFFF0000FFFF, 0xF0F0F0F00F0F0F0F, 0xFF0000FF00FFFF00, 0x33CCCC33CC3333CC, 0xFF0000FF00FFFF00, 0x6996966996696996, 0xA55A5AA55AA5A55A, 0x6996966996696996 }, { 0x3CC3C33C3CC3C33C, 0x5555555555555555, 0x0000FFFF0000FFFF, 0xC33C3CC3C33C3CC3, 0xAA55AA55AA55AA55, 0xFFFF0000FFFF0000, 0x0F0F0F0FF0F0F0F0, 0x00FFFF00FF0000FF, 0xCC3333CC33CCCC33, 0x00FFFF00FF0000FF, 0x9669699669969669, 0xA55A5AA55AA5A55A, 0x6996966996696996 }, { 0x3CC3C33C3CC3C33C, 0x5555555555555555, 0x0000FFFF0000FFFF, 0xC33C3CC3C33C3CC3, 0x55AA55AA55AA55AA, 0xFFFF0000FFFF0000, 0x0F0F0F0FF0F0F0F0, 0x00FFFF00FF0000FF, 0xCC3333CC33CCCC33, 0xFF0000FF00FFFF00, 0x6996966996696996, 0xA55A5AA55AA5A55A, 0x6996966996696996 }, { 0x3CC3C33C3CC3C33C, 0x5555555555555555, 0x0000FFFF0000FFFF, 0xC33C3CC3C33C3CC3, 0x55AA55AA55AA55AA, 0x0000FFFF0000FFFF, 0xF0F0F0F00F0F0F0F, 0xFF0000FF00FFFF00, 0x33CCCC33CC3333CC, 0x00FFFF00FF0000FF, 0x9669699669969669, 0xA55A5AA55AA5A55A, 0x6996966996696996 }, { 0x3CC3C33C3CC3C33C, 0x5555555555555555, 0xFFFF0000FFFF0000, 0xC33C3CC3C33C3CC3, 0xAA55AA55AA55AA55, 0xFFFF0000FFFF0000, 0x0F0F0F0FF0F0F0F0, 0xFF0000FF00FFFF00, 0x33CCCC33CC3333CC, 0xFF0000FF00FFFF00, 0x6996966996696996, 0xA55A5AA55AA5A55A, 0x6996966996696996 }, { 0x3CC3C33C3CC3C33C, 0x5555555555555555, 0xFFFF0000FFFF0000, 0xC33C3CC3C33C3CC3, 0xAA55AA55AA55AA55, 0x0000FFFF0000FFFF, 0xF0F0F0F00F0F0F0F, 0x00FFFF00FF0000FF, 0xCC3333CC33CCCC33, 0x00FFFF00FF0000FF, 0x9669699669969669, 0xA55A5AA55AA5A55A, 0x6996966996696996 }, { 0x3CC3C33C3CC3C33C, 0x5555555555555555, 0xFFFF0000FFFF0000, 0xC33C3CC3C33C3CC3, 0x55AA55AA55AA55AA, 0x0000FFFF0000FFFF, 0xF0F0F0F00F0F0F0F, 0x00FFFF00FF0000FF, 0xCC3333CC33CCCC33, 0xFF0000FF00FFFF00, 0x6996966996696996, 0xA55A5AA55AA5A55A, 0x6996966996696996 }, { 0x3CC3C33C3CC3C33C, 0x5555555555555555, 0xFFFF0000FFFF0000, 0xC33C3CC3C33C3CC3, 0x55AA55AA55AA55AA, 0xFFFF0000FFFF0000, 0x0F0F0F0FF0F0F0F0, 0xFF0000FF00FFFF00, 0x33CCCC33CC3333CC, 0x00FFFF00FF0000FF, 0x9669699669969669, 0xA55A5AA55AA5A55A, 0x6996966996696996 }, { 0x3CC3C33C3CC3C33C, 0x5555555555555555, 0xFFFF0000FFFF0000, 0x3CC3C33C3CC3C33C, 0x55AA55AA55AA55AA, 0x0000FFFF0000FFFF, 0xF0F0F0F00F0F0F0F, 0xFF0000FF00FFFF00, 0x33CCCC33CC3333CC, 0xFF0000FF00FFFF00, 0x6996966996696996, 0xA55A5AA55AA5A55A, 0x6996966996696996 }, { 0x3CC3C33C3CC3C33C, 0x5555555555555555, 0xFFFF0000FFFF0000, 0x3CC3C33C3CC3C33C, 0x55AA55AA55AA55AA, 0xFFFF0000FFFF0000, 0x0F0F0F0FF0F0F0F0, 0x00FFFF00FF0000FF, 0xCC3333CC33CCCC33, 0x00FFFF00FF0000FF, 0x9669699669969669, 0xA55A5AA55AA5A55A, 0x6996966996696996 }, { 0x3CC3C33C3CC3C33C, 0x5555555555555555, 0xFFFF0000FFFF0000, 0x3CC3C33C3CC3C33C, 0xAA55AA55AA55AA55, 0xFFFF0000FFFF0000, 0x0F0F0F0FF0F0F0F0, 0x00FFFF00FF0000FF, 0xCC3333CC33CCCC33, 0xFF0000FF00FFFF00, 0x6996966996696996, 0xA55A5AA55AA5A55A, 0x6996966996696996 }, { 0x3CC3C33C3CC3C33C, 0x5555555555555555, 0xFFFF0000FFFF0000, 0x3CC3C33C3CC3C33C, 0xAA55AA55AA55AA55, 0x0000FFFF0000FFFF, 0xF0F0F0F00F0F0F0F, 0xFF0000FF00FFFF00, 0x33CCCC33CC3333CC, 0x00FFFF00FF0000FF, 0x9669699669969669, 0xA55A5AA55AA5A55A, 0x6996966996696996 }, { 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA }, { 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF00000000, 0xFFFF0000FFFF0000, 0xFF00FF00FF00FF00, 0xF0F0F0F0F0F0F0F0, 0xCCCCCCCCCCCCCCCC, 0xAAAAAAAAAAAAAAAA },
  1798. };
  1799. /* from libmceliece-20230612/crypto_kem/6688128f/vec/shared-fft_powers.c */
  1800. /* linker define fft_powers */
  1801. const vec fft_powers[128][GFBITS] = {
  1802. { 0x5AA55AA5A55AA55A, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0x33CC33CC33CC33CC, 0xF00FF00F0FF00FF0, 0xFFFFFFFF00000000, 0x6969696996969696, 0x5A5A5A5A5A5A5A5A, 0xA5A5A5A55A5A5A5A, 0xAAAA55555555AAAA, 0x0FF00FF00FF00FF0, 0x0F0FF0F00F0FF0F0 }, { 0x5AA55AA5A55AA55A, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0x33CC33CC33CC33CC, 0x0FF00FF0F00FF00F, 0xFFFFFFFF00000000, 0x6969696996969696, 0x5A5A5A5A5A5A5A5A, 0xA5A5A5A55A5A5A5A, 0x5555AAAAAAAA5555, 0xF00FF00FF00FF00F, 0xF0F00F0FF0F00F0F }, { 0xA55AA55A5AA55AA5, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0x33CC33CC33CC33CC, 0xF00FF00F0FF00FF0, 0xFFFFFFFF00000000, 0x6969696996969696, 0xA5A5A5A5A5A5A5A5, 0x5A5A5A5AA5A5A5A5, 0xAAAA55555555AAAA, 0x0FF00FF00FF00FF0, 0xF0F00F0FF0F00F0F }, { 0xA55AA55A5AA55AA5, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0x33CC33CC33CC33CC, 0x0FF00FF0F00FF00F, 0xFFFFFFFF00000000, 0x6969696996969696, 0xA5A5A5A5A5A5A5A5, 0x5A5A5A5AA5A5A5A5, 0x5555AAAAAAAA5555, 0xF00FF00FF00FF00F, 0x0F0FF0F00F0FF0F0 }, { 0xA55AA55A5AA55AA5, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0xCC33CC33CC33CC33, 0xF00FF00F0FF00FF0, 0xFFFFFFFF00000000, 0x9696969669696969, 0x5A5A5A5A5A5A5A5A, 0x5A5A5A5AA5A5A5A5, 0xAAAA55555555AAAA, 0xF00FF00FF00FF00F, 0x0F0FF0F00F0FF0F0 }, { 0xA55AA55A5AA55AA5, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0xCC33CC33CC33CC33, 0x0FF00FF0F00FF00F, 0xFFFFFFFF00000000, 0x9696969669696969, 0x5A5A5A5A5A5A5A5A, 0x5A5A5A5AA5A5A5A5, 0x5555AAAAAAAA5555, 0x0FF00FF00FF00FF0, 0xF0F00F0FF0F00F0F }, { 0x5AA55AA5A55AA55A, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0xCC33CC33CC33CC33, 0xF00FF00F0FF00FF0, 0xFFFFFFFF00000000, 0x9696969669696969, 0xA5A5A5A5A5A5A5A5, 0xA5A5A5A55A5A5A5A, 0xAAAA55555555AAAA, 0xF00FF00FF00FF00F, 0xF0F00F0FF0F00F0F }, { 0x5AA55AA5A55AA55A, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0xCC33CC33CC33CC33, 0x0FF00FF0F00FF00F, 0xFFFFFFFF00000000, 0x9696969669696969, 0xA5A5A5A5A5A5A5A5, 0xA5A5A5A55A5A5A5A, 0x5555AAAAAAAA5555, 0x0FF00FF00FF00FF0, 0x0F0FF0F00F0FF0F0 }, { 0x5AA55AA5A55AA55A, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0xCC33CC33CC33CC33, 0xF00FF00F0FF00FF0, 0x00000000FFFFFFFF, 0x9696969669696969, 0xA5A5A5A5A5A5A5A5, 0xA5A5A5A55A5A5A5A, 0x5555AAAAAAAA5555, 0x0FF00FF00FF00FF0, 0x0F0FF0F00F0FF0F0 }, { 0x5AA55AA5A55AA55A, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0xCC33CC33CC33CC33, 0x0FF00FF0F00FF00F, 0x00000000FFFFFFFF, 0x9696969669696969, 0xA5A5A5A5A5A5A5A5, 0xA5A5A5A55A5A5A5A, 0xAAAA55555555AAAA, 0xF00FF00FF00FF00F, 0xF0F00F0FF0F00F0F }, { 0xA55AA55A5AA55AA5, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0xCC33CC33CC33CC33, 0xF00FF00F0FF00FF0, 0x00000000FFFFFFFF, 0x9696969669696969, 0x5A5A5A5A5A5A5A5A, 0x5A5A5A5AA5A5A5A5, 0x5555AAAAAAAA5555, 0x0FF00FF00FF00FF0, 0xF0F00F0FF0F00F0F }, { 0xA55AA55A5AA55AA5, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0xCC33CC33CC33CC33, 0x0FF00FF0F00FF00F, 0x00000000FFFFFFFF, 0x9696969669696969, 0x5A5A5A5A5A5A5A5A, 0x5A5A5A5AA5A5A5A5, 0xAAAA55555555AAAA, 0xF00FF00FF00FF00F, 0x0F0FF0F00F0FF0F0 }, { 0xA55AA55A5AA55AA5, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0x33CC33CC33CC33CC, 0xF00FF00F0FF00FF0, 0x00000000FFFFFFFF, 0x6969696996969696, 0xA5A5A5A5A5A5A5A5, 0x5A5A5A5AA5A5A5A5, 0x5555AAAAAAAA5555, 0xF00FF00FF00FF00F, 0x0F0FF0F00F0FF0F0 }, { 0xA55AA55A5AA55AA5, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0x33CC33CC33CC33CC, 0x0FF00FF0F00FF00F, 0x00000000FFFFFFFF, 0x6969696996969696, 0xA5A5A5A5A5A5A5A5, 0x5A5A5A5AA5A5A5A5, 0xAAAA55555555AAAA, 0x0FF00FF00FF00FF0, 0xF0F00F0FF0F00F0F }, { 0x5AA55AA5A55AA55A, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0x33CC33CC33CC33CC, 0xF00FF00F0FF00FF0, 0x00000000FFFFFFFF, 0x6969696996969696, 0x5A5A5A5A5A5A5A5A, 0xA5A5A5A55A5A5A5A, 0x5555AAAAAAAA5555, 0xF00FF00FF00FF00F, 0xF0F00F0FF0F00F0F }, { 0x5AA55AA5A55AA55A, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0x33CC33CC33CC33CC, 0x0FF00FF0F00FF00F, 0x00000000FFFFFFFF, 0x6969696996969696, 0x5A5A5A5A5A5A5A5A, 0xA5A5A5A55A5A5A5A, 0xAAAA55555555AAAA, 0x0FF00FF00FF00FF0, 0x0F0FF0F00F0FF0F0 }, { 0x5AA55AA5A55AA55A, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0x33CC33CC33CC33CC, 0x0FF00FF0F00FF00F, 0xFFFFFFFF00000000, 0x6969696996969696, 0xA5A5A5A5A5A5A5A5, 0xA5A5A5A55A5A5A5A, 0xAAAA55555555AAAA, 0xF00FF00FF00FF00F, 0xF0F00F0FF0F00F0F }, { 0x5AA55AA5A55AA55A, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0x33CC33CC33CC33CC, 0xF00FF00F0FF00FF0, 0xFFFFFFFF00000000, 0x6969696996969696, 0xA5A5A5A5A5A5A5A5, 0xA5A5A5A55A5A5A5A, 0x5555AAAAAAAA5555, 0x0FF00FF00FF00FF0, 0x0F0FF0F00F0FF0F0 }, { 0xA55AA55A5AA55AA5, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0x33CC33CC33CC33CC, 0x0FF00FF0F00FF00F, 0xFFFFFFFF00000000, 0x6969696996969696, 0x5A5A5A5A5A5A5A5A, 0x5A5A5A5AA5A5A5A5, 0xAAAA55555555AAAA, 0xF00FF00FF00FF00F, 0x0F0FF0F00F0FF0F0 }, { 0xA55AA55A5AA55AA5, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0x33CC33CC33CC33CC, 0xF00FF00F0FF00FF0, 0xFFFFFFFF00000000, 0x6969696996969696, 0x5A5A5A5A5A5A5A5A, 0x5A5A5A5AA5A5A5A5, 0x5555AAAAAAAA5555, 0x0FF00FF00FF00FF0, 0xF0F00F0FF0F00F0F }, { 0xA55AA55A5AA55AA5, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0xCC33CC33CC33CC33, 0x0FF00FF0F00FF00F, 0xFFFFFFFF00000000, 0x9696969669696969, 0xA5A5A5A5A5A5A5A5, 0x5A5A5A5AA5A5A5A5, 0xAAAA55555555AAAA, 0x0FF00FF00FF00FF0, 0xF0F00F0FF0F00F0F }, { 0xA55AA55A5AA55AA5, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0xCC33CC33CC33CC33, 0xF00FF00F0FF00FF0, 0xFFFFFFFF00000000, 0x9696969669696969, 0xA5A5A5A5A5A5A5A5, 0x5A5A5A5AA5A5A5A5, 0x5555AAAAAAAA5555, 0xF00FF00FF00FF00F, 0x0F0FF0F00F0FF0F0 }, { 0x5AA55AA5A55AA55A, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0xCC33CC33CC33CC33, 0x0FF00FF0F00FF00F, 0xFFFFFFFF00000000, 0x9696969669696969, 0x5A5A5A5A5A5A5A5A, 0xA5A5A5A55A5A5A5A, 0xAAAA55555555AAAA, 0x0FF00FF00FF00FF0, 0x0F0FF0F00F0FF0F0 }, { 0x5AA55AA5A55AA55A, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0xCC33CC33CC33CC33, 0xF00FF00F0FF00FF0, 0xFFFFFFFF00000000, 0x9696969669696969, 0x5A5A5A5A5A5A5A5A, 0xA5A5A5A55A5A5A5A, 0x5555AAAAAAAA5555, 0xF00FF00FF00FF00F, 0xF0F00F0FF0F00F0F }, { 0x5AA55AA5A55AA55A, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0xCC33CC33CC33CC33, 0x0FF00FF0F00FF00F, 0x00000000FFFFFFFF, 0x9696969669696969, 0x5A5A5A5A5A5A5A5A, 0xA5A5A5A55A5A5A5A, 0x5555AAAAAAAA5555, 0xF00FF00FF00FF00F, 0xF0F00F0FF0F00F0F }, { 0x5AA55AA5A55AA55A, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0xCC33CC33CC33CC33, 0xF00FF00F0FF00FF0, 0x00000000FFFFFFFF, 0x9696969669696969, 0x5A5A5A5A5A5A5A5A, 0xA5A5A5A55A5A5A5A, 0xAAAA55555555AAAA, 0x0FF00FF00FF00FF0, 0x0F0FF0F00F0FF0F0 }, { 0xA55AA55A5AA55AA5, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0xCC33CC33CC33CC33, 0x0FF00FF0F00FF00F, 0x00000000FFFFFFFF, 0x9696969669696969, 0xA5A5A5A5A5A5A5A5, 0x5A5A5A5AA5A5A5A5, 0x5555AAAAAAAA5555, 0xF00FF00FF00FF00F, 0x0F0FF0F00F0FF0F0 }, { 0xA55AA55A5AA55AA5, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0xCC33CC33CC33CC33, 0xF00FF00F0FF00FF0, 0x00000000FFFFFFFF, 0x9696969669696969, 0xA5A5A5A5A5A5A5A5, 0x5A5A5A5AA5A5A5A5, 0xAAAA55555555AAAA, 0x0FF00FF00FF00FF0, 0xF0F00F0FF0F00F0F }, { 0xA55AA55A5AA55AA5, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0x33CC33CC33CC33CC, 0x0FF00FF0F00FF00F, 0x00000000FFFFFFFF, 0x6969696996969696, 0x5A5A5A5A5A5A5A5A, 0x5A5A5A5AA5A5A5A5, 0x5555AAAAAAAA5555, 0x0FF00FF00FF00FF0, 0xF0F00F0FF0F00F0F }, { 0xA55AA55A5AA55AA5, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0x33CC33CC33CC33CC, 0xF00FF00F0FF00FF0, 0x00000000FFFFFFFF, 0x6969696996969696, 0x5A5A5A5A5A5A5A5A, 0x5A5A5A5AA5A5A5A5, 0xAAAA55555555AAAA, 0xF00FF00FF00FF00F, 0x0F0FF0F00F0FF0F0 }, { 0x5AA55AA5A55AA55A, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0x33CC33CC33CC33CC, 0x0FF00FF0F00FF00F, 0x00000000FFFFFFFF, 0x6969696996969696, 0xA5A5A5A5A5A5A5A5, 0xA5A5A5A55A5A5A5A, 0x5555AAAAAAAA5555, 0x0FF00FF00FF00FF0, 0x0F0FF0F00F0FF0F0 }, { 0x5AA55AA5A55AA55A, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0x33CC33CC33CC33CC, 0xF00FF00F0FF00FF0, 0x00000000FFFFFFFF, 0x6969696996969696, 0xA5A5A5A5A5A5A5A5, 0xA5A5A5A55A5A5A5A, 0xAAAA55555555AAAA, 0xF00FF00FF00FF00F, 0xF0F00F0FF0F00F0F }, { 0xA55AA55A5AA55AA5, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0x33CC33CC33CC33CC, 0x0FF00FF0F00FF00F, 0x00000000FFFFFFFF, 0x6969696996969696, 0x5A5A5A5A5A5A5A5A, 0x5A5A5A5AA5A5A5A5, 0xAAAA55555555AAAA, 0xF00FF00FF00FF00F, 0xF0F00F0FF0F00F0F }, { 0xA55AA55A5AA55AA5, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0x33CC33CC33CC33CC, 0xF00FF00F0FF00FF0, 0x00000000FFFFFFFF, 0x6969696996969696, 0x5A5A5A5A5A5A5A5A, 0x5A5A5A5AA5A5A5A5, 0x5555AAAAAAAA5555, 0x0FF00FF00FF00FF0, 0x0F0FF0F00F0FF0F0 }, { 0x5AA55AA5A55AA55A, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0x33CC33CC33CC33CC, 0x0FF00FF0F00FF00F, 0x00000000FFFFFFFF, 0x6969696996969696, 0xA5A5A5A5A5A5A5A5, 0xA5A5A5A55A5A5A5A, 0xAAAA55555555AAAA, 0xF00FF00FF00FF00F, 0x0F0FF0F00F0FF0F0 }, { 0x5AA55AA5A55AA55A, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0x33CC33CC33CC33CC, 0xF00FF00F0FF00FF0, 0x00000000FFFFFFFF, 0x6969696996969696, 0xA5A5A5A5A5A5A5A5, 0xA5A5A5A55A5A5A5A, 0x5555AAAAAAAA5555, 0x0FF00FF00FF00FF0, 0xF0F00F0FF0F00F0F }, { 0x5AA55AA5A55AA55A, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0xCC33CC33CC33CC33, 0x0FF00FF0F00FF00F, 0x00000000FFFFFFFF, 0x9696969669696969, 0x5A5A5A5A5A5A5A5A, 0xA5A5A5A55A5A5A5A, 0xAAAA55555555AAAA, 0x0FF00FF00FF00FF0, 0xF0F00F0FF0F00F0F }, { 0x5AA55AA5A55AA55A, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0xCC33CC33CC33CC33, 0xF00FF00F0FF00FF0, 0x00000000FFFFFFFF, 0x9696969669696969, 0x5A5A5A5A5A5A5A5A, 0xA5A5A5A55A5A5A5A, 0x5555AAAAAAAA5555, 0xF00FF00FF00FF00F, 0x0F0FF0F00F0FF0F0 }, { 0xA55AA55A5AA55AA5, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0xCC33CC33CC33CC33, 0x0FF00FF0F00FF00F, 0x00000000FFFFFFFF, 0x9696969669696969, 0xA5A5A5A5A5A5A5A5, 0x5A5A5A5AA5A5A5A5, 0xAAAA55555555AAAA, 0x0FF00FF00FF00FF0, 0x0F0FF0F00F0FF0F0 }, { 0xA55AA55A5AA55AA5, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0xCC33CC33CC33CC33, 0xF00FF00F0FF00FF0, 0x00000000FFFFFFFF, 0x9696969669696969, 0xA5A5A5A5A5A5A5A5, 0x5A5A5A5AA5A5A5A5, 0x5555AAAAAAAA5555, 0xF00FF00FF00FF00F, 0xF0F00F0FF0F00F0F }, { 0xA55AA55A5AA55AA5, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0xCC33CC33CC33CC33, 0x0FF00FF0F00FF00F, 0xFFFFFFFF00000000, 0x9696969669696969, 0xA5A5A5A5A5A5A5A5, 0x5A5A5A5AA5A5A5A5, 0x5555AAAAAAAA5555, 0xF00FF00FF00FF00F, 0xF0F00F0FF0F00F0F }, { 0xA55AA55A5AA55AA5, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0xCC33CC33CC33CC33, 0xF00FF00F0FF00FF0, 0xFFFFFFFF00000000, 0x9696969669696969, 0xA5A5A5A5A5A5A5A5, 0x5A5A5A5AA5A5A5A5, 0xAAAA55555555AAAA, 0x0FF00FF00FF00FF0, 0x0F0FF0F00F0FF0F0 }, { 0x5AA55AA5A55AA55A, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0xCC33CC33CC33CC33, 0x0FF00FF0F00FF00F, 0xFFFFFFFF00000000, 0x9696969669696969, 0x5A5A5A5A5A5A5A5A, 0xA5A5A5A55A5A5A5A, 0x5555AAAAAAAA5555, 0xF00FF00FF00FF00F, 0x0F0FF0F00F0FF0F0 }, { 0x5AA55AA5A55AA55A, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0xCC33CC33CC33CC33, 0xF00FF00F0FF00FF0, 0xFFFFFFFF00000000, 0x9696969669696969, 0x5A5A5A5A5A5A5A5A, 0xA5A5A5A55A5A5A5A, 0xAAAA55555555AAAA, 0x0FF00FF00FF00FF0, 0xF0F00F0FF0F00F0F }, { 0x5AA55AA5A55AA55A, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0x33CC33CC33CC33CC, 0x0FF00FF0F00FF00F, 0xFFFFFFFF00000000, 0x6969696996969696, 0xA5A5A5A5A5A5A5A5, 0xA5A5A5A55A5A5A5A, 0x5555AAAAAAAA5555, 0x0FF00FF00FF00FF0, 0xF0F00F0FF0F00F0F }, { 0x5AA55AA5A55AA55A, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0x33CC33CC33CC33CC, 0xF00FF00F0FF00FF0, 0xFFFFFFFF00000000, 0x6969696996969696, 0xA5A5A5A5A5A5A5A5, 0xA5A5A5A55A5A5A5A, 0xAAAA55555555AAAA, 0xF00FF00FF00FF00F, 0x0F0FF0F00F0FF0F0 }, { 0xA55AA55A5AA55AA5, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0x33CC33CC33CC33CC, 0x0FF00FF0F00FF00F, 0xFFFFFFFF00000000, 0x6969696996969696, 0x5A5A5A5A5A5A5A5A, 0x5A5A5A5AA5A5A5A5, 0x5555AAAAAAAA5555, 0x0FF00FF00FF00FF0, 0x0F0FF0F00F0FF0F0 }, { 0xA55AA55A5AA55AA5, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0x33CC33CC33CC33CC, 0xF00FF00F0FF00FF0, 0xFFFFFFFF00000000, 0x6969696996969696, 0x5A5A5A5A5A5A5A5A, 0x5A5A5A5AA5A5A5A5, 0xAAAA55555555AAAA, 0xF00FF00FF00FF00F, 0xF0F00F0FF0F00F0F }, { 0xA55AA55A5AA55AA5, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0x33CC33CC33CC33CC, 0xF00FF00F0FF00FF0, 0x00000000FFFFFFFF, 0x6969696996969696, 0xA5A5A5A5A5A5A5A5, 0x5A5A5A5AA5A5A5A5, 0xAAAA55555555AAAA, 0x0FF00FF00FF00FF0, 0x0F0FF0F00F0FF0F0 }, { 0xA55AA55A5AA55AA5, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0x33CC33CC33CC33CC, 0x0FF00FF0F00FF00F, 0x00000000FFFFFFFF, 0x6969696996969696, 0xA5A5A5A5A5A5A5A5, 0x5A5A5A5AA5A5A5A5, 0x5555AAAAAAAA5555, 0xF00FF00FF00FF00F, 0xF0F00F0FF0F00F0F }, { 0x5AA55AA5A55AA55A, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0x33CC33CC33CC33CC, 0xF00FF00F0FF00FF0, 0x00000000FFFFFFFF, 0x6969696996969696, 0x5A5A5A5A5A5A5A5A, 0xA5A5A5A55A5A5A5A, 0xAAAA55555555AAAA, 0x0FF00FF00FF00FF0, 0xF0F00F0FF0F00F0F }, { 0x5AA55AA5A55AA55A, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0x33CC33CC33CC33CC, 0x0FF00FF0F00FF00F, 0x00000000FFFFFFFF, 0x6969696996969696, 0x5A5A5A5A5A5A5A5A, 0xA5A5A5A55A5A5A5A, 0x5555AAAAAAAA5555, 0xF00FF00FF00FF00F, 0x0F0FF0F00F0FF0F0 }, { 0x5AA55AA5A55AA55A, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0xCC33CC33CC33CC33, 0xF00FF00F0FF00FF0, 0x00000000FFFFFFFF, 0x9696969669696969, 0xA5A5A5A5A5A5A5A5, 0xA5A5A5A55A5A5A5A, 0xAAAA55555555AAAA, 0xF00FF00FF00FF00F, 0x0F0FF0F00F0FF0F0 }, { 0x5AA55AA5A55AA55A, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0xCC33CC33CC33CC33, 0x0FF00FF0F00FF00F, 0x00000000FFFFFFFF, 0x9696969669696969, 0xA5A5A5A5A5A5A5A5, 0xA5A5A5A55A5A5A5A, 0x5555AAAAAAAA5555, 0x0FF00FF00FF00FF0, 0xF0F00F0FF0F00F0F }, { 0xA55AA55A5AA55AA5, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0xCC33CC33CC33CC33, 0xF00FF00F0FF00FF0, 0x00000000FFFFFFFF, 0x9696969669696969, 0x5A5A5A5A5A5A5A5A, 0x5A5A5A5AA5A5A5A5, 0xAAAA55555555AAAA, 0xF00FF00FF00FF00F, 0xF0F00F0FF0F00F0F }, { 0xA55AA55A5AA55AA5, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0xCC33CC33CC33CC33, 0x0FF00FF0F00FF00F, 0x00000000FFFFFFFF, 0x9696969669696969, 0x5A5A5A5A5A5A5A5A, 0x5A5A5A5AA5A5A5A5, 0x5555AAAAAAAA5555, 0x0FF00FF00FF00FF0, 0x0F0FF0F00F0FF0F0 }, { 0xA55AA55A5AA55AA5, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0xCC33CC33CC33CC33, 0xF00FF00F0FF00FF0, 0xFFFFFFFF00000000, 0x9696969669696969, 0x5A5A5A5A5A5A5A5A, 0x5A5A5A5AA5A5A5A5, 0x5555AAAAAAAA5555, 0x0FF00FF00FF00FF0, 0x0F0FF0F00F0FF0F0 }, { 0xA55AA55A5AA55AA5, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0xCC33CC33CC33CC33, 0x0FF00FF0F00FF00F, 0xFFFFFFFF00000000, 0x9696969669696969, 0x5A5A5A5A5A5A5A5A, 0x5A5A5A5AA5A5A5A5, 0xAAAA55555555AAAA, 0xF00FF00FF00FF00F, 0xF0F00F0FF0F00F0F }, { 0x5AA55AA5A55AA55A, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0xCC33CC33CC33CC33, 0xF00FF00F0FF00FF0, 0xFFFFFFFF00000000, 0x9696969669696969, 0xA5A5A5A5A5A5A5A5, 0xA5A5A5A55A5A5A5A, 0x5555AAAAAAAA5555, 0x0FF00FF00FF00FF0, 0xF0F00F0FF0F00F0F }, { 0x5AA55AA5A55AA55A, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0xCC33CC33CC33CC33, 0x0FF00FF0F00FF00F, 0xFFFFFFFF00000000, 0x9696969669696969, 0xA5A5A5A5A5A5A5A5, 0xA5A5A5A55A5A5A5A, 0xAAAA55555555AAAA, 0xF00FF00FF00FF00F, 0x0F0FF0F00F0FF0F0 }, { 0x5AA55AA5A55AA55A, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0x33CC33CC33CC33CC, 0xF00FF00F0FF00FF0, 0xFFFFFFFF00000000, 0x6969696996969696, 0x5A5A5A5A5A5A5A5A, 0xA5A5A5A55A5A5A5A, 0x5555AAAAAAAA5555, 0xF00FF00FF00FF00F, 0x0F0FF0F00F0FF0F0 }, { 0x5AA55AA5A55AA55A, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0x33CC33CC33CC33CC, 0x0FF00FF0F00FF00F, 0xFFFFFFFF00000000, 0x6969696996969696, 0x5A5A5A5A5A5A5A5A, 0xA5A5A5A55A5A5A5A, 0xAAAA55555555AAAA, 0x0FF00FF00FF00FF0, 0xF0F00F0FF0F00F0F }, { 0xA55AA55A5AA55AA5, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0x33CC33CC33CC33CC, 0xF00FF00F0FF00FF0, 0xFFFFFFFF00000000, 0x6969696996969696, 0xA5A5A5A5A5A5A5A5, 0x5A5A5A5AA5A5A5A5, 0x5555AAAAAAAA5555, 0xF00FF00FF00FF00F, 0xF0F00F0FF0F00F0F }, { 0xA55AA55A5AA55AA5, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0x33CC33CC33CC33CC, 0x0FF00FF0F00FF00F, 0xFFFFFFFF00000000, 0x6969696996969696, 0xA5A5A5A5A5A5A5A5, 0x5A5A5A5AA5A5A5A5, 0xAAAA55555555AAAA, 0x0FF00FF00FF00FF0, 0x0F0FF0F00F0FF0F0 }, { 0xA55AA55A5AA55AA5, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0x33CC33CC33CC33CC, 0xF00FF00F0FF00FF0, 0xFFFFFFFF00000000, 0x6969696996969696, 0x5A5A5A5A5A5A5A5A, 0xA5A5A5A55A5A5A5A, 0xAAAA55555555AAAA, 0x0FF00FF00FF00FF0, 0x0F0FF0F00F0FF0F0 }, { 0xA55AA55A5AA55AA5, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0x33CC33CC33CC33CC, 0x0FF00FF0F00FF00F, 0xFFFFFFFF00000000, 0x6969696996969696, 0x5A5A5A5A5A5A5A5A, 0xA5A5A5A55A5A5A5A, 0x5555AAAAAAAA5555, 0xF00FF00FF00FF00F, 0xF0F00F0FF0F00F0F }, { 0x5AA55AA5A55AA55A, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0x33CC33CC33CC33CC, 0xF00FF00F0FF00FF0, 0xFFFFFFFF00000000, 0x6969696996969696, 0xA5A5A5A5A5A5A5A5, 0x5A5A5A5AA5A5A5A5, 0xAAAA55555555AAAA, 0x0FF00FF00FF00FF0, 0xF0F00F0FF0F00F0F }, { 0x5AA55AA5A55AA55A, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0x33CC33CC33CC33CC, 0x0FF00FF0F00FF00F, 0xFFFFFFFF00000000, 0x6969696996969696, 0xA5A5A5A5A5A5A5A5, 0x5A5A5A5AA5A5A5A5, 0x5555AAAAAAAA5555, 0xF00FF00FF00FF00F, 0x0F0FF0F00F0FF0F0 }, { 0x5AA55AA5A55AA55A, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0xCC33CC33CC33CC33, 0xF00FF00F0FF00FF0, 0xFFFFFFFF00000000, 0x9696969669696969, 0x5A5A5A5A5A5A5A5A, 0x5A5A5A5AA5A5A5A5, 0xAAAA55555555AAAA, 0xF00FF00FF00FF00F, 0x0F0FF0F00F0FF0F0 }, { 0x5AA55AA5A55AA55A, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0xCC33CC33CC33CC33, 0x0FF00FF0F00FF00F, 0xFFFFFFFF00000000, 0x9696969669696969, 0x5A5A5A5A5A5A5A5A, 0x5A5A5A5AA5A5A5A5, 0x5555AAAAAAAA5555, 0x0FF00FF00FF00FF0, 0xF0F00F0FF0F00F0F }, { 0xA55AA55A5AA55AA5, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0xCC33CC33CC33CC33, 0xF00FF00F0FF00FF0, 0xFFFFFFFF00000000, 0x9696969669696969, 0xA5A5A5A5A5A5A5A5, 0xA5A5A5A55A5A5A5A, 0xAAAA55555555AAAA, 0xF00FF00FF00FF00F, 0xF0F00F0FF0F00F0F }, { 0xA55AA55A5AA55AA5, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0xCC33CC33CC33CC33, 0x0FF00FF0F00FF00F, 0xFFFFFFFF00000000, 0x9696969669696969, 0xA5A5A5A5A5A5A5A5, 0xA5A5A5A55A5A5A5A, 0x5555AAAAAAAA5555, 0x0FF00FF00FF00FF0, 0x0F0FF0F00F0FF0F0 }, { 0xA55AA55A5AA55AA5, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0xCC33CC33CC33CC33, 0xF00FF00F0FF00FF0, 0x00000000FFFFFFFF, 0x9696969669696969, 0xA5A5A5A5A5A5A5A5, 0xA5A5A5A55A5A5A5A, 0x5555AAAAAAAA5555, 0x0FF00FF00FF00FF0, 0x0F0FF0F00F0FF0F0 }, { 0xA55AA55A5AA55AA5, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0xCC33CC33CC33CC33, 0x0FF00FF0F00FF00F, 0x00000000FFFFFFFF, 0x9696969669696969, 0xA5A5A5A5A5A5A5A5, 0xA5A5A5A55A5A5A5A, 0xAAAA55555555AAAA, 0xF00FF00FF00FF00F, 0xF0F00F0FF0F00F0F }, { 0x5AA55AA5A55AA55A, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0xCC33CC33CC33CC33, 0xF00FF00F0FF00FF0, 0x00000000FFFFFFFF, 0x9696969669696969, 0x5A5A5A5A5A5A5A5A, 0x5A5A5A5AA5A5A5A5, 0x5555AAAAAAAA5555, 0x0FF00FF00FF00FF0, 0xF0F00F0FF0F00F0F }, { 0x5AA55AA5A55AA55A, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0xCC33CC33CC33CC33, 0x0FF00FF0F00FF00F, 0x00000000FFFFFFFF, 0x9696969669696969, 0x5A5A5A5A5A5A5A5A, 0x5A5A5A5AA5A5A5A5, 0xAAAA55555555AAAA, 0xF00FF00FF00FF00F, 0x0F0FF0F00F0FF0F0 }, { 0x5AA55AA5A55AA55A, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0x33CC33CC33CC33CC, 0xF00FF00F0FF00FF0, 0x00000000FFFFFFFF, 0x6969696996969696, 0xA5A5A5A5A5A5A5A5, 0x5A5A5A5AA5A5A5A5, 0x5555AAAAAAAA5555, 0xF00FF00FF00FF00F, 0x0F0FF0F00F0FF0F0 }, { 0x5AA55AA5A55AA55A, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0x33CC33CC33CC33CC, 0x0FF00FF0F00FF00F, 0x00000000FFFFFFFF, 0x6969696996969696, 0xA5A5A5A5A5A5A5A5, 0x5A5A5A5AA5A5A5A5, 0xAAAA55555555AAAA, 0x0FF00FF00FF00FF0, 0xF0F00F0FF0F00F0F }, { 0xA55AA55A5AA55AA5, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0x33CC33CC33CC33CC, 0xF00FF00F0FF00FF0, 0x00000000FFFFFFFF, 0x6969696996969696, 0x5A5A5A5A5A5A5A5A, 0xA5A5A5A55A5A5A5A, 0x5555AAAAAAAA5555, 0xF00FF00FF00FF00F, 0xF0F00F0FF0F00F0F }, { 0xA55AA55A5AA55AA5, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0x33CC33CC33CC33CC, 0x0FF00FF0F00FF00F, 0x00000000FFFFFFFF, 0x6969696996969696, 0x5A5A5A5A5A5A5A5A, 0xA5A5A5A55A5A5A5A, 0xAAAA55555555AAAA, 0x0FF00FF00FF00FF0, 0x0F0FF0F00F0FF0F0 }, { 0xA55AA55A5AA55AA5, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0x33CC33CC33CC33CC, 0x0FF00FF0F00FF00F, 0xFFFFFFFF00000000, 0x6969696996969696, 0xA5A5A5A5A5A5A5A5, 0xA5A5A5A55A5A5A5A, 0xAAAA55555555AAAA, 0xF00FF00FF00FF00F, 0xF0F00F0FF0F00F0F }, { 0xA55AA55A5AA55AA5, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0x33CC33CC33CC33CC, 0xF00FF00F0FF00FF0, 0xFFFFFFFF00000000, 0x6969696996969696, 0xA5A5A5A5A5A5A5A5, 0xA5A5A5A55A5A5A5A, 0x5555AAAAAAAA5555, 0x0FF00FF00FF00FF0, 0x0F0FF0F00F0FF0F0 }, { 0x5AA55AA5A55AA55A, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0x33CC33CC33CC33CC, 0x0FF00FF0F00FF00F, 0xFFFFFFFF00000000, 0x6969696996969696, 0x5A5A5A5A5A5A5A5A, 0x5A5A5A5AA5A5A5A5, 0xAAAA55555555AAAA, 0xF00FF00FF00FF00F, 0x0F0FF0F00F0FF0F0 }, { 0x5AA55AA5A55AA55A, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0x33CC33CC33CC33CC, 0xF00FF00F0FF00FF0, 0xFFFFFFFF00000000, 0x6969696996969696, 0x5A5A5A5A5A5A5A5A, 0x5A5A5A5AA5A5A5A5, 0x5555AAAAAAAA5555, 0x0FF00FF00FF00FF0, 0xF0F00F0FF0F00F0F }, { 0x5AA55AA5A55AA55A, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0xCC33CC33CC33CC33, 0x0FF00FF0F00FF00F, 0xFFFFFFFF00000000, 0x9696969669696969, 0xA5A5A5A5A5A5A5A5, 0x5A5A5A5AA5A5A5A5, 0xAAAA55555555AAAA, 0x0FF00FF00FF00FF0, 0xF0F00F0FF0F00F0F }, { 0x5AA55AA5A55AA55A, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0xCC33CC33CC33CC33, 0xF00FF00F0FF00FF0, 0xFFFFFFFF00000000, 0x9696969669696969, 0xA5A5A5A5A5A5A5A5, 0x5A5A5A5AA5A5A5A5, 0x5555AAAAAAAA5555, 0xF00FF00FF00FF00F, 0x0F0FF0F00F0FF0F0 }, { 0xA55AA55A5AA55AA5, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0xCC33CC33CC33CC33, 0x0FF00FF0F00FF00F, 0xFFFFFFFF00000000, 0x9696969669696969, 0x5A5A5A5A5A5A5A5A, 0xA5A5A5A55A5A5A5A, 0xAAAA55555555AAAA, 0x0FF00FF00FF00FF0, 0x0F0FF0F00F0FF0F0 }, { 0xA55AA55A5AA55AA5, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0xCC33CC33CC33CC33, 0xF00FF00F0FF00FF0, 0xFFFFFFFF00000000, 0x9696969669696969, 0x5A5A5A5A5A5A5A5A, 0xA5A5A5A55A5A5A5A, 0x5555AAAAAAAA5555, 0xF00FF00FF00FF00F, 0xF0F00F0FF0F00F0F }, { 0xA55AA55A5AA55AA5, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0xCC33CC33CC33CC33, 0x0FF00FF0F00FF00F, 0x00000000FFFFFFFF, 0x9696969669696969, 0x5A5A5A5A5A5A5A5A, 0xA5A5A5A55A5A5A5A, 0x5555AAAAAAAA5555, 0xF00FF00FF00FF00F, 0xF0F00F0FF0F00F0F }, { 0xA55AA55A5AA55AA5, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0xCC33CC33CC33CC33, 0xF00FF00F0FF00FF0, 0x00000000FFFFFFFF, 0x9696969669696969, 0x5A5A5A5A5A5A5A5A, 0xA5A5A5A55A5A5A5A, 0xAAAA55555555AAAA, 0x0FF00FF00FF00FF0, 0x0F0FF0F00F0FF0F0 }, { 0x5AA55AA5A55AA55A, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0xCC33CC33CC33CC33, 0x0FF00FF0F00FF00F, 0x00000000FFFFFFFF, 0x9696969669696969, 0xA5A5A5A5A5A5A5A5, 0x5A5A5A5AA5A5A5A5, 0x5555AAAAAAAA5555, 0xF00FF00FF00FF00F, 0x0F0FF0F00F0FF0F0 }, { 0x5AA55AA5A55AA55A, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0xCC33CC33CC33CC33, 0xF00FF00F0FF00FF0, 0x00000000FFFFFFFF, 0x9696969669696969, 0xA5A5A5A5A5A5A5A5, 0x5A5A5A5AA5A5A5A5, 0xAAAA55555555AAAA, 0x0FF00FF00FF00FF0, 0xF0F00F0FF0F00F0F }, { 0x5AA55AA5A55AA55A, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0x33CC33CC33CC33CC, 0x0FF00FF0F00FF00F, 0x00000000FFFFFFFF, 0x6969696996969696, 0x5A5A5A5A5A5A5A5A, 0x5A5A5A5AA5A5A5A5, 0x5555AAAAAAAA5555, 0x0FF00FF00FF00FF0, 0xF0F00F0FF0F00F0F }, { 0x5AA55AA5A55AA55A, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0x33CC33CC33CC33CC, 0xF00FF00F0FF00FF0, 0x00000000FFFFFFFF, 0x6969696996969696, 0x5A5A5A5A5A5A5A5A, 0x5A5A5A5AA5A5A5A5, 0xAAAA55555555AAAA, 0xF00FF00FF00FF00F, 0x0F0FF0F00F0FF0F0 }, { 0xA55AA55A5AA55AA5, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0x33CC33CC33CC33CC, 0x0FF00FF0F00FF00F, 0x00000000FFFFFFFF, 0x6969696996969696, 0xA5A5A5A5A5A5A5A5, 0xA5A5A5A55A5A5A5A, 0x5555AAAAAAAA5555, 0x0FF00FF00FF00FF0, 0x0F0FF0F00F0FF0F0 }, { 0xA55AA55A5AA55AA5, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0x33CC33CC33CC33CC, 0xF00FF00F0FF00FF0, 0x00000000FFFFFFFF, 0x6969696996969696, 0xA5A5A5A5A5A5A5A5, 0xA5A5A5A55A5A5A5A, 0xAAAA55555555AAAA, 0xF00FF00FF00FF00F, 0xF0F00F0FF0F00F0F }, { 0x5AA55AA5A55AA55A, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0x33CC33CC33CC33CC, 0x0FF00FF0F00FF00F, 0x00000000FFFFFFFF, 0x6969696996969696, 0x5A5A5A5A5A5A5A5A, 0x5A5A5A5AA5A5A5A5, 0xAAAA55555555AAAA, 0xF00FF00FF00FF00F, 0xF0F00F0FF0F00F0F }, { 0x5AA55AA5A55AA55A, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0x33CC33CC33CC33CC, 0xF00FF00F0FF00FF0, 0x00000000FFFFFFFF, 0x6969696996969696, 0x5A5A5A5A5A5A5A5A, 0x5A5A5A5AA5A5A5A5, 0x5555AAAAAAAA5555, 0x0FF00FF00FF00FF0, 0x0F0FF0F00F0FF0F0 }, { 0xA55AA55A5AA55AA5, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0x33CC33CC33CC33CC, 0x0FF00FF0F00FF00F, 0x00000000FFFFFFFF, 0x6969696996969696, 0xA5A5A5A5A5A5A5A5, 0xA5A5A5A55A5A5A5A, 0xAAAA55555555AAAA, 0xF00FF00FF00FF00F, 0x0F0FF0F00F0FF0F0 }, { 0xA55AA55A5AA55AA5, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0x33CC33CC33CC33CC, 0xF00FF00F0FF00FF0, 0x00000000FFFFFFFF, 0x6969696996969696, 0xA5A5A5A5A5A5A5A5, 0xA5A5A5A55A5A5A5A, 0x5555AAAAAAAA5555, 0x0FF00FF00FF00FF0, 0xF0F00F0FF0F00F0F }, { 0xA55AA55A5AA55AA5, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0xCC33CC33CC33CC33, 0x0FF00FF0F00FF00F, 0x00000000FFFFFFFF, 0x9696969669696969, 0x5A5A5A5A5A5A5A5A, 0xA5A5A5A55A5A5A5A, 0xAAAA55555555AAAA, 0x0FF00FF00FF00FF0, 0xF0F00F0FF0F00F0F }, { 0xA55AA55A5AA55AA5, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0xCC33CC33CC33CC33, 0xF00FF00F0FF00FF0, 0x00000000FFFFFFFF, 0x9696969669696969, 0x5A5A5A5A5A5A5A5A, 0xA5A5A5A55A5A5A5A, 0x5555AAAAAAAA5555, 0xF00FF00FF00FF00F, 0x0F0FF0F00F0FF0F0 }, { 0x5AA55AA5A55AA55A, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0xCC33CC33CC33CC33, 0x0FF00FF0F00FF00F, 0x00000000FFFFFFFF, 0x9696969669696969, 0xA5A5A5A5A5A5A5A5, 0x5A5A5A5AA5A5A5A5, 0xAAAA55555555AAAA, 0x0FF00FF00FF00FF0, 0x0F0FF0F00F0FF0F0 }, { 0x5AA55AA5A55AA55A, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0xCC33CC33CC33CC33, 0xF00FF00F0FF00FF0, 0x00000000FFFFFFFF, 0x9696969669696969, 0xA5A5A5A5A5A5A5A5, 0x5A5A5A5AA5A5A5A5, 0x5555AAAAAAAA5555, 0xF00FF00FF00FF00F, 0xF0F00F0FF0F00F0F }, { 0x5AA55AA5A55AA55A, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0xCC33CC33CC33CC33, 0x0FF00FF0F00FF00F, 0xFFFFFFFF00000000, 0x9696969669696969, 0xA5A5A5A5A5A5A5A5, 0x5A5A5A5AA5A5A5A5, 0x5555AAAAAAAA5555, 0xF00FF00FF00FF00F, 0xF0F00F0FF0F00F0F }, { 0x5AA55AA5A55AA55A, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0xCC33CC33CC33CC33, 0xF00FF00F0FF00FF0, 0xFFFFFFFF00000000, 0x9696969669696969, 0xA5A5A5A5A5A5A5A5, 0x5A5A5A5AA5A5A5A5, 0xAAAA55555555AAAA, 0x0FF00FF00FF00FF0, 0x0F0FF0F00F0FF0F0 }, { 0xA55AA55A5AA55AA5, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0xCC33CC33CC33CC33, 0x0FF00FF0F00FF00F, 0xFFFFFFFF00000000, 0x9696969669696969, 0x5A5A5A5A5A5A5A5A, 0xA5A5A5A55A5A5A5A, 0x5555AAAAAAAA5555, 0xF00FF00FF00FF00F, 0x0F0FF0F00F0FF0F0 }, { 0xA55AA55A5AA55AA5, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0xCC33CC33CC33CC33, 0xF00FF00F0FF00FF0, 0xFFFFFFFF00000000, 0x9696969669696969, 0x5A5A5A5A5A5A5A5A, 0xA5A5A5A55A5A5A5A, 0xAAAA55555555AAAA, 0x0FF00FF00FF00FF0, 0xF0F00F0FF0F00F0F }, { 0xA55AA55A5AA55AA5, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0x33CC33CC33CC33CC, 0x0FF00FF0F00FF00F, 0xFFFFFFFF00000000, 0x6969696996969696, 0xA5A5A5A5A5A5A5A5, 0xA5A5A5A55A5A5A5A, 0x5555AAAAAAAA5555, 0x0FF00FF00FF00FF0, 0xF0F00F0FF0F00F0F }, { 0xA55AA55A5AA55AA5, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0x33CC33CC33CC33CC, 0xF00FF00F0FF00FF0, 0xFFFFFFFF00000000, 0x6969696996969696, 0xA5A5A5A5A5A5A5A5, 0xA5A5A5A55A5A5A5A, 0xAAAA55555555AAAA, 0xF00FF00FF00FF00F, 0x0F0FF0F00F0FF0F0 }, { 0x5AA55AA5A55AA55A, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0x33CC33CC33CC33CC, 0x0FF00FF0F00FF00F, 0xFFFFFFFF00000000, 0x6969696996969696, 0x5A5A5A5A5A5A5A5A, 0x5A5A5A5AA5A5A5A5, 0x5555AAAAAAAA5555, 0x0FF00FF00FF00FF0, 0x0F0FF0F00F0FF0F0 }, { 0x5AA55AA5A55AA55A, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0x33CC33CC33CC33CC, 0xF00FF00F0FF00FF0, 0xFFFFFFFF00000000, 0x6969696996969696, 0x5A5A5A5A5A5A5A5A, 0x5A5A5A5AA5A5A5A5, 0xAAAA55555555AAAA, 0xF00FF00FF00FF00F, 0xF0F00F0FF0F00F0F }, { 0x5AA55AA5A55AA55A, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0x33CC33CC33CC33CC, 0xF00FF00F0FF00FF0, 0x00000000FFFFFFFF, 0x6969696996969696, 0xA5A5A5A5A5A5A5A5, 0x5A5A5A5AA5A5A5A5, 0xAAAA55555555AAAA, 0x0FF00FF00FF00FF0, 0x0F0FF0F00F0FF0F0 }, { 0x5AA55AA5A55AA55A, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0x33CC33CC33CC33CC, 0x0FF00FF0F00FF00F, 0x00000000FFFFFFFF, 0x6969696996969696, 0xA5A5A5A5A5A5A5A5, 0x5A5A5A5AA5A5A5A5, 0x5555AAAAAAAA5555, 0xF00FF00FF00FF00F, 0xF0F00F0FF0F00F0F }, { 0xA55AA55A5AA55AA5, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0x33CC33CC33CC33CC, 0xF00FF00F0FF00FF0, 0x00000000FFFFFFFF, 0x6969696996969696, 0x5A5A5A5A5A5A5A5A, 0xA5A5A5A55A5A5A5A, 0xAAAA55555555AAAA, 0x0FF00FF00FF00FF0, 0xF0F00F0FF0F00F0F }, { 0xA55AA55A5AA55AA5, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0x33CC33CC33CC33CC, 0x0FF00FF0F00FF00F, 0x00000000FFFFFFFF, 0x6969696996969696, 0x5A5A5A5A5A5A5A5A, 0xA5A5A5A55A5A5A5A, 0x5555AAAAAAAA5555, 0xF00FF00FF00FF00F, 0x0F0FF0F00F0FF0F0 }, { 0xA55AA55A5AA55AA5, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0xCC33CC33CC33CC33, 0xF00FF00F0FF00FF0, 0x00000000FFFFFFFF, 0x9696969669696969, 0xA5A5A5A5A5A5A5A5, 0xA5A5A5A55A5A5A5A, 0xAAAA55555555AAAA, 0xF00FF00FF00FF00F, 0x0F0FF0F00F0FF0F0 }, { 0xA55AA55A5AA55AA5, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0xCC33CC33CC33CC33, 0x0FF00FF0F00FF00F, 0x00000000FFFFFFFF, 0x9696969669696969, 0xA5A5A5A5A5A5A5A5, 0xA5A5A5A55A5A5A5A, 0x5555AAAAAAAA5555, 0x0FF00FF00FF00FF0, 0xF0F00F0FF0F00F0F }, { 0x5AA55AA5A55AA55A, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0xCC33CC33CC33CC33, 0xF00FF00F0FF00FF0, 0x00000000FFFFFFFF, 0x9696969669696969, 0x5A5A5A5A5A5A5A5A, 0x5A5A5A5AA5A5A5A5, 0xAAAA55555555AAAA, 0xF00FF00FF00FF00F, 0xF0F00F0FF0F00F0F }, { 0x5AA55AA5A55AA55A, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0xCC33CC33CC33CC33, 0x0FF00FF0F00FF00F, 0x00000000FFFFFFFF, 0x9696969669696969, 0x5A5A5A5A5A5A5A5A, 0x5A5A5A5AA5A5A5A5, 0x5555AAAAAAAA5555, 0x0FF00FF00FF00FF0, 0x0F0FF0F00F0FF0F0 }, { 0x5AA55AA5A55AA55A, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0xCC33CC33CC33CC33, 0xF00FF00F0FF00FF0, 0xFFFFFFFF00000000, 0x9696969669696969, 0x5A5A5A5A5A5A5A5A, 0x5A5A5A5AA5A5A5A5, 0x5555AAAAAAAA5555, 0x0FF00FF00FF00FF0, 0x0F0FF0F00F0FF0F0 }, { 0x5AA55AA5A55AA55A, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0xCC33CC33CC33CC33, 0x0FF00FF0F00FF00F, 0xFFFFFFFF00000000, 0x9696969669696969, 0x5A5A5A5A5A5A5A5A, 0x5A5A5A5AA5A5A5A5, 0xAAAA55555555AAAA, 0xF00FF00FF00FF00F, 0xF0F00F0FF0F00F0F }, { 0xA55AA55A5AA55AA5, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0xCC33CC33CC33CC33, 0xF00FF00F0FF00FF0, 0xFFFFFFFF00000000, 0x9696969669696969, 0xA5A5A5A5A5A5A5A5, 0xA5A5A5A55A5A5A5A, 0x5555AAAAAAAA5555, 0x0FF00FF00FF00FF0, 0xF0F00F0FF0F00F0F }, { 0xA55AA55A5AA55AA5, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0xCC33CC33CC33CC33, 0x0FF00FF0F00FF00F, 0xFFFFFFFF00000000, 0x9696969669696969, 0xA5A5A5A5A5A5A5A5, 0xA5A5A5A55A5A5A5A, 0xAAAA55555555AAAA, 0xF00FF00FF00FF00F, 0x0F0FF0F00F0FF0F0 }, { 0xA55AA55A5AA55AA5, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0x33CC33CC33CC33CC, 0xF00FF00F0FF00FF0, 0xFFFFFFFF00000000, 0x6969696996969696, 0x5A5A5A5A5A5A5A5A, 0xA5A5A5A55A5A5A5A, 0x5555AAAAAAAA5555, 0xF00FF00FF00FF00F, 0x0F0FF0F00F0FF0F0 }, { 0xA55AA55A5AA55AA5, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0x33CC33CC33CC33CC, 0x0FF00FF0F00FF00F, 0xFFFFFFFF00000000, 0x6969696996969696, 0x5A5A5A5A5A5A5A5A, 0xA5A5A5A55A5A5A5A, 0xAAAA55555555AAAA, 0x0FF00FF00FF00FF0, 0xF0F00F0FF0F00F0F }, { 0x5AA55AA5A55AA55A, 0x3CC33CC3C33CC33C, 0xA5A55A5AA5A55A5A, 0x0000FFFF0000FFFF, 0x33CC33CC33CC33CC, 0xF00FF00F0FF00FF0, 0xFFFFFFFF00000000, 0x6969696996969696, 0xA5A5A5A5A5A5A5A5, 0x5A5A5A5AA5A5A5A5, 0x5555AAAAAAAA5555, 0xF00FF00FF00FF00F, 0xF0F00F0FF0F00F0F }, { 0x5AA55AA5A55AA55A, 0xC33CC33C3CC33CC3, 0xA5A55A5AA5A55A5A, 0xFFFF0000FFFF0000, 0x33CC33CC33CC33CC, 0x0FF00FF0F00FF00F, 0xFFFFFFFF00000000, 0x6969696996969696, 0xA5A5A5A5A5A5A5A5, 0x5A5A5A5AA5A5A5A5, 0xAAAA55555555AAAA, 0x0FF00FF00FF00FF0, 0x0F0FF0F00F0FF0F0 }
  1803. };
  1804. /* from libmceliece-20230612/crypto_kem/6688128f/vec/shared-fft_scalars_2x.c */
  1805. /* linker define fft_scalars_2x */
  1806. const vec fft_scalars_2x[5][2][GFBITS] = {
  1807. {{ 0X3C3CF30C0000C003, 0X0CCCC3F333C0000C, 0X03C33F33FCC0C03C, 0X0003000F3C03C0C0, 0XF33FF33030CF03F0, 0X0CF0303300F0CCC0, 0XFF3F0C0CC0FF3CC0, 0XCF3CF0FF003FC000, 0XC00FF3CF0303F300, 0X3CCC0CC00CF0CC00, 0XF30FFC3C3FCCFC00, 0X3F0FC3F0CCF0C000, 0X3000FF33CCF0F000 }, { 0X0C0F0FCF0F0CF330, 0XF0000FC33C3CCF3C, 0X3C0F3F00C3C300FC, 0X3C33CCC0F0F3CC30, 0XC0CFFFFFCCCC30CC, 0X3FC3F3CCFFFC033F, 0XFC3030CCCCC0CFCF, 0X0FCF0C00CCF333C3, 0XCFFCF33000CFF030, 0X00CFFCC330F30FCC, 0X3CCC3FCCC0F3FFF3, 0XF00F0C3FC003C0FF, 0X330CCFCC03C0FC33 }}, {{ 0X0F0F0FF0F000000F, 0X00FFFFFFFF0000F0, 0XFFFF00FF00000F00, 0XFFF000F00F0FF000, 0XFFF0000F0FF000F0, 0X00FF000FFF000000, 0XFF0F0FFF0F0FF000, 0X0FFF0000000F0000, 0X00F000F0FFF00F00, 0X00F00FF00F00F000, 0XFFF000F000F00000, 0X00F00F000FF00000, 0X0000FF0F0000F000 }, { 0XF0FFFFFFF0F00F00, 0X00FFF0FFFF0000FF, 0X00FF00000F0F0FFF, 0XF000F0000F00FF0F, 0XFF000000FFF00000, 0XF0FF000FF00F0FF0, 0X0F0F0F00FF000F0F, 0X0F0F00F0F0F0F000, 0X00F00F00F00F000F, 0X00F0F0F00000FFF0, 0XFFFFFF0FF00F0FFF, 0X0F0FFFF00FFFFFFF, 0XFFFF0F0FFF0FFF00 }}, {{ 0X00FF0000000000FF, 0XFFFFFFFFFF00FF00, 0XFF0000FF00FF0000, 0XFFFF000000FF0000, 0XFF00000000FF0000, 0X00FFFFFFFF000000, 0XFF0000FFFFFF0000, 0XFF00FF00FFFF0000, 0X00FFFFFFFF00FF00, 0XFFFF000000000000, 0X00FF0000FF000000, 0XFF00FF00FF000000, 0X00FF00FFFF000000 }, { 0X00FF00FF00FF0000, 0XFF00FFFF000000FF, 0X0000FFFF000000FF, 0X00FFFF00FF000000, 0XFFFFFF0000FF00FF, 0X0000FFFF00FFFF00, 0XFF00FF0000FFFF00, 0X00000000FFFFFFFF, 0X0000FF0000000000, 0XFF00FFFF00FFFF00, 0X00FFFF00000000FF, 0X0000FF00FF00FFFF, 0XFF0000FFFFFF0000 }}, {{ 0X000000000000FFFF, 0XFFFFFFFFFFFF0000, 0X0000000000000000, 0XFFFF0000FFFF0000, 0XFFFFFFFFFFFF0000, 0X0000FFFF00000000, 0X0000FFFFFFFF0000, 0XFFFF0000FFFF0000, 0X0000FFFF00000000, 0XFFFF000000000000, 0XFFFF000000000000, 0XFFFF000000000000, 0XFFFFFFFF00000000 }, { 0X0000FFFF00000000, 0XFFFFFFFF0000FFFF, 0X00000000FFFFFFFF, 0X0000000000000000, 0X0000FFFF00000000, 0XFFFF0000FFFF0000, 0X0000FFFFFFFF0000, 0X0000FFFF0000FFFF, 0XFFFFFFFF0000FFFF, 0X00000000FFFF0000, 0XFFFF0000FFFFFFFF, 0XFFFF0000FFFFFFFF, 0X0000000000000000 }}, {{ 0X00000000FFFFFFFF, 0X0000000000000000, 0XFFFFFFFF00000000, 0X0000000000000000, 0XFFFFFFFF00000000, 0XFFFFFFFF00000000, 0XFFFFFFFF00000000, 0X0000000000000000, 0XFFFFFFFF00000000, 0X0000000000000000, 0X0000000000000000, 0X0000000000000000, 0XFFFFFFFF00000000 }, { 0X0000000000000000, 0XFFFFFFFFFFFFFFFF, 0X0000000000000000, 0X0000000000000000, 0X00000000FFFFFFFF, 0XFFFFFFFF00000000, 0X0000000000000000, 0XFFFFFFFFFFFFFFFF, 0X00000000FFFFFFFF, 0XFFFFFFFF00000000, 0XFFFFFFFFFFFFFFFF, 0XFFFFFFFFFFFFFFFF, 0XFFFFFFFF00000000 }}
  1808. };
  1809. /* from libmceliece-20230612/crypto_kem/6688128f/vec/shared-fft_scalars_4x.c */
  1810. /* linker define fft_scalars_4x */
  1811. const vec fft_scalars_4x[6][4][GFBITS] = {
  1812. {{ 0x3C3CF30C0000C003, 0x0CCCC3F333C0000C, 0x03C33F33FCC0C03C, 0x0003000F3C03C0C0, 0xF33FF33030CF03F0, 0x0CF0303300F0CCC0, 0xFF3F0C0CC0FF3CC0, 0xCF3CF0FF003FC000, 0xC00FF3CF0303F300, 0x3CCC0CC00CF0CC00, 0xF30FFC3C3FCCFC00, 0x3F0FC3F0CCF0C000, 0x3000FF33CCF0F000 }, { 0x0C0F0FCF0F0CF330, 0xF0000FC33C3CCF3C, 0x3C0F3F00C3C300FC, 0x3C33CCC0F0F3CC30, 0xC0CFFFFFCCCC30CC, 0x3FC3F3CCFFFC033F, 0xFC3030CCCCC0CFCF, 0x0FCF0C00CCF333C3, 0xCFFCF33000CFF030, 0x00CFFCC330F30FCC, 0x3CCC3FCCC0F3FFF3, 0xF00F0C3FC003C0FF, 0x330CCFCC03C0FC33 }, { 0xF0F30C33CF03F03F, 0x00F30FC00C3300FF, 0xF3CC3CF3F3FCF33F, 0x3C0FC0FC303C3F3C, 0xFC30CF303F3FF00F, 0x33300C0CC3300CF3, 0x3C030CF3F03FF3F3, 0x3CCC03FCCC3FFC03, 0x033C3C3CF0003FC3, 0xFFC0FF00F0FF0F03, 0xF3F30CF003FCC303, 0x30CFCFC3CC0F3000, 0x0CF30CCF3FCFCC0F }, { 0x3F30CC0C000F3FCC, 0xFC3CF030FC3FFF03, 0x33FFFCFF0CCF3CC3, 0x003CFF33C3CC30CF, 0xCFF3CF33C00F3003, 0x00F3CC0CF3003CCF, 0x3C000CFCCC3C3333, 0xF3CF03C0FCF03FF0, 0x3F3C3CF0C330330C, 0x33CCFCC0FF0033F0, 0x33C300C0F0C003F3, 0x003FF0003F00C00C, 0xCFF3C3033F030FFF }}, {{ 0x0F0F0FF0F000000F, 0x00FFFFFFFF0000F0, 0xFFFF00FF00000F00, 0xFFF000F00F0FF000, 0xFFF0000F0FF000F0, 0x00FF000FFF000000, 0xFF0F0FFF0F0FF000, 0x0FFF0000000F0000, 0x00F000F0FFF00F00, 0x00F00FF00F00F000, 0xFFF000F000F00000, 0x00F00F000FF00000, 0x0000FF0F0000F000 }, { 0xF0FFFFFFF0F00F00, 0x00FFF0FFFF0000FF, 0x00FF00000F0F0FFF, 0xF000F0000F00FF0F, 0xFF000000FFF00000, 0xF0FF000FF00F0FF0, 0x0F0F0F00FF000F0F, 0x0F0F00F0F0F0F000, 0x00F00F00F00F000F, 0x00F0F0F00000FFF0, 0xFFFFFF0FF00F0FFF, 0x0F0FFFF00FFFFFFF, 0xFFFF0F0FFF0FFF00 }, { 0x0F0F00FF0FF0FFFF, 0xF000F0F00F00FF0F, 0x000FFFF0FFF0FF0F, 0x00F00FFF00000FF0, 0xFFFFF0000FFFF00F, 0xFFF0FFF0000FFFF0, 0xF0F0F0000F0F0F00, 0x00F000F0F00FFF00, 0xF0FF0F0FFF00F0FF, 0xF0FF0FFFF0F0F0FF, 0x00FFFFFFFFFFFFF0, 0x00FFF0F0FF000F0F, 0x000FFFF0000FFF00 }, { 0xFF0F0F00F000F0FF, 0x0FFFFFFFFF00000F, 0xF0FFFF000F00F0FF, 0x0F0000F00FFF0FFF, 0x0F0F0F00FF0F000F, 0x000F0F0FFFF0F000, 0xF0FFFF0F00F0FF0F, 0x0F0F000F0F00F0FF, 0x0000F0FF00FF0F0F, 0x00FFFF0FF0FFF0F0, 0x0000000F00F0FFF0, 0xF0F00000FF00F0F0, 0x0F0F0FFFFFFFFFFF }}, {{ 0x00FF0000000000FF, 0xFFFFFFFFFF00FF00, 0xFF0000FF00FF0000, 0xFFFF000000FF0000, 0xFF00000000FF0000, 0x00FFFFFFFF000000, 0xFF0000FFFFFF0000, 0xFF00FF00FFFF0000, 0x00FFFFFFFF00FF00, 0xFFFF000000000000, 0x00FF0000FF000000, 0xFF00FF00FF000000, 0x00FF00FFFF000000 }, { 0x00FF00FF00FF0000, 0xFF00FFFF000000FF, 0x0000FFFF000000FF, 0x00FFFF00FF000000, 0xFFFFFF0000FF00FF, 0x0000FFFF00FFFF00, 0xFF00FF0000FFFF00, 0x00000000FFFFFFFF, 0x0000FF0000000000, 0xFF00FFFF00FFFF00, 0x00FFFF00000000FF, 0x0000FF00FF00FFFF, 0xFF0000FFFFFF0000 }, { 0xFFFF00FF00FF00FF, 0x00FFFF000000FF00, 0xFFFF00FFFFFFFF00, 0x0000FFFF00FFFFFF, 0x00FF0000FF0000FF, 0xFFFF0000FF00FFFF, 0xFF000000FFFFFF00, 0x000000000000FFFF, 0xFF00FF00FFFF0000, 0xFFFF00FFFF00FFFF, 0xFFFFFFFFFF00FF00, 0xFFFF00FFFF0000FF, 0x0000FF00000000FF }, { 0xFF0000FFFFFF00FF, 0xFFFF0000FFFFFFFF, 0xFFFF000000FFFFFF, 0x00FFFF00FF0000FF, 0xFFFFFF00FFFFFF00, 0x00FFFF00FFFF00FF, 0x0000FFFF00FF0000, 0x000000FFFF000000, 0xFF00FF0000FF00FF, 0x00FF0000000000FF, 0xFF00FFFF00FF00FF, 0xFFFFFFFFFFFFFFFF, 0x0000FF000000FFFF }}, {{ 0x000000000000FFFF, 0xFFFFFFFFFFFF0000, 0x0000000000000000, 0xFFFF0000FFFF0000, 0xFFFFFFFFFFFF0000, 0x0000FFFF00000000, 0x0000FFFFFFFF0000, 0xFFFF0000FFFF0000, 0x0000FFFF00000000, 0xFFFF000000000000, 0xFFFF000000000000, 0xFFFF000000000000, 0xFFFFFFFF00000000 }, { 0x0000FFFF00000000, 0xFFFFFFFF0000FFFF, 0x00000000FFFFFFFF, 0x0000000000000000, 0x0000FFFF00000000, 0xFFFF0000FFFF0000, 0x0000FFFFFFFF0000, 0x0000FFFF0000FFFF, 0xFFFFFFFF0000FFFF, 0x00000000FFFF0000, 0xFFFF0000FFFFFFFF, 0xFFFF0000FFFFFFFF, 0x0000000000000000 }, { 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF00000000, 0xFFFF000000000000, 0x0000FFFF00000000, 0x00000000FFFF0000, 0x0000FFFFFFFFFFFF, 0x0000FFFFFFFFFFFF, 0xFFFFFFFF00000000, 0x000000000000FFFF, 0x000000000000FFFF, 0xFFFFFFFFFFFF0000, 0xFFFFFFFF0000FFFF, 0xFFFF0000FFFFFFFF }, { 0x0000FFFFFFFFFFFF, 0x0000FFFF0000FFFF, 0x0000FFFFFFFF0000, 0xFFFF0000FFFFFFFF, 0x00000000FFFF0000, 0xFFFF00000000FFFF, 0x0000FFFF0000FFFF, 0xFFFF00000000FFFF, 0x0000FFFF0000FFFF, 0x0000FFFF00000000, 0xFFFFFFFF00000000, 0x0000FFFFFFFF0000, 0x0000FFFFFFFFFFFF }}, {{ 0x00000000FFFFFFFF, 0x0000000000000000, 0xFFFFFFFF00000000, 0x0000000000000000, 0xFFFFFFFF00000000, 0xFFFFFFFF00000000, 0xFFFFFFFF00000000, 0x0000000000000000, 0xFFFFFFFF00000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFF00000000 }, { 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0x0000000000000000, 0x00000000FFFFFFFF, 0xFFFFFFFF00000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x00000000FFFFFFFF, 0xFFFFFFFF00000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF00000000 }, { 0x00000000FFFFFFFF, 0xFFFFFFFF00000000, 0xFFFFFFFF00000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFF00000000, 0x00000000FFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF }, { 0xFFFFFFFFFFFFFFFF, 0x00000000FFFFFFFF, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFF00000000, 0x00000000FFFFFFFF, 0xFFFFFFFF00000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF00000000, 0xFFFFFFFF00000000 }}, {{ 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 }, { 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000 }, { 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF }, { 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF }},
  1813. };
  1814. /* from libmceliece-20230612/crypto_kem/6688128f/vec/fft.c */
  1815. /*
  1816. This file is for implementing the Gao-Mateer FFT, see
  1817. http://www.math.clemson.edu/~sgao/papers/GM10.pdf
  1818. For the implementation strategy, see
  1819. https://eprint.iacr.org/2017/793.pdf
  1820. */
  1821. /* 20221230 djb: split these arrays into separate .c files */
  1822. /* 20221230 djb: rename powers array as fft_powers */
  1823. /* 20221230 djb: rename consts array as fft_consts */
  1824. /* 20221230 djb: rename s array as fft_scalars_2x */
  1825. /* 20221230 djb: add linker lines */
  1826. /* linker define fft */
  1827. /* linker use vec_mul */
  1828. /* linker use fft_scalars_2x fft_consts fft_powers */
  1829. /* input: in, polynomial in bitsliced form */
  1830. /* output: in, result of applying the radix conversions on in */
  1831. static void radix_conversions(vec in[][GFBITS])
  1832. {
  1833. int i, j, k;
  1834. const vec mask[5][2] =
  1835. {
  1836. {0x8888888888888888, 0x4444444444444444},
  1837. {0xC0C0C0C0C0C0C0C0, 0x3030303030303030},
  1838. {0xF000F000F000F000, 0x0F000F000F000F00},
  1839. {0xFF000000FF000000, 0x00FF000000FF0000},
  1840. {0xFFFF000000000000, 0x0000FFFF00000000}
  1841. };
  1842. for (j = 0; j <= 5; j++)
  1843. {
  1844. for (i = 0; i < GFBITS; i++)
  1845. {
  1846. in[1][i] ^= in[1][i] >> 32;
  1847. in[0][i] ^= in[1][i] << 32;
  1848. }
  1849. for (i = 0; i < GFBITS; i++)
  1850. for (k = 4; k >= j; k--)
  1851. {
  1852. in[0][i] ^= (in[0][i] & mask[k][0]) >> (1 << k);
  1853. in[0][i] ^= (in[0][i] & mask[k][1]) >> (1 << k);
  1854. in[1][i] ^= (in[1][i] & mask[k][0]) >> (1 << k);
  1855. in[1][i] ^= (in[1][i] & mask[k][1]) >> (1 << k);
  1856. }
  1857. if (j < 5)
  1858. {
  1859. vec_mul(in[0], in[0], fft_scalars_2x[j][0]);
  1860. vec_mul(in[1], in[1], fft_scalars_2x[j][1]);
  1861. }
  1862. }
  1863. }
  1864. /* input: in, result of applying the radix conversions to the input polynomial */
  1865. /* output: out, evaluation results (by applying the FFT butterflies) */
  1866. static void butterflies(vec out[][ GFBITS ], vec in[][ GFBITS ])
  1867. {
  1868. int i, j, k, s, b;
  1869. vec tmp[ GFBITS ];
  1870. vec pre[8][ GFBITS ];
  1871. vec buf[128];
  1872. uint64_t consts_ptr = 2;
  1873. const unsigned char reversal[128] =
  1874. {
  1875. 0, 64, 32, 96, 16, 80, 48, 112,
  1876. 8, 72, 40, 104, 24, 88, 56, 120,
  1877. 4, 68, 36, 100, 20, 84, 52, 116,
  1878. 12, 76, 44, 108, 28, 92, 60, 124,
  1879. 2, 66, 34, 98, 18, 82, 50, 114,
  1880. 10, 74, 42, 106, 26, 90, 58, 122,
  1881. 6, 70, 38, 102, 22, 86, 54, 118,
  1882. 14, 78, 46, 110, 30, 94, 62, 126,
  1883. 1, 65, 33, 97, 17, 81, 49, 113,
  1884. 9, 73, 41, 105, 25, 89, 57, 121,
  1885. 5, 69, 37, 101, 21, 85, 53, 117,
  1886. 13, 77, 45, 109, 29, 93, 61, 125,
  1887. 3, 67, 35, 99, 19, 83, 51, 115,
  1888. 11, 75, 43, 107, 27, 91, 59, 123,
  1889. 7, 71, 39, 103, 23, 87, 55, 119,
  1890. 15, 79, 47, 111, 31, 95, 63, 127
  1891. };
  1892. const uint16_t beta[7] = {2522, 7827, 7801, 8035, 6897, 8167, 3476};
  1893. /**/
  1894. for (i = 0; i < 7; i++)
  1895. {
  1896. for (j = 0; j < GFBITS; j++)
  1897. {
  1898. pre[i][j] = (beta[i] >> j) & 1;
  1899. pre[i][j] = -pre[i][j];
  1900. }
  1901. vec_mul(pre[i], in[1], pre[i]);
  1902. }
  1903. for (i = 0; i < GFBITS; i++)
  1904. {
  1905. buf[0] = in[0][i];
  1906. buf[1] = buf[0] ^ pre[0][i]; buf[32] = in[0][i] ^ pre[5][i];
  1907. buf[3] = buf[1] ^ pre[1][i]; buf[96] = buf[32] ^ pre[6][i];
  1908. buf[97] = buf[96] ^ pre[0][i];
  1909. buf[2] = in[0][i] ^ pre[1][i]; buf[99] = buf[97] ^ pre[1][i];
  1910. buf[6] = buf[2] ^ pre[2][i]; buf[98] = buf[99] ^ pre[0][i];
  1911. buf[7] = buf[6] ^ pre[0][i]; buf[102] = buf[98] ^ pre[2][i];
  1912. buf[5] = buf[7] ^ pre[1][i]; buf[103] = buf[102] ^ pre[0][i];
  1913. buf[101] = buf[103] ^ pre[1][i];
  1914. buf[4] = in[0][i] ^ pre[2][i]; buf[100] = buf[101] ^ pre[0][i];
  1915. buf[12] = buf[4] ^ pre[3][i]; buf[108] = buf[100] ^ pre[3][i];
  1916. buf[13] = buf[12] ^ pre[0][i]; buf[109] = buf[108] ^ pre[0][i];
  1917. buf[15] = buf[13] ^ pre[1][i]; buf[111] = buf[109] ^ pre[1][i];
  1918. buf[14] = buf[15] ^ pre[0][i]; buf[110] = buf[111] ^ pre[0][i];
  1919. buf[10] = buf[14] ^ pre[2][i]; buf[106] = buf[110] ^ pre[2][i];
  1920. buf[11] = buf[10] ^ pre[0][i]; buf[107] = buf[106] ^ pre[0][i];
  1921. buf[9] = buf[11] ^ pre[1][i]; buf[105] = buf[107] ^ pre[1][i];
  1922. buf[104] = buf[105] ^ pre[0][i];
  1923. buf[8] = in[0][i] ^ pre[3][i]; buf[120] = buf[104] ^ pre[4][i];
  1924. buf[24] = buf[8] ^ pre[4][i]; buf[121] = buf[120] ^ pre[0][i];
  1925. buf[25] = buf[24] ^ pre[0][i]; buf[123] = buf[121] ^ pre[1][i];
  1926. buf[27] = buf[25] ^ pre[1][i]; buf[122] = buf[123] ^ pre[0][i];
  1927. buf[26] = buf[27] ^ pre[0][i]; buf[126] = buf[122] ^ pre[2][i];
  1928. buf[30] = buf[26] ^ pre[2][i]; buf[127] = buf[126] ^ pre[0][i];
  1929. buf[31] = buf[30] ^ pre[0][i]; buf[125] = buf[127] ^ pre[1][i];
  1930. buf[29] = buf[31] ^ pre[1][i]; buf[124] = buf[125] ^ pre[0][i];
  1931. buf[28] = buf[29] ^ pre[0][i]; buf[116] = buf[124] ^ pre[3][i];
  1932. buf[20] = buf[28] ^ pre[3][i]; buf[117] = buf[116] ^ pre[0][i];
  1933. buf[21] = buf[20] ^ pre[0][i]; buf[119] = buf[117] ^ pre[1][i];
  1934. buf[23] = buf[21] ^ pre[1][i]; buf[118] = buf[119] ^ pre[0][i];
  1935. buf[22] = buf[23] ^ pre[0][i]; buf[114] = buf[118] ^ pre[2][i];
  1936. buf[18] = buf[22] ^ pre[2][i]; buf[115] = buf[114] ^ pre[0][i];
  1937. buf[19] = buf[18] ^ pre[0][i]; buf[113] = buf[115] ^ pre[1][i];
  1938. buf[17] = buf[19] ^ pre[1][i]; buf[112] = buf[113] ^ pre[0][i];
  1939. buf[80] = buf[112] ^ pre[5][i];
  1940. buf[16] = in[0][i] ^ pre[4][i]; buf[81] = buf[80] ^ pre[0][i];
  1941. buf[48] = buf[16] ^ pre[5][i]; buf[83] = buf[81] ^ pre[1][i];
  1942. buf[49] = buf[48] ^ pre[0][i]; buf[82] = buf[83] ^ pre[0][i];
  1943. buf[51] = buf[49] ^ pre[1][i]; buf[86] = buf[82] ^ pre[2][i];
  1944. buf[50] = buf[51] ^ pre[0][i]; buf[87] = buf[86] ^ pre[0][i];
  1945. buf[54] = buf[50] ^ pre[2][i]; buf[85] = buf[87] ^ pre[1][i];
  1946. buf[55] = buf[54] ^ pre[0][i]; buf[84] = buf[85] ^ pre[0][i];
  1947. buf[53] = buf[55] ^ pre[1][i]; buf[92] = buf[84] ^ pre[3][i];
  1948. buf[52] = buf[53] ^ pre[0][i]; buf[93] = buf[92] ^ pre[0][i];
  1949. buf[60] = buf[52] ^ pre[3][i]; buf[95] = buf[93] ^ pre[1][i];
  1950. buf[61] = buf[60] ^ pre[0][i]; buf[94] = buf[95] ^ pre[0][i];
  1951. buf[63] = buf[61] ^ pre[1][i]; buf[90] = buf[94] ^ pre[2][i];
  1952. buf[62] = buf[63] ^ pre[0][i]; buf[91] = buf[90] ^ pre[0][i];
  1953. buf[58] = buf[62] ^ pre[2][i]; buf[89] = buf[91] ^ pre[1][i];
  1954. buf[59] = buf[58] ^ pre[0][i]; buf[88] = buf[89] ^ pre[0][i];
  1955. buf[57] = buf[59] ^ pre[1][i]; buf[72] = buf[88] ^ pre[4][i];
  1956. buf[56] = buf[57] ^ pre[0][i]; buf[73] = buf[72] ^ pre[0][i];
  1957. buf[40] = buf[56] ^ pre[4][i]; buf[75] = buf[73] ^ pre[1][i];
  1958. buf[41] = buf[40] ^ pre[0][i]; buf[74] = buf[75] ^ pre[0][i];
  1959. buf[43] = buf[41] ^ pre[1][i]; buf[78] = buf[74] ^ pre[2][i];
  1960. buf[42] = buf[43] ^ pre[0][i]; buf[79] = buf[78] ^ pre[0][i];
  1961. buf[46] = buf[42] ^ pre[2][i]; buf[77] = buf[79] ^ pre[1][i];
  1962. buf[47] = buf[46] ^ pre[0][i]; buf[76] = buf[77] ^ pre[0][i];
  1963. buf[45] = buf[47] ^ pre[1][i]; buf[68] = buf[76] ^ pre[3][i];
  1964. buf[44] = buf[45] ^ pre[0][i]; buf[69] = buf[68] ^ pre[0][i];
  1965. buf[36] = buf[44] ^ pre[3][i]; buf[71] = buf[69] ^ pre[1][i];
  1966. buf[37] = buf[36] ^ pre[0][i]; buf[70] = buf[71] ^ pre[0][i];
  1967. buf[39] = buf[37] ^ pre[1][i]; buf[66] = buf[70] ^ pre[2][i];
  1968. buf[38] = buf[39] ^ pre[0][i]; buf[67] = buf[66] ^ pre[0][i];
  1969. buf[34] = buf[38] ^ pre[2][i]; buf[65] = buf[67] ^ pre[1][i];
  1970. buf[35] = buf[34] ^ pre[0][i];
  1971. buf[33] = buf[35] ^ pre[1][i]; buf[64] = in[0][i] ^ pre[6][i];
  1972. transpose_64x64(buf + 0, buf + 0);
  1973. transpose_64x64(buf + 64, buf + 64);
  1974. for (j = 0; j < 128; j++)
  1975. out[ reversal[j] ][i] = buf[j];
  1976. }
  1977. for (i = 1; i <= 6; i++)
  1978. {
  1979. s = 1 << i;
  1980. for (j = 0; j < 128; j += 2*s)
  1981. for (k = j; k < j+s; k++)
  1982. {
  1983. vec_mul(tmp, out[k+s], fft_consts[ consts_ptr + (k-j) ]);
  1984. for (b = 0; b < GFBITS; b++) out[k ][b] ^= tmp[b];
  1985. for (b = 0; b < GFBITS; b++) out[k+s][b] ^= out[k][b];
  1986. }
  1987. consts_ptr += (1 << i);
  1988. }
  1989. /* adding the part contributed by x^128 */
  1990. for (i = 0; i < 128; i++)
  1991. for (b = 0; b < GFBITS; b++)
  1992. out[i][b] ^= fft_powers[i][b];
  1993. }
  1994. /* input: in, polynomial in bitsliced form */
  1995. /* output: out, bitsliced results of evaluating in all the field elements */
  1996. static void fft(vec out[][GFBITS], vec in[][GFBITS])
  1997. {
  1998. radix_conversions(in);
  1999. butterflies(out, in);
  2000. }
  2001. /* from libmceliece-20230612/crypto_kem/6688128f/vec/fft_tr.c */
  2002. /*
  2003. This file is for transpose of the Gao-Mateer FFT
  2004. Functions with names ending with _tr are (roughly) the transpose of the corresponding functions in fft.c
  2005. For the implementation strategy, see
  2006. https://eprint.iacr.org/2017/793.pdf
  2007. */
  2008. /* 20221230 djb: split these arrays into separate .c files */
  2009. /* 20221230 djb: rename consts array as fft_consts */
  2010. /* 20221230 djb: rename s array as fft_scalars_4x */
  2011. /* 20221230 djb: add linker lines */
  2012. /* linker define fft_tr */
  2013. /* linker use vec_mul */
  2014. /* linker use fft_scalars_4x fft_consts */
  2015. static void radix_conversions_tr(vec in[][ GFBITS ])
  2016. {
  2017. int i, j, k;
  2018. const vec mask[6][2] =
  2019. {
  2020. {0x2222222222222222, 0x4444444444444444},
  2021. {0x0C0C0C0C0C0C0C0C, 0x3030303030303030},
  2022. {0x00F000F000F000F0, 0x0F000F000F000F00},
  2023. {0x0000FF000000FF00, 0x00FF000000FF0000},
  2024. {0x00000000FFFF0000, 0x0000FFFF00000000},
  2025. {0xFFFFFFFF00000000, 0x00000000FFFFFFFF}
  2026. };
  2027. /**/
  2028. for (j = 6; j >= 0; j--)
  2029. {
  2030. if (j < 6)
  2031. {
  2032. vec_mul(in[0], in[0], fft_scalars_4x[j][0]); /* scaling */
  2033. vec_mul(in[1], in[1], fft_scalars_4x[j][1]); /* scaling */
  2034. vec_mul(in[2], in[2], fft_scalars_4x[j][2]); /* scaling */
  2035. vec_mul(in[3], in[3], fft_scalars_4x[j][3]); /* scaling */
  2036. }
  2037. for (k = j; k <= 4; k++)
  2038. for (i = 0; i < GFBITS; i++)
  2039. {
  2040. in[0][i] ^= (in[0][i] & mask[k][0]) << (1 << k);
  2041. in[0][i] ^= (in[0][i] & mask[k][1]) << (1 << k);
  2042. in[1][i] ^= (in[1][i] & mask[k][0]) << (1 << k);
  2043. in[1][i] ^= (in[1][i] & mask[k][1]) << (1 << k);
  2044. in[2][i] ^= (in[2][i] & mask[k][0]) << (1 << k);
  2045. in[2][i] ^= (in[2][i] & mask[k][1]) << (1 << k);
  2046. in[3][i] ^= (in[3][i] & mask[k][0]) << (1 << k);
  2047. in[3][i] ^= (in[3][i] & mask[k][1]) << (1 << k);
  2048. }
  2049. if (j <= 5)
  2050. for (i = 0; i < GFBITS; i++)
  2051. {
  2052. in[1][i] ^= in[0][i] >> 32;
  2053. in[1][i] ^= in[1][i] << 32;
  2054. in[3][i] ^= in[2][i] >> 32;
  2055. in[3][i] ^= in[3][i] << 32;
  2056. }
  2057. for (i = 0; i < GFBITS; i++)
  2058. in[3][i] ^= in[2][i] ^= in[1][i];
  2059. }
  2060. }
  2061. static void butterflies_tr(vec out[][ GFBITS ], vec in[][ GFBITS ])
  2062. {
  2063. int i, j, k, s, b;
  2064. vec tmp[ GFBITS ];
  2065. vec pre[6][2][ GFBITS ];
  2066. vec buf[2][64];
  2067. uint64_t consts_ptr = 128;
  2068. const unsigned char reversal[128] =
  2069. {
  2070. 0, 64, 32, 96, 16, 80, 48, 112,
  2071. 8, 72, 40, 104, 24, 88, 56, 120,
  2072. 4, 68, 36, 100, 20, 84, 52, 116,
  2073. 12, 76, 44, 108, 28, 92, 60, 124,
  2074. 2, 66, 34, 98, 18, 82, 50, 114,
  2075. 10, 74, 42, 106, 26, 90, 58, 122,
  2076. 6, 70, 38, 102, 22, 86, 54, 118,
  2077. 14, 78, 46, 110, 30, 94, 62, 126,
  2078. 1, 65, 33, 97, 17, 81, 49, 113,
  2079. 9, 73, 41, 105, 25, 89, 57, 121,
  2080. 5, 69, 37, 101, 21, 85, 53, 117,
  2081. 13, 77, 45, 109, 29, 93, 61, 125,
  2082. 3, 67, 35, 99, 19, 83, 51, 115,
  2083. 11, 75, 43, 107, 27, 91, 59, 123,
  2084. 7, 71, 39, 103, 23, 87, 55, 119,
  2085. 15, 79, 47, 111, 31, 95, 63, 127
  2086. };
  2087. const uint16_t beta[6] = {5246, 5306, 6039, 6685, 4905, 6755};
  2088. /**/
  2089. for (i = 6; i >= 0; i--)
  2090. {
  2091. s = 1 << i;
  2092. consts_ptr -= s;
  2093. for (j = 0; j < 128; j += 2*s)
  2094. for (k = j; k < j+s; k++)
  2095. {
  2096. for (b = 0; b < GFBITS; b++) in[k][b] ^= in[k+s][b];
  2097. vec_mul(tmp, in[k], fft_consts[ consts_ptr + (k-j) ]);
  2098. for (b = 0; b < GFBITS; b++) in[k+s][b] ^= tmp[b];
  2099. }
  2100. }
  2101. for (i = 0; i < GFBITS; i++)
  2102. {
  2103. for (k = 0; k < 128; k++)
  2104. (&buf[0][0])[ k ] = in[ reversal[k] ][i];
  2105. transpose_64x64(buf[0], buf[0]);
  2106. transpose_64x64(buf[1], buf[1]);
  2107. for (k = 0; k < 2; k++)
  2108. {
  2109. pre[0][k][i] = buf[k][32]; buf[k][33] ^= buf[k][32];
  2110. pre[1][k][i] = buf[k][33]; buf[k][35] ^= buf[k][33];
  2111. pre[0][k][i] ^= buf[k][35]; buf[k][34] ^= buf[k][35];
  2112. pre[2][k][i] = buf[k][34]; buf[k][38] ^= buf[k][34];
  2113. pre[0][k][i] ^= buf[k][38]; buf[k][39] ^= buf[k][38];
  2114. pre[1][k][i] ^= buf[k][39]; buf[k][37] ^= buf[k][39];
  2115. pre[0][k][i] ^= buf[k][37]; buf[k][36] ^= buf[k][37];
  2116. pre[3][k][i] = buf[k][36]; buf[k][44] ^= buf[k][36];
  2117. pre[0][k][i] ^= buf[k][44]; buf[k][45] ^= buf[k][44];
  2118. pre[1][k][i] ^= buf[k][45]; buf[k][47] ^= buf[k][45];
  2119. pre[0][k][i] ^= buf[k][47]; buf[k][46] ^= buf[k][47];
  2120. pre[2][k][i] ^= buf[k][46]; buf[k][42] ^= buf[k][46];
  2121. pre[0][k][i] ^= buf[k][42]; buf[k][43] ^= buf[k][42];
  2122. pre[1][k][i] ^= buf[k][43]; buf[k][41] ^= buf[k][43];
  2123. pre[0][k][i] ^= buf[k][41]; buf[k][40] ^= buf[k][41];
  2124. pre[4][k][i] = buf[k][40]; buf[k][56] ^= buf[k][40];
  2125. pre[0][k][i] ^= buf[k][56]; buf[k][57] ^= buf[k][56];
  2126. pre[1][k][i] ^= buf[k][57]; buf[k][59] ^= buf[k][57];
  2127. pre[0][k][i] ^= buf[k][59]; buf[k][58] ^= buf[k][59];
  2128. pre[2][k][i] ^= buf[k][58]; buf[k][62] ^= buf[k][58];
  2129. pre[0][k][i] ^= buf[k][62]; buf[k][63] ^= buf[k][62];
  2130. pre[1][k][i] ^= buf[k][63]; buf[k][61] ^= buf[k][63];
  2131. pre[0][k][i] ^= buf[k][61]; buf[k][60] ^= buf[k][61];
  2132. pre[3][k][i] ^= buf[k][60]; buf[k][52] ^= buf[k][60];
  2133. pre[0][k][i] ^= buf[k][52]; buf[k][53] ^= buf[k][52];
  2134. pre[1][k][i] ^= buf[k][53]; buf[k][55] ^= buf[k][53];
  2135. pre[0][k][i] ^= buf[k][55]; buf[k][54] ^= buf[k][55];
  2136. pre[2][k][i] ^= buf[k][54]; buf[k][50] ^= buf[k][54];
  2137. pre[0][k][i] ^= buf[k][50]; buf[k][51] ^= buf[k][50];
  2138. pre[1][k][i] ^= buf[k][51]; buf[k][49] ^= buf[k][51];
  2139. pre[0][k][i] ^= buf[k][49]; buf[k][48] ^= buf[k][49];
  2140. pre[5][k][i] = buf[k][48]; buf[k][16] ^= buf[k][48];
  2141. pre[0][k][i] ^= buf[k][16]; buf[k][17] ^= buf[k][16];
  2142. pre[1][k][i] ^= buf[k][17]; buf[k][19] ^= buf[k][17];
  2143. pre[0][k][i] ^= buf[k][19]; buf[k][18] ^= buf[k][19];
  2144. pre[2][k][i] ^= buf[k][18]; buf[k][22] ^= buf[k][18];
  2145. pre[0][k][i] ^= buf[k][22]; buf[k][23] ^= buf[k][22];
  2146. pre[1][k][i] ^= buf[k][23]; buf[k][21] ^= buf[k][23];
  2147. pre[0][k][i] ^= buf[k][21]; buf[k][20] ^= buf[k][21];
  2148. pre[3][k][i] ^= buf[k][20]; buf[k][28] ^= buf[k][20];
  2149. pre[0][k][i] ^= buf[k][28]; buf[k][29] ^= buf[k][28];
  2150. pre[1][k][i] ^= buf[k][29]; buf[k][31] ^= buf[k][29];
  2151. pre[0][k][i] ^= buf[k][31]; buf[k][30] ^= buf[k][31];
  2152. pre[2][k][i] ^= buf[k][30]; buf[k][26] ^= buf[k][30];
  2153. pre[0][k][i] ^= buf[k][26]; buf[k][27] ^= buf[k][26];
  2154. pre[1][k][i] ^= buf[k][27]; buf[k][25] ^= buf[k][27];
  2155. pre[0][k][i] ^= buf[k][25]; buf[k][24] ^= buf[k][25];
  2156. pre[4][k][i] ^= buf[k][24]; buf[k][8] ^= buf[k][24];
  2157. pre[0][k][i] ^= buf[k][8]; buf[k][9] ^= buf[k][8];
  2158. pre[1][k][i] ^= buf[k][9]; buf[k][11] ^= buf[k][9];
  2159. pre[0][k][i] ^= buf[k][11]; buf[k][10] ^= buf[k][11];
  2160. pre[2][k][i] ^= buf[k][10]; buf[k][14] ^= buf[k][10];
  2161. pre[0][k][i] ^= buf[k][14]; buf[k][15] ^= buf[k][14];
  2162. pre[1][k][i] ^= buf[k][15]; buf[k][13] ^= buf[k][15];
  2163. pre[0][k][i] ^= buf[k][13]; buf[k][12] ^= buf[k][13];
  2164. pre[3][k][i] ^= buf[k][12]; buf[k][4] ^= buf[k][12];
  2165. pre[0][k][i] ^= buf[k][4]; buf[k][5] ^= buf[k][4];
  2166. pre[1][k][i] ^= buf[k][5]; buf[k][7] ^= buf[k][5];
  2167. pre[0][k][i] ^= buf[k][7]; buf[k][6] ^= buf[k][7];
  2168. pre[2][k][i] ^= buf[k][6]; buf[k][2] ^= buf[k][6];
  2169. pre[0][k][i] ^= buf[k][2]; buf[k][3] ^= buf[k][2];
  2170. pre[1][k][i] ^= buf[k][3]; buf[k][1] ^= buf[k][3];
  2171. pre[0][k][i] ^= buf[k][1]; out[k][i] = buf[k][0] ^ buf[k][1];
  2172. }
  2173. }
  2174. for (j = 0; j < GFBITS; j++) tmp[j] = vec_setbits((beta[0] >> j) & 1);
  2175. vec_mul(out[2], pre[0][0], tmp);
  2176. vec_mul(out[3], pre[0][1], tmp);
  2177. for (i = 1; i < 6; i++)
  2178. {
  2179. for (j = 0; j < GFBITS; j++) tmp[j] = vec_setbits((beta[i] >> j) & 1);
  2180. vec_mul(pre[i][0], pre[i][0], tmp);
  2181. vec_mul(pre[i][1], pre[i][1], tmp);
  2182. for (b = 0; b < GFBITS; b++)
  2183. {
  2184. out[2][b] ^= pre[i][0][b];
  2185. out[3][b] ^= pre[i][1][b];
  2186. }
  2187. }
  2188. }
  2189. static void fft_tr(vec out[][GFBITS], vec in[][ GFBITS ])
  2190. {
  2191. butterflies_tr(out, in);
  2192. radix_conversions_tr(out);
  2193. }
  2194. /* from libmceliece-20230612/crypto_kem/6688128f/vec/gf.c */
  2195. /*
  2196. this file is for functions for field arithmetic
  2197. */
  2198. /* 20221231 djb: const for GF_mul */
  2199. /* 20221230 djb: add linker line */
  2200. /* linker define gf_iszero gf_mul gf_inv gf_frac GF_mul */
  2201. /* field multiplication */
  2202. gf gf_mul(gf in0, gf in1)
  2203. {
  2204. int i;
  2205. uint64_t tmp;
  2206. uint64_t t0;
  2207. uint64_t t1;
  2208. uint64_t t;
  2209. t0 = in0;
  2210. t1 = in1;
  2211. tmp = t0 * (t1 & 1);
  2212. for (i = 1; i < GFBITS; i++)
  2213. tmp ^= (t0 * (t1 & (1 << i)));
  2214. /**/
  2215. t = tmp & 0x1FF0000;
  2216. tmp ^= (t >> 9) ^ (t >> 10) ^ (t >> 12) ^ (t >> 13);
  2217. t = tmp & 0x000E000;
  2218. tmp ^= (t >> 9) ^ (t >> 10) ^ (t >> 12) ^ (t >> 13);
  2219. return tmp & GFMASK;
  2220. }
  2221. /* 2 field squarings */
  2222. static inline gf gf_sq2(gf in)
  2223. {
  2224. int i;
  2225. const uint64_t B[] = {0x1111111111111111,
  2226. 0x0303030303030303,
  2227. 0x000F000F000F000F,
  2228. 0x000000FF000000FF};
  2229. const uint64_t M[] = {0x0001FF0000000000,
  2230. 0x000000FF80000000,
  2231. 0x000000007FC00000,
  2232. 0x00000000003FE000};
  2233. uint64_t x = in;
  2234. uint64_t t;
  2235. x = (x | (x << 24)) & B[3];
  2236. x = (x | (x << 12)) & B[2];
  2237. x = (x | (x << 6)) & B[1];
  2238. x = (x | (x << 3)) & B[0];
  2239. for (i = 0; i < 4; i++)
  2240. {
  2241. t = x & M[i];
  2242. x ^= (t >> 9) ^ (t >> 10) ^ (t >> 12) ^ (t >> 13);
  2243. }
  2244. return x & GFMASK;
  2245. }
  2246. /* square and multiply */
  2247. static inline gf gf_sqmul(gf in, gf m)
  2248. {
  2249. int i;
  2250. uint64_t x;
  2251. uint64_t t0;
  2252. uint64_t t1;
  2253. uint64_t t;
  2254. const uint64_t M[] = {0x0000001FF0000000,
  2255. 0x000000000FF80000,
  2256. 0x000000000007E000};
  2257. t0 = in;
  2258. t1 = m;
  2259. x = (t1 << 6) * (t0 & (1 << 6));
  2260. t0 ^= (t0 << 7);
  2261. x ^= (t1 * (t0 & (0x04001)));
  2262. x ^= (t1 * (t0 & (0x08002))) << 1;
  2263. x ^= (t1 * (t0 & (0x10004))) << 2;
  2264. x ^= (t1 * (t0 & (0x20008))) << 3;
  2265. x ^= (t1 * (t0 & (0x40010))) << 4;
  2266. x ^= (t1 * (t0 & (0x80020))) << 5;
  2267. for (i = 0; i < 3; i++)
  2268. {
  2269. t = x & M[i];
  2270. x ^= (t >> 9) ^ (t >> 10) ^ (t >> 12) ^ (t >> 13);
  2271. }
  2272. return x & GFMASK;
  2273. }
  2274. /* square twice and multiply */
  2275. static inline gf gf_sq2mul(gf in, gf m)
  2276. {
  2277. int i;
  2278. uint64_t x;
  2279. uint64_t t0;
  2280. uint64_t t1;
  2281. uint64_t t;
  2282. const uint64_t M[] = {0x1FF0000000000000,
  2283. 0x000FF80000000000,
  2284. 0x000007FC00000000,
  2285. 0x00000003FE000000,
  2286. 0x0000000001FE0000,
  2287. 0x000000000001E000};
  2288. t0 = in;
  2289. t1 = m;
  2290. x = (t1 << 18) * (t0 & (1 << 6));
  2291. t0 ^= (t0 << 21);
  2292. x ^= (t1 * (t0 & (0x010000001)));
  2293. x ^= (t1 * (t0 & (0x020000002))) << 3;
  2294. x ^= (t1 * (t0 & (0x040000004))) << 6;
  2295. x ^= (t1 * (t0 & (0x080000008))) << 9;
  2296. x ^= (t1 * (t0 & (0x100000010))) << 12;
  2297. x ^= (t1 * (t0 & (0x200000020))) << 15;
  2298. for (i = 0; i < 6; i++)
  2299. {
  2300. t = x & M[i];
  2301. x ^= (t >> 9) ^ (t >> 10) ^ (t >> 12) ^ (t >> 13);
  2302. }
  2303. return x & GFMASK;
  2304. }
  2305. /* return num/den */
  2306. gf gf_frac(gf den, gf num)
  2307. {
  2308. gf tmp_11;
  2309. gf tmp_1111;
  2310. gf out;
  2311. tmp_11 = gf_sqmul(den, den); /* 11 */
  2312. tmp_1111 = gf_sq2mul(tmp_11, tmp_11); /* 1111 */
  2313. out = gf_sq2(tmp_1111);
  2314. out = gf_sq2mul(out, tmp_1111); /* 11111111 */
  2315. out = gf_sq2(out);
  2316. out = gf_sq2mul(out, tmp_1111); /* 111111111111 */
  2317. return gf_sqmul(out, num); /* 1111111111110 */
  2318. }
  2319. /* return 1/den */
  2320. gf gf_inv(gf den)
  2321. {
  2322. return gf_frac(den, ((gf) 1));
  2323. }
  2324. /* check if a == 0 */
  2325. gf gf_iszero(gf a)
  2326. {
  2327. uint32_t t = a;
  2328. t -= 1;
  2329. t >>= 19;
  2330. return (gf) t;
  2331. }
  2332. /* multiplication in GF((2^m)^t) */
  2333. static void GF_mul(gf *out, const gf *in0, const gf *in1)
  2334. {
  2335. int i, j;
  2336. gf prod[255];
  2337. for (i = 0; i < 255; i++)
  2338. prod[i] = 0;
  2339. for (i = 0; i < 128; i++)
  2340. for (j = 0; j < 128; j++)
  2341. prod[i+j] ^= gf_mul(in0[i], in1[j]);
  2342. /**/
  2343. for (i = 254; i >= 128; i--)
  2344. {
  2345. prod[i - 121] ^= prod[i];
  2346. prod[i - 126] ^= prod[i];
  2347. prod[i - 127] ^= prod[i];
  2348. prod[i - 128] ^= prod[i];
  2349. }
  2350. for (i = 0; i < 128; i++)
  2351. out[i] = prod[i];
  2352. }
  2353. /* from libmceliece-20230612/crypto_kem/6688128f/vec/kem_dec.c */
  2354. /* 20221230 djb: add linker lines */
  2355. /* 20221230 djb: split out of operations.c */
  2356. /* linker define operation_dec */
  2357. /* linker use decrypt */
  2358. static void operation_dec(
  2359. unsigned char *key,
  2360. const unsigned char *c,
  2361. const unsigned char *sk
  2362. )
  2363. {
  2364. int i;
  2365. unsigned char ret_decrypt = 0;
  2366. uint16_t m;
  2367. unsigned char e[ SYS_N/8 ];
  2368. unsigned char preimage[ 1 + SYS_N/8 + SYND_BYTES ];
  2369. unsigned char *x = preimage;
  2370. const unsigned char *s = sk + 40 + IRR_BYTES + COND_BYTES;
  2371. /**/
  2372. ret_decrypt = decrypt(e, sk + 40, c);
  2373. m = ret_decrypt;
  2374. m -= 1;
  2375. m >>= 8;
  2376. *x++ = m & 1;
  2377. for (i = 0; i < SYS_N/8; i++)
  2378. *x++ = (~m & s[i]) | (m & e[i]);
  2379. for (i = 0; i < SYND_BYTES; i++)
  2380. *x++ = c[i];
  2381. crypto_hash_32b(key, preimage, sizeof(preimage));
  2382. }
  2383. /* from libmceliece-20230612/crypto_kem/6688128f/vec/kem_enc.c */
  2384. /* 20230102 djb: rename encrypt() as pke_encrypt() */
  2385. /* 20221230 djb: add linker lines */
  2386. /* 20221230 djb: split out of operations.c */
  2387. /* linker define operation_enc */
  2388. /* linker use pke_encrypt */
  2389. static void operation_enc(
  2390. unsigned char *c,
  2391. unsigned char *key,
  2392. const unsigned char *pk
  2393. )
  2394. {
  2395. unsigned char e[ SYS_N/8 ];
  2396. unsigned char one_ec[ 1 + SYS_N/8 + SYND_BYTES ] = {1};
  2397. /**/
  2398. pke_encrypt(c, pk, e);
  2399. memcpy(one_ec + 1, e, SYS_N/8);
  2400. memcpy(one_ec + 1 + SYS_N/8, c, SYND_BYTES);
  2401. crypto_hash_32b(key, one_ec, sizeof(one_ec));
  2402. }
  2403. /* from libmceliece-20230612/crypto_kem/6688128f/vec/kem_keypair.c */
  2404. /* 20221230 djb: add linker lines */
  2405. /* 20221230 djb: split out of operations.c */
  2406. /* linker define operation_keypair */
  2407. /* linker use controlbitsfrompermutation genpoly_gen pk_gen */
  2408. static void operation_keypair
  2409. (
  2410. unsigned char *pk,
  2411. unsigned char *sk
  2412. )
  2413. {
  2414. int i;
  2415. unsigned char seed[ 33 ] = {64};
  2416. unsigned char r[ SYS_N/8 + (1 << GFBITS)*sizeof(uint32_t) + SYS_T*2 + 32 ];
  2417. unsigned char *rp, *skp;
  2418. uint64_t pivots = 0;
  2419. gf f[ SYS_T ]; /* element in GF(2^mt) */
  2420. gf irr[ SYS_T ]; /* Goppa polynomial */
  2421. uint32_t perm[ 1 << GFBITS ]; /* random permutation as 32-bit integers */
  2422. int16_t pi[ 1 << GFBITS ]; /* random permutation */
  2423. randombytes(seed+1, 32);
  2424. while (1)
  2425. {
  2426. rp = &r[ sizeof(r)-32 ];
  2427. skp = sk;
  2428. /* expanding and updating the seed */
  2429. shake(r, sizeof(r), seed, 33);
  2430. memcpy(skp, seed+1, 32);
  2431. skp += 32 + 8;
  2432. memcpy(seed+1, &r[ sizeof(r)-32 ], 32);
  2433. /* generating irreducible polynomial */
  2434. rp -= sizeof(f);
  2435. for (i = 0; i < SYS_T; i++)
  2436. f[i] = load_gf(rp + i*2);
  2437. if (genpoly_gen(irr, f))
  2438. continue;
  2439. for (i = 0; i < SYS_T; i++)
  2440. store_gf(skp + i*2, irr[i]);
  2441. skp += IRR_BYTES;
  2442. /* generating permutation */
  2443. rp -= sizeof(perm);
  2444. for (i = 0; i < (1 << GFBITS); i++)
  2445. perm[i] = load4(rp + i*4);
  2446. if (pk_gen(pk, skp - IRR_BYTES, perm, pi, &pivots))
  2447. continue;
  2448. controlbitsfrompermutation(skp, pi, GFBITS, 1 << GFBITS);
  2449. skp += COND_BYTES;
  2450. /* storing the random string s */
  2451. rp -= SYS_N/8;
  2452. memcpy(skp, rp, SYS_N/8);
  2453. /* storing positions of the 32 pivots */
  2454. store8(sk + 32, pivots);
  2455. break;
  2456. }
  2457. }
  2458. /* from libmceliece-20230612/crypto_kem/6688128f/vec/pk_gen.c */
  2459. /*
  2460. This file is for public-key generation
  2461. */
  2462. /* 20221231 djb: remove unused min definition */
  2463. /* 20221231 djb: more 0 initialization to clarify data flow; tnx thom wiggers */
  2464. /* 20221230 djb: add linker lines */
  2465. /* linker define pk_gen */
  2466. /* linker use fft vec_inv vec_mul */
  2467. static crypto_uint64 uint64_is_equal_declassify(uint64_t t,uint64_t u)
  2468. {
  2469. crypto_uint64 mask = crypto_uint64_equal_mask(t,u);
  2470. crypto_declassify(&mask,sizeof mask);
  2471. return mask;
  2472. }
  2473. static crypto_uint64 uint64_is_zero_declassify(uint64_t t)
  2474. {
  2475. crypto_uint64 mask = crypto_uint64_zero_mask(t);
  2476. crypto_declassify(&mask,sizeof mask);
  2477. return mask;
  2478. }
  2479. static void de_bitslicing(uint64_t * out, const vec in[][GFBITS])
  2480. {
  2481. int i, j, r;
  2482. for (i = 0; i < (1 << GFBITS); i++)
  2483. out[i] = 0 ;
  2484. for (i = 0; i < 128; i++)
  2485. for (j = GFBITS-1; j >= 0; j--)
  2486. for (r = 0; r < 64; r++)
  2487. {
  2488. out[i*64 + r] <<= 1;
  2489. out[i*64 + r] |= (in[i][j] >> r) & 1;
  2490. }
  2491. }
  2492. static void to_bitslicing_2x(vec out0[][GFBITS], vec out1[][GFBITS], const uint64_t * in)
  2493. {
  2494. int i, j, r;
  2495. for (i = 0; i < 128; i++)
  2496. {
  2497. for (j = 0;j < GFBITS;++j) out0[i][j] = out1[i][j] = 0;
  2498. for (j = GFBITS-1; j >= 0; j--)
  2499. for (r = 63; r >= 0; r--)
  2500. {
  2501. out1[i][j] <<= 1;
  2502. out1[i][j] |= (in[i*64 + r] >> (j + GFBITS)) & 1;
  2503. }
  2504. for (j = GFBITS-1; j >= 0; j--)
  2505. for (r = 63; r >= 0; r--)
  2506. {
  2507. out0[i][GFBITS-1-j] <<= 1;
  2508. out0[i][GFBITS-1-j] |= (in[i*64 + r] >> j) & 1;
  2509. }
  2510. }
  2511. }
  2512. /* return number of trailing zeros of in */
  2513. static inline int ctz(uint64_t in)
  2514. {
  2515. int i, b, m = 0, r = 0;
  2516. for (i = 0; i < 64; i++)
  2517. {
  2518. b = (in >> i) & 1;
  2519. m |= b;
  2520. r += (m^1) & (b^1);
  2521. }
  2522. return r;
  2523. }
  2524. static inline uint64_t same_mask(uint16_t x, uint16_t y)
  2525. {
  2526. uint64_t mask;
  2527. mask = x ^ y;
  2528. mask -= 1;
  2529. mask >>= 63;
  2530. mask = -mask;
  2531. return mask;
  2532. }
  2533. static int mov_columns(uint64_t mat[][ (SYS_N + 63) / 64 ], int16_t * pi, uint64_t * pivots)
  2534. {
  2535. int i, j, k, s, block_idx, row;
  2536. uint64_t buf[64], ctz_list[32], t, d, mask, one = 1;
  2537. row = PK_NROWS - 32;
  2538. block_idx = row/64;
  2539. /* extract the 32x64 matrix */
  2540. for (i = 0; i < 32; i++)
  2541. buf[i] = (mat[ row + i ][ block_idx + 0 ] >> 32) |
  2542. (mat[ row + i ][ block_idx + 1 ] << 32);
  2543. /* compute the column indices of pivots by Gaussian elimination. */
  2544. /* the indices are stored in ctz_list */
  2545. *pivots = 0;
  2546. for (i = 0; i < 32; i++)
  2547. {
  2548. t = buf[i];
  2549. for (j = i+1; j < 32; j++)
  2550. t |= buf[j];
  2551. if (uint64_is_zero_declassify(t)) return -1; /* return if buf is not full rank */
  2552. ctz_list[i] = s = ctz(t);
  2553. *pivots |= one << ctz_list[i];
  2554. for (j = i+1; j < 32; j++) { mask = (buf[i] >> s) & 1; mask -= 1; buf[i] ^= buf[j] & mask; }
  2555. for (j = i+1; j < 32; j++) { mask = (buf[j] >> s) & 1; mask = -mask; buf[j] ^= buf[i] & mask; }
  2556. }
  2557. /* updating permutation */
  2558. for (j = 0; j < 32; j++)
  2559. for (k = j+1; k < 64; k++)
  2560. {
  2561. d = pi[ row + j ] ^ pi[ row + k ];
  2562. d &= same_mask(k, ctz_list[j]);
  2563. pi[ row + j ] ^= d;
  2564. pi[ row + k ] ^= d;
  2565. }
  2566. /* moving columns of mat according to the column indices of pivots */
  2567. for (i = 0; i < PK_NROWS; i++)
  2568. {
  2569. t = (mat[ i ][ block_idx + 0 ] >> 32) |
  2570. (mat[ i ][ block_idx + 1 ] << 32);
  2571. for (j = 0; j < 32; j++)
  2572. {
  2573. d = t >> j;
  2574. d ^= t >> ctz_list[j];
  2575. d &= 1;
  2576. t ^= d << ctz_list[j];
  2577. t ^= d << j;
  2578. }
  2579. mat[ i ][ block_idx + 0 ] = (mat[ i ][ block_idx + 0 ] << 32 >> 32) | (t << 32);
  2580. mat[ i ][ block_idx + 1 ] = (mat[ i ][ block_idx + 1 ] >> 32 << 32) | (t >> 32);
  2581. }
  2582. return 0;
  2583. }
  2584. static int pk_gen(unsigned char * pk, const unsigned char * irr, uint32_t * perm, int16_t * pi, uint64_t * pivots)
  2585. {
  2586. const int nblocks_H = (SYS_N + 63) / 64;
  2587. const int nblocks_I = (PK_NROWS + 63) / 64;
  2588. int i, j, k;
  2589. int row, c;
  2590. uint64_t mat[ PK_NROWS ][ nblocks_H ];
  2591. uint64_t mask;
  2592. vec irr_int[2][ GFBITS ];
  2593. vec consts[ 128 ][ GFBITS ];
  2594. vec eval[ 128 ][ GFBITS ];
  2595. vec prod[ 128 ][ GFBITS ];
  2596. vec tmp[ GFBITS ];
  2597. uint64_t list[1 << GFBITS];
  2598. /* compute the inverses */
  2599. irr_load(irr_int, irr);
  2600. fft(eval, irr_int);
  2601. vec_copy(prod[0], eval[0]);
  2602. for (i = 1; i < 128; i++)
  2603. vec_mul(prod[i], prod[i-1], eval[i]);
  2604. vec_inv(tmp, prod[127]);
  2605. for (i = 126; i >= 0; i--)
  2606. {
  2607. vec_mul(prod[i+1], prod[i], tmp);
  2608. vec_mul(tmp, tmp, eval[i+1]);
  2609. }
  2610. vec_copy(prod[0], tmp);
  2611. /* fill matrix */
  2612. de_bitslicing(list, prod);
  2613. for (i = 0; i < (1 << GFBITS); i++)
  2614. {
  2615. list[i] <<= GFBITS;
  2616. list[i] |= i;
  2617. list[i] |= ((uint64_t) perm[i]) << 31;
  2618. }
  2619. uint64_sort(list, 1 << GFBITS);
  2620. for (i = 1; i < (1 << GFBITS); i++)
  2621. if (uint64_is_equal_declassify(list[i-1] >> 31,list[i] >> 31))
  2622. return -1;
  2623. to_bitslicing_2x(consts, prod, list);
  2624. for (i = 0; i < (1 << GFBITS); i++)
  2625. pi[i] = list[i] & GFMASK;
  2626. for (j = 0; j < nblocks_H; j++)
  2627. for (k = 0; k < GFBITS; k++)
  2628. mat[ k ][ j ] = prod[ j ][ k ];
  2629. for (i = 1; i < SYS_T; i++)
  2630. for (j = 0; j < nblocks_H; j++)
  2631. {
  2632. vec_mul(prod[j], prod[j], consts[j]);
  2633. for (k = 0; k < GFBITS; k++)
  2634. mat[ i*GFBITS + k ][ j ] = prod[ j ][ k ];
  2635. }
  2636. /* gaussian elimination */
  2637. for (row = 0; row < PK_NROWS; row++)
  2638. {
  2639. i = row >> 6;
  2640. j = row & 63;
  2641. if (row == PK_NROWS - 32)
  2642. {
  2643. if (mov_columns(mat, pi, pivots))
  2644. return -1;
  2645. }
  2646. for (k = row + 1; k < PK_NROWS; k++)
  2647. {
  2648. mask = mat[ row ][ i ] >> j;
  2649. mask &= 1;
  2650. mask -= 1;
  2651. for (c = 0; c < nblocks_H; c++)
  2652. mat[ row ][ c ] ^= mat[ k ][ c ] & mask;
  2653. }
  2654. if ( uint64_is_zero_declassify((mat[ row ][ i ] >> j) & 1) ) /* return if not systematic */
  2655. {
  2656. return -1;
  2657. }
  2658. for (k = 0; k < row; k++)
  2659. {
  2660. mask = mat[ k ][ i ] >> j;
  2661. mask &= 1;
  2662. mask = -mask;
  2663. for (c = 0; c < nblocks_H; c++)
  2664. mat[ k ][ c ] ^= mat[ row ][ c ] & mask;
  2665. }
  2666. for (k = row+1; k < PK_NROWS; k++)
  2667. {
  2668. mask = mat[ k ][ i ] >> j;
  2669. mask &= 1;
  2670. mask = -mask;
  2671. for (c = 0; c < nblocks_H; c++)
  2672. mat[ k ][ c ] ^= mat[ row ][ c ] & mask;
  2673. }
  2674. }
  2675. for (i = 0; i < PK_NROWS; i++)
  2676. {
  2677. for (j = nblocks_I; j < nblocks_H-1; j++)
  2678. {
  2679. store8(pk, mat[i][j]);
  2680. pk += 8;
  2681. }
  2682. store_i(pk, mat[i][j], PK_ROW_BYTES % 8);
  2683. pk += PK_ROW_BYTES % 8;
  2684. }
  2685. /**/
  2686. return 0;
  2687. }
  2688. /* from libmceliece-20230612/crypto_kem/6688128f/vec/sk_gen.c */
  2689. /*
  2690. This file is for secret-key generation
  2691. */
  2692. /* 20221230 djb: add linker lines */
  2693. /* linker define genpoly_gen */
  2694. /* linker use gf_iszero gf_mul gf_inv GF_mul */
  2695. static inline crypto_uint16 gf_is_zero_declassify(gf t)
  2696. {
  2697. crypto_uint16 mask = crypto_uint16_zero_mask(t);
  2698. crypto_declassify(&mask,sizeof mask);
  2699. return mask;
  2700. }
  2701. /* input: f, element in GF((2^m)^t) */
  2702. /* output: out, minimal polynomial of f */
  2703. /* return: 0 for success and -1 for failure */
  2704. static int genpoly_gen(gf *out, gf *f)
  2705. {
  2706. int i, j, k, c;
  2707. gf mat[ SYS_T+1 ][ SYS_T ];
  2708. gf mask, inv, t;
  2709. /* fill matrix */
  2710. mat[0][0] = 1;
  2711. for (i = 1; i < SYS_T; i++)
  2712. mat[0][i] = 0;
  2713. for (i = 0; i < SYS_T; i++)
  2714. mat[1][i] = f[i];
  2715. for (j = 2; j <= SYS_T; j++)
  2716. GF_mul(mat[j], mat[j-1], f);
  2717. /* gaussian */
  2718. for (j = 0; j < SYS_T; j++)
  2719. {
  2720. for (k = j + 1; k < SYS_T; k++)
  2721. {
  2722. mask = gf_iszero(mat[ j ][ j ]);
  2723. for (c = j; c < SYS_T + 1; c++)
  2724. mat[ c ][ j ] ^= mat[ c ][ k ] & mask;
  2725. }
  2726. if ( gf_is_zero_declassify(mat[ j ][ j ]) ) /* return if not systematic */
  2727. {
  2728. return -1;
  2729. }
  2730. inv = gf_inv(mat[j][j]);
  2731. for (c = j; c < SYS_T + 1; c++)
  2732. mat[ c ][ j ] = gf_mul(mat[ c ][ j ], inv) ;
  2733. for (k = 0; k < SYS_T; k++)
  2734. {
  2735. if (k != j)
  2736. {
  2737. t = mat[ j ][ k ];
  2738. for (c = j; c < SYS_T + 1; c++)
  2739. mat[ c ][ k ] ^= gf_mul(mat[ c ][ j ], t);
  2740. }
  2741. }
  2742. }
  2743. for (i = 0; i < SYS_T; i++)
  2744. out[i] = mat[ SYS_T ][ i ];
  2745. return 0;
  2746. }
  2747. /* from libmceliece-20230612/crypto_kem/6688128f/vec/vec.c */
  2748. /* 20221230 djb: add linker line */
  2749. /* linker define vec_mul vec_sq vec_inv */
  2750. static void vec_mul(vec * h, const vec * f, const vec * g)
  2751. {
  2752. int i, j;
  2753. vec buf[ 2*GFBITS-1 ];
  2754. for (i = 0; i < 2*GFBITS-1; i++)
  2755. buf[i] = 0;
  2756. for (i = 0; i < GFBITS; i++)
  2757. for (j = 0; j < GFBITS; j++)
  2758. buf[i+j] ^= f[i] & g[j];
  2759. for (i = 2*GFBITS-2; i >= GFBITS; i--)
  2760. {
  2761. buf[i-GFBITS+4] ^= buf[i];
  2762. buf[i-GFBITS+3] ^= buf[i];
  2763. buf[i-GFBITS+1] ^= buf[i];
  2764. buf[i-GFBITS+0] ^= buf[i];
  2765. }
  2766. for (i = 0; i < GFBITS; i++)
  2767. h[i] = buf[i];
  2768. }
  2769. /* bitsliced field squarings */
  2770. static void vec_sq(vec * out, vec * in)
  2771. {
  2772. int i;
  2773. vec result[GFBITS], t;
  2774. t = in[11] ^ in[12];
  2775. result[0] = in[0] ^ in[11];
  2776. result[1] = in[7] ^ t;
  2777. result[2] = in[1] ^ in[7];
  2778. result[3] = in[8] ^ t;
  2779. result[4] = in[2] ^ in[7];
  2780. result[4] = result[4] ^ in[8];
  2781. result[4] = result[4] ^ t;
  2782. result[5] = in[7] ^ in[9];
  2783. result[6] = in[3] ^ in[8];
  2784. result[6] = result[6] ^ in[9];
  2785. result[6] = result[6] ^ in[12];
  2786. result[7] = in[8] ^ in[10];
  2787. result[8] = in[4] ^ in[9];
  2788. result[8] = result[8] ^ in[10];
  2789. result[9] = in[9] ^ in[11];
  2790. result[10] = in[5] ^ in[10];
  2791. result[10] = result[10] ^ in[11];
  2792. result[11] = in[10] ^ in[12];
  2793. result[12] = in[6] ^ t;
  2794. for (i = 0; i < GFBITS; i++)
  2795. out[i] = result[i];
  2796. }
  2797. /* bitsliced field inverses */
  2798. static void vec_inv(vec * out, vec * in)
  2799. {
  2800. vec tmp_11[ GFBITS ];
  2801. vec tmp_1111[ GFBITS ];
  2802. vec_copy(out, in);
  2803. vec_sq(out, out);
  2804. vec_mul(tmp_11, out, in); /* ^11 */
  2805. vec_sq(out, tmp_11);
  2806. vec_sq(out, out);
  2807. vec_mul(tmp_1111, out, tmp_11); /* ^1111 */
  2808. vec_sq(out, tmp_1111);
  2809. vec_sq(out, out);
  2810. vec_sq(out, out);
  2811. vec_sq(out, out);
  2812. vec_mul(out, out, tmp_1111); /* ^11111111 */
  2813. vec_sq(out, out);
  2814. vec_sq(out, out);
  2815. vec_sq(out, out);
  2816. vec_sq(out, out);
  2817. vec_mul(out, out, tmp_1111); /* ^111111111111 */
  2818. vec_sq(out, out); /* ^1111111111110 */
  2819. }
  2820. /* from libmceliece-20230612/crypto_kem/6688128f/vec/wrap_dec.c */
  2821. void mceliece6688128f_dec(uint8_t *key,
  2822. const uint8_t *c,
  2823. const uint8_t *sk)
  2824. {
  2825. operation_dec((unsigned char*) key,
  2826. (unsigned char*) c,
  2827. (unsigned char*) sk);
  2828. }
  2829. /* from libmceliece-20230612/crypto_kem/6688128f/vec/wrap_enc.c */
  2830. void mceliece6688128f_enc(uint8_t *c,
  2831. uint8_t *key,
  2832. const uint8_t *pk)
  2833. {
  2834. operation_enc((unsigned char*) c,
  2835. (unsigned char*) key,
  2836. (unsigned char*) pk);
  2837. }
  2838. /* from libmceliece-20230612/crypto_kem/6688128f/vec/wrap_keypair.c */
  2839. void mceliece6688128f_keypair(uint8_t *pk,
  2840. uint8_t *sk)
  2841. {
  2842. operation_keypair((unsigned char*) pk, (unsigned char*) sk);
  2843. }