dh.c 104 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183
  1. /* dh.c
  2. *
  3. * Copyright (C) 2006-2023 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) WC_DO_NOTHING
  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(word32 modLen, word32 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. word32 qSz, pSz, cSz;
  1032. int err;
  1033. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
  1034. mp_int* tmpQ = NULL;
  1035. mp_int* tmpX = NULL;
  1036. byte* cBuf = NULL;
  1037. #else
  1038. mp_int tmpQ[1], tmpX[1];
  1039. byte cBuf[DH_MAX_SIZE + 64 / WOLFSSL_BIT_SIZE];
  1040. #endif
  1041. /* Parameters validated in calling functions. */
  1042. if (mp_iszero(&key->q) == MP_YES) {
  1043. WOLFSSL_MSG("DH q parameter needed for FIPS 186-4 key generation");
  1044. return BAD_FUNC_ARG;
  1045. }
  1046. qSz = (word32)mp_unsigned_bin_size(&key->q);
  1047. pSz = (word32)mp_unsigned_bin_size(&key->p);
  1048. /* verify (L,N) pair bit lengths */
  1049. /* Trusted primes don't need to be checked. */
  1050. if (!key->trustedGroup &&
  1051. CheckDhLN(pSz * WOLFSSL_BIT_SIZE, qSz * WOLFSSL_BIT_SIZE) != 0) {
  1052. WOLFSSL_MSG("DH param sizes do not match SP 800-56A requirements");
  1053. return BAD_FUNC_ARG;
  1054. }
  1055. /* generate extra 64 bits so that bias from mod function is negligible */
  1056. cSz = *privSz + (64 / WOLFSSL_BIT_SIZE);
  1057. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
  1058. cBuf = (byte*)XMALLOC(cSz, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  1059. if (cBuf == NULL) {
  1060. return MEMORY_E;
  1061. }
  1062. tmpQ = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_DH);
  1063. if (tmpQ == NULL) {
  1064. XFREE(cBuf, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  1065. return MEMORY_E;
  1066. }
  1067. tmpX = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_DH);
  1068. if (tmpX == NULL) {
  1069. XFREE(cBuf, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  1070. XFREE(tmpQ, key->heap, DYNAMIC_TYPE_DH);
  1071. return MEMORY_E;
  1072. }
  1073. #endif
  1074. if ((err = mp_init_multi(tmpX, tmpQ, NULL, NULL, NULL, NULL))
  1075. != MP_OKAY) {
  1076. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
  1077. XFREE(cBuf, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  1078. XFREE(tmpQ, key->heap, DYNAMIC_TYPE_DH);
  1079. XFREE(tmpX, key->heap, DYNAMIC_TYPE_DH);
  1080. #endif
  1081. return err;
  1082. }
  1083. #ifdef WOLFSSL_CHECK_MEM_ZERO
  1084. wc_MemZero_Add("GeneratePrivateDh186 cBuf", cBuf, cSz);
  1085. mp_memzero_add("GeneratePrivateDh186 tmpX", tmpX);
  1086. #endif
  1087. do {
  1088. /* generate N+64 bits (c) from RBG into tmpX, making sure positive.
  1089. * Hash_DRBG uses SHA-256 which matches maximum
  1090. * requested_security_strength of (L,N) */
  1091. err = wc_RNG_GenerateBlock(rng, cBuf, cSz);
  1092. if (err == MP_OKAY)
  1093. err = mp_read_unsigned_bin(tmpX, cBuf, cSz);
  1094. if (err != MP_OKAY) {
  1095. mp_clear(tmpX);
  1096. mp_clear(tmpQ);
  1097. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
  1098. XFREE(cBuf, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  1099. XFREE(tmpQ, key->heap, DYNAMIC_TYPE_DH);
  1100. XFREE(tmpX, key->heap, DYNAMIC_TYPE_DH);
  1101. #endif
  1102. return err;
  1103. }
  1104. } while (mp_cmp_d(tmpX, 1) != MP_GT);
  1105. ForceZero(cBuf, cSz);
  1106. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
  1107. XFREE(cBuf, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
  1108. #elif defined(WOLFSSL_CHECK_MEM_ZERO)
  1109. wc_MemZero_Check(cBuf, cSz);
  1110. #endif
  1111. /* tmpQ: M = min(2^N,q) - 1 */
  1112. if (err == MP_OKAY)
  1113. err = mp_2expt(tmpQ, (int)*privSz * 8);
  1114. if (err == MP_OKAY) {
  1115. if (mp_cmp(tmpQ, &key->q) == MP_GT) {
  1116. err = mp_copy(&key->q, tmpQ);
  1117. }
  1118. }
  1119. if (err == MP_OKAY)
  1120. err = mp_sub_d(tmpQ, 1, tmpQ);
  1121. /* x = c mod (M), tmpX holds c */
  1122. if (err == MP_OKAY)
  1123. err = mp_mod(tmpX, tmpQ, tmpX);
  1124. /* x = c mod (M) + 1 */
  1125. if (err == MP_OKAY)
  1126. err = mp_add_d(tmpX, 1, tmpX);
  1127. /* copy tmpX into priv */
  1128. if (err == MP_OKAY) {
  1129. pSz = (word32)mp_unsigned_bin_size(tmpX);
  1130. if (pSz > *privSz) {
  1131. WOLFSSL_MSG("DH private key output buffer too small");
  1132. err = BAD_FUNC_ARG;
  1133. } else {
  1134. *privSz = pSz;
  1135. err = mp_to_unsigned_bin(tmpX, priv);
  1136. }
  1137. }
  1138. mp_forcezero(tmpX);
  1139. mp_clear(tmpQ);
  1140. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
  1141. XFREE(tmpQ, key->heap, DYNAMIC_TYPE_DH);
  1142. XFREE(tmpX, key->heap, DYNAMIC_TYPE_DH);
  1143. #elif defined(WOLFSSL_CHECK_MEM_ZERO)
  1144. mp_memzero_check(tmpX);
  1145. #endif
  1146. return err;
  1147. }
  1148. #endif /* WOLFSSL_NO_DH186 */
  1149. #endif /* !WC_NO_RNG */
  1150. static int GeneratePrivateDh(DhKey* key, WC_RNG* rng, byte* priv,
  1151. word32* privSz)
  1152. {
  1153. #ifndef WC_NO_RNG
  1154. int ret = 0;
  1155. word32 sz = 0;
  1156. if (mp_iseven(&key->p) == MP_YES) {
  1157. ret = MP_VAL;
  1158. }
  1159. else
  1160. #ifndef WOLFSSL_NO_DH186
  1161. if (mp_iszero(&key->q) == MP_NO) {
  1162. /* q param available, use NIST SP 800-56Ar3, "5.6.1.1.3 Key Pair
  1163. * Generation Using Extra Random Bits" */
  1164. ret = GeneratePrivateDh186(key, rng, priv, privSz);
  1165. }
  1166. else
  1167. #endif
  1168. {
  1169. sz = (word32)mp_unsigned_bin_size(&key->p);
  1170. /* Table of predetermined values from the operation
  1171. 2 * DiscreteLogWorkFactor(sz * WOLFSSL_BIT_SIZE) /
  1172. WOLFSSL_BIT_SIZE + 1
  1173. Sizes in table checked against RFC 3526
  1174. */
  1175. WOLFSSL_DH_ROUND(sz); /* if using fixed points only, then round up */
  1176. switch (sz) {
  1177. case 128: sz = 21; break;
  1178. case 256: sz = 29; break;
  1179. case 384: sz = 34; break;
  1180. case 512: sz = 39; break;
  1181. case 640: sz = 42; break;
  1182. case 768: sz = 46; break;
  1183. case 896: sz = 49; break;
  1184. case 1024: sz = 52; break;
  1185. default:
  1186. #ifndef WOLFSSL_DH_CONST
  1187. /* if using floating points and size of p is not in table */
  1188. sz = min(sz, 2 * DiscreteLogWorkFactor(sz * WOLFSSL_BIT_SIZE) /
  1189. WOLFSSL_BIT_SIZE + 1);
  1190. break;
  1191. #else
  1192. return BAD_FUNC_ARG;
  1193. #endif
  1194. }
  1195. if (sz > *privSz)
  1196. ret = WC_KEY_SIZE_E;
  1197. if (ret == 0)
  1198. ret = wc_RNG_GenerateBlock(rng, priv, sz);
  1199. if (ret == 0) {
  1200. priv[0] |= 0x0C;
  1201. *privSz = sz;
  1202. }
  1203. }
  1204. return ret;
  1205. #else
  1206. (void)key;
  1207. (void)rng;
  1208. (void)priv;
  1209. (void)privSz;
  1210. return NOT_COMPILED_IN;
  1211. #endif /* WC_NO_RNG */
  1212. }
  1213. static int GeneratePublicDh(DhKey* key, byte* priv, word32 privSz,
  1214. byte* pub, word32* pubSz)
  1215. {
  1216. int ret = 0;
  1217. #ifndef WOLFSSL_SP_MATH
  1218. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
  1219. mp_int* x;
  1220. mp_int* y;
  1221. #else
  1222. mp_int x[1];
  1223. mp_int y[1];
  1224. #endif
  1225. #endif
  1226. if (*pubSz < (word32)mp_unsigned_bin_size(&key->p)) {
  1227. return WC_KEY_SIZE_E;
  1228. }
  1229. #ifdef WOLFSSL_HAVE_SP_DH
  1230. #ifndef WOLFSSL_SP_NO_2048
  1231. if (mp_count_bits(&key->p) == 2048)
  1232. return sp_DhExp_2048(&key->g, priv, privSz, &key->p, pub, pubSz);
  1233. #endif
  1234. #ifndef WOLFSSL_SP_NO_3072
  1235. if (mp_count_bits(&key->p) == 3072)
  1236. return sp_DhExp_3072(&key->g, priv, privSz, &key->p, pub, pubSz);
  1237. #endif
  1238. #ifdef WOLFSSL_SP_4096
  1239. if (mp_count_bits(&key->p) == 4096)
  1240. return sp_DhExp_4096(&key->g, priv, privSz, &key->p, pub, pubSz);
  1241. #endif
  1242. #endif
  1243. #if !defined(WOLFSSL_SP_MATH)
  1244. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
  1245. x = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_DH);
  1246. if (x == NULL)
  1247. return MEMORY_E;
  1248. y = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_DH);
  1249. if (y == NULL) {
  1250. XFREE(x, key->heap, DYNAMIC_TYPE_DH);
  1251. return MEMORY_E;
  1252. }
  1253. #endif
  1254. if (mp_init_multi(x, y, 0, 0, 0, 0) != MP_OKAY) {
  1255. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
  1256. XFREE(y, key->heap, DYNAMIC_TYPE_DH);
  1257. XFREE(x, key->heap, DYNAMIC_TYPE_DH);
  1258. #endif
  1259. return MP_INIT_E;
  1260. }
  1261. if (mp_read_unsigned_bin(x, priv, privSz) != MP_OKAY)
  1262. ret = MP_READ_E;
  1263. if (ret == 0 && mp_exptmod(&key->g, x, &key->p, y) != MP_OKAY)
  1264. ret = MP_EXPTMOD_E;
  1265. if (ret == 0 && mp_to_unsigned_bin(y, pub) != MP_OKAY)
  1266. ret = MP_TO_E;
  1267. if (ret == 0)
  1268. *pubSz = (word32)mp_unsigned_bin_size(y);
  1269. mp_clear(y);
  1270. mp_clear(x);
  1271. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
  1272. XFREE(y, key->heap, DYNAMIC_TYPE_DH);
  1273. XFREE(x, key->heap, DYNAMIC_TYPE_DH);
  1274. #endif
  1275. #else
  1276. ret = WC_KEY_SIZE_E;
  1277. #endif
  1278. return ret;
  1279. }
  1280. static int wc_DhGenerateKeyPair_Sync(DhKey* key, WC_RNG* rng,
  1281. byte* priv, word32* privSz, byte* pub, word32* pubSz)
  1282. {
  1283. int ret;
  1284. if (key == NULL || rng == NULL || priv == NULL || privSz == NULL ||
  1285. pub == NULL || pubSz == NULL) {
  1286. return BAD_FUNC_ARG;
  1287. }
  1288. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  1289. ret = GeneratePrivateDh(key, rng, priv, privSz);
  1290. if (ret == 0)
  1291. ret = GeneratePublicDh(key, priv, *privSz, pub, pubSz);
  1292. #if FIPS_VERSION_GE(5,0) || defined(WOLFSSL_VALIDATE_DH_KEYGEN)
  1293. if (ret == 0)
  1294. ret = _ffc_validate_public_key(key, pub, *pubSz, NULL, 0, 0);
  1295. if (ret == 0)
  1296. ret = _ffc_pairwise_consistency_test(key, pub, *pubSz, priv, *privSz);
  1297. #endif /* FIPS V5 or later || WOLFSSL_VALIDATE_DH_KEYGEN */
  1298. RESTORE_VECTOR_REGISTERS();
  1299. return ret;
  1300. }
  1301. #endif /* !WOLFSSL_KCAPI_DH */
  1302. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_DH)
  1303. static int wc_DhGenerateKeyPair_Async(DhKey* key, WC_RNG* rng,
  1304. byte* priv, word32* privSz, byte* pub, word32* pubSz)
  1305. {
  1306. int ret;
  1307. #if defined(HAVE_INTEL_QA)
  1308. word32 pBits;
  1309. /* QAT DH sizes: 768, 1024, 1536, 2048, 3072 and 4096 bits */
  1310. pBits = mp_unsigned_bin_size(&key->p) * 8;
  1311. if (pBits == 768 || pBits == 1024 || pBits == 1536 ||
  1312. pBits == 2048 || pBits == 3072 || pBits == 4096) {
  1313. mp_int x;
  1314. ret = mp_init(&x);
  1315. if (ret != MP_OKAY)
  1316. return ret;
  1317. ret = GeneratePrivateDh(key, rng, priv, privSz);
  1318. if (ret == 0)
  1319. ret = mp_read_unsigned_bin(&x, priv, *privSz);
  1320. if (ret == MP_OKAY)
  1321. ret = wc_mp_to_bigint(&x, &x.raw);
  1322. if (ret == MP_OKAY)
  1323. ret = wc_mp_to_bigint(&key->p, &key->p.raw);
  1324. if (ret == MP_OKAY)
  1325. ret = wc_mp_to_bigint(&key->g, &key->g.raw);
  1326. if (ret == MP_OKAY)
  1327. ret = IntelQaDhKeyGen(&key->asyncDev, &key->p.raw, &key->g.raw,
  1328. &x.raw, pub, pubSz);
  1329. mp_clear(&x);
  1330. return ret;
  1331. }
  1332. #elif defined(HAVE_CAVIUM)
  1333. /* TODO: Not implemented - use software for now */
  1334. #else /* WOLFSSL_ASYNC_CRYPT_SW */
  1335. if (wc_AsyncSwInit(&key->asyncDev, ASYNC_SW_DH_GEN)) {
  1336. WC_ASYNC_SW* sw = &key->asyncDev.sw;
  1337. sw->dhGen.key = key;
  1338. sw->dhGen.rng = rng;
  1339. sw->dhGen.priv = priv;
  1340. sw->dhGen.privSz = privSz;
  1341. sw->dhGen.pub = pub;
  1342. sw->dhGen.pubSz = pubSz;
  1343. return WC_PENDING_E;
  1344. }
  1345. #endif
  1346. /* otherwise use software DH */
  1347. ret = wc_DhGenerateKeyPair_Sync(key, rng, priv, privSz, pub, pubSz);
  1348. return ret;
  1349. }
  1350. #endif /* WOLFSSL_ASYNC_CRYPT && WC_ASYNC_ENABLE_DH */
  1351. /* Check DH Public Key for invalid numbers, optionally allowing
  1352. * the public key to be checked against the large prime (q).
  1353. * If q is NULL, the q value of key is used.
  1354. * Check per process in SP 800-56Ar3, section 5.6.2.3.1 or 2.
  1355. *
  1356. * key DH key group parameters.
  1357. * pub Public Key.
  1358. * pubSz Public Key size.
  1359. * prime Large prime (q), optionally NULL to skip check
  1360. * primeSz Size of large prime
  1361. * partial Do the partial test process. (section 5.6.2.3.2)
  1362. *
  1363. * returns 0 on success or error code
  1364. */
  1365. static int _ffc_validate_public_key(DhKey* key, const byte* pub, word32 pubSz,
  1366. const byte* prime, word32 primeSz, int partial)
  1367. {
  1368. int ret = 0;
  1369. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
  1370. mp_int* y = NULL;
  1371. mp_int* p = NULL;
  1372. mp_int* q = NULL;
  1373. #else
  1374. mp_int y[1];
  1375. mp_int p[1];
  1376. mp_int q[1];
  1377. #endif
  1378. if (key == NULL || pub == NULL) {
  1379. return BAD_FUNC_ARG;
  1380. }
  1381. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
  1382. y = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_DH);
  1383. if (y == NULL)
  1384. return MEMORY_E;
  1385. p = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_DH);
  1386. if (p == NULL) {
  1387. XFREE(y, key->heap, DYNAMIC_TYPE_DH);
  1388. return MEMORY_E;
  1389. }
  1390. q = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_DH);
  1391. if (q == NULL) {
  1392. XFREE(p, key->heap, DYNAMIC_TYPE_DH);
  1393. XFREE(y, key->heap, DYNAMIC_TYPE_DH);
  1394. return MEMORY_E;
  1395. }
  1396. #endif
  1397. if (mp_init_multi(y, p, q, NULL, NULL, NULL) != MP_OKAY) {
  1398. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
  1399. XFREE(q, key->heap, DYNAMIC_TYPE_DH);
  1400. XFREE(p, key->heap, DYNAMIC_TYPE_DH);
  1401. XFREE(y, key->heap, DYNAMIC_TYPE_DH);
  1402. #endif
  1403. return MP_INIT_E;
  1404. }
  1405. SAVE_VECTOR_REGISTERS(ret = _svr_ret;);
  1406. if (mp_read_unsigned_bin(y, pub, pubSz) != MP_OKAY) {
  1407. ret = MP_READ_E;
  1408. }
  1409. if (ret == 0 && prime != NULL) {
  1410. if (mp_read_unsigned_bin(q, prime, primeSz) != MP_OKAY)
  1411. ret = MP_READ_E;
  1412. } else if (mp_iszero(&key->q) == MP_NO) {
  1413. /* use q available in DhKey */
  1414. if (mp_copy(&key->q, q) != MP_OKAY)
  1415. ret = MP_INIT_E;
  1416. }
  1417. /* SP 800-56Ar3, section 5.6.2.3.2 */
  1418. /* pub (y) should not be 0 or 1 */
  1419. if (ret == 0 && mp_cmp_d(y, 2) == MP_LT) {
  1420. ret = MP_CMP_E;
  1421. }
  1422. /* pub (y) shouldn't be greater than or equal to p - 1 */
  1423. if (ret == 0 && mp_copy(&key->p, p) != MP_OKAY) {
  1424. ret = MP_INIT_E;
  1425. }
  1426. if (ret == 0 && mp_sub_d(p, 2, p) != MP_OKAY) {
  1427. ret = MP_SUB_E;
  1428. }
  1429. if (ret == 0 && mp_cmp(y, p) == MP_GT) {
  1430. ret = MP_CMP_E;
  1431. }
  1432. if (!partial) {
  1433. if (ret == 0 && (prime != NULL || (mp_iszero(&key->q) == MP_NO) )) {
  1434. /* restore key->p into p */
  1435. if (mp_copy(&key->p, p) != MP_OKAY)
  1436. ret = MP_INIT_E;
  1437. }
  1438. /* SP 800-56Ar3, section 5.6.2.3.1, process step 2 */
  1439. if (ret == 0 && prime != NULL) {
  1440. #ifdef WOLFSSL_HAVE_SP_DH
  1441. #ifndef WOLFSSL_SP_NO_2048
  1442. if (mp_count_bits(&key->p) == 2048) {
  1443. ret = sp_ModExp_2048(y, q, p, y);
  1444. if (ret != 0)
  1445. ret = MP_EXPTMOD_E;
  1446. }
  1447. else
  1448. #endif
  1449. #ifndef WOLFSSL_SP_NO_3072
  1450. if (mp_count_bits(&key->p) == 3072) {
  1451. ret = sp_ModExp_3072(y, q, p, y);
  1452. if (ret != 0)
  1453. ret = MP_EXPTMOD_E;
  1454. }
  1455. else
  1456. #endif
  1457. #ifdef WOLFSSL_SP_4096
  1458. if (mp_count_bits(&key->p) == 4096) {
  1459. ret = sp_ModExp_4096(y, q, p, y);
  1460. if (ret != 0)
  1461. ret = MP_EXPTMOD_E;
  1462. }
  1463. else
  1464. #endif
  1465. #endif
  1466. {
  1467. #if !defined(WOLFSSL_SP_MATH)
  1468. /* calculate (y^q) mod(p), store back into y */
  1469. if (mp_exptmod(y, q, p, y) != MP_OKAY)
  1470. ret = MP_EXPTMOD_E;
  1471. #else
  1472. ret = WC_KEY_SIZE_E;
  1473. #endif
  1474. }
  1475. /* verify above == 1 */
  1476. if (ret == 0 && mp_cmp_d(y, 1) != MP_EQ)
  1477. ret = MP_CMP_E;
  1478. }
  1479. }
  1480. mp_clear(y);
  1481. mp_clear(p);
  1482. mp_clear(q);
  1483. RESTORE_VECTOR_REGISTERS();
  1484. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
  1485. XFREE(q, key->heap, DYNAMIC_TYPE_DH);
  1486. XFREE(p, key->heap, DYNAMIC_TYPE_DH);
  1487. XFREE(y, key->heap, DYNAMIC_TYPE_DH);
  1488. #endif
  1489. return ret;
  1490. }
  1491. /* Performs a full public-key validation routine. */
  1492. int wc_DhCheckPubKey_ex(DhKey* key, const byte* pub, word32 pubSz,
  1493. const byte* prime, word32 primeSz)
  1494. {
  1495. return _ffc_validate_public_key(key, pub, pubSz, prime, primeSz, 0);
  1496. }
  1497. /* Check DH Public Key for invalid numbers. Performs a partial public-key
  1498. * validation routine.
  1499. *
  1500. * key DH key group parameters.
  1501. * pub Public Key.
  1502. * pubSz Public Key size.
  1503. *
  1504. * returns 0 on success or error code
  1505. */
  1506. int wc_DhCheckPubKey(DhKey* key, const byte* pub, word32 pubSz)
  1507. {
  1508. return _ffc_validate_public_key(key, pub, pubSz, NULL, 0, 1);
  1509. }
  1510. /**
  1511. * Quick validity check of public key value against prime.
  1512. * Checks are:
  1513. * - Public key not 0 or 1
  1514. * - Public key not equal to prime or prime - 1
  1515. * - Public key not bigger than prime.
  1516. *
  1517. * prime Big-endian encoding of prime in bytes.
  1518. * primeSz Size of prime in bytes.
  1519. * pub Big-endian encoding of public key in bytes.
  1520. * pubSz Size of public key in bytes.
  1521. */
  1522. int wc_DhCheckPubValue(const byte* prime, word32 primeSz, const byte* pub,
  1523. word32 pubSz)
  1524. {
  1525. int ret = 0;
  1526. word32 i;
  1527. for (i = 0; i < pubSz && pub[i] == 0; i++) {
  1528. }
  1529. pubSz -= i;
  1530. pub += i;
  1531. if (pubSz == 0 || (pubSz == 1 && pub[0] == 1))
  1532. ret = MP_VAL;
  1533. else if (pubSz == primeSz) {
  1534. for (i = 0; i < pubSz-1 && pub[i] == prime[i]; i++) {
  1535. }
  1536. if (i == pubSz-1 && (pub[i] == prime[i] || pub[i] == prime[i] - 1))
  1537. ret = MP_VAL;
  1538. else if (pub[i] > prime[i])
  1539. ret = MP_VAL;
  1540. }
  1541. else if (pubSz > primeSz)
  1542. ret = MP_VAL;
  1543. return ret;
  1544. }
  1545. /* Check DH Private Key for invalid numbers, optionally allowing
  1546. * the private key to be checked against the large prime (q).
  1547. * Check per process in SP 800-56Ar3, section 5.6.2.1.2.
  1548. *
  1549. * key DH key group parameters.
  1550. * priv Private Key.
  1551. * privSz Private Key size.
  1552. * prime Large prime (q), optionally NULL to skip check
  1553. * primeSz Size of large prime
  1554. *
  1555. * returns 0 on success or error code
  1556. */
  1557. int wc_DhCheckPrivKey_ex(DhKey* key, const byte* priv, word32 privSz,
  1558. const byte* prime, word32 primeSz)
  1559. {
  1560. int ret = 0;
  1561. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
  1562. mp_int* x = NULL;
  1563. mp_int* q = NULL;
  1564. #else
  1565. mp_int x[1];
  1566. mp_int q[1];
  1567. #endif
  1568. if (key == NULL || priv == NULL) {
  1569. return BAD_FUNC_ARG;
  1570. }
  1571. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
  1572. x = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_DH);
  1573. if (x == NULL)
  1574. return MEMORY_E;
  1575. q = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_DH);
  1576. if (q == NULL) {
  1577. XFREE(x, key->heap, DYNAMIC_TYPE_DH);
  1578. return MEMORY_E;
  1579. }
  1580. #endif
  1581. if (mp_init_multi(x, q, NULL, NULL, NULL, NULL) != MP_OKAY) {
  1582. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
  1583. XFREE(q, key->heap, DYNAMIC_TYPE_DH);
  1584. XFREE(x, key->heap, DYNAMIC_TYPE_DH);
  1585. #endif
  1586. return MP_INIT_E;
  1587. }
  1588. if (mp_read_unsigned_bin(x, priv, privSz) != MP_OKAY) {
  1589. ret = MP_READ_E;
  1590. }
  1591. if (ret == 0) {
  1592. #ifdef WOLFSSL_CHECK_MEM_ZERO
  1593. mp_memzero_add("wc_DhCheckPrivKey_ex x", x);
  1594. #endif
  1595. if (prime != NULL) {
  1596. if (mp_read_unsigned_bin(q, prime, primeSz) != MP_OKAY)
  1597. ret = MP_READ_E;
  1598. }
  1599. else if (mp_iszero(&key->q) == MP_NO) {
  1600. /* use q available in DhKey */
  1601. if (mp_copy(&key->q, q) != MP_OKAY)
  1602. ret = MP_INIT_E;
  1603. }
  1604. }
  1605. /* priv (x) should not be 0 */
  1606. if (ret == 0) {
  1607. if (mp_cmp_d(x, 0) == MP_EQ)
  1608. ret = MP_CMP_E;
  1609. }
  1610. if (ret == 0) {
  1611. if (mp_iszero(q) == MP_NO) {
  1612. /* priv (x) shouldn't be greater than q - 1 */
  1613. if (mp_copy(&key->q, q) != MP_OKAY)
  1614. ret = MP_INIT_E;
  1615. if (ret == 0) {
  1616. if (mp_sub_d(q, 1, q) != MP_OKAY)
  1617. ret = MP_SUB_E;
  1618. }
  1619. if (ret == 0) {
  1620. if (mp_cmp(x, q) == MP_GT)
  1621. ret = DH_CHECK_PRIV_E;
  1622. }
  1623. }
  1624. }
  1625. mp_forcezero(x);
  1626. mp_clear(q);
  1627. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
  1628. XFREE(q, key->heap, DYNAMIC_TYPE_DH);
  1629. XFREE(x, key->heap, DYNAMIC_TYPE_DH);
  1630. #elif defined(WOLFSSL_CHECK_MEM_ZERO)
  1631. mp_memzero_check(x);
  1632. #endif
  1633. return ret;
  1634. }
  1635. /* Check DH Private Key for invalid numbers
  1636. *
  1637. * key DH key group parameters.
  1638. * priv Private Key.
  1639. * privSz Private Key size.
  1640. *
  1641. * returns 0 on success or error code
  1642. */
  1643. int wc_DhCheckPrivKey(DhKey* key, const byte* priv, word32 privSz)
  1644. {
  1645. return wc_DhCheckPrivKey_ex(key, priv, privSz, NULL, 0);
  1646. }
  1647. /* Performs a Pairwise Consistency Test on an FFC key pair. */
  1648. /* Check DH Keys for pair-wise consistency per process in
  1649. * SP 800-56Ar3, section 5.6.2.1.4, method (b) for FFC. */
  1650. static int _ffc_pairwise_consistency_test(DhKey* key,
  1651. const byte* pub, word32 pubSz, const byte* priv, word32 privSz)
  1652. {
  1653. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
  1654. mp_int* publicKey = NULL;
  1655. mp_int* privateKey = NULL;
  1656. mp_int* checkKey = NULL;
  1657. #else
  1658. mp_int publicKey[1];
  1659. mp_int privateKey[1];
  1660. mp_int checkKey[1];
  1661. #endif
  1662. int ret = 0;
  1663. if (key == NULL || pub == NULL || priv == NULL)
  1664. return BAD_FUNC_ARG;
  1665. if (mp_iseven(&key->p) == MP_YES)
  1666. return MP_VAL;
  1667. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
  1668. publicKey = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_DH);
  1669. if (publicKey == NULL)
  1670. return MEMORY_E;
  1671. privateKey = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_DH);
  1672. if (privateKey == NULL) {
  1673. XFREE(publicKey, key->heap, DYNAMIC_TYPE_DH);
  1674. return MEMORY_E;
  1675. }
  1676. checkKey = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_DH);
  1677. if (checkKey == NULL) {
  1678. XFREE(privateKey, key->heap, DYNAMIC_TYPE_DH);
  1679. XFREE(publicKey, key->heap, DYNAMIC_TYPE_DH);
  1680. return MEMORY_E;
  1681. }
  1682. #endif
  1683. if (mp_init_multi(publicKey, privateKey, checkKey,
  1684. NULL, NULL, NULL) != MP_OKAY) {
  1685. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
  1686. XFREE(privateKey, key->heap, DYNAMIC_TYPE_DH);
  1687. XFREE(publicKey, key->heap, DYNAMIC_TYPE_DH);
  1688. XFREE(checkKey, key->heap, DYNAMIC_TYPE_DH);
  1689. #endif
  1690. return MP_INIT_E;
  1691. }
  1692. SAVE_VECTOR_REGISTERS(ret = _svr_ret;);
  1693. /* Load the private and public keys into big integers. */
  1694. if (mp_read_unsigned_bin(publicKey, pub, pubSz) != MP_OKAY ||
  1695. mp_read_unsigned_bin(privateKey, priv, privSz) != MP_OKAY) {
  1696. ret = MP_READ_E;
  1697. }
  1698. #ifdef WOLFSSL_CHECK_MEM_ZERO
  1699. mp_memzero_add("_ffc_pairwise_consistency_test privateKey", privateKey);
  1700. #endif
  1701. /* Calculate checkKey = g^privateKey mod p */
  1702. if (ret == 0) {
  1703. #ifdef WOLFSSL_HAVE_SP_DH
  1704. #ifndef WOLFSSL_SP_NO_2048
  1705. if (mp_count_bits(&key->p) == 2048) {
  1706. ret = sp_ModExp_2048(&key->g, privateKey, &key->p, checkKey);
  1707. if (ret != 0)
  1708. ret = MP_EXPTMOD_E;
  1709. }
  1710. else
  1711. #endif
  1712. #ifndef WOLFSSL_SP_NO_3072
  1713. if (mp_count_bits(&key->p) == 3072) {
  1714. ret = sp_ModExp_3072(&key->g, privateKey, &key->p, checkKey);
  1715. if (ret != 0)
  1716. ret = MP_EXPTMOD_E;
  1717. }
  1718. else
  1719. #endif
  1720. #ifdef WOLFSSL_SP_4096
  1721. if (mp_count_bits(&key->p) == 4096) {
  1722. ret = sp_ModExp_4096(&key->g, privateKey, &key->p, checkKey);
  1723. if (ret != 0)
  1724. ret = MP_EXPTMOD_E;
  1725. }
  1726. else
  1727. #endif
  1728. #endif
  1729. {
  1730. #if !defined(WOLFSSL_SP_MATH)
  1731. if (mp_exptmod(&key->g, privateKey, &key->p, checkKey) != MP_OKAY)
  1732. ret = MP_EXPTMOD_E;
  1733. #else
  1734. ret = WC_KEY_SIZE_E;
  1735. #endif
  1736. }
  1737. }
  1738. /* Compare the calculated public key to the supplied check value. */
  1739. if (ret == 0) {
  1740. if (mp_cmp(checkKey, publicKey) != MP_EQ)
  1741. ret = MP_CMP_E;
  1742. }
  1743. mp_forcezero(privateKey);
  1744. mp_clear(publicKey);
  1745. mp_clear(checkKey);
  1746. RESTORE_VECTOR_REGISTERS();
  1747. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
  1748. XFREE(checkKey, key->heap, DYNAMIC_TYPE_DH);
  1749. XFREE(privateKey, key->heap, DYNAMIC_TYPE_DH);
  1750. XFREE(publicKey, key->heap, DYNAMIC_TYPE_DH);
  1751. #elif defined(WOLFSSL_CHECK_MEM_ZERO)
  1752. mp_memzero_check(privateKey);
  1753. #endif
  1754. return ret;
  1755. }
  1756. /* Check DH Keys for pair-wise consistency per process in
  1757. * SP 800-56Ar3, section 5.6.2.1.4, method (b) for FFC.
  1758. *
  1759. * key DH key group parameters.
  1760. * pub Public Key.
  1761. * pubSz Public Key size.
  1762. * priv Private Key.
  1763. * privSz Private Key size.
  1764. *
  1765. * returns 0 on success or error code
  1766. */
  1767. int wc_DhCheckKeyPair(DhKey* key, const byte* pub, word32 pubSz,
  1768. const byte* priv, word32 privSz)
  1769. {
  1770. return _ffc_pairwise_consistency_test(key, pub, pubSz, priv, privSz);
  1771. }
  1772. int wc_DhGenerateKeyPair(DhKey* key, WC_RNG* rng,
  1773. byte* priv, word32* privSz, byte* pub, word32* pubSz)
  1774. {
  1775. int ret;
  1776. if (key == NULL || rng == NULL || priv == NULL || privSz == NULL ||
  1777. pub == NULL || pubSz == NULL) {
  1778. return BAD_FUNC_ARG;
  1779. }
  1780. #ifdef WOLFSSL_KCAPI_DH
  1781. (void)priv;
  1782. (void)privSz;
  1783. ret = KcapiDh_MakeKey(key, pub, pubSz);
  1784. #else
  1785. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_DH)
  1786. if (key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_DH) {
  1787. ret = wc_DhGenerateKeyPair_Async(key, rng, priv, privSz, pub, pubSz);
  1788. }
  1789. else
  1790. #endif
  1791. {
  1792. ret = wc_DhGenerateKeyPair_Sync(key, rng, priv, privSz, pub, pubSz);
  1793. }
  1794. #endif /* WOLFSSL_KCAPI_DH */
  1795. return ret;
  1796. }
  1797. #ifndef WOLFSSL_KCAPI_DH
  1798. static int wc_DhAgree_Sync(DhKey* key, byte* agree, word32* agreeSz,
  1799. const byte* priv, word32 privSz, const byte* otherPub, word32 pubSz)
  1800. {
  1801. int ret = 0;
  1802. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
  1803. mp_int* y = NULL;
  1804. #if !defined(WOLFSSL_SP_MATH)
  1805. mp_int* x = NULL;
  1806. mp_int* z = NULL;
  1807. #endif
  1808. #else
  1809. mp_int y[1];
  1810. #if !defined(WOLFSSL_SP_MATH)
  1811. mp_int x[1];
  1812. mp_int z[1];
  1813. #endif
  1814. #endif
  1815. if (mp_iseven(&key->p) == MP_YES) {
  1816. return MP_VAL;
  1817. }
  1818. #ifdef WOLFSSL_VALIDATE_FFC_IMPORT
  1819. if (wc_DhCheckPrivKey(key, priv, privSz) != 0) {
  1820. WOLFSSL_MSG("wc_DhAgree wc_DhCheckPrivKey failed");
  1821. return DH_CHECK_PRIV_E;
  1822. }
  1823. if (wc_DhCheckPubKey(key, otherPub, pubSz) != 0) {
  1824. WOLFSSL_MSG("wc_DhAgree wc_DhCheckPubKey failed");
  1825. return DH_CHECK_PUB_E;
  1826. }
  1827. #endif
  1828. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
  1829. y = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_DH);
  1830. if (y == NULL)
  1831. return MEMORY_E;
  1832. #if !defined(WOLFSSL_SP_MATH)
  1833. x = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_DH);
  1834. if (x == NULL) {
  1835. XFREE(y, key->heap, DYNAMIC_TYPE_DH);
  1836. return MEMORY_E;
  1837. }
  1838. z = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_DH);
  1839. if (z == NULL) {
  1840. XFREE(x, key->heap, DYNAMIC_TYPE_DH);
  1841. XFREE(y, key->heap, DYNAMIC_TYPE_DH);
  1842. return MEMORY_E;
  1843. }
  1844. #endif
  1845. #endif
  1846. #ifdef WOLFSSL_HAVE_SP_DH
  1847. #ifndef WOLFSSL_SP_NO_2048
  1848. if (mp_count_bits(&key->p) == 2048) {
  1849. if (mp_init(y) != MP_OKAY)
  1850. return MP_INIT_E;
  1851. SAVE_VECTOR_REGISTERS(ret = _svr_ret;);
  1852. if (ret == 0 && mp_read_unsigned_bin(y, otherPub, pubSz) != MP_OKAY)
  1853. ret = MP_READ_E;
  1854. if (ret == 0)
  1855. ret = sp_DhExp_2048(y, priv, privSz, &key->p, agree, agreeSz);
  1856. mp_clear(y);
  1857. RESTORE_VECTOR_REGISTERS();
  1858. /* make sure agree is > 1 (SP800-56A, 5.7.1.1) */
  1859. if ((ret == 0) &&
  1860. ((*agreeSz == 0) || ((*agreeSz == 1) && (agree[0] == 1))))
  1861. {
  1862. ret = MP_VAL;
  1863. }
  1864. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
  1865. #if !defined(WOLFSSL_SP_MATH)
  1866. XFREE(z, key->heap, DYNAMIC_TYPE_DH);
  1867. XFREE(x, key->heap, DYNAMIC_TYPE_DH);
  1868. #endif
  1869. XFREE(y, key->heap, DYNAMIC_TYPE_DH);
  1870. #endif
  1871. return ret;
  1872. }
  1873. #endif
  1874. #ifndef WOLFSSL_SP_NO_3072
  1875. if (mp_count_bits(&key->p) == 3072) {
  1876. if (mp_init(y) != MP_OKAY)
  1877. return MP_INIT_E;
  1878. SAVE_VECTOR_REGISTERS(ret = _svr_ret;);
  1879. if (ret == 0 && mp_read_unsigned_bin(y, otherPub, pubSz) != MP_OKAY)
  1880. ret = MP_READ_E;
  1881. if (ret == 0)
  1882. ret = sp_DhExp_3072(y, priv, privSz, &key->p, agree, agreeSz);
  1883. mp_clear(y);
  1884. RESTORE_VECTOR_REGISTERS();
  1885. /* make sure agree is > 1 (SP800-56A, 5.7.1.1) */
  1886. if ((ret == 0) &&
  1887. ((*agreeSz == 0) || ((*agreeSz == 1) && (agree[0] == 1))))
  1888. {
  1889. ret = MP_VAL;
  1890. }
  1891. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
  1892. #if !defined(WOLFSSL_SP_MATH)
  1893. XFREE(z, key->heap, DYNAMIC_TYPE_DH);
  1894. XFREE(x, key->heap, DYNAMIC_TYPE_DH);
  1895. #endif
  1896. XFREE(y, key->heap, DYNAMIC_TYPE_DH);
  1897. #endif
  1898. return ret;
  1899. }
  1900. #endif
  1901. #ifdef WOLFSSL_SP_4096
  1902. if (mp_count_bits(&key->p) == 4096) {
  1903. if (mp_init(y) != MP_OKAY)
  1904. return MP_INIT_E;
  1905. SAVE_VECTOR_REGISTERS(ret = _svr_ret;);
  1906. if (ret == 0 && mp_read_unsigned_bin(y, otherPub, pubSz) != MP_OKAY)
  1907. ret = MP_READ_E;
  1908. if (ret == 0)
  1909. ret = sp_DhExp_4096(y, priv, privSz, &key->p, agree, agreeSz);
  1910. mp_clear(y);
  1911. RESTORE_VECTOR_REGISTERS();
  1912. /* make sure agree is > 1 (SP800-56A, 5.7.1.1) */
  1913. if ((ret == 0) &&
  1914. ((*agreeSz == 0) || ((*agreeSz == 1) && (agree[0] == 1))))
  1915. {
  1916. ret = MP_VAL;
  1917. }
  1918. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
  1919. #if !defined(WOLFSSL_SP_MATH)
  1920. XFREE(z, key->heap, DYNAMIC_TYPE_DH);
  1921. XFREE(x, key->heap, DYNAMIC_TYPE_DH);
  1922. #endif
  1923. XFREE(y, key->heap, DYNAMIC_TYPE_DH);
  1924. #endif
  1925. return ret;
  1926. }
  1927. #endif
  1928. #endif
  1929. #if !defined(WOLFSSL_SP_MATH)
  1930. if (mp_init_multi(x, y, z, 0, 0, 0) != MP_OKAY) {
  1931. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
  1932. XFREE(z, key->heap, DYNAMIC_TYPE_DH);
  1933. XFREE(x, key->heap, DYNAMIC_TYPE_DH);
  1934. XFREE(y, key->heap, DYNAMIC_TYPE_DH);
  1935. #endif
  1936. return MP_INIT_E;
  1937. }
  1938. SAVE_VECTOR_REGISTERS(ret = _svr_ret;);
  1939. if (mp_read_unsigned_bin(x, priv, privSz) != MP_OKAY)
  1940. ret = MP_READ_E;
  1941. #ifdef WOLFSSL_CHECK_MEM_ZERO
  1942. if (ret == 0)
  1943. mp_memzero_add("wc_DhAgree_Sync x", x);
  1944. #endif
  1945. if (ret == 0 && mp_read_unsigned_bin(y, otherPub, pubSz) != MP_OKAY)
  1946. ret = MP_READ_E;
  1947. if (ret == 0 && mp_exptmod(y, x, &key->p, z) != MP_OKAY)
  1948. ret = MP_EXPTMOD_E;
  1949. #ifdef WOLFSSL_CHECK_MEM_ZERO
  1950. if (ret == 0)
  1951. mp_memzero_add("wc_DhAgree_Sync z", z);
  1952. #endif
  1953. /* make sure z is not one (SP800-56A, 5.7.1.1) */
  1954. if (ret == 0 && (mp_cmp_d(z, 1) == MP_EQ))
  1955. ret = MP_VAL;
  1956. if (ret == 0 && mp_to_unsigned_bin(z, agree) != MP_OKAY)
  1957. ret = MP_TO_E;
  1958. if (ret == 0)
  1959. *agreeSz = (word32)mp_unsigned_bin_size(z);
  1960. mp_forcezero(z);
  1961. mp_clear(y);
  1962. mp_forcezero(x);
  1963. RESTORE_VECTOR_REGISTERS();
  1964. #else
  1965. ret = WC_KEY_SIZE_E;
  1966. #endif
  1967. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
  1968. #if !defined(WOLFSSL_SP_MATH)
  1969. XFREE(z, key->heap, DYNAMIC_TYPE_DH);
  1970. XFREE(x, key->heap, DYNAMIC_TYPE_DH);
  1971. #endif
  1972. XFREE(y, key->heap, DYNAMIC_TYPE_DH);
  1973. #elif defined(WOLFSSL_CHECK_MEM_ZERO)
  1974. mp_memzero_check(x);
  1975. mp_memzero_check(z);
  1976. #endif
  1977. return ret;
  1978. }
  1979. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_DH)
  1980. static int wc_DhAgree_Async(DhKey* key, byte* agree, word32* agreeSz,
  1981. const byte* priv, word32 privSz, const byte* otherPub, word32 pubSz)
  1982. {
  1983. int ret;
  1984. #if defined(HAVE_INTEL_QA)
  1985. word32 pBits;
  1986. /* QAT DH sizes: 768, 1024, 1536, 2048, 3072 and 4096 bits */
  1987. pBits = mp_unsigned_bin_size(&key->p) * 8;
  1988. if (pBits == 768 || pBits == 1024 || pBits == 1536 ||
  1989. pBits == 2048 || pBits == 3072 || pBits == 4096) {
  1990. ret = wc_mp_to_bigint(&key->p, &key->p.raw);
  1991. if (ret == MP_OKAY)
  1992. ret = IntelQaDhAgree(&key->asyncDev, &key->p.raw,
  1993. agree, agreeSz, priv, privSz, otherPub, pubSz);
  1994. return ret;
  1995. }
  1996. #elif defined(HAVE_CAVIUM)
  1997. /* TODO: Not implemented - use software for now */
  1998. #else /* WOLFSSL_ASYNC_CRYPT_SW */
  1999. if (wc_AsyncSwInit(&key->asyncDev, ASYNC_SW_DH_AGREE)) {
  2000. WC_ASYNC_SW* sw = &key->asyncDev.sw;
  2001. sw->dhAgree.key = key;
  2002. sw->dhAgree.agree = agree;
  2003. sw->dhAgree.agreeSz = agreeSz;
  2004. sw->dhAgree.priv = priv;
  2005. sw->dhAgree.privSz = privSz;
  2006. sw->dhAgree.otherPub = otherPub;
  2007. sw->dhAgree.pubSz = pubSz;
  2008. return WC_PENDING_E;
  2009. }
  2010. #endif
  2011. /* otherwise use software DH */
  2012. ret = wc_DhAgree_Sync(key, agree, agreeSz, priv, privSz, otherPub, pubSz);
  2013. return ret;
  2014. }
  2015. #endif /* WOLFSSL_ASYNC_CRYPT */
  2016. #endif /* !WOLFSSL_KCAPI_DH */
  2017. int wc_DhAgree(DhKey* key, byte* agree, word32* agreeSz, const byte* priv,
  2018. word32 privSz, const byte* otherPub, word32 pubSz)
  2019. {
  2020. int ret = 0;
  2021. if (key == NULL || agree == NULL || agreeSz == NULL || priv == NULL ||
  2022. otherPub == NULL) {
  2023. return BAD_FUNC_ARG;
  2024. }
  2025. #ifdef WOLFSSL_KCAPI_DH
  2026. (void)priv;
  2027. (void)privSz;
  2028. ret = KcapiDh_SharedSecret(key, otherPub, pubSz, agree, agreeSz);
  2029. #else
  2030. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_DH)
  2031. if (key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_DH) {
  2032. ret = wc_DhAgree_Async(key, agree, agreeSz, priv, privSz, otherPub, pubSz);
  2033. }
  2034. else
  2035. #endif
  2036. {
  2037. ret = wc_DhAgree_Sync(key, agree, agreeSz, priv, privSz, otherPub, pubSz);
  2038. }
  2039. #endif /* WOLFSSL_KCAPI_DH */
  2040. return ret;
  2041. }
  2042. #ifdef WOLFSSL_DH_EXTRA
  2043. WOLFSSL_LOCAL int wc_DhKeyCopy(DhKey* src, DhKey* dst)
  2044. {
  2045. int ret;
  2046. if (!src || !dst || src == dst) {
  2047. WOLFSSL_MSG("Parameters not provided or are the same");
  2048. return BAD_FUNC_ARG;
  2049. }
  2050. if ((ret = mp_copy(&src->p, &dst->p)) != MP_OKAY) {
  2051. WOLFSSL_MSG("mp_copy error");
  2052. return ret;
  2053. }
  2054. if ((ret = mp_copy(&src->g, &dst->g)) != MP_OKAY) {
  2055. WOLFSSL_MSG("mp_copy error");
  2056. return ret;
  2057. }
  2058. if ((ret = mp_copy(&src->q, &dst->q)) != MP_OKAY) {
  2059. WOLFSSL_MSG("mp_copy error");
  2060. return ret;
  2061. }
  2062. if ((ret = mp_copy(&src->pub, &dst->pub)) != MP_OKAY) {
  2063. WOLFSSL_MSG("mp_copy error");
  2064. return ret;
  2065. }
  2066. if ((ret = mp_copy(&src->priv, &dst->priv)) != MP_OKAY) {
  2067. WOLFSSL_MSG("mp_copy error");
  2068. return ret;
  2069. }
  2070. #ifdef WOLFSSL_CHECK_MEM_ZERO
  2071. mp_memzero_add("wc_DhKeyCopy dst->priv", &dst->priv);
  2072. #endif
  2073. dst->heap = src->heap;
  2074. return MP_OKAY;
  2075. }
  2076. /* Sets private and public key in DhKey if both are available, otherwise sets
  2077. either private or public key, depending on which is available. */
  2078. int wc_DhImportKeyPair(DhKey* key, const byte* priv, word32 privSz,
  2079. const byte* pub, word32 pubSz)
  2080. {
  2081. byte havePriv, havePub;
  2082. if (key == NULL) {
  2083. return BAD_FUNC_ARG;
  2084. }
  2085. havePriv = ( (priv != NULL) && (privSz > 0) );
  2086. havePub = ( (pub != NULL) && (pubSz > 0) );
  2087. if (!havePub && !havePriv) {
  2088. WOLFSSL_MSG("No Public or Private Key to Set");
  2089. return BAD_FUNC_ARG;
  2090. }
  2091. /* Set Private Key */
  2092. if (havePriv) {
  2093. /* may have leading 0 */
  2094. if (priv[0] == 0) {
  2095. privSz--; priv++;
  2096. }
  2097. if (mp_init(&key->priv) != MP_OKAY)
  2098. havePriv = 0;
  2099. }
  2100. if (havePriv) {
  2101. if (mp_read_unsigned_bin(&key->priv, priv, privSz) != MP_OKAY) {
  2102. mp_clear(&key->priv);
  2103. havePriv = 0;
  2104. } else {
  2105. WOLFSSL_MSG("DH Private Key Set");
  2106. #ifdef WOLFSSL_CHECK_MEM_ZERO
  2107. mp_memzero_add("wc_DhImportKeyPair key->priv", &key->priv);
  2108. #endif
  2109. }
  2110. }
  2111. /* Set Public Key */
  2112. if (havePub) {
  2113. /* may have leading 0 */
  2114. if (pub[0] == 0) {
  2115. pubSz--; pub++;
  2116. }
  2117. if (mp_init(&key->pub) != MP_OKAY)
  2118. havePub = 0;
  2119. }
  2120. if (havePub) {
  2121. if (mp_read_unsigned_bin(&key->pub, pub, pubSz) != MP_OKAY) {
  2122. mp_clear(&key->pub);
  2123. havePub = 0;
  2124. if (havePriv) {
  2125. mp_forcezero(&key->priv);
  2126. havePriv = 0; /* set to 0 to error out with failed read pub */
  2127. }
  2128. } else {
  2129. WOLFSSL_MSG("DH Public Key Set");
  2130. }
  2131. }
  2132. if (havePriv == 0 && havePub == 0) {
  2133. return MEMORY_E;
  2134. }
  2135. return 0;
  2136. }
  2137. /* Can be used with WOLFSSL_DH_EXTRA when key is loaded with
  2138. wc_DhKeyDecode or wc_DhImportKeyPair */
  2139. int wc_DhExportKeyPair(DhKey* key, byte* priv, word32* pPrivSz,
  2140. byte* pub, word32* pPubSz)
  2141. {
  2142. int ret = 0;
  2143. if (key == NULL || (priv && pPrivSz == NULL) || (pub && pPubSz == NULL)) {
  2144. return BAD_FUNC_ARG;
  2145. }
  2146. if (priv) {
  2147. word32 privSz = (word32)mp_unsigned_bin_size(&key->priv);
  2148. if (privSz > *pPrivSz) {
  2149. return BUFFER_E;
  2150. }
  2151. *pPrivSz = privSz;
  2152. ret |= mp_to_unsigned_bin(&key->priv, priv);
  2153. }
  2154. if (pub) {
  2155. word32 pubSz = (word32)mp_unsigned_bin_size(&key->pub);
  2156. if (pubSz > *pPubSz) {
  2157. return BUFFER_E;
  2158. }
  2159. *pPubSz = pubSz;
  2160. ret |= mp_to_unsigned_bin(&key->pub, pub);
  2161. }
  2162. if (ret != 0)
  2163. ret = ASN_DH_KEY_E;
  2164. return ret;
  2165. }
  2166. #endif /* WOLFSSL_DH_EXTRA */
  2167. static int _DhSetKey(DhKey* key, const byte* p, word32 pSz, const byte* g,
  2168. word32 gSz, const byte* q, word32 qSz, int trusted,
  2169. WC_RNG* rng)
  2170. {
  2171. int ret = 0;
  2172. mp_int* keyP = NULL;
  2173. mp_int* keyG = NULL;
  2174. if (key == NULL || p == NULL || g == NULL || pSz == 0 || gSz == 0) {
  2175. ret = BAD_FUNC_ARG;
  2176. }
  2177. SAVE_VECTOR_REGISTERS(return _svr_ret;);
  2178. if (ret == 0) {
  2179. /* may have leading 0 */
  2180. if (p[0] == 0) {
  2181. pSz--; p++;
  2182. }
  2183. if (g[0] == 0) {
  2184. gSz--; g++;
  2185. }
  2186. if (q != NULL) {
  2187. if (q[0] == 0) {
  2188. qSz--; q++;
  2189. }
  2190. }
  2191. if (mp_init(&key->p) != MP_OKAY)
  2192. ret = MP_INIT_E;
  2193. }
  2194. if (ret == 0) {
  2195. if (mp_read_unsigned_bin(&key->p, p, pSz) != MP_OKAY)
  2196. ret = ASN_DH_KEY_E;
  2197. else
  2198. keyP = &key->p;
  2199. }
  2200. if (ret == 0 && !trusted) {
  2201. int isPrime = 0;
  2202. if (rng != NULL)
  2203. ret = mp_prime_is_prime_ex(keyP, 8, &isPrime, rng);
  2204. else
  2205. ret = mp_prime_is_prime(keyP, 8, &isPrime);
  2206. if (ret == 0 && isPrime == 0)
  2207. ret = DH_CHECK_PUB_E;
  2208. }
  2209. if (ret == 0 && mp_init(&key->g) != MP_OKAY)
  2210. ret = MP_INIT_E;
  2211. if (ret == 0) {
  2212. if (mp_read_unsigned_bin(&key->g, g, gSz) != MP_OKAY)
  2213. ret = ASN_DH_KEY_E;
  2214. else
  2215. keyG = &key->g;
  2216. }
  2217. if (ret == 0 && q != NULL) {
  2218. if (mp_init(&key->q) != MP_OKAY)
  2219. ret = MP_INIT_E;
  2220. }
  2221. if (ret == 0 && q != NULL) {
  2222. if (mp_read_unsigned_bin(&key->q, q, qSz) != MP_OKAY)
  2223. ret = MP_INIT_E;
  2224. else
  2225. key->trustedGroup = trusted;
  2226. }
  2227. if (ret != 0 && key != NULL) {
  2228. if (keyG)
  2229. mp_clear(keyG);
  2230. if (keyP)
  2231. mp_clear(keyP);
  2232. }
  2233. RESTORE_VECTOR_REGISTERS();
  2234. return ret;
  2235. }
  2236. int wc_DhSetCheckKey(DhKey* key, const byte* p, word32 pSz, const byte* g,
  2237. word32 gSz, const byte* q, word32 qSz, int trusted,
  2238. WC_RNG* rng)
  2239. {
  2240. return _DhSetKey(key, p, pSz, g, gSz, q, qSz, trusted, rng);
  2241. }
  2242. int wc_DhSetKey_ex(DhKey* key, const byte* p, word32 pSz, const byte* g,
  2243. word32 gSz, const byte* q, word32 qSz)
  2244. {
  2245. return _DhSetKey(key, p, pSz, g, gSz, q, qSz, 0, NULL);
  2246. }
  2247. /* not in asn anymore since no actual asn types used */
  2248. int wc_DhSetKey(DhKey* key, const byte* p, word32 pSz, const byte* g,
  2249. word32 gSz)
  2250. {
  2251. /* This should not have trusted set. */
  2252. return _DhSetKey(key, p, pSz, g, gSz, NULL, 0, 1, NULL);
  2253. }
  2254. int wc_DhSetNamedKey(DhKey* key, int name)
  2255. {
  2256. const byte* p = NULL;
  2257. const byte* g = NULL;
  2258. const byte* q = NULL;
  2259. word32 pSz = 0, gSz = 0, qSz = 0;
  2260. switch (name) {
  2261. #ifdef HAVE_FFDHE_2048
  2262. case WC_FFDHE_2048:
  2263. p = dh_ffdhe2048_p;
  2264. pSz = sizeof(dh_ffdhe2048_p);
  2265. g = dh_ffdhe2048_g;
  2266. gSz = sizeof(dh_ffdhe2048_g);
  2267. #ifdef HAVE_FFDHE_Q
  2268. q = dh_ffdhe2048_q;
  2269. qSz = sizeof(dh_ffdhe2048_q);
  2270. #endif /* HAVE_FFDHE_Q */
  2271. break;
  2272. #endif /* HAVE_FFDHE_2048 */
  2273. #ifdef HAVE_FFDHE_3072
  2274. case WC_FFDHE_3072:
  2275. p = dh_ffdhe3072_p;
  2276. pSz = sizeof(dh_ffdhe3072_p);
  2277. g = dh_ffdhe3072_g;
  2278. gSz = sizeof(dh_ffdhe3072_g);
  2279. #ifdef HAVE_FFDHE_Q
  2280. q = dh_ffdhe3072_q;
  2281. qSz = sizeof(dh_ffdhe3072_q);
  2282. #endif /* HAVE_FFDHE_Q */
  2283. break;
  2284. #endif /* HAVE_FFDHE_3072 */
  2285. #ifdef HAVE_FFDHE_4096
  2286. case WC_FFDHE_4096:
  2287. p = dh_ffdhe4096_p;
  2288. pSz = sizeof(dh_ffdhe4096_p);
  2289. g = dh_ffdhe4096_g;
  2290. gSz = sizeof(dh_ffdhe4096_g);
  2291. #ifdef HAVE_FFDHE_Q
  2292. q = dh_ffdhe4096_q;
  2293. qSz = sizeof(dh_ffdhe4096_q);
  2294. #endif /* HAVE_FFDHE_Q */
  2295. break;
  2296. #endif /* HAVE_FFDHE_4096 */
  2297. #ifdef HAVE_FFDHE_6144
  2298. case WC_FFDHE_6144:
  2299. p = dh_ffdhe6144_p;
  2300. pSz = sizeof(dh_ffdhe6144_p);
  2301. g = dh_ffdhe6144_g;
  2302. gSz = sizeof(dh_ffdhe6144_g);
  2303. #ifdef HAVE_FFDHE_Q
  2304. q = dh_ffdhe6144_q;
  2305. qSz = sizeof(dh_ffdhe6144_q);
  2306. #endif /* HAVE_FFDHE_Q */
  2307. break;
  2308. #endif /* HAVE_FFDHE_6144 */
  2309. #ifdef HAVE_FFDHE_8192
  2310. case WC_FFDHE_8192:
  2311. p = dh_ffdhe8192_p;
  2312. pSz = sizeof(dh_ffdhe8192_p);
  2313. g = dh_ffdhe8192_g;
  2314. gSz = sizeof(dh_ffdhe8192_g);
  2315. #ifdef HAVE_FFDHE_Q
  2316. q = dh_ffdhe8192_q;
  2317. qSz = sizeof(dh_ffdhe8192_q);
  2318. #endif /* HAVE_FFDHE_Q */
  2319. break;
  2320. #endif /* HAVE_FFDHE_8192 */
  2321. default:
  2322. break;
  2323. }
  2324. return _DhSetKey(key, p, pSz, g, gSz, q, qSz, 1, NULL);
  2325. }
  2326. word32 wc_DhGetNamedKeyMinSize(int name)
  2327. {
  2328. word32 size;
  2329. switch (name) {
  2330. #ifdef HAVE_FFDHE_2048
  2331. case WC_FFDHE_2048:
  2332. size = 29;
  2333. break;
  2334. #endif /* HAVE_FFDHE_2048 */
  2335. #ifdef HAVE_FFDHE_3072
  2336. case WC_FFDHE_3072:
  2337. size = 34;
  2338. break;
  2339. #endif /* HAVE_FFDHE_3072 */
  2340. #ifdef HAVE_FFDHE_4096
  2341. case WC_FFDHE_4096:
  2342. size = 39;
  2343. break;
  2344. #endif /* HAVE_FFDHE_4096 */
  2345. #ifdef HAVE_FFDHE_6144
  2346. case WC_FFDHE_6144:
  2347. size = 46;
  2348. break;
  2349. #endif /* HAVE_FFDHE_6144 */
  2350. #ifdef HAVE_FFDHE_8192
  2351. case WC_FFDHE_8192:
  2352. size = 52;
  2353. break;
  2354. #endif /* HAVE_FFDHE_8192 */
  2355. default:
  2356. size = 0;
  2357. }
  2358. return size;
  2359. }
  2360. /* Returns 1: params match
  2361. * 0: params differ */
  2362. int wc_DhCmpNamedKey(int name, int noQ,
  2363. const byte* p, word32 pSz,
  2364. const byte* g, word32 gSz,
  2365. const byte* q, word32 qSz)
  2366. {
  2367. const byte* pCmp = NULL;
  2368. const byte* qCmp = NULL;
  2369. const byte* gCmp = NULL;
  2370. word32 pCmpSz = 0, qCmpSz = 0, gCmpSz = 0;
  2371. int cmp = 0, goodName = 1;
  2372. switch (name) {
  2373. #ifdef HAVE_FFDHE_2048
  2374. case WC_FFDHE_2048:
  2375. pCmp = dh_ffdhe2048_p;
  2376. pCmpSz = sizeof(dh_ffdhe2048_p);
  2377. gCmp = dh_ffdhe2048_g;
  2378. gCmpSz = sizeof(dh_ffdhe2048_g);
  2379. #ifdef HAVE_FFDHE_Q
  2380. qCmp = dh_ffdhe2048_q;
  2381. qCmpSz = sizeof(dh_ffdhe2048_q);
  2382. #endif /* HAVE_FFDHE_Q */
  2383. break;
  2384. #endif /* HAVE_FFDHE_2048 */
  2385. #ifdef HAVE_FFDHE_3072
  2386. case WC_FFDHE_3072:
  2387. pCmp = dh_ffdhe3072_p;
  2388. pCmpSz = sizeof(dh_ffdhe3072_p);
  2389. gCmp = dh_ffdhe3072_g;
  2390. gCmpSz = sizeof(dh_ffdhe3072_g);
  2391. #ifdef HAVE_FFDHE_Q
  2392. qCmp = dh_ffdhe3072_q;
  2393. qCmpSz = sizeof(dh_ffdhe3072_q);
  2394. #endif /* HAVE_FFDHE_Q */
  2395. break;
  2396. #endif /* HAVE_FFDHE_3072 */
  2397. #ifdef HAVE_FFDHE_4096
  2398. case WC_FFDHE_4096:
  2399. pCmp = dh_ffdhe4096_p;
  2400. pCmpSz = sizeof(dh_ffdhe4096_p);
  2401. gCmp = dh_ffdhe4096_g;
  2402. gCmpSz = sizeof(dh_ffdhe4096_g);
  2403. #ifdef HAVE_FFDHE_Q
  2404. qCmp = dh_ffdhe4096_q;
  2405. qCmpSz = sizeof(dh_ffdhe4096_q);
  2406. #endif /* HAVE_FFDHE_Q */
  2407. break;
  2408. #endif /* HAVE_FFDHE_4096 */
  2409. #ifdef HAVE_FFDHE_6144
  2410. case WC_FFDHE_6144:
  2411. pCmp = dh_ffdhe6144_p;
  2412. pCmpSz = sizeof(dh_ffdhe6144_p);
  2413. gCmp = dh_ffdhe6144_g;
  2414. gCmpSz = sizeof(dh_ffdhe6144_g);
  2415. #ifdef HAVE_FFDHE_Q
  2416. qCmp = dh_ffdhe6144_q;
  2417. qCmpSz = sizeof(dh_ffdhe6144_q);
  2418. #endif /* HAVE_FFDHE_Q */
  2419. break;
  2420. #endif /* HAVE_FFDHE_6144 */
  2421. #ifdef HAVE_FFDHE_8192
  2422. case WC_FFDHE_8192:
  2423. pCmp = dh_ffdhe8192_p;
  2424. pCmpSz = sizeof(dh_ffdhe8192_p);
  2425. gCmp = dh_ffdhe8192_g;
  2426. gCmpSz = sizeof(dh_ffdhe8192_g);
  2427. #ifdef HAVE_FFDHE_Q
  2428. qCmp = dh_ffdhe8192_q;
  2429. qCmpSz = sizeof(dh_ffdhe8192_q);
  2430. #endif /* HAVE_FFDHE_Q */
  2431. break;
  2432. #endif /* HAVE_FFDHE_8192 */
  2433. default:
  2434. goodName = 0;
  2435. }
  2436. if (goodName) {
  2437. cmp = (pSz == pCmpSz) && (gSz == gCmpSz) &&
  2438. (noQ || ((qCmp != NULL) && (qSz == qCmpSz) &&
  2439. XMEMCMP(q, qCmp, qCmpSz) == 0)) &&
  2440. (XMEMCMP(p, pCmp, pCmpSz) == 0) &&
  2441. (XMEMCMP(g, gCmp, gCmpSz) == 0);
  2442. }
  2443. return cmp;
  2444. }
  2445. int wc_DhGetNamedKeyParamSize(int name, word32* p, word32* g, word32* q)
  2446. {
  2447. word32 pSz = 0, gSz = 0, qSz = 0;
  2448. switch (name) {
  2449. #ifdef HAVE_FFDHE_2048
  2450. case WC_FFDHE_2048:
  2451. pSz = sizeof(dh_ffdhe2048_p);
  2452. gSz = sizeof(dh_ffdhe2048_g);
  2453. #ifdef HAVE_FFDHE_Q
  2454. qSz = sizeof(dh_ffdhe2048_q);
  2455. #endif /* HAVE_FFDHE_Q */
  2456. break;
  2457. #endif /* HAVE_FFDHE_2048 */
  2458. #ifdef HAVE_FFDHE_3072
  2459. case WC_FFDHE_3072:
  2460. pSz = sizeof(dh_ffdhe3072_p);
  2461. gSz = sizeof(dh_ffdhe3072_g);
  2462. #ifdef HAVE_FFDHE_Q
  2463. qSz = sizeof(dh_ffdhe3072_q);
  2464. #endif /* HAVE_FFDHE_Q */
  2465. break;
  2466. #endif /* HAVE_FFDHE_3072 */
  2467. #ifdef HAVE_FFDHE_4096
  2468. case WC_FFDHE_4096:
  2469. pSz = sizeof(dh_ffdhe4096_p);
  2470. gSz = sizeof(dh_ffdhe4096_g);
  2471. #ifdef HAVE_FFDHE_Q
  2472. qSz = sizeof(dh_ffdhe4096_q);
  2473. #endif /* HAVE_FFDHE_Q */
  2474. break;
  2475. #endif /* HAVE_FFDHE_4096 */
  2476. #ifdef HAVE_FFDHE_6144
  2477. case WC_FFDHE_6144:
  2478. pSz = sizeof(dh_ffdhe6144_p);
  2479. gSz = sizeof(dh_ffdhe6144_g);
  2480. #ifdef HAVE_FFDHE_Q
  2481. qSz = sizeof(dh_ffdhe6144_q);
  2482. #endif /* HAVE_FFDHE_Q */
  2483. break;
  2484. #endif /* HAVE_FFDHE_6144 */
  2485. #ifdef HAVE_FFDHE_8192
  2486. case WC_FFDHE_8192:
  2487. pSz = sizeof(dh_ffdhe8192_p);
  2488. gSz = sizeof(dh_ffdhe8192_g);
  2489. #ifdef HAVE_FFDHE_Q
  2490. qSz = sizeof(dh_ffdhe8192_q);
  2491. #endif /* HAVE_FFDHE_Q */
  2492. break;
  2493. #endif /* HAVE_FFDHE_8192 */
  2494. default:
  2495. break;
  2496. }
  2497. if (p != NULL) *p = pSz;
  2498. if (g != NULL) *g = gSz;
  2499. if (q != NULL) *q = qSz;
  2500. return 0;
  2501. }
  2502. int wc_DhCopyNamedKey(int name,
  2503. byte* p, word32* pSz, byte* g, word32* gSz, byte* q, word32* qSz)
  2504. {
  2505. const byte* pC = NULL;
  2506. const byte* gC = NULL;
  2507. const byte* qC = NULL;
  2508. word32 pCSz = 0, gCSz = 0, qCSz = 0;
  2509. switch (name) {
  2510. #ifdef HAVE_FFDHE_2048
  2511. case WC_FFDHE_2048:
  2512. pC = dh_ffdhe2048_p;
  2513. pCSz = sizeof(dh_ffdhe2048_p);
  2514. gC = dh_ffdhe2048_g;
  2515. gCSz = sizeof(dh_ffdhe2048_g);
  2516. #ifdef HAVE_FFDHE_Q
  2517. qC = dh_ffdhe2048_q;
  2518. qCSz = sizeof(dh_ffdhe2048_q);
  2519. #endif /* HAVE_FFDHE_Q */
  2520. break;
  2521. #endif /* HAVE_FFDHE_2048 */
  2522. #ifdef HAVE_FFDHE_3072
  2523. case WC_FFDHE_3072:
  2524. pC = dh_ffdhe3072_p;
  2525. pCSz = sizeof(dh_ffdhe3072_p);
  2526. gC = dh_ffdhe3072_g;
  2527. gCSz = sizeof(dh_ffdhe3072_g);
  2528. #ifdef HAVE_FFDHE_Q
  2529. qC = dh_ffdhe3072_q;
  2530. qCSz = sizeof(dh_ffdhe3072_q);
  2531. #endif /* HAVE_FFDHE_Q */
  2532. break;
  2533. #endif /* HAVE_FFDHE_3072 */
  2534. #ifdef HAVE_FFDHE_4096
  2535. case WC_FFDHE_4096:
  2536. pC = dh_ffdhe4096_p;
  2537. pCSz = sizeof(dh_ffdhe4096_p);
  2538. gC = dh_ffdhe4096_g;
  2539. gCSz = sizeof(dh_ffdhe4096_g);
  2540. #ifdef HAVE_FFDHE_Q
  2541. qC = dh_ffdhe4096_q;
  2542. qCSz = sizeof(dh_ffdhe4096_q);
  2543. #endif /* HAVE_FFDHE_Q */
  2544. break;
  2545. #endif /* HAVE_FFDHE_4096 */
  2546. #ifdef HAVE_FFDHE_6144
  2547. case WC_FFDHE_6144:
  2548. pC = dh_ffdhe6144_p;
  2549. pCSz = sizeof(dh_ffdhe6144_p);
  2550. gC = dh_ffdhe6144_g;
  2551. gCSz = sizeof(dh_ffdhe6144_g);
  2552. #ifdef HAVE_FFDHE_Q
  2553. qC = dh_ffdhe6144_q;
  2554. qCSz = sizeof(dh_ffdhe6144_q);
  2555. #endif /* HAVE_FFDHE_Q */
  2556. break;
  2557. #endif /* HAVE_FFDHE_6144 */
  2558. #ifdef HAVE_FFDHE_8192
  2559. case WC_FFDHE_8192:
  2560. pC = dh_ffdhe8192_p;
  2561. pCSz = sizeof(dh_ffdhe8192_p);
  2562. gC = dh_ffdhe8192_g;
  2563. gCSz = sizeof(dh_ffdhe8192_g);
  2564. #ifdef HAVE_FFDHE_Q
  2565. qC = dh_ffdhe8192_q;
  2566. qCSz = sizeof(dh_ffdhe8192_q);
  2567. #endif /* HAVE_FFDHE_Q */
  2568. break;
  2569. #endif /* HAVE_FFDHE_8192 */
  2570. default:
  2571. break;
  2572. }
  2573. if (p != NULL && pC != NULL)
  2574. XMEMCPY(p, pC, pCSz);
  2575. if (pSz != NULL)
  2576. *pSz = pCSz;
  2577. if (g != NULL && gC != NULL)
  2578. XMEMCPY(g, gC, gCSz);
  2579. if (gSz != NULL)
  2580. *gSz = gCSz;
  2581. if (q != NULL && qC != NULL)
  2582. XMEMCPY(q, qC, qCSz);
  2583. if (qSz != NULL)
  2584. *qSz = qCSz;
  2585. return 0;
  2586. }
  2587. #ifdef WOLFSSL_KEY_GEN
  2588. /* modulus_size in bits */
  2589. int wc_DhGenerateParams(WC_RNG *rng, int modSz, DhKey *dh)
  2590. {
  2591. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
  2592. mp_int *tmp = NULL, *tmp2 = NULL;
  2593. #else
  2594. mp_int tmp[1], tmp2[2];
  2595. #endif
  2596. word32 groupSz = 0, bufSz = 0,
  2597. primeCheckCount = 0;
  2598. int primeCheck = MP_NO,
  2599. ret = 0;
  2600. unsigned char *buf = NULL;
  2601. #if !defined(WOLFSSL_SMALL_STACK) || defined(WOLFSSL_NO_MALLOC)
  2602. XMEMSET(tmp, 0, sizeof(tmp));
  2603. XMEMSET(tmp2, 0, sizeof(tmp2));
  2604. #endif
  2605. if (rng == NULL || dh == NULL)
  2606. ret = BAD_FUNC_ARG;
  2607. /* set group size in bytes from modulus size
  2608. * FIPS 186-4 defines valid values (1024, 160) (2048, 256) (3072, 256)
  2609. */
  2610. if (ret == 0) {
  2611. switch (modSz) {
  2612. case 1024:
  2613. groupSz = 20;
  2614. break;
  2615. case 2048:
  2616. case 3072:
  2617. groupSz = 32;
  2618. break;
  2619. default:
  2620. #if !defined(HAVE_FIPS) && defined(WOLFSSL_NO_DH186)
  2621. /* in non fips mode attempt to match strength of group size with
  2622. * mod size */
  2623. if (modSz < 2048)
  2624. groupSz = 20;
  2625. else
  2626. groupSz = 32;
  2627. #else
  2628. ret = BAD_FUNC_ARG;
  2629. #endif
  2630. break;
  2631. }
  2632. }
  2633. if (ret == 0) {
  2634. /* modulus size in bytes */
  2635. modSz /= WOLFSSL_BIT_SIZE;
  2636. bufSz = (word32)modSz - groupSz;
  2637. /* allocate ram */
  2638. buf = (unsigned char *)XMALLOC(bufSz,
  2639. dh->heap, DYNAMIC_TYPE_TMP_BUFFER);
  2640. if (buf == NULL)
  2641. ret = MEMORY_E;
  2642. }
  2643. /* make a random string that will be multiplied against q */
  2644. if (ret == 0)
  2645. ret = wc_RNG_GenerateBlock(rng, buf, bufSz);
  2646. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
  2647. if (ret == 0) {
  2648. if ((tmp = (mp_int *)XMALLOC(sizeof(*tmp), NULL,
  2649. DYNAMIC_TYPE_WOLF_BIGINT)) == NULL) {
  2650. ret = MEMORY_E;
  2651. }
  2652. else {
  2653. XMEMSET(tmp, 0, sizeof(*tmp));
  2654. }
  2655. }
  2656. if (ret == 0) {
  2657. if ((tmp2 = (mp_int *)XMALLOC(sizeof(*tmp2), NULL,
  2658. DYNAMIC_TYPE_WOLF_BIGINT)) == NULL) {
  2659. ret = MEMORY_E;
  2660. }
  2661. else {
  2662. XMEMSET(tmp2, 0, sizeof(*tmp2));
  2663. }
  2664. }
  2665. #endif
  2666. SAVE_VECTOR_REGISTERS(ret = _svr_ret;);
  2667. if (ret == 0) {
  2668. /* force magnitude */
  2669. buf[0] |= 0xC0;
  2670. /* force even */
  2671. buf[bufSz - 1] &= 0xfe;
  2672. if (mp_init_multi(tmp, tmp2, &dh->p, &dh->q, &dh->g, 0)
  2673. != MP_OKAY) {
  2674. ret = MP_INIT_E;
  2675. }
  2676. }
  2677. if (ret == 0) {
  2678. if (mp_read_unsigned_bin(tmp2, buf, bufSz) != MP_OKAY)
  2679. ret = MP_READ_E;
  2680. }
  2681. /* make our prime q */
  2682. if (ret == 0) {
  2683. if (mp_rand_prime(&dh->q, (int)groupSz, rng, NULL) != MP_OKAY)
  2684. ret = PRIME_GEN_E;
  2685. }
  2686. /* p = random * q */
  2687. if (ret == 0) {
  2688. if (mp_mul(&dh->q, tmp2, &dh->p) != MP_OKAY)
  2689. ret = MP_MUL_E;
  2690. }
  2691. /* p = random * q + 1, so q is a prime divisor of p-1 */
  2692. if (ret == 0) {
  2693. if (mp_add_d(&dh->p, 1, &dh->p) != MP_OKAY)
  2694. ret = MP_ADD_E;
  2695. }
  2696. /* tmp = 2q */
  2697. if (ret == 0) {
  2698. if (mp_add(&dh->q, &dh->q, tmp) != MP_OKAY)
  2699. ret = MP_ADD_E;
  2700. }
  2701. /* loop until p is prime */
  2702. if (ret == 0) {
  2703. do {
  2704. if (mp_prime_is_prime_ex(&dh->p, 8, &primeCheck, rng) != MP_OKAY)
  2705. ret = PRIME_GEN_E;
  2706. if (primeCheck != MP_YES) {
  2707. /* p += 2q */
  2708. if (mp_add(tmp, &dh->p, &dh->p) != MP_OKAY)
  2709. ret = MP_ADD_E;
  2710. else
  2711. primeCheckCount++;
  2712. }
  2713. } while (ret == 0 && primeCheck == MP_NO);
  2714. }
  2715. /* tmp2 += (2*loop_check_prime)
  2716. * to have p = (q * tmp2) + 1 prime
  2717. */
  2718. if ((ret == 0) && (primeCheckCount)) {
  2719. if (mp_add_d(tmp2, 2 * primeCheckCount, tmp2) != MP_OKAY)
  2720. ret = MP_ADD_E;
  2721. }
  2722. /* find a value g for which g^tmp2 != 1 */
  2723. if ((ret == 0) && (mp_set(&dh->g, 1) != MP_OKAY))
  2724. ret = MP_ZERO_E;
  2725. if (ret == 0) {
  2726. do {
  2727. if (mp_add_d(&dh->g, 1, &dh->g) != MP_OKAY)
  2728. ret = MP_ADD_E;
  2729. else if (mp_exptmod(&dh->g, tmp2, &dh->p, tmp) != MP_OKAY)
  2730. ret = MP_EXPTMOD_E;
  2731. } while (ret == 0 && mp_cmp_d(tmp, 1) == MP_EQ);
  2732. }
  2733. if (ret == 0) {
  2734. /* at this point tmp generates a group of order q mod p */
  2735. #ifndef USE_FAST_MATH
  2736. /* Exchanging is quick when the data pointer can be copied. */
  2737. mp_exch(tmp, &dh->g);
  2738. #else
  2739. mp_copy(tmp, &dh->g);
  2740. #endif
  2741. }
  2742. /* clear the parameters if there was an error */
  2743. if ((ret != 0) && (dh != NULL)) {
  2744. mp_clear(&dh->q);
  2745. mp_clear(&dh->p);
  2746. mp_clear(&dh->g);
  2747. }
  2748. RESTORE_VECTOR_REGISTERS();
  2749. if (buf != NULL) {
  2750. ForceZero(buf, bufSz);
  2751. if (dh != NULL) {
  2752. XFREE(buf, dh->heap, DYNAMIC_TYPE_TMP_BUFFER);
  2753. }
  2754. }
  2755. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
  2756. if (tmp != NULL) {
  2757. mp_clear(tmp);
  2758. XFREE(tmp, NULL, DYNAMIC_TYPE_WOLF_BIGINT);
  2759. }
  2760. if (tmp2 != NULL) {
  2761. mp_clear(tmp2);
  2762. XFREE(tmp2, NULL, DYNAMIC_TYPE_WOLF_BIGINT);
  2763. }
  2764. #else
  2765. mp_clear(tmp);
  2766. mp_clear(tmp2);
  2767. #endif
  2768. return ret;
  2769. }
  2770. /* Export raw DH parameters from DhKey structure
  2771. *
  2772. * dh - pointer to initialized DhKey structure
  2773. * p - output location for DH (p) parameter
  2774. * pSz - [IN/OUT] size of output buffer for p, size of p
  2775. * q - output location for DH (q) parameter
  2776. * qSz - [IN/OUT] size of output buffer for q, size of q
  2777. * g - output location for DH (g) parameter
  2778. * gSz - [IN/OUT] size of output buffer for g, size of g
  2779. *
  2780. * If p, q, and g pointers are all passed in as NULL, the function
  2781. * will set pSz, qSz, and gSz to the required output buffer sizes for p,
  2782. * q, and g. In this case, the function will return LENGTH_ONLY_E.
  2783. *
  2784. * returns 0 on success, negative upon failure
  2785. */
  2786. int wc_DhExportParamsRaw(DhKey* dh, byte* p, word32* pSz,
  2787. byte* q, word32* qSz, byte* g, word32* gSz)
  2788. {
  2789. int ret = 0;
  2790. word32 pLen = 0, qLen = 0, gLen = 0;
  2791. if (dh == NULL || pSz == NULL || qSz == NULL || gSz == NULL)
  2792. ret = BAD_FUNC_ARG;
  2793. /* get required output buffer sizes */
  2794. if (ret == 0) {
  2795. pLen = (word32)mp_unsigned_bin_size(&dh->p);
  2796. qLen = (word32)mp_unsigned_bin_size(&dh->q);
  2797. gLen = (word32)mp_unsigned_bin_size(&dh->g);
  2798. /* return buffer sizes and LENGTH_ONLY_E if buffers are NULL */
  2799. if (p == NULL && q == NULL && g == NULL) {
  2800. *pSz = pLen;
  2801. *qSz = qLen;
  2802. *gSz = gLen;
  2803. ret = LENGTH_ONLY_E;
  2804. }
  2805. }
  2806. if (ret == 0) {
  2807. if (p == NULL || q == NULL || g == NULL)
  2808. ret = BAD_FUNC_ARG;
  2809. }
  2810. /* export p */
  2811. if (ret == 0) {
  2812. if (*pSz < pLen) {
  2813. WOLFSSL_MSG("Output buffer for DH p parameter too small, "
  2814. "required size placed into pSz");
  2815. *pSz = pLen;
  2816. ret = BUFFER_E;
  2817. }
  2818. }
  2819. if (ret == 0) {
  2820. *pSz = pLen;
  2821. if (mp_to_unsigned_bin(&dh->p, p) != MP_OKAY)
  2822. ret = MP_TO_E;
  2823. }
  2824. /* export q */
  2825. if (ret == 0) {
  2826. if (*qSz < qLen) {
  2827. WOLFSSL_MSG("Output buffer for DH q parameter too small, "
  2828. "required size placed into qSz");
  2829. *qSz = qLen;
  2830. ret = BUFFER_E;
  2831. }
  2832. }
  2833. if (ret == 0) {
  2834. *qSz = qLen;
  2835. if (mp_to_unsigned_bin(&dh->q, q) != MP_OKAY)
  2836. ret = MP_TO_E;
  2837. }
  2838. /* export g */
  2839. if (ret == 0) {
  2840. if (*gSz < gLen) {
  2841. WOLFSSL_MSG("Output buffer for DH g parameter too small, "
  2842. "required size placed into gSz");
  2843. *gSz = gLen;
  2844. ret = BUFFER_E;
  2845. }
  2846. }
  2847. if (ret == 0) {
  2848. *gSz = gLen;
  2849. if (mp_to_unsigned_bin(&dh->g, g) != MP_OKAY)
  2850. ret = MP_TO_E;
  2851. }
  2852. return ret;
  2853. }
  2854. #endif /* WOLFSSL_KEY_GEN */
  2855. #endif /* NO_DH */