dh.c 101 KB

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