curve25519.c 96 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230
  1. // The MIT License (MIT)
  2. //
  3. // Copyright (c) 2015-2016 the fiat-crypto authors (see the AUTHORS file).
  4. //
  5. // Permission is hereby granted, free of charge, to any person obtaining a copy
  6. // of this software and associated documentation files (the "Software"), to deal
  7. // in the Software without restriction, including without limitation the rights
  8. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  9. // copies of the Software, and to permit persons to whom the Software is
  10. // furnished to do so, subject to the following conditions:
  11. //
  12. // The above copyright notice and this permission notice shall be included in all
  13. // copies or substantial portions of the Software.
  14. //
  15. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  18. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  20. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  21. // SOFTWARE.
  22. // Some of this code is taken from the ref10 version of Ed25519 in SUPERCOP
  23. // 20141124 (http://bench.cr.yp.to/supercop.html). That code is released as
  24. // public domain but parts have been replaced with code generated by Fiat
  25. // (https://github.com/mit-plv/fiat-crypto), which is MIT licensed.
  26. //
  27. // The field functions are shared by Ed25519 and X25519 where possible.
  28. #include <openssl/curve25519.h>
  29. #include <assert.h>
  30. #include <string.h>
  31. #include <openssl/cpu.h>
  32. #include <openssl/mem.h>
  33. #include <openssl/rand.h>
  34. #include <openssl/sha.h>
  35. #include <openssl/type_check.h>
  36. #include "internal.h"
  37. #include "../../crypto/internal.h"
  38. // Various pre-computed constants.
  39. #include "./curve25519_tables.h"
  40. // Low-level intrinsic operations (hand-written).
  41. static uint64_t load_3(const uint8_t *in) {
  42. uint64_t result;
  43. result = (uint64_t)in[0];
  44. result |= ((uint64_t)in[1]) << 8;
  45. result |= ((uint64_t)in[2]) << 16;
  46. return result;
  47. }
  48. static uint64_t load_4(const uint8_t *in) {
  49. uint64_t result;
  50. result = (uint64_t)in[0];
  51. result |= ((uint64_t)in[1]) << 8;
  52. result |= ((uint64_t)in[2]) << 16;
  53. result |= ((uint64_t)in[3]) << 24;
  54. return result;
  55. }
  56. #if defined(BORINGSSL_CURVE25519_64BIT)
  57. static uint64_t load_8(const uint8_t *in) {
  58. uint64_t result;
  59. result = (uint64_t)in[0];
  60. result |= ((uint64_t)in[1]) << 8;
  61. result |= ((uint64_t)in[2]) << 16;
  62. result |= ((uint64_t)in[3]) << 24;
  63. result |= ((uint64_t)in[4]) << 32;
  64. result |= ((uint64_t)in[5]) << 40;
  65. result |= ((uint64_t)in[6]) << 48;
  66. result |= ((uint64_t)in[7]) << 56;
  67. return result;
  68. }
  69. static uint8_t /*bool*/ addcarryx_u51(uint8_t /*bool*/ c, uint64_t a,
  70. uint64_t b, uint64_t *low) {
  71. // This function extracts 51 bits of result and 1 bit of carry (52 total), so
  72. // a 64-bit intermediate is sufficient.
  73. uint64_t x = a + b + c;
  74. *low = x & ((UINT64_C(1) << 51) - 1);
  75. return (x >> 51) & 1;
  76. }
  77. static uint8_t /*bool*/ subborrow_u51(uint8_t /*bool*/ c, uint64_t a,
  78. uint64_t b, uint64_t *low) {
  79. // This function extracts 51 bits of result and 1 bit of borrow (52 total), so
  80. // a 64-bit intermediate is sufficient.
  81. uint64_t x = a - b - c;
  82. *low = x & ((UINT64_C(1) << 51) - 1);
  83. return x >> 63;
  84. }
  85. static uint64_t cmovznz64(uint64_t t, uint64_t z, uint64_t nz) {
  86. t = -!!t; // all set if nonzero, 0 if 0
  87. return (t&nz) | ((~t)&z);
  88. }
  89. #else
  90. static uint8_t /*bool*/ addcarryx_u25(uint8_t /*bool*/ c, uint32_t a,
  91. uint32_t b, uint32_t *low) {
  92. // This function extracts 25 bits of result and 1 bit of carry (26 total), so
  93. // a 32-bit intermediate is sufficient.
  94. uint32_t x = a + b + c;
  95. *low = x & ((1 << 25) - 1);
  96. return (x >> 25) & 1;
  97. }
  98. static uint8_t /*bool*/ addcarryx_u26(uint8_t /*bool*/ c, uint32_t a,
  99. uint32_t b, uint32_t *low) {
  100. // This function extracts 26 bits of result and 1 bit of carry (27 total), so
  101. // a 32-bit intermediate is sufficient.
  102. uint32_t x = a + b + c;
  103. *low = x & ((1 << 26) - 1);
  104. return (x >> 26) & 1;
  105. }
  106. static uint8_t /*bool*/ subborrow_u25(uint8_t /*bool*/ c, uint32_t a,
  107. uint32_t b, uint32_t *low) {
  108. // This function extracts 25 bits of result and 1 bit of borrow (26 total), so
  109. // a 32-bit intermediate is sufficient.
  110. uint32_t x = a - b - c;
  111. *low = x & ((1 << 25) - 1);
  112. return x >> 31;
  113. }
  114. static uint8_t /*bool*/ subborrow_u26(uint8_t /*bool*/ c, uint32_t a,
  115. uint32_t b, uint32_t *low) {
  116. // This function extracts 26 bits of result and 1 bit of borrow (27 total), so
  117. // a 32-bit intermediate is sufficient.
  118. uint32_t x = a - b - c;
  119. *low = x & ((1 << 26) - 1);
  120. return x >> 31;
  121. }
  122. static uint32_t cmovznz32(uint32_t t, uint32_t z, uint32_t nz) {
  123. t = -!!t; // all set if nonzero, 0 if 0
  124. return (t&nz) | ((~t)&z);
  125. }
  126. #endif
  127. // Field operations.
  128. #if defined(BORINGSSL_CURVE25519_64BIT)
  129. #define assert_fe(f) do { \
  130. for (unsigned _assert_fe_i = 0; _assert_fe_i< 5; _assert_fe_i++) { \
  131. assert(f[_assert_fe_i] < 1.125*(UINT64_C(1)<<51)); \
  132. } \
  133. } while (0)
  134. #define assert_fe_loose(f) do { \
  135. for (unsigned _assert_fe_i = 0; _assert_fe_i< 5; _assert_fe_i++) { \
  136. assert(f[_assert_fe_i] < 3.375*(UINT64_C(1)<<51)); \
  137. } \
  138. } while (0)
  139. #define assert_fe_frozen(f) do { \
  140. for (unsigned _assert_fe_i = 0; _assert_fe_i< 5; _assert_fe_i++) { \
  141. assert(f[_assert_fe_i] < (UINT64_C(1)<<51)); \
  142. } \
  143. } while (0)
  144. static void fe_frombytes_impl(uint64_t h[5], const uint8_t *s) {
  145. // Ignores top bit of s.
  146. uint64_t a0 = load_8(s);
  147. uint64_t a1 = load_8(s+8);
  148. uint64_t a2 = load_8(s+16);
  149. uint64_t a3 = load_8(s+24);
  150. // Use 51 bits, 64-51 = 13 left.
  151. h[0] = a0 & ((UINT64_C(1) << 51) - 1);
  152. // (64-51) + 38 = 13 + 38 = 51
  153. h[1] = (a0 >> 51) | ((a1 & ((UINT64_C(1) << 38) - 1)) << 13);
  154. // (64-38) + 25 = 26 + 25 = 51
  155. h[2] = (a1 >> 38) | ((a2 & ((UINT64_C(1) << 25) - 1)) << 26);
  156. // (64-25) + 12 = 39 + 12 = 51
  157. h[3] = (a2 >> 25) | ((a3 & ((UINT64_C(1) << 12) - 1)) << 39);
  158. // (64-12) = 52, ignore top bit
  159. h[4] = (a3 >> 12) & ((UINT64_C(1) << 51) - 1);
  160. assert_fe(h);
  161. }
  162. static void fe_frombytes(fe *h, const uint8_t *s) {
  163. fe_frombytes_impl(h->v, s);
  164. }
  165. static void fe_freeze(uint64_t out[5], const uint64_t in1[5]) {
  166. { const uint64_t x7 = in1[4];
  167. { const uint64_t x8 = in1[3];
  168. { const uint64_t x6 = in1[2];
  169. { const uint64_t x4 = in1[1];
  170. { const uint64_t x2 = in1[0];
  171. { uint64_t x10; uint8_t/*bool*/ x11 = subborrow_u51(0x0, x2, 0x7ffffffffffed, &x10);
  172. { uint64_t x13; uint8_t/*bool*/ x14 = subborrow_u51(x11, x4, 0x7ffffffffffff, &x13);
  173. { uint64_t x16; uint8_t/*bool*/ x17 = subborrow_u51(x14, x6, 0x7ffffffffffff, &x16);
  174. { uint64_t x19; uint8_t/*bool*/ x20 = subborrow_u51(x17, x8, 0x7ffffffffffff, &x19);
  175. { uint64_t x22; uint8_t/*bool*/ x23 = subborrow_u51(x20, x7, 0x7ffffffffffff, &x22);
  176. { uint64_t x24 = cmovznz64(x23, 0x0, 0xffffffffffffffffL);
  177. { uint64_t x25 = (x24 & 0x7ffffffffffed);
  178. { uint64_t x27; uint8_t/*bool*/ x28 = addcarryx_u51(0x0, x10, x25, &x27);
  179. { uint64_t x29 = (x24 & 0x7ffffffffffff);
  180. { uint64_t x31; uint8_t/*bool*/ x32 = addcarryx_u51(x28, x13, x29, &x31);
  181. { uint64_t x33 = (x24 & 0x7ffffffffffff);
  182. { uint64_t x35; uint8_t/*bool*/ x36 = addcarryx_u51(x32, x16, x33, &x35);
  183. { uint64_t x37 = (x24 & 0x7ffffffffffff);
  184. { uint64_t x39; uint8_t/*bool*/ x40 = addcarryx_u51(x36, x19, x37, &x39);
  185. { uint64_t x41 = (x24 & 0x7ffffffffffff);
  186. { uint64_t x43; addcarryx_u51(x40, x22, x41, &x43);
  187. out[0] = x27;
  188. out[1] = x31;
  189. out[2] = x35;
  190. out[3] = x39;
  191. out[4] = x43;
  192. }}}}}}}}}}}}}}}}}}}}}
  193. }
  194. static void fe_tobytes(uint8_t s[32], const fe *f) {
  195. assert_fe(f->v);
  196. uint64_t h[5];
  197. fe_freeze(h, f->v);
  198. assert_fe_frozen(h);
  199. s[0] = h[0] >> 0;
  200. s[1] = h[0] >> 8;
  201. s[2] = h[0] >> 16;
  202. s[3] = h[0] >> 24;
  203. s[4] = h[0] >> 32;
  204. s[5] = h[0] >> 40;
  205. s[6] = (h[0] >> 48) | (h[1] << 3);
  206. s[7] = h[1] >> 5;
  207. s[8] = h[1] >> 13;
  208. s[9] = h[1] >> 21;
  209. s[10] = h[1] >> 29;
  210. s[11] = h[1] >> 37;
  211. s[12] = (h[1] >> 45) | (h[2] << 6);
  212. s[13] = h[2] >> 2;
  213. s[14] = h[2] >> 10;
  214. s[15] = h[2] >> 18;
  215. s[16] = h[2] >> 26;
  216. s[17] = h[2] >> 34;
  217. s[18] = h[2] >> 42;
  218. s[19] = (h[2] >> 50) | (h[3] << 1);
  219. s[20] = h[3] >> 7;
  220. s[21] = h[3] >> 15;
  221. s[22] = h[3] >> 23;
  222. s[23] = h[3] >> 31;
  223. s[24] = h[3] >> 39;
  224. s[25] = (h[3] >> 47) | (h[4] << 4);
  225. s[26] = h[4] >> 4;
  226. s[27] = h[4] >> 12;
  227. s[28] = h[4] >> 20;
  228. s[29] = h[4] >> 28;
  229. s[30] = h[4] >> 36;
  230. s[31] = h[4] >> 44;
  231. }
  232. // h = 0
  233. static void fe_0(fe *h) {
  234. OPENSSL_memset(h, 0, sizeof(fe));
  235. }
  236. static void fe_loose_0(fe_loose *h) {
  237. OPENSSL_memset(h, 0, sizeof(fe_loose));
  238. }
  239. // h = 1
  240. static void fe_1(fe *h) {
  241. OPENSSL_memset(h, 0, sizeof(fe));
  242. h->v[0] = 1;
  243. }
  244. static void fe_loose_1(fe_loose *h) {
  245. OPENSSL_memset(h, 0, sizeof(fe_loose));
  246. h->v[0] = 1;
  247. }
  248. static void fe_add_impl(uint64_t out[5], const uint64_t in1[5], const uint64_t in2[5]) {
  249. { const uint64_t x10 = in1[4];
  250. { const uint64_t x11 = in1[3];
  251. { const uint64_t x9 = in1[2];
  252. { const uint64_t x7 = in1[1];
  253. { const uint64_t x5 = in1[0];
  254. { const uint64_t x18 = in2[4];
  255. { const uint64_t x19 = in2[3];
  256. { const uint64_t x17 = in2[2];
  257. { const uint64_t x15 = in2[1];
  258. { const uint64_t x13 = in2[0];
  259. out[0] = (x5 + x13);
  260. out[1] = (x7 + x15);
  261. out[2] = (x9 + x17);
  262. out[3] = (x11 + x19);
  263. out[4] = (x10 + x18);
  264. }}}}}}}}}}
  265. }
  266. // h = f + g
  267. // Can overlap h with f or g.
  268. static void fe_add(fe_loose *h, const fe *f, const fe *g) {
  269. assert_fe(f->v);
  270. assert_fe(g->v);
  271. fe_add_impl(h->v, f->v, g->v);
  272. assert_fe_loose(h->v);
  273. }
  274. static void fe_sub_impl(uint64_t out[5], const uint64_t in1[5], const uint64_t in2[5]) {
  275. { const uint64_t x10 = in1[4];
  276. { const uint64_t x11 = in1[3];
  277. { const uint64_t x9 = in1[2];
  278. { const uint64_t x7 = in1[1];
  279. { const uint64_t x5 = in1[0];
  280. { const uint64_t x18 = in2[4];
  281. { const uint64_t x19 = in2[3];
  282. { const uint64_t x17 = in2[2];
  283. { const uint64_t x15 = in2[1];
  284. { const uint64_t x13 = in2[0];
  285. out[0] = ((0xfffffffffffda + x5) - x13);
  286. out[1] = ((0xffffffffffffe + x7) - x15);
  287. out[2] = ((0xffffffffffffe + x9) - x17);
  288. out[3] = ((0xffffffffffffe + x11) - x19);
  289. out[4] = ((0xffffffffffffe + x10) - x18);
  290. }}}}}}}}}}
  291. }
  292. // h = f - g
  293. // Can overlap h with f or g.
  294. static void fe_sub(fe_loose *h, const fe *f, const fe *g) {
  295. assert_fe(f->v);
  296. assert_fe(g->v);
  297. fe_sub_impl(h->v, f->v, g->v);
  298. assert_fe_loose(h->v);
  299. }
  300. static void fe_carry_impl(uint64_t out[5], const uint64_t in1[5]) {
  301. { const uint64_t x7 = in1[4];
  302. { const uint64_t x8 = in1[3];
  303. { const uint64_t x6 = in1[2];
  304. { const uint64_t x4 = in1[1];
  305. { const uint64_t x2 = in1[0];
  306. { uint64_t x9 = (x2 >> 0x33);
  307. { uint64_t x10 = (x2 & 0x7ffffffffffff);
  308. { uint64_t x11 = (x9 + x4);
  309. { uint64_t x12 = (x11 >> 0x33);
  310. { uint64_t x13 = (x11 & 0x7ffffffffffff);
  311. { uint64_t x14 = (x12 + x6);
  312. { uint64_t x15 = (x14 >> 0x33);
  313. { uint64_t x16 = (x14 & 0x7ffffffffffff);
  314. { uint64_t x17 = (x15 + x8);
  315. { uint64_t x18 = (x17 >> 0x33);
  316. { uint64_t x19 = (x17 & 0x7ffffffffffff);
  317. { uint64_t x20 = (x18 + x7);
  318. { uint64_t x21 = (x20 >> 0x33);
  319. { uint64_t x22 = (x20 & 0x7ffffffffffff);
  320. { uint64_t x23 = (x10 + (0x13 * x21));
  321. { uint64_t x24 = (x23 >> 0x33);
  322. { uint64_t x25 = (x23 & 0x7ffffffffffff);
  323. { uint64_t x26 = (x24 + x13);
  324. { uint64_t x27 = (x26 >> 0x33);
  325. { uint64_t x28 = (x26 & 0x7ffffffffffff);
  326. out[0] = x25;
  327. out[1] = x28;
  328. out[2] = (x27 + x16);
  329. out[3] = x19;
  330. out[4] = x22;
  331. }}}}}}}}}}}}}}}}}}}}}}}}}
  332. }
  333. static void fe_carry(fe *h, const fe_loose* f) {
  334. assert_fe_loose(f->v);
  335. fe_carry_impl(h->v, f->v);
  336. assert_fe(h->v);
  337. }
  338. static void fe_mul_impl(uint64_t out[5], const uint64_t in1[5], const uint64_t in2[5]) {
  339. assert_fe_loose(in1);
  340. assert_fe_loose(in2);
  341. { const uint64_t x10 = in1[4];
  342. { const uint64_t x11 = in1[3];
  343. { const uint64_t x9 = in1[2];
  344. { const uint64_t x7 = in1[1];
  345. { const uint64_t x5 = in1[0];
  346. { const uint64_t x18 = in2[4];
  347. { const uint64_t x19 = in2[3];
  348. { const uint64_t x17 = in2[2];
  349. { const uint64_t x15 = in2[1];
  350. { const uint64_t x13 = in2[0];
  351. { uint128_t x20 = ((uint128_t)x5 * x13);
  352. { uint128_t x21 = (((uint128_t)x5 * x15) + ((uint128_t)x7 * x13));
  353. { uint128_t x22 = ((((uint128_t)x5 * x17) + ((uint128_t)x9 * x13)) + ((uint128_t)x7 * x15));
  354. { uint128_t x23 = (((((uint128_t)x5 * x19) + ((uint128_t)x11 * x13)) + ((uint128_t)x7 * x17)) + ((uint128_t)x9 * x15));
  355. { uint128_t x24 = ((((((uint128_t)x5 * x18) + ((uint128_t)x10 * x13)) + ((uint128_t)x11 * x15)) + ((uint128_t)x7 * x19)) + ((uint128_t)x9 * x17));
  356. { uint64_t x25 = (x10 * 0x13);
  357. { uint64_t x26 = (x7 * 0x13);
  358. { uint64_t x27 = (x9 * 0x13);
  359. { uint64_t x28 = (x11 * 0x13);
  360. { uint128_t x29 = ((((x20 + ((uint128_t)x25 * x15)) + ((uint128_t)x26 * x18)) + ((uint128_t)x27 * x19)) + ((uint128_t)x28 * x17));
  361. { uint128_t x30 = (((x21 + ((uint128_t)x25 * x17)) + ((uint128_t)x27 * x18)) + ((uint128_t)x28 * x19));
  362. { uint128_t x31 = ((x22 + ((uint128_t)x25 * x19)) + ((uint128_t)x28 * x18));
  363. { uint128_t x32 = (x23 + ((uint128_t)x25 * x18));
  364. { uint64_t x33 = (uint64_t) (x29 >> 0x33);
  365. { uint64_t x34 = ((uint64_t)x29 & 0x7ffffffffffff);
  366. { uint128_t x35 = (x33 + x30);
  367. { uint64_t x36 = (uint64_t) (x35 >> 0x33);
  368. { uint64_t x37 = ((uint64_t)x35 & 0x7ffffffffffff);
  369. { uint128_t x38 = (x36 + x31);
  370. { uint64_t x39 = (uint64_t) (x38 >> 0x33);
  371. { uint64_t x40 = ((uint64_t)x38 & 0x7ffffffffffff);
  372. { uint128_t x41 = (x39 + x32);
  373. { uint64_t x42 = (uint64_t) (x41 >> 0x33);
  374. { uint64_t x43 = ((uint64_t)x41 & 0x7ffffffffffff);
  375. { uint128_t x44 = (x42 + x24);
  376. { uint64_t x45 = (uint64_t) (x44 >> 0x33);
  377. { uint64_t x46 = ((uint64_t)x44 & 0x7ffffffffffff);
  378. { uint64_t x47 = (x34 + (0x13 * x45));
  379. { uint64_t x48 = (x47 >> 0x33);
  380. { uint64_t x49 = (x47 & 0x7ffffffffffff);
  381. { uint64_t x50 = (x48 + x37);
  382. { uint64_t x51 = (x50 >> 0x33);
  383. { uint64_t x52 = (x50 & 0x7ffffffffffff);
  384. out[0] = x49;
  385. out[1] = x52;
  386. out[2] = (x51 + x40);
  387. out[3] = x43;
  388. out[4] = x46;
  389. }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
  390. assert_fe(out);
  391. }
  392. static void fe_mul_ltt(fe_loose *h, const fe *f, const fe *g) {
  393. fe_mul_impl(h->v, f->v, g->v);
  394. }
  395. static void fe_mul_llt(fe_loose *h, const fe_loose *f, const fe *g) {
  396. fe_mul_impl(h->v, f->v, g->v);
  397. }
  398. static void fe_mul_ttt(fe *h, const fe *f, const fe *g) {
  399. fe_mul_impl(h->v, f->v, g->v);
  400. }
  401. static void fe_mul_tlt(fe *h, const fe_loose *f, const fe *g) {
  402. fe_mul_impl(h->v, f->v, g->v);
  403. }
  404. static void fe_mul_ttl(fe *h, const fe *f, const fe_loose *g) {
  405. fe_mul_impl(h->v, f->v, g->v);
  406. }
  407. static void fe_mul_tll(fe *h, const fe_loose *f, const fe_loose *g) {
  408. fe_mul_impl(h->v, f->v, g->v);
  409. }
  410. static void fe_sqr_impl(uint64_t out[5], const uint64_t in1[5]) {
  411. assert_fe_loose(in1);
  412. { const uint64_t x7 = in1[4];
  413. { const uint64_t x8 = in1[3];
  414. { const uint64_t x6 = in1[2];
  415. { const uint64_t x4 = in1[1];
  416. { const uint64_t x2 = in1[0];
  417. { uint64_t x9 = (x2 * 0x2);
  418. { uint64_t x10 = (x4 * 0x2);
  419. { uint64_t x11 = ((x6 * 0x2) * 0x13);
  420. { uint64_t x12 = (x7 * 0x13);
  421. { uint64_t x13 = (x12 * 0x2);
  422. { uint128_t x14 = ((((uint128_t)x2 * x2) + ((uint128_t)x13 * x4)) + ((uint128_t)x11 * x8));
  423. { uint128_t x15 = ((((uint128_t)x9 * x4) + ((uint128_t)x13 * x6)) + ((uint128_t)x8 * (x8 * 0x13)));
  424. { uint128_t x16 = ((((uint128_t)x9 * x6) + ((uint128_t)x4 * x4)) + ((uint128_t)x13 * x8));
  425. { uint128_t x17 = ((((uint128_t)x9 * x8) + ((uint128_t)x10 * x6)) + ((uint128_t)x7 * x12));
  426. { uint128_t x18 = ((((uint128_t)x9 * x7) + ((uint128_t)x10 * x8)) + ((uint128_t)x6 * x6));
  427. { uint64_t x19 = (uint64_t) (x14 >> 0x33);
  428. { uint64_t x20 = ((uint64_t)x14 & 0x7ffffffffffff);
  429. { uint128_t x21 = (x19 + x15);
  430. { uint64_t x22 = (uint64_t) (x21 >> 0x33);
  431. { uint64_t x23 = ((uint64_t)x21 & 0x7ffffffffffff);
  432. { uint128_t x24 = (x22 + x16);
  433. { uint64_t x25 = (uint64_t) (x24 >> 0x33);
  434. { uint64_t x26 = ((uint64_t)x24 & 0x7ffffffffffff);
  435. { uint128_t x27 = (x25 + x17);
  436. { uint64_t x28 = (uint64_t) (x27 >> 0x33);
  437. { uint64_t x29 = ((uint64_t)x27 & 0x7ffffffffffff);
  438. { uint128_t x30 = (x28 + x18);
  439. { uint64_t x31 = (uint64_t) (x30 >> 0x33);
  440. { uint64_t x32 = ((uint64_t)x30 & 0x7ffffffffffff);
  441. { uint64_t x33 = (x20 + (0x13 * x31));
  442. { uint64_t x34 = (x33 >> 0x33);
  443. { uint64_t x35 = (x33 & 0x7ffffffffffff);
  444. { uint64_t x36 = (x34 + x23);
  445. { uint64_t x37 = (x36 >> 0x33);
  446. { uint64_t x38 = (x36 & 0x7ffffffffffff);
  447. out[0] = x35;
  448. out[1] = x38;
  449. out[2] = (x37 + x26);
  450. out[3] = x29;
  451. out[4] = x32;
  452. }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
  453. assert_fe(out);
  454. }
  455. static void fe_sq_tl(fe *h, const fe_loose *f) {
  456. fe_sqr_impl(h->v, f->v);
  457. }
  458. static void fe_sq_tt(fe *h, const fe *f) {
  459. fe_sqr_impl(h->v, f->v);
  460. }
  461. // Replace (f,g) with (g,f) if b == 1;
  462. // replace (f,g) with (f,g) if b == 0.
  463. //
  464. // Preconditions: b in {0,1}.
  465. static void fe_cswap(fe *f, fe *g, uint64_t b) {
  466. b = 0-b;
  467. for (unsigned i = 0; i < 5; i++) {
  468. uint64_t x = f->v[i] ^ g->v[i];
  469. x &= b;
  470. f->v[i] ^= x;
  471. g->v[i] ^= x;
  472. }
  473. }
  474. // NOTE: based on fiat-crypto fe_mul, edited for in2=121666, 0, 0..
  475. static void fe_mul_121666_impl(uint64_t out[5], const uint64_t in1[5]) {
  476. { const uint64_t x10 = in1[4];
  477. { const uint64_t x11 = in1[3];
  478. { const uint64_t x9 = in1[2];
  479. { const uint64_t x7 = in1[1];
  480. { const uint64_t x5 = in1[0];
  481. { const uint64_t x18 = 0;
  482. { const uint64_t x19 = 0;
  483. { const uint64_t x17 = 0;
  484. { const uint64_t x15 = 0;
  485. { const uint64_t x13 = 121666;
  486. { uint128_t x20 = ((uint128_t)x5 * x13);
  487. { uint128_t x21 = (((uint128_t)x5 * x15) + ((uint128_t)x7 * x13));
  488. { uint128_t x22 = ((((uint128_t)x5 * x17) + ((uint128_t)x9 * x13)) + ((uint128_t)x7 * x15));
  489. { uint128_t x23 = (((((uint128_t)x5 * x19) + ((uint128_t)x11 * x13)) + ((uint128_t)x7 * x17)) + ((uint128_t)x9 * x15));
  490. { uint128_t x24 = ((((((uint128_t)x5 * x18) + ((uint128_t)x10 * x13)) + ((uint128_t)x11 * x15)) + ((uint128_t)x7 * x19)) + ((uint128_t)x9 * x17));
  491. { uint64_t x25 = (x10 * 0x13);
  492. { uint64_t x26 = (x7 * 0x13);
  493. { uint64_t x27 = (x9 * 0x13);
  494. { uint64_t x28 = (x11 * 0x13);
  495. { uint128_t x29 = ((((x20 + ((uint128_t)x25 * x15)) + ((uint128_t)x26 * x18)) + ((uint128_t)x27 * x19)) + ((uint128_t)x28 * x17));
  496. { uint128_t x30 = (((x21 + ((uint128_t)x25 * x17)) + ((uint128_t)x27 * x18)) + ((uint128_t)x28 * x19));
  497. { uint128_t x31 = ((x22 + ((uint128_t)x25 * x19)) + ((uint128_t)x28 * x18));
  498. { uint128_t x32 = (x23 + ((uint128_t)x25 * x18));
  499. { uint64_t x33 = (uint64_t) (x29 >> 0x33);
  500. { uint64_t x34 = ((uint64_t)x29 & 0x7ffffffffffff);
  501. { uint128_t x35 = (x33 + x30);
  502. { uint64_t x36 = (uint64_t) (x35 >> 0x33);
  503. { uint64_t x37 = ((uint64_t)x35 & 0x7ffffffffffff);
  504. { uint128_t x38 = (x36 + x31);
  505. { uint64_t x39 = (uint64_t) (x38 >> 0x33);
  506. { uint64_t x40 = ((uint64_t)x38 & 0x7ffffffffffff);
  507. { uint128_t x41 = (x39 + x32);
  508. { uint64_t x42 = (uint64_t) (x41 >> 0x33);
  509. { uint64_t x43 = ((uint64_t)x41 & 0x7ffffffffffff);
  510. { uint128_t x44 = (x42 + x24);
  511. { uint64_t x45 = (uint64_t) (x44 >> 0x33);
  512. { uint64_t x46 = ((uint64_t)x44 & 0x7ffffffffffff);
  513. { uint64_t x47 = (x34 + (0x13 * x45));
  514. { uint64_t x48 = (x47 >> 0x33);
  515. { uint64_t x49 = (x47 & 0x7ffffffffffff);
  516. { uint64_t x50 = (x48 + x37);
  517. { uint64_t x51 = (x50 >> 0x33);
  518. { uint64_t x52 = (x50 & 0x7ffffffffffff);
  519. out[0] = x49;
  520. out[1] = x52;
  521. out[2] = (x51 + x40);
  522. out[3] = x43;
  523. out[4] = x46;
  524. }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
  525. }
  526. static void fe_mul121666(fe *h, const fe_loose *f) {
  527. assert_fe_loose(f->v);
  528. fe_mul_121666_impl(h->v, f->v);
  529. assert_fe(h->v);
  530. }
  531. // Adapted from Fiat-synthesized |fe_sub_impl| with |out| = 0.
  532. static void fe_neg_impl(uint64_t out[5], const uint64_t in2[5]) {
  533. { const uint64_t x10 = 0;
  534. { const uint64_t x11 = 0;
  535. { const uint64_t x9 = 0;
  536. { const uint64_t x7 = 0;
  537. { const uint64_t x5 = 0;
  538. { const uint64_t x18 = in2[4];
  539. { const uint64_t x19 = in2[3];
  540. { const uint64_t x17 = in2[2];
  541. { const uint64_t x15 = in2[1];
  542. { const uint64_t x13 = in2[0];
  543. out[0] = ((0xfffffffffffda + x5) - x13);
  544. out[1] = ((0xffffffffffffe + x7) - x15);
  545. out[2] = ((0xffffffffffffe + x9) - x17);
  546. out[3] = ((0xffffffffffffe + x11) - x19);
  547. out[4] = ((0xffffffffffffe + x10) - x18);
  548. }}}}}}}}}}
  549. }
  550. // h = -f
  551. static void fe_neg(fe_loose *h, const fe *f) {
  552. assert_fe(f->v);
  553. fe_neg_impl(h->v, f->v);
  554. assert_fe_loose(h->v);
  555. }
  556. // Replace (f,g) with (g,g) if b == 1;
  557. // replace (f,g) with (f,g) if b == 0.
  558. //
  559. // Preconditions: b in {0,1}.
  560. static void fe_cmov(fe_loose *f, const fe_loose *g, uint64_t b) {
  561. b = 0-b;
  562. for (unsigned i = 0; i < 5; i++) {
  563. uint64_t x = f->v[i] ^ g->v[i];
  564. x &= b;
  565. f->v[i] ^= x;
  566. }
  567. }
  568. #else
  569. #define assert_fe(f) do { \
  570. for (unsigned _assert_fe_i = 0; _assert_fe_i< 10; _assert_fe_i++) { \
  571. assert(f[_assert_fe_i] < 1.125*(1<<(26-(_assert_fe_i&1)))); \
  572. } \
  573. } while (0)
  574. #define assert_fe_loose(f) do { \
  575. for (unsigned _assert_fe_i = 0; _assert_fe_i< 10; _assert_fe_i++) { \
  576. assert(f[_assert_fe_i] < 3.375*(1<<(26-(_assert_fe_i&1)))); \
  577. } \
  578. } while (0)
  579. #define assert_fe_frozen(f) do { \
  580. for (unsigned _assert_fe_i = 0; _assert_fe_i< 10; _assert_fe_i++) { \
  581. assert(f[_assert_fe_i] < (1u<<(26-(_assert_fe_i&1)))); \
  582. } \
  583. } while (0)
  584. static void fe_frombytes_impl(uint32_t h[10], const uint8_t *s) {
  585. // Ignores top bit of s.
  586. uint32_t a0 = load_4(s);
  587. uint32_t a1 = load_4(s+4);
  588. uint32_t a2 = load_4(s+8);
  589. uint32_t a3 = load_4(s+12);
  590. uint32_t a4 = load_4(s+16);
  591. uint32_t a5 = load_4(s+20);
  592. uint32_t a6 = load_4(s+24);
  593. uint32_t a7 = load_4(s+28);
  594. h[0] = a0&((1<<26)-1); // 26 used, 32-26 left. 26
  595. h[1] = (a0>>26) | ((a1&((1<<19)-1))<< 6); // (32-26) + 19 = 6+19 = 25
  596. h[2] = (a1>>19) | ((a2&((1<<13)-1))<<13); // (32-19) + 13 = 13+13 = 26
  597. h[3] = (a2>>13) | ((a3&((1<< 6)-1))<<19); // (32-13) + 6 = 19+ 6 = 25
  598. h[4] = (a3>> 6); // (32- 6) = 26
  599. h[5] = a4&((1<<25)-1); // 25
  600. h[6] = (a4>>25) | ((a5&((1<<19)-1))<< 7); // (32-25) + 19 = 7+19 = 26
  601. h[7] = (a5>>19) | ((a6&((1<<12)-1))<<13); // (32-19) + 12 = 13+12 = 25
  602. h[8] = (a6>>12) | ((a7&((1<< 6)-1))<<20); // (32-12) + 6 = 20+ 6 = 26
  603. h[9] = (a7>> 6)&((1<<25)-1); // 25
  604. assert_fe(h);
  605. }
  606. static void fe_frombytes(fe *h, const uint8_t *s) {
  607. fe_frombytes_impl(h->v, s);
  608. }
  609. static void fe_freeze(uint32_t out[10], const uint32_t in1[10]) {
  610. { const uint32_t x17 = in1[9];
  611. { const uint32_t x18 = in1[8];
  612. { const uint32_t x16 = in1[7];
  613. { const uint32_t x14 = in1[6];
  614. { const uint32_t x12 = in1[5];
  615. { const uint32_t x10 = in1[4];
  616. { const uint32_t x8 = in1[3];
  617. { const uint32_t x6 = in1[2];
  618. { const uint32_t x4 = in1[1];
  619. { const uint32_t x2 = in1[0];
  620. { uint32_t x20; uint8_t/*bool*/ x21 = subborrow_u26(0x0, x2, 0x3ffffed, &x20);
  621. { uint32_t x23; uint8_t/*bool*/ x24 = subborrow_u25(x21, x4, 0x1ffffff, &x23);
  622. { uint32_t x26; uint8_t/*bool*/ x27 = subborrow_u26(x24, x6, 0x3ffffff, &x26);
  623. { uint32_t x29; uint8_t/*bool*/ x30 = subborrow_u25(x27, x8, 0x1ffffff, &x29);
  624. { uint32_t x32; uint8_t/*bool*/ x33 = subborrow_u26(x30, x10, 0x3ffffff, &x32);
  625. { uint32_t x35; uint8_t/*bool*/ x36 = subborrow_u25(x33, x12, 0x1ffffff, &x35);
  626. { uint32_t x38; uint8_t/*bool*/ x39 = subborrow_u26(x36, x14, 0x3ffffff, &x38);
  627. { uint32_t x41; uint8_t/*bool*/ x42 = subborrow_u25(x39, x16, 0x1ffffff, &x41);
  628. { uint32_t x44; uint8_t/*bool*/ x45 = subborrow_u26(x42, x18, 0x3ffffff, &x44);
  629. { uint32_t x47; uint8_t/*bool*/ x48 = subborrow_u25(x45, x17, 0x1ffffff, &x47);
  630. { uint32_t x49 = cmovznz32(x48, 0x0, 0xffffffff);
  631. { uint32_t x50 = (x49 & 0x3ffffed);
  632. { uint32_t x52; uint8_t/*bool*/ x53 = addcarryx_u26(0x0, x20, x50, &x52);
  633. { uint32_t x54 = (x49 & 0x1ffffff);
  634. { uint32_t x56; uint8_t/*bool*/ x57 = addcarryx_u25(x53, x23, x54, &x56);
  635. { uint32_t x58 = (x49 & 0x3ffffff);
  636. { uint32_t x60; uint8_t/*bool*/ x61 = addcarryx_u26(x57, x26, x58, &x60);
  637. { uint32_t x62 = (x49 & 0x1ffffff);
  638. { uint32_t x64; uint8_t/*bool*/ x65 = addcarryx_u25(x61, x29, x62, &x64);
  639. { uint32_t x66 = (x49 & 0x3ffffff);
  640. { uint32_t x68; uint8_t/*bool*/ x69 = addcarryx_u26(x65, x32, x66, &x68);
  641. { uint32_t x70 = (x49 & 0x1ffffff);
  642. { uint32_t x72; uint8_t/*bool*/ x73 = addcarryx_u25(x69, x35, x70, &x72);
  643. { uint32_t x74 = (x49 & 0x3ffffff);
  644. { uint32_t x76; uint8_t/*bool*/ x77 = addcarryx_u26(x73, x38, x74, &x76);
  645. { uint32_t x78 = (x49 & 0x1ffffff);
  646. { uint32_t x80; uint8_t/*bool*/ x81 = addcarryx_u25(x77, x41, x78, &x80);
  647. { uint32_t x82 = (x49 & 0x3ffffff);
  648. { uint32_t x84; uint8_t/*bool*/ x85 = addcarryx_u26(x81, x44, x82, &x84);
  649. { uint32_t x86 = (x49 & 0x1ffffff);
  650. { uint32_t x88; addcarryx_u25(x85, x47, x86, &x88);
  651. out[0] = x52;
  652. out[1] = x56;
  653. out[2] = x60;
  654. out[3] = x64;
  655. out[4] = x68;
  656. out[5] = x72;
  657. out[6] = x76;
  658. out[7] = x80;
  659. out[8] = x84;
  660. out[9] = x88;
  661. }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
  662. }
  663. static void fe_tobytes(uint8_t s[32], const fe *f) {
  664. assert_fe(f->v);
  665. uint32_t h[10];
  666. fe_freeze(h, f->v);
  667. assert_fe_frozen(h);
  668. s[0] = h[0] >> 0;
  669. s[1] = h[0] >> 8;
  670. s[2] = h[0] >> 16;
  671. s[3] = (h[0] >> 24) | (h[1] << 2);
  672. s[4] = h[1] >> 6;
  673. s[5] = h[1] >> 14;
  674. s[6] = (h[1] >> 22) | (h[2] << 3);
  675. s[7] = h[2] >> 5;
  676. s[8] = h[2] >> 13;
  677. s[9] = (h[2] >> 21) | (h[3] << 5);
  678. s[10] = h[3] >> 3;
  679. s[11] = h[3] >> 11;
  680. s[12] = (h[3] >> 19) | (h[4] << 6);
  681. s[13] = h[4] >> 2;
  682. s[14] = h[4] >> 10;
  683. s[15] = h[4] >> 18;
  684. s[16] = h[5] >> 0;
  685. s[17] = h[5] >> 8;
  686. s[18] = h[5] >> 16;
  687. s[19] = (h[5] >> 24) | (h[6] << 1);
  688. s[20] = h[6] >> 7;
  689. s[21] = h[6] >> 15;
  690. s[22] = (h[6] >> 23) | (h[7] << 3);
  691. s[23] = h[7] >> 5;
  692. s[24] = h[7] >> 13;
  693. s[25] = (h[7] >> 21) | (h[8] << 4);
  694. s[26] = h[8] >> 4;
  695. s[27] = h[8] >> 12;
  696. s[28] = (h[8] >> 20) | (h[9] << 6);
  697. s[29] = h[9] >> 2;
  698. s[30] = h[9] >> 10;
  699. s[31] = h[9] >> 18;
  700. }
  701. // h = 0
  702. static void fe_0(fe *h) {
  703. OPENSSL_memset(h, 0, sizeof(fe));
  704. }
  705. static void fe_loose_0(fe_loose *h) {
  706. OPENSSL_memset(h, 0, sizeof(fe_loose));
  707. }
  708. // h = 1
  709. static void fe_1(fe *h) {
  710. OPENSSL_memset(h, 0, sizeof(fe));
  711. h->v[0] = 1;
  712. }
  713. static void fe_loose_1(fe_loose *h) {
  714. OPENSSL_memset(h, 0, sizeof(fe_loose));
  715. h->v[0] = 1;
  716. }
  717. static void fe_add_impl(uint32_t out[10], const uint32_t in1[10], const uint32_t in2[10]) {
  718. { const uint32_t x20 = in1[9];
  719. { const uint32_t x21 = in1[8];
  720. { const uint32_t x19 = in1[7];
  721. { const uint32_t x17 = in1[6];
  722. { const uint32_t x15 = in1[5];
  723. { const uint32_t x13 = in1[4];
  724. { const uint32_t x11 = in1[3];
  725. { const uint32_t x9 = in1[2];
  726. { const uint32_t x7 = in1[1];
  727. { const uint32_t x5 = in1[0];
  728. { const uint32_t x38 = in2[9];
  729. { const uint32_t x39 = in2[8];
  730. { const uint32_t x37 = in2[7];
  731. { const uint32_t x35 = in2[6];
  732. { const uint32_t x33 = in2[5];
  733. { const uint32_t x31 = in2[4];
  734. { const uint32_t x29 = in2[3];
  735. { const uint32_t x27 = in2[2];
  736. { const uint32_t x25 = in2[1];
  737. { const uint32_t x23 = in2[0];
  738. out[0] = (x5 + x23);
  739. out[1] = (x7 + x25);
  740. out[2] = (x9 + x27);
  741. out[3] = (x11 + x29);
  742. out[4] = (x13 + x31);
  743. out[5] = (x15 + x33);
  744. out[6] = (x17 + x35);
  745. out[7] = (x19 + x37);
  746. out[8] = (x21 + x39);
  747. out[9] = (x20 + x38);
  748. }}}}}}}}}}}}}}}}}}}}
  749. }
  750. // h = f + g
  751. // Can overlap h with f or g.
  752. static void fe_add(fe_loose *h, const fe *f, const fe *g) {
  753. assert_fe(f->v);
  754. assert_fe(g->v);
  755. fe_add_impl(h->v, f->v, g->v);
  756. assert_fe_loose(h->v);
  757. }
  758. static void fe_sub_impl(uint32_t out[10], const uint32_t in1[10], const uint32_t in2[10]) {
  759. { const uint32_t x20 = in1[9];
  760. { const uint32_t x21 = in1[8];
  761. { const uint32_t x19 = in1[7];
  762. { const uint32_t x17 = in1[6];
  763. { const uint32_t x15 = in1[5];
  764. { const uint32_t x13 = in1[4];
  765. { const uint32_t x11 = in1[3];
  766. { const uint32_t x9 = in1[2];
  767. { const uint32_t x7 = in1[1];
  768. { const uint32_t x5 = in1[0];
  769. { const uint32_t x38 = in2[9];
  770. { const uint32_t x39 = in2[8];
  771. { const uint32_t x37 = in2[7];
  772. { const uint32_t x35 = in2[6];
  773. { const uint32_t x33 = in2[5];
  774. { const uint32_t x31 = in2[4];
  775. { const uint32_t x29 = in2[3];
  776. { const uint32_t x27 = in2[2];
  777. { const uint32_t x25 = in2[1];
  778. { const uint32_t x23 = in2[0];
  779. out[0] = ((0x7ffffda + x5) - x23);
  780. out[1] = ((0x3fffffe + x7) - x25);
  781. out[2] = ((0x7fffffe + x9) - x27);
  782. out[3] = ((0x3fffffe + x11) - x29);
  783. out[4] = ((0x7fffffe + x13) - x31);
  784. out[5] = ((0x3fffffe + x15) - x33);
  785. out[6] = ((0x7fffffe + x17) - x35);
  786. out[7] = ((0x3fffffe + x19) - x37);
  787. out[8] = ((0x7fffffe + x21) - x39);
  788. out[9] = ((0x3fffffe + x20) - x38);
  789. }}}}}}}}}}}}}}}}}}}}
  790. }
  791. // h = f - g
  792. // Can overlap h with f or g.
  793. static void fe_sub(fe_loose *h, const fe *f, const fe *g) {
  794. assert_fe(f->v);
  795. assert_fe(g->v);
  796. fe_sub_impl(h->v, f->v, g->v);
  797. assert_fe_loose(h->v);
  798. }
  799. static void fe_carry_impl(uint32_t out[10], const uint32_t in1[10]) {
  800. { const uint32_t x17 = in1[9];
  801. { const uint32_t x18 = in1[8];
  802. { const uint32_t x16 = in1[7];
  803. { const uint32_t x14 = in1[6];
  804. { const uint32_t x12 = in1[5];
  805. { const uint32_t x10 = in1[4];
  806. { const uint32_t x8 = in1[3];
  807. { const uint32_t x6 = in1[2];
  808. { const uint32_t x4 = in1[1];
  809. { const uint32_t x2 = in1[0];
  810. { uint32_t x19 = (x2 >> 0x1a);
  811. { uint32_t x20 = (x2 & 0x3ffffff);
  812. { uint32_t x21 = (x19 + x4);
  813. { uint32_t x22 = (x21 >> 0x19);
  814. { uint32_t x23 = (x21 & 0x1ffffff);
  815. { uint32_t x24 = (x22 + x6);
  816. { uint32_t x25 = (x24 >> 0x1a);
  817. { uint32_t x26 = (x24 & 0x3ffffff);
  818. { uint32_t x27 = (x25 + x8);
  819. { uint32_t x28 = (x27 >> 0x19);
  820. { uint32_t x29 = (x27 & 0x1ffffff);
  821. { uint32_t x30 = (x28 + x10);
  822. { uint32_t x31 = (x30 >> 0x1a);
  823. { uint32_t x32 = (x30 & 0x3ffffff);
  824. { uint32_t x33 = (x31 + x12);
  825. { uint32_t x34 = (x33 >> 0x19);
  826. { uint32_t x35 = (x33 & 0x1ffffff);
  827. { uint32_t x36 = (x34 + x14);
  828. { uint32_t x37 = (x36 >> 0x1a);
  829. { uint32_t x38 = (x36 & 0x3ffffff);
  830. { uint32_t x39 = (x37 + x16);
  831. { uint32_t x40 = (x39 >> 0x19);
  832. { uint32_t x41 = (x39 & 0x1ffffff);
  833. { uint32_t x42 = (x40 + x18);
  834. { uint32_t x43 = (x42 >> 0x1a);
  835. { uint32_t x44 = (x42 & 0x3ffffff);
  836. { uint32_t x45 = (x43 + x17);
  837. { uint32_t x46 = (x45 >> 0x19);
  838. { uint32_t x47 = (x45 & 0x1ffffff);
  839. { uint32_t x48 = (x20 + (0x13 * x46));
  840. { uint32_t x49 = (x48 >> 0x1a);
  841. { uint32_t x50 = (x48 & 0x3ffffff);
  842. { uint32_t x51 = (x49 + x23);
  843. { uint32_t x52 = (x51 >> 0x19);
  844. { uint32_t x53 = (x51 & 0x1ffffff);
  845. out[0] = x50;
  846. out[1] = x53;
  847. out[2] = (x52 + x26);
  848. out[3] = x29;
  849. out[4] = x32;
  850. out[5] = x35;
  851. out[6] = x38;
  852. out[7] = x41;
  853. out[8] = x44;
  854. out[9] = x47;
  855. }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
  856. }
  857. static void fe_carry(fe *h, const fe_loose* f) {
  858. assert_fe_loose(f->v);
  859. fe_carry_impl(h->v, f->v);
  860. assert_fe(h->v);
  861. }
  862. static void fe_mul_impl(uint32_t out[10], const uint32_t in1[10], const uint32_t in2[10]) {
  863. assert_fe_loose(in1);
  864. assert_fe_loose(in2);
  865. { const uint32_t x20 = in1[9];
  866. { const uint32_t x21 = in1[8];
  867. { const uint32_t x19 = in1[7];
  868. { const uint32_t x17 = in1[6];
  869. { const uint32_t x15 = in1[5];
  870. { const uint32_t x13 = in1[4];
  871. { const uint32_t x11 = in1[3];
  872. { const uint32_t x9 = in1[2];
  873. { const uint32_t x7 = in1[1];
  874. { const uint32_t x5 = in1[0];
  875. { const uint32_t x38 = in2[9];
  876. { const uint32_t x39 = in2[8];
  877. { const uint32_t x37 = in2[7];
  878. { const uint32_t x35 = in2[6];
  879. { const uint32_t x33 = in2[5];
  880. { const uint32_t x31 = in2[4];
  881. { const uint32_t x29 = in2[3];
  882. { const uint32_t x27 = in2[2];
  883. { const uint32_t x25 = in2[1];
  884. { const uint32_t x23 = in2[0];
  885. { uint64_t x40 = ((uint64_t)x23 * x5);
  886. { uint64_t x41 = (((uint64_t)x23 * x7) + ((uint64_t)x25 * x5));
  887. { uint64_t x42 = ((((uint64_t)(0x2 * x25) * x7) + ((uint64_t)x23 * x9)) + ((uint64_t)x27 * x5));
  888. { uint64_t x43 = (((((uint64_t)x25 * x9) + ((uint64_t)x27 * x7)) + ((uint64_t)x23 * x11)) + ((uint64_t)x29 * x5));
  889. { uint64_t x44 = (((((uint64_t)x27 * x9) + (0x2 * (((uint64_t)x25 * x11) + ((uint64_t)x29 * x7)))) + ((uint64_t)x23 * x13)) + ((uint64_t)x31 * x5));
  890. { uint64_t x45 = (((((((uint64_t)x27 * x11) + ((uint64_t)x29 * x9)) + ((uint64_t)x25 * x13)) + ((uint64_t)x31 * x7)) + ((uint64_t)x23 * x15)) + ((uint64_t)x33 * x5));
  891. { uint64_t x46 = (((((0x2 * ((((uint64_t)x29 * x11) + ((uint64_t)x25 * x15)) + ((uint64_t)x33 * x7))) + ((uint64_t)x27 * x13)) + ((uint64_t)x31 * x9)) + ((uint64_t)x23 * x17)) + ((uint64_t)x35 * x5));
  892. { uint64_t x47 = (((((((((uint64_t)x29 * x13) + ((uint64_t)x31 * x11)) + ((uint64_t)x27 * x15)) + ((uint64_t)x33 * x9)) + ((uint64_t)x25 * x17)) + ((uint64_t)x35 * x7)) + ((uint64_t)x23 * x19)) + ((uint64_t)x37 * x5));
  893. { uint64_t x48 = (((((((uint64_t)x31 * x13) + (0x2 * (((((uint64_t)x29 * x15) + ((uint64_t)x33 * x11)) + ((uint64_t)x25 * x19)) + ((uint64_t)x37 * x7)))) + ((uint64_t)x27 * x17)) + ((uint64_t)x35 * x9)) + ((uint64_t)x23 * x21)) + ((uint64_t)x39 * x5));
  894. { uint64_t x49 = (((((((((((uint64_t)x31 * x15) + ((uint64_t)x33 * x13)) + ((uint64_t)x29 * x17)) + ((uint64_t)x35 * x11)) + ((uint64_t)x27 * x19)) + ((uint64_t)x37 * x9)) + ((uint64_t)x25 * x21)) + ((uint64_t)x39 * x7)) + ((uint64_t)x23 * x20)) + ((uint64_t)x38 * x5));
  895. { uint64_t x50 = (((((0x2 * ((((((uint64_t)x33 * x15) + ((uint64_t)x29 * x19)) + ((uint64_t)x37 * x11)) + ((uint64_t)x25 * x20)) + ((uint64_t)x38 * x7))) + ((uint64_t)x31 * x17)) + ((uint64_t)x35 * x13)) + ((uint64_t)x27 * x21)) + ((uint64_t)x39 * x9));
  896. { uint64_t x51 = (((((((((uint64_t)x33 * x17) + ((uint64_t)x35 * x15)) + ((uint64_t)x31 * x19)) + ((uint64_t)x37 * x13)) + ((uint64_t)x29 * x21)) + ((uint64_t)x39 * x11)) + ((uint64_t)x27 * x20)) + ((uint64_t)x38 * x9));
  897. { uint64_t x52 = (((((uint64_t)x35 * x17) + (0x2 * (((((uint64_t)x33 * x19) + ((uint64_t)x37 * x15)) + ((uint64_t)x29 * x20)) + ((uint64_t)x38 * x11)))) + ((uint64_t)x31 * x21)) + ((uint64_t)x39 * x13));
  898. { uint64_t x53 = (((((((uint64_t)x35 * x19) + ((uint64_t)x37 * x17)) + ((uint64_t)x33 * x21)) + ((uint64_t)x39 * x15)) + ((uint64_t)x31 * x20)) + ((uint64_t)x38 * x13));
  899. { uint64_t x54 = (((0x2 * ((((uint64_t)x37 * x19) + ((uint64_t)x33 * x20)) + ((uint64_t)x38 * x15))) + ((uint64_t)x35 * x21)) + ((uint64_t)x39 * x17));
  900. { uint64_t x55 = (((((uint64_t)x37 * x21) + ((uint64_t)x39 * x19)) + ((uint64_t)x35 * x20)) + ((uint64_t)x38 * x17));
  901. { uint64_t x56 = (((uint64_t)x39 * x21) + (0x2 * (((uint64_t)x37 * x20) + ((uint64_t)x38 * x19))));
  902. { uint64_t x57 = (((uint64_t)x39 * x20) + ((uint64_t)x38 * x21));
  903. { uint64_t x58 = ((uint64_t)(0x2 * x38) * x20);
  904. { uint64_t x59 = (x48 + (x58 << 0x4));
  905. { uint64_t x60 = (x59 + (x58 << 0x1));
  906. { uint64_t x61 = (x60 + x58);
  907. { uint64_t x62 = (x47 + (x57 << 0x4));
  908. { uint64_t x63 = (x62 + (x57 << 0x1));
  909. { uint64_t x64 = (x63 + x57);
  910. { uint64_t x65 = (x46 + (x56 << 0x4));
  911. { uint64_t x66 = (x65 + (x56 << 0x1));
  912. { uint64_t x67 = (x66 + x56);
  913. { uint64_t x68 = (x45 + (x55 << 0x4));
  914. { uint64_t x69 = (x68 + (x55 << 0x1));
  915. { uint64_t x70 = (x69 + x55);
  916. { uint64_t x71 = (x44 + (x54 << 0x4));
  917. { uint64_t x72 = (x71 + (x54 << 0x1));
  918. { uint64_t x73 = (x72 + x54);
  919. { uint64_t x74 = (x43 + (x53 << 0x4));
  920. { uint64_t x75 = (x74 + (x53 << 0x1));
  921. { uint64_t x76 = (x75 + x53);
  922. { uint64_t x77 = (x42 + (x52 << 0x4));
  923. { uint64_t x78 = (x77 + (x52 << 0x1));
  924. { uint64_t x79 = (x78 + x52);
  925. { uint64_t x80 = (x41 + (x51 << 0x4));
  926. { uint64_t x81 = (x80 + (x51 << 0x1));
  927. { uint64_t x82 = (x81 + x51);
  928. { uint64_t x83 = (x40 + (x50 << 0x4));
  929. { uint64_t x84 = (x83 + (x50 << 0x1));
  930. { uint64_t x85 = (x84 + x50);
  931. { uint64_t x86 = (x85 >> 0x1a);
  932. { uint32_t x87 = ((uint32_t)x85 & 0x3ffffff);
  933. { uint64_t x88 = (x86 + x82);
  934. { uint64_t x89 = (x88 >> 0x19);
  935. { uint32_t x90 = ((uint32_t)x88 & 0x1ffffff);
  936. { uint64_t x91 = (x89 + x79);
  937. { uint64_t x92 = (x91 >> 0x1a);
  938. { uint32_t x93 = ((uint32_t)x91 & 0x3ffffff);
  939. { uint64_t x94 = (x92 + x76);
  940. { uint64_t x95 = (x94 >> 0x19);
  941. { uint32_t x96 = ((uint32_t)x94 & 0x1ffffff);
  942. { uint64_t x97 = (x95 + x73);
  943. { uint64_t x98 = (x97 >> 0x1a);
  944. { uint32_t x99 = ((uint32_t)x97 & 0x3ffffff);
  945. { uint64_t x100 = (x98 + x70);
  946. { uint64_t x101 = (x100 >> 0x19);
  947. { uint32_t x102 = ((uint32_t)x100 & 0x1ffffff);
  948. { uint64_t x103 = (x101 + x67);
  949. { uint64_t x104 = (x103 >> 0x1a);
  950. { uint32_t x105 = ((uint32_t)x103 & 0x3ffffff);
  951. { uint64_t x106 = (x104 + x64);
  952. { uint64_t x107 = (x106 >> 0x19);
  953. { uint32_t x108 = ((uint32_t)x106 & 0x1ffffff);
  954. { uint64_t x109 = (x107 + x61);
  955. { uint64_t x110 = (x109 >> 0x1a);
  956. { uint32_t x111 = ((uint32_t)x109 & 0x3ffffff);
  957. { uint64_t x112 = (x110 + x49);
  958. { uint64_t x113 = (x112 >> 0x19);
  959. { uint32_t x114 = ((uint32_t)x112 & 0x1ffffff);
  960. { uint64_t x115 = (x87 + (0x13 * x113));
  961. { uint32_t x116 = (uint32_t) (x115 >> 0x1a);
  962. { uint32_t x117 = ((uint32_t)x115 & 0x3ffffff);
  963. { uint32_t x118 = (x116 + x90);
  964. { uint32_t x119 = (x118 >> 0x19);
  965. { uint32_t x120 = (x118 & 0x1ffffff);
  966. out[0] = x117;
  967. out[1] = x120;
  968. out[2] = (x119 + x93);
  969. out[3] = x96;
  970. out[4] = x99;
  971. out[5] = x102;
  972. out[6] = x105;
  973. out[7] = x108;
  974. out[8] = x111;
  975. out[9] = x114;
  976. }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
  977. assert_fe(out);
  978. }
  979. static void fe_mul_ltt(fe_loose *h, const fe *f, const fe *g) {
  980. fe_mul_impl(h->v, f->v, g->v);
  981. }
  982. static void fe_mul_llt(fe_loose *h, const fe_loose *f, const fe *g) {
  983. fe_mul_impl(h->v, f->v, g->v);
  984. }
  985. static void fe_mul_ttt(fe *h, const fe *f, const fe *g) {
  986. fe_mul_impl(h->v, f->v, g->v);
  987. }
  988. static void fe_mul_tlt(fe *h, const fe_loose *f, const fe *g) {
  989. fe_mul_impl(h->v, f->v, g->v);
  990. }
  991. static void fe_mul_ttl(fe *h, const fe *f, const fe_loose *g) {
  992. fe_mul_impl(h->v, f->v, g->v);
  993. }
  994. static void fe_mul_tll(fe *h, const fe_loose *f, const fe_loose *g) {
  995. fe_mul_impl(h->v, f->v, g->v);
  996. }
  997. static void fe_sqr_impl(uint32_t out[10], const uint32_t in1[10]) {
  998. assert_fe_loose(in1);
  999. { const uint32_t x17 = in1[9];
  1000. { const uint32_t x18 = in1[8];
  1001. { const uint32_t x16 = in1[7];
  1002. { const uint32_t x14 = in1[6];
  1003. { const uint32_t x12 = in1[5];
  1004. { const uint32_t x10 = in1[4];
  1005. { const uint32_t x8 = in1[3];
  1006. { const uint32_t x6 = in1[2];
  1007. { const uint32_t x4 = in1[1];
  1008. { const uint32_t x2 = in1[0];
  1009. { uint64_t x19 = ((uint64_t)x2 * x2);
  1010. { uint64_t x20 = ((uint64_t)(0x2 * x2) * x4);
  1011. { uint64_t x21 = (0x2 * (((uint64_t)x4 * x4) + ((uint64_t)x2 * x6)));
  1012. { uint64_t x22 = (0x2 * (((uint64_t)x4 * x6) + ((uint64_t)x2 * x8)));
  1013. { uint64_t x23 = ((((uint64_t)x6 * x6) + ((uint64_t)(0x4 * x4) * x8)) + ((uint64_t)(0x2 * x2) * x10));
  1014. { uint64_t x24 = (0x2 * ((((uint64_t)x6 * x8) + ((uint64_t)x4 * x10)) + ((uint64_t)x2 * x12)));
  1015. { uint64_t x25 = (0x2 * (((((uint64_t)x8 * x8) + ((uint64_t)x6 * x10)) + ((uint64_t)x2 * x14)) + ((uint64_t)(0x2 * x4) * x12)));
  1016. { uint64_t x26 = (0x2 * (((((uint64_t)x8 * x10) + ((uint64_t)x6 * x12)) + ((uint64_t)x4 * x14)) + ((uint64_t)x2 * x16)));
  1017. { uint64_t x27 = (((uint64_t)x10 * x10) + (0x2 * ((((uint64_t)x6 * x14) + ((uint64_t)x2 * x18)) + (0x2 * (((uint64_t)x4 * x16) + ((uint64_t)x8 * x12))))));
  1018. { uint64_t x28 = (0x2 * ((((((uint64_t)x10 * x12) + ((uint64_t)x8 * x14)) + ((uint64_t)x6 * x16)) + ((uint64_t)x4 * x18)) + ((uint64_t)x2 * x17)));
  1019. { uint64_t x29 = (0x2 * (((((uint64_t)x12 * x12) + ((uint64_t)x10 * x14)) + ((uint64_t)x6 * x18)) + (0x2 * (((uint64_t)x8 * x16) + ((uint64_t)x4 * x17)))));
  1020. { uint64_t x30 = (0x2 * (((((uint64_t)x12 * x14) + ((uint64_t)x10 * x16)) + ((uint64_t)x8 * x18)) + ((uint64_t)x6 * x17)));
  1021. { uint64_t x31 = (((uint64_t)x14 * x14) + (0x2 * (((uint64_t)x10 * x18) + (0x2 * (((uint64_t)x12 * x16) + ((uint64_t)x8 * x17))))));
  1022. { uint64_t x32 = (0x2 * ((((uint64_t)x14 * x16) + ((uint64_t)x12 * x18)) + ((uint64_t)x10 * x17)));
  1023. { uint64_t x33 = (0x2 * ((((uint64_t)x16 * x16) + ((uint64_t)x14 * x18)) + ((uint64_t)(0x2 * x12) * x17)));
  1024. { uint64_t x34 = (0x2 * (((uint64_t)x16 * x18) + ((uint64_t)x14 * x17)));
  1025. { uint64_t x35 = (((uint64_t)x18 * x18) + ((uint64_t)(0x4 * x16) * x17));
  1026. { uint64_t x36 = ((uint64_t)(0x2 * x18) * x17);
  1027. { uint64_t x37 = ((uint64_t)(0x2 * x17) * x17);
  1028. { uint64_t x38 = (x27 + (x37 << 0x4));
  1029. { uint64_t x39 = (x38 + (x37 << 0x1));
  1030. { uint64_t x40 = (x39 + x37);
  1031. { uint64_t x41 = (x26 + (x36 << 0x4));
  1032. { uint64_t x42 = (x41 + (x36 << 0x1));
  1033. { uint64_t x43 = (x42 + x36);
  1034. { uint64_t x44 = (x25 + (x35 << 0x4));
  1035. { uint64_t x45 = (x44 + (x35 << 0x1));
  1036. { uint64_t x46 = (x45 + x35);
  1037. { uint64_t x47 = (x24 + (x34 << 0x4));
  1038. { uint64_t x48 = (x47 + (x34 << 0x1));
  1039. { uint64_t x49 = (x48 + x34);
  1040. { uint64_t x50 = (x23 + (x33 << 0x4));
  1041. { uint64_t x51 = (x50 + (x33 << 0x1));
  1042. { uint64_t x52 = (x51 + x33);
  1043. { uint64_t x53 = (x22 + (x32 << 0x4));
  1044. { uint64_t x54 = (x53 + (x32 << 0x1));
  1045. { uint64_t x55 = (x54 + x32);
  1046. { uint64_t x56 = (x21 + (x31 << 0x4));
  1047. { uint64_t x57 = (x56 + (x31 << 0x1));
  1048. { uint64_t x58 = (x57 + x31);
  1049. { uint64_t x59 = (x20 + (x30 << 0x4));
  1050. { uint64_t x60 = (x59 + (x30 << 0x1));
  1051. { uint64_t x61 = (x60 + x30);
  1052. { uint64_t x62 = (x19 + (x29 << 0x4));
  1053. { uint64_t x63 = (x62 + (x29 << 0x1));
  1054. { uint64_t x64 = (x63 + x29);
  1055. { uint64_t x65 = (x64 >> 0x1a);
  1056. { uint32_t x66 = ((uint32_t)x64 & 0x3ffffff);
  1057. { uint64_t x67 = (x65 + x61);
  1058. { uint64_t x68 = (x67 >> 0x19);
  1059. { uint32_t x69 = ((uint32_t)x67 & 0x1ffffff);
  1060. { uint64_t x70 = (x68 + x58);
  1061. { uint64_t x71 = (x70 >> 0x1a);
  1062. { uint32_t x72 = ((uint32_t)x70 & 0x3ffffff);
  1063. { uint64_t x73 = (x71 + x55);
  1064. { uint64_t x74 = (x73 >> 0x19);
  1065. { uint32_t x75 = ((uint32_t)x73 & 0x1ffffff);
  1066. { uint64_t x76 = (x74 + x52);
  1067. { uint64_t x77 = (x76 >> 0x1a);
  1068. { uint32_t x78 = ((uint32_t)x76 & 0x3ffffff);
  1069. { uint64_t x79 = (x77 + x49);
  1070. { uint64_t x80 = (x79 >> 0x19);
  1071. { uint32_t x81 = ((uint32_t)x79 & 0x1ffffff);
  1072. { uint64_t x82 = (x80 + x46);
  1073. { uint64_t x83 = (x82 >> 0x1a);
  1074. { uint32_t x84 = ((uint32_t)x82 & 0x3ffffff);
  1075. { uint64_t x85 = (x83 + x43);
  1076. { uint64_t x86 = (x85 >> 0x19);
  1077. { uint32_t x87 = ((uint32_t)x85 & 0x1ffffff);
  1078. { uint64_t x88 = (x86 + x40);
  1079. { uint64_t x89 = (x88 >> 0x1a);
  1080. { uint32_t x90 = ((uint32_t)x88 & 0x3ffffff);
  1081. { uint64_t x91 = (x89 + x28);
  1082. { uint64_t x92 = (x91 >> 0x19);
  1083. { uint32_t x93 = ((uint32_t)x91 & 0x1ffffff);
  1084. { uint64_t x94 = (x66 + (0x13 * x92));
  1085. { uint32_t x95 = (uint32_t) (x94 >> 0x1a);
  1086. { uint32_t x96 = ((uint32_t)x94 & 0x3ffffff);
  1087. { uint32_t x97 = (x95 + x69);
  1088. { uint32_t x98 = (x97 >> 0x19);
  1089. { uint32_t x99 = (x97 & 0x1ffffff);
  1090. out[0] = x96;
  1091. out[1] = x99;
  1092. out[2] = (x98 + x72);
  1093. out[3] = x75;
  1094. out[4] = x78;
  1095. out[5] = x81;
  1096. out[6] = x84;
  1097. out[7] = x87;
  1098. out[8] = x90;
  1099. out[9] = x93;
  1100. }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
  1101. assert_fe(out);
  1102. }
  1103. static void fe_sq_tl(fe *h, const fe_loose *f) {
  1104. fe_sqr_impl(h->v, f->v);
  1105. }
  1106. static void fe_sq_tt(fe *h, const fe *f) {
  1107. fe_sqr_impl(h->v, f->v);
  1108. }
  1109. // Replace (f,g) with (g,f) if b == 1;
  1110. // replace (f,g) with (f,g) if b == 0.
  1111. //
  1112. // Preconditions: b in {0,1}.
  1113. static void fe_cswap(fe *f, fe *g, unsigned int b) {
  1114. b = 0-b;
  1115. unsigned i;
  1116. for (i = 0; i < 10; i++) {
  1117. uint32_t x = f->v[i] ^ g->v[i];
  1118. x &= b;
  1119. f->v[i] ^= x;
  1120. g->v[i] ^= x;
  1121. }
  1122. }
  1123. // NOTE: based on fiat-crypto fe_mul, edited for in2=121666, 0, 0..
  1124. static void fe_mul_121666_impl(uint32_t out[10], const uint32_t in1[10]) {
  1125. { const uint32_t x20 = in1[9];
  1126. { const uint32_t x21 = in1[8];
  1127. { const uint32_t x19 = in1[7];
  1128. { const uint32_t x17 = in1[6];
  1129. { const uint32_t x15 = in1[5];
  1130. { const uint32_t x13 = in1[4];
  1131. { const uint32_t x11 = in1[3];
  1132. { const uint32_t x9 = in1[2];
  1133. { const uint32_t x7 = in1[1];
  1134. { const uint32_t x5 = in1[0];
  1135. { const uint32_t x38 = 0;
  1136. { const uint32_t x39 = 0;
  1137. { const uint32_t x37 = 0;
  1138. { const uint32_t x35 = 0;
  1139. { const uint32_t x33 = 0;
  1140. { const uint32_t x31 = 0;
  1141. { const uint32_t x29 = 0;
  1142. { const uint32_t x27 = 0;
  1143. { const uint32_t x25 = 0;
  1144. { const uint32_t x23 = 121666;
  1145. { uint64_t x40 = ((uint64_t)x23 * x5);
  1146. { uint64_t x41 = (((uint64_t)x23 * x7) + ((uint64_t)x25 * x5));
  1147. { uint64_t x42 = ((((uint64_t)(0x2 * x25) * x7) + ((uint64_t)x23 * x9)) + ((uint64_t)x27 * x5));
  1148. { uint64_t x43 = (((((uint64_t)x25 * x9) + ((uint64_t)x27 * x7)) + ((uint64_t)x23 * x11)) + ((uint64_t)x29 * x5));
  1149. { uint64_t x44 = (((((uint64_t)x27 * x9) + (0x2 * (((uint64_t)x25 * x11) + ((uint64_t)x29 * x7)))) + ((uint64_t)x23 * x13)) + ((uint64_t)x31 * x5));
  1150. { uint64_t x45 = (((((((uint64_t)x27 * x11) + ((uint64_t)x29 * x9)) + ((uint64_t)x25 * x13)) + ((uint64_t)x31 * x7)) + ((uint64_t)x23 * x15)) + ((uint64_t)x33 * x5));
  1151. { uint64_t x46 = (((((0x2 * ((((uint64_t)x29 * x11) + ((uint64_t)x25 * x15)) + ((uint64_t)x33 * x7))) + ((uint64_t)x27 * x13)) + ((uint64_t)x31 * x9)) + ((uint64_t)x23 * x17)) + ((uint64_t)x35 * x5));
  1152. { uint64_t x47 = (((((((((uint64_t)x29 * x13) + ((uint64_t)x31 * x11)) + ((uint64_t)x27 * x15)) + ((uint64_t)x33 * x9)) + ((uint64_t)x25 * x17)) + ((uint64_t)x35 * x7)) + ((uint64_t)x23 * x19)) + ((uint64_t)x37 * x5));
  1153. { uint64_t x48 = (((((((uint64_t)x31 * x13) + (0x2 * (((((uint64_t)x29 * x15) + ((uint64_t)x33 * x11)) + ((uint64_t)x25 * x19)) + ((uint64_t)x37 * x7)))) + ((uint64_t)x27 * x17)) + ((uint64_t)x35 * x9)) + ((uint64_t)x23 * x21)) + ((uint64_t)x39 * x5));
  1154. { uint64_t x49 = (((((((((((uint64_t)x31 * x15) + ((uint64_t)x33 * x13)) + ((uint64_t)x29 * x17)) + ((uint64_t)x35 * x11)) + ((uint64_t)x27 * x19)) + ((uint64_t)x37 * x9)) + ((uint64_t)x25 * x21)) + ((uint64_t)x39 * x7)) + ((uint64_t)x23 * x20)) + ((uint64_t)x38 * x5));
  1155. { uint64_t x50 = (((((0x2 * ((((((uint64_t)x33 * x15) + ((uint64_t)x29 * x19)) + ((uint64_t)x37 * x11)) + ((uint64_t)x25 * x20)) + ((uint64_t)x38 * x7))) + ((uint64_t)x31 * x17)) + ((uint64_t)x35 * x13)) + ((uint64_t)x27 * x21)) + ((uint64_t)x39 * x9));
  1156. { uint64_t x51 = (((((((((uint64_t)x33 * x17) + ((uint64_t)x35 * x15)) + ((uint64_t)x31 * x19)) + ((uint64_t)x37 * x13)) + ((uint64_t)x29 * x21)) + ((uint64_t)x39 * x11)) + ((uint64_t)x27 * x20)) + ((uint64_t)x38 * x9));
  1157. { uint64_t x52 = (((((uint64_t)x35 * x17) + (0x2 * (((((uint64_t)x33 * x19) + ((uint64_t)x37 * x15)) + ((uint64_t)x29 * x20)) + ((uint64_t)x38 * x11)))) + ((uint64_t)x31 * x21)) + ((uint64_t)x39 * x13));
  1158. { uint64_t x53 = (((((((uint64_t)x35 * x19) + ((uint64_t)x37 * x17)) + ((uint64_t)x33 * x21)) + ((uint64_t)x39 * x15)) + ((uint64_t)x31 * x20)) + ((uint64_t)x38 * x13));
  1159. { uint64_t x54 = (((0x2 * ((((uint64_t)x37 * x19) + ((uint64_t)x33 * x20)) + ((uint64_t)x38 * x15))) + ((uint64_t)x35 * x21)) + ((uint64_t)x39 * x17));
  1160. { uint64_t x55 = (((((uint64_t)x37 * x21) + ((uint64_t)x39 * x19)) + ((uint64_t)x35 * x20)) + ((uint64_t)x38 * x17));
  1161. { uint64_t x56 = (((uint64_t)x39 * x21) + (0x2 * (((uint64_t)x37 * x20) + ((uint64_t)x38 * x19))));
  1162. { uint64_t x57 = (((uint64_t)x39 * x20) + ((uint64_t)x38 * x21));
  1163. { uint64_t x58 = ((uint64_t)(0x2 * x38) * x20);
  1164. { uint64_t x59 = (x48 + (x58 << 0x4));
  1165. { uint64_t x60 = (x59 + (x58 << 0x1));
  1166. { uint64_t x61 = (x60 + x58);
  1167. { uint64_t x62 = (x47 + (x57 << 0x4));
  1168. { uint64_t x63 = (x62 + (x57 << 0x1));
  1169. { uint64_t x64 = (x63 + x57);
  1170. { uint64_t x65 = (x46 + (x56 << 0x4));
  1171. { uint64_t x66 = (x65 + (x56 << 0x1));
  1172. { uint64_t x67 = (x66 + x56);
  1173. { uint64_t x68 = (x45 + (x55 << 0x4));
  1174. { uint64_t x69 = (x68 + (x55 << 0x1));
  1175. { uint64_t x70 = (x69 + x55);
  1176. { uint64_t x71 = (x44 + (x54 << 0x4));
  1177. { uint64_t x72 = (x71 + (x54 << 0x1));
  1178. { uint64_t x73 = (x72 + x54);
  1179. { uint64_t x74 = (x43 + (x53 << 0x4));
  1180. { uint64_t x75 = (x74 + (x53 << 0x1));
  1181. { uint64_t x76 = (x75 + x53);
  1182. { uint64_t x77 = (x42 + (x52 << 0x4));
  1183. { uint64_t x78 = (x77 + (x52 << 0x1));
  1184. { uint64_t x79 = (x78 + x52);
  1185. { uint64_t x80 = (x41 + (x51 << 0x4));
  1186. { uint64_t x81 = (x80 + (x51 << 0x1));
  1187. { uint64_t x82 = (x81 + x51);
  1188. { uint64_t x83 = (x40 + (x50 << 0x4));
  1189. { uint64_t x84 = (x83 + (x50 << 0x1));
  1190. { uint64_t x85 = (x84 + x50);
  1191. { uint64_t x86 = (x85 >> 0x1a);
  1192. { uint32_t x87 = ((uint32_t)x85 & 0x3ffffff);
  1193. { uint64_t x88 = (x86 + x82);
  1194. { uint64_t x89 = (x88 >> 0x19);
  1195. { uint32_t x90 = ((uint32_t)x88 & 0x1ffffff);
  1196. { uint64_t x91 = (x89 + x79);
  1197. { uint64_t x92 = (x91 >> 0x1a);
  1198. { uint32_t x93 = ((uint32_t)x91 & 0x3ffffff);
  1199. { uint64_t x94 = (x92 + x76);
  1200. { uint64_t x95 = (x94 >> 0x19);
  1201. { uint32_t x96 = ((uint32_t)x94 & 0x1ffffff);
  1202. { uint64_t x97 = (x95 + x73);
  1203. { uint64_t x98 = (x97 >> 0x1a);
  1204. { uint32_t x99 = ((uint32_t)x97 & 0x3ffffff);
  1205. { uint64_t x100 = (x98 + x70);
  1206. { uint64_t x101 = (x100 >> 0x19);
  1207. { uint32_t x102 = ((uint32_t)x100 & 0x1ffffff);
  1208. { uint64_t x103 = (x101 + x67);
  1209. { uint64_t x104 = (x103 >> 0x1a);
  1210. { uint32_t x105 = ((uint32_t)x103 & 0x3ffffff);
  1211. { uint64_t x106 = (x104 + x64);
  1212. { uint64_t x107 = (x106 >> 0x19);
  1213. { uint32_t x108 = ((uint32_t)x106 & 0x1ffffff);
  1214. { uint64_t x109 = (x107 + x61);
  1215. { uint64_t x110 = (x109 >> 0x1a);
  1216. { uint32_t x111 = ((uint32_t)x109 & 0x3ffffff);
  1217. { uint64_t x112 = (x110 + x49);
  1218. { uint64_t x113 = (x112 >> 0x19);
  1219. { uint32_t x114 = ((uint32_t)x112 & 0x1ffffff);
  1220. { uint64_t x115 = (x87 + (0x13 * x113));
  1221. { uint32_t x116 = (uint32_t) (x115 >> 0x1a);
  1222. { uint32_t x117 = ((uint32_t)x115 & 0x3ffffff);
  1223. { uint32_t x118 = (x116 + x90);
  1224. { uint32_t x119 = (x118 >> 0x19);
  1225. { uint32_t x120 = (x118 & 0x1ffffff);
  1226. out[0] = x117;
  1227. out[1] = x120;
  1228. out[2] = (x119 + x93);
  1229. out[3] = x96;
  1230. out[4] = x99;
  1231. out[5] = x102;
  1232. out[6] = x105;
  1233. out[7] = x108;
  1234. out[8] = x111;
  1235. out[9] = x114;
  1236. }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
  1237. }
  1238. static void fe_mul121666(fe *h, const fe_loose *f) {
  1239. assert_fe_loose(f->v);
  1240. fe_mul_121666_impl(h->v, f->v);
  1241. assert_fe(h->v);
  1242. }
  1243. // Adapted from Fiat-synthesized |fe_sub_impl| with |out| = 0.
  1244. static void fe_neg_impl(uint32_t out[10], const uint32_t in2[10]) {
  1245. { const uint32_t x20 = 0;
  1246. { const uint32_t x21 = 0;
  1247. { const uint32_t x19 = 0;
  1248. { const uint32_t x17 = 0;
  1249. { const uint32_t x15 = 0;
  1250. { const uint32_t x13 = 0;
  1251. { const uint32_t x11 = 0;
  1252. { const uint32_t x9 = 0;
  1253. { const uint32_t x7 = 0;
  1254. { const uint32_t x5 = 0;
  1255. { const uint32_t x38 = in2[9];
  1256. { const uint32_t x39 = in2[8];
  1257. { const uint32_t x37 = in2[7];
  1258. { const uint32_t x35 = in2[6];
  1259. { const uint32_t x33 = in2[5];
  1260. { const uint32_t x31 = in2[4];
  1261. { const uint32_t x29 = in2[3];
  1262. { const uint32_t x27 = in2[2];
  1263. { const uint32_t x25 = in2[1];
  1264. { const uint32_t x23 = in2[0];
  1265. out[0] = ((0x7ffffda + x5) - x23);
  1266. out[1] = ((0x3fffffe + x7) - x25);
  1267. out[2] = ((0x7fffffe + x9) - x27);
  1268. out[3] = ((0x3fffffe + x11) - x29);
  1269. out[4] = ((0x7fffffe + x13) - x31);
  1270. out[5] = ((0x3fffffe + x15) - x33);
  1271. out[6] = ((0x7fffffe + x17) - x35);
  1272. out[7] = ((0x3fffffe + x19) - x37);
  1273. out[8] = ((0x7fffffe + x21) - x39);
  1274. out[9] = ((0x3fffffe + x20) - x38);
  1275. }}}}}}}}}}}}}}}}}}}}
  1276. }
  1277. // h = -f
  1278. static void fe_neg(fe_loose *h, const fe *f) {
  1279. assert_fe(f->v);
  1280. fe_neg_impl(h->v, f->v);
  1281. assert_fe_loose(h->v);
  1282. }
  1283. // Replace (f,g) with (g,g) if b == 1;
  1284. // replace (f,g) with (f,g) if b == 0.
  1285. //
  1286. // Preconditions: b in {0,1}.
  1287. static void fe_cmov(fe_loose *f, const fe_loose *g, unsigned b) {
  1288. b = 0-b;
  1289. unsigned i;
  1290. for (i = 0; i < 10; i++) {
  1291. uint32_t x = f->v[i] ^ g->v[i];
  1292. x &= b;
  1293. f->v[i] ^= x;
  1294. }
  1295. }
  1296. #endif // BORINGSSL_CURVE25519_64BIT
  1297. // h = f
  1298. static void fe_copy(fe *h, const fe *f) {
  1299. OPENSSL_memmove(h, f, sizeof(fe));
  1300. }
  1301. static void fe_copy_lt(fe_loose *h, const fe *f) {
  1302. OPENSSL_COMPILE_ASSERT(sizeof(fe_loose) == sizeof(fe),
  1303. fe_and_fe_loose_mismatch);
  1304. OPENSSL_memmove(h, f, sizeof(fe));
  1305. }
  1306. #if !defined(OPENSSL_SMALL)
  1307. static void fe_copy_ll(fe_loose *h, const fe_loose *f) {
  1308. OPENSSL_memmove(h, f, sizeof(fe_loose));
  1309. }
  1310. #endif // !defined(OPENSSL_SMALL)
  1311. static void fe_loose_invert(fe *out, const fe_loose *z) {
  1312. fe t0;
  1313. fe t1;
  1314. fe t2;
  1315. fe t3;
  1316. int i;
  1317. fe_sq_tl(&t0, z);
  1318. fe_sq_tt(&t1, &t0);
  1319. for (i = 1; i < 2; ++i) {
  1320. fe_sq_tt(&t1, &t1);
  1321. }
  1322. fe_mul_tlt(&t1, z, &t1);
  1323. fe_mul_ttt(&t0, &t0, &t1);
  1324. fe_sq_tt(&t2, &t0);
  1325. fe_mul_ttt(&t1, &t1, &t2);
  1326. fe_sq_tt(&t2, &t1);
  1327. for (i = 1; i < 5; ++i) {
  1328. fe_sq_tt(&t2, &t2);
  1329. }
  1330. fe_mul_ttt(&t1, &t2, &t1);
  1331. fe_sq_tt(&t2, &t1);
  1332. for (i = 1; i < 10; ++i) {
  1333. fe_sq_tt(&t2, &t2);
  1334. }
  1335. fe_mul_ttt(&t2, &t2, &t1);
  1336. fe_sq_tt(&t3, &t2);
  1337. for (i = 1; i < 20; ++i) {
  1338. fe_sq_tt(&t3, &t3);
  1339. }
  1340. fe_mul_ttt(&t2, &t3, &t2);
  1341. fe_sq_tt(&t2, &t2);
  1342. for (i = 1; i < 10; ++i) {
  1343. fe_sq_tt(&t2, &t2);
  1344. }
  1345. fe_mul_ttt(&t1, &t2, &t1);
  1346. fe_sq_tt(&t2, &t1);
  1347. for (i = 1; i < 50; ++i) {
  1348. fe_sq_tt(&t2, &t2);
  1349. }
  1350. fe_mul_ttt(&t2, &t2, &t1);
  1351. fe_sq_tt(&t3, &t2);
  1352. for (i = 1; i < 100; ++i) {
  1353. fe_sq_tt(&t3, &t3);
  1354. }
  1355. fe_mul_ttt(&t2, &t3, &t2);
  1356. fe_sq_tt(&t2, &t2);
  1357. for (i = 1; i < 50; ++i) {
  1358. fe_sq_tt(&t2, &t2);
  1359. }
  1360. fe_mul_ttt(&t1, &t2, &t1);
  1361. fe_sq_tt(&t1, &t1);
  1362. for (i = 1; i < 5; ++i) {
  1363. fe_sq_tt(&t1, &t1);
  1364. }
  1365. fe_mul_ttt(out, &t1, &t0);
  1366. }
  1367. static void fe_invert(fe *out, const fe *z) {
  1368. fe_loose l;
  1369. fe_copy_lt(&l, z);
  1370. fe_loose_invert(out, &l);
  1371. }
  1372. // return 0 if f == 0
  1373. // return 1 if f != 0
  1374. static int fe_isnonzero(const fe_loose *f) {
  1375. fe tight;
  1376. fe_carry(&tight, f);
  1377. uint8_t s[32];
  1378. fe_tobytes(s, &tight);
  1379. static const uint8_t zero[32] = {0};
  1380. return CRYPTO_memcmp(s, zero, sizeof(zero)) != 0;
  1381. }
  1382. // return 1 if f is in {1,3,5,...,q-2}
  1383. // return 0 if f is in {0,2,4,...,q-1}
  1384. static int fe_isnegative(const fe *f) {
  1385. uint8_t s[32];
  1386. fe_tobytes(s, f);
  1387. return s[0] & 1;
  1388. }
  1389. static void fe_sq2_tt(fe *h, const fe *f) {
  1390. // h = f^2
  1391. fe_sq_tt(h, f);
  1392. // h = h + h
  1393. fe_loose tmp;
  1394. fe_add(&tmp, h, h);
  1395. fe_carry(h, &tmp);
  1396. }
  1397. static void fe_pow22523(fe *out, const fe *z) {
  1398. fe t0;
  1399. fe t1;
  1400. fe t2;
  1401. int i;
  1402. fe_sq_tt(&t0, z);
  1403. fe_sq_tt(&t1, &t0);
  1404. for (i = 1; i < 2; ++i) {
  1405. fe_sq_tt(&t1, &t1);
  1406. }
  1407. fe_mul_ttt(&t1, z, &t1);
  1408. fe_mul_ttt(&t0, &t0, &t1);
  1409. fe_sq_tt(&t0, &t0);
  1410. fe_mul_ttt(&t0, &t1, &t0);
  1411. fe_sq_tt(&t1, &t0);
  1412. for (i = 1; i < 5; ++i) {
  1413. fe_sq_tt(&t1, &t1);
  1414. }
  1415. fe_mul_ttt(&t0, &t1, &t0);
  1416. fe_sq_tt(&t1, &t0);
  1417. for (i = 1; i < 10; ++i) {
  1418. fe_sq_tt(&t1, &t1);
  1419. }
  1420. fe_mul_ttt(&t1, &t1, &t0);
  1421. fe_sq_tt(&t2, &t1);
  1422. for (i = 1; i < 20; ++i) {
  1423. fe_sq_tt(&t2, &t2);
  1424. }
  1425. fe_mul_ttt(&t1, &t2, &t1);
  1426. fe_sq_tt(&t1, &t1);
  1427. for (i = 1; i < 10; ++i) {
  1428. fe_sq_tt(&t1, &t1);
  1429. }
  1430. fe_mul_ttt(&t0, &t1, &t0);
  1431. fe_sq_tt(&t1, &t0);
  1432. for (i = 1; i < 50; ++i) {
  1433. fe_sq_tt(&t1, &t1);
  1434. }
  1435. fe_mul_ttt(&t1, &t1, &t0);
  1436. fe_sq_tt(&t2, &t1);
  1437. for (i = 1; i < 100; ++i) {
  1438. fe_sq_tt(&t2, &t2);
  1439. }
  1440. fe_mul_ttt(&t1, &t2, &t1);
  1441. fe_sq_tt(&t1, &t1);
  1442. for (i = 1; i < 50; ++i) {
  1443. fe_sq_tt(&t1, &t1);
  1444. }
  1445. fe_mul_ttt(&t0, &t1, &t0);
  1446. fe_sq_tt(&t0, &t0);
  1447. for (i = 1; i < 2; ++i) {
  1448. fe_sq_tt(&t0, &t0);
  1449. }
  1450. fe_mul_ttt(out, &t0, z);
  1451. }
  1452. // Group operations.
  1453. void x25519_ge_tobytes(uint8_t s[32], const ge_p2 *h) {
  1454. fe recip;
  1455. fe x;
  1456. fe y;
  1457. fe_invert(&recip, &h->Z);
  1458. fe_mul_ttt(&x, &h->X, &recip);
  1459. fe_mul_ttt(&y, &h->Y, &recip);
  1460. fe_tobytes(s, &y);
  1461. s[31] ^= fe_isnegative(&x) << 7;
  1462. }
  1463. static void ge_p3_tobytes(uint8_t s[32], const ge_p3 *h) {
  1464. fe recip;
  1465. fe x;
  1466. fe y;
  1467. fe_invert(&recip, &h->Z);
  1468. fe_mul_ttt(&x, &h->X, &recip);
  1469. fe_mul_ttt(&y, &h->Y, &recip);
  1470. fe_tobytes(s, &y);
  1471. s[31] ^= fe_isnegative(&x) << 7;
  1472. }
  1473. int x25519_ge_frombytes_vartime(ge_p3 *h, const uint8_t *s) {
  1474. fe u;
  1475. fe_loose v;
  1476. fe v3;
  1477. fe vxx;
  1478. fe_loose check;
  1479. fe_frombytes(&h->Y, s);
  1480. fe_1(&h->Z);
  1481. fe_sq_tt(&v3, &h->Y);
  1482. fe_mul_ttt(&vxx, &v3, &d);
  1483. fe_sub(&v, &v3, &h->Z); // u = y^2-1
  1484. fe_carry(&u, &v);
  1485. fe_add(&v, &vxx, &h->Z); // v = dy^2+1
  1486. fe_sq_tl(&v3, &v);
  1487. fe_mul_ttl(&v3, &v3, &v); // v3 = v^3
  1488. fe_sq_tt(&h->X, &v3);
  1489. fe_mul_ttl(&h->X, &h->X, &v);
  1490. fe_mul_ttt(&h->X, &h->X, &u); // x = uv^7
  1491. fe_pow22523(&h->X, &h->X); // x = (uv^7)^((q-5)/8)
  1492. fe_mul_ttt(&h->X, &h->X, &v3);
  1493. fe_mul_ttt(&h->X, &h->X, &u); // x = uv^3(uv^7)^((q-5)/8)
  1494. fe_sq_tt(&vxx, &h->X);
  1495. fe_mul_ttl(&vxx, &vxx, &v);
  1496. fe_sub(&check, &vxx, &u);
  1497. if (fe_isnonzero(&check)) {
  1498. fe_add(&check, &vxx, &u);
  1499. if (fe_isnonzero(&check)) {
  1500. return -1;
  1501. }
  1502. fe_mul_ttt(&h->X, &h->X, &sqrtm1);
  1503. }
  1504. if (fe_isnegative(&h->X) != (s[31] >> 7)) {
  1505. fe_loose t;
  1506. fe_neg(&t, &h->X);
  1507. fe_carry(&h->X, &t);
  1508. }
  1509. fe_mul_ttt(&h->T, &h->X, &h->Y);
  1510. return 0;
  1511. }
  1512. static void ge_p2_0(ge_p2 *h) {
  1513. fe_0(&h->X);
  1514. fe_1(&h->Y);
  1515. fe_1(&h->Z);
  1516. }
  1517. static void ge_p3_0(ge_p3 *h) {
  1518. fe_0(&h->X);
  1519. fe_1(&h->Y);
  1520. fe_1(&h->Z);
  1521. fe_0(&h->T);
  1522. }
  1523. static void ge_cached_0(ge_cached *h) {
  1524. fe_loose_1(&h->YplusX);
  1525. fe_loose_1(&h->YminusX);
  1526. fe_loose_1(&h->Z);
  1527. fe_loose_0(&h->T2d);
  1528. }
  1529. static void ge_precomp_0(ge_precomp *h) {
  1530. fe_loose_1(&h->yplusx);
  1531. fe_loose_1(&h->yminusx);
  1532. fe_loose_0(&h->xy2d);
  1533. }
  1534. // r = p
  1535. static void ge_p3_to_p2(ge_p2 *r, const ge_p3 *p) {
  1536. fe_copy(&r->X, &p->X);
  1537. fe_copy(&r->Y, &p->Y);
  1538. fe_copy(&r->Z, &p->Z);
  1539. }
  1540. // r = p
  1541. void x25519_ge_p3_to_cached(ge_cached *r, const ge_p3 *p) {
  1542. fe_add(&r->YplusX, &p->Y, &p->X);
  1543. fe_sub(&r->YminusX, &p->Y, &p->X);
  1544. fe_copy_lt(&r->Z, &p->Z);
  1545. fe_mul_ltt(&r->T2d, &p->T, &d2);
  1546. }
  1547. // r = p
  1548. void x25519_ge_p1p1_to_p2(ge_p2 *r, const ge_p1p1 *p) {
  1549. fe_mul_tll(&r->X, &p->X, &p->T);
  1550. fe_mul_tll(&r->Y, &p->Y, &p->Z);
  1551. fe_mul_tll(&r->Z, &p->Z, &p->T);
  1552. }
  1553. // r = p
  1554. void x25519_ge_p1p1_to_p3(ge_p3 *r, const ge_p1p1 *p) {
  1555. fe_mul_tll(&r->X, &p->X, &p->T);
  1556. fe_mul_tll(&r->Y, &p->Y, &p->Z);
  1557. fe_mul_tll(&r->Z, &p->Z, &p->T);
  1558. fe_mul_tll(&r->T, &p->X, &p->Y);
  1559. }
  1560. // r = p
  1561. static void ge_p1p1_to_cached(ge_cached *r, const ge_p1p1 *p) {
  1562. ge_p3 t;
  1563. x25519_ge_p1p1_to_p3(&t, p);
  1564. x25519_ge_p3_to_cached(r, &t);
  1565. }
  1566. // r = 2 * p
  1567. static void ge_p2_dbl(ge_p1p1 *r, const ge_p2 *p) {
  1568. fe trX, trZ, trT;
  1569. fe t0;
  1570. fe_sq_tt(&trX, &p->X);
  1571. fe_sq_tt(&trZ, &p->Y);
  1572. fe_sq2_tt(&trT, &p->Z);
  1573. fe_add(&r->Y, &p->X, &p->Y);
  1574. fe_sq_tl(&t0, &r->Y);
  1575. fe_add(&r->Y, &trZ, &trX);
  1576. fe_sub(&r->Z, &trZ, &trX);
  1577. fe_carry(&trZ, &r->Y);
  1578. fe_sub(&r->X, &t0, &trZ);
  1579. fe_carry(&trZ, &r->Z);
  1580. fe_sub(&r->T, &trT, &trZ);
  1581. }
  1582. // r = 2 * p
  1583. static void ge_p3_dbl(ge_p1p1 *r, const ge_p3 *p) {
  1584. ge_p2 q;
  1585. ge_p3_to_p2(&q, p);
  1586. ge_p2_dbl(r, &q);
  1587. }
  1588. // r = p + q
  1589. static void ge_madd(ge_p1p1 *r, const ge_p3 *p, const ge_precomp *q) {
  1590. fe trY, trZ, trT;
  1591. fe_add(&r->X, &p->Y, &p->X);
  1592. fe_sub(&r->Y, &p->Y, &p->X);
  1593. fe_mul_tll(&trZ, &r->X, &q->yplusx);
  1594. fe_mul_tll(&trY, &r->Y, &q->yminusx);
  1595. fe_mul_tlt(&trT, &q->xy2d, &p->T);
  1596. fe_add(&r->T, &p->Z, &p->Z);
  1597. fe_sub(&r->X, &trZ, &trY);
  1598. fe_add(&r->Y, &trZ, &trY);
  1599. fe_carry(&trZ, &r->T);
  1600. fe_add(&r->Z, &trZ, &trT);
  1601. fe_sub(&r->T, &trZ, &trT);
  1602. }
  1603. // r = p - q
  1604. static void ge_msub(ge_p1p1 *r, const ge_p3 *p, const ge_precomp *q) {
  1605. fe trY, trZ, trT;
  1606. fe_add(&r->X, &p->Y, &p->X);
  1607. fe_sub(&r->Y, &p->Y, &p->X);
  1608. fe_mul_tll(&trZ, &r->X, &q->yminusx);
  1609. fe_mul_tll(&trY, &r->Y, &q->yplusx);
  1610. fe_mul_tlt(&trT, &q->xy2d, &p->T);
  1611. fe_add(&r->T, &p->Z, &p->Z);
  1612. fe_sub(&r->X, &trZ, &trY);
  1613. fe_add(&r->Y, &trZ, &trY);
  1614. fe_carry(&trZ, &r->T);
  1615. fe_sub(&r->Z, &trZ, &trT);
  1616. fe_add(&r->T, &trZ, &trT);
  1617. }
  1618. // r = p + q
  1619. void x25519_ge_add(ge_p1p1 *r, const ge_p3 *p, const ge_cached *q) {
  1620. fe trX, trY, trZ, trT;
  1621. fe_add(&r->X, &p->Y, &p->X);
  1622. fe_sub(&r->Y, &p->Y, &p->X);
  1623. fe_mul_tll(&trZ, &r->X, &q->YplusX);
  1624. fe_mul_tll(&trY, &r->Y, &q->YminusX);
  1625. fe_mul_tlt(&trT, &q->T2d, &p->T);
  1626. fe_mul_ttl(&trX, &p->Z, &q->Z);
  1627. fe_add(&r->T, &trX, &trX);
  1628. fe_sub(&r->X, &trZ, &trY);
  1629. fe_add(&r->Y, &trZ, &trY);
  1630. fe_carry(&trZ, &r->T);
  1631. fe_add(&r->Z, &trZ, &trT);
  1632. fe_sub(&r->T, &trZ, &trT);
  1633. }
  1634. // r = p - q
  1635. void x25519_ge_sub(ge_p1p1 *r, const ge_p3 *p, const ge_cached *q) {
  1636. fe trX, trY, trZ, trT;
  1637. fe_add(&r->X, &p->Y, &p->X);
  1638. fe_sub(&r->Y, &p->Y, &p->X);
  1639. fe_mul_tll(&trZ, &r->X, &q->YminusX);
  1640. fe_mul_tll(&trY, &r->Y, &q->YplusX);
  1641. fe_mul_tlt(&trT, &q->T2d, &p->T);
  1642. fe_mul_ttl(&trX, &p->Z, &q->Z);
  1643. fe_add(&r->T, &trX, &trX);
  1644. fe_sub(&r->X, &trZ, &trY);
  1645. fe_add(&r->Y, &trZ, &trY);
  1646. fe_carry(&trZ, &r->T);
  1647. fe_sub(&r->Z, &trZ, &trT);
  1648. fe_add(&r->T, &trZ, &trT);
  1649. }
  1650. static uint8_t equal(signed char b, signed char c) {
  1651. uint8_t ub = b;
  1652. uint8_t uc = c;
  1653. uint8_t x = ub ^ uc; // 0: yes; 1..255: no
  1654. uint32_t y = x; // 0: yes; 1..255: no
  1655. y -= 1; // 4294967295: yes; 0..254: no
  1656. y >>= 31; // 1: yes; 0: no
  1657. return y;
  1658. }
  1659. static void cmov(ge_precomp *t, const ge_precomp *u, uint8_t b) {
  1660. fe_cmov(&t->yplusx, &u->yplusx, b);
  1661. fe_cmov(&t->yminusx, &u->yminusx, b);
  1662. fe_cmov(&t->xy2d, &u->xy2d, b);
  1663. }
  1664. void x25519_ge_scalarmult_small_precomp(
  1665. ge_p3 *h, const uint8_t a[32], const uint8_t precomp_table[15 * 2 * 32]) {
  1666. // precomp_table is first expanded into matching |ge_precomp|
  1667. // elements.
  1668. ge_precomp multiples[15];
  1669. unsigned i;
  1670. for (i = 0; i < 15; i++) {
  1671. const uint8_t *bytes = &precomp_table[i*(2 * 32)];
  1672. fe x, y;
  1673. fe_frombytes(&x, bytes);
  1674. fe_frombytes(&y, bytes + 32);
  1675. ge_precomp *out = &multiples[i];
  1676. fe_add(&out->yplusx, &y, &x);
  1677. fe_sub(&out->yminusx, &y, &x);
  1678. fe_mul_ltt(&out->xy2d, &x, &y);
  1679. fe_mul_llt(&out->xy2d, &out->xy2d, &d2);
  1680. }
  1681. // See the comment above |k25519SmallPrecomp| about the structure of the
  1682. // precomputed elements. This loop does 64 additions and 64 doublings to
  1683. // calculate the result.
  1684. ge_p3_0(h);
  1685. for (i = 63; i < 64; i--) {
  1686. unsigned j;
  1687. signed char index = 0;
  1688. for (j = 0; j < 4; j++) {
  1689. const uint8_t bit = 1 & (a[(8 * j) + (i / 8)] >> (i & 7));
  1690. index |= (bit << j);
  1691. }
  1692. ge_precomp e;
  1693. ge_precomp_0(&e);
  1694. for (j = 1; j < 16; j++) {
  1695. cmov(&e, &multiples[j-1], equal(index, j));
  1696. }
  1697. ge_cached cached;
  1698. ge_p1p1 r;
  1699. x25519_ge_p3_to_cached(&cached, h);
  1700. x25519_ge_add(&r, h, &cached);
  1701. x25519_ge_p1p1_to_p3(h, &r);
  1702. ge_madd(&r, h, &e);
  1703. x25519_ge_p1p1_to_p3(h, &r);
  1704. }
  1705. }
  1706. #if defined(OPENSSL_SMALL)
  1707. void x25519_ge_scalarmult_base(ge_p3 *h, const uint8_t a[32]) {
  1708. x25519_ge_scalarmult_small_precomp(h, a, k25519SmallPrecomp);
  1709. }
  1710. #else
  1711. static uint8_t negative(signed char b) {
  1712. uint32_t x = b;
  1713. x >>= 31; // 1: yes; 0: no
  1714. return x;
  1715. }
  1716. static void table_select(ge_precomp *t, int pos, signed char b) {
  1717. ge_precomp minust;
  1718. uint8_t bnegative = negative(b);
  1719. uint8_t babs = b - ((uint8_t)((-bnegative) & b) << 1);
  1720. ge_precomp_0(t);
  1721. cmov(t, &k25519Precomp[pos][0], equal(babs, 1));
  1722. cmov(t, &k25519Precomp[pos][1], equal(babs, 2));
  1723. cmov(t, &k25519Precomp[pos][2], equal(babs, 3));
  1724. cmov(t, &k25519Precomp[pos][3], equal(babs, 4));
  1725. cmov(t, &k25519Precomp[pos][4], equal(babs, 5));
  1726. cmov(t, &k25519Precomp[pos][5], equal(babs, 6));
  1727. cmov(t, &k25519Precomp[pos][6], equal(babs, 7));
  1728. cmov(t, &k25519Precomp[pos][7], equal(babs, 8));
  1729. fe_copy_ll(&minust.yplusx, &t->yminusx);
  1730. fe_copy_ll(&minust.yminusx, &t->yplusx);
  1731. // NOTE: the input table is canonical, but types don't encode it
  1732. fe tmp;
  1733. fe_carry(&tmp, &t->xy2d);
  1734. fe_neg(&minust.xy2d, &tmp);
  1735. cmov(t, &minust, bnegative);
  1736. }
  1737. // h = a * B
  1738. // where a = a[0]+256*a[1]+...+256^31 a[31]
  1739. // B is the Ed25519 base point (x,4/5) with x positive.
  1740. //
  1741. // Preconditions:
  1742. // a[31] <= 127
  1743. void x25519_ge_scalarmult_base(ge_p3 *h, const uint8_t *a) {
  1744. signed char e[64];
  1745. signed char carry;
  1746. ge_p1p1 r;
  1747. ge_p2 s;
  1748. ge_precomp t;
  1749. int i;
  1750. for (i = 0; i < 32; ++i) {
  1751. e[2 * i + 0] = (a[i] >> 0) & 15;
  1752. e[2 * i + 1] = (a[i] >> 4) & 15;
  1753. }
  1754. // each e[i] is between 0 and 15
  1755. // e[63] is between 0 and 7
  1756. carry = 0;
  1757. for (i = 0; i < 63; ++i) {
  1758. e[i] += carry;
  1759. carry = e[i] + 8;
  1760. carry >>= 4;
  1761. e[i] -= carry << 4;
  1762. }
  1763. e[63] += carry;
  1764. // each e[i] is between -8 and 8
  1765. ge_p3_0(h);
  1766. for (i = 1; i < 64; i += 2) {
  1767. table_select(&t, i / 2, e[i]);
  1768. ge_madd(&r, h, &t);
  1769. x25519_ge_p1p1_to_p3(h, &r);
  1770. }
  1771. ge_p3_dbl(&r, h);
  1772. x25519_ge_p1p1_to_p2(&s, &r);
  1773. ge_p2_dbl(&r, &s);
  1774. x25519_ge_p1p1_to_p2(&s, &r);
  1775. ge_p2_dbl(&r, &s);
  1776. x25519_ge_p1p1_to_p2(&s, &r);
  1777. ge_p2_dbl(&r, &s);
  1778. x25519_ge_p1p1_to_p3(h, &r);
  1779. for (i = 0; i < 64; i += 2) {
  1780. table_select(&t, i / 2, e[i]);
  1781. ge_madd(&r, h, &t);
  1782. x25519_ge_p1p1_to_p3(h, &r);
  1783. }
  1784. }
  1785. #endif
  1786. static void cmov_cached(ge_cached *t, ge_cached *u, uint8_t b) {
  1787. fe_cmov(&t->YplusX, &u->YplusX, b);
  1788. fe_cmov(&t->YminusX, &u->YminusX, b);
  1789. fe_cmov(&t->Z, &u->Z, b);
  1790. fe_cmov(&t->T2d, &u->T2d, b);
  1791. }
  1792. // r = scalar * A.
  1793. // where a = a[0]+256*a[1]+...+256^31 a[31].
  1794. void x25519_ge_scalarmult(ge_p2 *r, const uint8_t *scalar, const ge_p3 *A) {
  1795. ge_p2 Ai_p2[8];
  1796. ge_cached Ai[16];
  1797. ge_p1p1 t;
  1798. ge_cached_0(&Ai[0]);
  1799. x25519_ge_p3_to_cached(&Ai[1], A);
  1800. ge_p3_to_p2(&Ai_p2[1], A);
  1801. unsigned i;
  1802. for (i = 2; i < 16; i += 2) {
  1803. ge_p2_dbl(&t, &Ai_p2[i / 2]);
  1804. ge_p1p1_to_cached(&Ai[i], &t);
  1805. if (i < 8) {
  1806. x25519_ge_p1p1_to_p2(&Ai_p2[i], &t);
  1807. }
  1808. x25519_ge_add(&t, A, &Ai[i]);
  1809. ge_p1p1_to_cached(&Ai[i + 1], &t);
  1810. if (i < 7) {
  1811. x25519_ge_p1p1_to_p2(&Ai_p2[i + 1], &t);
  1812. }
  1813. }
  1814. ge_p2_0(r);
  1815. ge_p3 u;
  1816. for (i = 0; i < 256; i += 4) {
  1817. ge_p2_dbl(&t, r);
  1818. x25519_ge_p1p1_to_p2(r, &t);
  1819. ge_p2_dbl(&t, r);
  1820. x25519_ge_p1p1_to_p2(r, &t);
  1821. ge_p2_dbl(&t, r);
  1822. x25519_ge_p1p1_to_p2(r, &t);
  1823. ge_p2_dbl(&t, r);
  1824. x25519_ge_p1p1_to_p3(&u, &t);
  1825. uint8_t index = scalar[31 - i/8];
  1826. index >>= 4 - (i & 4);
  1827. index &= 0xf;
  1828. unsigned j;
  1829. ge_cached selected;
  1830. ge_cached_0(&selected);
  1831. for (j = 0; j < 16; j++) {
  1832. cmov_cached(&selected, &Ai[j], equal(j, index));
  1833. }
  1834. x25519_ge_add(&t, &u, &selected);
  1835. x25519_ge_p1p1_to_p2(r, &t);
  1836. }
  1837. }
  1838. static void slide(signed char *r, const uint8_t *a) {
  1839. int i;
  1840. int b;
  1841. int k;
  1842. for (i = 0; i < 256; ++i) {
  1843. r[i] = 1 & (a[i >> 3] >> (i & 7));
  1844. }
  1845. for (i = 0; i < 256; ++i) {
  1846. if (r[i]) {
  1847. for (b = 1; b <= 6 && i + b < 256; ++b) {
  1848. if (r[i + b]) {
  1849. if (r[i] + (r[i + b] << b) <= 15) {
  1850. r[i] += r[i + b] << b;
  1851. r[i + b] = 0;
  1852. } else if (r[i] - (r[i + b] << b) >= -15) {
  1853. r[i] -= r[i + b] << b;
  1854. for (k = i + b; k < 256; ++k) {
  1855. if (!r[k]) {
  1856. r[k] = 1;
  1857. break;
  1858. }
  1859. r[k] = 0;
  1860. }
  1861. } else {
  1862. break;
  1863. }
  1864. }
  1865. }
  1866. }
  1867. }
  1868. }
  1869. // r = a * A + b * B
  1870. // where a = a[0]+256*a[1]+...+256^31 a[31].
  1871. // and b = b[0]+256*b[1]+...+256^31 b[31].
  1872. // B is the Ed25519 base point (x,4/5) with x positive.
  1873. static void ge_double_scalarmult_vartime(ge_p2 *r, const uint8_t *a,
  1874. const ge_p3 *A, const uint8_t *b) {
  1875. signed char aslide[256];
  1876. signed char bslide[256];
  1877. ge_cached Ai[8]; // A,3A,5A,7A,9A,11A,13A,15A
  1878. ge_p1p1 t;
  1879. ge_p3 u;
  1880. ge_p3 A2;
  1881. int i;
  1882. slide(aslide, a);
  1883. slide(bslide, b);
  1884. x25519_ge_p3_to_cached(&Ai[0], A);
  1885. ge_p3_dbl(&t, A);
  1886. x25519_ge_p1p1_to_p3(&A2, &t);
  1887. x25519_ge_add(&t, &A2, &Ai[0]);
  1888. x25519_ge_p1p1_to_p3(&u, &t);
  1889. x25519_ge_p3_to_cached(&Ai[1], &u);
  1890. x25519_ge_add(&t, &A2, &Ai[1]);
  1891. x25519_ge_p1p1_to_p3(&u, &t);
  1892. x25519_ge_p3_to_cached(&Ai[2], &u);
  1893. x25519_ge_add(&t, &A2, &Ai[2]);
  1894. x25519_ge_p1p1_to_p3(&u, &t);
  1895. x25519_ge_p3_to_cached(&Ai[3], &u);
  1896. x25519_ge_add(&t, &A2, &Ai[3]);
  1897. x25519_ge_p1p1_to_p3(&u, &t);
  1898. x25519_ge_p3_to_cached(&Ai[4], &u);
  1899. x25519_ge_add(&t, &A2, &Ai[4]);
  1900. x25519_ge_p1p1_to_p3(&u, &t);
  1901. x25519_ge_p3_to_cached(&Ai[5], &u);
  1902. x25519_ge_add(&t, &A2, &Ai[5]);
  1903. x25519_ge_p1p1_to_p3(&u, &t);
  1904. x25519_ge_p3_to_cached(&Ai[6], &u);
  1905. x25519_ge_add(&t, &A2, &Ai[6]);
  1906. x25519_ge_p1p1_to_p3(&u, &t);
  1907. x25519_ge_p3_to_cached(&Ai[7], &u);
  1908. ge_p2_0(r);
  1909. for (i = 255; i >= 0; --i) {
  1910. if (aslide[i] || bslide[i]) {
  1911. break;
  1912. }
  1913. }
  1914. for (; i >= 0; --i) {
  1915. ge_p2_dbl(&t, r);
  1916. if (aslide[i] > 0) {
  1917. x25519_ge_p1p1_to_p3(&u, &t);
  1918. x25519_ge_add(&t, &u, &Ai[aslide[i] / 2]);
  1919. } else if (aslide[i] < 0) {
  1920. x25519_ge_p1p1_to_p3(&u, &t);
  1921. x25519_ge_sub(&t, &u, &Ai[(-aslide[i]) / 2]);
  1922. }
  1923. if (bslide[i] > 0) {
  1924. x25519_ge_p1p1_to_p3(&u, &t);
  1925. ge_madd(&t, &u, &Bi[bslide[i] / 2]);
  1926. } else if (bslide[i] < 0) {
  1927. x25519_ge_p1p1_to_p3(&u, &t);
  1928. ge_msub(&t, &u, &Bi[(-bslide[i]) / 2]);
  1929. }
  1930. x25519_ge_p1p1_to_p2(r, &t);
  1931. }
  1932. }
  1933. // The set of scalars is \Z/l
  1934. // where l = 2^252 + 27742317777372353535851937790883648493.
  1935. // Input:
  1936. // s[0]+256*s[1]+...+256^63*s[63] = s
  1937. //
  1938. // Output:
  1939. // s[0]+256*s[1]+...+256^31*s[31] = s mod l
  1940. // where l = 2^252 + 27742317777372353535851937790883648493.
  1941. // Overwrites s in place.
  1942. void x25519_sc_reduce(uint8_t s[64]) {
  1943. int64_t s0 = 2097151 & load_3(s);
  1944. int64_t s1 = 2097151 & (load_4(s + 2) >> 5);
  1945. int64_t s2 = 2097151 & (load_3(s + 5) >> 2);
  1946. int64_t s3 = 2097151 & (load_4(s + 7) >> 7);
  1947. int64_t s4 = 2097151 & (load_4(s + 10) >> 4);
  1948. int64_t s5 = 2097151 & (load_3(s + 13) >> 1);
  1949. int64_t s6 = 2097151 & (load_4(s + 15) >> 6);
  1950. int64_t s7 = 2097151 & (load_3(s + 18) >> 3);
  1951. int64_t s8 = 2097151 & load_3(s + 21);
  1952. int64_t s9 = 2097151 & (load_4(s + 23) >> 5);
  1953. int64_t s10 = 2097151 & (load_3(s + 26) >> 2);
  1954. int64_t s11 = 2097151 & (load_4(s + 28) >> 7);
  1955. int64_t s12 = 2097151 & (load_4(s + 31) >> 4);
  1956. int64_t s13 = 2097151 & (load_3(s + 34) >> 1);
  1957. int64_t s14 = 2097151 & (load_4(s + 36) >> 6);
  1958. int64_t s15 = 2097151 & (load_3(s + 39) >> 3);
  1959. int64_t s16 = 2097151 & load_3(s + 42);
  1960. int64_t s17 = 2097151 & (load_4(s + 44) >> 5);
  1961. int64_t s18 = 2097151 & (load_3(s + 47) >> 2);
  1962. int64_t s19 = 2097151 & (load_4(s + 49) >> 7);
  1963. int64_t s20 = 2097151 & (load_4(s + 52) >> 4);
  1964. int64_t s21 = 2097151 & (load_3(s + 55) >> 1);
  1965. int64_t s22 = 2097151 & (load_4(s + 57) >> 6);
  1966. int64_t s23 = (load_4(s + 60) >> 3);
  1967. int64_t carry0;
  1968. int64_t carry1;
  1969. int64_t carry2;
  1970. int64_t carry3;
  1971. int64_t carry4;
  1972. int64_t carry5;
  1973. int64_t carry6;
  1974. int64_t carry7;
  1975. int64_t carry8;
  1976. int64_t carry9;
  1977. int64_t carry10;
  1978. int64_t carry11;
  1979. int64_t carry12;
  1980. int64_t carry13;
  1981. int64_t carry14;
  1982. int64_t carry15;
  1983. int64_t carry16;
  1984. s11 += s23 * 666643;
  1985. s12 += s23 * 470296;
  1986. s13 += s23 * 654183;
  1987. s14 -= s23 * 997805;
  1988. s15 += s23 * 136657;
  1989. s16 -= s23 * 683901;
  1990. s23 = 0;
  1991. s10 += s22 * 666643;
  1992. s11 += s22 * 470296;
  1993. s12 += s22 * 654183;
  1994. s13 -= s22 * 997805;
  1995. s14 += s22 * 136657;
  1996. s15 -= s22 * 683901;
  1997. s22 = 0;
  1998. s9 += s21 * 666643;
  1999. s10 += s21 * 470296;
  2000. s11 += s21 * 654183;
  2001. s12 -= s21 * 997805;
  2002. s13 += s21 * 136657;
  2003. s14 -= s21 * 683901;
  2004. s21 = 0;
  2005. s8 += s20 * 666643;
  2006. s9 += s20 * 470296;
  2007. s10 += s20 * 654183;
  2008. s11 -= s20 * 997805;
  2009. s12 += s20 * 136657;
  2010. s13 -= s20 * 683901;
  2011. s20 = 0;
  2012. s7 += s19 * 666643;
  2013. s8 += s19 * 470296;
  2014. s9 += s19 * 654183;
  2015. s10 -= s19 * 997805;
  2016. s11 += s19 * 136657;
  2017. s12 -= s19 * 683901;
  2018. s19 = 0;
  2019. s6 += s18 * 666643;
  2020. s7 += s18 * 470296;
  2021. s8 += s18 * 654183;
  2022. s9 -= s18 * 997805;
  2023. s10 += s18 * 136657;
  2024. s11 -= s18 * 683901;
  2025. s18 = 0;
  2026. carry6 = (s6 + (1 << 20)) >> 21;
  2027. s7 += carry6;
  2028. s6 -= carry6 << 21;
  2029. carry8 = (s8 + (1 << 20)) >> 21;
  2030. s9 += carry8;
  2031. s8 -= carry8 << 21;
  2032. carry10 = (s10 + (1 << 20)) >> 21;
  2033. s11 += carry10;
  2034. s10 -= carry10 << 21;
  2035. carry12 = (s12 + (1 << 20)) >> 21;
  2036. s13 += carry12;
  2037. s12 -= carry12 << 21;
  2038. carry14 = (s14 + (1 << 20)) >> 21;
  2039. s15 += carry14;
  2040. s14 -= carry14 << 21;
  2041. carry16 = (s16 + (1 << 20)) >> 21;
  2042. s17 += carry16;
  2043. s16 -= carry16 << 21;
  2044. carry7 = (s7 + (1 << 20)) >> 21;
  2045. s8 += carry7;
  2046. s7 -= carry7 << 21;
  2047. carry9 = (s9 + (1 << 20)) >> 21;
  2048. s10 += carry9;
  2049. s9 -= carry9 << 21;
  2050. carry11 = (s11 + (1 << 20)) >> 21;
  2051. s12 += carry11;
  2052. s11 -= carry11 << 21;
  2053. carry13 = (s13 + (1 << 20)) >> 21;
  2054. s14 += carry13;
  2055. s13 -= carry13 << 21;
  2056. carry15 = (s15 + (1 << 20)) >> 21;
  2057. s16 += carry15;
  2058. s15 -= carry15 << 21;
  2059. s5 += s17 * 666643;
  2060. s6 += s17 * 470296;
  2061. s7 += s17 * 654183;
  2062. s8 -= s17 * 997805;
  2063. s9 += s17 * 136657;
  2064. s10 -= s17 * 683901;
  2065. s17 = 0;
  2066. s4 += s16 * 666643;
  2067. s5 += s16 * 470296;
  2068. s6 += s16 * 654183;
  2069. s7 -= s16 * 997805;
  2070. s8 += s16 * 136657;
  2071. s9 -= s16 * 683901;
  2072. s16 = 0;
  2073. s3 += s15 * 666643;
  2074. s4 += s15 * 470296;
  2075. s5 += s15 * 654183;
  2076. s6 -= s15 * 997805;
  2077. s7 += s15 * 136657;
  2078. s8 -= s15 * 683901;
  2079. s15 = 0;
  2080. s2 += s14 * 666643;
  2081. s3 += s14 * 470296;
  2082. s4 += s14 * 654183;
  2083. s5 -= s14 * 997805;
  2084. s6 += s14 * 136657;
  2085. s7 -= s14 * 683901;
  2086. s14 = 0;
  2087. s1 += s13 * 666643;
  2088. s2 += s13 * 470296;
  2089. s3 += s13 * 654183;
  2090. s4 -= s13 * 997805;
  2091. s5 += s13 * 136657;
  2092. s6 -= s13 * 683901;
  2093. s13 = 0;
  2094. s0 += s12 * 666643;
  2095. s1 += s12 * 470296;
  2096. s2 += s12 * 654183;
  2097. s3 -= s12 * 997805;
  2098. s4 += s12 * 136657;
  2099. s5 -= s12 * 683901;
  2100. s12 = 0;
  2101. carry0 = (s0 + (1 << 20)) >> 21;
  2102. s1 += carry0;
  2103. s0 -= carry0 << 21;
  2104. carry2 = (s2 + (1 << 20)) >> 21;
  2105. s3 += carry2;
  2106. s2 -= carry2 << 21;
  2107. carry4 = (s4 + (1 << 20)) >> 21;
  2108. s5 += carry4;
  2109. s4 -= carry4 << 21;
  2110. carry6 = (s6 + (1 << 20)) >> 21;
  2111. s7 += carry6;
  2112. s6 -= carry6 << 21;
  2113. carry8 = (s8 + (1 << 20)) >> 21;
  2114. s9 += carry8;
  2115. s8 -= carry8 << 21;
  2116. carry10 = (s10 + (1 << 20)) >> 21;
  2117. s11 += carry10;
  2118. s10 -= carry10 << 21;
  2119. carry1 = (s1 + (1 << 20)) >> 21;
  2120. s2 += carry1;
  2121. s1 -= carry1 << 21;
  2122. carry3 = (s3 + (1 << 20)) >> 21;
  2123. s4 += carry3;
  2124. s3 -= carry3 << 21;
  2125. carry5 = (s5 + (1 << 20)) >> 21;
  2126. s6 += carry5;
  2127. s5 -= carry5 << 21;
  2128. carry7 = (s7 + (1 << 20)) >> 21;
  2129. s8 += carry7;
  2130. s7 -= carry7 << 21;
  2131. carry9 = (s9 + (1 << 20)) >> 21;
  2132. s10 += carry9;
  2133. s9 -= carry9 << 21;
  2134. carry11 = (s11 + (1 << 20)) >> 21;
  2135. s12 += carry11;
  2136. s11 -= carry11 << 21;
  2137. s0 += s12 * 666643;
  2138. s1 += s12 * 470296;
  2139. s2 += s12 * 654183;
  2140. s3 -= s12 * 997805;
  2141. s4 += s12 * 136657;
  2142. s5 -= s12 * 683901;
  2143. s12 = 0;
  2144. carry0 = s0 >> 21;
  2145. s1 += carry0;
  2146. s0 -= carry0 << 21;
  2147. carry1 = s1 >> 21;
  2148. s2 += carry1;
  2149. s1 -= carry1 << 21;
  2150. carry2 = s2 >> 21;
  2151. s3 += carry2;
  2152. s2 -= carry2 << 21;
  2153. carry3 = s3 >> 21;
  2154. s4 += carry3;
  2155. s3 -= carry3 << 21;
  2156. carry4 = s4 >> 21;
  2157. s5 += carry4;
  2158. s4 -= carry4 << 21;
  2159. carry5 = s5 >> 21;
  2160. s6 += carry5;
  2161. s5 -= carry5 << 21;
  2162. carry6 = s6 >> 21;
  2163. s7 += carry6;
  2164. s6 -= carry6 << 21;
  2165. carry7 = s7 >> 21;
  2166. s8 += carry7;
  2167. s7 -= carry7 << 21;
  2168. carry8 = s8 >> 21;
  2169. s9 += carry8;
  2170. s8 -= carry8 << 21;
  2171. carry9 = s9 >> 21;
  2172. s10 += carry9;
  2173. s9 -= carry9 << 21;
  2174. carry10 = s10 >> 21;
  2175. s11 += carry10;
  2176. s10 -= carry10 << 21;
  2177. carry11 = s11 >> 21;
  2178. s12 += carry11;
  2179. s11 -= carry11 << 21;
  2180. s0 += s12 * 666643;
  2181. s1 += s12 * 470296;
  2182. s2 += s12 * 654183;
  2183. s3 -= s12 * 997805;
  2184. s4 += s12 * 136657;
  2185. s5 -= s12 * 683901;
  2186. s12 = 0;
  2187. carry0 = s0 >> 21;
  2188. s1 += carry0;
  2189. s0 -= carry0 << 21;
  2190. carry1 = s1 >> 21;
  2191. s2 += carry1;
  2192. s1 -= carry1 << 21;
  2193. carry2 = s2 >> 21;
  2194. s3 += carry2;
  2195. s2 -= carry2 << 21;
  2196. carry3 = s3 >> 21;
  2197. s4 += carry3;
  2198. s3 -= carry3 << 21;
  2199. carry4 = s4 >> 21;
  2200. s5 += carry4;
  2201. s4 -= carry4 << 21;
  2202. carry5 = s5 >> 21;
  2203. s6 += carry5;
  2204. s5 -= carry5 << 21;
  2205. carry6 = s6 >> 21;
  2206. s7 += carry6;
  2207. s6 -= carry6 << 21;
  2208. carry7 = s7 >> 21;
  2209. s8 += carry7;
  2210. s7 -= carry7 << 21;
  2211. carry8 = s8 >> 21;
  2212. s9 += carry8;
  2213. s8 -= carry8 << 21;
  2214. carry9 = s9 >> 21;
  2215. s10 += carry9;
  2216. s9 -= carry9 << 21;
  2217. carry10 = s10 >> 21;
  2218. s11 += carry10;
  2219. s10 -= carry10 << 21;
  2220. s[0] = s0 >> 0;
  2221. s[1] = s0 >> 8;
  2222. s[2] = (s0 >> 16) | (s1 << 5);
  2223. s[3] = s1 >> 3;
  2224. s[4] = s1 >> 11;
  2225. s[5] = (s1 >> 19) | (s2 << 2);
  2226. s[6] = s2 >> 6;
  2227. s[7] = (s2 >> 14) | (s3 << 7);
  2228. s[8] = s3 >> 1;
  2229. s[9] = s3 >> 9;
  2230. s[10] = (s3 >> 17) | (s4 << 4);
  2231. s[11] = s4 >> 4;
  2232. s[12] = s4 >> 12;
  2233. s[13] = (s4 >> 20) | (s5 << 1);
  2234. s[14] = s5 >> 7;
  2235. s[15] = (s5 >> 15) | (s6 << 6);
  2236. s[16] = s6 >> 2;
  2237. s[17] = s6 >> 10;
  2238. s[18] = (s6 >> 18) | (s7 << 3);
  2239. s[19] = s7 >> 5;
  2240. s[20] = s7 >> 13;
  2241. s[21] = s8 >> 0;
  2242. s[22] = s8 >> 8;
  2243. s[23] = (s8 >> 16) | (s9 << 5);
  2244. s[24] = s9 >> 3;
  2245. s[25] = s9 >> 11;
  2246. s[26] = (s9 >> 19) | (s10 << 2);
  2247. s[27] = s10 >> 6;
  2248. s[28] = (s10 >> 14) | (s11 << 7);
  2249. s[29] = s11 >> 1;
  2250. s[30] = s11 >> 9;
  2251. s[31] = s11 >> 17;
  2252. }
  2253. // Input:
  2254. // a[0]+256*a[1]+...+256^31*a[31] = a
  2255. // b[0]+256*b[1]+...+256^31*b[31] = b
  2256. // c[0]+256*c[1]+...+256^31*c[31] = c
  2257. //
  2258. // Output:
  2259. // s[0]+256*s[1]+...+256^31*s[31] = (ab+c) mod l
  2260. // where l = 2^252 + 27742317777372353535851937790883648493.
  2261. static void sc_muladd(uint8_t *s, const uint8_t *a, const uint8_t *b,
  2262. const uint8_t *c) {
  2263. int64_t a0 = 2097151 & load_3(a);
  2264. int64_t a1 = 2097151 & (load_4(a + 2) >> 5);
  2265. int64_t a2 = 2097151 & (load_3(a + 5) >> 2);
  2266. int64_t a3 = 2097151 & (load_4(a + 7) >> 7);
  2267. int64_t a4 = 2097151 & (load_4(a + 10) >> 4);
  2268. int64_t a5 = 2097151 & (load_3(a + 13) >> 1);
  2269. int64_t a6 = 2097151 & (load_4(a + 15) >> 6);
  2270. int64_t a7 = 2097151 & (load_3(a + 18) >> 3);
  2271. int64_t a8 = 2097151 & load_3(a + 21);
  2272. int64_t a9 = 2097151 & (load_4(a + 23) >> 5);
  2273. int64_t a10 = 2097151 & (load_3(a + 26) >> 2);
  2274. int64_t a11 = (load_4(a + 28) >> 7);
  2275. int64_t b0 = 2097151 & load_3(b);
  2276. int64_t b1 = 2097151 & (load_4(b + 2) >> 5);
  2277. int64_t b2 = 2097151 & (load_3(b + 5) >> 2);
  2278. int64_t b3 = 2097151 & (load_4(b + 7) >> 7);
  2279. int64_t b4 = 2097151 & (load_4(b + 10) >> 4);
  2280. int64_t b5 = 2097151 & (load_3(b + 13) >> 1);
  2281. int64_t b6 = 2097151 & (load_4(b + 15) >> 6);
  2282. int64_t b7 = 2097151 & (load_3(b + 18) >> 3);
  2283. int64_t b8 = 2097151 & load_3(b + 21);
  2284. int64_t b9 = 2097151 & (load_4(b + 23) >> 5);
  2285. int64_t b10 = 2097151 & (load_3(b + 26) >> 2);
  2286. int64_t b11 = (load_4(b + 28) >> 7);
  2287. int64_t c0 = 2097151 & load_3(c);
  2288. int64_t c1 = 2097151 & (load_4(c + 2) >> 5);
  2289. int64_t c2 = 2097151 & (load_3(c + 5) >> 2);
  2290. int64_t c3 = 2097151 & (load_4(c + 7) >> 7);
  2291. int64_t c4 = 2097151 & (load_4(c + 10) >> 4);
  2292. int64_t c5 = 2097151 & (load_3(c + 13) >> 1);
  2293. int64_t c6 = 2097151 & (load_4(c + 15) >> 6);
  2294. int64_t c7 = 2097151 & (load_3(c + 18) >> 3);
  2295. int64_t c8 = 2097151 & load_3(c + 21);
  2296. int64_t c9 = 2097151 & (load_4(c + 23) >> 5);
  2297. int64_t c10 = 2097151 & (load_3(c + 26) >> 2);
  2298. int64_t c11 = (load_4(c + 28) >> 7);
  2299. int64_t s0;
  2300. int64_t s1;
  2301. int64_t s2;
  2302. int64_t s3;
  2303. int64_t s4;
  2304. int64_t s5;
  2305. int64_t s6;
  2306. int64_t s7;
  2307. int64_t s8;
  2308. int64_t s9;
  2309. int64_t s10;
  2310. int64_t s11;
  2311. int64_t s12;
  2312. int64_t s13;
  2313. int64_t s14;
  2314. int64_t s15;
  2315. int64_t s16;
  2316. int64_t s17;
  2317. int64_t s18;
  2318. int64_t s19;
  2319. int64_t s20;
  2320. int64_t s21;
  2321. int64_t s22;
  2322. int64_t s23;
  2323. int64_t carry0;
  2324. int64_t carry1;
  2325. int64_t carry2;
  2326. int64_t carry3;
  2327. int64_t carry4;
  2328. int64_t carry5;
  2329. int64_t carry6;
  2330. int64_t carry7;
  2331. int64_t carry8;
  2332. int64_t carry9;
  2333. int64_t carry10;
  2334. int64_t carry11;
  2335. int64_t carry12;
  2336. int64_t carry13;
  2337. int64_t carry14;
  2338. int64_t carry15;
  2339. int64_t carry16;
  2340. int64_t carry17;
  2341. int64_t carry18;
  2342. int64_t carry19;
  2343. int64_t carry20;
  2344. int64_t carry21;
  2345. int64_t carry22;
  2346. s0 = c0 + a0 * b0;
  2347. s1 = c1 + a0 * b1 + a1 * b0;
  2348. s2 = c2 + a0 * b2 + a1 * b1 + a2 * b0;
  2349. s3 = c3 + a0 * b3 + a1 * b2 + a2 * b1 + a3 * b0;
  2350. s4 = c4 + a0 * b4 + a1 * b3 + a2 * b2 + a3 * b1 + a4 * b0;
  2351. s5 = c5 + a0 * b5 + a1 * b4 + a2 * b3 + a3 * b2 + a4 * b1 + a5 * b0;
  2352. s6 = c6 + a0 * b6 + a1 * b5 + a2 * b4 + a3 * b3 + a4 * b2 + a5 * b1 + a6 * b0;
  2353. s7 = c7 + a0 * b7 + a1 * b6 + a2 * b5 + a3 * b4 + a4 * b3 + a5 * b2 +
  2354. a6 * b1 + a7 * b0;
  2355. s8 = c8 + a0 * b8 + a1 * b7 + a2 * b6 + a3 * b5 + a4 * b4 + a5 * b3 +
  2356. a6 * b2 + a7 * b1 + a8 * b0;
  2357. s9 = c9 + a0 * b9 + a1 * b8 + a2 * b7 + a3 * b6 + a4 * b5 + a5 * b4 +
  2358. a6 * b3 + a7 * b2 + a8 * b1 + a9 * b0;
  2359. s10 = c10 + a0 * b10 + a1 * b9 + a2 * b8 + a3 * b7 + a4 * b6 + a5 * b5 +
  2360. a6 * b4 + a7 * b3 + a8 * b2 + a9 * b1 + a10 * b0;
  2361. s11 = c11 + a0 * b11 + a1 * b10 + a2 * b9 + a3 * b8 + a4 * b7 + a5 * b6 +
  2362. a6 * b5 + a7 * b4 + a8 * b3 + a9 * b2 + a10 * b1 + a11 * b0;
  2363. s12 = a1 * b11 + a2 * b10 + a3 * b9 + a4 * b8 + a5 * b7 + a6 * b6 + a7 * b5 +
  2364. a8 * b4 + a9 * b3 + a10 * b2 + a11 * b1;
  2365. s13 = a2 * b11 + a3 * b10 + a4 * b9 + a5 * b8 + a6 * b7 + a7 * b6 + a8 * b5 +
  2366. a9 * b4 + a10 * b3 + a11 * b2;
  2367. s14 = a3 * b11 + a4 * b10 + a5 * b9 + a6 * b8 + a7 * b7 + a8 * b6 + a9 * b5 +
  2368. a10 * b4 + a11 * b3;
  2369. s15 = a4 * b11 + a5 * b10 + a6 * b9 + a7 * b8 + a8 * b7 + a9 * b6 + a10 * b5 +
  2370. a11 * b4;
  2371. s16 = a5 * b11 + a6 * b10 + a7 * b9 + a8 * b8 + a9 * b7 + a10 * b6 + a11 * b5;
  2372. s17 = a6 * b11 + a7 * b10 + a8 * b9 + a9 * b8 + a10 * b7 + a11 * b6;
  2373. s18 = a7 * b11 + a8 * b10 + a9 * b9 + a10 * b8 + a11 * b7;
  2374. s19 = a8 * b11 + a9 * b10 + a10 * b9 + a11 * b8;
  2375. s20 = a9 * b11 + a10 * b10 + a11 * b9;
  2376. s21 = a10 * b11 + a11 * b10;
  2377. s22 = a11 * b11;
  2378. s23 = 0;
  2379. carry0 = (s0 + (1 << 20)) >> 21;
  2380. s1 += carry0;
  2381. s0 -= carry0 << 21;
  2382. carry2 = (s2 + (1 << 20)) >> 21;
  2383. s3 += carry2;
  2384. s2 -= carry2 << 21;
  2385. carry4 = (s4 + (1 << 20)) >> 21;
  2386. s5 += carry4;
  2387. s4 -= carry4 << 21;
  2388. carry6 = (s6 + (1 << 20)) >> 21;
  2389. s7 += carry6;
  2390. s6 -= carry6 << 21;
  2391. carry8 = (s8 + (1 << 20)) >> 21;
  2392. s9 += carry8;
  2393. s8 -= carry8 << 21;
  2394. carry10 = (s10 + (1 << 20)) >> 21;
  2395. s11 += carry10;
  2396. s10 -= carry10 << 21;
  2397. carry12 = (s12 + (1 << 20)) >> 21;
  2398. s13 += carry12;
  2399. s12 -= carry12 << 21;
  2400. carry14 = (s14 + (1 << 20)) >> 21;
  2401. s15 += carry14;
  2402. s14 -= carry14 << 21;
  2403. carry16 = (s16 + (1 << 20)) >> 21;
  2404. s17 += carry16;
  2405. s16 -= carry16 << 21;
  2406. carry18 = (s18 + (1 << 20)) >> 21;
  2407. s19 += carry18;
  2408. s18 -= carry18 << 21;
  2409. carry20 = (s20 + (1 << 20)) >> 21;
  2410. s21 += carry20;
  2411. s20 -= carry20 << 21;
  2412. carry22 = (s22 + (1 << 20)) >> 21;
  2413. s23 += carry22;
  2414. s22 -= carry22 << 21;
  2415. carry1 = (s1 + (1 << 20)) >> 21;
  2416. s2 += carry1;
  2417. s1 -= carry1 << 21;
  2418. carry3 = (s3 + (1 << 20)) >> 21;
  2419. s4 += carry3;
  2420. s3 -= carry3 << 21;
  2421. carry5 = (s5 + (1 << 20)) >> 21;
  2422. s6 += carry5;
  2423. s5 -= carry5 << 21;
  2424. carry7 = (s7 + (1 << 20)) >> 21;
  2425. s8 += carry7;
  2426. s7 -= carry7 << 21;
  2427. carry9 = (s9 + (1 << 20)) >> 21;
  2428. s10 += carry9;
  2429. s9 -= carry9 << 21;
  2430. carry11 = (s11 + (1 << 20)) >> 21;
  2431. s12 += carry11;
  2432. s11 -= carry11 << 21;
  2433. carry13 = (s13 + (1 << 20)) >> 21;
  2434. s14 += carry13;
  2435. s13 -= carry13 << 21;
  2436. carry15 = (s15 + (1 << 20)) >> 21;
  2437. s16 += carry15;
  2438. s15 -= carry15 << 21;
  2439. carry17 = (s17 + (1 << 20)) >> 21;
  2440. s18 += carry17;
  2441. s17 -= carry17 << 21;
  2442. carry19 = (s19 + (1 << 20)) >> 21;
  2443. s20 += carry19;
  2444. s19 -= carry19 << 21;
  2445. carry21 = (s21 + (1 << 20)) >> 21;
  2446. s22 += carry21;
  2447. s21 -= carry21 << 21;
  2448. s11 += s23 * 666643;
  2449. s12 += s23 * 470296;
  2450. s13 += s23 * 654183;
  2451. s14 -= s23 * 997805;
  2452. s15 += s23 * 136657;
  2453. s16 -= s23 * 683901;
  2454. s23 = 0;
  2455. s10 += s22 * 666643;
  2456. s11 += s22 * 470296;
  2457. s12 += s22 * 654183;
  2458. s13 -= s22 * 997805;
  2459. s14 += s22 * 136657;
  2460. s15 -= s22 * 683901;
  2461. s22 = 0;
  2462. s9 += s21 * 666643;
  2463. s10 += s21 * 470296;
  2464. s11 += s21 * 654183;
  2465. s12 -= s21 * 997805;
  2466. s13 += s21 * 136657;
  2467. s14 -= s21 * 683901;
  2468. s21 = 0;
  2469. s8 += s20 * 666643;
  2470. s9 += s20 * 470296;
  2471. s10 += s20 * 654183;
  2472. s11 -= s20 * 997805;
  2473. s12 += s20 * 136657;
  2474. s13 -= s20 * 683901;
  2475. s20 = 0;
  2476. s7 += s19 * 666643;
  2477. s8 += s19 * 470296;
  2478. s9 += s19 * 654183;
  2479. s10 -= s19 * 997805;
  2480. s11 += s19 * 136657;
  2481. s12 -= s19 * 683901;
  2482. s19 = 0;
  2483. s6 += s18 * 666643;
  2484. s7 += s18 * 470296;
  2485. s8 += s18 * 654183;
  2486. s9 -= s18 * 997805;
  2487. s10 += s18 * 136657;
  2488. s11 -= s18 * 683901;
  2489. s18 = 0;
  2490. carry6 = (s6 + (1 << 20)) >> 21;
  2491. s7 += carry6;
  2492. s6 -= carry6 << 21;
  2493. carry8 = (s8 + (1 << 20)) >> 21;
  2494. s9 += carry8;
  2495. s8 -= carry8 << 21;
  2496. carry10 = (s10 + (1 << 20)) >> 21;
  2497. s11 += carry10;
  2498. s10 -= carry10 << 21;
  2499. carry12 = (s12 + (1 << 20)) >> 21;
  2500. s13 += carry12;
  2501. s12 -= carry12 << 21;
  2502. carry14 = (s14 + (1 << 20)) >> 21;
  2503. s15 += carry14;
  2504. s14 -= carry14 << 21;
  2505. carry16 = (s16 + (1 << 20)) >> 21;
  2506. s17 += carry16;
  2507. s16 -= carry16 << 21;
  2508. carry7 = (s7 + (1 << 20)) >> 21;
  2509. s8 += carry7;
  2510. s7 -= carry7 << 21;
  2511. carry9 = (s9 + (1 << 20)) >> 21;
  2512. s10 += carry9;
  2513. s9 -= carry9 << 21;
  2514. carry11 = (s11 + (1 << 20)) >> 21;
  2515. s12 += carry11;
  2516. s11 -= carry11 << 21;
  2517. carry13 = (s13 + (1 << 20)) >> 21;
  2518. s14 += carry13;
  2519. s13 -= carry13 << 21;
  2520. carry15 = (s15 + (1 << 20)) >> 21;
  2521. s16 += carry15;
  2522. s15 -= carry15 << 21;
  2523. s5 += s17 * 666643;
  2524. s6 += s17 * 470296;
  2525. s7 += s17 * 654183;
  2526. s8 -= s17 * 997805;
  2527. s9 += s17 * 136657;
  2528. s10 -= s17 * 683901;
  2529. s17 = 0;
  2530. s4 += s16 * 666643;
  2531. s5 += s16 * 470296;
  2532. s6 += s16 * 654183;
  2533. s7 -= s16 * 997805;
  2534. s8 += s16 * 136657;
  2535. s9 -= s16 * 683901;
  2536. s16 = 0;
  2537. s3 += s15 * 666643;
  2538. s4 += s15 * 470296;
  2539. s5 += s15 * 654183;
  2540. s6 -= s15 * 997805;
  2541. s7 += s15 * 136657;
  2542. s8 -= s15 * 683901;
  2543. s15 = 0;
  2544. s2 += s14 * 666643;
  2545. s3 += s14 * 470296;
  2546. s4 += s14 * 654183;
  2547. s5 -= s14 * 997805;
  2548. s6 += s14 * 136657;
  2549. s7 -= s14 * 683901;
  2550. s14 = 0;
  2551. s1 += s13 * 666643;
  2552. s2 += s13 * 470296;
  2553. s3 += s13 * 654183;
  2554. s4 -= s13 * 997805;
  2555. s5 += s13 * 136657;
  2556. s6 -= s13 * 683901;
  2557. s13 = 0;
  2558. s0 += s12 * 666643;
  2559. s1 += s12 * 470296;
  2560. s2 += s12 * 654183;
  2561. s3 -= s12 * 997805;
  2562. s4 += s12 * 136657;
  2563. s5 -= s12 * 683901;
  2564. s12 = 0;
  2565. carry0 = (s0 + (1 << 20)) >> 21;
  2566. s1 += carry0;
  2567. s0 -= carry0 << 21;
  2568. carry2 = (s2 + (1 << 20)) >> 21;
  2569. s3 += carry2;
  2570. s2 -= carry2 << 21;
  2571. carry4 = (s4 + (1 << 20)) >> 21;
  2572. s5 += carry4;
  2573. s4 -= carry4 << 21;
  2574. carry6 = (s6 + (1 << 20)) >> 21;
  2575. s7 += carry6;
  2576. s6 -= carry6 << 21;
  2577. carry8 = (s8 + (1 << 20)) >> 21;
  2578. s9 += carry8;
  2579. s8 -= carry8 << 21;
  2580. carry10 = (s10 + (1 << 20)) >> 21;
  2581. s11 += carry10;
  2582. s10 -= carry10 << 21;
  2583. carry1 = (s1 + (1 << 20)) >> 21;
  2584. s2 += carry1;
  2585. s1 -= carry1 << 21;
  2586. carry3 = (s3 + (1 << 20)) >> 21;
  2587. s4 += carry3;
  2588. s3 -= carry3 << 21;
  2589. carry5 = (s5 + (1 << 20)) >> 21;
  2590. s6 += carry5;
  2591. s5 -= carry5 << 21;
  2592. carry7 = (s7 + (1 << 20)) >> 21;
  2593. s8 += carry7;
  2594. s7 -= carry7 << 21;
  2595. carry9 = (s9 + (1 << 20)) >> 21;
  2596. s10 += carry9;
  2597. s9 -= carry9 << 21;
  2598. carry11 = (s11 + (1 << 20)) >> 21;
  2599. s12 += carry11;
  2600. s11 -= carry11 << 21;
  2601. s0 += s12 * 666643;
  2602. s1 += s12 * 470296;
  2603. s2 += s12 * 654183;
  2604. s3 -= s12 * 997805;
  2605. s4 += s12 * 136657;
  2606. s5 -= s12 * 683901;
  2607. s12 = 0;
  2608. carry0 = s0 >> 21;
  2609. s1 += carry0;
  2610. s0 -= carry0 << 21;
  2611. carry1 = s1 >> 21;
  2612. s2 += carry1;
  2613. s1 -= carry1 << 21;
  2614. carry2 = s2 >> 21;
  2615. s3 += carry2;
  2616. s2 -= carry2 << 21;
  2617. carry3 = s3 >> 21;
  2618. s4 += carry3;
  2619. s3 -= carry3 << 21;
  2620. carry4 = s4 >> 21;
  2621. s5 += carry4;
  2622. s4 -= carry4 << 21;
  2623. carry5 = s5 >> 21;
  2624. s6 += carry5;
  2625. s5 -= carry5 << 21;
  2626. carry6 = s6 >> 21;
  2627. s7 += carry6;
  2628. s6 -= carry6 << 21;
  2629. carry7 = s7 >> 21;
  2630. s8 += carry7;
  2631. s7 -= carry7 << 21;
  2632. carry8 = s8 >> 21;
  2633. s9 += carry8;
  2634. s8 -= carry8 << 21;
  2635. carry9 = s9 >> 21;
  2636. s10 += carry9;
  2637. s9 -= carry9 << 21;
  2638. carry10 = s10 >> 21;
  2639. s11 += carry10;
  2640. s10 -= carry10 << 21;
  2641. carry11 = s11 >> 21;
  2642. s12 += carry11;
  2643. s11 -= carry11 << 21;
  2644. s0 += s12 * 666643;
  2645. s1 += s12 * 470296;
  2646. s2 += s12 * 654183;
  2647. s3 -= s12 * 997805;
  2648. s4 += s12 * 136657;
  2649. s5 -= s12 * 683901;
  2650. s12 = 0;
  2651. carry0 = s0 >> 21;
  2652. s1 += carry0;
  2653. s0 -= carry0 << 21;
  2654. carry1 = s1 >> 21;
  2655. s2 += carry1;
  2656. s1 -= carry1 << 21;
  2657. carry2 = s2 >> 21;
  2658. s3 += carry2;
  2659. s2 -= carry2 << 21;
  2660. carry3 = s3 >> 21;
  2661. s4 += carry3;
  2662. s3 -= carry3 << 21;
  2663. carry4 = s4 >> 21;
  2664. s5 += carry4;
  2665. s4 -= carry4 << 21;
  2666. carry5 = s5 >> 21;
  2667. s6 += carry5;
  2668. s5 -= carry5 << 21;
  2669. carry6 = s6 >> 21;
  2670. s7 += carry6;
  2671. s6 -= carry6 << 21;
  2672. carry7 = s7 >> 21;
  2673. s8 += carry7;
  2674. s7 -= carry7 << 21;
  2675. carry8 = s8 >> 21;
  2676. s9 += carry8;
  2677. s8 -= carry8 << 21;
  2678. carry9 = s9 >> 21;
  2679. s10 += carry9;
  2680. s9 -= carry9 << 21;
  2681. carry10 = s10 >> 21;
  2682. s11 += carry10;
  2683. s10 -= carry10 << 21;
  2684. s[0] = s0 >> 0;
  2685. s[1] = s0 >> 8;
  2686. s[2] = (s0 >> 16) | (s1 << 5);
  2687. s[3] = s1 >> 3;
  2688. s[4] = s1 >> 11;
  2689. s[5] = (s1 >> 19) | (s2 << 2);
  2690. s[6] = s2 >> 6;
  2691. s[7] = (s2 >> 14) | (s3 << 7);
  2692. s[8] = s3 >> 1;
  2693. s[9] = s3 >> 9;
  2694. s[10] = (s3 >> 17) | (s4 << 4);
  2695. s[11] = s4 >> 4;
  2696. s[12] = s4 >> 12;
  2697. s[13] = (s4 >> 20) | (s5 << 1);
  2698. s[14] = s5 >> 7;
  2699. s[15] = (s5 >> 15) | (s6 << 6);
  2700. s[16] = s6 >> 2;
  2701. s[17] = s6 >> 10;
  2702. s[18] = (s6 >> 18) | (s7 << 3);
  2703. s[19] = s7 >> 5;
  2704. s[20] = s7 >> 13;
  2705. s[21] = s8 >> 0;
  2706. s[22] = s8 >> 8;
  2707. s[23] = (s8 >> 16) | (s9 << 5);
  2708. s[24] = s9 >> 3;
  2709. s[25] = s9 >> 11;
  2710. s[26] = (s9 >> 19) | (s10 << 2);
  2711. s[27] = s10 >> 6;
  2712. s[28] = (s10 >> 14) | (s11 << 7);
  2713. s[29] = s11 >> 1;
  2714. s[30] = s11 >> 9;
  2715. s[31] = s11 >> 17;
  2716. }
  2717. void ED25519_keypair(uint8_t out_public_key[32], uint8_t out_private_key[64]) {
  2718. uint8_t seed[32];
  2719. RAND_bytes(seed, 32);
  2720. ED25519_keypair_from_seed(out_public_key, out_private_key, seed);
  2721. }
  2722. int ED25519_sign(uint8_t out_sig[64], const uint8_t *message,
  2723. size_t message_len, const uint8_t private_key[64]) {
  2724. uint8_t az[SHA512_DIGEST_LENGTH];
  2725. SHA512(private_key, 32, az);
  2726. az[0] &= 248;
  2727. az[31] &= 63;
  2728. az[31] |= 64;
  2729. SHA512_CTX hash_ctx;
  2730. SHA512_Init(&hash_ctx);
  2731. SHA512_Update(&hash_ctx, az + 32, 32);
  2732. SHA512_Update(&hash_ctx, message, message_len);
  2733. uint8_t nonce[SHA512_DIGEST_LENGTH];
  2734. SHA512_Final(nonce, &hash_ctx);
  2735. x25519_sc_reduce(nonce);
  2736. ge_p3 R;
  2737. x25519_ge_scalarmult_base(&R, nonce);
  2738. ge_p3_tobytes(out_sig, &R);
  2739. SHA512_Init(&hash_ctx);
  2740. SHA512_Update(&hash_ctx, out_sig, 32);
  2741. SHA512_Update(&hash_ctx, private_key + 32, 32);
  2742. SHA512_Update(&hash_ctx, message, message_len);
  2743. uint8_t hram[SHA512_DIGEST_LENGTH];
  2744. SHA512_Final(hram, &hash_ctx);
  2745. x25519_sc_reduce(hram);
  2746. sc_muladd(out_sig + 32, hram, az, nonce);
  2747. return 1;
  2748. }
  2749. int ED25519_verify(const uint8_t *message, size_t message_len,
  2750. const uint8_t signature[64], const uint8_t public_key[32]) {
  2751. ge_p3 A;
  2752. if ((signature[63] & 224) != 0 ||
  2753. x25519_ge_frombytes_vartime(&A, public_key) != 0) {
  2754. return 0;
  2755. }
  2756. fe_loose t;
  2757. fe_neg(&t, &A.X);
  2758. fe_carry(&A.X, &t);
  2759. fe_neg(&t, &A.T);
  2760. fe_carry(&A.T, &t);
  2761. uint8_t pkcopy[32];
  2762. OPENSSL_memcpy(pkcopy, public_key, 32);
  2763. uint8_t rcopy[32];
  2764. OPENSSL_memcpy(rcopy, signature, 32);
  2765. union {
  2766. uint64_t u64[4];
  2767. uint8_t u8[32];
  2768. } scopy;
  2769. OPENSSL_memcpy(&scopy.u8[0], signature + 32, 32);
  2770. // https://tools.ietf.org/html/rfc8032#section-5.1.7 requires that s be in
  2771. // the range [0, order) in order to prevent signature malleability.
  2772. // kOrder is the order of Curve25519 in little-endian form.
  2773. static const uint64_t kOrder[4] = {
  2774. UINT64_C(0x5812631a5cf5d3ed),
  2775. UINT64_C(0x14def9dea2f79cd6),
  2776. 0,
  2777. UINT64_C(0x1000000000000000),
  2778. };
  2779. for (size_t i = 3;; i--) {
  2780. if (scopy.u64[i] > kOrder[i]) {
  2781. return 0;
  2782. } else if (scopy.u64[i] < kOrder[i]) {
  2783. break;
  2784. } else if (i == 0) {
  2785. return 0;
  2786. }
  2787. }
  2788. SHA512_CTX hash_ctx;
  2789. SHA512_Init(&hash_ctx);
  2790. SHA512_Update(&hash_ctx, signature, 32);
  2791. SHA512_Update(&hash_ctx, public_key, 32);
  2792. SHA512_Update(&hash_ctx, message, message_len);
  2793. uint8_t h[SHA512_DIGEST_LENGTH];
  2794. SHA512_Final(h, &hash_ctx);
  2795. x25519_sc_reduce(h);
  2796. ge_p2 R;
  2797. ge_double_scalarmult_vartime(&R, h, &A, scopy.u8);
  2798. uint8_t rcheck[32];
  2799. x25519_ge_tobytes(rcheck, &R);
  2800. return CRYPTO_memcmp(rcheck, rcopy, sizeof(rcheck)) == 0;
  2801. }
  2802. void ED25519_keypair_from_seed(uint8_t out_public_key[32],
  2803. uint8_t out_private_key[64],
  2804. const uint8_t seed[32]) {
  2805. uint8_t az[SHA512_DIGEST_LENGTH];
  2806. SHA512(seed, 32, az);
  2807. az[0] &= 248;
  2808. az[31] &= 63;
  2809. az[31] |= 64;
  2810. ge_p3 A;
  2811. x25519_ge_scalarmult_base(&A, az);
  2812. ge_p3_tobytes(out_public_key, &A);
  2813. OPENSSL_memcpy(out_private_key, seed, 32);
  2814. OPENSSL_memcpy(out_private_key + 32, out_public_key, 32);
  2815. }
  2816. static void x25519_scalar_mult_generic(uint8_t out[32],
  2817. const uint8_t scalar[32],
  2818. const uint8_t point[32]) {
  2819. fe x1, x2, z2, x3, z3, tmp0, tmp1;
  2820. fe_loose x2l, z2l, x3l, tmp0l, tmp1l;
  2821. uint8_t e[32];
  2822. OPENSSL_memcpy(e, scalar, 32);
  2823. e[0] &= 248;
  2824. e[31] &= 127;
  2825. e[31] |= 64;
  2826. // The following implementation was transcribed to Coq and proven to
  2827. // correspond to unary scalar multiplication in affine coordinates given that
  2828. // x1 != 0 is the x coordinate of some point on the curve. It was also checked
  2829. // in Coq that doing a ladderstep with x1 = x3 = 0 gives z2' = z3' = 0, and z2
  2830. // = z3 = 0 gives z2' = z3' = 0. The statement was quantified over the
  2831. // underlying field, so it applies to Curve25519 itself and the quadratic
  2832. // twist of Curve25519. It was not proven in Coq that prime-field arithmetic
  2833. // correctly simulates extension-field arithmetic on prime-field values.
  2834. // The decoding of the byte array representation of e was not considered.
  2835. // Specification of Montgomery curves in affine coordinates:
  2836. // <https://github.com/mit-plv/fiat-crypto/blob/2456d821825521f7e03e65882cc3521795b0320f/src/Spec/MontgomeryCurve.v#L27>
  2837. // Proof that these form a group that is isomorphic to a Weierstrass curve:
  2838. // <https://github.com/mit-plv/fiat-crypto/blob/2456d821825521f7e03e65882cc3521795b0320f/src/Curves/Montgomery/AffineProofs.v#L35>
  2839. // Coq transcription and correctness proof of the loop (where scalarbits=255):
  2840. // <https://github.com/mit-plv/fiat-crypto/blob/2456d821825521f7e03e65882cc3521795b0320f/src/Curves/Montgomery/XZ.v#L118>
  2841. // <https://github.com/mit-plv/fiat-crypto/blob/2456d821825521f7e03e65882cc3521795b0320f/src/Curves/Montgomery/XZProofs.v#L278>
  2842. // preconditions: 0 <= e < 2^255 (not necessarily e < order), fe_invert(0) = 0
  2843. fe_frombytes(&x1, point);
  2844. fe_1(&x2);
  2845. fe_0(&z2);
  2846. fe_copy(&x3, &x1);
  2847. fe_1(&z3);
  2848. unsigned swap = 0;
  2849. int pos;
  2850. for (pos = 254; pos >= 0; --pos) {
  2851. // loop invariant as of right before the test, for the case where x1 != 0:
  2852. // pos >= -1; if z2 = 0 then x2 is nonzero; if z3 = 0 then x3 is nonzero
  2853. // let r := e >> (pos+1) in the following equalities of projective points:
  2854. // to_xz (r*P) === if swap then (x3, z3) else (x2, z2)
  2855. // to_xz ((r+1)*P) === if swap then (x2, z2) else (x3, z3)
  2856. // x1 is the nonzero x coordinate of the nonzero point (r*P-(r+1)*P)
  2857. unsigned b = 1 & (e[pos / 8] >> (pos & 7));
  2858. swap ^= b;
  2859. fe_cswap(&x2, &x3, swap);
  2860. fe_cswap(&z2, &z3, swap);
  2861. swap = b;
  2862. // Coq transcription of ladderstep formula (called from transcribed loop):
  2863. // <https://github.com/mit-plv/fiat-crypto/blob/2456d821825521f7e03e65882cc3521795b0320f/src/Curves/Montgomery/XZ.v#L89>
  2864. // <https://github.com/mit-plv/fiat-crypto/blob/2456d821825521f7e03e65882cc3521795b0320f/src/Curves/Montgomery/XZProofs.v#L131>
  2865. // x1 != 0 <https://github.com/mit-plv/fiat-crypto/blob/2456d821825521f7e03e65882cc3521795b0320f/src/Curves/Montgomery/XZProofs.v#L217>
  2866. // x1 = 0 <https://github.com/mit-plv/fiat-crypto/blob/2456d821825521f7e03e65882cc3521795b0320f/src/Curves/Montgomery/XZProofs.v#L147>
  2867. fe_sub(&tmp0l, &x3, &z3);
  2868. fe_sub(&tmp1l, &x2, &z2);
  2869. fe_add(&x2l, &x2, &z2);
  2870. fe_add(&z2l, &x3, &z3);
  2871. fe_mul_tll(&z3, &tmp0l, &x2l);
  2872. fe_mul_tll(&z2, &z2l, &tmp1l);
  2873. fe_sq_tl(&tmp0, &tmp1l);
  2874. fe_sq_tl(&tmp1, &x2l);
  2875. fe_add(&x3l, &z3, &z2);
  2876. fe_sub(&z2l, &z3, &z2);
  2877. fe_mul_ttt(&x2, &tmp1, &tmp0);
  2878. fe_sub(&tmp1l, &tmp1, &tmp0);
  2879. fe_sq_tl(&z2, &z2l);
  2880. fe_mul121666(&z3, &tmp1l);
  2881. fe_sq_tl(&x3, &x3l);
  2882. fe_add(&tmp0l, &tmp0, &z3);
  2883. fe_mul_ttt(&z3, &x1, &z2);
  2884. fe_mul_tll(&z2, &tmp1l, &tmp0l);
  2885. }
  2886. // here pos=-1, so r=e, so to_xz (e*P) === if swap then (x3, z3) else (x2, z2)
  2887. fe_cswap(&x2, &x3, swap);
  2888. fe_cswap(&z2, &z3, swap);
  2889. fe_invert(&z2, &z2);
  2890. fe_mul_ttt(&x2, &x2, &z2);
  2891. fe_tobytes(out, &x2);
  2892. }
  2893. static void x25519_scalar_mult(uint8_t out[32], const uint8_t scalar[32],
  2894. const uint8_t point[32]) {
  2895. #if defined(BORINGSSL_X25519_NEON)
  2896. if (CRYPTO_is_NEON_capable()) {
  2897. x25519_NEON(out, scalar, point);
  2898. return;
  2899. }
  2900. #endif
  2901. x25519_scalar_mult_generic(out, scalar, point);
  2902. }
  2903. void X25519_keypair(uint8_t out_public_value[32], uint8_t out_private_key[32]) {
  2904. RAND_bytes(out_private_key, 32);
  2905. // All X25519 implementations should decode scalars correctly (see
  2906. // https://tools.ietf.org/html/rfc7748#section-5). However, if an
  2907. // implementation doesn't then it might interoperate with random keys a
  2908. // fraction of the time because they'll, randomly, happen to be correctly
  2909. // formed.
  2910. //
  2911. // Thus we do the opposite of the masking here to make sure that our private
  2912. // keys are never correctly masked and so, hopefully, any incorrect
  2913. // implementations are deterministically broken.
  2914. //
  2915. // This does not affect security because, although we're throwing away
  2916. // entropy, a valid implementation of scalarmult should throw away the exact
  2917. // same bits anyway.
  2918. out_private_key[0] |= 7;
  2919. out_private_key[31] &= 63;
  2920. out_private_key[31] |= 128;
  2921. X25519_public_from_private(out_public_value, out_private_key);
  2922. }
  2923. int X25519(uint8_t out_shared_key[32], const uint8_t private_key[32],
  2924. const uint8_t peer_public_value[32]) {
  2925. static const uint8_t kZeros[32] = {0};
  2926. x25519_scalar_mult(out_shared_key, private_key, peer_public_value);
  2927. // The all-zero output results when the input is a point of small order.
  2928. return CRYPTO_memcmp(kZeros, out_shared_key, 32) != 0;
  2929. }
  2930. void X25519_public_from_private(uint8_t out_public_value[32],
  2931. const uint8_t private_key[32]) {
  2932. #if defined(BORINGSSL_X25519_NEON)
  2933. if (CRYPTO_is_NEON_capable()) {
  2934. static const uint8_t kMongomeryBasePoint[32] = {9};
  2935. x25519_NEON(out_public_value, private_key, kMongomeryBasePoint);
  2936. return;
  2937. }
  2938. #endif
  2939. uint8_t e[32];
  2940. OPENSSL_memcpy(e, private_key, 32);
  2941. e[0] &= 248;
  2942. e[31] &= 127;
  2943. e[31] |= 64;
  2944. ge_p3 A;
  2945. x25519_ge_scalarmult_base(&A, e);
  2946. // We only need the u-coordinate of the curve25519 point. The map is
  2947. // u=(y+1)/(1-y). Since y=Y/Z, this gives u=(Z+Y)/(Z-Y).
  2948. fe_loose zplusy, zminusy;
  2949. fe zminusy_inv;
  2950. fe_add(&zplusy, &A.Z, &A.Y);
  2951. fe_sub(&zminusy, &A.Z, &A.Y);
  2952. fe_loose_invert(&zminusy_inv, &zminusy);
  2953. fe_mul_tlt(&zminusy_inv, &zplusy, &zminusy_inv);
  2954. fe_tobytes(out_public_value, &zminusy_inv);
  2955. }