dh.c 99 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087
  1. /* dh.c
  2. *
  3. * Copyright (C) 2006-2021 wolfSSL Inc.
  4. *
  5. * This file is part of wolfSSL.
  6. *
  7. * wolfSSL is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * wolfSSL is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
  20. */
  21. #ifdef HAVE_CONFIG_H
  22. #include <config.h>
  23. #endif
  24. #include <wolfssl/wolfcrypt/settings.h>
  25. #ifndef NO_DH
  26. #if defined(HAVE_FIPS) && \
  27. defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)
  28. /* set NO_WRAPPERS before headers, use direct internal f()s not wrappers */
  29. #define FIPS_NO_WRAPPERS
  30. #ifdef USE_WINDOWS_API
  31. #pragma code_seg(".fipsA$m")
  32. #pragma const_seg(".fipsB$m")
  33. #endif
  34. #endif
  35. #include <wolfssl/wolfcrypt/dh.h>
  36. #include <wolfssl/wolfcrypt/error-crypt.h>
  37. #include <wolfssl/wolfcrypt/logging.h>
  38. #ifdef WOLFSSL_HAVE_SP_DH
  39. #include <wolfssl/wolfcrypt/sp.h>
  40. #endif
  41. #ifdef NO_INLINE
  42. #include <wolfssl/wolfcrypt/misc.h>
  43. #else
  44. #define WOLFSSL_MISC_INCLUDED
  45. #include <wolfcrypt/src/misc.c>
  46. #endif
  47. /*
  48. Possible DH enable options:
  49. * NO_RSA: Overall control of DH default: on (not defined)
  50. * WOLFSSL_OLD_PRIME_CHECK: Disables the new prime number check. It does not
  51. directly effect this file, but it does speed up DH
  52. removing the testing. It is not recommended to
  53. disable the prime checking. default: off
  54. */
  55. #if !defined(USER_MATH_LIB) && !defined(WOLFSSL_DH_CONST)
  56. #include <math.h>
  57. #define XPOW(x,y) pow((x),(y))
  58. #define XLOG(x) log((x))
  59. #else
  60. /* user's own math lib */
  61. #endif
  62. #ifdef HAVE_FFDHE_2048
  63. static const byte dh_ffdhe2048_p[] = {
  64. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  65. 0xAD, 0xF8, 0x54, 0x58, 0xA2, 0xBB, 0x4A, 0x9A,
  66. 0xAF, 0xDC, 0x56, 0x20, 0x27, 0x3D, 0x3C, 0xF1,
  67. 0xD8, 0xB9, 0xC5, 0x83, 0xCE, 0x2D, 0x36, 0x95,
  68. 0xA9, 0xE1, 0x36, 0x41, 0x14, 0x64, 0x33, 0xFB,
  69. 0xCC, 0x93, 0x9D, 0xCE, 0x24, 0x9B, 0x3E, 0xF9,
  70. 0x7D, 0x2F, 0xE3, 0x63, 0x63, 0x0C, 0x75, 0xD8,
  71. 0xF6, 0x81, 0xB2, 0x02, 0xAE, 0xC4, 0x61, 0x7A,
  72. 0xD3, 0xDF, 0x1E, 0xD5, 0xD5, 0xFD, 0x65, 0x61,
  73. 0x24, 0x33, 0xF5, 0x1F, 0x5F, 0x06, 0x6E, 0xD0,
  74. 0x85, 0x63, 0x65, 0x55, 0x3D, 0xED, 0x1A, 0xF3,
  75. 0xB5, 0x57, 0x13, 0x5E, 0x7F, 0x57, 0xC9, 0x35,
  76. 0x98, 0x4F, 0x0C, 0x70, 0xE0, 0xE6, 0x8B, 0x77,
  77. 0xE2, 0xA6, 0x89, 0xDA, 0xF3, 0xEF, 0xE8, 0x72,
  78. 0x1D, 0xF1, 0x58, 0xA1, 0x36, 0xAD, 0xE7, 0x35,
  79. 0x30, 0xAC, 0xCA, 0x4F, 0x48, 0x3A, 0x79, 0x7A,
  80. 0xBC, 0x0A, 0xB1, 0x82, 0xB3, 0x24, 0xFB, 0x61,
  81. 0xD1, 0x08, 0xA9, 0x4B, 0xB2, 0xC8, 0xE3, 0xFB,
  82. 0xB9, 0x6A, 0xDA, 0xB7, 0x60, 0xD7, 0xF4, 0x68,
  83. 0x1D, 0x4F, 0x42, 0xA3, 0xDE, 0x39, 0x4D, 0xF4,
  84. 0xAE, 0x56, 0xED, 0xE7, 0x63, 0x72, 0xBB, 0x19,
  85. 0x0B, 0x07, 0xA7, 0xC8, 0xEE, 0x0A, 0x6D, 0x70,
  86. 0x9E, 0x02, 0xFC, 0xE1, 0xCD, 0xF7, 0xE2, 0xEC,
  87. 0xC0, 0x34, 0x04, 0xCD, 0x28, 0x34, 0x2F, 0x61,
  88. 0x91, 0x72, 0xFE, 0x9C, 0xE9, 0x85, 0x83, 0xFF,
  89. 0x8E, 0x4F, 0x12, 0x32, 0xEE, 0xF2, 0x81, 0x83,
  90. 0xC3, 0xFE, 0x3B, 0x1B, 0x4C, 0x6F, 0xAD, 0x73,
  91. 0x3B, 0xB5, 0xFC, 0xBC, 0x2E, 0xC2, 0x20, 0x05,
  92. 0xC5, 0x8E, 0xF1, 0x83, 0x7D, 0x16, 0x83, 0xB2,
  93. 0xC6, 0xF3, 0x4A, 0x26, 0xC1, 0xB2, 0xEF, 0xFA,
  94. 0x88, 0x6B, 0x42, 0x38, 0x61, 0x28, 0x5C, 0x97,
  95. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
  96. };
  97. static const byte dh_ffdhe2048_g[] = { 0x02 };
  98. #ifdef HAVE_FFDHE_Q
  99. static const byte dh_ffdhe2048_q[] = {
  100. 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  101. 0xD6, 0xFC, 0x2A, 0x2C, 0x51, 0x5D, 0xA5, 0x4D,
  102. 0x57, 0xEE, 0x2B, 0x10, 0x13, 0x9E, 0x9E, 0x78,
  103. 0xEC, 0x5C, 0xE2, 0xC1, 0xE7, 0x16, 0x9B, 0x4A,
  104. 0xD4, 0xF0, 0x9B, 0x20, 0x8A, 0x32, 0x19, 0xFD,
  105. 0xE6, 0x49, 0xCE, 0xE7, 0x12, 0x4D, 0x9F, 0x7C,
  106. 0xBE, 0x97, 0xF1, 0xB1, 0xB1, 0x86, 0x3A, 0xEC,
  107. 0x7B, 0x40, 0xD9, 0x01, 0x57, 0x62, 0x30, 0xBD,
  108. 0x69, 0xEF, 0x8F, 0x6A, 0xEA, 0xFE, 0xB2, 0xB0,
  109. 0x92, 0x19, 0xFA, 0x8F, 0xAF, 0x83, 0x37, 0x68,
  110. 0x42, 0xB1, 0xB2, 0xAA, 0x9E, 0xF6, 0x8D, 0x79,
  111. 0xDA, 0xAB, 0x89, 0xAF, 0x3F, 0xAB, 0xE4, 0x9A,
  112. 0xCC, 0x27, 0x86, 0x38, 0x70, 0x73, 0x45, 0xBB,
  113. 0xF1, 0x53, 0x44, 0xED, 0x79, 0xF7, 0xF4, 0x39,
  114. 0x0E, 0xF8, 0xAC, 0x50, 0x9B, 0x56, 0xF3, 0x9A,
  115. 0x98, 0x56, 0x65, 0x27, 0xA4, 0x1D, 0x3C, 0xBD,
  116. 0x5E, 0x05, 0x58, 0xC1, 0x59, 0x92, 0x7D, 0xB0,
  117. 0xE8, 0x84, 0x54, 0xA5, 0xD9, 0x64, 0x71, 0xFD,
  118. 0xDC, 0xB5, 0x6D, 0x5B, 0xB0, 0x6B, 0xFA, 0x34,
  119. 0x0E, 0xA7, 0xA1, 0x51, 0xEF, 0x1C, 0xA6, 0xFA,
  120. 0x57, 0x2B, 0x76, 0xF3, 0xB1, 0xB9, 0x5D, 0x8C,
  121. 0x85, 0x83, 0xD3, 0xE4, 0x77, 0x05, 0x36, 0xB8,
  122. 0x4F, 0x01, 0x7E, 0x70, 0xE6, 0xFB, 0xF1, 0x76,
  123. 0x60, 0x1A, 0x02, 0x66, 0x94, 0x1A, 0x17, 0xB0,
  124. 0xC8, 0xB9, 0x7F, 0x4E, 0x74, 0xC2, 0xC1, 0xFF,
  125. 0xC7, 0x27, 0x89, 0x19, 0x77, 0x79, 0x40, 0xC1,
  126. 0xE1, 0xFF, 0x1D, 0x8D, 0xA6, 0x37, 0xD6, 0xB9,
  127. 0x9D, 0xDA, 0xFE, 0x5E, 0x17, 0x61, 0x10, 0x02,
  128. 0xE2, 0xC7, 0x78, 0xC1, 0xBE, 0x8B, 0x41, 0xD9,
  129. 0x63, 0x79, 0xA5, 0x13, 0x60, 0xD9, 0x77, 0xFD,
  130. 0x44, 0x35, 0xA1, 0x1C, 0x30, 0x94, 0x2E, 0x4B,
  131. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
  132. };
  133. #endif /* HAVE_FFDHE_Q */
  134. #ifdef HAVE_PUBLIC_FFDHE
  135. const DhParams* wc_Dh_ffdhe2048_Get(void)
  136. {
  137. static const DhParams ffdhe2048 = {
  138. #ifdef HAVE_FFDHE_Q
  139. dh_ffdhe2048_q, sizeof(dh_ffdhe2048_q),
  140. #endif /* HAVE_FFDHE_Q */
  141. dh_ffdhe2048_p, sizeof(dh_ffdhe2048_p),
  142. dh_ffdhe2048_g, sizeof(dh_ffdhe2048_g)
  143. };
  144. return &ffdhe2048;
  145. }
  146. #endif
  147. #endif
  148. #ifdef HAVE_FFDHE_3072
  149. static const byte dh_ffdhe3072_p[] = {
  150. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  151. 0xAD, 0xF8, 0x54, 0x58, 0xA2, 0xBB, 0x4A, 0x9A,
  152. 0xAF, 0xDC, 0x56, 0x20, 0x27, 0x3D, 0x3C, 0xF1,
  153. 0xD8, 0xB9, 0xC5, 0x83, 0xCE, 0x2D, 0x36, 0x95,
  154. 0xA9, 0xE1, 0x36, 0x41, 0x14, 0x64, 0x33, 0xFB,
  155. 0xCC, 0x93, 0x9D, 0xCE, 0x24, 0x9B, 0x3E, 0xF9,
  156. 0x7D, 0x2F, 0xE3, 0x63, 0x63, 0x0C, 0x75, 0xD8,
  157. 0xF6, 0x81, 0xB2, 0x02, 0xAE, 0xC4, 0x61, 0x7A,
  158. 0xD3, 0xDF, 0x1E, 0xD5, 0xD5, 0xFD, 0x65, 0x61,
  159. 0x24, 0x33, 0xF5, 0x1F, 0x5F, 0x06, 0x6E, 0xD0,
  160. 0x85, 0x63, 0x65, 0x55, 0x3D, 0xED, 0x1A, 0xF3,
  161. 0xB5, 0x57, 0x13, 0x5E, 0x7F, 0x57, 0xC9, 0x35,
  162. 0x98, 0x4F, 0x0C, 0x70, 0xE0, 0xE6, 0x8B, 0x77,
  163. 0xE2, 0xA6, 0x89, 0xDA, 0xF3, 0xEF, 0xE8, 0x72,
  164. 0x1D, 0xF1, 0x58, 0xA1, 0x36, 0xAD, 0xE7, 0x35,
  165. 0x30, 0xAC, 0xCA, 0x4F, 0x48, 0x3A, 0x79, 0x7A,
  166. 0xBC, 0x0A, 0xB1, 0x82, 0xB3, 0x24, 0xFB, 0x61,
  167. 0xD1, 0x08, 0xA9, 0x4B, 0xB2, 0xC8, 0xE3, 0xFB,
  168. 0xB9, 0x6A, 0xDA, 0xB7, 0x60, 0xD7, 0xF4, 0x68,
  169. 0x1D, 0x4F, 0x42, 0xA3, 0xDE, 0x39, 0x4D, 0xF4,
  170. 0xAE, 0x56, 0xED, 0xE7, 0x63, 0x72, 0xBB, 0x19,
  171. 0x0B, 0x07, 0xA7, 0xC8, 0xEE, 0x0A, 0x6D, 0x70,
  172. 0x9E, 0x02, 0xFC, 0xE1, 0xCD, 0xF7, 0xE2, 0xEC,
  173. 0xC0, 0x34, 0x04, 0xCD, 0x28, 0x34, 0x2F, 0x61,
  174. 0x91, 0x72, 0xFE, 0x9C, 0xE9, 0x85, 0x83, 0xFF,
  175. 0x8E, 0x4F, 0x12, 0x32, 0xEE, 0xF2, 0x81, 0x83,
  176. 0xC3, 0xFE, 0x3B, 0x1B, 0x4C, 0x6F, 0xAD, 0x73,
  177. 0x3B, 0xB5, 0xFC, 0xBC, 0x2E, 0xC2, 0x20, 0x05,
  178. 0xC5, 0x8E, 0xF1, 0x83, 0x7D, 0x16, 0x83, 0xB2,
  179. 0xC6, 0xF3, 0x4A, 0x26, 0xC1, 0xB2, 0xEF, 0xFA,
  180. 0x88, 0x6B, 0x42, 0x38, 0x61, 0x1F, 0xCF, 0xDC,
  181. 0xDE, 0x35, 0x5B, 0x3B, 0x65, 0x19, 0x03, 0x5B,
  182. 0xBC, 0x34, 0xF4, 0xDE, 0xF9, 0x9C, 0x02, 0x38,
  183. 0x61, 0xB4, 0x6F, 0xC9, 0xD6, 0xE6, 0xC9, 0x07,
  184. 0x7A, 0xD9, 0x1D, 0x26, 0x91, 0xF7, 0xF7, 0xEE,
  185. 0x59, 0x8C, 0xB0, 0xFA, 0xC1, 0x86, 0xD9, 0x1C,
  186. 0xAE, 0xFE, 0x13, 0x09, 0x85, 0x13, 0x92, 0x70,
  187. 0xB4, 0x13, 0x0C, 0x93, 0xBC, 0x43, 0x79, 0x44,
  188. 0xF4, 0xFD, 0x44, 0x52, 0xE2, 0xD7, 0x4D, 0xD3,
  189. 0x64, 0xF2, 0xE2, 0x1E, 0x71, 0xF5, 0x4B, 0xFF,
  190. 0x5C, 0xAE, 0x82, 0xAB, 0x9C, 0x9D, 0xF6, 0x9E,
  191. 0xE8, 0x6D, 0x2B, 0xC5, 0x22, 0x36, 0x3A, 0x0D,
  192. 0xAB, 0xC5, 0x21, 0x97, 0x9B, 0x0D, 0xEA, 0xDA,
  193. 0x1D, 0xBF, 0x9A, 0x42, 0xD5, 0xC4, 0x48, 0x4E,
  194. 0x0A, 0xBC, 0xD0, 0x6B, 0xFA, 0x53, 0xDD, 0xEF,
  195. 0x3C, 0x1B, 0x20, 0xEE, 0x3F, 0xD5, 0x9D, 0x7C,
  196. 0x25, 0xE4, 0x1D, 0x2B, 0x66, 0xC6, 0x2E, 0x37,
  197. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
  198. };
  199. static const byte dh_ffdhe3072_g[] = { 0x02 };
  200. #ifdef HAVE_FFDHE_Q
  201. static const byte dh_ffdhe3072_q[] = {
  202. 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  203. 0xD6, 0xFC, 0x2A, 0x2C, 0x51, 0x5D, 0xA5, 0x4D,
  204. 0x57, 0xEE, 0x2B, 0x10, 0x13, 0x9E, 0x9E, 0x78,
  205. 0xEC, 0x5C, 0xE2, 0xC1, 0xE7, 0x16, 0x9B, 0x4A,
  206. 0xD4, 0xF0, 0x9B, 0x20, 0x8A, 0x32, 0x19, 0xFD,
  207. 0xE6, 0x49, 0xCE, 0xE7, 0x12, 0x4D, 0x9F, 0x7C,
  208. 0xBE, 0x97, 0xF1, 0xB1, 0xB1, 0x86, 0x3A, 0xEC,
  209. 0x7B, 0x40, 0xD9, 0x01, 0x57, 0x62, 0x30, 0xBD,
  210. 0x69, 0xEF, 0x8F, 0x6A, 0xEA, 0xFE, 0xB2, 0xB0,
  211. 0x92, 0x19, 0xFA, 0x8F, 0xAF, 0x83, 0x37, 0x68,
  212. 0x42, 0xB1, 0xB2, 0xAA, 0x9E, 0xF6, 0x8D, 0x79,
  213. 0xDA, 0xAB, 0x89, 0xAF, 0x3F, 0xAB, 0xE4, 0x9A,
  214. 0xCC, 0x27, 0x86, 0x38, 0x70, 0x73, 0x45, 0xBB,
  215. 0xF1, 0x53, 0x44, 0xED, 0x79, 0xF7, 0xF4, 0x39,
  216. 0x0E, 0xF8, 0xAC, 0x50, 0x9B, 0x56, 0xF3, 0x9A,
  217. 0x98, 0x56, 0x65, 0x27, 0xA4, 0x1D, 0x3C, 0xBD,
  218. 0x5E, 0x05, 0x58, 0xC1, 0x59, 0x92, 0x7D, 0xB0,
  219. 0xE8, 0x84, 0x54, 0xA5, 0xD9, 0x64, 0x71, 0xFD,
  220. 0xDC, 0xB5, 0x6D, 0x5B, 0xB0, 0x6B, 0xFA, 0x34,
  221. 0x0E, 0xA7, 0xA1, 0x51, 0xEF, 0x1C, 0xA6, 0xFA,
  222. 0x57, 0x2B, 0x76, 0xF3, 0xB1, 0xB9, 0x5D, 0x8C,
  223. 0x85, 0x83, 0xD3, 0xE4, 0x77, 0x05, 0x36, 0xB8,
  224. 0x4F, 0x01, 0x7E, 0x70, 0xE6, 0xFB, 0xF1, 0x76,
  225. 0x60, 0x1A, 0x02, 0x66, 0x94, 0x1A, 0x17, 0xB0,
  226. 0xC8, 0xB9, 0x7F, 0x4E, 0x74, 0xC2, 0xC1, 0xFF,
  227. 0xC7, 0x27, 0x89, 0x19, 0x77, 0x79, 0x40, 0xC1,
  228. 0xE1, 0xFF, 0x1D, 0x8D, 0xA6, 0x37, 0xD6, 0xB9,
  229. 0x9D, 0xDA, 0xFE, 0x5E, 0x17, 0x61, 0x10, 0x02,
  230. 0xE2, 0xC7, 0x78, 0xC1, 0xBE, 0x8B, 0x41, 0xD9,
  231. 0x63, 0x79, 0xA5, 0x13, 0x60, 0xD9, 0x77, 0xFD,
  232. 0x44, 0x35, 0xA1, 0x1C, 0x30, 0x8F, 0xE7, 0xEE,
  233. 0x6F, 0x1A, 0xAD, 0x9D, 0xB2, 0x8C, 0x81, 0xAD,
  234. 0xDE, 0x1A, 0x7A, 0x6F, 0x7C, 0xCE, 0x01, 0x1C,
  235. 0x30, 0xDA, 0x37, 0xE4, 0xEB, 0x73, 0x64, 0x83,
  236. 0xBD, 0x6C, 0x8E, 0x93, 0x48, 0xFB, 0xFB, 0xF7,
  237. 0x2C, 0xC6, 0x58, 0x7D, 0x60, 0xC3, 0x6C, 0x8E,
  238. 0x57, 0x7F, 0x09, 0x84, 0xC2, 0x89, 0xC9, 0x38,
  239. 0x5A, 0x09, 0x86, 0x49, 0xDE, 0x21, 0xBC, 0xA2,
  240. 0x7A, 0x7E, 0xA2, 0x29, 0x71, 0x6B, 0xA6, 0xE9,
  241. 0xB2, 0x79, 0x71, 0x0F, 0x38, 0xFA, 0xA5, 0xFF,
  242. 0xAE, 0x57, 0x41, 0x55, 0xCE, 0x4E, 0xFB, 0x4F,
  243. 0x74, 0x36, 0x95, 0xE2, 0x91, 0x1B, 0x1D, 0x06,
  244. 0xD5, 0xE2, 0x90, 0xCB, 0xCD, 0x86, 0xF5, 0x6D,
  245. 0x0E, 0xDF, 0xCD, 0x21, 0x6A, 0xE2, 0x24, 0x27,
  246. 0x05, 0x5E, 0x68, 0x35, 0xFD, 0x29, 0xEE, 0xF7,
  247. 0x9E, 0x0D, 0x90, 0x77, 0x1F, 0xEA, 0xCE, 0xBE,
  248. 0x12, 0xF2, 0x0E, 0x95, 0xB3, 0x63, 0x17, 0x1B,
  249. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
  250. };
  251. #endif /* HAVE_FFDHE_Q */
  252. #ifdef HAVE_PUBLIC_FFDHE
  253. const DhParams* wc_Dh_ffdhe3072_Get(void)
  254. {
  255. static const DhParams ffdhe3072 = {
  256. #ifdef HAVE_FFDHE_Q
  257. dh_ffdhe3072_q, sizeof(dh_ffdhe3072_q),
  258. #endif /* HAVE_FFDHE_Q */
  259. dh_ffdhe3072_p, sizeof(dh_ffdhe3072_p),
  260. dh_ffdhe3072_g, sizeof(dh_ffdhe3072_g)
  261. };
  262. return &ffdhe3072;
  263. }
  264. #endif
  265. #endif
  266. #ifdef HAVE_FFDHE_4096
  267. static const byte dh_ffdhe4096_p[] = {
  268. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  269. 0xAD, 0xF8, 0x54, 0x58, 0xA2, 0xBB, 0x4A, 0x9A,
  270. 0xAF, 0xDC, 0x56, 0x20, 0x27, 0x3D, 0x3C, 0xF1,
  271. 0xD8, 0xB9, 0xC5, 0x83, 0xCE, 0x2D, 0x36, 0x95,
  272. 0xA9, 0xE1, 0x36, 0x41, 0x14, 0x64, 0x33, 0xFB,
  273. 0xCC, 0x93, 0x9D, 0xCE, 0x24, 0x9B, 0x3E, 0xF9,
  274. 0x7D, 0x2F, 0xE3, 0x63, 0x63, 0x0C, 0x75, 0xD8,
  275. 0xF6, 0x81, 0xB2, 0x02, 0xAE, 0xC4, 0x61, 0x7A,
  276. 0xD3, 0xDF, 0x1E, 0xD5, 0xD5, 0xFD, 0x65, 0x61,
  277. 0x24, 0x33, 0xF5, 0x1F, 0x5F, 0x06, 0x6E, 0xD0,
  278. 0x85, 0x63, 0x65, 0x55, 0x3D, 0xED, 0x1A, 0xF3,
  279. 0xB5, 0x57, 0x13, 0x5E, 0x7F, 0x57, 0xC9, 0x35,
  280. 0x98, 0x4F, 0x0C, 0x70, 0xE0, 0xE6, 0x8B, 0x77,
  281. 0xE2, 0xA6, 0x89, 0xDA, 0xF3, 0xEF, 0xE8, 0x72,
  282. 0x1D, 0xF1, 0x58, 0xA1, 0x36, 0xAD, 0xE7, 0x35,
  283. 0x30, 0xAC, 0xCA, 0x4F, 0x48, 0x3A, 0x79, 0x7A,
  284. 0xBC, 0x0A, 0xB1, 0x82, 0xB3, 0x24, 0xFB, 0x61,
  285. 0xD1, 0x08, 0xA9, 0x4B, 0xB2, 0xC8, 0xE3, 0xFB,
  286. 0xB9, 0x6A, 0xDA, 0xB7, 0x60, 0xD7, 0xF4, 0x68,
  287. 0x1D, 0x4F, 0x42, 0xA3, 0xDE, 0x39, 0x4D, 0xF4,
  288. 0xAE, 0x56, 0xED, 0xE7, 0x63, 0x72, 0xBB, 0x19,
  289. 0x0B, 0x07, 0xA7, 0xC8, 0xEE, 0x0A, 0x6D, 0x70,
  290. 0x9E, 0x02, 0xFC, 0xE1, 0xCD, 0xF7, 0xE2, 0xEC,
  291. 0xC0, 0x34, 0x04, 0xCD, 0x28, 0x34, 0x2F, 0x61,
  292. 0x91, 0x72, 0xFE, 0x9C, 0xE9, 0x85, 0x83, 0xFF,
  293. 0x8E, 0x4F, 0x12, 0x32, 0xEE, 0xF2, 0x81, 0x83,
  294. 0xC3, 0xFE, 0x3B, 0x1B, 0x4C, 0x6F, 0xAD, 0x73,
  295. 0x3B, 0xB5, 0xFC, 0xBC, 0x2E, 0xC2, 0x20, 0x05,
  296. 0xC5, 0x8E, 0xF1, 0x83, 0x7D, 0x16, 0x83, 0xB2,
  297. 0xC6, 0xF3, 0x4A, 0x26, 0xC1, 0xB2, 0xEF, 0xFA,
  298. 0x88, 0x6B, 0x42, 0x38, 0x61, 0x1F, 0xCF, 0xDC,
  299. 0xDE, 0x35, 0x5B, 0x3B, 0x65, 0x19, 0x03, 0x5B,
  300. 0xBC, 0x34, 0xF4, 0xDE, 0xF9, 0x9C, 0x02, 0x38,
  301. 0x61, 0xB4, 0x6F, 0xC9, 0xD6, 0xE6, 0xC9, 0x07,
  302. 0x7A, 0xD9, 0x1D, 0x26, 0x91, 0xF7, 0xF7, 0xEE,
  303. 0x59, 0x8C, 0xB0, 0xFA, 0xC1, 0x86, 0xD9, 0x1C,
  304. 0xAE, 0xFE, 0x13, 0x09, 0x85, 0x13, 0x92, 0x70,
  305. 0xB4, 0x13, 0x0C, 0x93, 0xBC, 0x43, 0x79, 0x44,
  306. 0xF4, 0xFD, 0x44, 0x52, 0xE2, 0xD7, 0x4D, 0xD3,
  307. 0x64, 0xF2, 0xE2, 0x1E, 0x71, 0xF5, 0x4B, 0xFF,
  308. 0x5C, 0xAE, 0x82, 0xAB, 0x9C, 0x9D, 0xF6, 0x9E,
  309. 0xE8, 0x6D, 0x2B, 0xC5, 0x22, 0x36, 0x3A, 0x0D,
  310. 0xAB, 0xC5, 0x21, 0x97, 0x9B, 0x0D, 0xEA, 0xDA,
  311. 0x1D, 0xBF, 0x9A, 0x42, 0xD5, 0xC4, 0x48, 0x4E,
  312. 0x0A, 0xBC, 0xD0, 0x6B, 0xFA, 0x53, 0xDD, 0xEF,
  313. 0x3C, 0x1B, 0x20, 0xEE, 0x3F, 0xD5, 0x9D, 0x7C,
  314. 0x25, 0xE4, 0x1D, 0x2B, 0x66, 0x9E, 0x1E, 0xF1,
  315. 0x6E, 0x6F, 0x52, 0xC3, 0x16, 0x4D, 0xF4, 0xFB,
  316. 0x79, 0x30, 0xE9, 0xE4, 0xE5, 0x88, 0x57, 0xB6,
  317. 0xAC, 0x7D, 0x5F, 0x42, 0xD6, 0x9F, 0x6D, 0x18,
  318. 0x77, 0x63, 0xCF, 0x1D, 0x55, 0x03, 0x40, 0x04,
  319. 0x87, 0xF5, 0x5B, 0xA5, 0x7E, 0x31, 0xCC, 0x7A,
  320. 0x71, 0x35, 0xC8, 0x86, 0xEF, 0xB4, 0x31, 0x8A,
  321. 0xED, 0x6A, 0x1E, 0x01, 0x2D, 0x9E, 0x68, 0x32,
  322. 0xA9, 0x07, 0x60, 0x0A, 0x91, 0x81, 0x30, 0xC4,
  323. 0x6D, 0xC7, 0x78, 0xF9, 0x71, 0xAD, 0x00, 0x38,
  324. 0x09, 0x29, 0x99, 0xA3, 0x33, 0xCB, 0x8B, 0x7A,
  325. 0x1A, 0x1D, 0xB9, 0x3D, 0x71, 0x40, 0x00, 0x3C,
  326. 0x2A, 0x4E, 0xCE, 0xA9, 0xF9, 0x8D, 0x0A, 0xCC,
  327. 0x0A, 0x82, 0x91, 0xCD, 0xCE, 0xC9, 0x7D, 0xCF,
  328. 0x8E, 0xC9, 0xB5, 0x5A, 0x7F, 0x88, 0xA4, 0x6B,
  329. 0x4D, 0xB5, 0xA8, 0x51, 0xF4, 0x41, 0x82, 0xE1,
  330. 0xC6, 0x8A, 0x00, 0x7E, 0x5E, 0x65, 0x5F, 0x6A,
  331. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
  332. };
  333. static const byte dh_ffdhe4096_g[] = { 0x02 };
  334. #ifdef HAVE_FFDHE_Q
  335. static const byte dh_ffdhe4096_q[] = {
  336. 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  337. 0xD6, 0xFC, 0x2A, 0x2C, 0x51, 0x5D, 0xA5, 0x4D,
  338. 0x57, 0xEE, 0x2B, 0x10, 0x13, 0x9E, 0x9E, 0x78,
  339. 0xEC, 0x5C, 0xE2, 0xC1, 0xE7, 0x16, 0x9B, 0x4A,
  340. 0xD4, 0xF0, 0x9B, 0x20, 0x8A, 0x32, 0x19, 0xFD,
  341. 0xE6, 0x49, 0xCE, 0xE7, 0x12, 0x4D, 0x9F, 0x7C,
  342. 0xBE, 0x97, 0xF1, 0xB1, 0xB1, 0x86, 0x3A, 0xEC,
  343. 0x7B, 0x40, 0xD9, 0x01, 0x57, 0x62, 0x30, 0xBD,
  344. 0x69, 0xEF, 0x8F, 0x6A, 0xEA, 0xFE, 0xB2, 0xB0,
  345. 0x92, 0x19, 0xFA, 0x8F, 0xAF, 0x83, 0x37, 0x68,
  346. 0x42, 0xB1, 0xB2, 0xAA, 0x9E, 0xF6, 0x8D, 0x79,
  347. 0xDA, 0xAB, 0x89, 0xAF, 0x3F, 0xAB, 0xE4, 0x9A,
  348. 0xCC, 0x27, 0x86, 0x38, 0x70, 0x73, 0x45, 0xBB,
  349. 0xF1, 0x53, 0x44, 0xED, 0x79, 0xF7, 0xF4, 0x39,
  350. 0x0E, 0xF8, 0xAC, 0x50, 0x9B, 0x56, 0xF3, 0x9A,
  351. 0x98, 0x56, 0x65, 0x27, 0xA4, 0x1D, 0x3C, 0xBD,
  352. 0x5E, 0x05, 0x58, 0xC1, 0x59, 0x92, 0x7D, 0xB0,
  353. 0xE8, 0x84, 0x54, 0xA5, 0xD9, 0x64, 0x71, 0xFD,
  354. 0xDC, 0xB5, 0x6D, 0x5B, 0xB0, 0x6B, 0xFA, 0x34,
  355. 0x0E, 0xA7, 0xA1, 0x51, 0xEF, 0x1C, 0xA6, 0xFA,
  356. 0x57, 0x2B, 0x76, 0xF3, 0xB1, 0xB9, 0x5D, 0x8C,
  357. 0x85, 0x83, 0xD3, 0xE4, 0x77, 0x05, 0x36, 0xB8,
  358. 0x4F, 0x01, 0x7E, 0x70, 0xE6, 0xFB, 0xF1, 0x76,
  359. 0x60, 0x1A, 0x02, 0x66, 0x94, 0x1A, 0x17, 0xB0,
  360. 0xC8, 0xB9, 0x7F, 0x4E, 0x74, 0xC2, 0xC1, 0xFF,
  361. 0xC7, 0x27, 0x89, 0x19, 0x77, 0x79, 0x40, 0xC1,
  362. 0xE1, 0xFF, 0x1D, 0x8D, 0xA6, 0x37, 0xD6, 0xB9,
  363. 0x9D, 0xDA, 0xFE, 0x5E, 0x17, 0x61, 0x10, 0x02,
  364. 0xE2, 0xC7, 0x78, 0xC1, 0xBE, 0x8B, 0x41, 0xD9,
  365. 0x63, 0x79, 0xA5, 0x13, 0x60, 0xD9, 0x77, 0xFD,
  366. 0x44, 0x35, 0xA1, 0x1C, 0x30, 0x8F, 0xE7, 0xEE,
  367. 0x6F, 0x1A, 0xAD, 0x9D, 0xB2, 0x8C, 0x81, 0xAD,
  368. 0xDE, 0x1A, 0x7A, 0x6F, 0x7C, 0xCE, 0x01, 0x1C,
  369. 0x30, 0xDA, 0x37, 0xE4, 0xEB, 0x73, 0x64, 0x83,
  370. 0xBD, 0x6C, 0x8E, 0x93, 0x48, 0xFB, 0xFB, 0xF7,
  371. 0x2C, 0xC6, 0x58, 0x7D, 0x60, 0xC3, 0x6C, 0x8E,
  372. 0x57, 0x7F, 0x09, 0x84, 0xC2, 0x89, 0xC9, 0x38,
  373. 0x5A, 0x09, 0x86, 0x49, 0xDE, 0x21, 0xBC, 0xA2,
  374. 0x7A, 0x7E, 0xA2, 0x29, 0x71, 0x6B, 0xA6, 0xE9,
  375. 0xB2, 0x79, 0x71, 0x0F, 0x38, 0xFA, 0xA5, 0xFF,
  376. 0xAE, 0x57, 0x41, 0x55, 0xCE, 0x4E, 0xFB, 0x4F,
  377. 0x74, 0x36, 0x95, 0xE2, 0x91, 0x1B, 0x1D, 0x06,
  378. 0xD5, 0xE2, 0x90, 0xCB, 0xCD, 0x86, 0xF5, 0x6D,
  379. 0x0E, 0xDF, 0xCD, 0x21, 0x6A, 0xE2, 0x24, 0x27,
  380. 0x05, 0x5E, 0x68, 0x35, 0xFD, 0x29, 0xEE, 0xF7,
  381. 0x9E, 0x0D, 0x90, 0x77, 0x1F, 0xEA, 0xCE, 0xBE,
  382. 0x12, 0xF2, 0x0E, 0x95, 0xB3, 0x4F, 0x0F, 0x78,
  383. 0xB7, 0x37, 0xA9, 0x61, 0x8B, 0x26, 0xFA, 0x7D,
  384. 0xBC, 0x98, 0x74, 0xF2, 0x72, 0xC4, 0x2B, 0xDB,
  385. 0x56, 0x3E, 0xAF, 0xA1, 0x6B, 0x4F, 0xB6, 0x8C,
  386. 0x3B, 0xB1, 0xE7, 0x8E, 0xAA, 0x81, 0xA0, 0x02,
  387. 0x43, 0xFA, 0xAD, 0xD2, 0xBF, 0x18, 0xE6, 0x3D,
  388. 0x38, 0x9A, 0xE4, 0x43, 0x77, 0xDA, 0x18, 0xC5,
  389. 0x76, 0xB5, 0x0F, 0x00, 0x96, 0xCF, 0x34, 0x19,
  390. 0x54, 0x83, 0xB0, 0x05, 0x48, 0xC0, 0x98, 0x62,
  391. 0x36, 0xE3, 0xBC, 0x7C, 0xB8, 0xD6, 0x80, 0x1C,
  392. 0x04, 0x94, 0xCC, 0xD1, 0x99, 0xE5, 0xC5, 0xBD,
  393. 0x0D, 0x0E, 0xDC, 0x9E, 0xB8, 0xA0, 0x00, 0x1E,
  394. 0x15, 0x27, 0x67, 0x54, 0xFC, 0xC6, 0x85, 0x66,
  395. 0x05, 0x41, 0x48, 0xE6, 0xE7, 0x64, 0xBE, 0xE7,
  396. 0xC7, 0x64, 0xDA, 0xAD, 0x3F, 0xC4, 0x52, 0x35,
  397. 0xA6, 0xDA, 0xD4, 0x28, 0xFA, 0x20, 0xC1, 0x70,
  398. 0xE3, 0x45, 0x00, 0x3F, 0x2F, 0x32, 0xAF, 0xB5,
  399. 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
  400. };
  401. #endif /* HAVE_FFDHE_Q */
  402. #ifdef HAVE_PUBLIC_FFDHE
  403. const DhParams* wc_Dh_ffdhe4096_Get(void)
  404. {
  405. static const DhParams ffdhe4096 = {
  406. #ifdef HAVE_FFDHE_Q
  407. dh_ffdhe4096_q, sizeof(dh_ffdhe4096_q),
  408. #endif /* HAVE_FFDHE_Q */
  409. dh_ffdhe4096_p, sizeof(dh_ffdhe4096_p),
  410. dh_ffdhe4096_g, sizeof(dh_ffdhe4096_g)
  411. };
  412. return &ffdhe4096;
  413. }
  414. #endif
  415. #endif
  416. #ifdef HAVE_FFDHE_6144
  417. static const byte dh_ffdhe6144_p[] = {
  418. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  419. 0xAD, 0xF8, 0x54, 0x58, 0xA2, 0xBB, 0x4A, 0x9A,
  420. 0xAF, 0xDC, 0x56, 0x20, 0x27, 0x3D, 0x3C, 0xF1,
  421. 0xD8, 0xB9, 0xC5, 0x83, 0xCE, 0x2D, 0x36, 0x95,
  422. 0xA9, 0xE1, 0x36, 0x41, 0x14, 0x64, 0x33, 0xFB,
  423. 0xCC, 0x93, 0x9D, 0xCE, 0x24, 0x9B, 0x3E, 0xF9,
  424. 0x7D, 0x2F, 0xE3, 0x63, 0x63, 0x0C, 0x75, 0xD8,
  425. 0xF6, 0x81, 0xB2, 0x02, 0xAE, 0xC4, 0x61, 0x7A,
  426. 0xD3, 0xDF, 0x1E, 0xD5, 0xD5, 0xFD, 0x65, 0x61,
  427. 0x24, 0x33, 0xF5, 0x1F, 0x5F, 0x06, 0x6E, 0xD0,
  428. 0x85, 0x63, 0x65, 0x55, 0x3D, 0xED, 0x1A, 0xF3,
  429. 0xB5, 0x57, 0x13, 0x5E, 0x7F, 0x57, 0xC9, 0x35,
  430. 0x98, 0x4F, 0x0C, 0x70, 0xE0, 0xE6, 0x8B, 0x77,
  431. 0xE2, 0xA6, 0x89, 0xDA, 0xF3, 0xEF, 0xE8, 0x72,
  432. 0x1D, 0xF1, 0x58, 0xA1, 0x36, 0xAD, 0xE7, 0x35,
  433. 0x30, 0xAC, 0xCA, 0x4F, 0x48, 0x3A, 0x79, 0x7A,
  434. 0xBC, 0x0A, 0xB1, 0x82, 0xB3, 0x24, 0xFB, 0x61,
  435. 0xD1, 0x08, 0xA9, 0x4B, 0xB2, 0xC8, 0xE3, 0xFB,
  436. 0xB9, 0x6A, 0xDA, 0xB7, 0x60, 0xD7, 0xF4, 0x68,
  437. 0x1D, 0x4F, 0x42, 0xA3, 0xDE, 0x39, 0x4D, 0xF4,
  438. 0xAE, 0x56, 0xED, 0xE7, 0x63, 0x72, 0xBB, 0x19,
  439. 0x0B, 0x07, 0xA7, 0xC8, 0xEE, 0x0A, 0x6D, 0x70,
  440. 0x9E, 0x02, 0xFC, 0xE1, 0xCD, 0xF7, 0xE2, 0xEC,
  441. 0xC0, 0x34, 0x04, 0xCD, 0x28, 0x34, 0x2F, 0x61,
  442. 0x91, 0x72, 0xFE, 0x9C, 0xE9, 0x85, 0x83, 0xFF,
  443. 0x8E, 0x4F, 0x12, 0x32, 0xEE, 0xF2, 0x81, 0x83,
  444. 0xC3, 0xFE, 0x3B, 0x1B, 0x4C, 0x6F, 0xAD, 0x73,
  445. 0x3B, 0xB5, 0xFC, 0xBC, 0x2E, 0xC2, 0x20, 0x05,
  446. 0xC5, 0x8E, 0xF1, 0x83, 0x7D, 0x16, 0x83, 0xB2,
  447. 0xC6, 0xF3, 0x4A, 0x26, 0xC1, 0xB2, 0xEF, 0xFA,
  448. 0x88, 0x6B, 0x42, 0x38, 0x61, 0x1F, 0xCF, 0xDC,
  449. 0xDE, 0x35, 0x5B, 0x3B, 0x65, 0x19, 0x03, 0x5B,
  450. 0xBC, 0x34, 0xF4, 0xDE, 0xF9, 0x9C, 0x02, 0x38,
  451. 0x61, 0xB4, 0x6F, 0xC9, 0xD6, 0xE6, 0xC9, 0x07,
  452. 0x7A, 0xD9, 0x1D, 0x26, 0x91, 0xF7, 0xF7, 0xEE,
  453. 0x59, 0x8C, 0xB0, 0xFA, 0xC1, 0x86, 0xD9, 0x1C,
  454. 0xAE, 0xFE, 0x13, 0x09, 0x85, 0x13, 0x92, 0x70,
  455. 0xB4, 0x13, 0x0C, 0x93, 0xBC, 0x43, 0x79, 0x44,
  456. 0xF4, 0xFD, 0x44, 0x52, 0xE2, 0xD7, 0x4D, 0xD3,
  457. 0x64, 0xF2, 0xE2, 0x1E, 0x71, 0xF5, 0x4B, 0xFF,
  458. 0x5C, 0xAE, 0x82, 0xAB, 0x9C, 0x9D, 0xF6, 0x9E,
  459. 0xE8, 0x6D, 0x2B, 0xC5, 0x22, 0x36, 0x3A, 0x0D,
  460. 0xAB, 0xC5, 0x21, 0x97, 0x9B, 0x0D, 0xEA, 0xDA,
  461. 0x1D, 0xBF, 0x9A, 0x42, 0xD5, 0xC4, 0x48, 0x4E,
  462. 0x0A, 0xBC, 0xD0, 0x6B, 0xFA, 0x53, 0xDD, 0xEF,
  463. 0x3C, 0x1B, 0x20, 0xEE, 0x3F, 0xD5, 0x9D, 0x7C,
  464. 0x25, 0xE4, 0x1D, 0x2B, 0x66, 0x9E, 0x1E, 0xF1,
  465. 0x6E, 0x6F, 0x52, 0xC3, 0x16, 0x4D, 0xF4, 0xFB,
  466. 0x79, 0x30, 0xE9, 0xE4, 0xE5, 0x88, 0x57, 0xB6,
  467. 0xAC, 0x7D, 0x5F, 0x42, 0xD6, 0x9F, 0x6D, 0x18,
  468. 0x77, 0x63, 0xCF, 0x1D, 0x55, 0x03, 0x40, 0x04,
  469. 0x87, 0xF5, 0x5B, 0xA5, 0x7E, 0x31, 0xCC, 0x7A,
  470. 0x71, 0x35, 0xC8, 0x86, 0xEF, 0xB4, 0x31, 0x8A,
  471. 0xED, 0x6A, 0x1E, 0x01, 0x2D, 0x9E, 0x68, 0x32,
  472. 0xA9, 0x07, 0x60, 0x0A, 0x91, 0x81, 0x30, 0xC4,
  473. 0x6D, 0xC7, 0x78, 0xF9, 0x71, 0xAD, 0x00, 0x38,
  474. 0x09, 0x29, 0x99, 0xA3, 0x33, 0xCB, 0x8B, 0x7A,
  475. 0x1A, 0x1D, 0xB9, 0x3D, 0x71, 0x40, 0x00, 0x3C,
  476. 0x2A, 0x4E, 0xCE, 0xA9, 0xF9, 0x8D, 0x0A, 0xCC,
  477. 0x0A, 0x82, 0x91, 0xCD, 0xCE, 0xC9, 0x7D, 0xCF,
  478. 0x8E, 0xC9, 0xB5, 0x5A, 0x7F, 0x88, 0xA4, 0x6B,
  479. 0x4D, 0xB5, 0xA8, 0x51, 0xF4, 0x41, 0x82, 0xE1,
  480. 0xC6, 0x8A, 0x00, 0x7E, 0x5E, 0x0D, 0xD9, 0x02,
  481. 0x0B, 0xFD, 0x64, 0xB6, 0x45, 0x03, 0x6C, 0x7A,
  482. 0x4E, 0x67, 0x7D, 0x2C, 0x38, 0x53, 0x2A, 0x3A,
  483. 0x23, 0xBA, 0x44, 0x42, 0xCA, 0xF5, 0x3E, 0xA6,
  484. 0x3B, 0xB4, 0x54, 0x32, 0x9B, 0x76, 0x24, 0xC8,
  485. 0x91, 0x7B, 0xDD, 0x64, 0xB1, 0xC0, 0xFD, 0x4C,
  486. 0xB3, 0x8E, 0x8C, 0x33, 0x4C, 0x70, 0x1C, 0x3A,
  487. 0xCD, 0xAD, 0x06, 0x57, 0xFC, 0xCF, 0xEC, 0x71,
  488. 0x9B, 0x1F, 0x5C, 0x3E, 0x4E, 0x46, 0x04, 0x1F,
  489. 0x38, 0x81, 0x47, 0xFB, 0x4C, 0xFD, 0xB4, 0x77,
  490. 0xA5, 0x24, 0x71, 0xF7, 0xA9, 0xA9, 0x69, 0x10,
  491. 0xB8, 0x55, 0x32, 0x2E, 0xDB, 0x63, 0x40, 0xD8,
  492. 0xA0, 0x0E, 0xF0, 0x92, 0x35, 0x05, 0x11, 0xE3,
  493. 0x0A, 0xBE, 0xC1, 0xFF, 0xF9, 0xE3, 0xA2, 0x6E,
  494. 0x7F, 0xB2, 0x9F, 0x8C, 0x18, 0x30, 0x23, 0xC3,
  495. 0x58, 0x7E, 0x38, 0xDA, 0x00, 0x77, 0xD9, 0xB4,
  496. 0x76, 0x3E, 0x4E, 0x4B, 0x94, 0xB2, 0xBB, 0xC1,
  497. 0x94, 0xC6, 0x65, 0x1E, 0x77, 0xCA, 0xF9, 0x92,
  498. 0xEE, 0xAA, 0xC0, 0x23, 0x2A, 0x28, 0x1B, 0xF6,
  499. 0xB3, 0xA7, 0x39, 0xC1, 0x22, 0x61, 0x16, 0x82,
  500. 0x0A, 0xE8, 0xDB, 0x58, 0x47, 0xA6, 0x7C, 0xBE,
  501. 0xF9, 0xC9, 0x09, 0x1B, 0x46, 0x2D, 0x53, 0x8C,
  502. 0xD7, 0x2B, 0x03, 0x74, 0x6A, 0xE7, 0x7F, 0x5E,
  503. 0x62, 0x29, 0x2C, 0x31, 0x15, 0x62, 0xA8, 0x46,
  504. 0x50, 0x5D, 0xC8, 0x2D, 0xB8, 0x54, 0x33, 0x8A,
  505. 0xE4, 0x9F, 0x52, 0x35, 0xC9, 0x5B, 0x91, 0x17,
  506. 0x8C, 0xCF, 0x2D, 0xD5, 0xCA, 0xCE, 0xF4, 0x03,
  507. 0xEC, 0x9D, 0x18, 0x10, 0xC6, 0x27, 0x2B, 0x04,
  508. 0x5B, 0x3B, 0x71, 0xF9, 0xDC, 0x6B, 0x80, 0xD6,
  509. 0x3F, 0xDD, 0x4A, 0x8E, 0x9A, 0xDB, 0x1E, 0x69,
  510. 0x62, 0xA6, 0x95, 0x26, 0xD4, 0x31, 0x61, 0xC1,
  511. 0xA4, 0x1D, 0x57, 0x0D, 0x79, 0x38, 0xDA, 0xD4,
  512. 0xA4, 0x0E, 0x32, 0x9C, 0xD0, 0xE4, 0x0E, 0x65,
  513. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
  514. };
  515. static const byte dh_ffdhe6144_g[] = { 0x02 };
  516. #ifdef HAVE_FFDHE_Q
  517. static const byte dh_ffdhe6144_q[] = {
  518. 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  519. 0xD6, 0xFC, 0x2A, 0x2C, 0x51, 0x5D, 0xA5, 0x4D,
  520. 0x57, 0xEE, 0x2B, 0x10, 0x13, 0x9E, 0x9E, 0x78,
  521. 0xEC, 0x5C, 0xE2, 0xC1, 0xE7, 0x16, 0x9B, 0x4A,
  522. 0xD4, 0xF0, 0x9B, 0x20, 0x8A, 0x32, 0x19, 0xFD,
  523. 0xE6, 0x49, 0xCE, 0xE7, 0x12, 0x4D, 0x9F, 0x7C,
  524. 0xBE, 0x97, 0xF1, 0xB1, 0xB1, 0x86, 0x3A, 0xEC,
  525. 0x7B, 0x40, 0xD9, 0x01, 0x57, 0x62, 0x30, 0xBD,
  526. 0x69, 0xEF, 0x8F, 0x6A, 0xEA, 0xFE, 0xB2, 0xB0,
  527. 0x92, 0x19, 0xFA, 0x8F, 0xAF, 0x83, 0x37, 0x68,
  528. 0x42, 0xB1, 0xB2, 0xAA, 0x9E, 0xF6, 0x8D, 0x79,
  529. 0xDA, 0xAB, 0x89, 0xAF, 0x3F, 0xAB, 0xE4, 0x9A,
  530. 0xCC, 0x27, 0x86, 0x38, 0x70, 0x73, 0x45, 0xBB,
  531. 0xF1, 0x53, 0x44, 0xED, 0x79, 0xF7, 0xF4, 0x39,
  532. 0x0E, 0xF8, 0xAC, 0x50, 0x9B, 0x56, 0xF3, 0x9A,
  533. 0x98, 0x56, 0x65, 0x27, 0xA4, 0x1D, 0x3C, 0xBD,
  534. 0x5E, 0x05, 0x58, 0xC1, 0x59, 0x92, 0x7D, 0xB0,
  535. 0xE8, 0x84, 0x54, 0xA5, 0xD9, 0x64, 0x71, 0xFD,
  536. 0xDC, 0xB5, 0x6D, 0x5B, 0xB0, 0x6B, 0xFA, 0x34,
  537. 0x0E, 0xA7, 0xA1, 0x51, 0xEF, 0x1C, 0xA6, 0xFA,
  538. 0x57, 0x2B, 0x76, 0xF3, 0xB1, 0xB9, 0x5D, 0x8C,
  539. 0x85, 0x83, 0xD3, 0xE4, 0x77, 0x05, 0x36, 0xB8,
  540. 0x4F, 0x01, 0x7E, 0x70, 0xE6, 0xFB, 0xF1, 0x76,
  541. 0x60, 0x1A, 0x02, 0x66, 0x94, 0x1A, 0x17, 0xB0,
  542. 0xC8, 0xB9, 0x7F, 0x4E, 0x74, 0xC2, 0xC1, 0xFF,
  543. 0xC7, 0x27, 0x89, 0x19, 0x77, 0x79, 0x40, 0xC1,
  544. 0xE1, 0xFF, 0x1D, 0x8D, 0xA6, 0x37, 0xD6, 0xB9,
  545. 0x9D, 0xDA, 0xFE, 0x5E, 0x17, 0x61, 0x10, 0x02,
  546. 0xE2, 0xC7, 0x78, 0xC1, 0xBE, 0x8B, 0x41, 0xD9,
  547. 0x63, 0x79, 0xA5, 0x13, 0x60, 0xD9, 0x77, 0xFD,
  548. 0x44, 0x35, 0xA1, 0x1C, 0x30, 0x8F, 0xE7, 0xEE,
  549. 0x6F, 0x1A, 0xAD, 0x9D, 0xB2, 0x8C, 0x81, 0xAD,
  550. 0xDE, 0x1A, 0x7A, 0x6F, 0x7C, 0xCE, 0x01, 0x1C,
  551. 0x30, 0xDA, 0x37, 0xE4, 0xEB, 0x73, 0x64, 0x83,
  552. 0xBD, 0x6C, 0x8E, 0x93, 0x48, 0xFB, 0xFB, 0xF7,
  553. 0x2C, 0xC6, 0x58, 0x7D, 0x60, 0xC3, 0x6C, 0x8E,
  554. 0x57, 0x7F, 0x09, 0x84, 0xC2, 0x89, 0xC9, 0x38,
  555. 0x5A, 0x09, 0x86, 0x49, 0xDE, 0x21, 0xBC, 0xA2,
  556. 0x7A, 0x7E, 0xA2, 0x29, 0x71, 0x6B, 0xA6, 0xE9,
  557. 0xB2, 0x79, 0x71, 0x0F, 0x38, 0xFA, 0xA5, 0xFF,
  558. 0xAE, 0x57, 0x41, 0x55, 0xCE, 0x4E, 0xFB, 0x4F,
  559. 0x74, 0x36, 0x95, 0xE2, 0x91, 0x1B, 0x1D, 0x06,
  560. 0xD5, 0xE2, 0x90, 0xCB, 0xCD, 0x86, 0xF5, 0x6D,
  561. 0x0E, 0xDF, 0xCD, 0x21, 0x6A, 0xE2, 0x24, 0x27,
  562. 0x05, 0x5E, 0x68, 0x35, 0xFD, 0x29, 0xEE, 0xF7,
  563. 0x9E, 0x0D, 0x90, 0x77, 0x1F, 0xEA, 0xCE, 0xBE,
  564. 0x12, 0xF2, 0x0E, 0x95, 0xB3, 0x4F, 0x0F, 0x78,
  565. 0xB7, 0x37, 0xA9, 0x61, 0x8B, 0x26, 0xFA, 0x7D,
  566. 0xBC, 0x98, 0x74, 0xF2, 0x72, 0xC4, 0x2B, 0xDB,
  567. 0x56, 0x3E, 0xAF, 0xA1, 0x6B, 0x4F, 0xB6, 0x8C,
  568. 0x3B, 0xB1, 0xE7, 0x8E, 0xAA, 0x81, 0xA0, 0x02,
  569. 0x43, 0xFA, 0xAD, 0xD2, 0xBF, 0x18, 0xE6, 0x3D,
  570. 0x38, 0x9A, 0xE4, 0x43, 0x77, 0xDA, 0x18, 0xC5,
  571. 0x76, 0xB5, 0x0F, 0x00, 0x96, 0xCF, 0x34, 0x19,
  572. 0x54, 0x83, 0xB0, 0x05, 0x48, 0xC0, 0x98, 0x62,
  573. 0x36, 0xE3, 0xBC, 0x7C, 0xB8, 0xD6, 0x80, 0x1C,
  574. 0x04, 0x94, 0xCC, 0xD1, 0x99, 0xE5, 0xC5, 0xBD,
  575. 0x0D, 0x0E, 0xDC, 0x9E, 0xB8, 0xA0, 0x00, 0x1E,
  576. 0x15, 0x27, 0x67, 0x54, 0xFC, 0xC6, 0x85, 0x66,
  577. 0x05, 0x41, 0x48, 0xE6, 0xE7, 0x64, 0xBE, 0xE7,
  578. 0xC7, 0x64, 0xDA, 0xAD, 0x3F, 0xC4, 0x52, 0x35,
  579. 0xA6, 0xDA, 0xD4, 0x28, 0xFA, 0x20, 0xC1, 0x70,
  580. 0xE3, 0x45, 0x00, 0x3F, 0x2F, 0x06, 0xEC, 0x81,
  581. 0x05, 0xFE, 0xB2, 0x5B, 0x22, 0x81, 0xB6, 0x3D,
  582. 0x27, 0x33, 0xBE, 0x96, 0x1C, 0x29, 0x95, 0x1D,
  583. 0x11, 0xDD, 0x22, 0x21, 0x65, 0x7A, 0x9F, 0x53,
  584. 0x1D, 0xDA, 0x2A, 0x19, 0x4D, 0xBB, 0x12, 0x64,
  585. 0x48, 0xBD, 0xEE, 0xB2, 0x58, 0xE0, 0x7E, 0xA6,
  586. 0x59, 0xC7, 0x46, 0x19, 0xA6, 0x38, 0x0E, 0x1D,
  587. 0x66, 0xD6, 0x83, 0x2B, 0xFE, 0x67, 0xF6, 0x38,
  588. 0xCD, 0x8F, 0xAE, 0x1F, 0x27, 0x23, 0x02, 0x0F,
  589. 0x9C, 0x40, 0xA3, 0xFD, 0xA6, 0x7E, 0xDA, 0x3B,
  590. 0xD2, 0x92, 0x38, 0xFB, 0xD4, 0xD4, 0xB4, 0x88,
  591. 0x5C, 0x2A, 0x99, 0x17, 0x6D, 0xB1, 0xA0, 0x6C,
  592. 0x50, 0x07, 0x78, 0x49, 0x1A, 0x82, 0x88, 0xF1,
  593. 0x85, 0x5F, 0x60, 0xFF, 0xFC, 0xF1, 0xD1, 0x37,
  594. 0x3F, 0xD9, 0x4F, 0xC6, 0x0C, 0x18, 0x11, 0xE1,
  595. 0xAC, 0x3F, 0x1C, 0x6D, 0x00, 0x3B, 0xEC, 0xDA,
  596. 0x3B, 0x1F, 0x27, 0x25, 0xCA, 0x59, 0x5D, 0xE0,
  597. 0xCA, 0x63, 0x32, 0x8F, 0x3B, 0xE5, 0x7C, 0xC9,
  598. 0x77, 0x55, 0x60, 0x11, 0x95, 0x14, 0x0D, 0xFB,
  599. 0x59, 0xD3, 0x9C, 0xE0, 0x91, 0x30, 0x8B, 0x41,
  600. 0x05, 0x74, 0x6D, 0xAC, 0x23, 0xD3, 0x3E, 0x5F,
  601. 0x7C, 0xE4, 0x84, 0x8D, 0xA3, 0x16, 0xA9, 0xC6,
  602. 0x6B, 0x95, 0x81, 0xBA, 0x35, 0x73, 0xBF, 0xAF,
  603. 0x31, 0x14, 0x96, 0x18, 0x8A, 0xB1, 0x54, 0x23,
  604. 0x28, 0x2E, 0xE4, 0x16, 0xDC, 0x2A, 0x19, 0xC5,
  605. 0x72, 0x4F, 0xA9, 0x1A, 0xE4, 0xAD, 0xC8, 0x8B,
  606. 0xC6, 0x67, 0x96, 0xEA, 0xE5, 0x67, 0x7A, 0x01,
  607. 0xF6, 0x4E, 0x8C, 0x08, 0x63, 0x13, 0x95, 0x82,
  608. 0x2D, 0x9D, 0xB8, 0xFC, 0xEE, 0x35, 0xC0, 0x6B,
  609. 0x1F, 0xEE, 0xA5, 0x47, 0x4D, 0x6D, 0x8F, 0x34,
  610. 0xB1, 0x53, 0x4A, 0x93, 0x6A, 0x18, 0xB0, 0xE0,
  611. 0xD2, 0x0E, 0xAB, 0x86, 0xBC, 0x9C, 0x6D, 0x6A,
  612. 0x52, 0x07, 0x19, 0x4E, 0x68, 0x72, 0x07, 0x32,
  613. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
  614. };
  615. #endif /* HAVE_FFDHE_Q */
  616. #ifdef HAVE_PUBLIC_FFDHE
  617. const DhParams* wc_Dh_ffdhe6144_Get(void)
  618. {
  619. static const DhParams ffdhe6144 = {
  620. #ifdef HAVE_FFDHE_Q
  621. dh_ffdhe6144_q, sizeof(dh_ffdhe6144_q),
  622. #endif /* HAVE_FFDHE_Q */
  623. dh_ffdhe6144_p, sizeof(dh_ffdhe6144_p),
  624. dh_ffdhe6144_g, sizeof(dh_ffdhe6144_g)
  625. };
  626. return &ffdhe6144;
  627. }
  628. #endif
  629. #endif
  630. #ifdef HAVE_FFDHE_8192
  631. static const byte dh_ffdhe8192_p[] = {
  632. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  633. 0xAD, 0xF8, 0x54, 0x58, 0xA2, 0xBB, 0x4A, 0x9A,
  634. 0xAF, 0xDC, 0x56, 0x20, 0x27, 0x3D, 0x3C, 0xF1,
  635. 0xD8, 0xB9, 0xC5, 0x83, 0xCE, 0x2D, 0x36, 0x95,
  636. 0xA9, 0xE1, 0x36, 0x41, 0x14, 0x64, 0x33, 0xFB,
  637. 0xCC, 0x93, 0x9D, 0xCE, 0x24, 0x9B, 0x3E, 0xF9,
  638. 0x7D, 0x2F, 0xE3, 0x63, 0x63, 0x0C, 0x75, 0xD8,
  639. 0xF6, 0x81, 0xB2, 0x02, 0xAE, 0xC4, 0x61, 0x7A,
  640. 0xD3, 0xDF, 0x1E, 0xD5, 0xD5, 0xFD, 0x65, 0x61,
  641. 0x24, 0x33, 0xF5, 0x1F, 0x5F, 0x06, 0x6E, 0xD0,
  642. 0x85, 0x63, 0x65, 0x55, 0x3D, 0xED, 0x1A, 0xF3,
  643. 0xB5, 0x57, 0x13, 0x5E, 0x7F, 0x57, 0xC9, 0x35,
  644. 0x98, 0x4F, 0x0C, 0x70, 0xE0, 0xE6, 0x8B, 0x77,
  645. 0xE2, 0xA6, 0x89, 0xDA, 0xF3, 0xEF, 0xE8, 0x72,
  646. 0x1D, 0xF1, 0x58, 0xA1, 0x36, 0xAD, 0xE7, 0x35,
  647. 0x30, 0xAC, 0xCA, 0x4F, 0x48, 0x3A, 0x79, 0x7A,
  648. 0xBC, 0x0A, 0xB1, 0x82, 0xB3, 0x24, 0xFB, 0x61,
  649. 0xD1, 0x08, 0xA9, 0x4B, 0xB2, 0xC8, 0xE3, 0xFB,
  650. 0xB9, 0x6A, 0xDA, 0xB7, 0x60, 0xD7, 0xF4, 0x68,
  651. 0x1D, 0x4F, 0x42, 0xA3, 0xDE, 0x39, 0x4D, 0xF4,
  652. 0xAE, 0x56, 0xED, 0xE7, 0x63, 0x72, 0xBB, 0x19,
  653. 0x0B, 0x07, 0xA7, 0xC8, 0xEE, 0x0A, 0x6D, 0x70,
  654. 0x9E, 0x02, 0xFC, 0xE1, 0xCD, 0xF7, 0xE2, 0xEC,
  655. 0xC0, 0x34, 0x04, 0xCD, 0x28, 0x34, 0x2F, 0x61,
  656. 0x91, 0x72, 0xFE, 0x9C, 0xE9, 0x85, 0x83, 0xFF,
  657. 0x8E, 0x4F, 0x12, 0x32, 0xEE, 0xF2, 0x81, 0x83,
  658. 0xC3, 0xFE, 0x3B, 0x1B, 0x4C, 0x6F, 0xAD, 0x73,
  659. 0x3B, 0xB5, 0xFC, 0xBC, 0x2E, 0xC2, 0x20, 0x05,
  660. 0xC5, 0x8E, 0xF1, 0x83, 0x7D, 0x16, 0x83, 0xB2,
  661. 0xC6, 0xF3, 0x4A, 0x26, 0xC1, 0xB2, 0xEF, 0xFA,
  662. 0x88, 0x6B, 0x42, 0x38, 0x61, 0x1F, 0xCF, 0xDC,
  663. 0xDE, 0x35, 0x5B, 0x3B, 0x65, 0x19, 0x03, 0x5B,
  664. 0xBC, 0x34, 0xF4, 0xDE, 0xF9, 0x9C, 0x02, 0x38,
  665. 0x61, 0xB4, 0x6F, 0xC9, 0xD6, 0xE6, 0xC9, 0x07,
  666. 0x7A, 0xD9, 0x1D, 0x26, 0x91, 0xF7, 0xF7, 0xEE,
  667. 0x59, 0x8C, 0xB0, 0xFA, 0xC1, 0x86, 0xD9, 0x1C,
  668. 0xAE, 0xFE, 0x13, 0x09, 0x85, 0x13, 0x92, 0x70,
  669. 0xB4, 0x13, 0x0C, 0x93, 0xBC, 0x43, 0x79, 0x44,
  670. 0xF4, 0xFD, 0x44, 0x52, 0xE2, 0xD7, 0x4D, 0xD3,
  671. 0x64, 0xF2, 0xE2, 0x1E, 0x71, 0xF5, 0x4B, 0xFF,
  672. 0x5C, 0xAE, 0x82, 0xAB, 0x9C, 0x9D, 0xF6, 0x9E,
  673. 0xE8, 0x6D, 0x2B, 0xC5, 0x22, 0x36, 0x3A, 0x0D,
  674. 0xAB, 0xC5, 0x21, 0x97, 0x9B, 0x0D, 0xEA, 0xDA,
  675. 0x1D, 0xBF, 0x9A, 0x42, 0xD5, 0xC4, 0x48, 0x4E,
  676. 0x0A, 0xBC, 0xD0, 0x6B, 0xFA, 0x53, 0xDD, 0xEF,
  677. 0x3C, 0x1B, 0x20, 0xEE, 0x3F, 0xD5, 0x9D, 0x7C,
  678. 0x25, 0xE4, 0x1D, 0x2B, 0x66, 0x9E, 0x1E, 0xF1,
  679. 0x6E, 0x6F, 0x52, 0xC3, 0x16, 0x4D, 0xF4, 0xFB,
  680. 0x79, 0x30, 0xE9, 0xE4, 0xE5, 0x88, 0x57, 0xB6,
  681. 0xAC, 0x7D, 0x5F, 0x42, 0xD6, 0x9F, 0x6D, 0x18,
  682. 0x77, 0x63, 0xCF, 0x1D, 0x55, 0x03, 0x40, 0x04,
  683. 0x87, 0xF5, 0x5B, 0xA5, 0x7E, 0x31, 0xCC, 0x7A,
  684. 0x71, 0x35, 0xC8, 0x86, 0xEF, 0xB4, 0x31, 0x8A,
  685. 0xED, 0x6A, 0x1E, 0x01, 0x2D, 0x9E, 0x68, 0x32,
  686. 0xA9, 0x07, 0x60, 0x0A, 0x91, 0x81, 0x30, 0xC4,
  687. 0x6D, 0xC7, 0x78, 0xF9, 0x71, 0xAD, 0x00, 0x38,
  688. 0x09, 0x29, 0x99, 0xA3, 0x33, 0xCB, 0x8B, 0x7A,
  689. 0x1A, 0x1D, 0xB9, 0x3D, 0x71, 0x40, 0x00, 0x3C,
  690. 0x2A, 0x4E, 0xCE, 0xA9, 0xF9, 0x8D, 0x0A, 0xCC,
  691. 0x0A, 0x82, 0x91, 0xCD, 0xCE, 0xC9, 0x7D, 0xCF,
  692. 0x8E, 0xC9, 0xB5, 0x5A, 0x7F, 0x88, 0xA4, 0x6B,
  693. 0x4D, 0xB5, 0xA8, 0x51, 0xF4, 0x41, 0x82, 0xE1,
  694. 0xC6, 0x8A, 0x00, 0x7E, 0x5E, 0x0D, 0xD9, 0x02,
  695. 0x0B, 0xFD, 0x64, 0xB6, 0x45, 0x03, 0x6C, 0x7A,
  696. 0x4E, 0x67, 0x7D, 0x2C, 0x38, 0x53, 0x2A, 0x3A,
  697. 0x23, 0xBA, 0x44, 0x42, 0xCA, 0xF5, 0x3E, 0xA6,
  698. 0x3B, 0xB4, 0x54, 0x32, 0x9B, 0x76, 0x24, 0xC8,
  699. 0x91, 0x7B, 0xDD, 0x64, 0xB1, 0xC0, 0xFD, 0x4C,
  700. 0xB3, 0x8E, 0x8C, 0x33, 0x4C, 0x70, 0x1C, 0x3A,
  701. 0xCD, 0xAD, 0x06, 0x57, 0xFC, 0xCF, 0xEC, 0x71,
  702. 0x9B, 0x1F, 0x5C, 0x3E, 0x4E, 0x46, 0x04, 0x1F,
  703. 0x38, 0x81, 0x47, 0xFB, 0x4C, 0xFD, 0xB4, 0x77,
  704. 0xA5, 0x24, 0x71, 0xF7, 0xA9, 0xA9, 0x69, 0x10,
  705. 0xB8, 0x55, 0x32, 0x2E, 0xDB, 0x63, 0x40, 0xD8,
  706. 0xA0, 0x0E, 0xF0, 0x92, 0x35, 0x05, 0x11, 0xE3,
  707. 0x0A, 0xBE, 0xC1, 0xFF, 0xF9, 0xE3, 0xA2, 0x6E,
  708. 0x7F, 0xB2, 0x9F, 0x8C, 0x18, 0x30, 0x23, 0xC3,
  709. 0x58, 0x7E, 0x38, 0xDA, 0x00, 0x77, 0xD9, 0xB4,
  710. 0x76, 0x3E, 0x4E, 0x4B, 0x94, 0xB2, 0xBB, 0xC1,
  711. 0x94, 0xC6, 0x65, 0x1E, 0x77, 0xCA, 0xF9, 0x92,
  712. 0xEE, 0xAA, 0xC0, 0x23, 0x2A, 0x28, 0x1B, 0xF6,
  713. 0xB3, 0xA7, 0x39, 0xC1, 0x22, 0x61, 0x16, 0x82,
  714. 0x0A, 0xE8, 0xDB, 0x58, 0x47, 0xA6, 0x7C, 0xBE,
  715. 0xF9, 0xC9, 0x09, 0x1B, 0x46, 0x2D, 0x53, 0x8C,
  716. 0xD7, 0x2B, 0x03, 0x74, 0x6A, 0xE7, 0x7F, 0x5E,
  717. 0x62, 0x29, 0x2C, 0x31, 0x15, 0x62, 0xA8, 0x46,
  718. 0x50, 0x5D, 0xC8, 0x2D, 0xB8, 0x54, 0x33, 0x8A,
  719. 0xE4, 0x9F, 0x52, 0x35, 0xC9, 0x5B, 0x91, 0x17,
  720. 0x8C, 0xCF, 0x2D, 0xD5, 0xCA, 0xCE, 0xF4, 0x03,
  721. 0xEC, 0x9D, 0x18, 0x10, 0xC6, 0x27, 0x2B, 0x04,
  722. 0x5B, 0x3B, 0x71, 0xF9, 0xDC, 0x6B, 0x80, 0xD6,
  723. 0x3F, 0xDD, 0x4A, 0x8E, 0x9A, 0xDB, 0x1E, 0x69,
  724. 0x62, 0xA6, 0x95, 0x26, 0xD4, 0x31, 0x61, 0xC1,
  725. 0xA4, 0x1D, 0x57, 0x0D, 0x79, 0x38, 0xDA, 0xD4,
  726. 0xA4, 0x0E, 0x32, 0x9C, 0xCF, 0xF4, 0x6A, 0xAA,
  727. 0x36, 0xAD, 0x00, 0x4C, 0xF6, 0x00, 0xC8, 0x38,
  728. 0x1E, 0x42, 0x5A, 0x31, 0xD9, 0x51, 0xAE, 0x64,
  729. 0xFD, 0xB2, 0x3F, 0xCE, 0xC9, 0x50, 0x9D, 0x43,
  730. 0x68, 0x7F, 0xEB, 0x69, 0xED, 0xD1, 0xCC, 0x5E,
  731. 0x0B, 0x8C, 0xC3, 0xBD, 0xF6, 0x4B, 0x10, 0xEF,
  732. 0x86, 0xB6, 0x31, 0x42, 0xA3, 0xAB, 0x88, 0x29,
  733. 0x55, 0x5B, 0x2F, 0x74, 0x7C, 0x93, 0x26, 0x65,
  734. 0xCB, 0x2C, 0x0F, 0x1C, 0xC0, 0x1B, 0xD7, 0x02,
  735. 0x29, 0x38, 0x88, 0x39, 0xD2, 0xAF, 0x05, 0xE4,
  736. 0x54, 0x50, 0x4A, 0xC7, 0x8B, 0x75, 0x82, 0x82,
  737. 0x28, 0x46, 0xC0, 0xBA, 0x35, 0xC3, 0x5F, 0x5C,
  738. 0x59, 0x16, 0x0C, 0xC0, 0x46, 0xFD, 0x82, 0x51,
  739. 0x54, 0x1F, 0xC6, 0x8C, 0x9C, 0x86, 0xB0, 0x22,
  740. 0xBB, 0x70, 0x99, 0x87, 0x6A, 0x46, 0x0E, 0x74,
  741. 0x51, 0xA8, 0xA9, 0x31, 0x09, 0x70, 0x3F, 0xEE,
  742. 0x1C, 0x21, 0x7E, 0x6C, 0x38, 0x26, 0xE5, 0x2C,
  743. 0x51, 0xAA, 0x69, 0x1E, 0x0E, 0x42, 0x3C, 0xFC,
  744. 0x99, 0xE9, 0xE3, 0x16, 0x50, 0xC1, 0x21, 0x7B,
  745. 0x62, 0x48, 0x16, 0xCD, 0xAD, 0x9A, 0x95, 0xF9,
  746. 0xD5, 0xB8, 0x01, 0x94, 0x88, 0xD9, 0xC0, 0xA0,
  747. 0xA1, 0xFE, 0x30, 0x75, 0xA5, 0x77, 0xE2, 0x31,
  748. 0x83, 0xF8, 0x1D, 0x4A, 0x3F, 0x2F, 0xA4, 0x57,
  749. 0x1E, 0xFC, 0x8C, 0xE0, 0xBA, 0x8A, 0x4F, 0xE8,
  750. 0xB6, 0x85, 0x5D, 0xFE, 0x72, 0xB0, 0xA6, 0x6E,
  751. 0xDE, 0xD2, 0xFB, 0xAB, 0xFB, 0xE5, 0x8A, 0x30,
  752. 0xFA, 0xFA, 0xBE, 0x1C, 0x5D, 0x71, 0xA8, 0x7E,
  753. 0x2F, 0x74, 0x1E, 0xF8, 0xC1, 0xFE, 0x86, 0xFE,
  754. 0xA6, 0xBB, 0xFD, 0xE5, 0x30, 0x67, 0x7F, 0x0D,
  755. 0x97, 0xD1, 0x1D, 0x49, 0xF7, 0xA8, 0x44, 0x3D,
  756. 0x08, 0x22, 0xE5, 0x06, 0xA9, 0xF4, 0x61, 0x4E,
  757. 0x01, 0x1E, 0x2A, 0x94, 0x83, 0x8F, 0xF8, 0x8C,
  758. 0xD6, 0x8C, 0x8B, 0xB7, 0xC5, 0xC6, 0x42, 0x4C,
  759. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
  760. };
  761. static const byte dh_ffdhe8192_g[] = { 0x02 };
  762. #ifdef HAVE_FFDHE_Q
  763. static const byte dh_ffdhe8192_q[] = {
  764. 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  765. 0xD6, 0xFC, 0x2A, 0x2C, 0x51, 0x5D, 0xA5, 0x4D,
  766. 0x57, 0xEE, 0x2B, 0x10, 0x13, 0x9E, 0x9E, 0x78,
  767. 0xEC, 0x5C, 0xE2, 0xC1, 0xE7, 0x16, 0x9B, 0x4A,
  768. 0xD4, 0xF0, 0x9B, 0x20, 0x8A, 0x32, 0x19, 0xFD,
  769. 0xE6, 0x49, 0xCE, 0xE7, 0x12, 0x4D, 0x9F, 0x7C,
  770. 0xBE, 0x97, 0xF1, 0xB1, 0xB1, 0x86, 0x3A, 0xEC,
  771. 0x7B, 0x40, 0xD9, 0x01, 0x57, 0x62, 0x30, 0xBD,
  772. 0x69, 0xEF, 0x8F, 0x6A, 0xEA, 0xFE, 0xB2, 0xB0,
  773. 0x92, 0x19, 0xFA, 0x8F, 0xAF, 0x83, 0x37, 0x68,
  774. 0x42, 0xB1, 0xB2, 0xAA, 0x9E, 0xF6, 0x8D, 0x79,
  775. 0xDA, 0xAB, 0x89, 0xAF, 0x3F, 0xAB, 0xE4, 0x9A,
  776. 0xCC, 0x27, 0x86, 0x38, 0x70, 0x73, 0x45, 0xBB,
  777. 0xF1, 0x53, 0x44, 0xED, 0x79, 0xF7, 0xF4, 0x39,
  778. 0x0E, 0xF8, 0xAC, 0x50, 0x9B, 0x56, 0xF3, 0x9A,
  779. 0x98, 0x56, 0x65, 0x27, 0xA4, 0x1D, 0x3C, 0xBD,
  780. 0x5E, 0x05, 0x58, 0xC1, 0x59, 0x92, 0x7D, 0xB0,
  781. 0xE8, 0x84, 0x54, 0xA5, 0xD9, 0x64, 0x71, 0xFD,
  782. 0xDC, 0xB5, 0x6D, 0x5B, 0xB0, 0x6B, 0xFA, 0x34,
  783. 0x0E, 0xA7, 0xA1, 0x51, 0xEF, 0x1C, 0xA6, 0xFA,
  784. 0x57, 0x2B, 0x76, 0xF3, 0xB1, 0xB9, 0x5D, 0x8C,
  785. 0x85, 0x83, 0xD3, 0xE4, 0x77, 0x05, 0x36, 0xB8,
  786. 0x4F, 0x01, 0x7E, 0x70, 0xE6, 0xFB, 0xF1, 0x76,
  787. 0x60, 0x1A, 0x02, 0x66, 0x94, 0x1A, 0x17, 0xB0,
  788. 0xC8, 0xB9, 0x7F, 0x4E, 0x74, 0xC2, 0xC1, 0xFF,
  789. 0xC7, 0x27, 0x89, 0x19, 0x77, 0x79, 0x40, 0xC1,
  790. 0xE1, 0xFF, 0x1D, 0x8D, 0xA6, 0x37, 0xD6, 0xB9,
  791. 0x9D, 0xDA, 0xFE, 0x5E, 0x17, 0x61, 0x10, 0x02,
  792. 0xE2, 0xC7, 0x78, 0xC1, 0xBE, 0x8B, 0x41, 0xD9,
  793. 0x63, 0x79, 0xA5, 0x13, 0x60, 0xD9, 0x77, 0xFD,
  794. 0x44, 0x35, 0xA1, 0x1C, 0x30, 0x8F, 0xE7, 0xEE,
  795. 0x6F, 0x1A, 0xAD, 0x9D, 0xB2, 0x8C, 0x81, 0xAD,
  796. 0xDE, 0x1A, 0x7A, 0x6F, 0x7C, 0xCE, 0x01, 0x1C,
  797. 0x30, 0xDA, 0x37, 0xE4, 0xEB, 0x73, 0x64, 0x83,
  798. 0xBD, 0x6C, 0x8E, 0x93, 0x48, 0xFB, 0xFB, 0xF7,
  799. 0x2C, 0xC6, 0x58, 0x7D, 0x60, 0xC3, 0x6C, 0x8E,
  800. 0x57, 0x7F, 0x09, 0x84, 0xC2, 0x89, 0xC9, 0x38,
  801. 0x5A, 0x09, 0x86, 0x49, 0xDE, 0x21, 0xBC, 0xA2,
  802. 0x7A, 0x7E, 0xA2, 0x29, 0x71, 0x6B, 0xA6, 0xE9,
  803. 0xB2, 0x79, 0x71, 0x0F, 0x38, 0xFA, 0xA5, 0xFF,
  804. 0xAE, 0x57, 0x41, 0x55, 0xCE, 0x4E, 0xFB, 0x4F,
  805. 0x74, 0x36, 0x95, 0xE2, 0x91, 0x1B, 0x1D, 0x06,
  806. 0xD5, 0xE2, 0x90, 0xCB, 0xCD, 0x86, 0xF5, 0x6D,
  807. 0x0E, 0xDF, 0xCD, 0x21, 0x6A, 0xE2, 0x24, 0x27,
  808. 0x05, 0x5E, 0x68, 0x35, 0xFD, 0x29, 0xEE, 0xF7,
  809. 0x9E, 0x0D, 0x90, 0x77, 0x1F, 0xEA, 0xCE, 0xBE,
  810. 0x12, 0xF2, 0x0E, 0x95, 0xB3, 0x4F, 0x0F, 0x78,
  811. 0xB7, 0x37, 0xA9, 0x61, 0x8B, 0x26, 0xFA, 0x7D,
  812. 0xBC, 0x98, 0x74, 0xF2, 0x72, 0xC4, 0x2B, 0xDB,
  813. 0x56, 0x3E, 0xAF, 0xA1, 0x6B, 0x4F, 0xB6, 0x8C,
  814. 0x3B, 0xB1, 0xE7, 0x8E, 0xAA, 0x81, 0xA0, 0x02,
  815. 0x43, 0xFA, 0xAD, 0xD2, 0xBF, 0x18, 0xE6, 0x3D,
  816. 0x38, 0x9A, 0xE4, 0x43, 0x77, 0xDA, 0x18, 0xC5,
  817. 0x76, 0xB5, 0x0F, 0x00, 0x96, 0xCF, 0x34, 0x19,
  818. 0x54, 0x83, 0xB0, 0x05, 0x48, 0xC0, 0x98, 0x62,
  819. 0x36, 0xE3, 0xBC, 0x7C, 0xB8, 0xD6, 0x80, 0x1C,
  820. 0x04, 0x94, 0xCC, 0xD1, 0x99, 0xE5, 0xC5, 0xBD,
  821. 0x0D, 0x0E, 0xDC, 0x9E, 0xB8, 0xA0, 0x00, 0x1E,
  822. 0x15, 0x27, 0x67, 0x54, 0xFC, 0xC6, 0x85, 0x66,
  823. 0x05, 0x41, 0x48, 0xE6, 0xE7, 0x64, 0xBE, 0xE7,
  824. 0xC7, 0x64, 0xDA, 0xAD, 0x3F, 0xC4, 0x52, 0x35,
  825. 0xA6, 0xDA, 0xD4, 0x28, 0xFA, 0x20, 0xC1, 0x70,
  826. 0xE3, 0x45, 0x00, 0x3F, 0x2F, 0x06, 0xEC, 0x81,
  827. 0x05, 0xFE, 0xB2, 0x5B, 0x22, 0x81, 0xB6, 0x3D,
  828. 0x27, 0x33, 0xBE, 0x96, 0x1C, 0x29, 0x95, 0x1D,
  829. 0x11, 0xDD, 0x22, 0x21, 0x65, 0x7A, 0x9F, 0x53,
  830. 0x1D, 0xDA, 0x2A, 0x19, 0x4D, 0xBB, 0x12, 0x64,
  831. 0x48, 0xBD, 0xEE, 0xB2, 0x58, 0xE0, 0x7E, 0xA6,
  832. 0x59, 0xC7, 0x46, 0x19, 0xA6, 0x38, 0x0E, 0x1D,
  833. 0x66, 0xD6, 0x83, 0x2B, 0xFE, 0x67, 0xF6, 0x38,
  834. 0xCD, 0x8F, 0xAE, 0x1F, 0x27, 0x23, 0x02, 0x0F,
  835. 0x9C, 0x40, 0xA3, 0xFD, 0xA6, 0x7E, 0xDA, 0x3B,
  836. 0xD2, 0x92, 0x38, 0xFB, 0xD4, 0xD4, 0xB4, 0x88,
  837. 0x5C, 0x2A, 0x99, 0x17, 0x6D, 0xB1, 0xA0, 0x6C,
  838. 0x50, 0x07, 0x78, 0x49, 0x1A, 0x82, 0x88, 0xF1,
  839. 0x85, 0x5F, 0x60, 0xFF, 0xFC, 0xF1, 0xD1, 0x37,
  840. 0x3F, 0xD9, 0x4F, 0xC6, 0x0C, 0x18, 0x11, 0xE1,
  841. 0xAC, 0x3F, 0x1C, 0x6D, 0x00, 0x3B, 0xEC, 0xDA,
  842. 0x3B, 0x1F, 0x27, 0x25, 0xCA, 0x59, 0x5D, 0xE0,
  843. 0xCA, 0x63, 0x32, 0x8F, 0x3B, 0xE5, 0x7C, 0xC9,
  844. 0x77, 0x55, 0x60, 0x11, 0x95, 0x14, 0x0D, 0xFB,
  845. 0x59, 0xD3, 0x9C, 0xE0, 0x91, 0x30, 0x8B, 0x41,
  846. 0x05, 0x74, 0x6D, 0xAC, 0x23, 0xD3, 0x3E, 0x5F,
  847. 0x7C, 0xE4, 0x84, 0x8D, 0xA3, 0x16, 0xA9, 0xC6,
  848. 0x6B, 0x95, 0x81, 0xBA, 0x35, 0x73, 0xBF, 0xAF,
  849. 0x31, 0x14, 0x96, 0x18, 0x8A, 0xB1, 0x54, 0x23,
  850. 0x28, 0x2E, 0xE4, 0x16, 0xDC, 0x2A, 0x19, 0xC5,
  851. 0x72, 0x4F, 0xA9, 0x1A, 0xE4, 0xAD, 0xC8, 0x8B,
  852. 0xC6, 0x67, 0x96, 0xEA, 0xE5, 0x67, 0x7A, 0x01,
  853. 0xF6, 0x4E, 0x8C, 0x08, 0x63, 0x13, 0x95, 0x82,
  854. 0x2D, 0x9D, 0xB8, 0xFC, 0xEE, 0x35, 0xC0, 0x6B,
  855. 0x1F, 0xEE, 0xA5, 0x47, 0x4D, 0x6D, 0x8F, 0x34,
  856. 0xB1, 0x53, 0x4A, 0x93, 0x6A, 0x18, 0xB0, 0xE0,
  857. 0xD2, 0x0E, 0xAB, 0x86, 0xBC, 0x9C, 0x6D, 0x6A,
  858. 0x52, 0x07, 0x19, 0x4E, 0x67, 0xFA, 0x35, 0x55,
  859. 0x1B, 0x56, 0x80, 0x26, 0x7B, 0x00, 0x64, 0x1C,
  860. 0x0F, 0x21, 0x2D, 0x18, 0xEC, 0xA8, 0xD7, 0x32,
  861. 0x7E, 0xD9, 0x1F, 0xE7, 0x64, 0xA8, 0x4E, 0xA1,
  862. 0xB4, 0x3F, 0xF5, 0xB4, 0xF6, 0xE8, 0xE6, 0x2F,
  863. 0x05, 0xC6, 0x61, 0xDE, 0xFB, 0x25, 0x88, 0x77,
  864. 0xC3, 0x5B, 0x18, 0xA1, 0x51, 0xD5, 0xC4, 0x14,
  865. 0xAA, 0xAD, 0x97, 0xBA, 0x3E, 0x49, 0x93, 0x32,
  866. 0xE5, 0x96, 0x07, 0x8E, 0x60, 0x0D, 0xEB, 0x81,
  867. 0x14, 0x9C, 0x44, 0x1C, 0xE9, 0x57, 0x82, 0xF2,
  868. 0x2A, 0x28, 0x25, 0x63, 0xC5, 0xBA, 0xC1, 0x41,
  869. 0x14, 0x23, 0x60, 0x5D, 0x1A, 0xE1, 0xAF, 0xAE,
  870. 0x2C, 0x8B, 0x06, 0x60, 0x23, 0x7E, 0xC1, 0x28,
  871. 0xAA, 0x0F, 0xE3, 0x46, 0x4E, 0x43, 0x58, 0x11,
  872. 0x5D, 0xB8, 0x4C, 0xC3, 0xB5, 0x23, 0x07, 0x3A,
  873. 0x28, 0xD4, 0x54, 0x98, 0x84, 0xB8, 0x1F, 0xF7,
  874. 0x0E, 0x10, 0xBF, 0x36, 0x1C, 0x13, 0x72, 0x96,
  875. 0x28, 0xD5, 0x34, 0x8F, 0x07, 0x21, 0x1E, 0x7E,
  876. 0x4C, 0xF4, 0xF1, 0x8B, 0x28, 0x60, 0x90, 0xBD,
  877. 0xB1, 0x24, 0x0B, 0x66, 0xD6, 0xCD, 0x4A, 0xFC,
  878. 0xEA, 0xDC, 0x00, 0xCA, 0x44, 0x6C, 0xE0, 0x50,
  879. 0x50, 0xFF, 0x18, 0x3A, 0xD2, 0xBB, 0xF1, 0x18,
  880. 0xC1, 0xFC, 0x0E, 0xA5, 0x1F, 0x97, 0xD2, 0x2B,
  881. 0x8F, 0x7E, 0x46, 0x70, 0x5D, 0x45, 0x27, 0xF4,
  882. 0x5B, 0x42, 0xAE, 0xFF, 0x39, 0x58, 0x53, 0x37,
  883. 0x6F, 0x69, 0x7D, 0xD5, 0xFD, 0xF2, 0xC5, 0x18,
  884. 0x7D, 0x7D, 0x5F, 0x0E, 0x2E, 0xB8, 0xD4, 0x3F,
  885. 0x17, 0xBA, 0x0F, 0x7C, 0x60, 0xFF, 0x43, 0x7F,
  886. 0x53, 0x5D, 0xFE, 0xF2, 0x98, 0x33, 0xBF, 0x86,
  887. 0xCB, 0xE8, 0x8E, 0xA4, 0xFB, 0xD4, 0x22, 0x1E,
  888. 0x84, 0x11, 0x72, 0x83, 0x54, 0xFA, 0x30, 0xA7,
  889. 0x00, 0x8F, 0x15, 0x4A, 0x41, 0xC7, 0xFC, 0x46,
  890. 0x6B, 0x46, 0x45, 0xDB, 0xE2, 0xE3, 0x21, 0x26,
  891. 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
  892. };
  893. #endif /* HAVE_FFDHE_Q */
  894. #ifdef HAVE_PUBLIC_FFDHE
  895. const DhParams* wc_Dh_ffdhe8192_Get(void)
  896. {
  897. static const DhParams ffdhe8192 = {
  898. #ifdef HAVE_FFDHE_Q
  899. dh_ffdhe8192_q, sizeof(dh_ffdhe8192_q),
  900. #endif /* HAVE_FFDHE_Q */
  901. dh_ffdhe8192_p, sizeof(dh_ffdhe8192_p),
  902. dh_ffdhe8192_g, sizeof(dh_ffdhe8192_g)
  903. };
  904. return &ffdhe8192;
  905. }
  906. #endif
  907. #endif
  908. int wc_InitDhKey_ex(DhKey* key, void* heap, int devId)
  909. {
  910. int ret = 0;
  911. if (key == NULL)
  912. return BAD_FUNC_ARG;
  913. key->heap = heap; /* for XMALLOC/XFREE in future */
  914. key->trustedGroup = 0;
  915. #ifdef WOLFSSL_DH_EXTRA
  916. if (mp_init_multi(&key->p, &key->g, &key->q, &key->pub, &key->priv, NULL) != MP_OKAY)
  917. #else
  918. if (mp_init_multi(&key->p, &key->g, &key->q, NULL, NULL, NULL) != MP_OKAY)
  919. #endif
  920. return MEMORY_E;
  921. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_DH)
  922. /* handle as async */
  923. ret = wolfAsync_DevCtxInit(&key->asyncDev, WOLFSSL_ASYNC_MARKER_DH,
  924. key->heap, devId);
  925. #else
  926. (void)devId;
  927. #endif
  928. key->trustedGroup = 0;
  929. #ifdef WOLFSSL_KCAPI_DH
  930. key->handle = NULL;
  931. #endif
  932. return ret;
  933. }
  934. int wc_InitDhKey(DhKey* key)
  935. {
  936. return wc_InitDhKey_ex(key, NULL, INVALID_DEVID);
  937. }
  938. int wc_FreeDhKey(DhKey* key)
  939. {
  940. if (key) {
  941. mp_clear(&key->p);
  942. mp_clear(&key->g);
  943. mp_clear(&key->q);
  944. #ifdef WOLFSSL_DH_EXTRA
  945. mp_clear(&key->pub);
  946. mp_forcezero(&key->priv);
  947. #endif
  948. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_DH)
  949. wolfAsync_DevCtxFree(&key->asyncDev, WOLFSSL_ASYNC_MARKER_DH);
  950. #endif
  951. #ifdef WOLFSSL_KCAPI_DH
  952. KcapiDh_Free(key);
  953. #endif
  954. }
  955. return 0;
  956. }
  957. static int _ffc_validate_public_key(DhKey* key, const byte* pub, word32 pubSz,
  958. const byte* prime, word32 primeSz, int partial);
  959. static int _ffc_pairwise_consistency_test(DhKey* key,
  960. const byte* pub, word32 pubSz, const byte* priv, word32 privSz);
  961. #ifndef WOLFSSL_KCAPI_DH
  962. #ifndef WC_NO_RNG
  963. /* if defined to not use floating point values do not compile in */
  964. #ifndef WOLFSSL_DH_CONST
  965. static word32 DiscreteLogWorkFactor(word32 n)
  966. {
  967. /* assuming discrete log takes about the same time as factoring */
  968. if (n < 5)
  969. return 0;
  970. else
  971. return (word32)(2.4 * XPOW((double)n, 1.0/3.0) *
  972. XPOW(XLOG((double)n), 2.0/3.0) - 5);
  973. }
  974. #endif /* WOLFSSL_DH_CONST*/
  975. /* if not using fixed points use DiscreteLogWorkFactor function for unusual size
  976. otherwise round up on size needed */
  977. #ifndef WOLFSSL_DH_CONST
  978. #define WOLFSSL_DH_ROUND(x)
  979. #else
  980. #define WOLFSSL_DH_ROUND(x) \
  981. do { \
  982. if (x % 128) { \
  983. x &= 0xffffff80;\
  984. x += 128; \
  985. } \
  986. } \
  987. while (0)
  988. #endif
  989. #ifndef WOLFSSL_NO_DH186
  990. /* validate that (L,N) match allowed sizes from SP 800-56A, Section 5.5.1.1.
  991. * modLen - represents L, the size of p in bits
  992. * divLen - represents N, the size of q in bits
  993. * return 0 on success, -1 on error */
  994. static int CheckDhLN(int modLen, int divLen)
  995. {
  996. int ret = -1;
  997. switch (modLen) {
  998. /* FA */
  999. case 1024:
  1000. if (divLen == 160)
  1001. ret = 0;
  1002. break;
  1003. /* FB, FC */
  1004. case 2048:
  1005. if (divLen == 224 || divLen == 256)
  1006. ret = 0;
  1007. break;
  1008. default:
  1009. break;
  1010. }
  1011. return ret;
  1012. }
  1013. /* Create DH private key
  1014. *
  1015. * Based on NIST SP 800-56Ar3
  1016. * "5.6.1.1.3 Key Pair Generation Using Extra Random Bits"
  1017. *
  1018. * dh - pointer to initialized DhKey structure, needs to have dh->q
  1019. * rng - pointer to initialized WC_RNG structure
  1020. * priv - output location for generated private key
  1021. * privSz - IN/OUT, size of priv buffer, size of generated private key
  1022. *
  1023. * return 0 on success, negative on error */
  1024. static int GeneratePrivateDh186(DhKey* key, WC_RNG* rng, byte* priv,
  1025. word32* privSz)
  1026. {
  1027. byte* cBuf;
  1028. int qSz, pSz, cSz, err;
  1029. #ifdef WOLFSSL_SMALL_STACK
  1030. mp_int* tmpQ = NULL;
  1031. mp_int* tmpX = NULL;
  1032. #else
  1033. mp_int tmpQ[1], tmpX[1];
  1034. #endif
  1035. /* Parameters validated in calling functions. */
  1036. if (mp_iszero(&key->q) == MP_YES) {
  1037. WOLFSSL_MSG("DH q parameter needed for FIPS 186-4 key generation");
  1038. return BAD_FUNC_ARG;
  1039. }
  1040. qSz = mp_unsigned_bin_size(&key->q);
  1041. pSz = mp_unsigned_bin_size(&key->p);
  1042. /* verify (L,N) pair bit lengths */
  1043. /* Trusted primes don't need to be checked. */
  1044. if (!key->trustedGroup &&
  1045. CheckDhLN(pSz * WOLFSSL_BIT_SIZE, qSz * WOLFSSL_BIT_SIZE) != 0) {
  1046. WOLFSSL_MSG("DH param sizes do not match SP 800-56A requirements");
  1047. return BAD_FUNC_ARG;
  1048. }
  1049. /* generate extra 64 bits so that bias from mod function is negligible */
  1050. cSz = *privSz + (64 / WOLFSSL_BIT_SIZE);
  1051. cBuf = (byte*)XMALLOC(cSz, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  1052. if (cBuf == NULL) {
  1053. return MEMORY_E;
  1054. }
  1055. #ifdef WOLFSSL_SMALL_STACK
  1056. tmpQ = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_DH);
  1057. if (tmpQ == NULL) {
  1058. XFREE(cBuf, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  1059. return MEMORY_E;
  1060. }
  1061. tmpX = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_DH);
  1062. if (tmpX == NULL) {
  1063. XFREE(cBuf, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  1064. XFREE(tmpQ, key->heap, DYNAMIC_TYPE_DH);
  1065. return MEMORY_E;
  1066. }
  1067. #endif
  1068. if ((err = mp_init_multi(tmpX, tmpQ, NULL, NULL, NULL, NULL))
  1069. != MP_OKAY) {
  1070. XFREE(cBuf, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  1071. #ifdef WOLFSSL_SMALL_STACK
  1072. XFREE(tmpQ, key->heap, DYNAMIC_TYPE_DH);
  1073. XFREE(tmpX, key->heap, DYNAMIC_TYPE_DH);
  1074. #endif
  1075. return err;
  1076. }
  1077. do {
  1078. /* generate N+64 bits (c) from RBG into tmpX, making sure positive.
  1079. * Hash_DRBG uses SHA-256 which matches maximum
  1080. * requested_security_strength of (L,N) */
  1081. err = wc_RNG_GenerateBlock(rng, cBuf, cSz);
  1082. if (err == MP_OKAY)
  1083. err = mp_read_unsigned_bin(tmpX, cBuf, cSz);
  1084. if (err != MP_OKAY) {
  1085. mp_clear(tmpX);
  1086. mp_clear(tmpQ);
  1087. XFREE(cBuf, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  1088. #ifdef WOLFSSL_SMALL_STACK
  1089. XFREE(tmpQ, key->heap, DYNAMIC_TYPE_DH);
  1090. XFREE(tmpX, key->heap, DYNAMIC_TYPE_DH);
  1091. #endif
  1092. return err;
  1093. }
  1094. } while (mp_cmp_d(tmpX, 1) != MP_GT);
  1095. ForceZero(cBuf, cSz);
  1096. XFREE(cBuf, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  1097. /* tmpQ: M = min(2^N,q) - 1 */
  1098. if (err == MP_OKAY)
  1099. err = mp_2expt(tmpQ, *privSz * 8);
  1100. if (err == MP_OKAY) {
  1101. if (mp_cmp(tmpQ, &key->q) == MP_GT) {
  1102. err = mp_copy(&key->q, tmpQ);
  1103. }
  1104. }
  1105. if (err == MP_OKAY)
  1106. err = mp_sub_d(tmpQ, 1, tmpQ);
  1107. /* x = c mod (M), tmpX holds c */
  1108. if (err == MP_OKAY)
  1109. err = mp_mod(tmpX, tmpQ, tmpX);
  1110. /* x = c mod (M) + 1 */
  1111. if (err == MP_OKAY)
  1112. err = mp_add_d(tmpX, 1, tmpX);
  1113. /* copy tmpX into priv */
  1114. if (err == MP_OKAY) {
  1115. pSz = mp_unsigned_bin_size(tmpX);
  1116. if (pSz > (int)*privSz) {
  1117. WOLFSSL_MSG("DH private key output buffer too small");
  1118. err = BAD_FUNC_ARG;
  1119. } else {
  1120. *privSz = pSz;
  1121. err = mp_to_unsigned_bin(tmpX, priv);
  1122. }
  1123. }
  1124. mp_forcezero(tmpX);
  1125. mp_clear(tmpQ);
  1126. #ifdef WOLFSSL_SMALL_STACK
  1127. XFREE(tmpQ, key->heap, DYNAMIC_TYPE_DH);
  1128. XFREE(tmpX, key->heap, DYNAMIC_TYPE_DH);
  1129. #endif
  1130. return err;
  1131. }
  1132. #endif /* WOLFSSL_NO_DH186 */
  1133. #endif /* !WC_NO_RNG */
  1134. static int GeneratePrivateDh(DhKey* key, WC_RNG* rng, byte* priv,
  1135. word32* privSz)
  1136. {
  1137. #ifndef WC_NO_RNG
  1138. int ret = 0;
  1139. word32 sz = 0;
  1140. #ifndef WOLFSSL_NO_DH186
  1141. if (mp_iszero(&key->q) == MP_NO) {
  1142. /* q param available, use NIST SP 800-56Ar3, "5.6.1.1.3 Key Pair
  1143. * Generation Using Extra Random Bits" */
  1144. ret = GeneratePrivateDh186(key, rng, priv, privSz);
  1145. } else
  1146. #endif
  1147. {
  1148. sz = mp_unsigned_bin_size(&key->p);
  1149. /* Table of predetermined values from the operation
  1150. 2 * DiscreteLogWorkFactor(sz * WOLFSSL_BIT_SIZE) /
  1151. WOLFSSL_BIT_SIZE + 1
  1152. Sizes in table checked against RFC 3526
  1153. */
  1154. WOLFSSL_DH_ROUND(sz); /* if using fixed points only, then round up */
  1155. switch (sz) {
  1156. case 128: sz = 21; break;
  1157. case 256: sz = 29; break;
  1158. case 384: sz = 34; break;
  1159. case 512: sz = 39; break;
  1160. case 640: sz = 42; break;
  1161. case 768: sz = 46; break;
  1162. case 896: sz = 49; break;
  1163. case 1024: sz = 52; break;
  1164. default:
  1165. #ifndef WOLFSSL_DH_CONST
  1166. /* if using floating points and size of p is not in table */
  1167. sz = min(sz, 2 * DiscreteLogWorkFactor(sz * WOLFSSL_BIT_SIZE) /
  1168. WOLFSSL_BIT_SIZE + 1);
  1169. break;
  1170. #else
  1171. return BAD_FUNC_ARG;
  1172. #endif
  1173. }
  1174. if (sz > *privSz)
  1175. ret = WC_KEY_SIZE_E;
  1176. if (ret == 0)
  1177. ret = wc_RNG_GenerateBlock(rng, priv, sz);
  1178. if (ret == 0) {
  1179. priv[0] |= 0x0C;
  1180. *privSz = sz;
  1181. }
  1182. }
  1183. return ret;
  1184. #else
  1185. (void)key;
  1186. (void)rng;
  1187. (void)priv;
  1188. (void)privSz;
  1189. return NOT_COMPILED_IN;
  1190. #endif /* WC_NO_RNG */
  1191. }
  1192. static int GeneratePublicDh(DhKey* key, byte* priv, word32 privSz,
  1193. byte* pub, word32* pubSz)
  1194. {
  1195. int ret = 0;
  1196. #ifndef WOLFSSL_SP_MATH
  1197. word32 binSz = 0;
  1198. #ifdef WOLFSSL_SMALL_STACK
  1199. mp_int* x;
  1200. mp_int* y;
  1201. #else
  1202. mp_int x[1];
  1203. mp_int y[1];
  1204. #endif
  1205. #endif
  1206. #ifdef WOLFSSL_HAVE_SP_DH
  1207. #ifndef WOLFSSL_SP_NO_2048
  1208. if (mp_count_bits(&key->p) == 2048)
  1209. return sp_DhExp_2048(&key->g, priv, privSz, &key->p, pub, pubSz);
  1210. #endif
  1211. #ifndef WOLFSSL_SP_NO_3072
  1212. if (mp_count_bits(&key->p) == 3072)
  1213. return sp_DhExp_3072(&key->g, priv, privSz, &key->p, pub, pubSz);
  1214. #endif
  1215. #ifdef WOLFSSL_SP_4096
  1216. if (mp_count_bits(&key->p) == 4096)
  1217. return sp_DhExp_4096(&key->g, priv, privSz, &key->p, pub, pubSz);
  1218. #endif
  1219. #endif
  1220. #if !defined(WOLFSSL_SP_MATH)
  1221. #ifdef WOLFSSL_SMALL_STACK
  1222. x = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_DH);
  1223. if (x == NULL)
  1224. return MEMORY_E;
  1225. y = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_DH);
  1226. if (y == NULL) {
  1227. XFREE(x, key->heap, DYNAMIC_TYPE_DH);
  1228. return MEMORY_E;
  1229. }
  1230. #endif
  1231. if (mp_init_multi(x, y, 0, 0, 0, 0) != MP_OKAY) {
  1232. #ifdef WOLFSSL_SMALL_STACK
  1233. XFREE(y, key->heap, DYNAMIC_TYPE_DH);
  1234. XFREE(x, key->heap, DYNAMIC_TYPE_DH);
  1235. #endif
  1236. return MP_INIT_E;
  1237. }
  1238. if (mp_read_unsigned_bin(x, priv, privSz) != MP_OKAY)
  1239. ret = MP_READ_E;
  1240. if (ret == 0 && mp_exptmod(&key->g, x, &key->p, y) != MP_OKAY)
  1241. ret = MP_EXPTMOD_E;
  1242. if (ret == 0) {
  1243. binSz = mp_unsigned_bin_size(y);
  1244. if (binSz > *pubSz) {
  1245. ret = WC_KEY_SIZE_E;
  1246. }
  1247. }
  1248. if (ret == 0 && mp_to_unsigned_bin(y, pub) != MP_OKAY)
  1249. ret = MP_TO_E;
  1250. if (ret == 0)
  1251. *pubSz = binSz;
  1252. mp_clear(y);
  1253. mp_forcezero(x);
  1254. #ifdef WOLFSSL_SMALL_STACK
  1255. XFREE(y, key->heap, DYNAMIC_TYPE_DH);
  1256. XFREE(x, key->heap, DYNAMIC_TYPE_DH);
  1257. #endif
  1258. #else
  1259. ret = WC_KEY_SIZE_E;
  1260. #endif
  1261. return ret;
  1262. }
  1263. static int wc_DhGenerateKeyPair_Sync(DhKey* key, WC_RNG* rng,
  1264. byte* priv, word32* privSz, byte* pub, word32* pubSz)
  1265. {
  1266. int ret;
  1267. if (key == NULL || rng == NULL || priv == NULL || privSz == NULL ||
  1268. pub == NULL || pubSz == NULL) {
  1269. return BAD_FUNC_ARG;
  1270. }
  1271. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  1272. ret = GeneratePrivateDh(key, rng, priv, privSz);
  1273. if (ret == 0)
  1274. ret = GeneratePublicDh(key, priv, *privSz, pub, pubSz);
  1275. #if defined(WOLFSSL_SP_MATH) || defined(HAVE_FFDHE)
  1276. if (ret == 0)
  1277. ret = _ffc_validate_public_key(key, pub, *pubSz, NULL, 0, 0);
  1278. #endif
  1279. if (ret == 0)
  1280. ret = _ffc_pairwise_consistency_test(key, pub, *pubSz, priv, *privSz);
  1281. RESTORE_VECTOR_REGISTERS();
  1282. return ret;
  1283. }
  1284. #endif /* !WOLFSSL_KCAPI_DH */
  1285. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_DH)
  1286. static int wc_DhGenerateKeyPair_Async(DhKey* key, WC_RNG* rng,
  1287. byte* priv, word32* privSz, byte* pub, word32* pubSz)
  1288. {
  1289. int ret;
  1290. #if defined(HAVE_INTEL_QA)
  1291. word32 pBits;
  1292. /* QAT DH sizes: 768, 1024, 1536, 2048, 3072 and 4096 bits */
  1293. pBits = mp_unsigned_bin_size(&key->p) * 8;
  1294. if (pBits == 768 || pBits == 1024 || pBits == 1536 ||
  1295. pBits == 2048 || pBits == 3072 || pBits == 4096) {
  1296. mp_int x;
  1297. ret = mp_init(&x);
  1298. if (ret != MP_OKAY)
  1299. return ret;
  1300. ret = GeneratePrivateDh(key, rng, priv, privSz);
  1301. if (ret == 0)
  1302. ret = mp_read_unsigned_bin(&x, priv, *privSz);
  1303. if (ret == MP_OKAY)
  1304. ret = wc_mp_to_bigint(&x, &x.raw);
  1305. if (ret == MP_OKAY)
  1306. ret = wc_mp_to_bigint(&key->p, &key->p.raw);
  1307. if (ret == MP_OKAY)
  1308. ret = wc_mp_to_bigint(&key->g, &key->g.raw);
  1309. if (ret == MP_OKAY)
  1310. ret = IntelQaDhKeyGen(&key->asyncDev, &key->p.raw, &key->g.raw,
  1311. &x.raw, pub, pubSz);
  1312. mp_clear(&x);
  1313. return ret;
  1314. }
  1315. #elif defined(HAVE_CAVIUM)
  1316. /* TODO: Not implemented - use software for now */
  1317. #else /* WOLFSSL_ASYNC_CRYPT_TEST */
  1318. if (wc_AsyncTestInit(&key->asyncDev, ASYNC_TEST_DH_GEN)) {
  1319. WC_ASYNC_TEST* testDev = &key->asyncDev.test;
  1320. testDev->dhGen.key = key;
  1321. testDev->dhGen.rng = rng;
  1322. testDev->dhGen.priv = priv;
  1323. testDev->dhGen.privSz = privSz;
  1324. testDev->dhGen.pub = pub;
  1325. testDev->dhGen.pubSz = pubSz;
  1326. return WC_PENDING_E;
  1327. }
  1328. #endif
  1329. /* otherwise use software DH */
  1330. ret = wc_DhGenerateKeyPair_Sync(key, rng, priv, privSz, pub, pubSz);
  1331. return ret;
  1332. }
  1333. #endif /* WOLFSSL_ASYNC_CRYPT && WC_ASYNC_ENABLE_DH */
  1334. /* Check DH Public Key for invalid numbers, optionally allowing
  1335. * the public key to be checked against the large prime (q).
  1336. * If q is NULL, the q value of key is used.
  1337. * Check per process in SP 800-56Ar3, section 5.6.2.3.1 or 2.
  1338. *
  1339. * key DH key group parameters.
  1340. * pub Public Key.
  1341. * pubSz Public Key size.
  1342. * prime Large prime (q), optionally NULL to skip check
  1343. * primeSz Size of large prime
  1344. * partial Do the partial test process. (section 5.6.2.3.2)
  1345. *
  1346. * returns 0 on success or error code
  1347. */
  1348. static int _ffc_validate_public_key(DhKey* key, const byte* pub, word32 pubSz,
  1349. const byte* prime, word32 primeSz, int partial)
  1350. {
  1351. int ret = 0;
  1352. #ifdef WOLFSSL_SMALL_STACK
  1353. mp_int* y = NULL;
  1354. mp_int* p = NULL;
  1355. mp_int* q = NULL;
  1356. #else
  1357. mp_int y[1];
  1358. mp_int p[1];
  1359. mp_int q[1];
  1360. #endif
  1361. if (key == NULL || pub == NULL) {
  1362. return BAD_FUNC_ARG;
  1363. }
  1364. #ifdef WOLFSSL_SMALL_STACK
  1365. y = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_DH);
  1366. if (y == NULL)
  1367. return MEMORY_E;
  1368. p = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_DH);
  1369. if (p == NULL) {
  1370. XFREE(y, key->heap, DYNAMIC_TYPE_DH);
  1371. return MEMORY_E;
  1372. }
  1373. q = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_DH);
  1374. if (q == NULL) {
  1375. XFREE(p, key->heap, DYNAMIC_TYPE_DH);
  1376. XFREE(y, key->heap, DYNAMIC_TYPE_DH);
  1377. return MEMORY_E;
  1378. }
  1379. #endif
  1380. if (mp_init_multi(y, p, q, NULL, NULL, NULL) != MP_OKAY) {
  1381. #ifdef WOLFSSL_SMALL_STACK
  1382. XFREE(q, key->heap, DYNAMIC_TYPE_DH);
  1383. XFREE(p, key->heap, DYNAMIC_TYPE_DH);
  1384. XFREE(y, key->heap, DYNAMIC_TYPE_DH);
  1385. #endif
  1386. return MP_INIT_E;
  1387. }
  1388. SAVE_VECTOR_REGISTERS(ret = _svr_ret;);
  1389. if (mp_read_unsigned_bin(y, pub, pubSz) != MP_OKAY) {
  1390. ret = MP_READ_E;
  1391. }
  1392. if (ret == 0 && prime != NULL) {
  1393. if (mp_read_unsigned_bin(q, prime, primeSz) != MP_OKAY)
  1394. ret = MP_READ_E;
  1395. } else if (mp_iszero(&key->q) == MP_NO) {
  1396. /* use q available in DhKey */
  1397. if (mp_copy(&key->q, q) != MP_OKAY)
  1398. ret = MP_INIT_E;
  1399. }
  1400. /* SP 800-56Ar3, section 5.6.2.3.2 */
  1401. /* pub (y) should not be 0 or 1 */
  1402. if (ret == 0 && mp_cmp_d(y, 2) == MP_LT) {
  1403. ret = MP_CMP_E;
  1404. }
  1405. /* pub (y) shouldn't be greater than or equal to p - 1 */
  1406. if (ret == 0 && mp_copy(&key->p, p) != MP_OKAY) {
  1407. ret = MP_INIT_E;
  1408. }
  1409. if (ret == 0 && mp_sub_d(p, 2, p) != MP_OKAY) {
  1410. ret = MP_SUB_E;
  1411. }
  1412. if (ret == 0 && mp_cmp(y, p) == MP_GT) {
  1413. ret = MP_CMP_E;
  1414. }
  1415. if (!partial) {
  1416. if (ret == 0 && (prime != NULL || (mp_iszero(&key->q) == MP_NO) )) {
  1417. /* restore key->p into p */
  1418. if (mp_copy(&key->p, p) != MP_OKAY)
  1419. ret = MP_INIT_E;
  1420. }
  1421. /* SP 800-56Ar3, section 5.6.2.3.1, process step 2 */
  1422. if (ret == 0 && prime != NULL) {
  1423. #ifdef WOLFSSL_HAVE_SP_DH
  1424. #ifndef WOLFSSL_SP_NO_2048
  1425. if (mp_count_bits(&key->p) == 2048) {
  1426. ret = sp_ModExp_2048(y, q, p, y);
  1427. if (ret != 0)
  1428. ret = MP_EXPTMOD_E;
  1429. }
  1430. else
  1431. #endif
  1432. #ifndef WOLFSSL_SP_NO_3072
  1433. if (mp_count_bits(&key->p) == 3072) {
  1434. ret = sp_ModExp_3072(y, q, p, y);
  1435. if (ret != 0)
  1436. ret = MP_EXPTMOD_E;
  1437. }
  1438. else
  1439. #endif
  1440. #ifdef WOLFSSL_SP_4096
  1441. if (mp_count_bits(&key->p) == 4096) {
  1442. ret = sp_ModExp_4096(y, q, p, y);
  1443. if (ret != 0)
  1444. ret = MP_EXPTMOD_E;
  1445. }
  1446. else
  1447. #endif
  1448. #endif
  1449. {
  1450. #if !defined(WOLFSSL_SP_MATH)
  1451. /* calculate (y^q) mod(p), store back into y */
  1452. if (mp_exptmod(y, q, p, y) != MP_OKAY)
  1453. ret = MP_EXPTMOD_E;
  1454. #else
  1455. ret = WC_KEY_SIZE_E;
  1456. #endif
  1457. }
  1458. /* verify above == 1 */
  1459. if (ret == 0 && mp_cmp_d(y, 1) != MP_EQ)
  1460. ret = MP_CMP_E;
  1461. }
  1462. }
  1463. mp_clear(y);
  1464. mp_clear(p);
  1465. mp_clear(q);
  1466. RESTORE_VECTOR_REGISTERS();
  1467. #ifdef WOLFSSL_SMALL_STACK
  1468. XFREE(q, key->heap, DYNAMIC_TYPE_DH);
  1469. XFREE(p, key->heap, DYNAMIC_TYPE_DH);
  1470. XFREE(y, key->heap, DYNAMIC_TYPE_DH);
  1471. #endif
  1472. return ret;
  1473. }
  1474. /* Performs a full public-key validation routine. */
  1475. int wc_DhCheckPubKey_ex(DhKey* key, const byte* pub, word32 pubSz,
  1476. const byte* prime, word32 primeSz)
  1477. {
  1478. return _ffc_validate_public_key(key, pub, pubSz, prime, primeSz, 0);
  1479. }
  1480. /* Check DH Public Key for invalid numbers. Performs a partial public-key
  1481. * validation routine.
  1482. *
  1483. * key DH key group parameters.
  1484. * pub Public Key.
  1485. * pubSz Public Key size.
  1486. *
  1487. * returns 0 on success or error code
  1488. */
  1489. int wc_DhCheckPubKey(DhKey* key, const byte* pub, word32 pubSz)
  1490. {
  1491. return _ffc_validate_public_key(key, pub, pubSz, NULL, 0, 1);
  1492. }
  1493. /**
  1494. * Quick validity check of public key value against prime.
  1495. * Checks are:
  1496. * - Public key not 0 or 1
  1497. * - Public key not equal to prime or prime - 1
  1498. * - Public key not bigger than prime.
  1499. *
  1500. * prime Big-endian encoding of prime in bytes.
  1501. * primeSz Size of prime in bytes.
  1502. * pub Big-endian encoding of public key in bytes.
  1503. * pubSz Size of public key in bytes.
  1504. */
  1505. int wc_DhCheckPubValue(const byte* prime, word32 primeSz, const byte* pub,
  1506. word32 pubSz)
  1507. {
  1508. int ret = 0;
  1509. word32 i;
  1510. for (i = 0; i < pubSz && pub[i] == 0; i++) {
  1511. }
  1512. pubSz -= i;
  1513. pub += i;
  1514. if (pubSz == 0 || (pubSz == 1 && pub[0] == 1))
  1515. ret = MP_VAL;
  1516. else if (pubSz == primeSz) {
  1517. for (i = 0; i < pubSz-1 && pub[i] == prime[i]; i++) {
  1518. }
  1519. if (i == pubSz-1 && (pub[i] == prime[i] || pub[i] == prime[i] - 1))
  1520. ret = MP_VAL;
  1521. else if (pub[i] > prime[i])
  1522. ret = MP_VAL;
  1523. }
  1524. else if (pubSz > primeSz)
  1525. ret = MP_VAL;
  1526. return ret;
  1527. }
  1528. /* Check DH Private Key for invalid numbers, optionally allowing
  1529. * the private key to be checked against the large prime (q).
  1530. * Check per process in SP 800-56Ar3, section 5.6.2.1.2.
  1531. *
  1532. * key DH key group parameters.
  1533. * priv Private Key.
  1534. * privSz Private Key size.
  1535. * prime Large prime (q), optionally NULL to skip check
  1536. * primeSz Size of large prime
  1537. *
  1538. * returns 0 on success or error code
  1539. */
  1540. int wc_DhCheckPrivKey_ex(DhKey* key, const byte* priv, word32 privSz,
  1541. const byte* prime, word32 primeSz)
  1542. {
  1543. int ret = 0;
  1544. #ifdef WOLFSSL_SMALL_STACK
  1545. mp_int* x = NULL;
  1546. mp_int* q = NULL;
  1547. #else
  1548. mp_int x[1];
  1549. mp_int q[1];
  1550. #endif
  1551. if (key == NULL || priv == NULL) {
  1552. return BAD_FUNC_ARG;
  1553. }
  1554. #ifdef WOLFSSL_SMALL_STACK
  1555. x = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_DH);
  1556. if (x == NULL)
  1557. return MEMORY_E;
  1558. q = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_DH);
  1559. if (q == NULL) {
  1560. XFREE(x, key->heap, DYNAMIC_TYPE_DH);
  1561. return MEMORY_E;
  1562. }
  1563. #endif
  1564. if (mp_init_multi(x, q, NULL, NULL, NULL, NULL) != MP_OKAY) {
  1565. #ifdef WOLFSSL_SMALL_STACK
  1566. XFREE(q, key->heap, DYNAMIC_TYPE_DH);
  1567. XFREE(x, key->heap, DYNAMIC_TYPE_DH);
  1568. #endif
  1569. return MP_INIT_E;
  1570. }
  1571. if (mp_read_unsigned_bin(x, priv, privSz) != MP_OKAY) {
  1572. ret = MP_READ_E;
  1573. }
  1574. if (ret == 0) {
  1575. if (prime != NULL) {
  1576. if (mp_read_unsigned_bin(q, prime, primeSz) != MP_OKAY)
  1577. ret = MP_READ_E;
  1578. }
  1579. else if (mp_iszero(&key->q) == MP_NO) {
  1580. /* use q available in DhKey */
  1581. if (mp_copy(&key->q, q) != MP_OKAY)
  1582. ret = MP_INIT_E;
  1583. }
  1584. }
  1585. /* priv (x) should not be 0 */
  1586. if (ret == 0) {
  1587. if (mp_cmp_d(x, 0) == MP_EQ)
  1588. ret = MP_CMP_E;
  1589. }
  1590. if (ret == 0) {
  1591. if (mp_iszero(q) == MP_NO) {
  1592. /* priv (x) shouldn't be greater than q - 1 */
  1593. if (ret == 0) {
  1594. if (mp_copy(&key->q, q) != MP_OKAY)
  1595. ret = MP_INIT_E;
  1596. }
  1597. if (ret == 0) {
  1598. if (mp_sub_d(q, 1, q) != MP_OKAY)
  1599. ret = MP_SUB_E;
  1600. }
  1601. if (ret == 0) {
  1602. if (mp_cmp(x, q) == MP_GT)
  1603. ret = DH_CHECK_PRIV_E;
  1604. }
  1605. }
  1606. }
  1607. mp_clear(x);
  1608. mp_clear(q);
  1609. #ifdef WOLFSSL_SMALL_STACK
  1610. XFREE(q, key->heap, DYNAMIC_TYPE_DH);
  1611. XFREE(x, key->heap, DYNAMIC_TYPE_DH);
  1612. #endif
  1613. return ret;
  1614. }
  1615. /* Check DH Private Key for invalid numbers
  1616. *
  1617. * key DH key group parameters.
  1618. * priv Private Key.
  1619. * privSz Private Key size.
  1620. *
  1621. * returns 0 on success or error code
  1622. */
  1623. int wc_DhCheckPrivKey(DhKey* key, const byte* priv, word32 privSz)
  1624. {
  1625. return wc_DhCheckPrivKey_ex(key, priv, privSz, NULL, 0);
  1626. }
  1627. /* Performs a Pairwise Consistency Test on an FFC key pair. */
  1628. /* Check DH Keys for pair-wise consistency per process in
  1629. * SP 800-56Ar3, section 5.6.2.1.4, method (b) for FFC. */
  1630. static int _ffc_pairwise_consistency_test(DhKey* key,
  1631. const byte* pub, word32 pubSz, const byte* priv, word32 privSz)
  1632. {
  1633. #ifdef WOLFSSL_SMALL_STACK
  1634. mp_int* publicKey = NULL;
  1635. mp_int* privateKey = NULL;
  1636. mp_int* checkKey = NULL;
  1637. #else
  1638. mp_int publicKey[1];
  1639. mp_int privateKey[1];
  1640. mp_int checkKey[1];
  1641. #endif
  1642. int ret = 0;
  1643. if (key == NULL || pub == NULL || priv == NULL)
  1644. return BAD_FUNC_ARG;
  1645. #ifdef WOLFSSL_SMALL_STACK
  1646. publicKey = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_DH);
  1647. if (publicKey == NULL)
  1648. return MEMORY_E;
  1649. privateKey = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_DH);
  1650. if (privateKey == NULL) {
  1651. XFREE(publicKey, key->heap, DYNAMIC_TYPE_DH);
  1652. return MEMORY_E;
  1653. }
  1654. checkKey = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_DH);
  1655. if (checkKey == NULL) {
  1656. XFREE(privateKey, key->heap, DYNAMIC_TYPE_DH);
  1657. XFREE(publicKey, key->heap, DYNAMIC_TYPE_DH);
  1658. return MEMORY_E;
  1659. }
  1660. #endif
  1661. if (mp_init_multi(publicKey, privateKey, checkKey,
  1662. NULL, NULL, NULL) != MP_OKAY) {
  1663. #ifdef WOLFSSL_SMALL_STACK
  1664. XFREE(privateKey, key->heap, DYNAMIC_TYPE_DH);
  1665. XFREE(publicKey, key->heap, DYNAMIC_TYPE_DH);
  1666. XFREE(checkKey, key->heap, DYNAMIC_TYPE_DH);
  1667. #endif
  1668. return MP_INIT_E;
  1669. }
  1670. SAVE_VECTOR_REGISTERS(ret = _svr_ret;);
  1671. /* Load the private and public keys into big integers. */
  1672. if (mp_read_unsigned_bin(publicKey, pub, pubSz) != MP_OKAY ||
  1673. mp_read_unsigned_bin(privateKey, priv, privSz) != MP_OKAY) {
  1674. ret = MP_READ_E;
  1675. }
  1676. /* Calculate checkKey = g^privateKey mod p */
  1677. if (ret == 0) {
  1678. #ifdef WOLFSSL_HAVE_SP_DH
  1679. #ifndef WOLFSSL_SP_NO_2048
  1680. if (mp_count_bits(&key->p) == 2048) {
  1681. ret = sp_ModExp_2048(&key->g, privateKey, &key->p, checkKey);
  1682. if (ret != 0)
  1683. ret = MP_EXPTMOD_E;
  1684. }
  1685. else
  1686. #endif
  1687. #ifndef WOLFSSL_SP_NO_3072
  1688. if (mp_count_bits(&key->p) == 3072) {
  1689. ret = sp_ModExp_3072(&key->g, privateKey, &key->p, checkKey);
  1690. if (ret != 0)
  1691. ret = MP_EXPTMOD_E;
  1692. }
  1693. else
  1694. #endif
  1695. #ifdef WOLFSSL_SP_4096
  1696. if (mp_count_bits(&key->p) == 4096) {
  1697. ret = sp_ModExp_4096(&key->g, privateKey, &key->p, checkKey);
  1698. if (ret != 0)
  1699. ret = MP_EXPTMOD_E;
  1700. }
  1701. else
  1702. #endif
  1703. #endif
  1704. {
  1705. #if !defined(WOLFSSL_SP_MATH)
  1706. if (mp_exptmod(&key->g, privateKey, &key->p, checkKey) != MP_OKAY)
  1707. ret = MP_EXPTMOD_E;
  1708. #else
  1709. ret = WC_KEY_SIZE_E;
  1710. #endif
  1711. }
  1712. }
  1713. /* Compare the calculated public key to the supplied check value. */
  1714. if (ret == 0) {
  1715. if (mp_cmp(checkKey, publicKey) != MP_EQ)
  1716. ret = MP_CMP_E;
  1717. }
  1718. mp_forcezero(privateKey);
  1719. mp_clear(publicKey);
  1720. mp_clear(checkKey);
  1721. RESTORE_VECTOR_REGISTERS();
  1722. #ifdef WOLFSSL_SMALL_STACK
  1723. XFREE(checkKey, key->heap, DYNAMIC_TYPE_DH);
  1724. XFREE(privateKey, key->heap, DYNAMIC_TYPE_DH);
  1725. XFREE(publicKey, key->heap, DYNAMIC_TYPE_DH);
  1726. #endif
  1727. return ret;
  1728. }
  1729. /* Check DH Keys for pair-wise consistency per process in
  1730. * SP 800-56Ar3, section 5.6.2.1.4, method (b) for FFC.
  1731. *
  1732. * key DH key group parameters.
  1733. * pub Public Key.
  1734. * pubSz Public Key size.
  1735. * priv Private Key.
  1736. * privSz Private Key size.
  1737. *
  1738. * returns 0 on success or error code
  1739. */
  1740. int wc_DhCheckKeyPair(DhKey* key, const byte* pub, word32 pubSz,
  1741. const byte* priv, word32 privSz)
  1742. {
  1743. return _ffc_pairwise_consistency_test(key, pub, pubSz, priv, privSz);
  1744. }
  1745. int wc_DhGenerateKeyPair(DhKey* key, WC_RNG* rng,
  1746. byte* priv, word32* privSz, byte* pub, word32* pubSz)
  1747. {
  1748. int ret;
  1749. if (key == NULL || rng == NULL || priv == NULL || privSz == NULL ||
  1750. pub == NULL || pubSz == NULL) {
  1751. return BAD_FUNC_ARG;
  1752. }
  1753. #ifdef WOLFSSL_KCAPI_DH
  1754. (void)priv;
  1755. (void)privSz;
  1756. ret = KcapiDh_MakeKey(key, pub, pubSz);
  1757. #else
  1758. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_DH)
  1759. if (key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_DH) {
  1760. ret = wc_DhGenerateKeyPair_Async(key, rng, priv, privSz, pub, pubSz);
  1761. }
  1762. else
  1763. #endif
  1764. {
  1765. ret = wc_DhGenerateKeyPair_Sync(key, rng, priv, privSz, pub, pubSz);
  1766. }
  1767. #endif /* WOLFSSL_KCAPI_DH */
  1768. return ret;
  1769. }
  1770. #ifndef WOLFSSL_KCAPI_DH
  1771. static int wc_DhAgree_Sync(DhKey* key, byte* agree, word32* agreeSz,
  1772. const byte* priv, word32 privSz, const byte* otherPub, word32 pubSz)
  1773. {
  1774. int ret = 0;
  1775. #ifdef WOLFSSL_SMALL_STACK
  1776. mp_int* y = NULL;
  1777. #if !defined(WOLFSSL_SP_MATH)
  1778. mp_int* x = NULL;
  1779. mp_int* z = NULL;
  1780. #endif
  1781. #else
  1782. mp_int y[1];
  1783. #if !defined(WOLFSSL_SP_MATH)
  1784. mp_int x[1];
  1785. mp_int z[1];
  1786. #endif
  1787. #endif
  1788. #ifdef WOLFSSL_VALIDATE_FFC_IMPORT
  1789. if (wc_DhCheckPrivKey(key, priv, privSz) != 0) {
  1790. WOLFSSL_MSG("wc_DhAgree wc_DhCheckPrivKey failed");
  1791. return DH_CHECK_PRIV_E;
  1792. }
  1793. if (wc_DhCheckPubKey(key, otherPub, pubSz) != 0) {
  1794. WOLFSSL_MSG("wc_DhAgree wc_DhCheckPubKey failed");
  1795. return DH_CHECK_PUB_E;
  1796. }
  1797. #endif
  1798. #ifdef WOLFSSL_SMALL_STACK
  1799. y = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_DH);
  1800. if (y == NULL)
  1801. return MEMORY_E;
  1802. #if !defined(WOLFSSL_SP_MATH)
  1803. x = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_DH);
  1804. if (x == NULL) {
  1805. XFREE(y, key->heap, DYNAMIC_TYPE_DH);
  1806. return MEMORY_E;
  1807. }
  1808. z = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_DH);
  1809. if (z == NULL) {
  1810. XFREE(x, key->heap, DYNAMIC_TYPE_DH);
  1811. XFREE(y, key->heap, DYNAMIC_TYPE_DH);
  1812. return MEMORY_E;
  1813. }
  1814. #endif
  1815. #endif
  1816. #ifdef WOLFSSL_HAVE_SP_DH
  1817. #ifndef WOLFSSL_SP_NO_2048
  1818. if (mp_count_bits(&key->p) == 2048) {
  1819. if (mp_init(y) != MP_OKAY)
  1820. return MP_INIT_E;
  1821. SAVE_VECTOR_REGISTERS(ret = _svr_ret;);
  1822. if (ret == 0 && mp_read_unsigned_bin(y, otherPub, pubSz) != MP_OKAY)
  1823. ret = MP_READ_E;
  1824. if (ret == 0)
  1825. ret = sp_DhExp_2048(y, priv, privSz, &key->p, agree, agreeSz);
  1826. mp_clear(y);
  1827. RESTORE_VECTOR_REGISTERS();
  1828. #ifdef WOLFSSL_SMALL_STACK
  1829. #if !defined(WOLFSSL_SP_MATH)
  1830. XFREE(z, key->heap, DYNAMIC_TYPE_DH);
  1831. XFREE(x, key->heap, DYNAMIC_TYPE_DH);
  1832. #endif
  1833. XFREE(y, key->heap, DYNAMIC_TYPE_DH);
  1834. #endif
  1835. return ret;
  1836. }
  1837. #endif
  1838. #ifndef WOLFSSL_SP_NO_3072
  1839. if (mp_count_bits(&key->p) == 3072) {
  1840. if (mp_init(y) != MP_OKAY)
  1841. return MP_INIT_E;
  1842. SAVE_VECTOR_REGISTERS(ret = _svr_ret;);
  1843. if (ret == 0 && mp_read_unsigned_bin(y, otherPub, pubSz) != MP_OKAY)
  1844. ret = MP_READ_E;
  1845. if (ret == 0)
  1846. ret = sp_DhExp_3072(y, priv, privSz, &key->p, agree, agreeSz);
  1847. mp_clear(y);
  1848. RESTORE_VECTOR_REGISTERS();
  1849. #ifdef WOLFSSL_SMALL_STACK
  1850. #if !defined(WOLFSSL_SP_MATH)
  1851. XFREE(z, key->heap, DYNAMIC_TYPE_DH);
  1852. XFREE(x, key->heap, DYNAMIC_TYPE_DH);
  1853. #endif
  1854. XFREE(y, key->heap, DYNAMIC_TYPE_DH);
  1855. #endif
  1856. return ret;
  1857. }
  1858. #endif
  1859. #ifdef WOLFSSL_SP_4096
  1860. if (mp_count_bits(&key->p) == 4096) {
  1861. if (mp_init(y) != MP_OKAY)
  1862. return MP_INIT_E;
  1863. SAVE_VECTOR_REGISTERS(ret = _svr_ret;);
  1864. if (ret == 0 && mp_read_unsigned_bin(y, otherPub, pubSz) != MP_OKAY)
  1865. ret = MP_READ_E;
  1866. if (ret == 0)
  1867. ret = sp_DhExp_4096(y, priv, privSz, &key->p, agree, agreeSz);
  1868. mp_clear(y);
  1869. RESTORE_VECTOR_REGISTERS();
  1870. #ifdef WOLFSSL_SMALL_STACK
  1871. #if !defined(WOLFSSL_SP_MATH)
  1872. XFREE(z, key->heap, DYNAMIC_TYPE_DH);
  1873. XFREE(x, key->heap, DYNAMIC_TYPE_DH);
  1874. #endif
  1875. XFREE(y, key->heap, DYNAMIC_TYPE_DH);
  1876. #endif
  1877. return ret;
  1878. }
  1879. #endif
  1880. #endif
  1881. #if !defined(WOLFSSL_SP_MATH)
  1882. if (mp_init_multi(x, y, z, 0, 0, 0) != MP_OKAY) {
  1883. #ifdef WOLFSSL_SMALL_STACK
  1884. XFREE(z, key->heap, DYNAMIC_TYPE_DH);
  1885. XFREE(x, key->heap, DYNAMIC_TYPE_DH);
  1886. XFREE(y, key->heap, DYNAMIC_TYPE_DH);
  1887. #endif
  1888. return MP_INIT_E;
  1889. }
  1890. SAVE_VECTOR_REGISTERS(ret = _svr_ret;);
  1891. if (mp_read_unsigned_bin(x, priv, privSz) != MP_OKAY)
  1892. ret = MP_READ_E;
  1893. if (ret == 0 && mp_read_unsigned_bin(y, otherPub, pubSz) != MP_OKAY)
  1894. ret = MP_READ_E;
  1895. if (ret == 0 && mp_exptmod(y, x, &key->p, z) != MP_OKAY)
  1896. ret = MP_EXPTMOD_E;
  1897. /* make sure z is not one (SP800-56A, 5.7.1.1) */
  1898. if (ret == 0 && (mp_cmp_d(z, 1) == MP_EQ))
  1899. ret = MP_VAL;
  1900. if (ret == 0 && mp_to_unsigned_bin(z, agree) != MP_OKAY)
  1901. ret = MP_TO_E;
  1902. if (ret == 0)
  1903. *agreeSz = mp_unsigned_bin_size(z);
  1904. mp_clear(z);
  1905. mp_clear(y);
  1906. mp_forcezero(x);
  1907. RESTORE_VECTOR_REGISTERS();
  1908. #else
  1909. ret = WC_KEY_SIZE_E;
  1910. #endif
  1911. #ifdef WOLFSSL_SMALL_STACK
  1912. #if !defined(WOLFSSL_SP_MATH)
  1913. XFREE(z, key->heap, DYNAMIC_TYPE_DH);
  1914. XFREE(x, key->heap, DYNAMIC_TYPE_DH);
  1915. #endif
  1916. XFREE(y, key->heap, DYNAMIC_TYPE_DH);
  1917. #endif
  1918. return ret;
  1919. }
  1920. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_DH)
  1921. static int wc_DhAgree_Async(DhKey* key, byte* agree, word32* agreeSz,
  1922. const byte* priv, word32 privSz, const byte* otherPub, word32 pubSz)
  1923. {
  1924. int ret;
  1925. #if defined(HAVE_INTEL_QA)
  1926. word32 pBits;
  1927. /* QAT DH sizes: 768, 1024, 1536, 2048, 3072 and 4096 bits */
  1928. pBits = mp_unsigned_bin_size(&key->p) * 8;
  1929. if (pBits == 768 || pBits == 1024 || pBits == 1536 ||
  1930. pBits == 2048 || pBits == 3072 || pBits == 4096) {
  1931. ret = wc_mp_to_bigint(&key->p, &key->p.raw);
  1932. if (ret == MP_OKAY)
  1933. ret = IntelQaDhAgree(&key->asyncDev, &key->p.raw,
  1934. agree, agreeSz, priv, privSz, otherPub, pubSz);
  1935. return ret;
  1936. }
  1937. #elif defined(HAVE_CAVIUM)
  1938. /* TODO: Not implemented - use software for now */
  1939. #else /* WOLFSSL_ASYNC_CRYPT_TEST */
  1940. if (wc_AsyncTestInit(&key->asyncDev, ASYNC_TEST_DH_AGREE)) {
  1941. WC_ASYNC_TEST* testDev = &key->asyncDev.test;
  1942. testDev->dhAgree.key = key;
  1943. testDev->dhAgree.agree = agree;
  1944. testDev->dhAgree.agreeSz = agreeSz;
  1945. testDev->dhAgree.priv = priv;
  1946. testDev->dhAgree.privSz = privSz;
  1947. testDev->dhAgree.otherPub = otherPub;
  1948. testDev->dhAgree.pubSz = pubSz;
  1949. return WC_PENDING_E;
  1950. }
  1951. #endif
  1952. /* otherwise use software DH */
  1953. ret = wc_DhAgree_Sync(key, agree, agreeSz, priv, privSz, otherPub, pubSz);
  1954. return ret;
  1955. }
  1956. #endif /* WOLFSSL_ASYNC_CRYPT */
  1957. #endif /* !WOLFSSL_KCAPI_DH */
  1958. int wc_DhAgree(DhKey* key, byte* agree, word32* agreeSz, const byte* priv,
  1959. word32 privSz, const byte* otherPub, word32 pubSz)
  1960. {
  1961. int ret = 0;
  1962. if (key == NULL || agree == NULL || agreeSz == NULL || priv == NULL ||
  1963. otherPub == NULL) {
  1964. return BAD_FUNC_ARG;
  1965. }
  1966. #ifdef WOLFSSL_KCAPI_DH
  1967. (void)priv;
  1968. (void)privSz;
  1969. ret = KcapiDh_SharedSecret(key, otherPub, pubSz, agree, agreeSz);
  1970. #else
  1971. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_DH)
  1972. if (key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_DH) {
  1973. ret = wc_DhAgree_Async(key, agree, agreeSz, priv, privSz, otherPub, pubSz);
  1974. }
  1975. else
  1976. #endif
  1977. {
  1978. ret = wc_DhAgree_Sync(key, agree, agreeSz, priv, privSz, otherPub, pubSz);
  1979. }
  1980. #endif /* WOLFSSL_KCAPI_DH */
  1981. return ret;
  1982. }
  1983. #ifdef WOLFSSL_DH_EXTRA
  1984. WOLFSSL_LOCAL int wc_DhKeyCopy(DhKey* src, DhKey* dst)
  1985. {
  1986. int ret;
  1987. if (!src || !dst || src == dst) {
  1988. WOLFSSL_MSG("Parameters not provided or are the same");
  1989. return BAD_FUNC_ARG;
  1990. }
  1991. if ((ret = mp_copy(&src->p, &dst->p)) != MP_OKAY) {
  1992. WOLFSSL_MSG("mp_copy error");
  1993. return ret;
  1994. }
  1995. if ((ret = mp_copy(&src->g, &dst->g)) != MP_OKAY) {
  1996. WOLFSSL_MSG("mp_copy error");
  1997. return ret;
  1998. }
  1999. if ((ret = mp_copy(&src->q, &dst->q)) != MP_OKAY) {
  2000. WOLFSSL_MSG("mp_copy error");
  2001. return ret;
  2002. }
  2003. if ((ret = mp_copy(&src->pub, &dst->pub)) != MP_OKAY) {
  2004. WOLFSSL_MSG("mp_copy error");
  2005. return ret;
  2006. }
  2007. if ((ret = mp_copy(&src->priv, &dst->priv)) != MP_OKAY) {
  2008. WOLFSSL_MSG("mp_copy error");
  2009. return ret;
  2010. }
  2011. dst->heap = src->heap;
  2012. return MP_OKAY;
  2013. }
  2014. /* Sets private and public key in DhKey if both are available, otherwise sets
  2015. either private or public key, depending on which is available. */
  2016. int wc_DhImportKeyPair(DhKey* key, const byte* priv, word32 privSz,
  2017. const byte* pub, word32 pubSz)
  2018. {
  2019. byte havePriv, havePub;
  2020. if (key == NULL) {
  2021. return BAD_FUNC_ARG;
  2022. }
  2023. havePriv = ( (priv != NULL) && (privSz > 0) );
  2024. havePub = ( (pub != NULL) && (pubSz > 0) );
  2025. if (!havePub && !havePriv) {
  2026. WOLFSSL_MSG("No Public or Private Key to Set");
  2027. return BAD_FUNC_ARG;
  2028. }
  2029. /* Set Private Key */
  2030. if (havePriv) {
  2031. /* may have leading 0 */
  2032. if (priv[0] == 0) {
  2033. privSz--; priv++;
  2034. }
  2035. if (mp_init(&key->priv) != MP_OKAY)
  2036. havePriv = 0;
  2037. }
  2038. if (havePriv) {
  2039. if (mp_read_unsigned_bin(&key->priv, priv, privSz) != MP_OKAY) {
  2040. mp_clear(&key->priv);
  2041. havePriv = 0;
  2042. } else {
  2043. WOLFSSL_MSG("DH Private Key Set");
  2044. }
  2045. }
  2046. /* Set Public Key */
  2047. if (havePub) {
  2048. /* may have leading 0 */
  2049. if (pub[0] == 0) {
  2050. pubSz--; pub++;
  2051. }
  2052. if (mp_init(&key->pub) != MP_OKAY)
  2053. havePub = 0;
  2054. }
  2055. if (havePub) {
  2056. if (mp_read_unsigned_bin(&key->pub, pub, pubSz) != MP_OKAY) {
  2057. mp_clear(&key->pub);
  2058. havePub = 0;
  2059. if (havePriv) {
  2060. mp_clear(&key->priv);
  2061. havePriv = 0; /* set to 0 to error out with failed read pub */
  2062. }
  2063. } else {
  2064. WOLFSSL_MSG("DH Public Key Set");
  2065. }
  2066. }
  2067. if (havePriv == 0 && havePub == 0) {
  2068. return MEMORY_E;
  2069. }
  2070. return 0;
  2071. }
  2072. /* Can be used with WOLFSSL_DH_EXTRA when key is loaded with
  2073. wc_DhKeyDecode or wc_DhImportKeyPair */
  2074. int wc_DhExportKeyPair(DhKey* key, byte* priv, word32* pPrivSz,
  2075. byte* pub, word32* pPubSz)
  2076. {
  2077. int ret = 0;
  2078. word32 pubSz, privSz;
  2079. if (key == NULL || (priv && pPrivSz == NULL) || (pub && pPubSz == NULL)) {
  2080. return BAD_FUNC_ARG;
  2081. }
  2082. if (priv) {
  2083. privSz = mp_unsigned_bin_size(&key->priv);
  2084. if (privSz > *pPrivSz) {
  2085. return BUFFER_E;
  2086. }
  2087. *pPrivSz = privSz;
  2088. ret |= mp_to_unsigned_bin(&key->priv, priv);
  2089. }
  2090. if (pub) {
  2091. pubSz = mp_unsigned_bin_size(&key->pub);
  2092. if (pubSz > *pPubSz) {
  2093. return BUFFER_E;
  2094. }
  2095. *pPubSz = pubSz;
  2096. ret |= mp_to_unsigned_bin(&key->pub, pub);
  2097. }
  2098. if (ret != 0)
  2099. ret = ASN_DH_KEY_E;
  2100. return ret;
  2101. }
  2102. #endif /* WOLFSSL_DH_EXTRA */
  2103. static int _DhSetKey(DhKey* key, const byte* p, word32 pSz, const byte* g,
  2104. word32 gSz, const byte* q, word32 qSz, int trusted,
  2105. WC_RNG* rng)
  2106. {
  2107. int ret = 0;
  2108. mp_int* keyP = NULL;
  2109. mp_int* keyG = NULL;
  2110. if (key == NULL || p == NULL || g == NULL || pSz == 0 || gSz == 0) {
  2111. ret = BAD_FUNC_ARG;
  2112. }
  2113. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  2114. if (ret == 0) {
  2115. /* may have leading 0 */
  2116. if (p[0] == 0) {
  2117. pSz--; p++;
  2118. }
  2119. if (g[0] == 0) {
  2120. gSz--; g++;
  2121. }
  2122. if (q != NULL) {
  2123. if (q[0] == 0) {
  2124. qSz--; q++;
  2125. }
  2126. }
  2127. if (mp_init(&key->p) != MP_OKAY)
  2128. ret = MP_INIT_E;
  2129. }
  2130. if (ret == 0) {
  2131. if (mp_read_unsigned_bin(&key->p, p, pSz) != MP_OKAY)
  2132. ret = ASN_DH_KEY_E;
  2133. else
  2134. keyP = &key->p;
  2135. }
  2136. if (ret == 0 && !trusted) {
  2137. int isPrime = 0;
  2138. if (rng != NULL)
  2139. ret = mp_prime_is_prime_ex(keyP, 8, &isPrime, rng);
  2140. else
  2141. ret = mp_prime_is_prime(keyP, 8, &isPrime);
  2142. if (ret == 0 && isPrime == 0)
  2143. ret = DH_CHECK_PUB_E;
  2144. }
  2145. if (ret == 0 && mp_init(&key->g) != MP_OKAY)
  2146. ret = MP_INIT_E;
  2147. if (ret == 0) {
  2148. if (mp_read_unsigned_bin(&key->g, g, gSz) != MP_OKAY)
  2149. ret = ASN_DH_KEY_E;
  2150. else
  2151. keyG = &key->g;
  2152. }
  2153. if (ret == 0 && q != NULL) {
  2154. if (mp_init(&key->q) != MP_OKAY)
  2155. ret = MP_INIT_E;
  2156. }
  2157. if (ret == 0 && q != NULL) {
  2158. if (mp_read_unsigned_bin(&key->q, q, qSz) != MP_OKAY)
  2159. ret = MP_INIT_E;
  2160. else
  2161. key->trustedGroup = trusted;
  2162. }
  2163. if (ret != 0 && key != NULL) {
  2164. if (keyG)
  2165. mp_clear(keyG);
  2166. if (keyP)
  2167. mp_clear(keyP);
  2168. }
  2169. RESTORE_VECTOR_REGISTERS();
  2170. return ret;
  2171. }
  2172. int wc_DhSetCheckKey(DhKey* key, const byte* p, word32 pSz, const byte* g,
  2173. word32 gSz, const byte* q, word32 qSz, int trusted,
  2174. WC_RNG* rng)
  2175. {
  2176. return _DhSetKey(key, p, pSz, g, gSz, q, qSz, trusted, rng);
  2177. }
  2178. int wc_DhSetKey_ex(DhKey* key, const byte* p, word32 pSz, const byte* g,
  2179. word32 gSz, const byte* q, word32 qSz)
  2180. {
  2181. return _DhSetKey(key, p, pSz, g, gSz, q, qSz, 0, NULL);
  2182. }
  2183. /* not in asn anymore since no actual asn types used */
  2184. int wc_DhSetKey(DhKey* key, const byte* p, word32 pSz, const byte* g,
  2185. word32 gSz)
  2186. {
  2187. /* This should not have trusted set. */
  2188. return _DhSetKey(key, p, pSz, g, gSz, NULL, 0, 1, NULL);
  2189. }
  2190. int wc_DhSetNamedKey(DhKey* key, int name)
  2191. {
  2192. const byte* p = NULL;
  2193. const byte* g = NULL;
  2194. const byte* q = NULL;
  2195. word32 pSz = 0, gSz = 0, qSz = 0;
  2196. switch (name) {
  2197. #ifdef HAVE_FFDHE_2048
  2198. case WC_FFDHE_2048:
  2199. p = dh_ffdhe2048_p;
  2200. pSz = sizeof(dh_ffdhe2048_p);
  2201. g = dh_ffdhe2048_g;
  2202. gSz = sizeof(dh_ffdhe2048_g);
  2203. #ifdef HAVE_FFDHE_Q
  2204. q = dh_ffdhe2048_q;
  2205. qSz = sizeof(dh_ffdhe2048_q);
  2206. #endif /* HAVE_FFDHE_Q */
  2207. break;
  2208. #endif /* HAVE_FFDHE_2048 */
  2209. #ifdef HAVE_FFDHE_3072
  2210. case WC_FFDHE_3072:
  2211. p = dh_ffdhe3072_p;
  2212. pSz = sizeof(dh_ffdhe3072_p);
  2213. g = dh_ffdhe3072_g;
  2214. gSz = sizeof(dh_ffdhe3072_g);
  2215. #ifdef HAVE_FFDHE_Q
  2216. q = dh_ffdhe3072_q;
  2217. qSz = sizeof(dh_ffdhe3072_q);
  2218. #endif /* HAVE_FFDHE_Q */
  2219. break;
  2220. #endif /* HAVE_FFDHE_3072 */
  2221. #ifdef HAVE_FFDHE_4096
  2222. case WC_FFDHE_4096:
  2223. p = dh_ffdhe4096_p;
  2224. pSz = sizeof(dh_ffdhe4096_p);
  2225. g = dh_ffdhe4096_g;
  2226. gSz = sizeof(dh_ffdhe4096_g);
  2227. #ifdef HAVE_FFDHE_Q
  2228. q = dh_ffdhe4096_q;
  2229. qSz = sizeof(dh_ffdhe4096_q);
  2230. #endif /* HAVE_FFDHE_Q */
  2231. break;
  2232. #endif /* HAVE_FFDHE_4096 */
  2233. #ifdef HAVE_FFDHE_6144
  2234. case WC_FFDHE_6144:
  2235. p = dh_ffdhe6144_p;
  2236. pSz = sizeof(dh_ffdhe6144_p);
  2237. g = dh_ffdhe6144_g;
  2238. gSz = sizeof(dh_ffdhe6144_g);
  2239. #ifdef HAVE_FFDHE_Q
  2240. q = dh_ffdhe6144_q;
  2241. qSz = sizeof(dh_ffdhe6144_q);
  2242. #endif /* HAVE_FFDHE_Q */
  2243. break;
  2244. #endif /* HAVE_FFDHE_6144 */
  2245. #ifdef HAVE_FFDHE_8192
  2246. case WC_FFDHE_8192:
  2247. p = dh_ffdhe8192_p;
  2248. pSz = sizeof(dh_ffdhe8192_p);
  2249. g = dh_ffdhe8192_g;
  2250. gSz = sizeof(dh_ffdhe8192_g);
  2251. #ifdef HAVE_FFDHE_Q
  2252. q = dh_ffdhe8192_q;
  2253. qSz = sizeof(dh_ffdhe8192_q);
  2254. #endif /* HAVE_FFDHE_Q */
  2255. break;
  2256. #endif /* HAVE_FFDHE_8192 */
  2257. default:
  2258. break;
  2259. }
  2260. return _DhSetKey(key, p, pSz, g, gSz, q, qSz, 1, NULL);
  2261. }
  2262. word32 wc_DhGetNamedKeyMinSize(int name)
  2263. {
  2264. int size;
  2265. switch (name) {
  2266. #ifdef HAVE_FFDHE_2048
  2267. case WC_FFDHE_2048:
  2268. size = 29;
  2269. break;
  2270. #endif /* HAVE_FFDHE_2048 */
  2271. #ifdef HAVE_FFDHE_3072
  2272. case WC_FFDHE_3072:
  2273. size = 34;
  2274. break;
  2275. #endif /* HAVE_FFDHE_3072 */
  2276. #ifdef HAVE_FFDHE_4096
  2277. case WC_FFDHE_4096:
  2278. size = 39;
  2279. break;
  2280. #endif /* HAVE_FFDHE_4096 */
  2281. #ifdef HAVE_FFDHE_6144
  2282. case WC_FFDHE_6144:
  2283. size = 46;
  2284. break;
  2285. #endif /* HAVE_FFDHE_6144 */
  2286. #ifdef HAVE_FFDHE_8192
  2287. case WC_FFDHE_8192:
  2288. size = 52;
  2289. break;
  2290. #endif /* HAVE_FFDHE_8192 */
  2291. default:
  2292. size = 0;
  2293. }
  2294. return size;
  2295. }
  2296. /* Returns 1: params match
  2297. * 0: params differ */
  2298. int wc_DhCmpNamedKey(int name, int noQ,
  2299. const byte* p, word32 pSz,
  2300. const byte* g, word32 gSz,
  2301. const byte* q, word32 qSz)
  2302. {
  2303. const byte* pCmp = NULL;
  2304. const byte* qCmp = NULL;
  2305. const byte* gCmp = NULL;
  2306. word32 pCmpSz = 0, qCmpSz = 0, gCmpSz = 0;
  2307. int cmp = 0, goodName = 1;
  2308. switch (name) {
  2309. #ifdef HAVE_FFDHE_2048
  2310. case WC_FFDHE_2048:
  2311. pCmp = dh_ffdhe2048_p;
  2312. pCmpSz = sizeof(dh_ffdhe2048_p);
  2313. gCmp = dh_ffdhe2048_g;
  2314. gCmpSz = sizeof(dh_ffdhe2048_g);
  2315. #ifdef HAVE_FFDHE_Q
  2316. qCmp = dh_ffdhe2048_q;
  2317. qCmpSz = sizeof(dh_ffdhe2048_q);
  2318. #endif /* HAVE_FFDHE_Q */
  2319. break;
  2320. #endif /* HAVE_FFDHE_2048 */
  2321. #ifdef HAVE_FFDHE_3072
  2322. case WC_FFDHE_3072:
  2323. pCmp = dh_ffdhe3072_p;
  2324. pCmpSz = sizeof(dh_ffdhe3072_p);
  2325. gCmp = dh_ffdhe3072_g;
  2326. gCmpSz = sizeof(dh_ffdhe3072_g);
  2327. #ifdef HAVE_FFDHE_Q
  2328. qCmp = dh_ffdhe3072_q;
  2329. qCmpSz = sizeof(dh_ffdhe3072_q);
  2330. #endif /* HAVE_FFDHE_Q */
  2331. break;
  2332. #endif /* HAVE_FFDHE_3072 */
  2333. #ifdef HAVE_FFDHE_4096
  2334. case WC_FFDHE_4096:
  2335. pCmp = dh_ffdhe4096_p;
  2336. pCmpSz = sizeof(dh_ffdhe4096_p);
  2337. gCmp = dh_ffdhe4096_g;
  2338. gCmpSz = sizeof(dh_ffdhe4096_g);
  2339. #ifdef HAVE_FFDHE_Q
  2340. qCmp = dh_ffdhe4096_q;
  2341. qCmpSz = sizeof(dh_ffdhe4096_q);
  2342. #endif /* HAVE_FFDHE_Q */
  2343. break;
  2344. #endif /* HAVE_FFDHE_4096 */
  2345. #ifdef HAVE_FFDHE_6144
  2346. case WC_FFDHE_6144:
  2347. pCmp = dh_ffdhe6144_p;
  2348. pCmpSz = sizeof(dh_ffdhe6144_p);
  2349. gCmp = dh_ffdhe6144_g;
  2350. gCmpSz = sizeof(dh_ffdhe6144_g);
  2351. #ifdef HAVE_FFDHE_Q
  2352. qCmp = dh_ffdhe6144_q;
  2353. qCmpSz = sizeof(dh_ffdhe6144_q);
  2354. #endif /* HAVE_FFDHE_Q */
  2355. break;
  2356. #endif /* HAVE_FFDHE_6144 */
  2357. #ifdef HAVE_FFDHE_8192
  2358. case WC_FFDHE_8192:
  2359. pCmp = dh_ffdhe8192_p;
  2360. pCmpSz = sizeof(dh_ffdhe8192_p);
  2361. gCmp = dh_ffdhe8192_g;
  2362. gCmpSz = sizeof(dh_ffdhe8192_g);
  2363. #ifdef HAVE_FFDHE_Q
  2364. qCmp = dh_ffdhe8192_q;
  2365. qCmpSz = sizeof(dh_ffdhe8192_q);
  2366. #endif /* HAVE_FFDHE_Q */
  2367. break;
  2368. #endif /* HAVE_FFDHE_8192 */
  2369. default:
  2370. goodName = 0;
  2371. }
  2372. cmp = goodName && (pSz == pCmpSz) && (gSz == gCmpSz) &&
  2373. (noQ || ((qCmp != NULL) && (qSz == qCmpSz) &&
  2374. XMEMCMP(q, qCmp, qCmpSz) == 0)) &&
  2375. (XMEMCMP(p, pCmp, pCmpSz) == 0) &&
  2376. (XMEMCMP(g, gCmp, gCmpSz) == 0);
  2377. return cmp;
  2378. }
  2379. int wc_DhGetNamedKeyParamSize(int name, word32* p, word32* g, word32* q)
  2380. {
  2381. word32 pSz = 0, gSz = 0, qSz = 0;
  2382. switch (name) {
  2383. #ifdef HAVE_FFDHE_2048
  2384. case WC_FFDHE_2048:
  2385. pSz = sizeof(dh_ffdhe2048_p);
  2386. gSz = sizeof(dh_ffdhe2048_g);
  2387. #ifdef HAVE_FFDHE_Q
  2388. qSz = sizeof(dh_ffdhe2048_q);
  2389. #endif /* HAVE_FFDHE_Q */
  2390. break;
  2391. #endif /* HAVE_FFDHE_2048 */
  2392. #ifdef HAVE_FFDHE_3072
  2393. case WC_FFDHE_3072:
  2394. pSz = sizeof(dh_ffdhe3072_p);
  2395. gSz = sizeof(dh_ffdhe3072_g);
  2396. #ifdef HAVE_FFDHE_Q
  2397. qSz = sizeof(dh_ffdhe3072_q);
  2398. #endif /* HAVE_FFDHE_Q */
  2399. break;
  2400. #endif /* HAVE_FFDHE_3072 */
  2401. #ifdef HAVE_FFDHE_4096
  2402. case WC_FFDHE_4096:
  2403. pSz = sizeof(dh_ffdhe4096_p);
  2404. gSz = sizeof(dh_ffdhe4096_g);
  2405. #ifdef HAVE_FFDHE_Q
  2406. qSz = sizeof(dh_ffdhe4096_q);
  2407. #endif /* HAVE_FFDHE_Q */
  2408. break;
  2409. #endif /* HAVE_FFDHE_4096 */
  2410. #ifdef HAVE_FFDHE_6144
  2411. case WC_FFDHE_6144:
  2412. pSz = sizeof(dh_ffdhe6144_p);
  2413. gSz = sizeof(dh_ffdhe6144_g);
  2414. #ifdef HAVE_FFDHE_Q
  2415. qSz = sizeof(dh_ffdhe6144_q);
  2416. #endif /* HAVE_FFDHE_Q */
  2417. break;
  2418. #endif /* HAVE_FFDHE_6144 */
  2419. #ifdef HAVE_FFDHE_8192
  2420. case WC_FFDHE_8192:
  2421. pSz = sizeof(dh_ffdhe8192_p);
  2422. gSz = sizeof(dh_ffdhe8192_g);
  2423. #ifdef HAVE_FFDHE_Q
  2424. qSz = sizeof(dh_ffdhe8192_q);
  2425. #endif /* HAVE_FFDHE_Q */
  2426. break;
  2427. #endif /* HAVE_FFDHE_8192 */
  2428. default:
  2429. break;
  2430. }
  2431. if (p != NULL) *p = pSz;
  2432. if (g != NULL) *g = gSz;
  2433. if (q != NULL) *q = qSz;
  2434. return 0;
  2435. }
  2436. int wc_DhCopyNamedKey(int name,
  2437. byte* p, word32* pSz, byte* g, word32* gSz, byte* q, word32* qSz)
  2438. {
  2439. const byte* pC = NULL;
  2440. const byte* gC = NULL;
  2441. const byte* qC = NULL;
  2442. word32 pCSz = 0, gCSz = 0, qCSz = 0;
  2443. switch (name) {
  2444. #ifdef HAVE_FFDHE_2048
  2445. case WC_FFDHE_2048:
  2446. pC = dh_ffdhe2048_p;
  2447. pCSz = sizeof(dh_ffdhe2048_p);
  2448. gC = dh_ffdhe2048_g;
  2449. gCSz = sizeof(dh_ffdhe2048_g);
  2450. #ifdef HAVE_FFDHE_Q
  2451. qC = dh_ffdhe2048_q;
  2452. qCSz = sizeof(dh_ffdhe2048_q);
  2453. #endif /* HAVE_FFDHE_Q */
  2454. break;
  2455. #endif /* HAVE_FFDHE_2048 */
  2456. #ifdef HAVE_FFDHE_3072
  2457. case WC_FFDHE_3072:
  2458. pC = dh_ffdhe3072_p;
  2459. pCSz = sizeof(dh_ffdhe3072_p);
  2460. gC = dh_ffdhe3072_g;
  2461. gCSz = sizeof(dh_ffdhe3072_g);
  2462. #ifdef HAVE_FFDHE_Q
  2463. qC = dh_ffdhe3072_q;
  2464. qCSz = sizeof(dh_ffdhe3072_q);
  2465. #endif /* HAVE_FFDHE_Q */
  2466. break;
  2467. #endif /* HAVE_FFDHE_3072 */
  2468. #ifdef HAVE_FFDHE_4096
  2469. case WC_FFDHE_4096:
  2470. pC = dh_ffdhe4096_p;
  2471. pCSz = sizeof(dh_ffdhe4096_p);
  2472. gC = dh_ffdhe4096_g;
  2473. gCSz = sizeof(dh_ffdhe4096_g);
  2474. #ifdef HAVE_FFDHE_Q
  2475. qC = dh_ffdhe4096_q;
  2476. qCSz = sizeof(dh_ffdhe4096_q);
  2477. #endif /* HAVE_FFDHE_Q */
  2478. break;
  2479. #endif /* HAVE_FFDHE_4096 */
  2480. #ifdef HAVE_FFDHE_6144
  2481. case WC_FFDHE_6144:
  2482. pC = dh_ffdhe6144_p;
  2483. pCSz = sizeof(dh_ffdhe6144_p);
  2484. gC = dh_ffdhe6144_g;
  2485. gCSz = sizeof(dh_ffdhe6144_g);
  2486. #ifdef HAVE_FFDHE_Q
  2487. qC = dh_ffdhe6144_q;
  2488. qCSz = sizeof(dh_ffdhe6144_q);
  2489. #endif /* HAVE_FFDHE_Q */
  2490. break;
  2491. #endif /* HAVE_FFDHE_6144 */
  2492. #ifdef HAVE_FFDHE_8192
  2493. case WC_FFDHE_8192:
  2494. pC = dh_ffdhe8192_p;
  2495. pCSz = sizeof(dh_ffdhe8192_p);
  2496. gC = dh_ffdhe8192_g;
  2497. gCSz = sizeof(dh_ffdhe8192_g);
  2498. #ifdef HAVE_FFDHE_Q
  2499. qC = dh_ffdhe8192_q;
  2500. qCSz = sizeof(dh_ffdhe8192_q);
  2501. #endif /* HAVE_FFDHE_Q */
  2502. break;
  2503. #endif /* HAVE_FFDHE_8192 */
  2504. default:
  2505. break;
  2506. }
  2507. if (p != NULL && pC != NULL)
  2508. XMEMCPY(p, pC, pCSz);
  2509. if (pSz != NULL)
  2510. *pSz = pCSz;
  2511. if (g != NULL && gC != NULL)
  2512. XMEMCPY(g, gC, gCSz);
  2513. if (gSz != NULL)
  2514. *gSz = gCSz;
  2515. if (q != NULL && qC != NULL)
  2516. XMEMCPY(q, qC, qCSz);
  2517. if (qSz != NULL)
  2518. *qSz = qCSz;
  2519. return 0;
  2520. }
  2521. #ifdef WOLFSSL_KEY_GEN
  2522. /* modulus_size in bits */
  2523. int wc_DhGenerateParams(WC_RNG *rng, int modSz, DhKey *dh)
  2524. {
  2525. #ifdef WOLFSSL_SMALL_STACK
  2526. mp_int *tmp = NULL, *tmp2 = NULL;
  2527. #else
  2528. mp_int tmp[1], tmp2[2];
  2529. #endif
  2530. int groupSz = 0, bufSz = 0,
  2531. primeCheckCount = 0,
  2532. primeCheck = MP_NO,
  2533. ret = 0;
  2534. unsigned char *buf = NULL;
  2535. if (rng == NULL || dh == NULL)
  2536. ret = BAD_FUNC_ARG;
  2537. /* set group size in bytes from modulus size
  2538. * FIPS 186-4 defines valid values (1024, 160) (2048, 256) (3072, 256)
  2539. */
  2540. if (ret == 0) {
  2541. switch (modSz) {
  2542. case 1024:
  2543. groupSz = 20;
  2544. break;
  2545. case 2048:
  2546. case 3072:
  2547. groupSz = 32;
  2548. break;
  2549. default:
  2550. ret = BAD_FUNC_ARG;
  2551. break;
  2552. }
  2553. }
  2554. if (ret == 0) {
  2555. /* modulus size in bytes */
  2556. modSz /= WOLFSSL_BIT_SIZE;
  2557. bufSz = modSz - groupSz;
  2558. /* allocate ram */
  2559. buf = (unsigned char *)XMALLOC(bufSz,
  2560. dh->heap, DYNAMIC_TYPE_TMP_BUFFER);
  2561. if (buf == NULL)
  2562. ret = MEMORY_E;
  2563. }
  2564. /* make a random string that will be multiplied against q */
  2565. if (ret == 0)
  2566. ret = wc_RNG_GenerateBlock(rng, buf, bufSz);
  2567. #ifdef WOLFSSL_SMALL_STACK
  2568. if (ret == 0) {
  2569. if (((tmp = (mp_int *)XMALLOC(sizeof(*tmp), NULL, DYNAMIC_TYPE_WOLF_BIGINT)) == NULL) ||
  2570. ((tmp2 = (mp_int *)XMALLOC(sizeof(*tmp2), NULL, DYNAMIC_TYPE_WOLF_BIGINT)) == NULL))
  2571. ret = MEMORY_E;
  2572. }
  2573. #endif
  2574. SAVE_VECTOR_REGISTERS(ret = _svr_ret;);
  2575. if (ret == 0) {
  2576. /* force magnitude */
  2577. buf[0] |= 0xC0;
  2578. /* force even */
  2579. buf[bufSz - 1] &= ~1;
  2580. if (mp_init_multi(tmp, tmp2, &dh->p, &dh->q, &dh->g, 0)
  2581. != MP_OKAY) {
  2582. ret = MP_INIT_E;
  2583. }
  2584. }
  2585. if (ret == 0) {
  2586. if (mp_read_unsigned_bin(tmp2, buf, bufSz) != MP_OKAY)
  2587. ret = MP_READ_E;
  2588. }
  2589. /* make our prime q */
  2590. if (ret == 0) {
  2591. if (mp_rand_prime(&dh->q, groupSz, rng, NULL) != MP_OKAY)
  2592. ret = PRIME_GEN_E;
  2593. }
  2594. /* p = random * q */
  2595. if (ret == 0) {
  2596. if (mp_mul(&dh->q, tmp2, &dh->p) != MP_OKAY)
  2597. ret = MP_MUL_E;
  2598. }
  2599. /* p = random * q + 1, so q is a prime divisor of p-1 */
  2600. if (ret == 0) {
  2601. if (mp_add_d(&dh->p, 1, &dh->p) != MP_OKAY)
  2602. ret = MP_ADD_E;
  2603. }
  2604. /* tmp = 2q */
  2605. if (ret == 0) {
  2606. if (mp_add(&dh->q, &dh->q, tmp) != MP_OKAY)
  2607. ret = MP_ADD_E;
  2608. }
  2609. /* loop until p is prime */
  2610. if (ret == 0) {
  2611. do {
  2612. if (mp_prime_is_prime_ex(&dh->p, 8, &primeCheck, rng) != MP_OKAY)
  2613. ret = PRIME_GEN_E;
  2614. if (primeCheck != MP_YES) {
  2615. /* p += 2q */
  2616. if (mp_add(tmp, &dh->p, &dh->p) != MP_OKAY)
  2617. ret = MP_ADD_E;
  2618. else
  2619. primeCheckCount++;
  2620. }
  2621. } while (ret == 0 && primeCheck == MP_NO);
  2622. }
  2623. /* tmp2 += (2*loop_check_prime)
  2624. * to have p = (q * tmp2) + 1 prime
  2625. */
  2626. if ((ret == 0) && (primeCheckCount)) {
  2627. if (mp_add_d(tmp2, 2 * primeCheckCount, tmp2) != MP_OKAY)
  2628. ret = MP_ADD_E;
  2629. }
  2630. /* find a value g for which g^tmp2 != 1 */
  2631. if ((ret == 0) && (mp_set(&dh->g, 1) != MP_OKAY))
  2632. ret = MP_ZERO_E;
  2633. if (ret == 0) {
  2634. do {
  2635. if (mp_add_d(&dh->g, 1, &dh->g) != MP_OKAY)
  2636. ret = MP_ADD_E;
  2637. else if (mp_exptmod(&dh->g, tmp2, &dh->p, tmp) != MP_OKAY)
  2638. ret = MP_EXPTMOD_E;
  2639. } while (ret == 0 && mp_cmp_d(tmp, 1) == MP_EQ);
  2640. }
  2641. if (ret == 0) {
  2642. /* at this point tmp generates a group of order q mod p */
  2643. #ifndef USE_FAST_MATH
  2644. /* Exchanging is quick when the data pointer can be copied. */
  2645. mp_exch(tmp, &dh->g);
  2646. #else
  2647. mp_copy(tmp, &dh->g);
  2648. #endif
  2649. }
  2650. /* clear the parameters if there was an error */
  2651. if ((ret != 0) && (dh != NULL)) {
  2652. mp_clear(&dh->q);
  2653. mp_clear(&dh->p);
  2654. mp_clear(&dh->g);
  2655. }
  2656. RESTORE_VECTOR_REGISTERS();
  2657. if (buf != NULL) {
  2658. ForceZero(buf, bufSz);
  2659. if (dh != NULL) {
  2660. XFREE(buf, dh->heap, DYNAMIC_TYPE_TMP_BUFFER);
  2661. }
  2662. }
  2663. #ifdef WOLFSSL_SMALL_STACK
  2664. if (tmp != NULL) {
  2665. mp_clear(tmp);
  2666. XFREE(tmp, NULL, DYNAMIC_TYPE_WOLF_BIGINT);
  2667. }
  2668. if (tmp2 != NULL) {
  2669. mp_clear(tmp2);
  2670. XFREE(tmp2, NULL, DYNAMIC_TYPE_WOLF_BIGINT);
  2671. }
  2672. #else
  2673. mp_clear(tmp);
  2674. mp_clear(tmp2);
  2675. #endif
  2676. return ret;
  2677. }
  2678. /* Export raw DH parameters from DhKey structure
  2679. *
  2680. * dh - pointer to initialized DhKey structure
  2681. * p - output location for DH (p) parameter
  2682. * pSz - [IN/OUT] size of output buffer for p, size of p
  2683. * q - output location for DH (q) parameter
  2684. * qSz - [IN/OUT] size of output buffer for q, size of q
  2685. * g - output location for DH (g) parameter
  2686. * gSz - [IN/OUT] size of output buffer for g, size of g
  2687. *
  2688. * If p, q, and g pointers are all passed in as NULL, the function
  2689. * will set pSz, qSz, and gSz to the required output buffer sizes for p,
  2690. * q, and g. In this case, the function will return LENGTH_ONLY_E.
  2691. *
  2692. * returns 0 on success, negative upon failure
  2693. */
  2694. int wc_DhExportParamsRaw(DhKey* dh, byte* p, word32* pSz,
  2695. byte* q, word32* qSz, byte* g, word32* gSz)
  2696. {
  2697. int ret = 0;
  2698. word32 pLen = 0, qLen = 0, gLen = 0;
  2699. if (dh == NULL || pSz == NULL || qSz == NULL || gSz == NULL)
  2700. ret = BAD_FUNC_ARG;
  2701. /* get required output buffer sizes */
  2702. if (ret == 0) {
  2703. pLen = mp_unsigned_bin_size(&dh->p);
  2704. qLen = mp_unsigned_bin_size(&dh->q);
  2705. gLen = mp_unsigned_bin_size(&dh->g);
  2706. /* return buffer sizes and LENGTH_ONLY_E if buffers are NULL */
  2707. if (p == NULL && q == NULL && g == NULL) {
  2708. *pSz = pLen;
  2709. *qSz = qLen;
  2710. *gSz = gLen;
  2711. ret = LENGTH_ONLY_E;
  2712. }
  2713. }
  2714. if (ret == 0) {
  2715. if (p == NULL || q == NULL || g == NULL)
  2716. ret = BAD_FUNC_ARG;
  2717. }
  2718. /* export p */
  2719. if (ret == 0) {
  2720. if (*pSz < pLen) {
  2721. WOLFSSL_MSG("Output buffer for DH p parameter too small, "
  2722. "required size placed into pSz");
  2723. *pSz = pLen;
  2724. ret = BUFFER_E;
  2725. }
  2726. }
  2727. if (ret == 0) {
  2728. *pSz = pLen;
  2729. if (mp_to_unsigned_bin(&dh->p, p) != MP_OKAY)
  2730. ret = MP_TO_E;
  2731. }
  2732. /* export q */
  2733. if (ret == 0) {
  2734. if (*qSz < qLen) {
  2735. WOLFSSL_MSG("Output buffer for DH q parameter too small, "
  2736. "required size placed into qSz");
  2737. *qSz = qLen;
  2738. ret = BUFFER_E;
  2739. }
  2740. }
  2741. if (ret == 0) {
  2742. *qSz = qLen;
  2743. if (mp_to_unsigned_bin(&dh->q, q) != MP_OKAY)
  2744. ret = MP_TO_E;
  2745. }
  2746. /* export g */
  2747. if (ret == 0) {
  2748. if (*gSz < gLen) {
  2749. WOLFSSL_MSG("Output buffer for DH g parameter too small, "
  2750. "required size placed into gSz");
  2751. *gSz = gLen;
  2752. ret = BUFFER_E;
  2753. }
  2754. }
  2755. if (ret == 0) {
  2756. *gSz = gLen;
  2757. if (mp_to_unsigned_bin(&dh->g, g) != MP_OKAY)
  2758. ret = MP_TO_E;
  2759. }
  2760. return ret;
  2761. }
  2762. #endif /* WOLFSSL_KEY_GEN */
  2763. #endif /* NO_DH */