tls.c 361 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981
  1. /* tls.c
  2. *
  3. * Copyright (C) 2006-2020 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 WOLFCRYPT_ONLY
  26. #include <wolfssl/ssl.h>
  27. #include <wolfssl/internal.h>
  28. #include <wolfssl/error-ssl.h>
  29. #include <wolfssl/wolfcrypt/hmac.h>
  30. #ifdef NO_INLINE
  31. #include <wolfssl/wolfcrypt/misc.h>
  32. #else
  33. #define WOLFSSL_MISC_INCLUDED
  34. #include <wolfcrypt/src/misc.c>
  35. #endif
  36. #ifdef HAVE_CURVE25519
  37. #include <wolfssl/wolfcrypt/curve25519.h>
  38. #endif
  39. #ifdef HAVE_CURVE448
  40. #include <wolfssl/wolfcrypt/curve448.h>
  41. #endif
  42. #ifdef HAVE_NTRU
  43. #include "libntruencrypt/ntru_crypto.h"
  44. #include <wolfssl/wolfcrypt/random.h>
  45. #endif
  46. #ifdef HAVE_QSH
  47. static int TLSX_AddQSHKey(QSHKey** list, QSHKey* key);
  48. static byte* TLSX_QSHKeyFind_Pub(QSHKey* qsh, word16* pubLen, word16 name);
  49. #if defined(HAVE_NTRU)
  50. static int TLSX_CreateNtruKey(WOLFSSL* ssl, int type);
  51. #endif
  52. #endif /* HAVE_QSH */
  53. #if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
  54. static int TLSX_KeyShare_IsSupported(int namedGroup);
  55. #endif
  56. #ifdef HAVE_SUPPORTED_CURVES
  57. static int TLSX_PopulateSupportedGroups(WOLFSSL* ssl, TLSX** extensions);
  58. #endif
  59. #ifndef NO_TLS
  60. /* Digest enable checks */
  61. #ifdef NO_OLD_TLS /* TLS 1.2 only */
  62. #if defined(NO_SHA256) && !defined(WOLFSSL_SHA384) && \
  63. !defined(WOLFSSL_SHA512)
  64. #error Must have SHA256, SHA384 or SHA512 enabled for TLS 1.2
  65. #endif
  66. #else /* TLS 1.1 or older */
  67. #if defined(NO_MD5) && defined(NO_SHA)
  68. #error Must have SHA1 and MD5 enabled for old TLS
  69. #endif
  70. #endif
  71. #ifdef WOLFSSL_TLS13
  72. #if !defined(NO_DH) && \
  73. !defined(HAVE_FFDHE_2048) && !defined(HAVE_FFDHE_3072) && \
  74. !defined(HAVE_FFDHE_4096) && !defined(HAVE_FFDHE_6144) && \
  75. !defined(HAVE_FFDHE_8192)
  76. #error Please configure your TLS 1.3 DH key size using either: HAVE_FFDHE_2048, HAVE_FFDHE_3072, HAVE_FFDHE_4096, HAVE_FFDHE_6144 or HAVE_FFDHE_8192
  77. #endif
  78. #if !defined(NO_RSA) && !defined(WC_RSA_PSS)
  79. #error The build option WC_RSA_PSS is required for TLS 1.3 with RSA
  80. #endif
  81. #ifndef HAVE_TLS_EXTENSIONS
  82. #ifndef _MSC_VER
  83. #error "The build option HAVE_TLS_EXTENSIONS is required for TLS 1.3"
  84. #else
  85. #pragma message("Error: The build option HAVE_TLS_EXTENSIONS is required for TLS 1.3")
  86. #endif
  87. #endif
  88. #endif
  89. /* Warn if secrets logging is enabled */
  90. #if defined(SHOW_SECRETS) || defined(WOLFSSL_SSLKEYLOGFILE)
  91. #ifndef _MSC_VER
  92. #warning The SHOW_SECRETS and WOLFSSL_SSLKEYLOGFILE options should only be used for debugging and never in a production environment
  93. #else
  94. #pragma message("Warning: The SHOW_SECRETS and WOLFSSL_SSLKEYLOGFILE options should only be used for debugging and never in a production environment")
  95. #endif
  96. #endif
  97. /* Optional Pre-Master-Secret logging for Wireshark */
  98. #if !defined(NO_FILESYSTEM) && defined(WOLFSSL_SSLKEYLOGFILE)
  99. #ifndef WOLFSSL_SSLKEYLOGFILE_OUTPUT
  100. #define WOLFSSL_SSLKEYLOGFILE_OUTPUT "sslkeylog.log"
  101. #endif
  102. #endif
  103. #ifndef WOLFSSL_NO_TLS12
  104. #ifdef WOLFSSL_SHA384
  105. #define HSHASH_SZ WC_SHA384_DIGEST_SIZE
  106. #else
  107. #define HSHASH_SZ FINISHED_SZ
  108. #endif
  109. #ifdef WOLFSSL_RENESAS_TSIP_TLS
  110. #if (WOLFSSL_RENESAS_TSIP_VER >=109)
  111. int tsip_generateMasterSecretEx(
  112. byte cipherSuiteFirst,
  113. byte cipherSuite,
  114. const byte* pr, /* pre-master */
  115. const byte* cr, /* client random */
  116. const byte* sr, /* server random */
  117. byte* ms);
  118. #elif (WOLFSSL_RENESAS_TSIP_VER >=106)
  119. int tsip_generateMasterSecret(
  120. const byte* pre,
  121. const byte* cr,
  122. const byte* sr,
  123. byte* ms);
  124. #endif
  125. int tsip_useable(const WOLFSSL *ssl);
  126. int tsip_generateSeesionKey(WOLFSSL *ssl);
  127. int tsip_generateVerifyData(
  128. const byte* ms,
  129. const byte* side,
  130. const byte* handshake_hash,
  131. byte* hashes);
  132. #endif /*WOLFSSL_RENESAS_TSIP_TLS*/
  133. int BuildTlsHandshakeHash(WOLFSSL* ssl, byte* hash, word32* hashLen)
  134. {
  135. int ret = 0;
  136. word32 hashSz = FINISHED_SZ;
  137. if (ssl == NULL || hash == NULL || hashLen == NULL || *hashLen < HSHASH_SZ)
  138. return BAD_FUNC_ARG;
  139. /* for constant timing perform these even if error */
  140. #ifndef NO_OLD_TLS
  141. ret |= wc_Md5GetHash(&ssl->hsHashes->hashMd5, hash);
  142. ret |= wc_ShaGetHash(&ssl->hsHashes->hashSha, &hash[WC_MD5_DIGEST_SIZE]);
  143. #endif
  144. if (IsAtLeastTLSv1_2(ssl)) {
  145. #ifndef NO_SHA256
  146. if (ssl->specs.mac_algorithm <= sha256_mac ||
  147. ssl->specs.mac_algorithm == blake2b_mac) {
  148. ret |= wc_Sha256GetHash(&ssl->hsHashes->hashSha256, hash);
  149. hashSz = WC_SHA256_DIGEST_SIZE;
  150. }
  151. #endif
  152. #ifdef WOLFSSL_SHA384
  153. if (ssl->specs.mac_algorithm == sha384_mac) {
  154. ret |= wc_Sha384GetHash(&ssl->hsHashes->hashSha384, hash);
  155. hashSz = WC_SHA384_DIGEST_SIZE;
  156. }
  157. #endif
  158. }
  159. *hashLen = hashSz;
  160. if (ret != 0)
  161. ret = BUILD_MSG_ERROR;
  162. return ret;
  163. }
  164. int BuildTlsFinished(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
  165. {
  166. int ret;
  167. const byte* side;
  168. word32 hashSz = HSHASH_SZ;
  169. #if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
  170. DECLARE_VAR(handshake_hash, byte, HSHASH_SZ, ssl->heap);
  171. if (handshake_hash == NULL)
  172. return MEMORY_E;
  173. #else
  174. byte handshake_hash[HSHASH_SZ];
  175. #endif
  176. ret = BuildTlsHandshakeHash(ssl, handshake_hash, &hashSz);
  177. if (ret == 0) {
  178. if (XSTRNCMP((const char*)sender, (const char*)client, SIZEOF_SENDER) == 0)
  179. side = tls_client;
  180. else
  181. side = tls_server;
  182. #ifdef WOLFSSL_HAVE_PRF
  183. #if defined(WOLFSSL_RENESAS_TSIP_TLS) && \
  184. !defined(NO_WOLFSSL_RENESAS_TSIP_TLS_SESSION)
  185. if (tsip_useable(ssl)) {
  186. ret = tsip_generateVerifyData(ssl->arrays->tsip_masterSecret,
  187. side, handshake_hash, (byte*)hashes /* out */);
  188. } else
  189. #endif
  190. ret = wc_PRF_TLS((byte*)hashes, TLS_FINISHED_SZ, ssl->arrays->masterSecret,
  191. SECRET_LEN, side, FINISHED_LABEL_SZ, handshake_hash, hashSz,
  192. IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
  193. ssl->heap, ssl->devId);
  194. #else
  195. /* Pseudo random function must be enabled in the configuration. */
  196. ret = PRF_MISSING;
  197. WOLFSSL_MSG("Pseudo-random function is not enabled");
  198. (void)side;
  199. (void)hashes;
  200. #endif
  201. }
  202. #if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
  203. FREE_VAR(handshake_hash, ssl->heap);
  204. #endif
  205. return ret;
  206. }
  207. #endif /* !WOLFSSL_NO_TLS12 */
  208. #ifndef NO_OLD_TLS
  209. #ifdef WOLFSSL_ALLOW_TLSV10
  210. ProtocolVersion MakeTLSv1(void)
  211. {
  212. ProtocolVersion pv;
  213. pv.major = SSLv3_MAJOR;
  214. pv.minor = TLSv1_MINOR;
  215. return pv;
  216. }
  217. #endif /* WOLFSSL_ALLOW_TLSV10 */
  218. ProtocolVersion MakeTLSv1_1(void)
  219. {
  220. ProtocolVersion pv;
  221. pv.major = SSLv3_MAJOR;
  222. pv.minor = TLSv1_1_MINOR;
  223. return pv;
  224. }
  225. #endif /* !NO_OLD_TLS */
  226. #ifndef WOLFSSL_NO_TLS12
  227. ProtocolVersion MakeTLSv1_2(void)
  228. {
  229. ProtocolVersion pv;
  230. pv.major = SSLv3_MAJOR;
  231. pv.minor = TLSv1_2_MINOR;
  232. return pv;
  233. }
  234. #endif /* !WOLFSSL_NO_TLS12 */
  235. #ifdef WOLFSSL_TLS13
  236. /* The TLS v1.3 protocol version.
  237. *
  238. * returns the protocol version data for TLS v1.3.
  239. */
  240. ProtocolVersion MakeTLSv1_3(void)
  241. {
  242. ProtocolVersion pv;
  243. pv.major = SSLv3_MAJOR;
  244. pv.minor = TLSv1_3_MINOR;
  245. return pv;
  246. }
  247. #endif
  248. #ifndef WOLFSSL_NO_TLS12
  249. #ifdef HAVE_EXTENDED_MASTER
  250. static const byte ext_master_label[EXT_MASTER_LABEL_SZ + 1] =
  251. "extended master secret";
  252. #endif
  253. static const byte master_label[MASTER_LABEL_SZ + 1] = "master secret";
  254. static const byte key_label [KEY_LABEL_SZ + 1] = "key expansion";
  255. static int _DeriveTlsKeys(byte* key_dig, word32 key_dig_len,
  256. const byte* ms, word32 msLen,
  257. const byte* sr, const byte* cr,
  258. int tls1_2, int hash_type,
  259. void* heap, int devId)
  260. {
  261. int ret;
  262. #if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
  263. DECLARE_VAR(seed, byte, SEED_LEN, heap);
  264. if (seed == NULL)
  265. return MEMORY_E;
  266. #else
  267. byte seed[SEED_LEN];
  268. #endif
  269. XMEMCPY(seed, sr, RAN_LEN);
  270. XMEMCPY(seed + RAN_LEN, cr, RAN_LEN);
  271. #ifdef WOLFSSL_HAVE_PRF
  272. ret = wc_PRF_TLS(key_dig, key_dig_len, ms, msLen, key_label, KEY_LABEL_SZ,
  273. seed, SEED_LEN, tls1_2, hash_type, heap, devId);
  274. #else
  275. /* Pseudo random function must be enabled in the configuration. */
  276. ret = PRF_MISSING;
  277. WOLFSSL_MSG("Pseudo-random function is not enabled");
  278. (void)key_dig;
  279. (void)key_dig_len;
  280. (void)ms;
  281. (void)msLen;
  282. (void)tls1_2;
  283. (void)hash_type;
  284. (void)heap;
  285. (void)devId;
  286. (void)key_label;
  287. (void)master_label;
  288. #ifdef HAVE_EXTENDED_MASTER
  289. (void)ext_master_label;
  290. #endif
  291. #endif
  292. #if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
  293. FREE_VAR(seed, heap);
  294. #endif
  295. return ret;
  296. }
  297. /* External facing wrapper so user can call as well, 0 on success */
  298. int wolfSSL_DeriveTlsKeys(byte* key_dig, word32 key_dig_len,
  299. const byte* ms, word32 msLen,
  300. const byte* sr, const byte* cr,
  301. int tls1_2, int hash_type)
  302. {
  303. return _DeriveTlsKeys(key_dig, key_dig_len, ms, msLen, sr, cr, tls1_2,
  304. hash_type, NULL, INVALID_DEVID);
  305. }
  306. int DeriveTlsKeys(WOLFSSL* ssl)
  307. {
  308. int ret;
  309. int key_dig_len = 2 * ssl->specs.hash_size +
  310. 2 * ssl->specs.key_size +
  311. 2 * ssl->specs.iv_size;
  312. #ifdef WOLFSSL_SMALL_STACK
  313. byte* key_dig;
  314. #else
  315. byte key_dig[MAX_PRF_DIG];
  316. #endif
  317. #ifdef WOLFSSL_SMALL_STACK
  318. key_dig = (byte*)XMALLOC(MAX_PRF_DIG, ssl->heap, DYNAMIC_TYPE_DIGEST);
  319. if (key_dig == NULL) {
  320. return MEMORY_E;
  321. }
  322. #endif
  323. #if defined(WOLFSSL_RENESAS_TSIP_TLS) && \
  324. !defined(NO_WOLFSSL_RENESAS_TSIP_TLS_SESSION)
  325. if (tsip_useable(ssl))
  326. ret = tsip_generateSeesionKey(ssl);
  327. else {
  328. #endif
  329. ret = _DeriveTlsKeys(key_dig, key_dig_len,
  330. ssl->arrays->masterSecret, SECRET_LEN,
  331. ssl->arrays->serverRandom, ssl->arrays->clientRandom,
  332. IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
  333. ssl->heap, ssl->devId);
  334. if (ret == 0)
  335. ret = StoreKeys(ssl, key_dig, PROVISION_CLIENT_SERVER);
  336. #if defined(WOLFSSL_RENESAS_TSIP_TLS) && \
  337. !defined(NO_WOLFSSL_RENESAS_TSIP_TLS_SESSION)
  338. }
  339. #endif
  340. #ifdef WOLFSSL_SMALL_STACK
  341. XFREE(key_dig, ssl->heap, DYNAMIC_TYPE_DIGEST);
  342. #endif
  343. return ret;
  344. }
  345. static int _MakeTlsMasterSecret(byte* ms, word32 msLen,
  346. const byte* pms, word32 pmsLen,
  347. const byte* cr, const byte* sr,
  348. int tls1_2, int hash_type,
  349. void* heap, int devId)
  350. {
  351. int ret;
  352. #if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
  353. DECLARE_VAR(seed, byte, SEED_LEN, heap);
  354. if (seed == NULL)
  355. return MEMORY_E;
  356. #else
  357. byte seed[SEED_LEN];
  358. #endif
  359. XMEMCPY(seed, cr, RAN_LEN);
  360. XMEMCPY(seed + RAN_LEN, sr, RAN_LEN);
  361. #ifdef WOLFSSL_HAVE_PRF
  362. ret = wc_PRF_TLS(ms, msLen, pms, pmsLen, master_label, MASTER_LABEL_SZ,
  363. seed, SEED_LEN, tls1_2, hash_type, heap, devId);
  364. #else
  365. /* Pseudo random function must be enabled in the configuration. */
  366. ret = PRF_MISSING;
  367. WOLFSSL_MSG("Pseudo-random function is not enabled");
  368. (void)ms;
  369. (void)msLen;
  370. (void)pms;
  371. (void)pmsLen;
  372. (void)tls1_2;
  373. (void)hash_type;
  374. (void)heap;
  375. (void)devId;
  376. #endif
  377. #if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
  378. FREE_VAR(seed, heap);
  379. #endif
  380. return ret;
  381. }
  382. /* External facing wrapper so user can call as well, 0 on success */
  383. int wolfSSL_MakeTlsMasterSecret(byte* ms, word32 msLen,
  384. const byte* pms, word32 pmsLen,
  385. const byte* cr, const byte* sr,
  386. int tls1_2, int hash_type)
  387. {
  388. return _MakeTlsMasterSecret(ms, msLen, pms, pmsLen, cr, sr, tls1_2,
  389. hash_type, NULL, INVALID_DEVID);
  390. }
  391. #ifdef HAVE_EXTENDED_MASTER
  392. static int _MakeTlsExtendedMasterSecret(byte* ms, word32 msLen,
  393. const byte* pms, word32 pmsLen,
  394. const byte* sHash, word32 sHashLen,
  395. int tls1_2, int hash_type,
  396. void* heap, int devId)
  397. {
  398. int ret;
  399. #ifdef WOLFSSL_HAVE_PRF
  400. ret = wc_PRF_TLS(ms, msLen, pms, pmsLen, ext_master_label, EXT_MASTER_LABEL_SZ,
  401. sHash, sHashLen, tls1_2, hash_type, heap, devId);
  402. #else
  403. /* Pseudo random function must be enabled in the configuration. */
  404. ret = PRF_MISSING;
  405. WOLFSSL_MSG("Pseudo-random function is not enabled");
  406. (void)ms;
  407. (void)msLen;
  408. (void)pms;
  409. (void)pmsLen;
  410. (void)sHash;
  411. (void)sHashLen;
  412. (void)tls1_2;
  413. (void)hash_type;
  414. (void)heap;
  415. (void)devId;
  416. #endif
  417. return ret;
  418. }
  419. /* External facing wrapper so user can call as well, 0 on success */
  420. int wolfSSL_MakeTlsExtendedMasterSecret(byte* ms, word32 msLen,
  421. const byte* pms, word32 pmsLen,
  422. const byte* sHash, word32 sHashLen,
  423. int tls1_2, int hash_type)
  424. {
  425. return _MakeTlsExtendedMasterSecret(ms, msLen, pms, pmsLen, sHash, sHashLen,
  426. tls1_2, hash_type, NULL, INVALID_DEVID);
  427. }
  428. #endif /* HAVE_EXTENDED_MASTER */
  429. int MakeTlsMasterSecret(WOLFSSL* ssl)
  430. {
  431. int ret;
  432. #ifdef HAVE_EXTENDED_MASTER
  433. if (ssl->options.haveEMS) {
  434. word32 hashSz = HSHASH_SZ;
  435. #ifdef WOLFSSL_SMALL_STACK
  436. byte* handshake_hash = (byte*)XMALLOC(HSHASH_SZ, ssl->heap,
  437. DYNAMIC_TYPE_DIGEST);
  438. if (handshake_hash == NULL)
  439. return MEMORY_E;
  440. #else
  441. byte handshake_hash[HSHASH_SZ];
  442. #endif
  443. ret = BuildTlsHandshakeHash(ssl, handshake_hash, &hashSz);
  444. if (ret == 0) {
  445. ret = _MakeTlsExtendedMasterSecret(
  446. ssl->arrays->masterSecret, SECRET_LEN,
  447. ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz,
  448. handshake_hash, hashSz,
  449. IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
  450. ssl->heap, ssl->devId);
  451. }
  452. #ifdef WOLFSSL_SMALL_STACK
  453. XFREE(handshake_hash, ssl->heap, DYNAMIC_TYPE_DIGEST);
  454. #endif
  455. }
  456. else
  457. #endif /* HAVE_EXTENDED_MASTER */
  458. {
  459. #if defined(WOLFSSL_RENESAS_TSIP_TLS) && \
  460. !defined(NO_WOLFSSL_RENESAS_TSIP_TLS_SESSION)
  461. if (tsip_useable(ssl)) {
  462. #if (WOLFSSL_RENESAS_TSIP_VER>=109)
  463. ret = tsip_generateMasterSecretEx(
  464. ssl->options.cipherSuite0,
  465. ssl->options.cipherSuite,
  466. &ssl->arrays->preMasterSecret[VERSION_SZ],
  467. ssl->arrays->clientRandom,
  468. ssl->arrays->serverRandom,
  469. ssl->arrays->tsip_masterSecret);
  470. #elif (WOLFSSL_RENESAS_TSIP_VER>=106)
  471. ret = tsip_generateMasterSecret(
  472. &ssl->arrays->preMasterSecret[VERSION_SZ],
  473. ssl->arrays->clientRandom,
  474. ssl->arrays->serverRandom,
  475. ssl->arrays->tsip_masterSecret);
  476. #else
  477. ret = NOT_COMPILED_IN;
  478. #endif
  479. } else
  480. #endif
  481. ret = _MakeTlsMasterSecret(ssl->arrays->masterSecret, SECRET_LEN,
  482. ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz,
  483. ssl->arrays->clientRandom, ssl->arrays->serverRandom,
  484. IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
  485. ssl->heap, ssl->devId);
  486. }
  487. if (ret == 0) {
  488. #ifdef SHOW_SECRETS
  489. /* Wireshark Pre-Master-Secret Format:
  490. * CLIENT_RANDOM <clientrandom> <mastersecret>
  491. */
  492. const char* CLIENT_RANDOM_LABEL = "CLIENT_RANDOM";
  493. int i, pmsPos = 0;
  494. char pmsBuf[13 + 1 + 64 + 1 + 96 + 1 + 1];
  495. XSNPRINTF(&pmsBuf[pmsPos], sizeof(pmsBuf) - pmsPos, "%s ",
  496. CLIENT_RANDOM_LABEL);
  497. pmsPos += XSTRLEN(CLIENT_RANDOM_LABEL) + 1;
  498. for (i = 0; i < RAN_LEN; i++) {
  499. XSNPRINTF(&pmsBuf[pmsPos], sizeof(pmsBuf) - pmsPos, "%02x",
  500. ssl->arrays->clientRandom[i]);
  501. pmsPos += 2;
  502. }
  503. XSNPRINTF(&pmsBuf[pmsPos], sizeof(pmsBuf) - pmsPos, " ");
  504. pmsPos += 1;
  505. for (i = 0; i < SECRET_LEN; i++) {
  506. XSNPRINTF(&pmsBuf[pmsPos], sizeof(pmsBuf) - pmsPos, "%02x",
  507. ssl->arrays->masterSecret[i]);
  508. pmsPos += 2;
  509. }
  510. XSNPRINTF(&pmsBuf[pmsPos], sizeof(pmsBuf) - pmsPos, "\n");
  511. pmsPos += 1;
  512. /* print master secret */
  513. puts(pmsBuf);
  514. #if !defined(NO_FILESYSTEM) && defined(WOLFSSL_SSLKEYLOGFILE)
  515. {
  516. FILE* f = XFOPEN(WOLFSSL_SSLKEYLOGFILE_OUTPUT, "a");
  517. if (f != XBADFILE) {
  518. XFWRITE(pmsBuf, 1, pmsPos, f);
  519. XFCLOSE(f);
  520. }
  521. }
  522. #endif
  523. #endif /* SHOW_SECRETS */
  524. ret = DeriveTlsKeys(ssl);
  525. }
  526. return ret;
  527. }
  528. /* Used by EAP-TLS and EAP-TTLS to derive keying material from
  529. * the master_secret. */
  530. int wolfSSL_make_eap_keys(WOLFSSL* ssl, void* msk, unsigned int len,
  531. const char* label)
  532. {
  533. int ret;
  534. #ifdef WOLFSSL_SMALL_STACK
  535. byte* seed;
  536. #else
  537. byte seed[SEED_LEN];
  538. #endif
  539. #ifdef WOLFSSL_SMALL_STACK
  540. seed = (byte*)XMALLOC(SEED_LEN, ssl->heap, DYNAMIC_TYPE_SEED);
  541. if (seed == NULL)
  542. return MEMORY_E;
  543. #endif
  544. /*
  545. * As per RFC-5281, the order of the client and server randoms is reversed
  546. * from that used by the TLS protocol to derive keys.
  547. */
  548. XMEMCPY(seed, ssl->arrays->clientRandom, RAN_LEN);
  549. XMEMCPY(seed + RAN_LEN, ssl->arrays->serverRandom, RAN_LEN);
  550. #ifdef WOLFSSL_HAVE_PRF
  551. ret = wc_PRF_TLS((byte*)msk, len, ssl->arrays->masterSecret, SECRET_LEN,
  552. (const byte *)label, (word32)XSTRLEN(label), seed, SEED_LEN,
  553. IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
  554. ssl->heap, ssl->devId);
  555. #else
  556. /* Pseudo random function must be enabled in the configuration. */
  557. ret = PRF_MISSING;
  558. WOLFSSL_MSG("Pseudo-random function is not enabled");
  559. (void)msk;
  560. (void)len;
  561. (void)label;
  562. #endif
  563. #ifdef WOLFSSL_SMALL_STACK
  564. XFREE(seed, ssl->heap, DYNAMIC_TYPE_SEED);
  565. #endif
  566. return ret;
  567. }
  568. /* return HMAC digest type in wolfSSL format */
  569. int wolfSSL_GetHmacType(WOLFSSL* ssl)
  570. {
  571. if (ssl == NULL)
  572. return BAD_FUNC_ARG;
  573. switch (ssl->specs.mac_algorithm) {
  574. #ifndef NO_MD5
  575. case md5_mac:
  576. {
  577. return WC_MD5;
  578. }
  579. #endif
  580. #ifndef NO_SHA256
  581. case sha256_mac:
  582. {
  583. return WC_SHA256;
  584. }
  585. #endif
  586. #ifdef WOLFSSL_SHA384
  587. case sha384_mac:
  588. {
  589. return WC_SHA384;
  590. }
  591. #endif
  592. #ifndef NO_SHA
  593. case sha_mac:
  594. {
  595. return WC_SHA;
  596. }
  597. #endif
  598. #ifdef HAVE_BLAKE2
  599. case blake2b_mac:
  600. {
  601. return BLAKE2B_ID;
  602. }
  603. #endif
  604. default:
  605. {
  606. return WOLFSSL_FATAL_ERROR;
  607. }
  608. }
  609. }
  610. int wolfSSL_SetTlsHmacInner(WOLFSSL* ssl, byte* inner, word32 sz, int content,
  611. int verify)
  612. {
  613. if (ssl == NULL || inner == NULL)
  614. return BAD_FUNC_ARG;
  615. XMEMSET(inner, 0, WOLFSSL_TLS_HMAC_INNER_SZ);
  616. WriteSEQ(ssl, verify, inner);
  617. inner[SEQ_SZ] = (byte)content;
  618. inner[SEQ_SZ + ENUM_LEN] = ssl->version.major;
  619. inner[SEQ_SZ + ENUM_LEN + ENUM_LEN] = ssl->version.minor;
  620. c16toa((word16)sz, inner + SEQ_SZ + ENUM_LEN + VERSION_SZ);
  621. return 0;
  622. }
  623. #ifndef WOLFSSL_AEAD_ONLY
  624. #if !defined(WOLFSSL_NO_HASH_RAW) && !defined(HAVE_FIPS) && \
  625. !defined(HAVE_SELFTEST)
  626. /* Update the hash in the HMAC.
  627. *
  628. * hmac HMAC object.
  629. * data Data to be hashed.
  630. * sz Size of data to hash.
  631. * returns 0 on success, otherwise failure.
  632. */
  633. static int Hmac_HashUpdate(Hmac* hmac, const byte* data, word32 sz)
  634. {
  635. int ret = BAD_FUNC_ARG;
  636. switch (hmac->macType) {
  637. #ifndef NO_SHA
  638. case WC_SHA:
  639. ret = wc_ShaUpdate(&hmac->hash.sha, data, sz);
  640. break;
  641. #endif /* !NO_SHA */
  642. #ifndef NO_SHA256
  643. case WC_SHA256:
  644. ret = wc_Sha256Update(&hmac->hash.sha256, data, sz);
  645. break;
  646. #endif /* !NO_SHA256 */
  647. #ifdef WOLFSSL_SHA384
  648. case WC_SHA384:
  649. ret = wc_Sha384Update(&hmac->hash.sha384, data, sz);
  650. break;
  651. #endif /* WOLFSSL_SHA384 */
  652. #ifdef WOLFSSL_SHA512
  653. case WC_SHA512:
  654. ret = wc_Sha512Update(&hmac->hash.sha512, data, sz);
  655. break;
  656. #endif /* WOLFSSL_SHA512 */
  657. }
  658. return ret;
  659. }
  660. /* Finalize the hash but don't put the EOC, padding or length in.
  661. *
  662. * hmac HMAC object.
  663. * hash Hash result.
  664. * returns 0 on success, otherwise failure.
  665. */
  666. static int Hmac_HashFinalRaw(Hmac* hmac, unsigned char* hash)
  667. {
  668. int ret = BAD_FUNC_ARG;
  669. switch (hmac->macType) {
  670. #ifndef NO_SHA
  671. case WC_SHA:
  672. ret = wc_ShaFinalRaw(&hmac->hash.sha, hash);
  673. break;
  674. #endif /* !NO_SHA */
  675. #ifndef NO_SHA256
  676. case WC_SHA256:
  677. ret = wc_Sha256FinalRaw(&hmac->hash.sha256, hash);
  678. break;
  679. #endif /* !NO_SHA256 */
  680. #ifdef WOLFSSL_SHA384
  681. case WC_SHA384:
  682. ret = wc_Sha384FinalRaw(&hmac->hash.sha384, hash);
  683. break;
  684. #endif /* WOLFSSL_SHA384 */
  685. #ifdef WOLFSSL_SHA512
  686. case WC_SHA512:
  687. ret = wc_Sha512FinalRaw(&hmac->hash.sha512, hash);
  688. break;
  689. #endif /* WOLFSSL_SHA512 */
  690. }
  691. return ret;
  692. }
  693. /* Finalize the HMAC by performing outer hash.
  694. *
  695. * hmac HMAC object.
  696. * mac MAC result.
  697. * returns 0 on success, otherwise failure.
  698. */
  699. static int Hmac_OuterHash(Hmac* hmac, unsigned char* mac)
  700. {
  701. int ret = BAD_FUNC_ARG;
  702. wc_HashAlg hash;
  703. enum wc_HashType hashType = (enum wc_HashType)hmac->macType;
  704. int digestSz = wc_HashGetDigestSize(hashType);
  705. int blockSz = wc_HashGetBlockSize(hashType);
  706. if ((digestSz >= 0) && (blockSz >= 0)) {
  707. ret = wc_HashInit(&hash, hashType);
  708. }
  709. if (ret == 0) {
  710. ret = wc_HashUpdate(&hash, hashType, (byte*)hmac->opad,
  711. blockSz);
  712. if (ret == 0)
  713. ret = wc_HashUpdate(&hash, hashType, (byte*)hmac->innerHash,
  714. digestSz);
  715. if (ret == 0)
  716. ret = wc_HashFinal(&hash, hashType, mac);
  717. wc_HashFree(&hash, hashType);
  718. }
  719. return ret;
  720. }
  721. /* Calculate the HMAC of the header + message data.
  722. * Constant time implementation using wc_Sha*FinalRaw().
  723. *
  724. * hmac HMAC object.
  725. * digest MAC result.
  726. * in Message data.
  727. * sz Size of the message data.
  728. * header Constructed record header with length of handshake data.
  729. * returns 0 on success, otherwise failure.
  730. */
  731. static int Hmac_UpdateFinal_CT(Hmac* hmac, byte* digest, const byte* in,
  732. word32 sz, byte* header)
  733. {
  734. byte lenBytes[8];
  735. int i, j, k;
  736. int blockBits, blockMask;
  737. int lastBlockLen, macLen, extraLen, eocIndex;
  738. int blocks, safeBlocks, lenBlock, eocBlock;
  739. int maxLen;
  740. int blockSz, padSz;
  741. int ret;
  742. word32 realLen;
  743. byte extraBlock;
  744. switch (hmac->macType) {
  745. #ifndef NO_SHA
  746. case WC_SHA:
  747. blockSz = WC_SHA_BLOCK_SIZE;
  748. blockBits = 6;
  749. macLen = WC_SHA_DIGEST_SIZE;
  750. padSz = WC_SHA_BLOCK_SIZE - WC_SHA_PAD_SIZE + 1;
  751. break;
  752. #endif /* !NO_SHA */
  753. #ifndef NO_SHA256
  754. case WC_SHA256:
  755. blockSz = WC_SHA256_BLOCK_SIZE;
  756. blockBits = 6;
  757. macLen = WC_SHA256_DIGEST_SIZE;
  758. padSz = WC_SHA256_BLOCK_SIZE - WC_SHA256_PAD_SIZE + 1;
  759. break;
  760. #endif /* !NO_SHA256 */
  761. #ifdef WOLFSSL_SHA384
  762. case WC_SHA384:
  763. blockSz = WC_SHA384_BLOCK_SIZE;
  764. blockBits = 7;
  765. macLen = WC_SHA384_DIGEST_SIZE;
  766. padSz = WC_SHA384_BLOCK_SIZE - WC_SHA384_PAD_SIZE + 1;
  767. break;
  768. #endif /* WOLFSSL_SHA384 */
  769. #ifdef WOLFSSL_SHA512
  770. case WC_SHA512:
  771. blockSz = WC_SHA512_BLOCK_SIZE;
  772. blockBits = 7;
  773. macLen = WC_SHA512_DIGEST_SIZE;
  774. padSz = WC_SHA512_BLOCK_SIZE - WC_SHA512_PAD_SIZE + 1;
  775. break;
  776. #endif /* WOLFSSL_SHA512 */
  777. default:
  778. return BAD_FUNC_ARG;
  779. }
  780. blockMask = blockSz - 1;
  781. /* Size of data to HMAC if padding length byte is zero. */
  782. maxLen = WOLFSSL_TLS_HMAC_INNER_SZ + sz - 1 - macLen;
  783. /* Complete data (including padding) has block for EOC and/or length. */
  784. extraBlock = ctSetLTE((maxLen + padSz) & blockMask, padSz);
  785. /* Total number of blocks for data including padding. */
  786. blocks = ((maxLen + blockSz - 1) >> blockBits) + extraBlock;
  787. /* Up to last 6 blocks can be hashed safely. */
  788. safeBlocks = blocks - 6;
  789. /* Length of message data. */
  790. realLen = maxLen - in[sz - 1];
  791. /* Number of message bytes in last block. */
  792. lastBlockLen = realLen & blockMask;
  793. /* Number of padding bytes in last block. */
  794. extraLen = ((blockSz * 2 - padSz - lastBlockLen) & blockMask) + 1;
  795. /* Number of blocks to create for hash. */
  796. lenBlock = (realLen + extraLen) >> blockBits;
  797. /* Block containing EOC byte. */
  798. eocBlock = realLen >> blockBits;
  799. /* Index of EOC byte in block. */
  800. eocIndex = realLen & blockMask;
  801. /* Add length of hmac's ipad to total length. */
  802. realLen += blockSz;
  803. /* Length as bits - 8 bytes bigendian. */
  804. c32toa(realLen >> ((sizeof(word32) * 8) - 3), lenBytes);
  805. c32toa(realLen << 3, lenBytes + sizeof(word32));
  806. ret = Hmac_HashUpdate(hmac, (unsigned char*)hmac->ipad, blockSz);
  807. if (ret != 0)
  808. return ret;
  809. XMEMSET(hmac->innerHash, 0, macLen);
  810. if (safeBlocks > 0) {
  811. ret = Hmac_HashUpdate(hmac, header, WOLFSSL_TLS_HMAC_INNER_SZ);
  812. if (ret != 0)
  813. return ret;
  814. ret = Hmac_HashUpdate(hmac, in, safeBlocks * blockSz -
  815. WOLFSSL_TLS_HMAC_INNER_SZ);
  816. if (ret != 0)
  817. return ret;
  818. }
  819. else
  820. safeBlocks = 0;
  821. XMEMSET(digest, 0, macLen);
  822. k = safeBlocks * blockSz;
  823. for (i = safeBlocks; i < blocks; i++) {
  824. unsigned char hashBlock[WC_MAX_BLOCK_SIZE];
  825. unsigned char isEocBlock = ctMaskEq(i, eocBlock);
  826. unsigned char isOutBlock = ctMaskEq(i, lenBlock);
  827. for (j = 0; j < blockSz; j++, k++) {
  828. unsigned char atEoc = ctMaskEq(j, eocIndex) & isEocBlock;
  829. unsigned char pastEoc = ctMaskGT(j, eocIndex) & isEocBlock;
  830. unsigned char b = 0;
  831. if (k < WOLFSSL_TLS_HMAC_INNER_SZ)
  832. b = header[k];
  833. else if (k < maxLen)
  834. b = in[k - WOLFSSL_TLS_HMAC_INNER_SZ];
  835. b = ctMaskSel(atEoc, 0x80, b);
  836. b &= (unsigned char)~(word32)pastEoc;
  837. b &= ((unsigned char)~(word32)isOutBlock) | isEocBlock;
  838. if (j >= blockSz - 8) {
  839. b = ctMaskSel(isOutBlock, lenBytes[j - (blockSz - 8)], b);
  840. }
  841. hashBlock[j] = b;
  842. }
  843. ret = Hmac_HashUpdate(hmac, hashBlock, blockSz);
  844. if (ret != 0)
  845. return ret;
  846. ret = Hmac_HashFinalRaw(hmac, hashBlock);
  847. if (ret != 0)
  848. return ret;
  849. for (j = 0; j < macLen; j++)
  850. ((unsigned char*)hmac->innerHash)[j] |= hashBlock[j] & isOutBlock;
  851. }
  852. ret = Hmac_OuterHash(hmac, digest);
  853. return ret;
  854. }
  855. #endif
  856. #if defined(WOLFSSL_NO_HASH_RAW) || defined(HAVE_FIPS) || \
  857. defined(HAVE_SELFTEST) || defined(HAVE_BLAKE2)
  858. /* Calculate the HMAC of the header + message data.
  859. * Constant time implementation using normal hashing operations.
  860. * Update-Final need to be constant time.
  861. *
  862. * hmac HMAC object.
  863. * digest MAC result.
  864. * in Message data.
  865. * sz Size of the message data.
  866. * header Constructed record header with length of handshake data.
  867. * returns 0 on success, otherwise failure.
  868. */
  869. static int Hmac_UpdateFinal(Hmac* hmac, byte* digest, const byte* in,
  870. word32 sz, byte* header)
  871. {
  872. byte dummy[WC_MAX_BLOCK_SIZE] = {0};
  873. int ret;
  874. word32 msgSz, blockSz, macSz, padSz, maxSz, realSz;
  875. word32 currSz, offset = 0;
  876. int msgBlocks, blocks, blockBits;
  877. int i;
  878. switch (hmac->macType) {
  879. #ifndef NO_SHA
  880. case WC_SHA:
  881. blockSz = WC_SHA_BLOCK_SIZE;
  882. blockBits = 6;
  883. macSz = WC_SHA_DIGEST_SIZE;
  884. padSz = WC_SHA_BLOCK_SIZE - WC_SHA_PAD_SIZE + 1;
  885. break;
  886. #endif /* !NO_SHA */
  887. #ifndef NO_SHA256
  888. case WC_SHA256:
  889. blockSz = WC_SHA256_BLOCK_SIZE;
  890. blockBits = 6;
  891. macSz = WC_SHA256_DIGEST_SIZE;
  892. padSz = WC_SHA256_BLOCK_SIZE - WC_SHA256_PAD_SIZE + 1;
  893. break;
  894. #endif /* !NO_SHA256 */
  895. #ifdef WOLFSSL_SHA384
  896. case WC_SHA384:
  897. blockSz = WC_SHA384_BLOCK_SIZE;
  898. blockBits = 7;
  899. macSz = WC_SHA384_DIGEST_SIZE;
  900. padSz = WC_SHA384_BLOCK_SIZE - WC_SHA384_PAD_SIZE + 1;
  901. break;
  902. #endif /* WOLFSSL_SHA384 */
  903. #ifdef WOLFSSL_SHA512
  904. case WC_SHA512:
  905. blockSz = WC_SHA512_BLOCK_SIZE;
  906. blockBits = 7;
  907. macSz = WC_SHA512_DIGEST_SIZE;
  908. padSz = WC_SHA512_BLOCK_SIZE - WC_SHA512_PAD_SIZE + 1;
  909. break;
  910. #endif /* WOLFSSL_SHA512 */
  911. #ifdef HAVE_BLAKE2
  912. case WC_HASH_TYPE_BLAKE2B:
  913. blockSz = BLAKE2B_BLOCKBYTES;
  914. blockBits = 7;
  915. macSz = BLAKE2B_256;
  916. padSz = 0;
  917. break;
  918. #endif /* HAVE_BLAK2 */
  919. default:
  920. return BAD_FUNC_ARG;
  921. }
  922. msgSz = sz - (1 + in[sz - 1] + macSz);
  923. /* Make negative result 0 */
  924. msgSz &= ~(0 - (msgSz >> 31));
  925. realSz = WOLFSSL_TLS_HMAC_INNER_SZ + msgSz;
  926. maxSz = WOLFSSL_TLS_HMAC_INNER_SZ + (sz - 1) - macSz;
  927. /* Calculate #blocks processed in HMAC for max and real data. */
  928. blocks = maxSz >> blockBits;
  929. blocks += ((maxSz + padSz) % blockSz) < padSz;
  930. msgBlocks = realSz >> blockBits;
  931. /* #Extra blocks to process. */
  932. blocks -= msgBlocks + (((realSz + padSz) % blockSz) < padSz);
  933. /* Calculate whole blocks. */
  934. msgBlocks--;
  935. ret = wc_HmacUpdate(hmac, header, WOLFSSL_TLS_HMAC_INNER_SZ);
  936. if (ret == 0) {
  937. /* Fill the rest of the block with any available data. */
  938. currSz = ctMaskLT(msgSz, blockSz) & msgSz;
  939. currSz |= ctMaskGTE(msgSz, blockSz) & blockSz;
  940. currSz -= WOLFSSL_TLS_HMAC_INNER_SZ;
  941. currSz &= ~(0 - (currSz >> 31));
  942. ret = wc_HmacUpdate(hmac, in, currSz);
  943. offset = currSz;
  944. }
  945. if (ret == 0) {
  946. /* Do the hash operations on a block basis. */
  947. for (i = 0; i < msgBlocks; i++, offset += blockSz) {
  948. ret = wc_HmacUpdate(hmac, in + offset, blockSz);
  949. if (ret != 0)
  950. break;
  951. }
  952. }
  953. if (ret == 0)
  954. ret = wc_HmacUpdate(hmac, in + offset, msgSz - offset);
  955. if (ret == 0)
  956. ret = wc_HmacFinal(hmac, digest);
  957. if (ret == 0) {
  958. /* Do the dummy hash operations. Do at least one. */
  959. for (i = 0; i < blocks + 1; i++) {
  960. ret = wc_HmacUpdate(hmac, dummy, blockSz);
  961. if (ret != 0)
  962. break;
  963. }
  964. }
  965. return ret;
  966. }
  967. #endif
  968. int TLS_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz, int padSz,
  969. int content, int verify, int epochOrder)
  970. {
  971. Hmac hmac;
  972. byte myInner[WOLFSSL_TLS_HMAC_INNER_SZ];
  973. int ret = 0;
  974. const byte* macSecret = NULL;
  975. word32 hashSz = 0;
  976. if (ssl == NULL)
  977. return BAD_FUNC_ARG;
  978. #ifdef HAVE_TRUNCATED_HMAC
  979. hashSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  980. : ssl->specs.hash_size;
  981. #else
  982. hashSz = ssl->specs.hash_size;
  983. #endif
  984. #ifdef HAVE_FUZZER
  985. /* Fuzz "in" buffer with sz to be used in HMAC algorithm */
  986. if (ssl->fuzzerCb) {
  987. if (verify && padSz >= 0) {
  988. ssl->fuzzerCb(ssl, in, sz + hashSz + padSz + 1, FUZZ_HMAC,
  989. ssl->fuzzerCtx);
  990. }
  991. else {
  992. ssl->fuzzerCb(ssl, in, sz, FUZZ_HMAC, ssl->fuzzerCtx);
  993. }
  994. }
  995. #endif
  996. if (!ssl->options.dtls)
  997. wolfSSL_SetTlsHmacInner(ssl, myInner, sz, content, verify);
  998. else
  999. wolfSSL_SetTlsHmacInner(ssl, myInner, sz, content, epochOrder);
  1000. #if defined(WOLFSSL_RENESAS_TSIP_TLS) && \
  1001. !defined(NO_WOLFSSL_RENESAS_TSIP_TLS_SESSION)
  1002. if (tsip_useable(ssl)) {
  1003. if (ssl->specs.hash_size == WC_SHA_DIGEST_SIZE)
  1004. ret = tsip_Sha1Hmac(ssl, myInner, WOLFSSL_TLS_HMAC_INNER_SZ,
  1005. in, sz, digest, verify);
  1006. else if (ssl->specs.hash_size == WC_SHA256_DIGEST_SIZE)
  1007. ret = tsip_Sha256Hmac(ssl, myInner, WOLFSSL_TLS_HMAC_INNER_SZ,
  1008. in, sz, digest, verify);
  1009. else
  1010. ret = TSIP_MAC_DIGSZ_E;
  1011. return ret;
  1012. }
  1013. #endif
  1014. ret = wc_HmacInit(&hmac, ssl->heap, ssl->devId);
  1015. if (ret != 0)
  1016. return ret;
  1017. #ifdef WOLFSSL_DTLS
  1018. if (ssl->options.dtls)
  1019. macSecret = wolfSSL_GetDtlsMacSecret(ssl, verify, epochOrder);
  1020. else
  1021. macSecret = wolfSSL_GetMacSecret(ssl, verify);
  1022. #else
  1023. macSecret = wolfSSL_GetMacSecret(ssl, verify);
  1024. #endif
  1025. ret = wc_HmacSetKey(&hmac, wolfSSL_GetHmacType(ssl),
  1026. macSecret,
  1027. ssl->specs.hash_size);
  1028. if (ret == 0) {
  1029. /* Constant time verification required. */
  1030. if (verify && padSz >= 0) {
  1031. #if !defined(WOLFSSL_NO_HASH_RAW) && !defined(HAVE_FIPS) && \
  1032. !defined(HAVE_SELFTEST)
  1033. #ifdef HAVE_BLAKE2
  1034. if (wolfSSL_GetHmacType(ssl) == WC_HASH_TYPE_BLAKE2B) {
  1035. ret = Hmac_UpdateFinal(&hmac, digest, in,
  1036. sz + hashSz + padSz + 1, myInner);
  1037. }
  1038. else
  1039. #endif
  1040. {
  1041. ret = Hmac_UpdateFinal_CT(&hmac, digest, in,
  1042. sz + hashSz + padSz + 1, myInner);
  1043. }
  1044. #else
  1045. ret = Hmac_UpdateFinal(&hmac, digest, in, sz + hashSz + padSz + 1,
  1046. myInner);
  1047. #endif
  1048. }
  1049. else {
  1050. ret = wc_HmacUpdate(&hmac, myInner, sizeof(myInner));
  1051. if (ret == 0)
  1052. ret = wc_HmacUpdate(&hmac, in, sz); /* content */
  1053. if (ret == 0)
  1054. ret = wc_HmacFinal(&hmac, digest);
  1055. }
  1056. }
  1057. wc_HmacFree(&hmac);
  1058. return ret;
  1059. }
  1060. #endif /* WOLFSSL_AEAD_ONLY */
  1061. #endif /* !WOLFSSL_NO_TLS12 */
  1062. #ifdef HAVE_TLS_EXTENSIONS
  1063. /**
  1064. * The TLSX semaphore is used to calculate the size of the extensions to be sent
  1065. * from one peer to another.
  1066. */
  1067. /** Supports up to 64 flags. Increase as needed. */
  1068. #define SEMAPHORE_SIZE 8
  1069. /**
  1070. * Converts the extension type (id) to an index in the semaphore.
  1071. *
  1072. * Official reference for TLS extension types:
  1073. * http://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xml
  1074. *
  1075. * Motivation:
  1076. * Previously, we used the extension type itself as the index of that
  1077. * extension in the semaphore as the extension types were declared
  1078. * sequentially, but maintain a semaphore as big as the number of available
  1079. * extensions is no longer an option since the release of renegotiation_info.
  1080. *
  1081. * How to update:
  1082. * Assign extension types that extrapolate the number of available semaphores
  1083. * to the first available index going backwards in the semaphore array.
  1084. * When adding a new extension type that don't extrapolate the number of
  1085. * available semaphores, check for a possible collision with with a
  1086. * 'remapped' extension type.
  1087. */
  1088. static WC_INLINE word16 TLSX_ToSemaphore(word16 type)
  1089. {
  1090. switch (type) {
  1091. case TLSX_RENEGOTIATION_INFO: /* 0xFF01 */
  1092. return 63;
  1093. default:
  1094. if (type > 62) {
  1095. /* This message SHOULD only happens during the adding of
  1096. new TLS extensions in which its IANA number overflows
  1097. the current semaphore's range, or if its number already
  1098. is assigned to be used by another extension.
  1099. Use this check value for the new extension and decrement
  1100. the check value by one. */
  1101. WOLFSSL_MSG("### TLSX semaphore collision or overflow detected!");
  1102. }
  1103. }
  1104. return type;
  1105. }
  1106. /** Checks if a specific light (tls extension) is not set in the semaphore. */
  1107. #define IS_OFF(semaphore, light) \
  1108. (!(((semaphore)[(light) / 8] & (byte) (0x01 << ((light) % 8)))))
  1109. /** Turn on a specific light (tls extension) in the semaphore. */
  1110. /* the semaphore marks the extensions already written to the message */
  1111. #define TURN_ON(semaphore, light) \
  1112. ((semaphore)[(light) / 8] |= (byte) (0x01 << ((light) % 8)))
  1113. /** Turn off a specific light (tls extension) in the semaphore. */
  1114. #define TURN_OFF(semaphore, light) \
  1115. ((semaphore)[(light) / 8] &= (byte) ~(0x01 << ((light) % 8)))
  1116. /** Creates a new extension. */
  1117. static TLSX* TLSX_New(TLSX_Type type, void* data, void* heap)
  1118. {
  1119. TLSX* extension = (TLSX*)XMALLOC(sizeof(TLSX), heap, DYNAMIC_TYPE_TLSX);
  1120. (void)heap;
  1121. if (extension) {
  1122. extension->type = type;
  1123. extension->data = data;
  1124. extension->resp = 0;
  1125. extension->next = NULL;
  1126. }
  1127. return extension;
  1128. }
  1129. /**
  1130. * Creates a new extension and pushes it to the provided list.
  1131. * Checks for duplicate extensions, keeps the newest.
  1132. */
  1133. static int TLSX_Push(TLSX** list, TLSX_Type type, void* data, void* heap)
  1134. {
  1135. TLSX* extension = TLSX_New(type, data, heap);
  1136. if (extension == NULL)
  1137. return MEMORY_E;
  1138. /* pushes the new extension on the list. */
  1139. extension->next = *list;
  1140. *list = extension;
  1141. /* remove duplicate extensions, there should be only one of each type. */
  1142. do {
  1143. if (extension->next && extension->next->type == type) {
  1144. TLSX *next = extension->next;
  1145. extension->next = next->next;
  1146. next->next = NULL;
  1147. TLSX_FreeAll(next, heap);
  1148. /* there is no way to occur more than
  1149. * two extensions of the same type.
  1150. */
  1151. break;
  1152. }
  1153. } while ((extension = extension->next));
  1154. return 0;
  1155. }
  1156. #ifdef WOLFSSL_TLS13
  1157. /**
  1158. * Creates a new extension and prepend it to the provided list.
  1159. * Checks for duplicate extensions, keeps the newest.
  1160. */
  1161. static int TLSX_Prepend(TLSX** list, TLSX_Type type, void* data, void* heap)
  1162. {
  1163. TLSX* extension = TLSX_New(type, data, heap);
  1164. TLSX* curr = *list;
  1165. if (extension == NULL)
  1166. return MEMORY_E;
  1167. /* remove duplicate extensions, there should be only one of each type. */
  1168. while (curr && curr->next) {
  1169. if (curr->next->type == type) {
  1170. TLSX *next = curr->next;
  1171. curr->next = next->next;
  1172. next->next = NULL;
  1173. TLSX_FreeAll(next, heap);
  1174. }
  1175. curr = curr->next;
  1176. }
  1177. if (curr)
  1178. curr->next = extension;
  1179. else
  1180. *list = extension;
  1181. return 0;
  1182. }
  1183. #endif /* WOLFSSL_TLS13 */
  1184. #ifndef NO_WOLFSSL_CLIENT
  1185. int TLSX_CheckUnsupportedExtension(WOLFSSL* ssl, TLSX_Type type);
  1186. int TLSX_CheckUnsupportedExtension(WOLFSSL* ssl, TLSX_Type type)
  1187. {
  1188. TLSX *extension = TLSX_Find(ssl->extensions, type);
  1189. if (!extension)
  1190. extension = TLSX_Find(ssl->ctx->extensions, type);
  1191. return extension == NULL;
  1192. }
  1193. int TLSX_HandleUnsupportedExtension(WOLFSSL* ssl);
  1194. int TLSX_HandleUnsupportedExtension(WOLFSSL* ssl)
  1195. {
  1196. SendAlert(ssl, alert_fatal, unsupported_extension);
  1197. return UNSUPPORTED_EXTENSION;
  1198. }
  1199. #else
  1200. #define TLSX_CheckUnsupportedExtension(ssl, type) 0
  1201. #define TLSX_HandleUnsupportedExtension(ssl) 0
  1202. #endif
  1203. /** Mark an extension to be sent back to the client. */
  1204. void TLSX_SetResponse(WOLFSSL* ssl, TLSX_Type type);
  1205. void TLSX_SetResponse(WOLFSSL* ssl, TLSX_Type type)
  1206. {
  1207. TLSX *extension = TLSX_Find(ssl->extensions, type);
  1208. if (extension)
  1209. extension->resp = 1;
  1210. }
  1211. /******************************************************************************/
  1212. /* Application-Layer Protocol Negotiation */
  1213. /******************************************************************************/
  1214. #ifdef HAVE_ALPN
  1215. /** Creates a new ALPN object, providing protocol name to use. */
  1216. static ALPN* TLSX_ALPN_New(char *protocol_name, word16 protocol_nameSz,
  1217. void* heap)
  1218. {
  1219. ALPN *alpn;
  1220. WOLFSSL_ENTER("TLSX_ALPN_New");
  1221. if (protocol_name == NULL ||
  1222. protocol_nameSz > WOLFSSL_MAX_ALPN_PROTO_NAME_LEN) {
  1223. WOLFSSL_MSG("Invalid arguments");
  1224. return NULL;
  1225. }
  1226. alpn = (ALPN*)XMALLOC(sizeof(ALPN), heap, DYNAMIC_TYPE_TLSX);
  1227. if (alpn == NULL) {
  1228. WOLFSSL_MSG("Memory failure");
  1229. return NULL;
  1230. }
  1231. alpn->next = NULL;
  1232. alpn->negotiated = 0;
  1233. alpn->options = 0;
  1234. alpn->protocol_name = (char*)XMALLOC(protocol_nameSz + 1,
  1235. heap, DYNAMIC_TYPE_TLSX);
  1236. if (alpn->protocol_name == NULL) {
  1237. WOLFSSL_MSG("Memory failure");
  1238. XFREE(alpn, heap, DYNAMIC_TYPE_TLSX);
  1239. return NULL;
  1240. }
  1241. XMEMCPY(alpn->protocol_name, protocol_name, protocol_nameSz);
  1242. alpn->protocol_name[protocol_nameSz] = 0;
  1243. (void)heap;
  1244. return alpn;
  1245. }
  1246. /** Releases an ALPN object. */
  1247. static void TLSX_ALPN_Free(ALPN *alpn, void* heap)
  1248. {
  1249. (void)heap;
  1250. if (alpn == NULL)
  1251. return;
  1252. XFREE(alpn->protocol_name, heap, DYNAMIC_TYPE_TLSX);
  1253. XFREE(alpn, heap, DYNAMIC_TYPE_TLSX);
  1254. }
  1255. /** Releases all ALPN objects in the provided list. */
  1256. static void TLSX_ALPN_FreeAll(ALPN *list, void* heap)
  1257. {
  1258. ALPN* alpn;
  1259. while ((alpn = list)) {
  1260. list = alpn->next;
  1261. TLSX_ALPN_Free(alpn, heap);
  1262. }
  1263. }
  1264. /** Tells the buffered size of the ALPN objects in a list. */
  1265. static word16 TLSX_ALPN_GetSize(ALPN *list)
  1266. {
  1267. ALPN* alpn;
  1268. word16 length = OPAQUE16_LEN; /* list length */
  1269. while ((alpn = list)) {
  1270. list = alpn->next;
  1271. length++; /* protocol name length is on one byte */
  1272. length += (word16)XSTRLEN(alpn->protocol_name);
  1273. }
  1274. return length;
  1275. }
  1276. /** Writes the ALPN objects of a list in a buffer. */
  1277. static word16 TLSX_ALPN_Write(ALPN *list, byte *output)
  1278. {
  1279. ALPN* alpn;
  1280. word16 length = 0;
  1281. word16 offset = OPAQUE16_LEN; /* list length offset */
  1282. while ((alpn = list)) {
  1283. list = alpn->next;
  1284. length = (word16)XSTRLEN(alpn->protocol_name);
  1285. /* protocol name length */
  1286. output[offset++] = (byte)length;
  1287. /* protocol name value */
  1288. XMEMCPY(output + offset, alpn->protocol_name, length);
  1289. offset += length;
  1290. }
  1291. /* writing list length */
  1292. c16toa(offset - OPAQUE16_LEN, output);
  1293. return offset;
  1294. }
  1295. /** Finds a protocol name in the provided ALPN list */
  1296. static ALPN* TLSX_ALPN_Find(ALPN *list, char *protocol_name, word16 size)
  1297. {
  1298. ALPN *alpn;
  1299. if (list == NULL || protocol_name == NULL)
  1300. return NULL;
  1301. alpn = list;
  1302. while (alpn != NULL && (
  1303. (word16)XSTRLEN(alpn->protocol_name) != size ||
  1304. XSTRNCMP(alpn->protocol_name, protocol_name, size)))
  1305. alpn = alpn->next;
  1306. return alpn;
  1307. }
  1308. /** Set the ALPN matching client and server requirements */
  1309. static int TLSX_SetALPN(TLSX** extensions, const void* data, word16 size,
  1310. void* heap)
  1311. {
  1312. ALPN *alpn;
  1313. int ret;
  1314. if (extensions == NULL || data == NULL)
  1315. return BAD_FUNC_ARG;
  1316. alpn = TLSX_ALPN_New((char *)data, size, heap);
  1317. if (alpn == NULL) {
  1318. WOLFSSL_MSG("Memory failure");
  1319. return MEMORY_E;
  1320. }
  1321. alpn->negotiated = 1;
  1322. ret = TLSX_Push(extensions, TLSX_APPLICATION_LAYER_PROTOCOL, (void*)alpn,
  1323. heap);
  1324. if (ret != 0) {
  1325. TLSX_ALPN_Free(alpn, heap);
  1326. return ret;
  1327. }
  1328. return WOLFSSL_SUCCESS;
  1329. }
  1330. /** Parses a buffer of ALPN extensions and set the first one matching
  1331. * client and server requirements */
  1332. static int TLSX_ALPN_ParseAndSet(WOLFSSL *ssl, byte *input, word16 length,
  1333. byte isRequest)
  1334. {
  1335. word16 size = 0, offset = 0, idx = 0;
  1336. int r = BUFFER_ERROR;
  1337. byte match = 0;
  1338. TLSX *extension;
  1339. ALPN *alpn = NULL, *list;
  1340. if (OPAQUE16_LEN > length)
  1341. return BUFFER_ERROR;
  1342. ato16(input, &size);
  1343. offset += OPAQUE16_LEN;
  1344. if (size == 0)
  1345. return BUFFER_ERROR;
  1346. extension = TLSX_Find(ssl->extensions, TLSX_APPLICATION_LAYER_PROTOCOL);
  1347. if (extension == NULL)
  1348. extension = TLSX_Find(ssl->ctx->extensions,
  1349. TLSX_APPLICATION_LAYER_PROTOCOL);
  1350. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  1351. if (ssl->alpnSelect != NULL) {
  1352. const byte* out;
  1353. unsigned char outLen;
  1354. if (ssl->alpnSelect(ssl, &out, &outLen, input + offset, size,
  1355. ssl->alpnSelectArg) == 0) {
  1356. WOLFSSL_MSG("ALPN protocol match");
  1357. if (TLSX_UseALPN(&ssl->extensions, (char*)out, outLen, 0, ssl->heap)
  1358. == WOLFSSL_SUCCESS) {
  1359. if (extension == NULL) {
  1360. extension = TLSX_Find(ssl->extensions,
  1361. TLSX_APPLICATION_LAYER_PROTOCOL);
  1362. }
  1363. }
  1364. }
  1365. }
  1366. #endif
  1367. if (extension == NULL || extension->data == NULL) {
  1368. return isRequest ? 0
  1369. : TLSX_HandleUnsupportedExtension(ssl);
  1370. }
  1371. /* validating alpn list length */
  1372. if (length != OPAQUE16_LEN + size)
  1373. return BUFFER_ERROR;
  1374. list = (ALPN*)extension->data;
  1375. /* keep the list sent by client */
  1376. if (isRequest) {
  1377. if (ssl->alpn_client_list != NULL)
  1378. XFREE(ssl->alpn_client_list, ssl->heap, DYNAMIC_TYPE_ALPN);
  1379. ssl->alpn_client_list = (char *)XMALLOC(size, ssl->heap,
  1380. DYNAMIC_TYPE_ALPN);
  1381. if (ssl->alpn_client_list == NULL)
  1382. return MEMORY_ERROR;
  1383. }
  1384. for (size = 0; offset < length; offset += size) {
  1385. size = input[offset++];
  1386. if (offset + size > length || size == 0)
  1387. return BUFFER_ERROR;
  1388. if (isRequest) {
  1389. XMEMCPY(ssl->alpn_client_list+idx, (char*)input + offset, size);
  1390. idx += size;
  1391. ssl->alpn_client_list[idx++] = ',';
  1392. }
  1393. if (!match) {
  1394. alpn = TLSX_ALPN_Find(list, (char*)input + offset, size);
  1395. if (alpn != NULL) {
  1396. WOLFSSL_MSG("ALPN protocol match");
  1397. match = 1;
  1398. /* skip reading other values if not required */
  1399. if (!isRequest)
  1400. break;
  1401. }
  1402. }
  1403. }
  1404. if (isRequest)
  1405. ssl->alpn_client_list[idx-1] = 0;
  1406. if (!match) {
  1407. WOLFSSL_MSG("No ALPN protocol match");
  1408. /* do nothing if no protocol match between client and server and option
  1409. is set to continue (like OpenSSL) */
  1410. if (list->options & WOLFSSL_ALPN_CONTINUE_ON_MISMATCH) {
  1411. WOLFSSL_MSG("Continue on mismatch");
  1412. return 0;
  1413. }
  1414. SendAlert(ssl, alert_fatal, no_application_protocol);
  1415. return UNKNOWN_ALPN_PROTOCOL_NAME_E;
  1416. }
  1417. /* set the matching negotiated protocol */
  1418. r = TLSX_SetALPN(&ssl->extensions,
  1419. alpn->protocol_name,
  1420. (word16)XSTRLEN(alpn->protocol_name),
  1421. ssl->heap);
  1422. if (r != WOLFSSL_SUCCESS) {
  1423. WOLFSSL_MSG("TLSX_UseALPN failed");
  1424. return BUFFER_ERROR;
  1425. }
  1426. /* reply to ALPN extension sent from client */
  1427. if (isRequest) {
  1428. #ifndef NO_WOLFSSL_SERVER
  1429. TLSX_SetResponse(ssl, TLSX_APPLICATION_LAYER_PROTOCOL);
  1430. #endif
  1431. }
  1432. return 0;
  1433. }
  1434. /** Add a protocol name to the list of accepted usable ones */
  1435. int TLSX_UseALPN(TLSX** extensions, const void* data, word16 size, byte options,
  1436. void* heap)
  1437. {
  1438. ALPN *alpn;
  1439. TLSX *extension;
  1440. int ret;
  1441. if (extensions == NULL || data == NULL)
  1442. return BAD_FUNC_ARG;
  1443. alpn = TLSX_ALPN_New((char *)data, size, heap);
  1444. if (alpn == NULL) {
  1445. WOLFSSL_MSG("Memory failure");
  1446. return MEMORY_E;
  1447. }
  1448. /* Set Options of ALPN */
  1449. alpn->options = options;
  1450. extension = TLSX_Find(*extensions, TLSX_APPLICATION_LAYER_PROTOCOL);
  1451. if (extension == NULL) {
  1452. ret = TLSX_Push(extensions, TLSX_APPLICATION_LAYER_PROTOCOL,
  1453. (void*)alpn, heap);
  1454. if (ret != 0) {
  1455. TLSX_ALPN_Free(alpn, heap);
  1456. return ret;
  1457. }
  1458. }
  1459. else {
  1460. /* push new ALPN object to extension data. */
  1461. alpn->next = (ALPN*)extension->data;
  1462. extension->data = (void*)alpn;
  1463. }
  1464. return WOLFSSL_SUCCESS;
  1465. }
  1466. /** Get the protocol name set by the server */
  1467. int TLSX_ALPN_GetRequest(TLSX* extensions, void** data, word16 *dataSz)
  1468. {
  1469. TLSX *extension;
  1470. ALPN *alpn;
  1471. if (extensions == NULL || data == NULL || dataSz == NULL)
  1472. return BAD_FUNC_ARG;
  1473. extension = TLSX_Find(extensions, TLSX_APPLICATION_LAYER_PROTOCOL);
  1474. if (extension == NULL) {
  1475. WOLFSSL_MSG("TLS extension not found");
  1476. return WOLFSSL_ALPN_NOT_FOUND;
  1477. }
  1478. alpn = (ALPN *)extension->data;
  1479. if (alpn == NULL) {
  1480. WOLFSSL_MSG("ALPN extension not found");
  1481. *data = NULL;
  1482. *dataSz = 0;
  1483. return WOLFSSL_FATAL_ERROR;
  1484. }
  1485. if (alpn->negotiated != 1) {
  1486. /* consider as an error */
  1487. if (alpn->options & WOLFSSL_ALPN_FAILED_ON_MISMATCH) {
  1488. WOLFSSL_MSG("No protocol match with peer -> Failed");
  1489. return WOLFSSL_FATAL_ERROR;
  1490. }
  1491. /* continue without negotiated protocol */
  1492. WOLFSSL_MSG("No protocol match with peer -> Continue");
  1493. return WOLFSSL_ALPN_NOT_FOUND;
  1494. }
  1495. if (alpn->next != NULL) {
  1496. WOLFSSL_MSG("Only one protocol name must be accepted");
  1497. return WOLFSSL_FATAL_ERROR;
  1498. }
  1499. *data = alpn->protocol_name;
  1500. *dataSz = (word16)XSTRLEN((char*)*data);
  1501. return WOLFSSL_SUCCESS;
  1502. }
  1503. #define ALPN_FREE_ALL TLSX_ALPN_FreeAll
  1504. #define ALPN_GET_SIZE TLSX_ALPN_GetSize
  1505. #define ALPN_WRITE TLSX_ALPN_Write
  1506. #define ALPN_PARSE TLSX_ALPN_ParseAndSet
  1507. #else /* HAVE_ALPN */
  1508. #define ALPN_FREE_ALL(list, heap)
  1509. #define ALPN_GET_SIZE(list) 0
  1510. #define ALPN_WRITE(a, b) 0
  1511. #define ALPN_PARSE(a, b, c, d) 0
  1512. #endif /* HAVE_ALPN */
  1513. /******************************************************************************/
  1514. /* Server Name Indication */
  1515. /******************************************************************************/
  1516. #ifdef HAVE_SNI
  1517. /** Creates a new SNI object. */
  1518. static SNI* TLSX_SNI_New(byte type, const void* data, word16 size, void* heap)
  1519. {
  1520. SNI* sni = (SNI*)XMALLOC(sizeof(SNI), heap, DYNAMIC_TYPE_TLSX);
  1521. (void)heap;
  1522. if (sni) {
  1523. sni->type = type;
  1524. sni->next = NULL;
  1525. #ifndef NO_WOLFSSL_SERVER
  1526. sni->options = 0;
  1527. sni->status = WOLFSSL_SNI_NO_MATCH;
  1528. #endif
  1529. switch (sni->type) {
  1530. case WOLFSSL_SNI_HOST_NAME:
  1531. sni->data.host_name = (char*)XMALLOC(size + 1, heap,
  1532. DYNAMIC_TYPE_TLSX);
  1533. if (sni->data.host_name) {
  1534. XSTRNCPY(sni->data.host_name, (const char*)data, size);
  1535. sni->data.host_name[size] = '\0';
  1536. } else {
  1537. XFREE(sni, heap, DYNAMIC_TYPE_TLSX);
  1538. sni = NULL;
  1539. }
  1540. break;
  1541. default: /* invalid type */
  1542. XFREE(sni, heap, DYNAMIC_TYPE_TLSX);
  1543. sni = NULL;
  1544. }
  1545. }
  1546. return sni;
  1547. }
  1548. /** Releases a SNI object. */
  1549. static void TLSX_SNI_Free(SNI* sni, void* heap)
  1550. {
  1551. if (sni) {
  1552. switch (sni->type) {
  1553. case WOLFSSL_SNI_HOST_NAME:
  1554. XFREE(sni->data.host_name, heap, DYNAMIC_TYPE_TLSX);
  1555. break;
  1556. }
  1557. XFREE(sni, heap, DYNAMIC_TYPE_TLSX);
  1558. }
  1559. (void)heap;
  1560. }
  1561. /** Releases all SNI objects in the provided list. */
  1562. static void TLSX_SNI_FreeAll(SNI* list, void* heap)
  1563. {
  1564. SNI* sni;
  1565. while ((sni = list)) {
  1566. list = sni->next;
  1567. TLSX_SNI_Free(sni, heap);
  1568. }
  1569. }
  1570. /** Tells the buffered size of the SNI objects in a list. */
  1571. static word16 TLSX_SNI_GetSize(SNI* list)
  1572. {
  1573. SNI* sni;
  1574. word16 length = OPAQUE16_LEN; /* list length */
  1575. while ((sni = list)) {
  1576. list = sni->next;
  1577. length += ENUM_LEN + OPAQUE16_LEN; /* sni type + sni length */
  1578. switch (sni->type) {
  1579. case WOLFSSL_SNI_HOST_NAME:
  1580. length += (word16)XSTRLEN((char*)sni->data.host_name);
  1581. break;
  1582. }
  1583. }
  1584. return length;
  1585. }
  1586. /** Writes the SNI objects of a list in a buffer. */
  1587. static word16 TLSX_SNI_Write(SNI* list, byte* output)
  1588. {
  1589. SNI* sni;
  1590. word16 length = 0;
  1591. word16 offset = OPAQUE16_LEN; /* list length offset */
  1592. while ((sni = list)) {
  1593. list = sni->next;
  1594. output[offset++] = sni->type; /* sni type */
  1595. switch (sni->type) {
  1596. case WOLFSSL_SNI_HOST_NAME:
  1597. length = (word16)XSTRLEN((char*)sni->data.host_name);
  1598. c16toa(length, output + offset); /* sni length */
  1599. offset += OPAQUE16_LEN;
  1600. XMEMCPY(output + offset, sni->data.host_name, length);
  1601. offset += length;
  1602. break;
  1603. }
  1604. }
  1605. c16toa(offset - OPAQUE16_LEN, output); /* writing list length */
  1606. return offset;
  1607. }
  1608. /** Finds a SNI object in the provided list. */
  1609. static SNI* TLSX_SNI_Find(SNI *list, byte type)
  1610. {
  1611. SNI* sni = list;
  1612. while (sni && sni->type != type)
  1613. sni = sni->next;
  1614. return sni;
  1615. }
  1616. /** Sets the status of a SNI object. */
  1617. static void TLSX_SNI_SetStatus(TLSX* extensions, byte type, byte status)
  1618. {
  1619. TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
  1620. SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
  1621. if (sni)
  1622. sni->status = status;
  1623. }
  1624. /** Gets the status of a SNI object. */
  1625. byte TLSX_SNI_Status(TLSX* extensions, byte type)
  1626. {
  1627. TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
  1628. SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
  1629. if (sni)
  1630. return sni->status;
  1631. return 0;
  1632. }
  1633. /** Parses a buffer of SNI extensions. */
  1634. static int TLSX_SNI_Parse(WOLFSSL* ssl, byte* input, word16 length,
  1635. byte isRequest)
  1636. {
  1637. #ifndef NO_WOLFSSL_SERVER
  1638. word16 size = 0;
  1639. word16 offset = 0;
  1640. int cacheOnly = 0;
  1641. SNI *sni = NULL;
  1642. byte type;
  1643. int matchStat;
  1644. byte matched;
  1645. #endif
  1646. TLSX *extension = TLSX_Find(ssl->extensions, TLSX_SERVER_NAME);
  1647. if (!extension)
  1648. extension = TLSX_Find(ssl->ctx->extensions, TLSX_SERVER_NAME);
  1649. if (!isRequest) {
  1650. #ifndef NO_WOLFSSL_CLIENT
  1651. if (!extension || !extension->data)
  1652. return TLSX_HandleUnsupportedExtension(ssl);
  1653. if (length > 0)
  1654. return BUFFER_ERROR; /* SNI response MUST be empty. */
  1655. /* This call enables wolfSSL_SNI_GetRequest() to be called in the
  1656. * client side to fetch the used SNI. It will only work if the SNI
  1657. * was set at the SSL object level. Right now we only support one
  1658. * name type, WOLFSSL_SNI_HOST_NAME, but in the future, the
  1659. * inclusion of other name types will turn this method inaccurate,
  1660. * as the extension response doesn't contains information of which
  1661. * name was accepted.
  1662. */
  1663. TLSX_SNI_SetStatus(ssl->extensions, WOLFSSL_SNI_HOST_NAME,
  1664. WOLFSSL_SNI_REAL_MATCH);
  1665. return 0;
  1666. #endif
  1667. }
  1668. #ifndef NO_WOLFSSL_SERVER
  1669. if (!extension || !extension->data) {
  1670. #if defined(WOLFSSL_ALWAYS_KEEP_SNI) && !defined(NO_WOLFSSL_SERVER)
  1671. /* This will keep SNI even though TLSX_UseSNI has not been called.
  1672. * Enable it so that the received sni is available to functions
  1673. * that use a custom callback when SNI is received.
  1674. */
  1675. cacheOnly = 1;
  1676. WOLFSSL_MSG("Forcing SSL object to store SNI parameter");
  1677. #else
  1678. /* Skipping, SNI not enabled at server side. */
  1679. return 0;
  1680. #endif
  1681. }
  1682. if (OPAQUE16_LEN > length)
  1683. return BUFFER_ERROR;
  1684. ato16(input, &size);
  1685. offset += OPAQUE16_LEN;
  1686. /* validating sni list length */
  1687. if (length != OPAQUE16_LEN + size || size == 0)
  1688. return BUFFER_ERROR;
  1689. /* SNI was badly specified and only one type is now recognized and allowed.
  1690. * Only one SNI value per type (RFC6066), so, no loop. */
  1691. type = input[offset++];
  1692. if (type != WOLFSSL_SNI_HOST_NAME)
  1693. return BUFFER_ERROR;
  1694. if (offset + OPAQUE16_LEN > length)
  1695. return BUFFER_ERROR;
  1696. ato16(input + offset, &size);
  1697. offset += OPAQUE16_LEN;
  1698. if (offset + size != length || size == 0)
  1699. return BUFFER_ERROR;
  1700. if (!cacheOnly && !(sni = TLSX_SNI_Find((SNI*)extension->data, type)))
  1701. return 0; /* not using this type of SNI. */
  1702. #ifdef WOLFSSL_TLS13
  1703. /* Don't process the second ClientHello SNI extension if there
  1704. * was problems with the first.
  1705. */
  1706. if (!cacheOnly && sni->status != 0)
  1707. return 0;
  1708. #endif
  1709. matched = cacheOnly || (XSTRLEN(sni->data.host_name) == size &&
  1710. XSTRNCMP(sni->data.host_name, (const char*)input + offset, size) == 0);
  1711. if (matched || sni->options & WOLFSSL_SNI_ANSWER_ON_MISMATCH) {
  1712. int r = TLSX_UseSNI(&ssl->extensions, type, input + offset, size,
  1713. ssl->heap);
  1714. if (r != WOLFSSL_SUCCESS)
  1715. return r; /* throws error. */
  1716. if (cacheOnly) {
  1717. WOLFSSL_MSG("Forcing storage of SNI, Fake match");
  1718. matchStat = WOLFSSL_SNI_FORCE_KEEP;
  1719. }
  1720. else if (matched) {
  1721. WOLFSSL_MSG("SNI did match!");
  1722. matchStat = WOLFSSL_SNI_REAL_MATCH;
  1723. }
  1724. else {
  1725. WOLFSSL_MSG("fake SNI match from ANSWER_ON_MISMATCH");
  1726. matchStat = WOLFSSL_SNI_FAKE_MATCH;
  1727. }
  1728. TLSX_SNI_SetStatus(ssl->extensions, type, (byte)matchStat);
  1729. if(!cacheOnly)
  1730. TLSX_SetResponse(ssl, TLSX_SERVER_NAME);
  1731. }
  1732. else if (!(sni->options & WOLFSSL_SNI_CONTINUE_ON_MISMATCH)) {
  1733. SendAlert(ssl, alert_fatal, unrecognized_name);
  1734. return UNKNOWN_SNI_HOST_NAME_E;
  1735. }
  1736. #else
  1737. (void)input;
  1738. #endif
  1739. return 0;
  1740. }
  1741. static int TLSX_SNI_VerifyParse(WOLFSSL* ssl, byte isRequest)
  1742. {
  1743. (void)ssl;
  1744. if (isRequest) {
  1745. #ifndef NO_WOLFSSL_SERVER
  1746. TLSX* ctx_ext = TLSX_Find(ssl->ctx->extensions, TLSX_SERVER_NAME);
  1747. TLSX* ssl_ext = TLSX_Find(ssl->extensions, TLSX_SERVER_NAME);
  1748. SNI* ctx_sni = ctx_ext ? (SNI*)ctx_ext->data : NULL;
  1749. SNI* ssl_sni = ssl_ext ? (SNI*)ssl_ext->data : NULL;
  1750. SNI* sni = NULL;
  1751. for (; ctx_sni; ctx_sni = ctx_sni->next) {
  1752. if (ctx_sni->options & WOLFSSL_SNI_ABORT_ON_ABSENCE) {
  1753. sni = TLSX_SNI_Find(ssl_sni, ctx_sni->type);
  1754. if (sni) {
  1755. if (sni->status != WOLFSSL_SNI_NO_MATCH)
  1756. continue;
  1757. /* if ssl level overrides ctx level, it is ok. */
  1758. if ((sni->options & WOLFSSL_SNI_ABORT_ON_ABSENCE) == 0)
  1759. continue;
  1760. }
  1761. SendAlert(ssl, alert_fatal, handshake_failure);
  1762. return SNI_ABSENT_ERROR;
  1763. }
  1764. }
  1765. for (; ssl_sni; ssl_sni = ssl_sni->next) {
  1766. if (ssl_sni->options & WOLFSSL_SNI_ABORT_ON_ABSENCE) {
  1767. if (ssl_sni->status != WOLFSSL_SNI_NO_MATCH)
  1768. continue;
  1769. SendAlert(ssl, alert_fatal, handshake_failure);
  1770. return SNI_ABSENT_ERROR;
  1771. }
  1772. }
  1773. #endif /* NO_WOLFSSL_SERVER */
  1774. }
  1775. return 0;
  1776. }
  1777. int TLSX_UseSNI(TLSX** extensions, byte type, const void* data, word16 size,
  1778. void* heap)
  1779. {
  1780. TLSX* extension;
  1781. SNI* sni = NULL;
  1782. if (extensions == NULL || data == NULL)
  1783. return BAD_FUNC_ARG;
  1784. if ((sni = TLSX_SNI_New(type, data, size, heap)) == NULL)
  1785. return MEMORY_E;
  1786. extension = TLSX_Find(*extensions, TLSX_SERVER_NAME);
  1787. if (!extension) {
  1788. int ret = TLSX_Push(extensions, TLSX_SERVER_NAME, (void*)sni, heap);
  1789. if (ret != 0) {
  1790. TLSX_SNI_Free(sni, heap);
  1791. return ret;
  1792. }
  1793. }
  1794. else {
  1795. /* push new SNI object to extension data. */
  1796. sni->next = (SNI*)extension->data;
  1797. extension->data = (void*)sni;
  1798. /* remove duplicate SNI, there should be only one of each type. */
  1799. do {
  1800. if (sni->next && sni->next->type == type) {
  1801. SNI* next = sni->next;
  1802. sni->next = next->next;
  1803. TLSX_SNI_Free(next, heap);
  1804. /* there is no way to occur more than
  1805. * two SNIs of the same type.
  1806. */
  1807. break;
  1808. }
  1809. } while ((sni = sni->next));
  1810. }
  1811. return WOLFSSL_SUCCESS;
  1812. }
  1813. #ifndef NO_WOLFSSL_SERVER
  1814. /** Tells the SNI requested by the client. */
  1815. word16 TLSX_SNI_GetRequest(TLSX* extensions, byte type, void** data)
  1816. {
  1817. TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
  1818. SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
  1819. if (sni && sni->status != WOLFSSL_SNI_NO_MATCH) {
  1820. switch (sni->type) {
  1821. case WOLFSSL_SNI_HOST_NAME:
  1822. if (data) {
  1823. *data = sni->data.host_name;
  1824. return (word16)XSTRLEN((char*)*data);
  1825. }
  1826. }
  1827. }
  1828. return 0;
  1829. }
  1830. /** Sets the options for a SNI object. */
  1831. void TLSX_SNI_SetOptions(TLSX* extensions, byte type, byte options)
  1832. {
  1833. TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
  1834. SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
  1835. if (sni)
  1836. sni->options = options;
  1837. }
  1838. /** Retrieves a SNI request from a client hello buffer. */
  1839. int TLSX_SNI_GetFromBuffer(const byte* clientHello, word32 helloSz,
  1840. byte type, byte* sni, word32* inOutSz)
  1841. {
  1842. word32 offset = 0;
  1843. word32 len32 = 0;
  1844. word16 len16 = 0;
  1845. if (helloSz < RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ + CLIENT_HELLO_FIRST)
  1846. return INCOMPLETE_DATA;
  1847. /* TLS record header */
  1848. if ((enum ContentType) clientHello[offset++] != handshake) {
  1849. /* checking for SSLv2.0 client hello according to: */
  1850. /* http://tools.ietf.org/html/rfc4346#appendix-E.1 */
  1851. if ((enum HandShakeType) clientHello[++offset] == client_hello) {
  1852. offset += ENUM_LEN + VERSION_SZ; /* skip version */
  1853. ato16(clientHello + offset, &len16);
  1854. offset += OPAQUE16_LEN;
  1855. if (len16 % 3) /* cipher_spec_length must be multiple of 3 */
  1856. return BUFFER_ERROR;
  1857. ato16(clientHello + offset, &len16);
  1858. /* Returning SNI_UNSUPPORTED do not increment offset here */
  1859. if (len16 != 0) /* session_id_length must be 0 */
  1860. return BUFFER_ERROR;
  1861. return SNI_UNSUPPORTED;
  1862. }
  1863. return BUFFER_ERROR;
  1864. }
  1865. if (clientHello[offset++] != SSLv3_MAJOR)
  1866. return BUFFER_ERROR;
  1867. if (clientHello[offset++] < TLSv1_MINOR)
  1868. return SNI_UNSUPPORTED;
  1869. ato16(clientHello + offset, &len16);
  1870. offset += OPAQUE16_LEN;
  1871. if (offset + len16 > helloSz)
  1872. return INCOMPLETE_DATA;
  1873. /* Handshake header */
  1874. if ((enum HandShakeType) clientHello[offset] != client_hello)
  1875. return BUFFER_ERROR;
  1876. c24to32(clientHello + offset + 1, &len32);
  1877. offset += HANDSHAKE_HEADER_SZ;
  1878. if (offset + len32 > helloSz)
  1879. return BUFFER_ERROR;
  1880. /* client hello */
  1881. offset += VERSION_SZ + RAN_LEN; /* version, random */
  1882. if (helloSz < offset + clientHello[offset])
  1883. return BUFFER_ERROR;
  1884. offset += ENUM_LEN + clientHello[offset]; /* skip session id */
  1885. /* cypher suites */
  1886. if (helloSz < offset + OPAQUE16_LEN)
  1887. return BUFFER_ERROR;
  1888. ato16(clientHello + offset, &len16);
  1889. offset += OPAQUE16_LEN;
  1890. if (helloSz < offset + len16)
  1891. return BUFFER_ERROR;
  1892. offset += len16; /* skip cypher suites */
  1893. /* compression methods */
  1894. if (helloSz < offset + 1)
  1895. return BUFFER_ERROR;
  1896. if (helloSz < offset + clientHello[offset])
  1897. return BUFFER_ERROR;
  1898. offset += ENUM_LEN + clientHello[offset]; /* skip compression methods */
  1899. /* extensions */
  1900. if (helloSz < offset + OPAQUE16_LEN)
  1901. return 0; /* no extensions in client hello. */
  1902. ato16(clientHello + offset, &len16);
  1903. offset += OPAQUE16_LEN;
  1904. if (helloSz < offset + len16)
  1905. return BUFFER_ERROR;
  1906. while (len16 >= OPAQUE16_LEN + OPAQUE16_LEN) {
  1907. word16 extType;
  1908. word16 extLen;
  1909. ato16(clientHello + offset, &extType);
  1910. offset += OPAQUE16_LEN;
  1911. ato16(clientHello + offset, &extLen);
  1912. offset += OPAQUE16_LEN;
  1913. if (helloSz < offset + extLen)
  1914. return BUFFER_ERROR;
  1915. if (extType != TLSX_SERVER_NAME) {
  1916. offset += extLen; /* skip extension */
  1917. } else {
  1918. word16 listLen;
  1919. ato16(clientHello + offset, &listLen);
  1920. offset += OPAQUE16_LEN;
  1921. if (helloSz < offset + listLen)
  1922. return BUFFER_ERROR;
  1923. while (listLen > ENUM_LEN + OPAQUE16_LEN) {
  1924. byte sniType = clientHello[offset++];
  1925. word16 sniLen;
  1926. ato16(clientHello + offset, &sniLen);
  1927. offset += OPAQUE16_LEN;
  1928. if (helloSz < offset + sniLen)
  1929. return BUFFER_ERROR;
  1930. if (sniType != type) {
  1931. offset += sniLen;
  1932. listLen -= min(ENUM_LEN + OPAQUE16_LEN + sniLen, listLen);
  1933. continue;
  1934. }
  1935. *inOutSz = min(sniLen, *inOutSz);
  1936. XMEMCPY(sni, clientHello + offset, *inOutSz);
  1937. return WOLFSSL_SUCCESS;
  1938. }
  1939. }
  1940. len16 -= min(2 * OPAQUE16_LEN + extLen, len16);
  1941. }
  1942. return len16 ? BUFFER_ERROR : 0;
  1943. }
  1944. #endif
  1945. #define SNI_FREE_ALL TLSX_SNI_FreeAll
  1946. #define SNI_GET_SIZE TLSX_SNI_GetSize
  1947. #define SNI_WRITE TLSX_SNI_Write
  1948. #define SNI_PARSE TLSX_SNI_Parse
  1949. #define SNI_VERIFY_PARSE TLSX_SNI_VerifyParse
  1950. #else
  1951. #define SNI_FREE_ALL(list, heap)
  1952. #define SNI_GET_SIZE(list) 0
  1953. #define SNI_WRITE(a, b) 0
  1954. #define SNI_PARSE(a, b, c, d) 0
  1955. #define SNI_VERIFY_PARSE(a, b) 0
  1956. #endif /* HAVE_SNI */
  1957. /******************************************************************************/
  1958. /* Trusted CA Key Indication */
  1959. /******************************************************************************/
  1960. #ifdef HAVE_TRUSTED_CA
  1961. /** Creates a new TCA object. */
  1962. static TCA* TLSX_TCA_New(byte type, const byte* id, word16 idSz, void* heap)
  1963. {
  1964. TCA* tca = (TCA*)XMALLOC(sizeof(TCA), heap, DYNAMIC_TYPE_TLSX);
  1965. if (tca) {
  1966. XMEMSET(tca, 0, sizeof(TCA));
  1967. tca->type = type;
  1968. switch (type) {
  1969. case WOLFSSL_TRUSTED_CA_PRE_AGREED:
  1970. break;
  1971. #ifndef NO_SHA
  1972. case WOLFSSL_TRUSTED_CA_KEY_SHA1:
  1973. case WOLFSSL_TRUSTED_CA_CERT_SHA1:
  1974. if (idSz == WC_SHA_DIGEST_SIZE &&
  1975. (tca->id =
  1976. (byte*)XMALLOC(idSz, heap, DYNAMIC_TYPE_TLSX))) {
  1977. XMEMCPY(tca->id, id, idSz);
  1978. tca->idSz = idSz;
  1979. }
  1980. else {
  1981. XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
  1982. tca = NULL;
  1983. }
  1984. break;
  1985. #endif
  1986. case WOLFSSL_TRUSTED_CA_X509_NAME:
  1987. if (idSz > 0 &&
  1988. (tca->id =
  1989. (byte*)XMALLOC(idSz, heap, DYNAMIC_TYPE_TLSX))) {
  1990. XMEMCPY(tca->id, id, idSz);
  1991. tca->idSz = idSz;
  1992. }
  1993. else {
  1994. XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
  1995. tca = NULL;
  1996. }
  1997. break;
  1998. default: /* invalid type */
  1999. XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
  2000. tca = NULL;
  2001. }
  2002. }
  2003. (void)heap;
  2004. return tca;
  2005. }
  2006. /** Releases a TCA object. */
  2007. static void TLSX_TCA_Free(TCA* tca, void* heap)
  2008. {
  2009. (void)heap;
  2010. if (tca) {
  2011. if (tca->id)
  2012. XFREE(tca->id, heap, DYNAMIC_TYPE_TLSX);
  2013. XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
  2014. }
  2015. }
  2016. /** Releases all TCA objects in the provided list. */
  2017. static void TLSX_TCA_FreeAll(TCA* list, void* heap)
  2018. {
  2019. TCA* tca;
  2020. while ((tca = list)) {
  2021. list = tca->next;
  2022. TLSX_TCA_Free(tca, heap);
  2023. }
  2024. }
  2025. /** Tells the buffered size of the TCA objects in a list. */
  2026. static word16 TLSX_TCA_GetSize(TCA* list)
  2027. {
  2028. TCA* tca;
  2029. word16 length = OPAQUE16_LEN; /* list length */
  2030. while ((tca = list)) {
  2031. list = tca->next;
  2032. length += ENUM_LEN; /* tca type */
  2033. switch (tca->type) {
  2034. case WOLFSSL_TRUSTED_CA_PRE_AGREED:
  2035. break;
  2036. case WOLFSSL_TRUSTED_CA_KEY_SHA1:
  2037. case WOLFSSL_TRUSTED_CA_CERT_SHA1:
  2038. length += tca->idSz;
  2039. break;
  2040. case WOLFSSL_TRUSTED_CA_X509_NAME:
  2041. length += OPAQUE16_LEN + tca->idSz;
  2042. break;
  2043. }
  2044. }
  2045. return length;
  2046. }
  2047. /** Writes the TCA objects of a list in a buffer. */
  2048. static word16 TLSX_TCA_Write(TCA* list, byte* output)
  2049. {
  2050. TCA* tca;
  2051. word16 offset = OPAQUE16_LEN; /* list length offset */
  2052. while ((tca = list)) {
  2053. list = tca->next;
  2054. output[offset++] = tca->type; /* tca type */
  2055. switch (tca->type) {
  2056. case WOLFSSL_TRUSTED_CA_PRE_AGREED:
  2057. break;
  2058. #ifndef NO_SHA
  2059. case WOLFSSL_TRUSTED_CA_KEY_SHA1:
  2060. case WOLFSSL_TRUSTED_CA_CERT_SHA1:
  2061. if (tca->id != NULL) {
  2062. XMEMCPY(output + offset, tca->id, tca->idSz);
  2063. offset += tca->idSz;
  2064. }
  2065. else {
  2066. /* ID missing. Set to an empty string. */
  2067. c16toa(0, output + offset);
  2068. offset += OPAQUE16_LEN;
  2069. }
  2070. break;
  2071. #endif
  2072. case WOLFSSL_TRUSTED_CA_X509_NAME:
  2073. if (tca->id != NULL) {
  2074. c16toa(tca->idSz, output + offset); /* tca length */
  2075. offset += OPAQUE16_LEN;
  2076. XMEMCPY(output + offset, tca->id, tca->idSz);
  2077. offset += tca->idSz;
  2078. }
  2079. else {
  2080. /* ID missing. Set to an empty string. */
  2081. c16toa(0, output + offset);
  2082. offset += OPAQUE16_LEN;
  2083. }
  2084. break;
  2085. default:
  2086. /* ID unknown. Set to an empty string. */
  2087. c16toa(0, output + offset);
  2088. offset += OPAQUE16_LEN;
  2089. }
  2090. }
  2091. c16toa(offset - OPAQUE16_LEN, output); /* writing list length */
  2092. return offset;
  2093. }
  2094. #ifndef NO_WOLFSSL_SERVER
  2095. static TCA* TLSX_TCA_Find(TCA *list, byte type, const byte* id, word16 idSz)
  2096. {
  2097. TCA* tca = list;
  2098. while (tca && tca->type != type && type != WOLFSSL_TRUSTED_CA_PRE_AGREED &&
  2099. idSz != tca->idSz && !XMEMCMP(id, tca->id, idSz))
  2100. tca = tca->next;
  2101. return tca;
  2102. }
  2103. #endif /* NO_WOLFSSL_SERVER */
  2104. /** Parses a buffer of TCA extensions. */
  2105. static int TLSX_TCA_Parse(WOLFSSL* ssl, const byte* input, word16 length,
  2106. byte isRequest)
  2107. {
  2108. #ifndef NO_WOLFSSL_SERVER
  2109. word16 size = 0;
  2110. word16 offset = 0;
  2111. #endif
  2112. TLSX *extension = TLSX_Find(ssl->extensions, TLSX_TRUSTED_CA_KEYS);
  2113. if (!extension)
  2114. extension = TLSX_Find(ssl->ctx->extensions, TLSX_TRUSTED_CA_KEYS);
  2115. if (!isRequest) {
  2116. #ifndef NO_WOLFSSL_CLIENT
  2117. if (!extension || !extension->data)
  2118. return TLSX_HandleUnsupportedExtension(ssl);
  2119. if (length > 0)
  2120. return BUFFER_ERROR; /* TCA response MUST be empty. */
  2121. /* Set the flag that we're good for keys */
  2122. TLSX_SetResponse(ssl, TLSX_TRUSTED_CA_KEYS);
  2123. return 0;
  2124. #endif
  2125. }
  2126. #ifndef NO_WOLFSSL_SERVER
  2127. if (!extension || !extension->data) {
  2128. /* Skipping, TCA not enabled at server side. */
  2129. return 0;
  2130. }
  2131. if (OPAQUE16_LEN > length)
  2132. return BUFFER_ERROR;
  2133. ato16(input, &size);
  2134. offset += OPAQUE16_LEN;
  2135. /* validating tca list length */
  2136. if (length != OPAQUE16_LEN + size)
  2137. return BUFFER_ERROR;
  2138. for (size = 0; offset < length; offset += size) {
  2139. TCA *tca = NULL;
  2140. byte type;
  2141. const byte* id = NULL;
  2142. word16 idSz = 0;
  2143. if (offset + ENUM_LEN > length)
  2144. return BUFFER_ERROR;
  2145. type = input[offset++];
  2146. switch (type) {
  2147. case WOLFSSL_TRUSTED_CA_PRE_AGREED:
  2148. break;
  2149. #ifndef NO_SHA
  2150. case WOLFSSL_TRUSTED_CA_KEY_SHA1:
  2151. case WOLFSSL_TRUSTED_CA_CERT_SHA1:
  2152. if (offset + WC_SHA_DIGEST_SIZE > length)
  2153. return BUFFER_ERROR;
  2154. idSz = WC_SHA_DIGEST_SIZE;
  2155. id = input + offset;
  2156. offset += idSz;
  2157. break;
  2158. #endif
  2159. case WOLFSSL_TRUSTED_CA_X509_NAME:
  2160. if (offset + OPAQUE16_LEN > length)
  2161. return BUFFER_ERROR;
  2162. ato16(input + offset, &idSz);
  2163. offset += OPAQUE16_LEN;
  2164. if ((offset > length) || (idSz > length - offset))
  2165. return BUFFER_ERROR;
  2166. id = input + offset;
  2167. offset += idSz;
  2168. break;
  2169. default:
  2170. return TCA_INVALID_ID_TYPE;
  2171. }
  2172. /* Find the type/ID in the TCA list. */
  2173. tca = TLSX_TCA_Find((TCA*)extension->data, type, id, idSz);
  2174. if (tca != NULL) {
  2175. /* Found it. Set the response flag and break out of the loop. */
  2176. TLSX_SetResponse(ssl, TLSX_TRUSTED_CA_KEYS);
  2177. break;
  2178. }
  2179. }
  2180. #else
  2181. (void)input;
  2182. #endif
  2183. return 0;
  2184. }
  2185. /* Checks to see if the server sent a response for the TCA. */
  2186. static int TLSX_TCA_VerifyParse(WOLFSSL* ssl, byte isRequest)
  2187. {
  2188. (void)ssl;
  2189. if (!isRequest) {
  2190. #ifndef NO_WOLFSSL_CLIENT
  2191. TLSX* extension = TLSX_Find(ssl->extensions, TLSX_TRUSTED_CA_KEYS);
  2192. if (extension && !extension->resp) {
  2193. SendAlert(ssl, alert_fatal, handshake_failure);
  2194. return TCA_ABSENT_ERROR;
  2195. }
  2196. #endif /* NO_WOLFSSL_CLIENT */
  2197. }
  2198. return 0;
  2199. }
  2200. int TLSX_UseTrustedCA(TLSX** extensions, byte type,
  2201. const byte* id, word16 idSz, void* heap)
  2202. {
  2203. TLSX* extension;
  2204. TCA* tca = NULL;
  2205. if (extensions == NULL)
  2206. return BAD_FUNC_ARG;
  2207. if ((tca = TLSX_TCA_New(type, id, idSz, heap)) == NULL)
  2208. return MEMORY_E;
  2209. extension = TLSX_Find(*extensions, TLSX_TRUSTED_CA_KEYS);
  2210. if (!extension) {
  2211. int ret = TLSX_Push(extensions, TLSX_TRUSTED_CA_KEYS, (void*)tca, heap);
  2212. if (ret != 0) {
  2213. TLSX_TCA_Free(tca, heap);
  2214. return ret;
  2215. }
  2216. }
  2217. else {
  2218. /* push new TCA object to extension data. */
  2219. tca->next = (TCA*)extension->data;
  2220. extension->data = (void*)tca;
  2221. }
  2222. return WOLFSSL_SUCCESS;
  2223. }
  2224. #define TCA_FREE_ALL TLSX_TCA_FreeAll
  2225. #define TCA_GET_SIZE TLSX_TCA_GetSize
  2226. #define TCA_WRITE TLSX_TCA_Write
  2227. #define TCA_PARSE TLSX_TCA_Parse
  2228. #define TCA_VERIFY_PARSE TLSX_TCA_VerifyParse
  2229. #else /* HAVE_TRUSTED_CA */
  2230. #define TCA_FREE_ALL(list, heap)
  2231. #define TCA_GET_SIZE(list) 0
  2232. #define TCA_WRITE(a, b) 0
  2233. #define TCA_PARSE(a, b, c, d) 0
  2234. #define TCA_VERIFY_PARSE(a, b) 0
  2235. #endif /* HAVE_TRUSTED_CA */
  2236. /******************************************************************************/
  2237. /* Max Fragment Length Negotiation */
  2238. /******************************************************************************/
  2239. #ifdef HAVE_MAX_FRAGMENT
  2240. static word16 TLSX_MFL_Write(byte* data, byte* output)
  2241. {
  2242. output[0] = data[0];
  2243. return ENUM_LEN;
  2244. }
  2245. static int TLSX_MFL_Parse(WOLFSSL* ssl, byte* input, word16 length,
  2246. byte isRequest)
  2247. {
  2248. if (length != ENUM_LEN)
  2249. return BUFFER_ERROR;
  2250. #ifdef WOLFSSL_OLD_UNSUPPORTED_EXTENSION
  2251. (void) isRequest;
  2252. #else
  2253. if (!isRequest)
  2254. if (TLSX_CheckUnsupportedExtension(ssl, TLSX_MAX_FRAGMENT_LENGTH))
  2255. return TLSX_HandleUnsupportedExtension(ssl);
  2256. #endif
  2257. switch (*input) {
  2258. case WOLFSSL_MFL_2_8 : ssl->max_fragment = 256; break;
  2259. case WOLFSSL_MFL_2_9 : ssl->max_fragment = 512; break;
  2260. case WOLFSSL_MFL_2_10: ssl->max_fragment = 1024; break;
  2261. case WOLFSSL_MFL_2_11: ssl->max_fragment = 2048; break;
  2262. case WOLFSSL_MFL_2_12: ssl->max_fragment = 4096; break;
  2263. case WOLFSSL_MFL_2_13: ssl->max_fragment = 8192; break;
  2264. default:
  2265. SendAlert(ssl, alert_fatal, illegal_parameter);
  2266. return UNKNOWN_MAX_FRAG_LEN_E;
  2267. }
  2268. #ifndef NO_WOLFSSL_SERVER
  2269. if (isRequest) {
  2270. int ret = TLSX_UseMaxFragment(&ssl->extensions, *input, ssl->heap);
  2271. if (ret != WOLFSSL_SUCCESS)
  2272. return ret; /* throw error */
  2273. TLSX_SetResponse(ssl, TLSX_MAX_FRAGMENT_LENGTH);
  2274. }
  2275. #endif
  2276. return 0;
  2277. }
  2278. int TLSX_UseMaxFragment(TLSX** extensions, byte mfl, void* heap)
  2279. {
  2280. byte* data = NULL;
  2281. int ret = 0;
  2282. if (extensions == NULL || mfl < WOLFSSL_MFL_MIN || mfl > WOLFSSL_MFL_MAX)
  2283. return BAD_FUNC_ARG;
  2284. data = (byte*)XMALLOC(ENUM_LEN, heap, DYNAMIC_TYPE_TLSX);
  2285. if (data == NULL)
  2286. return MEMORY_E;
  2287. data[0] = mfl;
  2288. ret = TLSX_Push(extensions, TLSX_MAX_FRAGMENT_LENGTH, data, heap);
  2289. if (ret != 0) {
  2290. XFREE(data, heap, DYNAMIC_TYPE_TLSX);
  2291. return ret;
  2292. }
  2293. return WOLFSSL_SUCCESS;
  2294. }
  2295. #define MFL_FREE_ALL(data, heap) XFREE(data, (heap), DYNAMIC_TYPE_TLSX)
  2296. #define MFL_GET_SIZE(data) ENUM_LEN
  2297. #define MFL_WRITE TLSX_MFL_Write
  2298. #define MFL_PARSE TLSX_MFL_Parse
  2299. #else
  2300. #define MFL_FREE_ALL(a, b)
  2301. #define MFL_GET_SIZE(a) 0
  2302. #define MFL_WRITE(a, b) 0
  2303. #define MFL_PARSE(a, b, c, d) 0
  2304. #endif /* HAVE_MAX_FRAGMENT */
  2305. /******************************************************************************/
  2306. /* Truncated HMAC */
  2307. /******************************************************************************/
  2308. #ifdef HAVE_TRUNCATED_HMAC
  2309. static int TLSX_THM_Parse(WOLFSSL* ssl, byte* input, word16 length,
  2310. byte isRequest)
  2311. {
  2312. if (length != 0 || input == NULL)
  2313. return BUFFER_ERROR;
  2314. if (!isRequest) {
  2315. #ifndef WOLFSSL_OLD_UNSUPPORTED_EXTENSION
  2316. if (TLSX_CheckUnsupportedExtension(ssl, TLSX_TRUNCATED_HMAC))
  2317. return TLSX_HandleUnsupportedExtension(ssl);
  2318. #endif
  2319. }
  2320. else {
  2321. #ifndef NO_WOLFSSL_SERVER
  2322. int ret = TLSX_UseTruncatedHMAC(&ssl->extensions, ssl->heap);
  2323. if (ret != WOLFSSL_SUCCESS)
  2324. return ret; /* throw error */
  2325. TLSX_SetResponse(ssl, TLSX_TRUNCATED_HMAC);
  2326. #endif
  2327. }
  2328. ssl->truncated_hmac = 1;
  2329. return 0;
  2330. }
  2331. int TLSX_UseTruncatedHMAC(TLSX** extensions, void* heap)
  2332. {
  2333. int ret = 0;
  2334. if (extensions == NULL)
  2335. return BAD_FUNC_ARG;
  2336. ret = TLSX_Push(extensions, TLSX_TRUNCATED_HMAC, NULL, heap);
  2337. if (ret != 0)
  2338. return ret;
  2339. return WOLFSSL_SUCCESS;
  2340. }
  2341. #define THM_PARSE TLSX_THM_Parse
  2342. #else
  2343. #define THM_PARSE(a, b, c, d) 0
  2344. #endif /* HAVE_TRUNCATED_HMAC */
  2345. /******************************************************************************/
  2346. /* Certificate Status Request */
  2347. /******************************************************************************/
  2348. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  2349. static void TLSX_CSR_Free(CertificateStatusRequest* csr, void* heap)
  2350. {
  2351. switch (csr->status_type) {
  2352. case WOLFSSL_CSR_OCSP:
  2353. FreeOcspRequest(&csr->request.ocsp);
  2354. break;
  2355. }
  2356. XFREE(csr, heap, DYNAMIC_TYPE_TLSX);
  2357. (void)heap;
  2358. }
  2359. static word16 TLSX_CSR_GetSize(CertificateStatusRequest* csr, byte isRequest)
  2360. {
  2361. word16 size = 0;
  2362. /* shut up compiler warnings */
  2363. (void) csr; (void) isRequest;
  2364. #ifndef NO_WOLFSSL_CLIENT
  2365. if (isRequest) {
  2366. switch (csr->status_type) {
  2367. case WOLFSSL_CSR_OCSP:
  2368. size += ENUM_LEN + 2 * OPAQUE16_LEN;
  2369. if (csr->request.ocsp.nonceSz)
  2370. size += OCSP_NONCE_EXT_SZ;
  2371. break;
  2372. }
  2373. }
  2374. #endif
  2375. #if defined(WOLFSSL_TLS13) && !defined(NO_WOLFSSL_SERVER)
  2376. if (!isRequest && csr->ssl->options.tls1_3)
  2377. return OPAQUE8_LEN + OPAQUE24_LEN + csr->response.length;
  2378. #endif
  2379. return size;
  2380. }
  2381. static word16 TLSX_CSR_Write(CertificateStatusRequest* csr, byte* output,
  2382. byte isRequest)
  2383. {
  2384. /* shut up compiler warnings */
  2385. (void) csr; (void) output; (void) isRequest;
  2386. #ifndef NO_WOLFSSL_CLIENT
  2387. if (isRequest) {
  2388. word16 offset = 0;
  2389. word16 length = 0;
  2390. /* type */
  2391. output[offset++] = csr->status_type;
  2392. switch (csr->status_type) {
  2393. case WOLFSSL_CSR_OCSP:
  2394. /* responder id list */
  2395. c16toa(0, output + offset);
  2396. offset += OPAQUE16_LEN;
  2397. /* request extensions */
  2398. if (csr->request.ocsp.nonceSz)
  2399. length = (word16)EncodeOcspRequestExtensions(
  2400. &csr->request.ocsp,
  2401. output + offset + OPAQUE16_LEN,
  2402. OCSP_NONCE_EXT_SZ);
  2403. c16toa(length, output + offset);
  2404. offset += OPAQUE16_LEN + length;
  2405. break;
  2406. }
  2407. return offset;
  2408. }
  2409. #endif
  2410. #if defined(WOLFSSL_TLS13) && !defined(NO_WOLFSSL_SERVER)
  2411. if (!isRequest && csr->ssl->options.tls1_3) {
  2412. word16 offset = 0;
  2413. output[offset++] = csr->status_type;
  2414. c32to24(csr->response.length, output + offset);
  2415. offset += OPAQUE24_LEN;
  2416. XMEMCPY(output + offset, csr->response.buffer, csr->response.length);
  2417. offset += csr->response.length;
  2418. return offset;
  2419. }
  2420. #endif
  2421. return 0;
  2422. }
  2423. static int TLSX_CSR_Parse(WOLFSSL* ssl, byte* input, word16 length,
  2424. byte isRequest)
  2425. {
  2426. int ret;
  2427. #if !defined(NO_WOLFSSL_SERVER)
  2428. byte status_type;
  2429. word16 size = 0;
  2430. #if defined(WOLFSSL_TLS13)
  2431. DecodedCert* cert;
  2432. #endif
  2433. #endif
  2434. #if !defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER) \
  2435. && defined(WOLFSSL_TLS13)
  2436. OcspRequest* request;
  2437. TLSX* extension;
  2438. CertificateStatusRequest* csr;
  2439. #endif
  2440. #if !defined(NO_WOLFSSL_CLIENT) && defined(WOLFSSL_TLS13) \
  2441. || !defined(NO_WOLFSSL_SERVER)
  2442. word32 offset = 0;
  2443. #endif
  2444. #if !defined(NO_WOLFSSL_CLIENT) && defined(WOLFSSL_TLS13)
  2445. word32 resp_length;
  2446. #endif
  2447. /* shut up compiler warnings */
  2448. (void) ssl; (void) input;
  2449. if (!isRequest) {
  2450. #ifndef NO_WOLFSSL_CLIENT
  2451. extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
  2452. csr = extension ? (CertificateStatusRequest*)extension->data : NULL;
  2453. if (!csr) {
  2454. /* look at context level */
  2455. extension = TLSX_Find(ssl->ctx->extensions, TLSX_STATUS_REQUEST);
  2456. csr = extension ? (CertificateStatusRequest*)extension->data : NULL;
  2457. if (!csr) /* unexpected extension */
  2458. return TLSX_HandleUnsupportedExtension(ssl);
  2459. /* enable extension at ssl level */
  2460. ret = TLSX_UseCertificateStatusRequest(&ssl->extensions,
  2461. csr->status_type, csr->options, ssl,
  2462. ssl->heap, ssl->devId);
  2463. if (ret != WOLFSSL_SUCCESS)
  2464. return ret;
  2465. switch (csr->status_type) {
  2466. case WOLFSSL_CSR_OCSP:
  2467. /* propagate nonce */
  2468. if (csr->request.ocsp.nonceSz) {
  2469. request =
  2470. (OcspRequest*)TLSX_CSR_GetRequest(ssl->extensions);
  2471. if (request) {
  2472. XMEMCPY(request->nonce, csr->request.ocsp.nonce,
  2473. csr->request.ocsp.nonceSz);
  2474. request->nonceSz = csr->request.ocsp.nonceSz;
  2475. }
  2476. }
  2477. break;
  2478. }
  2479. }
  2480. ssl->status_request = 1;
  2481. #ifdef WOLFSSL_TLS13
  2482. if (ssl->options.tls1_3) {
  2483. /* Get the new extension potentially created above. */
  2484. extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
  2485. csr = extension ? (CertificateStatusRequest*)extension->data : NULL;
  2486. if (csr == NULL)
  2487. return MEMORY_ERROR;
  2488. ret = 0;
  2489. if (OPAQUE8_LEN + OPAQUE24_LEN > length)
  2490. ret = BUFFER_ERROR;
  2491. if (ret == 0 && input[offset++] != WOLFSSL_CSR_OCSP)
  2492. ret = BAD_CERTIFICATE_STATUS_ERROR;
  2493. if (ret == 0) {
  2494. c24to32(input + offset, &resp_length);
  2495. offset += OPAQUE24_LEN;
  2496. if (offset + resp_length != length)
  2497. ret = BUFFER_ERROR;
  2498. }
  2499. if (ret == 0) {
  2500. csr->response.buffer = input + offset;
  2501. csr->response.length = resp_length;
  2502. }
  2503. return ret;
  2504. }
  2505. else
  2506. #endif
  2507. {
  2508. /* extension_data MUST be empty. */
  2509. return length ? BUFFER_ERROR : 0;
  2510. }
  2511. #endif
  2512. }
  2513. else {
  2514. #ifndef NO_WOLFSSL_SERVER
  2515. if (length == 0)
  2516. return 0;
  2517. status_type = input[offset++];
  2518. switch (status_type) {
  2519. case WOLFSSL_CSR_OCSP: {
  2520. /* skip responder_id_list */
  2521. if ((int)(length - offset) < OPAQUE16_LEN)
  2522. return BUFFER_ERROR;
  2523. ato16(input + offset, &size);
  2524. offset += OPAQUE16_LEN + size;
  2525. /* skip request_extensions */
  2526. if ((int)(length - offset) < OPAQUE16_LEN)
  2527. return BUFFER_ERROR;
  2528. ato16(input + offset, &size);
  2529. offset += OPAQUE16_LEN + size;
  2530. if (offset > length)
  2531. return BUFFER_ERROR;
  2532. /* is able to send OCSP response? */
  2533. if (ssl->ctx->cm == NULL || !ssl->ctx->cm->ocspStaplingEnabled)
  2534. return 0;
  2535. }
  2536. break;
  2537. /* unknown status type */
  2538. default:
  2539. return 0;
  2540. }
  2541. /* if using status_request and already sending it, skip this one */
  2542. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  2543. if (ssl->status_request_v2)
  2544. return 0;
  2545. #endif
  2546. /* accept the first good status_type and return */
  2547. ret = TLSX_UseCertificateStatusRequest(&ssl->extensions, status_type,
  2548. 0, ssl, ssl->heap, ssl->devId);
  2549. if (ret != WOLFSSL_SUCCESS)
  2550. return ret; /* throw error */
  2551. #if defined(WOLFSSL_TLS13)
  2552. if (ssl->options.tls1_3) {
  2553. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
  2554. DYNAMIC_TYPE_DCERT);
  2555. if (cert == NULL) {
  2556. return MEMORY_E;
  2557. }
  2558. InitDecodedCert(cert, ssl->buffers.certificate->buffer,
  2559. ssl->buffers.certificate->length, ssl->heap);
  2560. ret = ParseCert(cert, CERT_TYPE, 1, ssl->ctx->cm);
  2561. if (ret != 0 ) {
  2562. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  2563. return ret;
  2564. }
  2565. ret = TLSX_CSR_InitRequest(ssl->extensions, cert, ssl->heap);
  2566. if (ret != 0 ) {
  2567. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  2568. return ret;
  2569. }
  2570. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  2571. extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
  2572. csr = extension ?
  2573. (CertificateStatusRequest*)extension->data : NULL;
  2574. if (csr == NULL)
  2575. return MEMORY_ERROR;
  2576. request = &csr->request.ocsp;
  2577. ret = CreateOcspResponse(ssl, &request, &csr->response);
  2578. if (ret != 0)
  2579. return ret;
  2580. if (csr->response.buffer)
  2581. TLSX_SetResponse(ssl, TLSX_STATUS_REQUEST);
  2582. }
  2583. else
  2584. #endif
  2585. TLSX_SetResponse(ssl, TLSX_STATUS_REQUEST);
  2586. ssl->status_request = status_type;
  2587. #endif
  2588. }
  2589. return 0;
  2590. }
  2591. int TLSX_CSR_InitRequest(TLSX* extensions, DecodedCert* cert, void* heap)
  2592. {
  2593. TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST);
  2594. CertificateStatusRequest* csr = extension ?
  2595. (CertificateStatusRequest*)extension->data : NULL;
  2596. int ret = 0;
  2597. if (csr) {
  2598. switch (csr->status_type) {
  2599. case WOLFSSL_CSR_OCSP: {
  2600. byte nonce[MAX_OCSP_NONCE_SZ];
  2601. int nonceSz = csr->request.ocsp.nonceSz;
  2602. /* preserve nonce */
  2603. XMEMCPY(nonce, csr->request.ocsp.nonce, nonceSz);
  2604. if ((ret = InitOcspRequest(&csr->request.ocsp, cert, 0, heap))
  2605. != 0)
  2606. return ret;
  2607. /* restore nonce */
  2608. XMEMCPY(csr->request.ocsp.nonce, nonce, nonceSz);
  2609. csr->request.ocsp.nonceSz = nonceSz;
  2610. }
  2611. break;
  2612. }
  2613. }
  2614. return ret;
  2615. }
  2616. void* TLSX_CSR_GetRequest(TLSX* extensions)
  2617. {
  2618. TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST);
  2619. CertificateStatusRequest* csr = extension ?
  2620. (CertificateStatusRequest*)extension->data : NULL;
  2621. if (csr) {
  2622. switch (csr->status_type) {
  2623. case WOLFSSL_CSR_OCSP:
  2624. return &csr->request.ocsp;
  2625. break;
  2626. }
  2627. }
  2628. return NULL;
  2629. }
  2630. int TLSX_CSR_ForceRequest(WOLFSSL* ssl)
  2631. {
  2632. TLSX* extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
  2633. CertificateStatusRequest* csr = extension ?
  2634. (CertificateStatusRequest*)extension->data : NULL;
  2635. if (csr) {
  2636. switch (csr->status_type) {
  2637. case WOLFSSL_CSR_OCSP:
  2638. if (ssl->ctx->cm->ocspEnabled) {
  2639. csr->request.ocsp.ssl = ssl;
  2640. return CheckOcspRequest(ssl->ctx->cm->ocsp,
  2641. &csr->request.ocsp, NULL);
  2642. }
  2643. else
  2644. return OCSP_LOOKUP_FAIL;
  2645. }
  2646. }
  2647. return 0;
  2648. }
  2649. int TLSX_UseCertificateStatusRequest(TLSX** extensions, byte status_type,
  2650. byte options, WOLFSSL* ssl, void* heap,
  2651. int devId)
  2652. {
  2653. CertificateStatusRequest* csr = NULL;
  2654. int ret = 0;
  2655. if (!extensions || status_type != WOLFSSL_CSR_OCSP)
  2656. return BAD_FUNC_ARG;
  2657. csr = (CertificateStatusRequest*)
  2658. XMALLOC(sizeof(CertificateStatusRequest), heap, DYNAMIC_TYPE_TLSX);
  2659. if (!csr)
  2660. return MEMORY_E;
  2661. ForceZero(csr, sizeof(CertificateStatusRequest));
  2662. csr->status_type = status_type;
  2663. csr->options = options;
  2664. csr->ssl = ssl;
  2665. switch (csr->status_type) {
  2666. case WOLFSSL_CSR_OCSP:
  2667. if (options & WOLFSSL_CSR_OCSP_USE_NONCE) {
  2668. WC_RNG rng;
  2669. #ifndef HAVE_FIPS
  2670. ret = wc_InitRng_ex(&rng, heap, devId);
  2671. #else
  2672. ret = wc_InitRng(&rng);
  2673. (void)devId;
  2674. #endif
  2675. if (ret == 0) {
  2676. if (wc_RNG_GenerateBlock(&rng, csr->request.ocsp.nonce,
  2677. MAX_OCSP_NONCE_SZ) == 0)
  2678. csr->request.ocsp.nonceSz = MAX_OCSP_NONCE_SZ;
  2679. wc_FreeRng(&rng);
  2680. }
  2681. }
  2682. break;
  2683. }
  2684. if ((ret = TLSX_Push(extensions, TLSX_STATUS_REQUEST, csr, heap)) != 0) {
  2685. XFREE(csr, heap, DYNAMIC_TYPE_TLSX);
  2686. return ret;
  2687. }
  2688. return WOLFSSL_SUCCESS;
  2689. }
  2690. #define CSR_FREE_ALL TLSX_CSR_Free
  2691. #define CSR_GET_SIZE TLSX_CSR_GetSize
  2692. #define CSR_WRITE TLSX_CSR_Write
  2693. #define CSR_PARSE TLSX_CSR_Parse
  2694. #else
  2695. #define CSR_FREE_ALL(data, heap)
  2696. #define CSR_GET_SIZE(a, b) 0
  2697. #define CSR_WRITE(a, b, c) 0
  2698. #define CSR_PARSE(a, b, c, d) 0
  2699. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  2700. /******************************************************************************/
  2701. /* Certificate Status Request v2 */
  2702. /******************************************************************************/
  2703. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  2704. static void TLSX_CSR2_FreeAll(CertificateStatusRequestItemV2* csr2, void* heap)
  2705. {
  2706. CertificateStatusRequestItemV2* next;
  2707. for (; csr2; csr2 = next) {
  2708. next = csr2->next;
  2709. switch (csr2->status_type) {
  2710. case WOLFSSL_CSR2_OCSP:
  2711. case WOLFSSL_CSR2_OCSP_MULTI:
  2712. while(csr2->requests--)
  2713. FreeOcspRequest(&csr2->request.ocsp[csr2->requests]);
  2714. break;
  2715. }
  2716. XFREE(csr2, heap, DYNAMIC_TYPE_TLSX);
  2717. }
  2718. (void)heap;
  2719. }
  2720. static word16 TLSX_CSR2_GetSize(CertificateStatusRequestItemV2* csr2,
  2721. byte isRequest)
  2722. {
  2723. word16 size = 0;
  2724. /* shut up compiler warnings */
  2725. (void) csr2; (void) isRequest;
  2726. #ifndef NO_WOLFSSL_CLIENT
  2727. if (isRequest) {
  2728. CertificateStatusRequestItemV2* next;
  2729. for (size = OPAQUE16_LEN; csr2; csr2 = next) {
  2730. next = csr2->next;
  2731. switch (csr2->status_type) {
  2732. case WOLFSSL_CSR2_OCSP:
  2733. case WOLFSSL_CSR2_OCSP_MULTI:
  2734. size += ENUM_LEN + 3 * OPAQUE16_LEN;
  2735. if (csr2->request.ocsp[0].nonceSz)
  2736. size += OCSP_NONCE_EXT_SZ;
  2737. break;
  2738. }
  2739. }
  2740. }
  2741. #endif
  2742. return size;
  2743. }
  2744. static word16 TLSX_CSR2_Write(CertificateStatusRequestItemV2* csr2,
  2745. byte* output, byte isRequest)
  2746. {
  2747. /* shut up compiler warnings */
  2748. (void) csr2; (void) output; (void) isRequest;
  2749. #ifndef NO_WOLFSSL_CLIENT
  2750. if (isRequest) {
  2751. word16 offset;
  2752. word16 length;
  2753. for (offset = OPAQUE16_LEN; csr2 != NULL; csr2 = csr2->next) {
  2754. /* status_type */
  2755. output[offset++] = csr2->status_type;
  2756. /* request */
  2757. switch (csr2->status_type) {
  2758. case WOLFSSL_CSR2_OCSP:
  2759. case WOLFSSL_CSR2_OCSP_MULTI:
  2760. /* request_length */
  2761. length = 2 * OPAQUE16_LEN;
  2762. if (csr2->request.ocsp[0].nonceSz)
  2763. length += OCSP_NONCE_EXT_SZ;
  2764. c16toa(length, output + offset);
  2765. offset += OPAQUE16_LEN;
  2766. /* responder id list */
  2767. c16toa(0, output + offset);
  2768. offset += OPAQUE16_LEN;
  2769. /* request extensions */
  2770. length = 0;
  2771. if (csr2->request.ocsp[0].nonceSz)
  2772. length = (word16)EncodeOcspRequestExtensions(
  2773. &csr2->request.ocsp[0],
  2774. output + offset + OPAQUE16_LEN,
  2775. OCSP_NONCE_EXT_SZ);
  2776. c16toa(length, output + offset);
  2777. offset += OPAQUE16_LEN + length;
  2778. break;
  2779. }
  2780. }
  2781. /* list size */
  2782. c16toa(offset - OPAQUE16_LEN, output);
  2783. return offset;
  2784. }
  2785. #endif
  2786. return 0;
  2787. }
  2788. static int TLSX_CSR2_Parse(WOLFSSL* ssl, byte* input, word16 length,
  2789. byte isRequest)
  2790. {
  2791. int ret;
  2792. /* shut up compiler warnings */
  2793. (void) ssl; (void) input;
  2794. if (!isRequest) {
  2795. #ifndef NO_WOLFSSL_CLIENT
  2796. TLSX* extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST_V2);
  2797. CertificateStatusRequestItemV2* csr2 = extension ?
  2798. (CertificateStatusRequestItemV2*)extension->data : NULL;
  2799. if (!csr2) {
  2800. /* look at context level */
  2801. extension = TLSX_Find(ssl->ctx->extensions, TLSX_STATUS_REQUEST_V2);
  2802. csr2 = extension ?
  2803. (CertificateStatusRequestItemV2*)extension->data : NULL;
  2804. if (!csr2) /* unexpected extension */
  2805. return TLSX_HandleUnsupportedExtension(ssl);
  2806. /* enable extension at ssl level */
  2807. for (; csr2; csr2 = csr2->next) {
  2808. ret = TLSX_UseCertificateStatusRequestV2(&ssl->extensions,
  2809. csr2->status_type, csr2->options, ssl->heap,
  2810. ssl->devId);
  2811. if (ret != WOLFSSL_SUCCESS)
  2812. return ret;
  2813. switch (csr2->status_type) {
  2814. case WOLFSSL_CSR2_OCSP:
  2815. /* followed by */
  2816. case WOLFSSL_CSR2_OCSP_MULTI:
  2817. /* propagate nonce */
  2818. if (csr2->request.ocsp[0].nonceSz) {
  2819. OcspRequest* request =
  2820. (OcspRequest*)TLSX_CSR2_GetRequest(ssl->extensions,
  2821. csr2->status_type, 0);
  2822. if (request) {
  2823. XMEMCPY(request->nonce,
  2824. csr2->request.ocsp[0].nonce,
  2825. csr2->request.ocsp[0].nonceSz);
  2826. request->nonceSz =
  2827. csr2->request.ocsp[0].nonceSz;
  2828. }
  2829. }
  2830. break;
  2831. }
  2832. }
  2833. }
  2834. ssl->status_request_v2 = 1;
  2835. return length ? BUFFER_ERROR : 0; /* extension_data MUST be empty. */
  2836. #endif
  2837. }
  2838. else {
  2839. #ifndef NO_WOLFSSL_SERVER
  2840. byte status_type;
  2841. word16 request_length;
  2842. word16 offset = 0;
  2843. word16 size = 0;
  2844. /* list size */
  2845. if (offset + OPAQUE16_LEN >= length) {
  2846. return BUFFER_E;
  2847. }
  2848. ato16(input + offset, &request_length);
  2849. offset += OPAQUE16_LEN;
  2850. if (length - OPAQUE16_LEN != request_length)
  2851. return BUFFER_ERROR;
  2852. while (length > offset) {
  2853. if ((int)(length - offset) < ENUM_LEN + OPAQUE16_LEN)
  2854. return BUFFER_ERROR;
  2855. status_type = input[offset++];
  2856. ato16(input + offset, &request_length);
  2857. offset += OPAQUE16_LEN;
  2858. if (length - offset < request_length)
  2859. return BUFFER_ERROR;
  2860. switch (status_type) {
  2861. case WOLFSSL_CSR2_OCSP:
  2862. case WOLFSSL_CSR2_OCSP_MULTI:
  2863. /* skip responder_id_list */
  2864. if ((int)(length - offset) < OPAQUE16_LEN)
  2865. return BUFFER_ERROR;
  2866. ato16(input + offset, &size);
  2867. if (length - offset < size)
  2868. return BUFFER_ERROR;
  2869. offset += OPAQUE16_LEN + size;
  2870. /* skip request_extensions */
  2871. if ((int)(length - offset) < OPAQUE16_LEN)
  2872. return BUFFER_ERROR;
  2873. ato16(input + offset, &size);
  2874. if (length - offset < size)
  2875. return BUFFER_ERROR;
  2876. offset += OPAQUE16_LEN + size;
  2877. if (offset > length)
  2878. return BUFFER_ERROR;
  2879. /* is able to send OCSP response? */
  2880. if (ssl->ctx->cm == NULL
  2881. || !ssl->ctx->cm->ocspStaplingEnabled)
  2882. continue;
  2883. break;
  2884. default:
  2885. /* unknown status type, skipping! */
  2886. offset += request_length;
  2887. continue;
  2888. }
  2889. /* if using status_request and already sending it, skip this one */
  2890. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  2891. if (ssl->status_request)
  2892. return 0;
  2893. #endif
  2894. /* TLS 1.3 servers MUST NOT act upon presence or information in
  2895. * this extension (RFC 8448 Section 4.4.2.1).
  2896. */
  2897. if (!IsAtLeastTLSv1_3(ssl->version)) {
  2898. /* accept the first good status_type and return */
  2899. ret = TLSX_UseCertificateStatusRequestV2(&ssl->extensions,
  2900. status_type, 0, ssl->heap, ssl->devId);
  2901. if (ret != WOLFSSL_SUCCESS)
  2902. return ret; /* throw error */
  2903. TLSX_SetResponse(ssl, TLSX_STATUS_REQUEST_V2);
  2904. ssl->status_request_v2 = status_type;
  2905. }
  2906. return 0;
  2907. }
  2908. #endif
  2909. }
  2910. return 0;
  2911. }
  2912. int TLSX_CSR2_InitRequests(TLSX* extensions, DecodedCert* cert, byte isPeer,
  2913. void* heap)
  2914. {
  2915. TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST_V2);
  2916. CertificateStatusRequestItemV2* csr2 = extension ?
  2917. (CertificateStatusRequestItemV2*)extension->data : NULL;
  2918. int ret = 0;
  2919. for (; csr2; csr2 = csr2->next) {
  2920. switch (csr2->status_type) {
  2921. case WOLFSSL_CSR2_OCSP:
  2922. if (!isPeer || csr2->requests != 0)
  2923. break;
  2924. FALL_THROUGH; /* followed by */
  2925. case WOLFSSL_CSR2_OCSP_MULTI: {
  2926. if (csr2->requests < 1 + MAX_CHAIN_DEPTH) {
  2927. byte nonce[MAX_OCSP_NONCE_SZ];
  2928. int nonceSz = csr2->request.ocsp[0].nonceSz;
  2929. /* preserve nonce, replicating nonce of ocsp[0] */
  2930. XMEMCPY(nonce, csr2->request.ocsp[0].nonce, nonceSz);
  2931. if ((ret = InitOcspRequest(
  2932. &csr2->request.ocsp[csr2->requests], cert,
  2933. 0, heap)) != 0)
  2934. return ret;
  2935. /* restore nonce */
  2936. XMEMCPY(csr2->request.ocsp[csr2->requests].nonce,
  2937. nonce, nonceSz);
  2938. csr2->request.ocsp[csr2->requests].nonceSz = nonceSz;
  2939. csr2->requests++;
  2940. }
  2941. }
  2942. break;
  2943. }
  2944. }
  2945. (void)cert;
  2946. return ret;
  2947. }
  2948. void* TLSX_CSR2_GetRequest(TLSX* extensions, byte status_type, byte idx)
  2949. {
  2950. TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST_V2);
  2951. CertificateStatusRequestItemV2* csr2 = extension ?
  2952. (CertificateStatusRequestItemV2*)extension->data : NULL;
  2953. for (; csr2; csr2 = csr2->next) {
  2954. if (csr2->status_type == status_type) {
  2955. switch (csr2->status_type) {
  2956. case WOLFSSL_CSR2_OCSP:
  2957. /* followed by */
  2958. case WOLFSSL_CSR2_OCSP_MULTI:
  2959. /* requests are initialized in the reverse order */
  2960. return idx < csr2->requests
  2961. ? &csr2->request.ocsp[csr2->requests - idx - 1]
  2962. : NULL;
  2963. break;
  2964. }
  2965. }
  2966. }
  2967. return NULL;
  2968. }
  2969. int TLSX_CSR2_ForceRequest(WOLFSSL* ssl)
  2970. {
  2971. TLSX* extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST_V2);
  2972. CertificateStatusRequestItemV2* csr2 = extension ?
  2973. (CertificateStatusRequestItemV2*)extension->data : NULL;
  2974. /* forces only the first one */
  2975. if (csr2) {
  2976. switch (csr2->status_type) {
  2977. case WOLFSSL_CSR2_OCSP:
  2978. /* followed by */
  2979. case WOLFSSL_CSR2_OCSP_MULTI:
  2980. if (ssl->ctx->cm->ocspEnabled) {
  2981. csr2->request.ocsp[0].ssl = ssl;
  2982. return CheckOcspRequest(ssl->ctx->cm->ocsp,
  2983. &csr2->request.ocsp[0], NULL);
  2984. }
  2985. else
  2986. return OCSP_LOOKUP_FAIL;
  2987. }
  2988. }
  2989. return 0;
  2990. }
  2991. int TLSX_UseCertificateStatusRequestV2(TLSX** extensions, byte status_type,
  2992. byte options, void* heap, int devId)
  2993. {
  2994. TLSX* extension = NULL;
  2995. CertificateStatusRequestItemV2* csr2 = NULL;
  2996. int ret = 0;
  2997. if (!extensions)
  2998. return BAD_FUNC_ARG;
  2999. if (status_type != WOLFSSL_CSR2_OCSP
  3000. && status_type != WOLFSSL_CSR2_OCSP_MULTI)
  3001. return BAD_FUNC_ARG;
  3002. csr2 = (CertificateStatusRequestItemV2*)
  3003. XMALLOC(sizeof(CertificateStatusRequestItemV2), heap, DYNAMIC_TYPE_TLSX);
  3004. if (!csr2)
  3005. return MEMORY_E;
  3006. ForceZero(csr2, sizeof(CertificateStatusRequestItemV2));
  3007. csr2->status_type = status_type;
  3008. csr2->options = options;
  3009. csr2->next = NULL;
  3010. switch (csr2->status_type) {
  3011. case WOLFSSL_CSR2_OCSP:
  3012. case WOLFSSL_CSR2_OCSP_MULTI:
  3013. if (options & WOLFSSL_CSR2_OCSP_USE_NONCE) {
  3014. WC_RNG rng;
  3015. #ifndef HAVE_FIPS
  3016. ret = wc_InitRng_ex(&rng, heap, devId);
  3017. #else
  3018. ret = wc_InitRng(&rng);
  3019. (void)devId;
  3020. #endif
  3021. if (ret == 0) {
  3022. if (wc_RNG_GenerateBlock(&rng, csr2->request.ocsp[0].nonce,
  3023. MAX_OCSP_NONCE_SZ) == 0)
  3024. csr2->request.ocsp[0].nonceSz = MAX_OCSP_NONCE_SZ;
  3025. wc_FreeRng(&rng);
  3026. }
  3027. }
  3028. break;
  3029. }
  3030. /* append new item */
  3031. if ((extension = TLSX_Find(*extensions, TLSX_STATUS_REQUEST_V2))) {
  3032. CertificateStatusRequestItemV2* last =
  3033. (CertificateStatusRequestItemV2*)extension->data;
  3034. for (; last->next; last = last->next);
  3035. last->next = csr2;
  3036. }
  3037. else if ((ret = TLSX_Push(extensions, TLSX_STATUS_REQUEST_V2, csr2,heap))) {
  3038. XFREE(csr2, heap, DYNAMIC_TYPE_TLSX);
  3039. return ret;
  3040. }
  3041. return WOLFSSL_SUCCESS;
  3042. }
  3043. #define CSR2_FREE_ALL TLSX_CSR2_FreeAll
  3044. #define CSR2_GET_SIZE TLSX_CSR2_GetSize
  3045. #define CSR2_WRITE TLSX_CSR2_Write
  3046. #define CSR2_PARSE TLSX_CSR2_Parse
  3047. #else
  3048. #define CSR2_FREE_ALL(data, heap)
  3049. #define CSR2_GET_SIZE(a, b) 0
  3050. #define CSR2_WRITE(a, b, c) 0
  3051. #define CSR2_PARSE(a, b, c, d) 0
  3052. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  3053. /******************************************************************************/
  3054. /* Supported Elliptic Curves */
  3055. /******************************************************************************/
  3056. #ifdef HAVE_SUPPORTED_CURVES
  3057. #if !defined(HAVE_ECC) && !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448) \
  3058. && !defined(HAVE_FFDHE)
  3059. #error Elliptic Curves Extension requires Elliptic Curve Cryptography. \
  3060. Use --enable-ecc in the configure script or define HAVE_ECC. \
  3061. Alternatively use FFDHE for DH ciphersuites.
  3062. #endif
  3063. static int TLSX_SupportedCurve_New(SupportedCurve** curve, word16 name,
  3064. void* heap)
  3065. {
  3066. if (curve == NULL)
  3067. return BAD_FUNC_ARG;
  3068. (void)heap;
  3069. *curve = (SupportedCurve*)XMALLOC(sizeof(SupportedCurve), heap,
  3070. DYNAMIC_TYPE_TLSX);
  3071. if (*curve == NULL)
  3072. return MEMORY_E;
  3073. (*curve)->name = name;
  3074. (*curve)->next = NULL;
  3075. return 0;
  3076. }
  3077. static int TLSX_PointFormat_New(PointFormat** point, byte format, void* heap)
  3078. {
  3079. if (point == NULL)
  3080. return BAD_FUNC_ARG;
  3081. (void)heap;
  3082. *point = (PointFormat*)XMALLOC(sizeof(PointFormat), heap,
  3083. DYNAMIC_TYPE_TLSX);
  3084. if (*point == NULL)
  3085. return MEMORY_E;
  3086. (*point)->format = format;
  3087. (*point)->next = NULL;
  3088. return 0;
  3089. }
  3090. static void TLSX_SupportedCurve_FreeAll(SupportedCurve* list, void* heap)
  3091. {
  3092. SupportedCurve* curve;
  3093. while ((curve = list)) {
  3094. list = curve->next;
  3095. XFREE(curve, heap, DYNAMIC_TYPE_TLSX);
  3096. }
  3097. (void)heap;
  3098. }
  3099. static void TLSX_PointFormat_FreeAll(PointFormat* list, void* heap)
  3100. {
  3101. PointFormat* point;
  3102. while ((point = list)) {
  3103. list = point->next;
  3104. XFREE(point, heap, DYNAMIC_TYPE_TLSX);
  3105. }
  3106. (void)heap;
  3107. }
  3108. static int TLSX_SupportedCurve_Append(SupportedCurve* list, word16 name,
  3109. void* heap)
  3110. {
  3111. int ret = BAD_FUNC_ARG;
  3112. while (list) {
  3113. if (list->name == name) {
  3114. ret = 0; /* curve already in use */
  3115. break;
  3116. }
  3117. if (list->next == NULL) {
  3118. ret = TLSX_SupportedCurve_New(&list->next, name, heap);
  3119. break;
  3120. }
  3121. list = list->next;
  3122. }
  3123. return ret;
  3124. }
  3125. static int TLSX_PointFormat_Append(PointFormat* list, byte format, void* heap)
  3126. {
  3127. int ret = BAD_FUNC_ARG;
  3128. while (list) {
  3129. if (list->format == format) {
  3130. ret = 0; /* format already in use */
  3131. break;
  3132. }
  3133. if (list->next == NULL) {
  3134. ret = TLSX_PointFormat_New(&list->next, format, heap);
  3135. break;
  3136. }
  3137. list = list->next;
  3138. }
  3139. return ret;
  3140. }
  3141. #if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_CLIENT)
  3142. static void TLSX_SupportedCurve_ValidateRequest(WOLFSSL* ssl, byte* semaphore)
  3143. {
  3144. word16 i;
  3145. for (i = 0; i < ssl->suites->suiteSz; i+= 2) {
  3146. if (ssl->suites->suites[i] == TLS13_BYTE)
  3147. return;
  3148. if (ssl->suites->suites[i] == ECC_BYTE ||
  3149. ssl->suites->suites[i] == CHACHA_BYTE) {
  3150. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  3151. defined(HAVE_CURVE448)
  3152. return;
  3153. #endif
  3154. }
  3155. else {
  3156. #ifdef HAVE_FFDHE
  3157. return;
  3158. #endif
  3159. }
  3160. }
  3161. /* turns semaphore on to avoid sending this extension. */
  3162. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_GROUPS));
  3163. }
  3164. static void TLSX_PointFormat_ValidateRequest(WOLFSSL* ssl, byte* semaphore)
  3165. {
  3166. word16 i;
  3167. for (i = 0; i < ssl->suites->suiteSz; i+= 2) {
  3168. if (ssl->suites->suites[i] == TLS13_BYTE)
  3169. return;
  3170. if (ssl->suites->suites[i] == ECC_BYTE ||
  3171. ssl->suites->suites[i] == CHACHA_BYTE) {
  3172. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  3173. defined(HAVE_CURVE448)
  3174. return;
  3175. #endif
  3176. }
  3177. }
  3178. #ifdef HAVE_FFDHE
  3179. return;
  3180. #endif
  3181. /* turns semaphore on to avoid sending this extension. */
  3182. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
  3183. }
  3184. #endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
  3185. #ifndef NO_WOLFSSL_SERVER
  3186. static void TLSX_PointFormat_ValidateResponse(WOLFSSL* ssl, byte* semaphore)
  3187. {
  3188. #if defined(HAVE_FFDHE) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  3189. defined(HAVE_CURVE448)
  3190. (void)semaphore;
  3191. #endif
  3192. if (ssl->options.cipherSuite0 == TLS13_BYTE)
  3193. return;
  3194. if (ssl->options.cipherSuite0 == ECC_BYTE ||
  3195. ssl->options.cipherSuite0 == CHACHA_BYTE) {
  3196. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  3197. return;
  3198. #endif
  3199. }
  3200. else {
  3201. #ifdef HAVE_FFDHE
  3202. return;
  3203. #endif
  3204. }
  3205. #if !defined(HAVE_FFDHE) || (!defined(HAVE_ECC) && !defined(HAVE_CURVE25519) \
  3206. && !defined(HAVE_CURVE448))
  3207. /* turns semaphore on to avoid sending this extension. */
  3208. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
  3209. #endif
  3210. }
  3211. #endif /* !NO_WOLFSSL_SERVER */
  3212. #ifndef NO_WOLFSSL_CLIENT
  3213. static word16 TLSX_SupportedCurve_GetSize(SupportedCurve* list)
  3214. {
  3215. SupportedCurve* curve;
  3216. word16 length = OPAQUE16_LEN; /* list length */
  3217. while ((curve = list)) {
  3218. list = curve->next;
  3219. length += OPAQUE16_LEN; /* curve length */
  3220. }
  3221. return length;
  3222. }
  3223. #endif
  3224. static word16 TLSX_PointFormat_GetSize(PointFormat* list)
  3225. {
  3226. PointFormat* point;
  3227. word16 length = ENUM_LEN; /* list length */
  3228. while ((point = list)) {
  3229. list = point->next;
  3230. length += ENUM_LEN; /* format length */
  3231. }
  3232. return length;
  3233. }
  3234. #ifndef NO_WOLFSSL_CLIENT
  3235. static word16 TLSX_SupportedCurve_Write(SupportedCurve* list, byte* output)
  3236. {
  3237. word16 offset = OPAQUE16_LEN;
  3238. while (list) {
  3239. c16toa(list->name, output + offset);
  3240. offset += OPAQUE16_LEN;
  3241. list = list->next;
  3242. }
  3243. c16toa(offset - OPAQUE16_LEN, output); /* writing list length */
  3244. return offset;
  3245. }
  3246. #endif
  3247. static word16 TLSX_PointFormat_Write(PointFormat* list, byte* output)
  3248. {
  3249. word16 offset = ENUM_LEN;
  3250. while (list) {
  3251. output[offset++] = list->format;
  3252. list = list->next;
  3253. }
  3254. output[0] = (byte)(offset - ENUM_LEN);
  3255. return offset;
  3256. }
  3257. #if !defined(NO_WOLFSSL_SERVER) || (defined(WOLFSSL_TLS13) && \
  3258. !defined(WOLFSSL_NO_SERVER_GROUPS_EXT))
  3259. static int TLSX_SupportedCurve_Parse(WOLFSSL* ssl, byte* input, word16 length,
  3260. byte isRequest)
  3261. {
  3262. word16 offset;
  3263. word16 name;
  3264. int ret;
  3265. if(!isRequest && !IsAtLeastTLSv1_3(ssl->version)) {
  3266. #ifdef WOLFSSL_ALLOW_SERVER_SC_EXT
  3267. return 0;
  3268. #else
  3269. return BUFFER_ERROR; /* servers doesn't send this extension. */
  3270. #endif
  3271. }
  3272. if (OPAQUE16_LEN > length || length % OPAQUE16_LEN)
  3273. return BUFFER_ERROR;
  3274. ato16(input, &offset);
  3275. /* validating curve list length */
  3276. if (length != OPAQUE16_LEN + offset)
  3277. return BUFFER_ERROR;
  3278. offset = OPAQUE16_LEN;
  3279. if (offset == length)
  3280. return 0;
  3281. #if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_SERVER_GROUPS_EXT)
  3282. if (!isRequest) {
  3283. TLSX* extension;
  3284. SupportedCurve* curve;
  3285. extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
  3286. if (extension != NULL) {
  3287. /* Replace client list with server list of supported groups. */
  3288. curve = (SupportedCurve*)extension->data;
  3289. extension->data = NULL;
  3290. TLSX_SupportedCurve_FreeAll(curve, ssl->heap);
  3291. ato16(input + offset, &name);
  3292. offset += OPAQUE16_LEN;
  3293. ret = TLSX_SupportedCurve_New(&curve, name, ssl->heap);
  3294. if (ret != 0)
  3295. return ret; /* throw error */
  3296. extension->data = (void*)curve;
  3297. }
  3298. }
  3299. #endif
  3300. for (; offset < length; offset += OPAQUE16_LEN) {
  3301. ato16(input + offset, &name);
  3302. ret = TLSX_UseSupportedCurve(&ssl->extensions, name, ssl->heap);
  3303. if (ret != WOLFSSL_SUCCESS)
  3304. return ret; /* throw error */
  3305. }
  3306. return 0;
  3307. }
  3308. #endif
  3309. #if !defined(NO_WOLFSSL_SERVER)
  3310. #if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_SERVER_GROUPS_EXT)
  3311. /* Checks the priority of the groups on the server and set the supported groups
  3312. * response if there is a group not advertised by the client that is preferred.
  3313. *
  3314. * ssl SSL/TLS object.
  3315. * returns 0 on success, otherwise an error.
  3316. */
  3317. int TLSX_SupportedCurve_CheckPriority(WOLFSSL* ssl)
  3318. {
  3319. int ret;
  3320. TLSX* extension;
  3321. TLSX* priority = NULL;
  3322. TLSX* ext = NULL;
  3323. word16 name;
  3324. SupportedCurve* curve;
  3325. extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
  3326. /* May be doing PSK with no key exchange. */
  3327. if (extension == NULL)
  3328. return 0;
  3329. if ((ret = TLSX_PopulateSupportedGroups(ssl, &priority)) != WOLFSSL_SUCCESS)
  3330. return ret;
  3331. ext = TLSX_Find(priority, TLSX_SUPPORTED_GROUPS);
  3332. if (ext == NULL) {
  3333. WOLFSSL_MSG("Could not find supported groups extension");
  3334. return 0;
  3335. }
  3336. curve = (SupportedCurve*)ext->data;
  3337. name = curve->name;
  3338. curve = (SupportedCurve*)extension->data;
  3339. while (curve != NULL) {
  3340. if (curve->name == name)
  3341. break;
  3342. curve = curve->next;
  3343. }
  3344. if (curve == NULL) {
  3345. /* Couldn't find the preferred group in client list. */
  3346. extension->resp = 1;
  3347. /* Send server list back and free client list. */
  3348. curve = (SupportedCurve*)extension->data;
  3349. extension->data = ext->data;
  3350. ext->data = curve;
  3351. }
  3352. TLSX_FreeAll(priority, ssl->heap);
  3353. return 0;
  3354. }
  3355. #endif /* WOLFSSL_TLS13 && !WOLFSSL_NO_SERVER_GROUPS_EXT */
  3356. #if defined(HAVE_FFDHE) && !defined(WOLFSSL_NO_TLS12)
  3357. /* Set the highest priority common FFDHE group on the server as compared to
  3358. * client extensions.
  3359. *
  3360. * ssl SSL/TLS object.
  3361. * returns 0 on success, otherwise an error.
  3362. */
  3363. int TLSX_SupportedFFDHE_Set(WOLFSSL* ssl)
  3364. {
  3365. int ret = 0;
  3366. TLSX* extension;
  3367. TLSX* priority = NULL;
  3368. TLSX* ext = NULL;
  3369. SupportedCurve* serverGroup;
  3370. SupportedCurve* clientGroup;
  3371. SupportedCurve* group;
  3372. const DhParams* params = NULL;
  3373. int found = 0;
  3374. extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
  3375. /* May be doing PSK with no key exchange. */
  3376. if (extension == NULL)
  3377. return 0;
  3378. clientGroup = (SupportedCurve*)extension->data;
  3379. for (group = clientGroup; group != NULL; group = group->next) {
  3380. if (group->name >= MIN_FFHDE_GROUP && group->name <= MAX_FFHDE_GROUP) {
  3381. found = 1;
  3382. break;
  3383. }
  3384. }
  3385. if (!found)
  3386. return 0;
  3387. if (ssl->buffers.serverDH_P.buffer && ssl->buffers.weOwnDH) {
  3388. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  3389. DYNAMIC_TYPE_PUBLIC_KEY);
  3390. }
  3391. if (ssl->buffers.serverDH_G.buffer && ssl->buffers.weOwnDH) {
  3392. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  3393. DYNAMIC_TYPE_PUBLIC_KEY);
  3394. }
  3395. ssl->buffers.serverDH_P.buffer = NULL;
  3396. ssl->buffers.serverDH_G.buffer = NULL;
  3397. ssl->buffers.weOwnDH = 0;
  3398. ssl->options.haveDH = 0;
  3399. if ((ret = TLSX_PopulateSupportedGroups(ssl, &priority)) != WOLFSSL_SUCCESS) {
  3400. TLSX_FreeAll(priority, ssl->heap);
  3401. return ret;
  3402. }
  3403. ret = 0;
  3404. ext = TLSX_Find(priority, TLSX_SUPPORTED_GROUPS);
  3405. serverGroup = (SupportedCurve*)ext->data;
  3406. for (; serverGroup != NULL; serverGroup = serverGroup->next) {
  3407. if ((serverGroup->name & NAMED_DH_MASK) != NAMED_DH_MASK)
  3408. continue;
  3409. for (group = clientGroup; group != NULL; group = group->next) {
  3410. if (serverGroup->name != group->name)
  3411. continue;
  3412. switch (serverGroup->name) {
  3413. #ifdef HAVE_FFDHE_2048
  3414. case WOLFSSL_FFDHE_2048:
  3415. params = wc_Dh_ffdhe2048_Get();
  3416. break;
  3417. #endif
  3418. #ifdef HAVE_FFDHE_3072
  3419. case WOLFSSL_FFDHE_3072:
  3420. params = wc_Dh_ffdhe3072_Get();
  3421. break;
  3422. #endif
  3423. #ifdef HAVE_FFDHE_4096
  3424. case WOLFSSL_FFDHE_4096:
  3425. params = wc_Dh_ffdhe4096_Get();
  3426. break;
  3427. #endif
  3428. #ifdef HAVE_FFDHE_6144
  3429. case WOLFSSL_FFDHE_6144:
  3430. params = wc_Dh_ffdhe6144_Get();
  3431. break;
  3432. #endif
  3433. #ifdef HAVE_FFDHE_8192
  3434. case WOLFSSL_FFDHE_8192:
  3435. params = wc_Dh_ffdhe8192_Get();
  3436. break;
  3437. #endif
  3438. }
  3439. if (params == NULL)
  3440. return BAD_FUNC_ARG;
  3441. if (params->p_len >= ssl->options.minDhKeySz &&
  3442. params->p_len <= ssl->options.maxDhKeySz) {
  3443. break;
  3444. }
  3445. }
  3446. if (group != NULL && serverGroup->name == group->name)
  3447. break;
  3448. }
  3449. if (serverGroup) {
  3450. ssl->buffers.serverDH_P.buffer = (unsigned char *)params->p;
  3451. ssl->buffers.serverDH_P.length = params->p_len;
  3452. ssl->buffers.serverDH_G.buffer = (unsigned char *)params->g;
  3453. ssl->buffers.serverDH_G.length = params->g_len;
  3454. ssl->namedGroup = serverGroup->name;
  3455. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
  3456. !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  3457. ssl->options.dhDoKeyTest = 0;
  3458. #endif
  3459. ssl->options.haveDH = 1;
  3460. }
  3461. TLSX_FreeAll(priority, ssl->heap);
  3462. return ret;
  3463. }
  3464. #endif /* HAVE_FFDHE && !WOLFSSL_NO_TLS12 */
  3465. #endif /* !NO_WOLFSSL_SERVER */
  3466. #if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_SERVER_GROUPS_EXT)
  3467. /* Return the preferred group.
  3468. *
  3469. * ssl SSL/TLS object.
  3470. * checkSupported Whether to check for the first supported group.
  3471. * returns BAD_FUNC_ARG if no group found, otherwise the group.
  3472. */
  3473. int TLSX_SupportedCurve_Preferred(WOLFSSL* ssl, int checkSupported)
  3474. {
  3475. TLSX* extension;
  3476. SupportedCurve* curve;
  3477. extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
  3478. if (extension == NULL)
  3479. return BAD_FUNC_ARG;
  3480. curve = (SupportedCurve*)extension->data;
  3481. while (curve != NULL) {
  3482. if (!checkSupported || TLSX_KeyShare_IsSupported(curve->name))
  3483. return curve->name;
  3484. curve = curve->next;
  3485. }
  3486. return BAD_FUNC_ARG;
  3487. }
  3488. #endif /* HAVE_SUPPORTED_CURVES */
  3489. #ifndef NO_WOLFSSL_SERVER
  3490. static int TLSX_PointFormat_Parse(WOLFSSL* ssl, byte* input, word16 length,
  3491. byte isRequest)
  3492. {
  3493. int ret;
  3494. /* validating formats list length */
  3495. if (ENUM_LEN > length || length != (word16)ENUM_LEN + input[0])
  3496. return BUFFER_ERROR;
  3497. if (isRequest) {
  3498. /* adding uncompressed point format to response */
  3499. ret = TLSX_UsePointFormat(&ssl->extensions, WOLFSSL_EC_PF_UNCOMPRESSED,
  3500. ssl->heap);
  3501. if (ret != WOLFSSL_SUCCESS)
  3502. return ret; /* throw error */
  3503. TLSX_SetResponse(ssl, TLSX_EC_POINT_FORMATS);
  3504. }
  3505. return 0;
  3506. }
  3507. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  3508. int TLSX_ValidateSupportedCurves(WOLFSSL* ssl, byte first, byte second) {
  3509. TLSX* extension = NULL;
  3510. SupportedCurve* curve = NULL;
  3511. word32 oid = 0;
  3512. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_ED25519) || \
  3513. defined(HAVE_CURVE448) || defined(HAVE_ED448) || \
  3514. (!defined(NO_RSA) && defined(WOLFSSL_STATIC_DH))
  3515. word32 pkOid = 0;
  3516. #endif /* HAVE_ECC || HAVE_ED25519 || HAVE_ED448 || (!NO_RSA && STATIC_DH) */
  3517. word32 defOid = 0;
  3518. word32 defSz = 80; /* Maximum known curve size is 66. */
  3519. word32 nextOid = 0;
  3520. word32 nextSz = 80; /* Maximum known curve size is 66. */
  3521. word32 currOid = ssl->ecdhCurveOID;
  3522. int ephmSuite = 0;
  3523. word16 octets = 0; /* according to 'ecc_set_type ecc_sets[];' */
  3524. int sig = 0; /* validate signature */
  3525. int key = 0; /* validate key */
  3526. (void)oid;
  3527. (void)pkOid;
  3528. if (first == CHACHA_BYTE) {
  3529. switch (second) {
  3530. case TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
  3531. case TLS_PSK_WITH_CHACHA20_POLY1305_SHA256:
  3532. case TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
  3533. case TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256:
  3534. return 1; /* no suite restriction */
  3535. case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
  3536. case TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256:
  3537. case TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
  3538. break;
  3539. }
  3540. }
  3541. if (first == ECC_BYTE || first == CHACHA_BYTE)
  3542. extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
  3543. if (!extension)
  3544. return 1; /* no suite restriction */
  3545. for (curve = (SupportedCurve*)extension->data;
  3546. curve && !(sig && key);
  3547. curve = curve->next) {
  3548. #ifdef OPENSSL_EXTRA
  3549. /* skip if name is not in supported ECC range */
  3550. if (curve->name > WOLFSSL_ECC_X448)
  3551. continue;
  3552. /* skip if curve is disabled by user */
  3553. if (ssl->ctx->disabledCurves & (1 << curve->name))
  3554. continue;
  3555. #endif
  3556. /* find supported curve */
  3557. switch (curve->name) {
  3558. #ifdef HAVE_ECC
  3559. #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
  3560. #ifndef NO_ECC_SECP
  3561. case WOLFSSL_ECC_SECP160R1:
  3562. pkOid = oid = ECC_SECP160R1_OID;
  3563. octets = 20;
  3564. break;
  3565. #endif /* !NO_ECC_SECP */
  3566. #ifdef HAVE_ECC_SECPR2
  3567. case WOLFSSL_ECC_SECP160R2:
  3568. pkOid = oid = ECC_SECP160R2_OID;
  3569. octets = 20;
  3570. break;
  3571. #endif /* HAVE_ECC_SECPR2 */
  3572. #ifdef HAVE_ECC_KOBLITZ
  3573. case WOLFSSL_ECC_SECP160K1:
  3574. pkOid = oid = ECC_SECP160K1_OID;
  3575. octets = 20;
  3576. break;
  3577. #endif /* HAVE_ECC_KOBLITZ */
  3578. #endif
  3579. #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
  3580. #ifndef NO_ECC_SECP
  3581. case WOLFSSL_ECC_SECP192R1:
  3582. pkOid = oid = ECC_SECP192R1_OID;
  3583. octets = 24;
  3584. break;
  3585. #endif /* !NO_ECC_SECP */
  3586. #ifdef HAVE_ECC_KOBLITZ
  3587. case WOLFSSL_ECC_SECP192K1:
  3588. pkOid = oid = ECC_SECP192K1_OID;
  3589. octets = 24;
  3590. break;
  3591. #endif /* HAVE_ECC_KOBLITZ */
  3592. #endif
  3593. #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
  3594. #ifndef NO_ECC_SECP
  3595. case WOLFSSL_ECC_SECP224R1:
  3596. pkOid = oid = ECC_SECP224R1_OID;
  3597. octets = 28;
  3598. break;
  3599. #endif /* !NO_ECC_SECP */
  3600. #ifdef HAVE_ECC_KOBLITZ
  3601. case WOLFSSL_ECC_SECP224K1:
  3602. pkOid = oid = ECC_SECP224K1_OID;
  3603. octets = 28;
  3604. break;
  3605. #endif /* HAVE_ECC_KOBLITZ */
  3606. #endif
  3607. #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
  3608. #ifndef NO_ECC_SECP
  3609. case WOLFSSL_ECC_SECP256R1:
  3610. pkOid = oid = ECC_SECP256R1_OID;
  3611. octets = 32;
  3612. break;
  3613. #endif /* !NO_ECC_SECP */
  3614. #endif /* !NO_ECC256 || HAVE_ALL_CURVES */
  3615. #endif
  3616. #if (defined(HAVE_CURVE25519) || defined(HAVE_ED25519)) && ECC_MIN_KEY_SZ <= 256
  3617. case WOLFSSL_ECC_X25519:
  3618. oid = ECC_X25519_OID;
  3619. #ifdef HAVE_ED25519
  3620. pkOid = ECC_ED25519_OID;
  3621. #else
  3622. pkOid = ECC_X25519_OID;
  3623. #endif
  3624. octets = 32;
  3625. break;
  3626. #endif /* HAVE_CURVE25519 */
  3627. #ifdef HAVE_ECC
  3628. #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
  3629. #ifdef HAVE_ECC_KOBLITZ
  3630. case WOLFSSL_ECC_SECP256K1:
  3631. pkOid = oid = ECC_SECP256K1_OID;
  3632. octets = 32;
  3633. break;
  3634. #endif /* HAVE_ECC_KOBLITZ */
  3635. #ifdef HAVE_ECC_BRAINPOOL
  3636. case WOLFSSL_ECC_BRAINPOOLP256R1:
  3637. pkOid = oid = ECC_BRAINPOOLP256R1_OID;
  3638. octets = 32;
  3639. break;
  3640. #endif /* HAVE_ECC_BRAINPOOL */
  3641. #endif
  3642. #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
  3643. #ifndef NO_ECC_SECP
  3644. case WOLFSSL_ECC_SECP384R1:
  3645. pkOid = oid = ECC_SECP384R1_OID;
  3646. octets = 48;
  3647. break;
  3648. #endif /* !NO_ECC_SECP */
  3649. #ifdef HAVE_ECC_BRAINPOOL
  3650. case WOLFSSL_ECC_BRAINPOOLP384R1:
  3651. pkOid = oid = ECC_BRAINPOOLP384R1_OID;
  3652. octets = 48;
  3653. break;
  3654. #endif /* HAVE_ECC_BRAINPOOL */
  3655. #endif
  3656. #endif
  3657. #if (defined(HAVE_CURVE448) || defined(HAVE_ED448)) && ECC_MIN_KEY_SZ <= 448
  3658. case WOLFSSL_ECC_X448:
  3659. oid = ECC_X448_OID;
  3660. #ifdef HAVE_ED448
  3661. pkOid = ECC_ED448_OID;
  3662. #else
  3663. pkOid = ECC_X448_OID;
  3664. #endif
  3665. octets = 57;
  3666. break;
  3667. #endif /* HAVE_CURVE448 */
  3668. #ifdef HAVE_ECC
  3669. #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
  3670. #ifdef HAVE_ECC_BRAINPOOL
  3671. case WOLFSSL_ECC_BRAINPOOLP512R1:
  3672. pkOid = oid = ECC_BRAINPOOLP512R1_OID;
  3673. octets = 64;
  3674. break;
  3675. #endif /* HAVE_ECC_BRAINPOOL */
  3676. #endif
  3677. #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
  3678. #ifndef NO_ECC_SECP
  3679. case WOLFSSL_ECC_SECP521R1:
  3680. pkOid = oid = ECC_SECP521R1_OID;
  3681. octets = 66;
  3682. break;
  3683. #endif /* !NO_ECC_SECP */
  3684. #endif
  3685. #endif
  3686. default: continue; /* unsupported curve */
  3687. }
  3688. #ifdef HAVE_ECC
  3689. /* Set default Oid */
  3690. if (defOid == 0 && ssl->eccTempKeySz <= octets && defSz > octets) {
  3691. defOid = oid;
  3692. defSz = octets;
  3693. }
  3694. /* The eccTempKeySz is the preferred ephemeral key size */
  3695. if (currOid == 0 && ssl->eccTempKeySz == octets)
  3696. currOid = oid;
  3697. if ((nextOid == 0 || nextSz > octets) && ssl->eccTempKeySz <= octets) {
  3698. nextOid = oid;
  3699. nextSz = octets;
  3700. }
  3701. #else
  3702. if (defOid == 0 && defSz > octets) {
  3703. defOid = oid;
  3704. defSz = octets;
  3705. }
  3706. if (currOid == 0)
  3707. currOid = oid;
  3708. if (nextOid == 0 || nextSz > octets) {
  3709. nextOid = oid;
  3710. nextSz = octets;
  3711. }
  3712. #endif
  3713. if (first == ECC_BYTE) {
  3714. switch (second) {
  3715. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  3716. /* ECDHE_ECDSA */
  3717. case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA:
  3718. case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA:
  3719. case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA:
  3720. case TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA:
  3721. case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:
  3722. case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384:
  3723. case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
  3724. case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:
  3725. case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8:
  3726. case TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8:
  3727. sig |= ssl->pkCurveOID == pkOid;
  3728. key |= ssl->ecdhCurveOID == oid;
  3729. ephmSuite = 1;
  3730. break;
  3731. #ifdef WOLFSSL_STATIC_DH
  3732. /* ECDH_ECDSA */
  3733. case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA:
  3734. case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA:
  3735. case TLS_ECDH_ECDSA_WITH_RC4_128_SHA:
  3736. case TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA:
  3737. case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256:
  3738. case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384:
  3739. case TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256:
  3740. case TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384:
  3741. if (oid == ECC_X25519_OID && defOid == oid) {
  3742. defOid = 0;
  3743. defSz = 80;
  3744. }
  3745. if (oid == ECC_X448_OID && defOid == oid) {
  3746. defOid = 0;
  3747. defSz = 80;
  3748. }
  3749. sig |= ssl->pkCurveOID == pkOid;
  3750. key |= ssl->pkCurveOID == oid;
  3751. break;
  3752. #endif /* WOLFSSL_STATIC_DH */
  3753. #endif /* HAVE_ECC || HAVE_ED25519 || HAVE_ED448 */
  3754. #ifndef NO_RSA
  3755. /* ECDHE_RSA */
  3756. case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA:
  3757. case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA:
  3758. case TLS_ECDHE_RSA_WITH_RC4_128_SHA:
  3759. case TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA:
  3760. case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:
  3761. case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384:
  3762. case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:
  3763. case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:
  3764. sig = 1;
  3765. key |= ssl->ecdhCurveOID == oid;
  3766. ephmSuite = 1;
  3767. break;
  3768. #ifdef WOLFSSL_STATIC_DH
  3769. /* ECDH_RSA */
  3770. case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA:
  3771. case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA:
  3772. case TLS_ECDH_RSA_WITH_RC4_128_SHA:
  3773. case TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA:
  3774. case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256:
  3775. case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384:
  3776. case TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256:
  3777. case TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384:
  3778. if (oid == ECC_X25519_OID && defOid == oid) {
  3779. defOid = 0;
  3780. defSz = 80;
  3781. }
  3782. if (oid == ECC_X448_OID && defOid == oid) {
  3783. defOid = 0;
  3784. defSz = 80;
  3785. }
  3786. sig = 1;
  3787. key |= ssl->pkCurveOID == pkOid;
  3788. break;
  3789. #endif /* WOLFSSL_STATIC_DH */
  3790. #endif
  3791. default:
  3792. if (oid == ECC_X25519_OID && defOid == oid) {
  3793. defOid = 0;
  3794. defSz = 80;
  3795. }
  3796. if (oid == ECC_X448_OID && defOid == oid) {
  3797. defOid = 0;
  3798. defSz = 80;
  3799. }
  3800. if (oid != ECC_X25519_OID && oid != ECC_X448_OID) {
  3801. sig = 1;
  3802. }
  3803. key = 1;
  3804. break;
  3805. }
  3806. }
  3807. /* ChaCha20-Poly1305 ECC cipher suites */
  3808. if (first == CHACHA_BYTE) {
  3809. switch (second) {
  3810. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  3811. /* ECDHE_ECDSA */
  3812. case TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 :
  3813. case TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
  3814. sig |= ssl->pkCurveOID == pkOid;
  3815. key |= ssl->ecdhCurveOID == oid;
  3816. ephmSuite = 1;
  3817. break;
  3818. #endif /* HAVE_ECC || HAVE_ED25519 || HAVE_ED448 */
  3819. #ifndef NO_RSA
  3820. /* ECDHE_RSA */
  3821. case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 :
  3822. case TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
  3823. sig = 1;
  3824. key |= ssl->ecdhCurveOID == oid;
  3825. ephmSuite = 1;
  3826. break;
  3827. #endif
  3828. default:
  3829. sig = 1;
  3830. key = 1;
  3831. break;
  3832. }
  3833. }
  3834. }
  3835. /* Choose the default if it is at the required strength. */
  3836. #ifdef HAVE_ECC
  3837. if (ssl->ecdhCurveOID == 0 && defSz == ssl->eccTempKeySz)
  3838. #else
  3839. if (ssl->ecdhCurveOID == 0)
  3840. #endif
  3841. {
  3842. key = 1;
  3843. ssl->ecdhCurveOID = defOid;
  3844. }
  3845. /* Choose any curve at the required strength. */
  3846. if (ssl->ecdhCurveOID == 0) {
  3847. key = 1;
  3848. ssl->ecdhCurveOID = currOid;
  3849. }
  3850. /* Choose the default if it is at the next highest strength. */
  3851. if (ssl->ecdhCurveOID == 0 && defSz == nextSz)
  3852. ssl->ecdhCurveOID = defOid;
  3853. /* Choose any curve at the next highest strength. */
  3854. if (ssl->ecdhCurveOID == 0)
  3855. ssl->ecdhCurveOID = nextOid;
  3856. /* No curve and ephemeral ECC suite requires a matching curve. */
  3857. if (ssl->ecdhCurveOID == 0 && ephmSuite)
  3858. key = 0;
  3859. return sig && key;
  3860. }
  3861. #endif
  3862. #endif /* NO_WOLFSSL_SERVER */
  3863. int TLSX_UseSupportedCurve(TLSX** extensions, word16 name, void* heap)
  3864. {
  3865. TLSX* extension = NULL;
  3866. SupportedCurve* curve = NULL;
  3867. int ret;
  3868. if (extensions == NULL)
  3869. return BAD_FUNC_ARG;
  3870. extension = TLSX_Find(*extensions, TLSX_SUPPORTED_GROUPS);
  3871. if (!extension) {
  3872. ret = TLSX_SupportedCurve_New(&curve, name, heap);
  3873. if (ret != 0)
  3874. return ret;
  3875. ret = TLSX_Push(extensions, TLSX_SUPPORTED_GROUPS, curve, heap);
  3876. if (ret != 0) {
  3877. XFREE(curve, heap, DYNAMIC_TYPE_TLSX);
  3878. return ret;
  3879. }
  3880. }
  3881. else {
  3882. ret = TLSX_SupportedCurve_Append((SupportedCurve*)extension->data, name,
  3883. heap);
  3884. if (ret != 0)
  3885. return ret;
  3886. }
  3887. return WOLFSSL_SUCCESS;
  3888. }
  3889. int TLSX_UsePointFormat(TLSX** extensions, byte format, void* heap)
  3890. {
  3891. TLSX* extension = NULL;
  3892. PointFormat* point = NULL;
  3893. int ret = 0;
  3894. if (extensions == NULL)
  3895. return BAD_FUNC_ARG;
  3896. extension = TLSX_Find(*extensions, TLSX_EC_POINT_FORMATS);
  3897. if (!extension) {
  3898. ret = TLSX_PointFormat_New(&point, format, heap);
  3899. if (ret != 0)
  3900. return ret;
  3901. ret = TLSX_Push(extensions, TLSX_EC_POINT_FORMATS, point, heap);
  3902. if (ret != 0) {
  3903. XFREE(point, heap, DYNAMIC_TYPE_TLSX);
  3904. return ret;
  3905. }
  3906. }
  3907. else {
  3908. ret = TLSX_PointFormat_Append((PointFormat*)extension->data, format,
  3909. heap);
  3910. if (ret != 0)
  3911. return ret;
  3912. }
  3913. return WOLFSSL_SUCCESS;
  3914. }
  3915. #define EC_FREE_ALL TLSX_SupportedCurve_FreeAll
  3916. #define EC_VALIDATE_REQUEST TLSX_SupportedCurve_ValidateRequest
  3917. #ifndef NO_WOLFSSL_CLIENT
  3918. #define EC_GET_SIZE TLSX_SupportedCurve_GetSize
  3919. #define EC_WRITE TLSX_SupportedCurve_Write
  3920. #else
  3921. #define EC_GET_SIZE(list) 0
  3922. #define EC_WRITE(a, b) 0
  3923. #endif
  3924. #if !defined(NO_WOLFSSL_SERVER) || (defined(WOLFSSL_TLS13) && \
  3925. !defined(WOLFSSL_NO_SERVER_GROUPS_EXT))
  3926. #define EC_PARSE TLSX_SupportedCurve_Parse
  3927. #else
  3928. #define EC_PARSE(a, b, c, d) 0
  3929. #endif
  3930. #define PF_FREE_ALL TLSX_PointFormat_FreeAll
  3931. #define PF_VALIDATE_REQUEST TLSX_PointFormat_ValidateRequest
  3932. #define PF_VALIDATE_RESPONSE TLSX_PointFormat_ValidateResponse
  3933. #define PF_GET_SIZE TLSX_PointFormat_GetSize
  3934. #define PF_WRITE TLSX_PointFormat_Write
  3935. #ifndef NO_WOLFSSL_SERVER
  3936. #define PF_PARSE TLSX_PointFormat_Parse
  3937. #else
  3938. #define PF_PARSE(a, b, c, d) 0
  3939. #endif
  3940. #else
  3941. #define EC_FREE_ALL(list, heap)
  3942. #define EC_GET_SIZE(list) 0
  3943. #define EC_WRITE(a, b) 0
  3944. #define EC_PARSE(a, b, c, d) 0
  3945. #define EC_VALIDATE_REQUEST(a, b)
  3946. #define PF_FREE_ALL(list, heap)
  3947. #define PF_GET_SIZE(list) 0
  3948. #define PF_WRITE(a, b) 0
  3949. #define PF_PARSE(a, b, c, d) 0
  3950. #define PF_VALIDATE_REQUEST(a, b)
  3951. #define PF_VALIDATE_RESPONSE(a, b)
  3952. #endif /* HAVE_SUPPORTED_CURVES */
  3953. /******************************************************************************/
  3954. /* Renegotiation Indication */
  3955. /******************************************************************************/
  3956. #if defined(HAVE_SECURE_RENEGOTIATION) \
  3957. || defined(HAVE_SERVER_RENEGOTIATION_INFO)
  3958. static byte TLSX_SecureRenegotiation_GetSize(SecureRenegotiation* data,
  3959. int isRequest)
  3960. {
  3961. byte length = OPAQUE8_LEN; /* empty info length */
  3962. /* data will be NULL for HAVE_SERVER_RENEGOTIATION_INFO only */
  3963. if (data && data->enabled && data->verifySet) {
  3964. /* client sends client_verify_data only */
  3965. length += TLS_FINISHED_SZ;
  3966. /* server also sends server_verify_data */
  3967. if (!isRequest)
  3968. length += TLS_FINISHED_SZ;
  3969. }
  3970. return length;
  3971. }
  3972. static word16 TLSX_SecureRenegotiation_Write(SecureRenegotiation* data,
  3973. byte* output, int isRequest)
  3974. {
  3975. word16 offset = OPAQUE8_LEN; /* RenegotiationInfo length */
  3976. if (data && data->enabled && data->verifySet) {
  3977. /* client sends client_verify_data only */
  3978. XMEMCPY(output + offset, data->client_verify_data, TLS_FINISHED_SZ);
  3979. offset += TLS_FINISHED_SZ;
  3980. /* server also sends server_verify_data */
  3981. if (!isRequest) {
  3982. XMEMCPY(output + offset, data->server_verify_data, TLS_FINISHED_SZ);
  3983. offset += TLS_FINISHED_SZ;
  3984. }
  3985. }
  3986. output[0] = (byte)(offset - 1); /* info length - self */
  3987. return offset;
  3988. }
  3989. static int TLSX_SecureRenegotiation_Parse(WOLFSSL* ssl, byte* input,
  3990. word16 length, byte isRequest)
  3991. {
  3992. int ret = SECURE_RENEGOTIATION_E;
  3993. if (length >= OPAQUE8_LEN) {
  3994. if (isRequest) {
  3995. #ifndef NO_WOLFSSL_SERVER
  3996. if (ssl->secure_renegotiation == NULL) {
  3997. ret = wolfSSL_UseSecureRenegotiation(ssl);
  3998. if (ret == WOLFSSL_SUCCESS)
  3999. ret = 0;
  4000. }
  4001. if (ret != 0 && ret != SECURE_RENEGOTIATION_E) {
  4002. }
  4003. else if (!ssl->secure_renegotiation->enabled) {
  4004. if (*input == 0) {
  4005. input++; /* get past size */
  4006. ssl->secure_renegotiation->enabled = 1;
  4007. TLSX_SetResponse(ssl, TLSX_RENEGOTIATION_INFO);
  4008. ret = 0;
  4009. }
  4010. else {
  4011. /* already in error state */
  4012. WOLFSSL_MSG("SCR client verify data present");
  4013. }
  4014. }
  4015. else if (*input == TLS_FINISHED_SZ) {
  4016. if (length < TLS_FINISHED_SZ + 1) {
  4017. WOLFSSL_MSG("SCR malformed buffer");
  4018. ret = BUFFER_E;
  4019. }
  4020. else {
  4021. input++; /* get past size */
  4022. /* validate client verify data */
  4023. if (XMEMCMP(input,
  4024. ssl->secure_renegotiation->client_verify_data,
  4025. TLS_FINISHED_SZ) == 0) {
  4026. WOLFSSL_MSG("SCR client verify data match");
  4027. TLSX_SetResponse(ssl, TLSX_RENEGOTIATION_INFO);
  4028. ret = 0; /* verified */
  4029. } else {
  4030. /* already in error state */
  4031. WOLFSSL_MSG("SCR client verify data Failure");
  4032. }
  4033. }
  4034. }
  4035. #endif
  4036. }
  4037. else if (ssl->secure_renegotiation != NULL) {
  4038. #ifndef NO_WOLFSSL_CLIENT
  4039. if (!ssl->secure_renegotiation->enabled) {
  4040. if (*input == 0) {
  4041. ssl->secure_renegotiation->enabled = 1;
  4042. ret = 0;
  4043. }
  4044. }
  4045. else if (*input == 2 * TLS_FINISHED_SZ &&
  4046. length == 2 * TLS_FINISHED_SZ + OPAQUE8_LEN) {
  4047. input++; /* get past size */
  4048. /* validate client and server verify data */
  4049. if (XMEMCMP(input,
  4050. ssl->secure_renegotiation->client_verify_data,
  4051. TLS_FINISHED_SZ) == 0 &&
  4052. XMEMCMP(input + TLS_FINISHED_SZ,
  4053. ssl->secure_renegotiation->server_verify_data,
  4054. TLS_FINISHED_SZ) == 0) {
  4055. WOLFSSL_MSG("SCR client and server verify data match");
  4056. ret = 0; /* verified */
  4057. } else {
  4058. /* already in error state */
  4059. WOLFSSL_MSG("SCR client and server verify data Failure");
  4060. }
  4061. }
  4062. #endif
  4063. }
  4064. }
  4065. if (ret != 0) {
  4066. SendAlert(ssl, alert_fatal, handshake_failure);
  4067. }
  4068. return ret;
  4069. }
  4070. int TLSX_UseSecureRenegotiation(TLSX** extensions, void* heap)
  4071. {
  4072. int ret = 0;
  4073. SecureRenegotiation* data;
  4074. data = (SecureRenegotiation*)XMALLOC(sizeof(SecureRenegotiation), heap,
  4075. DYNAMIC_TYPE_TLSX);
  4076. if (data == NULL)
  4077. return MEMORY_E;
  4078. XMEMSET(data, 0, sizeof(SecureRenegotiation));
  4079. ret = TLSX_Push(extensions, TLSX_RENEGOTIATION_INFO, data, heap);
  4080. if (ret != 0) {
  4081. XFREE(data, heap, DYNAMIC_TYPE_TLSX);
  4082. return ret;
  4083. }
  4084. return WOLFSSL_SUCCESS;
  4085. }
  4086. #ifdef HAVE_SERVER_RENEGOTIATION_INFO
  4087. int TLSX_AddEmptyRenegotiationInfo(TLSX** extensions, void* heap)
  4088. {
  4089. int ret;
  4090. /* send empty renegotiation_info extension */
  4091. TLSX* ext = TLSX_Find(*extensions, TLSX_RENEGOTIATION_INFO);
  4092. if (ext == NULL) {
  4093. ret = TLSX_UseSecureRenegotiation(extensions, heap);
  4094. if (ret != WOLFSSL_SUCCESS)
  4095. return ret;
  4096. ext = TLSX_Find(*extensions, TLSX_RENEGOTIATION_INFO);
  4097. }
  4098. if (ext)
  4099. ext->resp = 1;
  4100. return WOLFSSL_SUCCESS;
  4101. }
  4102. #endif /* HAVE_SERVER_RENEGOTIATION_INFO */
  4103. #define SCR_FREE_ALL(data, heap) XFREE(data, (heap), DYNAMIC_TYPE_TLSX)
  4104. #define SCR_GET_SIZE TLSX_SecureRenegotiation_GetSize
  4105. #define SCR_WRITE TLSX_SecureRenegotiation_Write
  4106. #define SCR_PARSE TLSX_SecureRenegotiation_Parse
  4107. #else
  4108. #define SCR_FREE_ALL(a, heap)
  4109. #define SCR_GET_SIZE(a, b) 0
  4110. #define SCR_WRITE(a, b, c) 0
  4111. #define SCR_PARSE(a, b, c, d) 0
  4112. #endif /* HAVE_SECURE_RENEGOTIATION */
  4113. /******************************************************************************/
  4114. /* Session Tickets */
  4115. /******************************************************************************/
  4116. #ifdef HAVE_SESSION_TICKET
  4117. #if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_CLIENT)
  4118. static void TLSX_SessionTicket_ValidateRequest(WOLFSSL* ssl)
  4119. {
  4120. TLSX* extension = TLSX_Find(ssl->extensions, TLSX_SESSION_TICKET);
  4121. SessionTicket* ticket = extension ?
  4122. (SessionTicket*)extension->data : NULL;
  4123. if (ticket) {
  4124. /* TODO validate ticket timeout here! */
  4125. if (ticket->lifetime == 0xfffffff) {
  4126. /* send empty ticket on timeout */
  4127. TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
  4128. }
  4129. }
  4130. }
  4131. #endif /* WLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
  4132. static word16 TLSX_SessionTicket_GetSize(SessionTicket* ticket, int isRequest)
  4133. {
  4134. (void)isRequest;
  4135. return ticket ? ticket->size : 0;
  4136. }
  4137. static word16 TLSX_SessionTicket_Write(SessionTicket* ticket, byte* output,
  4138. int isRequest)
  4139. {
  4140. word16 offset = 0; /* empty ticket */
  4141. if (isRequest && ticket) {
  4142. XMEMCPY(output + offset, ticket->data, ticket->size);
  4143. offset += ticket->size;
  4144. }
  4145. return offset;
  4146. }
  4147. static int TLSX_SessionTicket_Parse(WOLFSSL* ssl, byte* input, word16 length,
  4148. byte isRequest)
  4149. {
  4150. int ret = 0;
  4151. (void) input; /* avoid unused parameter if NO_WOLFSSL_SERVER defined */
  4152. if (!isRequest) {
  4153. if (TLSX_CheckUnsupportedExtension(ssl, TLSX_SESSION_TICKET))
  4154. return TLSX_HandleUnsupportedExtension(ssl);
  4155. if (length != 0)
  4156. return BUFFER_ERROR;
  4157. #ifndef NO_WOLFSSL_CLIENT
  4158. ssl->expect_session_ticket = 1;
  4159. #endif
  4160. }
  4161. #ifndef NO_WOLFSSL_SERVER
  4162. else {
  4163. /* server side */
  4164. if (ssl->ctx->ticketEncCb == NULL) {
  4165. WOLFSSL_MSG("Client sent session ticket, server has no callback");
  4166. return 0;
  4167. }
  4168. if (length > SESSION_TICKET_LEN) {
  4169. ret = BAD_TICKET_MSG_SZ;
  4170. } else if (IsAtLeastTLSv1_3(ssl->version)) {
  4171. WOLFSSL_MSG("Process client ticket rejected, TLS 1.3 no support");
  4172. ssl->options.rejectTicket = 1;
  4173. ret = 0; /* not fatal */
  4174. } else if (ssl->options.noTicketTls12) {
  4175. /* ignore ticket request */
  4176. } else if (length == 0) {
  4177. /* blank ticket */
  4178. ret = TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
  4179. if (ret == WOLFSSL_SUCCESS) {
  4180. ret = 0;
  4181. /* send blank ticket */
  4182. TLSX_SetResponse(ssl, TLSX_SESSION_TICKET);
  4183. ssl->options.createTicket = 1; /* will send ticket msg */
  4184. ssl->options.useTicket = 1;
  4185. ssl->options.resuming = 0; /* no standard resumption */
  4186. ssl->arrays->sessionIDSz = 0; /* no echo on blank ticket */
  4187. }
  4188. } else {
  4189. /* got actual ticket from client */
  4190. ret = DoClientTicket(ssl, input, length);
  4191. if (ret == WOLFSSL_TICKET_RET_OK) { /* use ticket to resume */
  4192. WOLFSSL_MSG("Using existing client ticket");
  4193. ssl->options.useTicket = 1;
  4194. ssl->options.resuming = 1;
  4195. } else if (ret == WOLFSSL_TICKET_RET_CREATE) {
  4196. WOLFSSL_MSG("Using existing client ticket, creating new one");
  4197. ret = TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
  4198. if (ret == WOLFSSL_SUCCESS) {
  4199. ret = 0;
  4200. TLSX_SetResponse(ssl, TLSX_SESSION_TICKET);
  4201. /* send blank ticket */
  4202. ssl->options.createTicket = 1; /* will send ticket msg */
  4203. ssl->options.useTicket = 1;
  4204. ssl->options.resuming = 1;
  4205. }
  4206. } else if (ret == WOLFSSL_TICKET_RET_REJECT) {
  4207. WOLFSSL_MSG("Process client ticket rejected, not using");
  4208. ssl->options.rejectTicket = 1;
  4209. ret = 0; /* not fatal */
  4210. } else if (ret == VERSION_ERROR) {
  4211. WOLFSSL_MSG("Process client ticket rejected, bad TLS version");
  4212. ssl->options.rejectTicket = 1;
  4213. ret = 0; /* not fatal */
  4214. } else if (ret == WOLFSSL_TICKET_RET_FATAL || ret < 0) {
  4215. WOLFSSL_MSG("Process client ticket fatal error, not using");
  4216. }
  4217. }
  4218. }
  4219. #endif /* NO_WOLFSSL_SERVER */
  4220. return ret;
  4221. }
  4222. WOLFSSL_LOCAL SessionTicket* TLSX_SessionTicket_Create(word32 lifetime,
  4223. byte* data, word16 size, void* heap)
  4224. {
  4225. SessionTicket* ticket = (SessionTicket*)XMALLOC(sizeof(SessionTicket),
  4226. heap, DYNAMIC_TYPE_TLSX);
  4227. if (ticket) {
  4228. ticket->data = (byte*)XMALLOC(size, heap, DYNAMIC_TYPE_TLSX);
  4229. if (ticket->data == NULL) {
  4230. XFREE(ticket, heap, DYNAMIC_TYPE_TLSX);
  4231. return NULL;
  4232. }
  4233. XMEMCPY(ticket->data, data, size);
  4234. ticket->size = size;
  4235. ticket->lifetime = lifetime;
  4236. }
  4237. (void)heap;
  4238. return ticket;
  4239. }
  4240. WOLFSSL_LOCAL void TLSX_SessionTicket_Free(SessionTicket* ticket, void* heap)
  4241. {
  4242. if (ticket) {
  4243. XFREE(ticket->data, heap, DYNAMIC_TYPE_TLSX);
  4244. XFREE(ticket, heap, DYNAMIC_TYPE_TLSX);
  4245. }
  4246. (void)heap;
  4247. }
  4248. int TLSX_UseSessionTicket(TLSX** extensions, SessionTicket* ticket, void* heap)
  4249. {
  4250. int ret = 0;
  4251. if (extensions == NULL)
  4252. return BAD_FUNC_ARG;
  4253. /* If the ticket is NULL, the client will request a new ticket from the
  4254. server. Otherwise, the client will use it in the next client hello. */
  4255. if ((ret = TLSX_Push(extensions, TLSX_SESSION_TICKET, (void*)ticket, heap))
  4256. != 0)
  4257. return ret;
  4258. return WOLFSSL_SUCCESS;
  4259. }
  4260. #define WOLF_STK_VALIDATE_REQUEST TLSX_SessionTicket_ValidateRequest
  4261. #define WOLF_STK_GET_SIZE TLSX_SessionTicket_GetSize
  4262. #define WOLF_STK_WRITE TLSX_SessionTicket_Write
  4263. #define WOLF_STK_PARSE TLSX_SessionTicket_Parse
  4264. #define WOLF_STK_FREE(stk, heap) TLSX_SessionTicket_Free((SessionTicket*)stk,(heap))
  4265. #else
  4266. #define WOLF_STK_FREE(a, b)
  4267. #define WOLF_STK_VALIDATE_REQUEST(a)
  4268. #define WOLF_STK_GET_SIZE(a, b) 0
  4269. #define WOLF_STK_WRITE(a, b, c) 0
  4270. #define WOLF_STK_PARSE(a, b, c, d) 0
  4271. #endif /* HAVE_SESSION_TICKET */
  4272. /******************************************************************************/
  4273. /* Quantum-Safe-Hybrid */
  4274. /******************************************************************************/
  4275. #ifdef HAVE_QSH
  4276. #if defined(HAVE_NTRU)
  4277. static WC_RNG* gRng;
  4278. static wolfSSL_Mutex* gRngMutex;
  4279. #endif
  4280. static void TLSX_QSH_FreeAll(QSHScheme* list, void* heap)
  4281. {
  4282. QSHScheme* current;
  4283. while ((current = list)) {
  4284. list = current->next;
  4285. XFREE(current, heap, DYNAMIC_TYPE_TLSX);
  4286. }
  4287. (void)heap;
  4288. }
  4289. static int TLSX_QSH_Append(QSHScheme** list, word16 name, byte* pub,
  4290. word16 pubLen)
  4291. {
  4292. QSHScheme* temp;
  4293. if (list == NULL)
  4294. return BAD_FUNC_ARG;
  4295. if ((temp = (QSHScheme*)XMALLOC(sizeof(QSHScheme), NULL,
  4296. DYNAMIC_TYPE_TLSX)) == NULL)
  4297. return MEMORY_E;
  4298. temp->name = name;
  4299. temp->PK = pub;
  4300. temp->PKLen = pubLen;
  4301. temp->next = *list;
  4302. *list = temp;
  4303. return 0;
  4304. }
  4305. /* request for server's public key : 02 indicates 0-2 requested */
  4306. static byte TLSX_QSH_SerPKReq(byte* output, byte isRequest)
  4307. {
  4308. if (isRequest) {
  4309. /* only request one public key from the server */
  4310. output[0] = 0x01;
  4311. return OPAQUE8_LEN;
  4312. }
  4313. else {
  4314. return 0;
  4315. }
  4316. }
  4317. #ifndef NO_WOLFSSL_CLIENT
  4318. /* check for TLS_QSH suite */
  4319. static void TLSX_QSH_ValidateRequest(WOLFSSL* ssl, byte* semaphore)
  4320. {
  4321. int i;
  4322. for (i = 0; i < ssl->suites->suiteSz; i+= 2)
  4323. if (ssl->suites->suites[i] == QSH_BYTE)
  4324. return;
  4325. /* No QSH suite found */
  4326. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_QUANTUM_SAFE_HYBRID));
  4327. }
  4328. /* return the size of the QSH hello extension
  4329. list the list of QSHScheme structs containing id and key
  4330. isRequest if 1 then is being sent to the server
  4331. */
  4332. word16 TLSX_QSH_GetSize(QSHScheme* list, byte isRequest)
  4333. {
  4334. QSHScheme* temp = list;
  4335. word16 length = 0;
  4336. /* account for size of scheme list and public key list */
  4337. if (isRequest)
  4338. length = OPAQUE16_LEN;
  4339. length += OPAQUE24_LEN;
  4340. /* for each non null element in list add size */
  4341. while ((temp)) {
  4342. /* add public key info Scheme | Key Length | Key */
  4343. length += OPAQUE16_LEN;
  4344. length += OPAQUE16_LEN;
  4345. length += temp->PKLen;
  4346. /* if client add name size for scheme list
  4347. advance to next QSHScheme struct in list */
  4348. if (isRequest)
  4349. length += OPAQUE16_LEN;
  4350. temp = temp->next;
  4351. }
  4352. /* add length for request server public keys */
  4353. if (isRequest)
  4354. length += OPAQUE8_LEN;
  4355. return length;
  4356. }
  4357. /* write out a list of QSHScheme IDs */
  4358. static word16 TLSX_QSH_Write(QSHScheme* list, byte* output)
  4359. {
  4360. QSHScheme* current = list;
  4361. word16 length = 0;
  4362. length += OPAQUE16_LEN;
  4363. while (current) {
  4364. c16toa(current->name, output + length);
  4365. length += OPAQUE16_LEN;
  4366. current = (QSHScheme*)current->next;
  4367. }
  4368. c16toa(length - OPAQUE16_LEN, output); /* writing list length */
  4369. return length;
  4370. }
  4371. /* write public key list in extension */
  4372. static word16 TLSX_QSHPK_WriteR(QSHScheme* format, byte* output)
  4373. {
  4374. word32 offset = 0;
  4375. word16 public_len = 0;
  4376. if (!format)
  4377. return offset;
  4378. /* write scheme ID */
  4379. c16toa(format->name, output + offset);
  4380. offset += OPAQUE16_LEN;
  4381. /* write public key matching scheme */
  4382. public_len = format->PKLen;
  4383. c16toa(public_len, output + offset);
  4384. offset += OPAQUE16_LEN;
  4385. if (format->PK) {
  4386. XMEMCPY(output+offset, format->PK, public_len);
  4387. }
  4388. return public_len + offset;
  4389. }
  4390. word16 TLSX_QSHPK_Write(QSHScheme* list, byte* output)
  4391. {
  4392. QSHScheme* current = list;
  4393. word32 length = 0;
  4394. word24 toWire;
  4395. length += OPAQUE24_LEN;
  4396. while (current) {
  4397. length += TLSX_QSHPK_WriteR(current, output + length);
  4398. current = (QSHScheme*)current->next;
  4399. }
  4400. /* length of public keys sent */
  4401. c32to24(length - OPAQUE24_LEN, toWire);
  4402. output[0] = toWire[0];
  4403. output[1] = toWire[1];
  4404. output[2] = toWire[2];
  4405. return length;
  4406. }
  4407. #endif /* NO_WOLFSSL_CLIENT */
  4408. #ifndef NO_WOLFSSL_SERVER
  4409. static void TLSX_QSHAgreement(TLSX** extensions, void* heap)
  4410. {
  4411. TLSX* extension = TLSX_Find(*extensions, TLSX_QUANTUM_SAFE_HYBRID);
  4412. QSHScheme* format = NULL;
  4413. QSHScheme* del = NULL;
  4414. QSHScheme* prev = NULL;
  4415. if (extension == NULL)
  4416. return;
  4417. format = (QSHScheme*)extension->data;
  4418. while (format) {
  4419. if (format->PKLen == 0) {
  4420. /* case of head */
  4421. if (format == extension->data) {
  4422. extension->data = format->next;
  4423. }
  4424. if (prev)
  4425. prev->next = format->next;
  4426. del = format;
  4427. format = format->next;
  4428. XFREE(del, heap, DYNAMIC_TYPE_TMP_BUFFER);
  4429. del = NULL;
  4430. } else {
  4431. prev = format;
  4432. format = format->next;
  4433. }
  4434. }
  4435. (void)heap;
  4436. }
  4437. /* Parse in hello extension
  4438. input the byte stream to process
  4439. length length of total extension found
  4440. isRequest set to 1 if being sent to the server
  4441. */
  4442. static int TLSX_QSH_Parse(WOLFSSL* ssl, byte* input, word16 length,
  4443. byte isRequest)
  4444. {
  4445. byte numKeys = 0;
  4446. word16 offset = 0;
  4447. word16 schemSz = 0;
  4448. word16 offset_len = 0;
  4449. word32 offset_pk = 0;
  4450. word16 name = 0;
  4451. word16 PKLen = 0;
  4452. byte* PK = NULL;
  4453. int r;
  4454. if (OPAQUE16_LEN > length)
  4455. return BUFFER_ERROR;
  4456. if (isRequest) {
  4457. ato16(input, &schemSz);
  4458. /* list of public keys available for QSH schemes */
  4459. offset_len = schemSz + OPAQUE16_LEN;
  4460. }
  4461. offset_pk = ((input[offset_len] << 16) & 0xFF00000) |
  4462. (((input[offset_len + 1]) << 8) & 0xFF00) |
  4463. (input[offset_len + 2] & 0xFF);
  4464. offset_len += OPAQUE24_LEN;
  4465. /* check buffer size */
  4466. if (offset_pk > length)
  4467. return BUFFER_ERROR;
  4468. /* set maximum number of keys the client will accept */
  4469. if (!isRequest)
  4470. numKeys = (ssl->maxRequest < 1)? 1 : ssl->maxRequest;
  4471. /* hello extension read list of scheme ids */
  4472. if (isRequest) {
  4473. /* read in request for public keys */
  4474. ssl->minRequest = (input[length -1] >> 4) & 0xFF;
  4475. ssl->maxRequest = input[length -1] & 0x0F;
  4476. /* choose the min between min requested by client and 1 */
  4477. numKeys = (ssl->minRequest > 1) ? ssl->minRequest : 1;
  4478. if (ssl->minRequest > ssl->maxRequest)
  4479. return BAD_FUNC_ARG;
  4480. offset += OPAQUE16_LEN;
  4481. schemSz += offset;
  4482. /* check buffer size */
  4483. if (schemSz > length)
  4484. return BUFFER_ERROR;
  4485. while ((offset < schemSz) && numKeys) {
  4486. /* Scheme ID list */
  4487. ato16(input + offset, &name);
  4488. offset += OPAQUE16_LEN;
  4489. /* validate we have scheme id */
  4490. if (ssl->user_set_QSHSchemes &&
  4491. !TLSX_ValidateQSHScheme(&ssl->extensions, name)) {
  4492. continue;
  4493. }
  4494. /* server create keys on demand */
  4495. if ((r = TLSX_CreateNtruKey(ssl, name)) != 0) {
  4496. WOLFSSL_MSG("Error creating ntru keys");
  4497. return r;
  4498. }
  4499. /* peer sent an agreed upon scheme */
  4500. r = TLSX_UseQSHScheme(&ssl->extensions, name, NULL, 0, ssl->heap);
  4501. if (r != WOLFSSL_SUCCESS) return r; /* throw error */
  4502. numKeys--;
  4503. }
  4504. /* choose the min between min requested by client and 1 */
  4505. numKeys = (ssl->minRequest > 1) ? ssl->minRequest : 1;
  4506. }
  4507. /* QSHPK struct */
  4508. offset_pk += offset_len;
  4509. while ((offset_len < offset_pk) && numKeys) {
  4510. QSHKey * temp;
  4511. if ((temp = (QSHKey*)XMALLOC(sizeof(QSHKey), ssl->heap,
  4512. DYNAMIC_TYPE_TLSX)) == NULL)
  4513. return MEMORY_E;
  4514. /* initialize */
  4515. temp->next = NULL;
  4516. temp->pub.buffer = NULL;
  4517. temp->pub.length = 0;
  4518. temp->pri.buffer = NULL;
  4519. temp->pri.length = 0;
  4520. /* scheme id */
  4521. ato16(input + offset_len, &(temp->name));
  4522. offset_len += OPAQUE16_LEN;
  4523. /* public key length */
  4524. ato16(input + offset_len, &PKLen);
  4525. temp->pub.length = PKLen;
  4526. offset_len += OPAQUE16_LEN;
  4527. if (isRequest) {
  4528. /* validate we have scheme id */
  4529. if (ssl->user_set_QSHSchemes &&
  4530. (!TLSX_ValidateQSHScheme(&ssl->extensions, temp->name))) {
  4531. offset_len += PKLen;
  4532. XFREE(temp, ssl->heap, DYNAMIC_TYPE_TLSX);
  4533. continue;
  4534. }
  4535. }
  4536. /* read in public key */
  4537. if (PKLen > 0) {
  4538. temp->pub.buffer = (byte*)XMALLOC(temp->pub.length,
  4539. ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  4540. XMEMCPY(temp->pub.buffer, input + offset_len, temp->pub.length);
  4541. offset_len += PKLen;
  4542. }
  4543. else {
  4544. PK = NULL;
  4545. }
  4546. /* use own key when adding to extensions list for sending reply */
  4547. PKLen = 0;
  4548. PK = TLSX_QSHKeyFind_Pub(ssl->QSH_Key, &PKLen, temp->name);
  4549. r = TLSX_UseQSHScheme(&ssl->extensions, temp->name, PK, PKLen,
  4550. ssl->heap);
  4551. /* store peers key */
  4552. ssl->peerQSHKeyPresent = 1;
  4553. if (TLSX_AddQSHKey(&ssl->peerQSHKey, temp) != 0)
  4554. return MEMORY_E;
  4555. if (temp->pub.length == 0) {
  4556. XFREE(temp, ssl->heap, DYNAMIC_TYPE_TLSX);
  4557. }
  4558. if (r != WOLFSSL_SUCCESS) {return r;} /* throw error */
  4559. numKeys--;
  4560. }
  4561. /* reply to a QSH extension sent from client */
  4562. if (isRequest) {
  4563. TLSX_SetResponse(ssl, TLSX_QUANTUM_SAFE_HYBRID);
  4564. /* only use schemes we have key generated for -- free the rest */
  4565. TLSX_QSHAgreement(&ssl->extensions, ssl->heap);
  4566. }
  4567. return 0;
  4568. }
  4569. /* Used for parsing in QSHCipher structs on Key Exchange */
  4570. int TLSX_QSHCipher_Parse(WOLFSSL* ssl, const byte* input, word16 length,
  4571. byte isServer)
  4572. {
  4573. QSHKey* key;
  4574. word16 Max_Secret_Len = 48;
  4575. word16 offset = 0;
  4576. word16 offset_len = 0;
  4577. word32 offset_pk = 0;
  4578. word16 name = 0;
  4579. word16 secretLen = 0;
  4580. byte* secret = NULL;
  4581. word16 buffLen = 0;
  4582. byte buff[145]; /* size enough for 3 secrets */
  4583. buffer* buf;
  4584. /* pointer to location where secret should be stored */
  4585. if (isServer) {
  4586. buf = ssl->QSH_secret->CliSi;
  4587. }
  4588. else {
  4589. buf = ssl->QSH_secret->SerSi;
  4590. }
  4591. offset_pk = ((input[offset_len] << 16) & 0xFF0000) |
  4592. (((input[offset_len + 1]) << 8) & 0xFF00) |
  4593. (input[offset_len + 2] & 0xFF);
  4594. offset_len += OPAQUE24_LEN;
  4595. /* validating extension list length -- check if trying to read over edge
  4596. of buffer */
  4597. if (length < (offset_pk + OPAQUE24_LEN)) {
  4598. return BUFFER_ERROR;
  4599. }
  4600. /* QSHCipherList struct */
  4601. offset_pk += offset_len;
  4602. while (offset_len < offset_pk) {
  4603. /* scheme id */
  4604. ato16(input + offset_len, &name);
  4605. offset_len += OPAQUE16_LEN;
  4606. /* public key length */
  4607. ato16(input + offset_len, &secretLen);
  4608. offset_len += OPAQUE16_LEN;
  4609. /* read in public key */
  4610. if (secretLen > 0) {
  4611. secret = (byte*)(input + offset_len);
  4612. offset_len += secretLen;
  4613. }
  4614. else {
  4615. secret = NULL;
  4616. }
  4617. /* no secret sent */
  4618. if (secret == NULL)
  4619. continue;
  4620. /* find corresponding key */
  4621. key = ssl->QSH_Key;
  4622. while (key) {
  4623. if (key->name == name)
  4624. break;
  4625. else
  4626. key = (QSHKey*)key->next;
  4627. }
  4628. /* if we do not have the key than there was a big issue negotiation */
  4629. if (key == NULL) {
  4630. WOLFSSL_MSG("key was null for decryption!!!\n");
  4631. return MEMORY_E;
  4632. }
  4633. /* Decrypt sent secret */
  4634. buffLen = Max_Secret_Len;
  4635. QSH_Decrypt(key, secret, secretLen, buff + offset, &buffLen);
  4636. offset += buffLen;
  4637. }
  4638. /* allocate memory for buffer */
  4639. buf->length = offset;
  4640. buf->buffer = (byte*)XMALLOC(offset, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  4641. if (buf->buffer == NULL)
  4642. return MEMORY_E;
  4643. /* store secrets */
  4644. XMEMCPY(buf->buffer, buff, offset);
  4645. ForceZero(buff, offset);
  4646. return offset_len;
  4647. }
  4648. /* return 1 on success */
  4649. int TLSX_ValidateQSHScheme(TLSX** extensions, word16 theirs) {
  4650. TLSX* extension = TLSX_Find(*extensions, TLSX_QUANTUM_SAFE_HYBRID);
  4651. QSHScheme* format = NULL;
  4652. /* if no extension is sent then do not use QSH */
  4653. if (!extension) {
  4654. WOLFSSL_MSG("No QSH Extension");
  4655. return 0;
  4656. }
  4657. for (format = (QSHScheme*)extension->data; format; format = format->next) {
  4658. if (format->name == theirs) {
  4659. WOLFSSL_MSG("Found Matching QSH Scheme");
  4660. return 1; /* have QSH */
  4661. }
  4662. }
  4663. return 0;
  4664. }
  4665. #endif /* NO_WOLFSSL_SERVER */
  4666. /* test if the QSH Scheme is implemented
  4667. return 1 if yes 0 if no */
  4668. static int TLSX_HaveQSHScheme(word16 name)
  4669. {
  4670. switch(name) {
  4671. #ifdef HAVE_NTRU
  4672. case WOLFSSL_NTRU_EESS439:
  4673. case WOLFSSL_NTRU_EESS593:
  4674. case WOLFSSL_NTRU_EESS743:
  4675. return 1;
  4676. #endif
  4677. case WOLFSSL_LWE_XXX:
  4678. case WOLFSSL_HFE_XXX:
  4679. return 0; /* not supported yet */
  4680. default:
  4681. return 0;
  4682. }
  4683. }
  4684. /* Add a QSHScheme struct to list of usable ones */
  4685. int TLSX_UseQSHScheme(TLSX** extensions, word16 name, byte* pKey, word16 pkeySz,
  4686. void* heap)
  4687. {
  4688. TLSX* extension = NULL;
  4689. QSHScheme* format = NULL;
  4690. int ret = 0;
  4691. /* sanity check */
  4692. if (extensions == NULL || (pKey == NULL && pkeySz != 0))
  4693. return BAD_FUNC_ARG;
  4694. extension = TLSX_Find(*extensions, TLSX_QUANTUM_SAFE_HYBRID);
  4695. /* if scheme is implemented than add */
  4696. if (TLSX_HaveQSHScheme(name)) {
  4697. if ((ret = TLSX_QSH_Append(&format, name, pKey, pkeySz)) != 0)
  4698. return ret;
  4699. extension = TLSX_Find(*extensions, TLSX_QUANTUM_SAFE_HYBRID);
  4700. if (!extension) {
  4701. if ((ret = TLSX_Push(extensions, TLSX_QUANTUM_SAFE_HYBRID, format,
  4702. heap)) != 0) {
  4703. XFREE(format, 0, DYNAMIC_TYPE_TLSX);
  4704. return ret;
  4705. }
  4706. }
  4707. else {
  4708. /* push new QSH object to extension data. */
  4709. format->next = (QSHScheme*)extension->data;
  4710. extension->data = (void*)format;
  4711. /* look for another format of the same name to remove (replacement) */
  4712. do {
  4713. if (format->next && (format->next->name == name)) {
  4714. QSHScheme* next = format->next;
  4715. format->next = next->next;
  4716. XFREE(next, 0, DYNAMIC_TYPE_TLSX);
  4717. break;
  4718. }
  4719. } while ((format = format->next));
  4720. }
  4721. }
  4722. return WOLFSSL_SUCCESS;
  4723. }
  4724. #define QSH_FREE_ALL TLSX_QSH_FreeAll
  4725. #define QSH_VALIDATE_REQUEST TLSX_QSH_ValidateRequest
  4726. #ifndef NO_WOLFSSL_CLIENT
  4727. #define QSH_GET_SIZE TLSX_QSH_GetSize
  4728. #define QSH_WRITE TLSX_QSH_Write
  4729. #else
  4730. #define QSH_GET_SIZE(list, a) 0
  4731. #define QSH_WRITE(a, b) 0
  4732. #endif
  4733. #ifndef NO_WOLFSSL_SERVER
  4734. #define QSH_PARSE TLSX_QSH_Parse
  4735. #else
  4736. #define QSH_PARSE(a, b, c, d) 0
  4737. #endif
  4738. #define QSHPK_WRITE TLSX_QSHPK_Write
  4739. #define QSH_SERREQ TLSX_QSH_SerPKReq
  4740. #else
  4741. #define QSH_FREE_ALL(list, heap)
  4742. #define QSH_GET_SIZE(list, a) 0
  4743. #define QSH_WRITE(a, b) 0
  4744. #define QSH_PARSE(a, b, c, d) 0
  4745. #define QSHPK_WRITE(a, b) 0
  4746. #define QSH_SERREQ(a, b) 0
  4747. #define QSH_VALIDATE_REQUEST(a, b)
  4748. #endif /* HAVE_QSH */
  4749. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  4750. /******************************************************************************/
  4751. /* Encrypt-then-MAC */
  4752. /******************************************************************************/
  4753. #ifndef WOLFSSL_NO_TLS12
  4754. static int TLSX_EncryptThenMac_Use(WOLFSSL* ssl);
  4755. /**
  4756. * Get the size of the Encrypt-Then-MAC extension.
  4757. *
  4758. * msgType Type of message to put extension into.
  4759. * pSz Size of extension data.
  4760. * return SANITY_MSG_E when the message is not allowed to have extension and
  4761. * 0 otherwise.
  4762. */
  4763. static int TLSX_EncryptThenMac_GetSize(byte msgType, word16* pSz)
  4764. {
  4765. (void)pSz;
  4766. if (msgType != client_hello && msgType != server_hello) {
  4767. return SANITY_MSG_E;
  4768. }
  4769. /* Empty extension */
  4770. return 0;
  4771. }
  4772. /**
  4773. * Write the Encrypt-Then-MAC extension.
  4774. *
  4775. * data Unused
  4776. * output Extension data buffer. Unused.
  4777. * msgType Type of message to put extension into.
  4778. * pSz Size of extension data.
  4779. * return SANITY_MSG_E when the message is not allowed to have extension and
  4780. * 0 otherwise.
  4781. */
  4782. static int TLSX_EncryptThenMac_Write(void* data, byte* output, byte msgType,
  4783. word16* pSz)
  4784. {
  4785. (void)data;
  4786. (void)output;
  4787. (void)pSz;
  4788. if (msgType != client_hello && msgType != server_hello) {
  4789. return SANITY_MSG_E;
  4790. }
  4791. /* Empty extension */
  4792. return 0;
  4793. }
  4794. /**
  4795. * Parse the Encrypt-Then-MAC extension.
  4796. *
  4797. * ssl SSL object
  4798. * input Extension data buffer.
  4799. * length Length of this extension's data.
  4800. * msgType Type of message to extension appeared in.
  4801. * return SANITY_MSG_E when the message is not allowed to have extension,
  4802. * BUFFER_ERROR when the extension's data is invalid,
  4803. * MEMORY_E when unable to allocate memory and
  4804. * 0 otherwise.
  4805. */
  4806. static int TLSX_EncryptThenMac_Parse(WOLFSSL* ssl, byte* input, word16 length,
  4807. byte msgType)
  4808. {
  4809. int ret;
  4810. (void)input;
  4811. if (msgType != client_hello && msgType != server_hello) {
  4812. return SANITY_MSG_E;
  4813. }
  4814. /* Empty extension */
  4815. if (length != 0)
  4816. return BUFFER_ERROR;
  4817. if (msgType == client_hello) {
  4818. /* Check the user hasn't disallowed use of Encrypt-Then-Mac. */
  4819. if (!ssl->options.disallowEncThenMac) {
  4820. ssl->options.encThenMac = 1;
  4821. /* Set the extension reply. */
  4822. ret = TLSX_EncryptThenMac_Use(ssl);
  4823. if (ret != 0)
  4824. return ret;
  4825. TLSX_SetResponse(ssl, TLSX_ENCRYPT_THEN_MAC);
  4826. }
  4827. return 0;
  4828. }
  4829. /* Server Hello */
  4830. if (ssl->options.disallowEncThenMac)
  4831. return SANITY_MSG_E;
  4832. ssl->options.encThenMac = 1;
  4833. return 0;
  4834. }
  4835. /**
  4836. * Add the Encrypt-Then-MAC extension to list.
  4837. *
  4838. * ssl SSL object
  4839. * return MEMORY_E when unable to allocate memory and 0 otherwise.
  4840. */
  4841. static int TLSX_EncryptThenMac_Use(WOLFSSL* ssl)
  4842. {
  4843. int ret = 0;
  4844. TLSX* extension;
  4845. /* Find the Encrypt-Then-Mac extension if it exists. */
  4846. extension = TLSX_Find(ssl->extensions, TLSX_ENCRYPT_THEN_MAC);
  4847. if (extension == NULL) {
  4848. /* Push new Encrypt-Then-Mac extension. */
  4849. ret = TLSX_Push(&ssl->extensions, TLSX_ENCRYPT_THEN_MAC, NULL,
  4850. ssl->heap);
  4851. if (ret != 0)
  4852. return ret;
  4853. }
  4854. return 0;
  4855. }
  4856. #define ETM_GET_SIZE TLSX_EncryptThenMac_GetSize
  4857. #define ETM_WRITE TLSX_EncryptThenMac_Write
  4858. #define ETM_PARSE TLSX_EncryptThenMac_Parse
  4859. #else
  4860. #define ETM_GET_SIZE(a, b) 0
  4861. #define ETM_WRITE(a, b, c, d) 0
  4862. #define ETM_PARSE(a, b, c, d) 0
  4863. #endif /* !WOLFSSL_NO_TLS12 */
  4864. #endif /* HAVE_ENCRYPT_THEN_MAC && !WOLFSSL_AEAD_ONLY */
  4865. /******************************************************************************/
  4866. /* Supported Versions */
  4867. /******************************************************************************/
  4868. #ifdef WOLFSSL_TLS13
  4869. /* Return the size of the SupportedVersions extension's data.
  4870. *
  4871. * data The SSL/TLS object.
  4872. * msgType The type of the message this extension is being written into.
  4873. * returns the length of data that will be in the extension.
  4874. */
  4875. static int TLSX_SupportedVersions_GetSize(void* data, byte msgType, word16* pSz)
  4876. {
  4877. WOLFSSL* ssl = (WOLFSSL*)data;
  4878. if (msgType == client_hello) {
  4879. /* TLS v1.2 and TLS v1.3 */
  4880. int cnt = 0;
  4881. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  4882. if ((ssl->options.mask & SSL_OP_NO_TLSv1_3) == 0)
  4883. #endif
  4884. cnt++;
  4885. if (ssl->options.downgrade) {
  4886. #ifndef WOLFSSL_NO_TLS12
  4887. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  4888. if ((ssl->options.mask & SSL_OP_NO_TLSv1_2) == 0)
  4889. #endif
  4890. cnt++;
  4891. #endif
  4892. #ifndef NO_OLD_TLS
  4893. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  4894. if ((ssl->options.mask & SSL_OP_NO_TLSv1_1) == 0)
  4895. #endif
  4896. cnt++;
  4897. #ifdef WOLFSSL_ALLOW_TLSV10
  4898. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  4899. if ((ssl->options.mask & SSL_OP_NO_TLSv1) == 0)
  4900. #endif
  4901. cnt++;
  4902. #endif
  4903. #endif
  4904. }
  4905. *pSz += (word16)(OPAQUE8_LEN + cnt * OPAQUE16_LEN);
  4906. }
  4907. else if (msgType == server_hello || msgType == hello_retry_request)
  4908. *pSz += OPAQUE16_LEN;
  4909. else
  4910. return SANITY_MSG_E;
  4911. return 0;
  4912. }
  4913. /* Writes the SupportedVersions extension into the buffer.
  4914. *
  4915. * data The SSL/TLS object.
  4916. * output The buffer to write the extension into.
  4917. * msgType The type of the message this extension is being written into.
  4918. * returns the length of data that was written.
  4919. */
  4920. static int TLSX_SupportedVersions_Write(void* data, byte* output,
  4921. byte msgType, word16* pSz)
  4922. {
  4923. WOLFSSL* ssl = (WOLFSSL*)data;
  4924. byte major;
  4925. byte* cnt;
  4926. if (msgType == client_hello) {
  4927. major = ssl->ctx->method->version.major;
  4928. cnt = output++;
  4929. *cnt = 0;
  4930. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  4931. if ((ssl->options.mask & SSL_OP_NO_TLSv1_3) == 0)
  4932. #endif
  4933. {
  4934. *cnt += OPAQUE16_LEN;
  4935. #ifdef WOLFSSL_TLS13_DRAFT
  4936. /* The TLS draft major number. */
  4937. *(output++) = TLS_DRAFT_MAJOR;
  4938. /* Version of draft supported. */
  4939. *(output++) = TLS_DRAFT_MINOR;
  4940. #else
  4941. *(output++) = major;
  4942. *(output++) = (byte)TLSv1_3_MINOR;
  4943. #endif
  4944. }
  4945. if (ssl->options.downgrade) {
  4946. #ifndef WOLFSSL_NO_TLS12
  4947. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  4948. if ((ssl->options.mask & SSL_OP_NO_TLSv1_2) == 0)
  4949. #endif
  4950. {
  4951. *cnt += OPAQUE16_LEN;
  4952. *(output++) = major;
  4953. *(output++) = (byte)TLSv1_2_MINOR;
  4954. }
  4955. #endif
  4956. #ifndef NO_OLD_TLS
  4957. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  4958. if ((ssl->options.mask & SSL_OP_NO_TLSv1_1) == 0)
  4959. #endif
  4960. {
  4961. *cnt += OPAQUE16_LEN;
  4962. *(output++) = major;
  4963. *(output++) = (byte)TLSv1_1_MINOR;
  4964. }
  4965. #ifdef WOLFSSL_ALLOW_TLSV10
  4966. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  4967. if ((ssl->options.mask & SSL_OP_NO_TLSv1) == 0)
  4968. #endif
  4969. {
  4970. *cnt += OPAQUE16_LEN;
  4971. *(output++) = major;
  4972. *(output++) = (byte)TLSv1_MINOR;
  4973. }
  4974. #endif
  4975. #endif
  4976. }
  4977. *pSz += (word16)(OPAQUE8_LEN + *cnt);
  4978. }
  4979. else if (msgType == server_hello || msgType == hello_retry_request) {
  4980. output[0] = ssl->version.major;
  4981. output[1] = ssl->version.minor;
  4982. *pSz += OPAQUE16_LEN;
  4983. }
  4984. else
  4985. return SANITY_MSG_E;
  4986. return 0;
  4987. }
  4988. /* Parse the SupportedVersions extension.
  4989. *
  4990. * ssl The SSL/TLS object.
  4991. * input The buffer with the extension data.
  4992. * length The length of the extension data.
  4993. * msgType The type of the message this extension is being parsed from.
  4994. * returns 0 on success, otherwise failure.
  4995. */
  4996. static int TLSX_SupportedVersions_Parse(WOLFSSL* ssl, byte* input,
  4997. word16 length, byte msgType)
  4998. {
  4999. ProtocolVersion pv = ssl->ctx->method->version;
  5000. int i;
  5001. int len;
  5002. byte major, minor;
  5003. int newMinor = 0;
  5004. int set = 0;
  5005. int ret;
  5006. if (msgType == client_hello) {
  5007. /* Must contain a length and at least one version. */
  5008. if (length < OPAQUE8_LEN + OPAQUE16_LEN || (length & 1) != 1)
  5009. return BUFFER_ERROR;
  5010. len = *input;
  5011. /* Protocol version array must fill rest of data. */
  5012. if (length != (word16)OPAQUE8_LEN + len)
  5013. return BUFFER_ERROR;
  5014. input++;
  5015. /* Find first match. */
  5016. for (i = 0; i < len; i += OPAQUE16_LEN) {
  5017. major = input[i];
  5018. minor = input[i + OPAQUE8_LEN];
  5019. #ifdef WOLFSSL_TLS13_DRAFT
  5020. if (major == TLS_DRAFT_MAJOR && minor == TLS_DRAFT_MINOR) {
  5021. major = SSLv3_MAJOR;
  5022. minor = TLSv1_3_MINOR;
  5023. }
  5024. #else
  5025. if (major == TLS_DRAFT_MAJOR)
  5026. continue;
  5027. #endif
  5028. if (major != pv.major)
  5029. continue;
  5030. /* No upgrade allowed. */
  5031. if (minor > ssl->version.minor)
  5032. continue;
  5033. /* Check downgrade. */
  5034. if (minor < ssl->version.minor) {
  5035. if (!ssl->options.downgrade)
  5036. continue;
  5037. if (minor < ssl->options.minDowngrade)
  5038. continue;
  5039. if (newMinor == 0 && minor > ssl->options.oldMinor) {
  5040. /* Downgrade the version. */
  5041. ssl->version.minor = minor;
  5042. }
  5043. }
  5044. if (minor >= TLSv1_3_MINOR) {
  5045. if (!ssl->options.tls1_3) {
  5046. ssl->options.tls1_3 = 1;
  5047. ret = TLSX_Prepend(&ssl->extensions,
  5048. TLSX_SUPPORTED_VERSIONS, ssl, ssl->heap);
  5049. if (ret != 0) {
  5050. return ret;
  5051. }
  5052. TLSX_SetResponse(ssl, TLSX_SUPPORTED_VERSIONS);
  5053. }
  5054. if (minor > newMinor) {
  5055. ssl->version.minor = minor;
  5056. newMinor = minor;
  5057. }
  5058. }
  5059. else if (minor > ssl->options.oldMinor)
  5060. ssl->options.oldMinor = minor;
  5061. set = 1;
  5062. }
  5063. if (!set) {
  5064. #ifdef WOLFSSL_MYSQL_COMPATIBLE
  5065. SendAlert(ssl, alert_fatal, wc_protocol_version);
  5066. #else
  5067. SendAlert(ssl, alert_fatal, protocol_version);
  5068. #endif
  5069. return VERSION_ERROR;
  5070. }
  5071. }
  5072. else if (msgType == server_hello || msgType == hello_retry_request) {
  5073. /* Must contain one version. */
  5074. if (length != OPAQUE16_LEN)
  5075. return BUFFER_ERROR;
  5076. major = input[0];
  5077. minor = input[OPAQUE8_LEN];
  5078. if (major != pv.major)
  5079. return VERSION_ERROR;
  5080. /* Can't downgrade with this extension below TLS v1.3. */
  5081. if (minor < TLSv1_3_MINOR)
  5082. return VERSION_ERROR;
  5083. /* Version is TLS v1.2 to handle downgrading from TLS v1.3+. */
  5084. if (ssl->options.downgrade && ssl->version.minor == TLSv1_2_MINOR) {
  5085. /* Set minor version back to TLS v1.3+ */
  5086. ssl->version.minor = ssl->ctx->method->version.minor;
  5087. }
  5088. /* No upgrade allowed. */
  5089. if (ssl->version.minor < minor)
  5090. return VERSION_ERROR;
  5091. /* Check downgrade. */
  5092. if (ssl->version.minor > minor) {
  5093. if (!ssl->options.downgrade)
  5094. return VERSION_ERROR;
  5095. if (minor < ssl->options.minDowngrade)
  5096. return VERSION_ERROR;
  5097. /* Downgrade the version. */
  5098. ssl->version.minor = minor;
  5099. }
  5100. }
  5101. else
  5102. return SANITY_MSG_E;
  5103. return 0;
  5104. }
  5105. /* Sets a new SupportedVersions extension into the extension list.
  5106. *
  5107. * extensions The list of extensions.
  5108. * data The extensions specific data.
  5109. * heap The heap used for allocation.
  5110. * returns 0 on success, otherwise failure.
  5111. */
  5112. static int TLSX_SetSupportedVersions(TLSX** extensions, const void* data,
  5113. void* heap)
  5114. {
  5115. if (extensions == NULL || data == NULL)
  5116. return BAD_FUNC_ARG;
  5117. return TLSX_Push(extensions, TLSX_SUPPORTED_VERSIONS, (void *)data, heap);
  5118. }
  5119. #define SV_GET_SIZE TLSX_SupportedVersions_GetSize
  5120. #define SV_WRITE TLSX_SupportedVersions_Write
  5121. #define SV_PARSE TLSX_SupportedVersions_Parse
  5122. #else
  5123. #define SV_GET_SIZE(a, b, c) 0
  5124. #define SV_WRITE(a, b, c, d) 0
  5125. #define SV_PARSE(a, b, c, d) 0
  5126. #endif /* WOLFSSL_TLS13 */
  5127. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_SEND_HRR_COOKIE)
  5128. /******************************************************************************/
  5129. /* Cookie */
  5130. /******************************************************************************/
  5131. /* Free the cookie data.
  5132. *
  5133. * cookie Cookie data.
  5134. * heap The heap used for allocation.
  5135. */
  5136. static void TLSX_Cookie_FreeAll(Cookie* cookie, void* heap)
  5137. {
  5138. (void)heap;
  5139. if (cookie != NULL)
  5140. XFREE(cookie, heap, DYNAMIC_TYPE_TLSX);
  5141. }
  5142. /* Get the size of the encoded Cookie extension.
  5143. * In messages: ClientHello and HelloRetryRequest.
  5144. *
  5145. * cookie The cookie to write.
  5146. * msgType The type of the message this extension is being written into.
  5147. * returns the number of bytes of the encoded Cookie extension.
  5148. */
  5149. static int TLSX_Cookie_GetSize(Cookie* cookie, byte msgType, word16* pSz)
  5150. {
  5151. if (msgType == client_hello || msgType == hello_retry_request)
  5152. *pSz += OPAQUE16_LEN + cookie->len;
  5153. else
  5154. return SANITY_MSG_E;
  5155. return 0;
  5156. }
  5157. /* Writes the Cookie extension into the output buffer.
  5158. * Assumes that the the output buffer is big enough to hold data.
  5159. * In messages: ClientHello and HelloRetryRequest.
  5160. *
  5161. * cookie The cookie to write.
  5162. * output The buffer to write into.
  5163. * msgType The type of the message this extension is being written into.
  5164. * returns the number of bytes written into the buffer.
  5165. */
  5166. static int TLSX_Cookie_Write(Cookie* cookie, byte* output, byte msgType,
  5167. word16* pSz)
  5168. {
  5169. if (msgType == client_hello || msgType == hello_retry_request) {
  5170. c16toa(cookie->len, output);
  5171. output += OPAQUE16_LEN;
  5172. XMEMCPY(output, &cookie->data, cookie->len);
  5173. *pSz += OPAQUE16_LEN + cookie->len;
  5174. }
  5175. else
  5176. return SANITY_MSG_E;
  5177. return 0;
  5178. }
  5179. /* Parse the Cookie extension.
  5180. * In messages: ClientHello and HelloRetryRequest.
  5181. *
  5182. * ssl The SSL/TLS object.
  5183. * input The extension data.
  5184. * length The length of the extension data.
  5185. * msgType The type of the message this extension is being parsed from.
  5186. * returns 0 on success and other values indicate failure.
  5187. */
  5188. static int TLSX_Cookie_Parse(WOLFSSL* ssl, byte* input, word16 length,
  5189. byte msgType)
  5190. {
  5191. word16 len;
  5192. word16 idx = 0;
  5193. TLSX* extension;
  5194. Cookie* cookie;
  5195. if (msgType != client_hello && msgType != hello_retry_request)
  5196. return SANITY_MSG_E;
  5197. /* Message contains length and Cookie which must be at least one byte
  5198. * in length.
  5199. */
  5200. if (length < OPAQUE16_LEN + 1)
  5201. return BUFFER_E;
  5202. ato16(input + idx, &len);
  5203. idx += OPAQUE16_LEN;
  5204. if (length - idx != len)
  5205. return BUFFER_E;
  5206. if (msgType == hello_retry_request)
  5207. return TLSX_Cookie_Use(ssl, input + idx, len, NULL, 0, 0);
  5208. /* client_hello */
  5209. extension = TLSX_Find(ssl->extensions, TLSX_COOKIE);
  5210. if (extension == NULL)
  5211. return HRR_COOKIE_ERROR;
  5212. cookie = (Cookie*)extension->data;
  5213. if (cookie->len != len || XMEMCMP(&cookie->data, input + idx, len) != 0)
  5214. return HRR_COOKIE_ERROR;
  5215. /* Request seen. */
  5216. extension->resp = 0;
  5217. return 0;
  5218. }
  5219. /* Use the data to create a new Cookie object in the extensions.
  5220. *
  5221. * ssl SSL/TLS object.
  5222. * data Cookie data.
  5223. * len Length of cookie data in bytes.
  5224. * mac MAC data.
  5225. * macSz Length of MAC data in bytes.
  5226. * resp Indicates the extension will go into a response (HelloRetryRequest).
  5227. * returns 0 on success and other values indicate failure.
  5228. */
  5229. int TLSX_Cookie_Use(WOLFSSL* ssl, byte* data, word16 len, byte* mac,
  5230. byte macSz, int resp)
  5231. {
  5232. int ret = 0;
  5233. TLSX* extension;
  5234. Cookie* cookie;
  5235. /* Find the cookie extension if it exists. */
  5236. extension = TLSX_Find(ssl->extensions, TLSX_COOKIE);
  5237. if (extension == NULL) {
  5238. /* Push new cookie extension. */
  5239. ret = TLSX_Push(&ssl->extensions, TLSX_COOKIE, NULL, ssl->heap);
  5240. if (ret != 0)
  5241. return ret;
  5242. extension = TLSX_Find(ssl->extensions, TLSX_COOKIE);
  5243. if (extension == NULL)
  5244. return MEMORY_E;
  5245. }
  5246. /* The Cookie structure has one byte for cookie data already. */
  5247. cookie = (Cookie*)XMALLOC(sizeof(Cookie) + len + macSz - 1, ssl->heap,
  5248. DYNAMIC_TYPE_TLSX);
  5249. if (cookie == NULL)
  5250. return MEMORY_E;
  5251. cookie->len = len + macSz;
  5252. XMEMCPY(&cookie->data, data, len);
  5253. if (mac != NULL)
  5254. XMEMCPY(&cookie->data + len, mac, macSz);
  5255. if (extension->data != NULL)
  5256. XFREE(extension->data, ssl->heap, DYNAMIC_TYPE_TLSX);
  5257. extension->data = (void*)cookie;
  5258. extension->resp = (byte)resp;
  5259. return 0;
  5260. }
  5261. #define CKE_FREE_ALL TLSX_Cookie_FreeAll
  5262. #define CKE_GET_SIZE TLSX_Cookie_GetSize
  5263. #define CKE_WRITE TLSX_Cookie_Write
  5264. #define CKE_PARSE TLSX_Cookie_Parse
  5265. #else
  5266. #define CKE_FREE_ALL(a, b) 0
  5267. #define CKE_GET_SIZE(a, b, c) 0
  5268. #define CKE_WRITE(a, b, c, d) 0
  5269. #define CKE_PARSE(a, b, c, d) 0
  5270. #endif
  5271. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
  5272. /******************************************************************************/
  5273. /* Signature Algorithms */
  5274. /******************************************************************************/
  5275. /* Return the size of the SignatureAlgorithms extension's data.
  5276. *
  5277. * data Unused
  5278. * returns the length of data that will be in the extension.
  5279. */
  5280. static word16 TLSX_SignatureAlgorithms_GetSize(void* data)
  5281. {
  5282. WOLFSSL* ssl = (WOLFSSL*)data;
  5283. return OPAQUE16_LEN + ssl->suites->hashSigAlgoSz;
  5284. }
  5285. /* Creates a bit string of supported hash algorithms with RSA PSS.
  5286. * The bit string is used when determining which signature algorithm to use
  5287. * when creating the CertificateVerify message.
  5288. * Note: Valid data has an even length as each signature algorithm is two bytes.
  5289. *
  5290. * ssl The SSL/TLS object.
  5291. * input The buffer with the list of supported signature algorithms.
  5292. * length The length of the list in bytes.
  5293. * returns 0 on success, BUFFER_ERROR when the length is not even.
  5294. */
  5295. static int TLSX_SignatureAlgorithms_MapPss(WOLFSSL *ssl, byte* input,
  5296. word16 length)
  5297. {
  5298. word16 i;
  5299. if ((length & 1) == 1)
  5300. return BUFFER_ERROR;
  5301. ssl->pssAlgo = 0;
  5302. for (i = 0; i < length; i += 2) {
  5303. if (input[i] == rsa_pss_sa_algo && input[i + 1] <= sha512_mac)
  5304. ssl->pssAlgo |= 1 << input[i + 1];
  5305. #ifdef WOLFSSL_TLS13
  5306. if (input[i] == rsa_pss_sa_algo && input[i + 1] >= pss_sha256 &&
  5307. input[i + 1] <= pss_sha512) {
  5308. ssl->pssAlgo |= 1 << input[i + 1];
  5309. }
  5310. #endif
  5311. }
  5312. return 0;
  5313. }
  5314. /* Writes the SignatureAlgorithms extension into the buffer.
  5315. *
  5316. * data Unused
  5317. * output The buffer to write the extension into.
  5318. * returns the length of data that was written.
  5319. */
  5320. static word16 TLSX_SignatureAlgorithms_Write(void* data, byte* output)
  5321. {
  5322. WOLFSSL* ssl = (WOLFSSL*)data;
  5323. c16toa(ssl->suites->hashSigAlgoSz, output);
  5324. XMEMCPY(output + OPAQUE16_LEN, ssl->suites->hashSigAlgo,
  5325. ssl->suites->hashSigAlgoSz);
  5326. TLSX_SignatureAlgorithms_MapPss(ssl, output + OPAQUE16_LEN,
  5327. ssl->suites->hashSigAlgoSz);
  5328. return OPAQUE16_LEN + ssl->suites->hashSigAlgoSz;
  5329. }
  5330. /* Parse the SignatureAlgorithms extension.
  5331. *
  5332. * ssl The SSL/TLS object.
  5333. * input The buffer with the extension data.
  5334. * length The length of the extension data.
  5335. * returns 0 on success, otherwise failure.
  5336. */
  5337. static int TLSX_SignatureAlgorithms_Parse(WOLFSSL *ssl, byte* input,
  5338. word16 length, byte isRequest, Suites* suites)
  5339. {
  5340. word16 len;
  5341. if (!isRequest)
  5342. return BUFFER_ERROR;
  5343. /* Must contain a length and at least algorithm. */
  5344. if (length < OPAQUE16_LEN + OPAQUE16_LEN || (length & 1) != 0)
  5345. return BUFFER_ERROR;
  5346. ato16(input, &len);
  5347. input += OPAQUE16_LEN;
  5348. /* Algorithm array must fill rest of data. */
  5349. if (length != OPAQUE16_LEN + len)
  5350. return BUFFER_ERROR;
  5351. /* Sig Algo list size must be even. */
  5352. if (suites->hashSigAlgoSz % 2 != 0)
  5353. return BUFFER_ERROR;
  5354. /* truncate hashSigAlgo list if too long */
  5355. suites->hashSigAlgoSz = len;
  5356. if (suites->hashSigAlgoSz > WOLFSSL_MAX_SIGALGO) {
  5357. WOLFSSL_MSG("TLSX SigAlgo list exceeds max, truncating");
  5358. suites->hashSigAlgoSz = WOLFSSL_MAX_SIGALGO;
  5359. }
  5360. XMEMCPY(suites->hashSigAlgo, input, suites->hashSigAlgoSz);
  5361. return TLSX_SignatureAlgorithms_MapPss(ssl, input, len);
  5362. }
  5363. /* Sets a new SignatureAlgorithms extension into the extension list.
  5364. *
  5365. * extensions The list of extensions.
  5366. * data The extensions specific data.
  5367. * heap The heap used for allocation.
  5368. * returns 0 on success, otherwise failure.
  5369. */
  5370. static int TLSX_SetSignatureAlgorithms(TLSX** extensions, const void* data,
  5371. void* heap)
  5372. {
  5373. if (extensions == NULL)
  5374. return BAD_FUNC_ARG;
  5375. return TLSX_Push(extensions, TLSX_SIGNATURE_ALGORITHMS, (void *)data, heap);
  5376. }
  5377. #define SA_GET_SIZE TLSX_SignatureAlgorithms_GetSize
  5378. #define SA_WRITE TLSX_SignatureAlgorithms_Write
  5379. #define SA_PARSE TLSX_SignatureAlgorithms_Parse
  5380. #endif
  5381. /******************************************************************************/
  5382. /* Signature Algorithms Certificate */
  5383. /******************************************************************************/
  5384. #if defined(WOLFSSL_TLS13) && !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
  5385. /* Return the size of the SignatureAlgorithms extension's data.
  5386. *
  5387. * data Unused
  5388. * returns the length of data that will be in the extension.
  5389. */
  5390. static word16 TLSX_SignatureAlgorithmsCert_GetSize(void* data)
  5391. {
  5392. WOLFSSL* ssl = (WOLFSSL*)data;
  5393. return OPAQUE16_LEN + ssl->certHashSigAlgoSz;
  5394. }
  5395. /* Writes the SignatureAlgorithmsCert extension into the buffer.
  5396. *
  5397. * data Unused
  5398. * output The buffer to write the extension into.
  5399. * returns the length of data that was written.
  5400. */
  5401. static word16 TLSX_SignatureAlgorithmsCert_Write(void* data, byte* output)
  5402. {
  5403. WOLFSSL* ssl = (WOLFSSL*)data;
  5404. c16toa(ssl->certHashSigAlgoSz, output);
  5405. XMEMCPY(output + OPAQUE16_LEN, ssl->certHashSigAlgo,
  5406. ssl->certHashSigAlgoSz);
  5407. return OPAQUE16_LEN + ssl->certHashSigAlgoSz;
  5408. }
  5409. /* Parse the SignatureAlgorithmsCert extension.
  5410. *
  5411. * ssl The SSL/TLS object.
  5412. * input The buffer with the extension data.
  5413. * length The length of the extension data.
  5414. * returns 0 on success, otherwise failure.
  5415. */
  5416. static int TLSX_SignatureAlgorithmsCert_Parse(WOLFSSL *ssl, byte* input,
  5417. word16 length, byte isRequest)
  5418. {
  5419. word16 len;
  5420. if (!isRequest)
  5421. return BUFFER_ERROR;
  5422. /* Must contain a length and at least algorithm. */
  5423. if (length < OPAQUE16_LEN + OPAQUE16_LEN || (length & 1) != 0)
  5424. return BUFFER_ERROR;
  5425. ato16(input, &len);
  5426. input += OPAQUE16_LEN;
  5427. /* Algorithm array must fill rest of data. */
  5428. if (length != OPAQUE16_LEN + len)
  5429. return BUFFER_ERROR;
  5430. /* truncate hashSigAlgo list if too long */
  5431. ssl->certHashSigAlgoSz = len;
  5432. if (ssl->certHashSigAlgoSz > WOLFSSL_MAX_SIGALGO) {
  5433. WOLFSSL_MSG("TLSX SigAlgo list exceeds max, truncating");
  5434. ssl->certHashSigAlgoSz = WOLFSSL_MAX_SIGALGO;
  5435. }
  5436. XMEMCPY(ssl->certHashSigAlgo, input, ssl->certHashSigAlgoSz);
  5437. return 0;
  5438. }
  5439. /* Sets a new SignatureAlgorithmsCert extension into the extension list.
  5440. *
  5441. * extensions The list of extensions.
  5442. * data The extensions specific data.
  5443. * heap The heap used for allocation.
  5444. * returns 0 on success, otherwise failure.
  5445. */
  5446. static int TLSX_SetSignatureAlgorithmsCert(TLSX** extensions, const void* data,
  5447. void* heap)
  5448. {
  5449. if (extensions == NULL)
  5450. return BAD_FUNC_ARG;
  5451. return TLSX_Push(extensions, TLSX_SIGNATURE_ALGORITHMS_CERT, (void *)data,
  5452. heap);
  5453. }
  5454. #define SAC_GET_SIZE TLSX_SignatureAlgorithmsCert_GetSize
  5455. #define SAC_WRITE TLSX_SignatureAlgorithmsCert_Write
  5456. #define SAC_PARSE TLSX_SignatureAlgorithmsCert_Parse
  5457. #endif /* WOLFSSL_TLS13 */
  5458. /******************************************************************************/
  5459. /* Key Share */
  5460. /******************************************************************************/
  5461. #if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
  5462. /* Create a key share entry using named Diffie-Hellman parameters group.
  5463. * Generates a key pair.
  5464. *
  5465. * ssl The SSL/TLS object.
  5466. * kse The key share entry object.
  5467. * returns 0 on success, otherwise failure.
  5468. */
  5469. static int TLSX_KeyShare_GenDhKey(WOLFSSL *ssl, KeyShareEntry* kse)
  5470. {
  5471. int ret;
  5472. #ifndef NO_DH
  5473. byte* keyData;
  5474. void* key = NULL;
  5475. word32 keySz;
  5476. word32 dataSz;
  5477. const DhParams* params;
  5478. #ifdef WOLFSSL_SMALL_STACK
  5479. DhKey* dhKey = NULL;
  5480. #else
  5481. DhKey dhKey[1];
  5482. #endif
  5483. /* TODO: [TLS13] The key size should come from wolfcrypt. */
  5484. /* Pick the parameters from the named group. */
  5485. switch (kse->group) {
  5486. #ifdef HAVE_FFDHE_2048
  5487. case WOLFSSL_FFDHE_2048:
  5488. params = wc_Dh_ffdhe2048_Get();
  5489. keySz = 29;
  5490. break;
  5491. #endif
  5492. #ifdef HAVE_FFDHE_3072
  5493. case WOLFSSL_FFDHE_3072:
  5494. params = wc_Dh_ffdhe3072_Get();
  5495. keySz = 34;
  5496. break;
  5497. #endif
  5498. #ifdef HAVE_FFDHE_4096
  5499. case WOLFSSL_FFDHE_4096:
  5500. params = wc_Dh_ffdhe4096_Get();
  5501. keySz = 39;
  5502. break;
  5503. #endif
  5504. #ifdef HAVE_FFDHE_6144
  5505. case WOLFSSL_FFDHE_6144:
  5506. params = wc_Dh_ffdhe6144_Get();
  5507. keySz = 46;
  5508. break;
  5509. #endif
  5510. #ifdef HAVE_FFDHE_8192
  5511. case WOLFSSL_FFDHE_8192:
  5512. params = wc_Dh_ffdhe8192_Get();
  5513. keySz = 52;
  5514. break;
  5515. #endif
  5516. default:
  5517. return BAD_FUNC_ARG;
  5518. }
  5519. #ifdef WOLFSSL_SMALL_STACK
  5520. dhKey = (DhKey*)XMALLOC(sizeof(DhKey), ssl->heap, DYNAMIC_TYPE_DH);
  5521. if (dhKey == NULL)
  5522. return MEMORY_E;
  5523. #endif
  5524. ret = wc_InitDhKey_ex(dhKey, ssl->heap, ssl->devId);
  5525. if (ret != 0) {
  5526. #ifdef WOLFSSL_SMALL_STACK
  5527. XFREE(dhKey, ssl->heap, DYNAMIC_TYPE_DH);
  5528. #endif
  5529. return ret;
  5530. }
  5531. /* Allocate space for the public key */
  5532. dataSz = params->p_len;
  5533. keyData = (byte*)XMALLOC(dataSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  5534. if (keyData == NULL) {
  5535. ret = MEMORY_E;
  5536. goto end;
  5537. }
  5538. /* Allocate space for the private key */
  5539. key = (byte*)XMALLOC(keySz, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  5540. if (key == NULL) {
  5541. ret = MEMORY_E;
  5542. goto end;
  5543. }
  5544. /* Set key */
  5545. ret = wc_DhSetKey(dhKey,
  5546. (byte*)params->p, params->p_len,
  5547. (byte*)params->g, params->g_len);
  5548. if (ret != 0)
  5549. goto end;
  5550. #if defined(WOLFSSL_STATIC_EPHEMERAL) && defined(WOLFSSL_DH_EXTRA)
  5551. if (ssl->staticKE.dhKey) {
  5552. DerBuffer* keyDer = ssl->staticKE.dhKey;
  5553. word32 idx = 0;
  5554. WOLFSSL_MSG("Using static DH key");
  5555. ret = wc_DhKeyDecode(keyDer->buffer, &idx, dhKey, keyDer->length);
  5556. if (ret == 0) {
  5557. ret = wc_DhExportKeyPair(dhKey, (byte*)key, &keySz, keyData, &dataSz);
  5558. }
  5559. }
  5560. else
  5561. #endif
  5562. {
  5563. /* Generate a new key pair */
  5564. ret = wc_DhGenerateKeyPair(dhKey, ssl->rng, (byte*)key, &keySz, keyData,
  5565. &dataSz);
  5566. #ifdef WOLFSSL_ASYNC_CRYPT
  5567. /* TODO: Make this function non-blocking */
  5568. if (ret == WC_PENDING_E) {
  5569. ret = wc_AsyncWait(ret, &dhKey->asyncDev, WC_ASYNC_FLAG_NONE);
  5570. }
  5571. #endif
  5572. }
  5573. if (ret != 0)
  5574. goto end;
  5575. if (params->p_len != dataSz) {
  5576. /* Zero pad the front of the public key to match prime "p" size */
  5577. XMEMMOVE(keyData + params->p_len - dataSz, keyData, dataSz);
  5578. XMEMSET(keyData, 0, params->p_len - dataSz);
  5579. }
  5580. kse->pubKey = keyData;
  5581. kse->pubKeyLen = params->p_len;
  5582. kse->key = key;
  5583. kse->keyLen = keySz;
  5584. #ifdef WOLFSSL_DEBUG_TLS
  5585. WOLFSSL_MSG("Public DH Key");
  5586. WOLFSSL_BUFFER(keyData, params->p_len);
  5587. #endif
  5588. end:
  5589. wc_FreeDhKey(dhKey);
  5590. #ifdef WOLFSSL_SMALL_STACK
  5591. XFREE(dhKey, ssl->heap, DYNAMIC_TYPE_DH);
  5592. #endif
  5593. if (ret != 0) {
  5594. /* Data owned by key share entry otherwise. */
  5595. if (keyData != NULL)
  5596. XFREE(keyData, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  5597. if (key != NULL)
  5598. XFREE(key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  5599. }
  5600. #else
  5601. (void)ssl;
  5602. (void)kse;
  5603. ret = NOT_COMPILED_IN;
  5604. #endif
  5605. return ret;
  5606. }
  5607. /* Create a key share entry using X25519 parameters group.
  5608. * Generates a key pair.
  5609. *
  5610. * ssl The SSL/TLS object.
  5611. * kse The key share entry object.
  5612. * returns 0 on success, otherwise failure.
  5613. */
  5614. static int TLSX_KeyShare_GenX25519Key(WOLFSSL *ssl, KeyShareEntry* kse)
  5615. {
  5616. int ret;
  5617. #ifdef HAVE_CURVE25519
  5618. byte* keyData = NULL;
  5619. word32 dataSize = CURVE25519_KEYSIZE;
  5620. curve25519_key* key;
  5621. /* Allocate an ECC key to hold private key. */
  5622. key = (curve25519_key*)XMALLOC(sizeof(curve25519_key), ssl->heap,
  5623. DYNAMIC_TYPE_PRIVATE_KEY);
  5624. if (key == NULL) {
  5625. WOLFSSL_MSG("EccTempKey Memory error");
  5626. return MEMORY_E;
  5627. }
  5628. /* Make an ECC key. */
  5629. ret = wc_curve25519_init(key);
  5630. if (ret != 0)
  5631. goto end;
  5632. ret = wc_curve25519_make_key(ssl->rng, CURVE25519_KEYSIZE, key);
  5633. if (ret != 0)
  5634. goto end;
  5635. /* Allocate space for the public key. */
  5636. keyData = (byte*)XMALLOC(CURVE25519_KEYSIZE, ssl->heap,
  5637. DYNAMIC_TYPE_PUBLIC_KEY);
  5638. if (keyData == NULL) {
  5639. WOLFSSL_MSG("Key data Memory error");
  5640. ret = MEMORY_E;
  5641. goto end;
  5642. }
  5643. /* Export public key. */
  5644. if (wc_curve25519_export_public_ex(key, keyData, &dataSize,
  5645. EC25519_LITTLE_ENDIAN) != 0) {
  5646. ret = ECC_EXPORT_ERROR;
  5647. goto end;
  5648. }
  5649. kse->pubKey = keyData;
  5650. kse->pubKeyLen = CURVE25519_KEYSIZE;
  5651. kse->key = key;
  5652. #ifdef WOLFSSL_DEBUG_TLS
  5653. WOLFSSL_MSG("Public Curve25519 Key");
  5654. WOLFSSL_BUFFER(keyData, dataSize);
  5655. #endif
  5656. end:
  5657. if (ret != 0) {
  5658. /* Data owned by key share entry otherwise. */
  5659. if (keyData != NULL)
  5660. XFREE(keyData, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  5661. wc_curve25519_free(key);
  5662. XFREE(key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  5663. }
  5664. #else
  5665. (void)ssl;
  5666. (void)kse;
  5667. ret = NOT_COMPILED_IN;
  5668. #endif /* HAVE_CURVE25519 */
  5669. return ret;
  5670. }
  5671. /* Create a key share entry using X448 parameters group.
  5672. * Generates a key pair.
  5673. *
  5674. * ssl The SSL/TLS object.
  5675. * kse The key share entry object.
  5676. * returns 0 on success, otherwise failure.
  5677. */
  5678. static int TLSX_KeyShare_GenX448Key(WOLFSSL *ssl, KeyShareEntry* kse)
  5679. {
  5680. int ret;
  5681. #ifdef HAVE_CURVE448
  5682. byte* keyData = NULL;
  5683. word32 dataSize = CURVE448_KEY_SIZE;
  5684. curve448_key* key;
  5685. /* Allocate an ECC key to hold private key. */
  5686. key = (curve448_key*)XMALLOC(sizeof(curve448_key), ssl->heap,
  5687. DYNAMIC_TYPE_PRIVATE_KEY);
  5688. if (key == NULL) {
  5689. WOLFSSL_MSG("EccTempKey Memory error");
  5690. return MEMORY_E;
  5691. }
  5692. /* Make an ECC key. */
  5693. ret = wc_curve448_init(key);
  5694. if (ret != 0)
  5695. goto end;
  5696. ret = wc_curve448_make_key(ssl->rng, CURVE448_KEY_SIZE, key);
  5697. if (ret != 0)
  5698. goto end;
  5699. /* Allocate space for the public key. */
  5700. keyData = (byte*)XMALLOC(CURVE448_KEY_SIZE, ssl->heap,
  5701. DYNAMIC_TYPE_PUBLIC_KEY);
  5702. if (keyData == NULL) {
  5703. WOLFSSL_MSG("Key data Memory error");
  5704. ret = MEMORY_E;
  5705. goto end;
  5706. }
  5707. /* Export public key. */
  5708. if (wc_curve448_export_public_ex(key, keyData, &dataSize,
  5709. EC448_LITTLE_ENDIAN) != 0) {
  5710. ret = ECC_EXPORT_ERROR;
  5711. goto end;
  5712. }
  5713. kse->pubKey = keyData;
  5714. kse->pubKeyLen = CURVE448_KEY_SIZE;
  5715. kse->key = key;
  5716. #ifdef WOLFSSL_DEBUG_TLS
  5717. WOLFSSL_MSG("Public Curve448 Key");
  5718. WOLFSSL_BUFFER(keyData, dataSize);
  5719. #endif
  5720. end:
  5721. if (ret != 0) {
  5722. /* Data owned by key share entry otherwise. */
  5723. if (keyData != NULL)
  5724. XFREE(keyData, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  5725. wc_curve448_free(key);
  5726. XFREE(key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  5727. }
  5728. #else
  5729. (void)ssl;
  5730. (void)kse;
  5731. ret = NOT_COMPILED_IN;
  5732. #endif /* HAVE_CURVE448 */
  5733. return ret;
  5734. }
  5735. /* Create a key share entry using named elliptic curve parameters group.
  5736. * Generates a key pair.
  5737. *
  5738. * ssl The SSL/TLS object.
  5739. * kse The key share entry object.
  5740. * returns 0 on success, otherwise failure.
  5741. */
  5742. static int TLSX_KeyShare_GenEccKey(WOLFSSL *ssl, KeyShareEntry* kse)
  5743. {
  5744. int ret;
  5745. #ifdef HAVE_ECC
  5746. byte* keyData = NULL;
  5747. word32 dataSize;
  5748. byte* keyPtr = NULL;
  5749. word32 keySize;
  5750. ecc_key* eccKey;
  5751. word16 curveId;
  5752. /* TODO: [TLS13] The key sizes should come from wolfcrypt. */
  5753. /* Translate named group to a curve id. */
  5754. switch (kse->group) {
  5755. #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
  5756. #ifndef NO_ECC_SECP
  5757. case WOLFSSL_ECC_SECP256R1:
  5758. curveId = ECC_SECP256R1;
  5759. keySize = 32;
  5760. dataSize = keySize * 2 + 1;
  5761. break;
  5762. #endif /* !NO_ECC_SECP */
  5763. #endif
  5764. #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
  5765. #ifndef NO_ECC_SECP
  5766. case WOLFSSL_ECC_SECP384R1:
  5767. curveId = ECC_SECP384R1;
  5768. keySize = 48;
  5769. dataSize = keySize * 2 + 1;
  5770. break;
  5771. #endif /* !NO_ECC_SECP */
  5772. #endif
  5773. #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
  5774. #ifndef NO_ECC_SECP
  5775. case WOLFSSL_ECC_SECP521R1:
  5776. curveId = ECC_SECP521R1;
  5777. keySize = 66;
  5778. dataSize = keySize * 2 + 1;
  5779. break;
  5780. #endif /* !NO_ECC_SECP */
  5781. #endif
  5782. #if defined(HAVE_X448) && ECC_MIN_KEY_SZ <= 448
  5783. case WOLFSSL_ECC_X448:
  5784. curveId = ECC_X448;
  5785. dataSize = keySize = 56;
  5786. break;
  5787. #endif
  5788. default:
  5789. return BAD_FUNC_ARG;
  5790. }
  5791. /* Allocate an ECC key to hold private key. */
  5792. keyPtr = (byte*)XMALLOC(sizeof(ecc_key), ssl->heap,
  5793. DYNAMIC_TYPE_PRIVATE_KEY);
  5794. if (keyPtr == NULL) {
  5795. WOLFSSL_MSG("EccTempKey Memory error");
  5796. return MEMORY_E;
  5797. }
  5798. eccKey = (ecc_key*)keyPtr;
  5799. /* Make an ECC key. */
  5800. ret = wc_ecc_init_ex(eccKey, ssl->heap, ssl->devId);
  5801. if (ret != 0)
  5802. goto end;
  5803. #ifdef WOLFSSL_STATIC_EPHEMERAL
  5804. if (ssl->staticKE.ecKey) {
  5805. DerBuffer* keyDer = ssl->staticKE.ecKey;
  5806. word32 idx = 0;
  5807. WOLFSSL_MSG("Using static ECDH key");
  5808. ret = wc_EccPrivateKeyDecode(keyDer->buffer, &idx, eccKey, keyDer->length);
  5809. }
  5810. else
  5811. #endif
  5812. {
  5813. /* Generate ephemeral ECC key */
  5814. ret = wc_ecc_make_key_ex(ssl->rng, keySize, eccKey, curveId);
  5815. #ifdef WOLFSSL_ASYNC_CRYPT
  5816. /* TODO: Make this function non-blocking */
  5817. if (ret == WC_PENDING_E) {
  5818. ret = wc_AsyncWait(ret, &eccKey->asyncDev, WC_ASYNC_FLAG_NONE);
  5819. }
  5820. #endif
  5821. }
  5822. if (ret != 0)
  5823. goto end;
  5824. /* Allocate space for the public key. */
  5825. keyData = (byte*)XMALLOC(dataSize, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  5826. if (keyData == NULL) {
  5827. WOLFSSL_MSG("Key data Memory error");
  5828. ret = MEMORY_E;
  5829. goto end;
  5830. }
  5831. /* Export public key. */
  5832. if (wc_ecc_export_x963(eccKey, keyData, &dataSize) != 0) {
  5833. ret = ECC_EXPORT_ERROR;
  5834. goto end;
  5835. }
  5836. kse->pubKey = keyData;
  5837. kse->pubKeyLen = dataSize;
  5838. kse->key = keyPtr;
  5839. #ifdef WOLFSSL_DEBUG_TLS
  5840. WOLFSSL_MSG("Public ECC Key");
  5841. WOLFSSL_BUFFER(keyData, dataSize);
  5842. #endif
  5843. end:
  5844. if (ret != 0) {
  5845. /* Data owned by key share entry otherwise. */
  5846. if (keyPtr != NULL)
  5847. XFREE(keyPtr, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  5848. if (keyData != NULL)
  5849. XFREE(keyData, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  5850. }
  5851. #else
  5852. (void)ssl;
  5853. (void)kse;
  5854. ret = NOT_COMPILED_IN;
  5855. #endif /* HAVE_ECC */
  5856. return ret;
  5857. }
  5858. /* Generate a secret/key using the key share entry.
  5859. *
  5860. * ssl The SSL/TLS object.
  5861. * kse The key share entry holding peer data.
  5862. */
  5863. static int TLSX_KeyShare_GenKey(WOLFSSL *ssl, KeyShareEntry *kse)
  5864. {
  5865. /* Named FFHE groups have a bit set to identify them. */
  5866. if ((kse->group & NAMED_DH_MASK) == NAMED_DH_MASK)
  5867. return TLSX_KeyShare_GenDhKey(ssl, kse);
  5868. if (kse->group == WOLFSSL_ECC_X25519)
  5869. return TLSX_KeyShare_GenX25519Key(ssl, kse);
  5870. if (kse->group == WOLFSSL_ECC_X448)
  5871. return TLSX_KeyShare_GenX448Key(ssl, kse);
  5872. return TLSX_KeyShare_GenEccKey(ssl, kse);
  5873. }
  5874. /* Free the key share dynamic data.
  5875. *
  5876. * list The linked list of key share entry objects.
  5877. * heap The heap used for allocation.
  5878. */
  5879. static void TLSX_KeyShare_FreeAll(KeyShareEntry* list, void* heap)
  5880. {
  5881. KeyShareEntry* current;
  5882. while ((current = list) != NULL) {
  5883. list = current->next;
  5884. if ((current->group & NAMED_DH_MASK) == 0) {
  5885. if (current->group == WOLFSSL_ECC_X25519) {
  5886. #ifdef HAVE_CURVE25519
  5887. wc_curve25519_free((curve25519_key*)current->key);
  5888. #endif
  5889. }
  5890. else if (current->group == WOLFSSL_ECC_X448) {
  5891. #ifdef HAVE_CURVE448
  5892. wc_curve448_free((curve448_key*)current->key);
  5893. #endif
  5894. }
  5895. else {
  5896. #ifdef HAVE_ECC
  5897. wc_ecc_free((ecc_key*)(current->key));
  5898. #endif
  5899. }
  5900. }
  5901. if (current->key != NULL)
  5902. XFREE(current->key, heap, DYNAMIC_TYPE_PRIVATE_KEY);
  5903. XFREE(current->pubKey, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  5904. XFREE(current->ke, heap, DYNAMIC_TYPE_PUBLIC_KEY);
  5905. XFREE(current, heap, DYNAMIC_TYPE_TLSX);
  5906. }
  5907. (void)heap;
  5908. }
  5909. /* Get the size of the encoded key share extension.
  5910. *
  5911. * list The linked list of key share extensions.
  5912. * msgType The type of the message this extension is being written into.
  5913. * returns the number of bytes of the encoded key share extension.
  5914. */
  5915. static word16 TLSX_KeyShare_GetSize(KeyShareEntry* list, byte msgType)
  5916. {
  5917. word16 len = 0;
  5918. byte isRequest = (msgType == client_hello);
  5919. KeyShareEntry* current;
  5920. /* The named group the server wants to use. */
  5921. if (msgType == hello_retry_request)
  5922. return OPAQUE16_LEN;
  5923. /* List of key exchange groups. */
  5924. if (isRequest)
  5925. len += OPAQUE16_LEN;
  5926. while ((current = list) != NULL) {
  5927. list = current->next;
  5928. if (!isRequest && current->key == NULL)
  5929. continue;
  5930. len += KE_GROUP_LEN + OPAQUE16_LEN + current->pubKeyLen;
  5931. }
  5932. return len;
  5933. }
  5934. /* Writes the key share extension into the output buffer.
  5935. * Assumes that the the output buffer is big enough to hold data.
  5936. *
  5937. * list The linked list of key share entries.
  5938. * output The buffer to write into.
  5939. * msgType The type of the message this extension is being written into.
  5940. * returns the number of bytes written into the buffer.
  5941. */
  5942. static word16 TLSX_KeyShare_Write(KeyShareEntry* list, byte* output,
  5943. byte msgType)
  5944. {
  5945. word16 i = 0;
  5946. byte isRequest = (msgType == client_hello);
  5947. KeyShareEntry* current;
  5948. if (msgType == hello_retry_request) {
  5949. c16toa(list->group, output);
  5950. return OPAQUE16_LEN;
  5951. }
  5952. /* ClientHello has a list but ServerHello is only the chosen. */
  5953. if (isRequest)
  5954. i += OPAQUE16_LEN;
  5955. /* Write out all in the list. */
  5956. while ((current = list) != NULL) {
  5957. list = current->next;
  5958. if (!isRequest && current->key == NULL)
  5959. continue;
  5960. c16toa(current->group, &output[i]);
  5961. i += KE_GROUP_LEN;
  5962. c16toa((word16)(current->pubKeyLen), &output[i]);
  5963. i += OPAQUE16_LEN;
  5964. XMEMCPY(&output[i], current->pubKey, current->pubKeyLen);
  5965. i += (word16)current->pubKeyLen;
  5966. }
  5967. /* Write the length of the list if required. */
  5968. if (isRequest)
  5969. c16toa(i - OPAQUE16_LEN, output);
  5970. return i;
  5971. }
  5972. /* Process the DH key share extension on the client side.
  5973. *
  5974. * ssl The SSL/TLS object.
  5975. * keyShareEntry The key share entry object to use to calculate shared secret.
  5976. * returns 0 on success and other values indicate failure.
  5977. */
  5978. static int TLSX_KeyShare_ProcessDh(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
  5979. {
  5980. #ifndef NO_DH
  5981. int ret;
  5982. const DhParams* params;
  5983. #ifdef WOLFSSL_SMALL_STACK
  5984. DhKey* dhKey = NULL;
  5985. #else
  5986. DhKey dhKey[1];
  5987. #endif
  5988. switch (keyShareEntry->group) {
  5989. #ifdef HAVE_FFDHE_2048
  5990. case WOLFSSL_FFDHE_2048:
  5991. params = wc_Dh_ffdhe2048_Get();
  5992. break;
  5993. #endif
  5994. #ifdef HAVE_FFDHE_3072
  5995. case WOLFSSL_FFDHE_3072:
  5996. params = wc_Dh_ffdhe3072_Get();
  5997. break;
  5998. #endif
  5999. #ifdef HAVE_FFDHE_4096
  6000. case WOLFSSL_FFDHE_4096:
  6001. params = wc_Dh_ffdhe4096_Get();
  6002. break;
  6003. #endif
  6004. #ifdef HAVE_FFDHE_6144
  6005. case WOLFSSL_FFDHE_6144:
  6006. params = wc_Dh_ffdhe6144_Get();
  6007. break;
  6008. #endif
  6009. #ifdef HAVE_FFDHE_8192
  6010. case WOLFSSL_FFDHE_8192:
  6011. params = wc_Dh_ffdhe8192_Get();
  6012. break;
  6013. #endif
  6014. default:
  6015. return PEER_KEY_ERROR;
  6016. }
  6017. #ifdef WOLFSSL_DEBUG_TLS
  6018. WOLFSSL_MSG("Peer DH Key");
  6019. WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
  6020. #endif
  6021. #ifdef WOLFSSL_SMALL_STACK
  6022. dhKey = (DhKey*)XMALLOC(sizeof(DhKey), ssl->heap, DYNAMIC_TYPE_DH);
  6023. if (dhKey == NULL)
  6024. return MEMORY_E;
  6025. #endif
  6026. ret = wc_InitDhKey_ex(dhKey, ssl->heap, ssl->devId);
  6027. if (ret != 0) {
  6028. #ifdef WOLFSSL_SMALL_STACK
  6029. XFREE(dhKey, ssl->heap, DYNAMIC_TYPE_DH);
  6030. #endif
  6031. return ret;
  6032. }
  6033. /* Set key */
  6034. ret = wc_DhSetKey(dhKey, (byte*)params->p, params->p_len, (byte*)params->g,
  6035. params->g_len);
  6036. if (ret != 0) {
  6037. wc_FreeDhKey(dhKey);
  6038. #ifdef WOLFSSL_SMALL_STACK
  6039. XFREE(dhKey, ssl->heap, DYNAMIC_TYPE_DH);
  6040. #endif
  6041. return ret;
  6042. }
  6043. ret = wc_DhCheckPubKey(dhKey, keyShareEntry->ke, keyShareEntry->keLen);
  6044. if (ret != 0) {
  6045. wc_FreeDhKey(dhKey);
  6046. #ifdef WOLFSSL_SMALL_STACK
  6047. XFREE(dhKey, ssl->heap, DYNAMIC_TYPE_DH);
  6048. #endif
  6049. return PEER_KEY_ERROR;
  6050. }
  6051. /* Derive secret from private key and peer's public key. */
  6052. ret = wc_DhAgree(dhKey,
  6053. ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz,
  6054. (const byte*)keyShareEntry->key, keyShareEntry->keyLen,
  6055. keyShareEntry->ke, keyShareEntry->keLen);
  6056. #ifdef WOLFSSL_ASYNC_CRYPT
  6057. /* TODO: Make this function non-blocking */
  6058. if (ret == WC_PENDING_E) {
  6059. ret = wc_AsyncWait(ret, &dhKey->asyncDev, WC_ASYNC_FLAG_NONE);
  6060. }
  6061. #endif
  6062. /* RFC 8446 Section 7.4.1:
  6063. * ... left-padded with zeros up to the size of the prime. ...
  6064. */
  6065. if (params->p_len > ssl->arrays->preMasterSz) {
  6066. word32 diff = params->p_len - ssl->arrays->preMasterSz;
  6067. XMEMMOVE(ssl->arrays->preMasterSecret + diff,
  6068. ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
  6069. XMEMSET(ssl->arrays->preMasterSecret, 0, diff);
  6070. ssl->arrays->preMasterSz = params->p_len;
  6071. }
  6072. ssl->options.dhKeySz = params->p_len;
  6073. wc_FreeDhKey(dhKey);
  6074. #ifdef WOLFSSL_SMALL_STACK
  6075. XFREE(dhKey, ssl->heap, DYNAMIC_TYPE_DH);
  6076. #endif
  6077. if (keyShareEntry->key != NULL) {
  6078. XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  6079. keyShareEntry->key = NULL;
  6080. }
  6081. XFREE(keyShareEntry->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  6082. keyShareEntry->pubKey = NULL;
  6083. XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  6084. keyShareEntry->ke = NULL;
  6085. return ret;
  6086. #else
  6087. (void)ssl;
  6088. (void)keyShareEntry;
  6089. return PEER_KEY_ERROR;
  6090. #endif
  6091. }
  6092. /* Process the X25519 key share extension on the client side.
  6093. *
  6094. * ssl The SSL/TLS object.
  6095. * keyShareEntry The key share entry object to use to calculate shared secret.
  6096. * returns 0 on success and other values indicate failure.
  6097. */
  6098. static int TLSX_KeyShare_ProcessX25519(WOLFSSL* ssl,
  6099. KeyShareEntry* keyShareEntry)
  6100. {
  6101. int ret;
  6102. #ifdef HAVE_CURVE25519
  6103. curve25519_key* key = (curve25519_key*)keyShareEntry->key;
  6104. curve25519_key* peerX25519Key;
  6105. #ifdef HAVE_ECC
  6106. if (ssl->peerEccKey != NULL) {
  6107. wc_ecc_free(ssl->peerEccKey);
  6108. ssl->peerEccKey = NULL;
  6109. }
  6110. #endif
  6111. peerX25519Key = (curve25519_key*)XMALLOC(sizeof(curve25519_key), ssl->heap,
  6112. DYNAMIC_TYPE_TLSX);
  6113. if (peerX25519Key == NULL) {
  6114. WOLFSSL_MSG("PeerEccKey Memory error");
  6115. return MEMORY_ERROR;
  6116. }
  6117. ret = wc_curve25519_init(peerX25519Key);
  6118. if (ret != 0) {
  6119. XFREE(peerX25519Key, ssl->heap, DYNAMIC_TYPE_TLSX);
  6120. return ret;
  6121. }
  6122. #ifdef WOLFSSL_DEBUG_TLS
  6123. WOLFSSL_MSG("Peer Curve25519 Key");
  6124. WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
  6125. #endif
  6126. if (wc_curve25519_check_public(keyShareEntry->ke, keyShareEntry->keLen,
  6127. EC25519_LITTLE_ENDIAN) != 0) {
  6128. ret = ECC_PEERKEY_ERROR;
  6129. }
  6130. if (ret == 0) {
  6131. if (wc_curve25519_import_public_ex(keyShareEntry->ke,
  6132. keyShareEntry->keLen, peerX25519Key,
  6133. EC25519_LITTLE_ENDIAN) != 0) {
  6134. ret = ECC_PEERKEY_ERROR;
  6135. }
  6136. }
  6137. if (ret == 0) {
  6138. ssl->ecdhCurveOID = ECC_X25519_OID;
  6139. ret = wc_curve25519_shared_secret_ex(key, peerX25519Key,
  6140. ssl->arrays->preMasterSecret,
  6141. &ssl->arrays->preMasterSz,
  6142. EC25519_LITTLE_ENDIAN);
  6143. }
  6144. wc_curve25519_free(peerX25519Key);
  6145. XFREE(peerX25519Key, ssl->heap, DYNAMIC_TYPE_TLSX);
  6146. wc_curve25519_free((curve25519_key*)keyShareEntry->key);
  6147. if (keyShareEntry->key != NULL) {
  6148. XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  6149. keyShareEntry->key = NULL;
  6150. }
  6151. #else
  6152. (void)ssl;
  6153. (void)keyShareEntry;
  6154. ret = PEER_KEY_ERROR;
  6155. #endif /* HAVE_CURVE25519 */
  6156. return ret;
  6157. }
  6158. /* Process the X448 key share extension on the client side.
  6159. *
  6160. * ssl The SSL/TLS object.
  6161. * keyShareEntry The key share entry object to use to calculate shared secret.
  6162. * returns 0 on success and other values indicate failure.
  6163. */
  6164. static int TLSX_KeyShare_ProcessX448(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
  6165. {
  6166. int ret;
  6167. #ifdef HAVE_CURVE448
  6168. curve448_key* key = (curve448_key*)keyShareEntry->key;
  6169. curve448_key* peerX448Key;
  6170. #ifdef HAVE_ECC
  6171. if (ssl->peerEccKey != NULL) {
  6172. wc_ecc_free(ssl->peerEccKey);
  6173. ssl->peerEccKey = NULL;
  6174. }
  6175. #endif
  6176. peerX448Key = (curve448_key*)XMALLOC(sizeof(curve448_key), ssl->heap,
  6177. DYNAMIC_TYPE_TLSX);
  6178. if (peerX448Key == NULL) {
  6179. WOLFSSL_MSG("PeerEccKey Memory error");
  6180. return MEMORY_ERROR;
  6181. }
  6182. ret = wc_curve448_init(peerX448Key);
  6183. if (ret != 0) {
  6184. XFREE(peerX448Key, ssl->heap, DYNAMIC_TYPE_TLSX);
  6185. return ret;
  6186. }
  6187. #ifdef WOLFSSL_DEBUG_TLS
  6188. WOLFSSL_MSG("Peer Curve448 Key");
  6189. WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
  6190. #endif
  6191. if (wc_curve448_check_public(keyShareEntry->ke, keyShareEntry->keLen,
  6192. EC448_LITTLE_ENDIAN) != 0) {
  6193. ret = ECC_PEERKEY_ERROR;
  6194. }
  6195. if (ret == 0) {
  6196. if (wc_curve448_import_public_ex(keyShareEntry->ke,
  6197. keyShareEntry->keLen, peerX448Key,
  6198. EC448_LITTLE_ENDIAN) != 0) {
  6199. ret = ECC_PEERKEY_ERROR;
  6200. }
  6201. }
  6202. if (ret == 0) {
  6203. ssl->ecdhCurveOID = ECC_X448_OID;
  6204. ret = wc_curve448_shared_secret_ex(key, peerX448Key,
  6205. ssl->arrays->preMasterSecret,
  6206. &ssl->arrays->preMasterSz,
  6207. EC448_LITTLE_ENDIAN);
  6208. }
  6209. wc_curve448_free(peerX448Key);
  6210. XFREE(peerX448Key, ssl->heap, DYNAMIC_TYPE_TLSX);
  6211. wc_curve448_free((curve448_key*)keyShareEntry->key);
  6212. if (keyShareEntry->key != NULL) {
  6213. XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  6214. keyShareEntry->key = NULL;
  6215. }
  6216. #else
  6217. (void)ssl;
  6218. (void)keyShareEntry;
  6219. ret = PEER_KEY_ERROR;
  6220. #endif /* HAVE_CURVE448 */
  6221. return ret;
  6222. }
  6223. /* Process the ECC key share extension on the client side.
  6224. *
  6225. * ssl The SSL/TLS object.
  6226. * keyShareEntry The key share entry object to use to calculate shared secret.
  6227. * returns 0 on success and other values indicate failure.
  6228. */
  6229. static int TLSX_KeyShare_ProcessEcc(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
  6230. {
  6231. int ret;
  6232. #ifdef HAVE_ECC
  6233. int curveId;
  6234. ecc_key* keyShareKey = (ecc_key*)keyShareEntry->key;
  6235. if (ssl->peerEccKey != NULL)
  6236. wc_ecc_free(ssl->peerEccKey);
  6237. ssl->peerEccKey = (ecc_key*)XMALLOC(sizeof(ecc_key), ssl->heap,
  6238. DYNAMIC_TYPE_ECC);
  6239. if (ssl->peerEccKey == NULL) {
  6240. WOLFSSL_MSG("PeerEccKey Memory error");
  6241. return MEMORY_ERROR;
  6242. }
  6243. ret = wc_ecc_init_ex(ssl->peerEccKey, ssl->heap, ssl->devId);
  6244. if (ret != 0)
  6245. return ret;
  6246. /* find supported curve */
  6247. switch (keyShareEntry->group) {
  6248. #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
  6249. #ifndef NO_ECC_SECP
  6250. case WOLFSSL_ECC_SECP256R1:
  6251. curveId = ECC_SECP256R1;
  6252. break;
  6253. #endif /* !NO_ECC_SECP */
  6254. #endif
  6255. #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
  6256. #ifndef NO_ECC_SECP
  6257. case WOLFSSL_ECC_SECP384R1:
  6258. curveId = ECC_SECP384R1;
  6259. break;
  6260. #endif /* !NO_ECC_SECP */
  6261. #endif
  6262. #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
  6263. #ifndef NO_ECC_SECP
  6264. case WOLFSSL_ECC_SECP521R1:
  6265. curveId = ECC_SECP521R1;
  6266. break;
  6267. #endif /* !NO_ECC_SECP */
  6268. #endif
  6269. #if defined(HAVE_X448) && ECC_MIN_KEY_SZ <= 448
  6270. case WOLFSSL_ECC_X448:
  6271. curveId = ECC_X448;
  6272. break;
  6273. #endif
  6274. default:
  6275. /* unsupported curve */
  6276. return ECC_PEERKEY_ERROR;
  6277. }
  6278. #ifdef WOLFSSL_DEBUG_TLS
  6279. WOLFSSL_MSG("Peer ECC Key");
  6280. WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
  6281. #endif
  6282. /* Point is validated by import function. */
  6283. if (wc_ecc_import_x963_ex(keyShareEntry->ke, keyShareEntry->keLen,
  6284. ssl->peerEccKey, curveId) != 0) {
  6285. return ECC_PEERKEY_ERROR;
  6286. }
  6287. ssl->ecdhCurveOID = ssl->peerEccKey->dp->oidSum;
  6288. #if defined(ECC_TIMING_RESISTANT) && (!defined(HAVE_FIPS) || \
  6289. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION != 2))) && \
  6290. !defined(HAVE_SELFTEST)
  6291. ret = wc_ecc_set_rng(keyShareKey, ssl->rng);
  6292. if (ret != 0) {
  6293. return ret;
  6294. }
  6295. #endif
  6296. do {
  6297. #if defined(WOLFSSL_ASYNC_CRYPT)
  6298. ret = wc_AsyncWait(ret, &keyShareKey->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  6299. #endif
  6300. if (ret >= 0)
  6301. ret = wc_ecc_shared_secret(keyShareKey, ssl->peerEccKey,
  6302. ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz);
  6303. } while (ret == WC_PENDING_E);
  6304. #if 0
  6305. /* TODO: Switch to support async here and use: */
  6306. ret = EccSharedSecret(ssl, keyShareEntry->key, ssl->peerEccKey,
  6307. keyShareEntry->ke, &keyShareEntry->keLen,
  6308. ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz,
  6309. ssl->options.side
  6310. );
  6311. #endif
  6312. wc_ecc_free(ssl->peerEccKey);
  6313. XFREE(ssl->peerEccKey, ssl->heap, DYNAMIC_TYPE_ECC);
  6314. ssl->peerEccKey = NULL;
  6315. wc_ecc_free((ecc_key*)(keyShareEntry->key));
  6316. if (keyShareEntry->key != NULL) {
  6317. XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  6318. keyShareEntry->key = NULL;
  6319. }
  6320. #else
  6321. (void)ssl;
  6322. (void)keyShareEntry;
  6323. ret = PEER_KEY_ERROR;
  6324. #endif /* HAVE_ECC */
  6325. return ret;
  6326. }
  6327. /* Process the key share extension on the client side.
  6328. *
  6329. * ssl The SSL/TLS object.
  6330. * keyShareEntry The key share entry object to use to calculate shared secret.
  6331. * returns 0 on success and other values indicate failure.
  6332. */
  6333. static int TLSX_KeyShare_Process(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
  6334. {
  6335. int ret;
  6336. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  6337. ssl->session.namedGroup = (byte)keyShareEntry->group;
  6338. #endif
  6339. /* Use Key Share Data from server. */
  6340. if (keyShareEntry->group & NAMED_DH_MASK)
  6341. ret = TLSX_KeyShare_ProcessDh(ssl, keyShareEntry);
  6342. else if (keyShareEntry->group == WOLFSSL_ECC_X25519)
  6343. ret = TLSX_KeyShare_ProcessX25519(ssl, keyShareEntry);
  6344. else if (keyShareEntry->group == WOLFSSL_ECC_X448)
  6345. ret = TLSX_KeyShare_ProcessX448(ssl, keyShareEntry);
  6346. else
  6347. ret = TLSX_KeyShare_ProcessEcc(ssl, keyShareEntry);
  6348. #ifdef WOLFSSL_DEBUG_TLS
  6349. WOLFSSL_MSG("KE Secret");
  6350. WOLFSSL_BUFFER(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
  6351. #endif
  6352. return ret;
  6353. }
  6354. /* Parse an entry of the KeyShare extension.
  6355. *
  6356. * ssl The SSL/TLS object.
  6357. * input The extension data.
  6358. * length The length of the extension data.
  6359. * kse The new key share entry object.
  6360. * returns a positive number to indicate amount of data parsed and a negative
  6361. * number on error.
  6362. */
  6363. static int TLSX_KeyShareEntry_Parse(WOLFSSL* ssl, byte* input, word16 length,
  6364. KeyShareEntry **kse)
  6365. {
  6366. int ret;
  6367. word16 group;
  6368. word16 keLen;
  6369. int offset = 0;
  6370. byte* ke;
  6371. if (length < OPAQUE16_LEN + OPAQUE16_LEN)
  6372. return BUFFER_ERROR;
  6373. /* Named group */
  6374. ato16(&input[offset], &group);
  6375. offset += OPAQUE16_LEN;
  6376. /* Key exchange data - public key. */
  6377. ato16(&input[offset], &keLen);
  6378. offset += OPAQUE16_LEN;
  6379. if (keLen == 0)
  6380. return INVALID_PARAMETER;
  6381. if (keLen > length - offset)
  6382. return BUFFER_ERROR;
  6383. /* Store a copy in the key share object. */
  6384. ke = (byte*)XMALLOC(keLen, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  6385. if (ke == NULL)
  6386. return MEMORY_E;
  6387. XMEMCPY(ke, &input[offset], keLen);
  6388. /* Populate a key share object in the extension. */
  6389. ret = TLSX_KeyShare_Use(ssl, group, keLen, ke, kse);
  6390. if (ret != 0) {
  6391. XFREE(ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  6392. return ret;
  6393. }
  6394. /* Total length of the parsed data. */
  6395. return offset + keLen;
  6396. }
  6397. /* Searches the groups sent for the specified named group.
  6398. *
  6399. * ssl SSL/TLS object.
  6400. * name Group name to match.
  6401. * returns 1 when the extension has the group name and 0 otherwise.
  6402. */
  6403. static int TLSX_KeyShare_Find(WOLFSSL* ssl, word16 group)
  6404. {
  6405. TLSX* extension;
  6406. KeyShareEntry* list;
  6407. extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
  6408. if (extension == NULL) {
  6409. extension = TLSX_Find(ssl->ctx->extensions, TLSX_KEY_SHARE);
  6410. if (extension == NULL)
  6411. return 0;
  6412. }
  6413. list = (KeyShareEntry*)extension->data;
  6414. while (list != NULL) {
  6415. if (list->group == group)
  6416. return 1;
  6417. list = list->next;
  6418. }
  6419. return 0;
  6420. }
  6421. /* Searches the supported groups extension for the specified named group.
  6422. *
  6423. * ssl The SSL/TLS object.
  6424. * name The group name to match.
  6425. * returns 1 when the extension has the group name and 0 otherwise.
  6426. */
  6427. static int TLSX_SupportedGroups_Find(WOLFSSL* ssl, word16 name)
  6428. {
  6429. #ifdef HAVE_SUPPORTED_CURVES
  6430. TLSX* extension;
  6431. SupportedCurve* curve = NULL;
  6432. if ((extension = TLSX_Find(ssl->extensions,
  6433. TLSX_SUPPORTED_GROUPS)) == NULL) {
  6434. if ((extension = TLSX_Find(ssl->ctx->extensions,
  6435. TLSX_SUPPORTED_GROUPS)) == NULL) {
  6436. return 0;
  6437. }
  6438. }
  6439. for (curve = (SupportedCurve*)extension->data; curve; curve = curve->next) {
  6440. if (curve->name == name)
  6441. return 1;
  6442. }
  6443. #endif
  6444. (void)ssl;
  6445. (void)name;
  6446. return 0;
  6447. }
  6448. /* Parse the KeyShare extension.
  6449. * Different formats in different messages.
  6450. *
  6451. * ssl The SSL/TLS object.
  6452. * input The extension data.
  6453. * length The length of the extension data.
  6454. * msgType The type of the message this extension is being parsed from.
  6455. * returns 0 on success and other values indicate failure.
  6456. */
  6457. static int TLSX_KeyShare_Parse(WOLFSSL* ssl, byte* input, word16 length,
  6458. byte msgType)
  6459. {
  6460. int ret;
  6461. KeyShareEntry *keyShareEntry = NULL;
  6462. word16 group;
  6463. if (msgType == client_hello) {
  6464. int offset = 0;
  6465. word16 len;
  6466. TLSX* extension;
  6467. /* Add a KeyShare extension if it doesn't exist. */
  6468. extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
  6469. if (extension == NULL) {
  6470. /* Push new KeyShare extension. */
  6471. ret = TLSX_Push(&ssl->extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
  6472. if (ret != 0)
  6473. return ret;
  6474. }
  6475. if (length < OPAQUE16_LEN)
  6476. return BUFFER_ERROR;
  6477. /* ClientHello contains zero or more key share entries. */
  6478. ato16(input, &len);
  6479. if (len != length - OPAQUE16_LEN)
  6480. return BUFFER_ERROR;
  6481. offset += OPAQUE16_LEN;
  6482. while (offset < (int)length) {
  6483. ret = TLSX_KeyShareEntry_Parse(ssl, &input[offset], length - offset,
  6484. &keyShareEntry);
  6485. if (ret < 0)
  6486. return ret;
  6487. offset += ret;
  6488. }
  6489. ret = 0;
  6490. }
  6491. else if (msgType == server_hello) {
  6492. int len;
  6493. if (length < OPAQUE16_LEN)
  6494. return BUFFER_ERROR;
  6495. /* The data is the named group the server wants to use. */
  6496. ato16(input, &group);
  6497. /* Check the selected group was supported by ClientHello extensions. */
  6498. if (!TLSX_SupportedGroups_Find(ssl, group))
  6499. return BAD_KEY_SHARE_DATA;
  6500. /* Check if the group was sent. */
  6501. if (!TLSX_KeyShare_Find(ssl, group))
  6502. return BAD_KEY_SHARE_DATA;
  6503. /* ServerHello contains one key share entry. */
  6504. len = TLSX_KeyShareEntry_Parse(ssl, input, length, &keyShareEntry);
  6505. if (len != (int)length)
  6506. return BUFFER_ERROR;
  6507. /* Not in list sent if there isn't a private key. */
  6508. if (keyShareEntry == NULL || keyShareEntry->key == NULL)
  6509. return BAD_KEY_SHARE_DATA;
  6510. /* Process the entry to calculate the secret. */
  6511. ret = TLSX_KeyShare_Process(ssl, keyShareEntry);
  6512. if (ret == 0)
  6513. ssl->session.namedGroup = ssl->namedGroup = group;
  6514. }
  6515. else if (msgType == hello_retry_request) {
  6516. if (length != OPAQUE16_LEN)
  6517. return BUFFER_ERROR;
  6518. /* The data is the named group the server wants to use. */
  6519. ato16(input, &group);
  6520. /* Check the selected group was supported by ClientHello extensions. */
  6521. if (!TLSX_SupportedGroups_Find(ssl, group))
  6522. return BAD_KEY_SHARE_DATA;
  6523. /* Check if the group was sent. */
  6524. if (TLSX_KeyShare_Find(ssl, group))
  6525. return BAD_KEY_SHARE_DATA;
  6526. /* Clear out unusable key shares. */
  6527. ret = TLSX_KeyShare_Empty(ssl);
  6528. if (ret != 0)
  6529. return ret;
  6530. /* Try to use the server's group. */
  6531. ret = TLSX_KeyShare_Use(ssl, group, 0, NULL, NULL);
  6532. }
  6533. else {
  6534. /* Not a message type that is allowed to have this extension. */
  6535. return SANITY_MSG_E;
  6536. }
  6537. return ret;
  6538. }
  6539. /* Create a new key share entry and put it into the list.
  6540. *
  6541. * list The linked list of key share entries.
  6542. * group The named group.
  6543. * heap The memory to allocate with.
  6544. * keyShareEntry The new key share entry object.
  6545. * returns 0 on success and other values indicate failure.
  6546. */
  6547. static int TLSX_KeyShare_New(KeyShareEntry** list, int group, void *heap,
  6548. KeyShareEntry** keyShareEntry)
  6549. {
  6550. KeyShareEntry* kse;
  6551. KeyShareEntry** next;
  6552. kse = (KeyShareEntry*)XMALLOC(sizeof(KeyShareEntry), heap,
  6553. DYNAMIC_TYPE_TLSX);
  6554. if (kse == NULL)
  6555. return MEMORY_E;
  6556. XMEMSET(kse, 0, sizeof(*kse));
  6557. kse->group = (word16)group;
  6558. /* Add it to the back and maintain the links. */
  6559. while (*list != NULL) {
  6560. /* Assign to temporary to work around compiler bug found by customer. */
  6561. next = &((*list)->next);
  6562. list = next;
  6563. }
  6564. *list = kse;
  6565. *keyShareEntry = kse;
  6566. (void)heap;
  6567. return 0;
  6568. }
  6569. /* Use the data to create a new key share object in the extensions.
  6570. *
  6571. * ssl The SSL/TLS object.
  6572. * group The named group.
  6573. * len The length of the public key data.
  6574. * data The public key data.
  6575. * kse The new key share entry object.
  6576. * returns 0 on success and other values indicate failure.
  6577. */
  6578. int TLSX_KeyShare_Use(WOLFSSL* ssl, word16 group, word16 len, byte* data,
  6579. KeyShareEntry **kse)
  6580. {
  6581. int ret = 0;
  6582. TLSX* extension;
  6583. KeyShareEntry* keyShareEntry = NULL;
  6584. /* Find the KeyShare extension if it exists. */
  6585. extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
  6586. if (extension == NULL) {
  6587. /* Push new KeyShare extension. */
  6588. ret = TLSX_Push(&ssl->extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
  6589. if (ret != 0)
  6590. return ret;
  6591. extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
  6592. if (extension == NULL)
  6593. return MEMORY_E;
  6594. }
  6595. extension->resp = 0;
  6596. /* Try to find the key share entry with this group. */
  6597. keyShareEntry = (KeyShareEntry*)extension->data;
  6598. while (keyShareEntry != NULL) {
  6599. if (keyShareEntry->group == group)
  6600. break;
  6601. keyShareEntry = keyShareEntry->next;
  6602. }
  6603. /* Create a new key share entry if not found. */
  6604. if (keyShareEntry == NULL) {
  6605. ret = TLSX_KeyShare_New((KeyShareEntry**)&extension->data, group,
  6606. ssl->heap, &keyShareEntry);
  6607. if (ret != 0)
  6608. return ret;
  6609. }
  6610. if (data != NULL) {
  6611. if (keyShareEntry->ke != NULL) {
  6612. XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  6613. }
  6614. keyShareEntry->ke = data;
  6615. keyShareEntry->keLen = len;
  6616. }
  6617. else {
  6618. /* Generate a key pair. */
  6619. ret = TLSX_KeyShare_GenKey(ssl, keyShareEntry);
  6620. if (ret != 0)
  6621. return ret;
  6622. }
  6623. if (kse != NULL)
  6624. *kse = keyShareEntry;
  6625. return 0;
  6626. }
  6627. /* Set an empty Key Share extension.
  6628. *
  6629. * ssl The SSL/TLS object.
  6630. * returns 0 on success and other values indicate failure.
  6631. */
  6632. int TLSX_KeyShare_Empty(WOLFSSL* ssl)
  6633. {
  6634. int ret = 0;
  6635. TLSX* extension;
  6636. /* Find the KeyShare extension if it exists. */
  6637. extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
  6638. if (extension == NULL) {
  6639. /* Push new KeyShare extension. */
  6640. ret = TLSX_Push(&ssl->extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
  6641. }
  6642. else if (extension->data != NULL) {
  6643. TLSX_KeyShare_FreeAll((KeyShareEntry*)extension->data, ssl->heap);
  6644. extension->data = NULL;
  6645. }
  6646. return ret;
  6647. }
  6648. /* Returns whether this group is supported.
  6649. *
  6650. * namedGroup The named group to check.
  6651. * returns 1 when supported or 0 otherwise.
  6652. */
  6653. static int TLSX_KeyShare_IsSupported(int namedGroup)
  6654. {
  6655. switch (namedGroup) {
  6656. #ifdef HAVE_FFDHE_2048
  6657. case WOLFSSL_FFDHE_2048:
  6658. break;
  6659. #endif
  6660. #ifdef HAVE_FFDHE_3072
  6661. case WOLFSSL_FFDHE_3072:
  6662. break;
  6663. #endif
  6664. #ifdef HAVE_FFDHE_4096
  6665. case WOLFSSL_FFDHE_4096:
  6666. break;
  6667. #endif
  6668. #ifdef HAVE_FFDHE_6144
  6669. case WOLFSSL_FFDHE_6144:
  6670. break;
  6671. #endif
  6672. #ifdef HAVE_FFDHE_8192
  6673. case WOLFSSL_FFDHE_8192:
  6674. break;
  6675. #endif
  6676. #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
  6677. #ifndef NO_ECC_SECP
  6678. case WOLFSSL_ECC_SECP256R1:
  6679. break;
  6680. #endif /* !NO_ECC_SECP */
  6681. #endif
  6682. #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
  6683. case WOLFSSL_ECC_X25519:
  6684. break;
  6685. #endif
  6686. #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
  6687. case WOLFSSL_ECC_X448:
  6688. break;
  6689. #endif
  6690. #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
  6691. #ifndef NO_ECC_SECP
  6692. case WOLFSSL_ECC_SECP384R1:
  6693. break;
  6694. #endif /* !NO_ECC_SECP */
  6695. #endif
  6696. #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
  6697. #ifndef NO_ECC_SECP
  6698. case WOLFSSL_ECC_SECP521R1:
  6699. break;
  6700. #endif /* !NO_ECC_SECP */
  6701. #endif
  6702. default:
  6703. return 0;
  6704. }
  6705. return 1;
  6706. }
  6707. /* Examines the application specified group ranking and returns the rank of the
  6708. * group.
  6709. * If no group ranking set then all groups are rank 0 (highest).
  6710. *
  6711. * ssl The SSL/TLS object.
  6712. * group The group to check ranking for.
  6713. * returns ranking from 0 to MAX_GROUP_COUNT-1 or -1 when group not in list.
  6714. */
  6715. static int TLSX_KeyShare_GroupRank(WOLFSSL* ssl, int group)
  6716. {
  6717. byte i;
  6718. if (ssl->numGroups == 0) {
  6719. #if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES)
  6720. #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
  6721. #ifndef NO_ECC_SECP
  6722. ssl->group[ssl->numGroups++] = WOLFSSL_ECC_SECP256R1;
  6723. #endif
  6724. #endif
  6725. #endif
  6726. #ifndef HAVE_FIPS
  6727. #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
  6728. ssl->group[ssl->numGroups++] = WOLFSSL_ECC_X25519;
  6729. #endif
  6730. #endif
  6731. #ifndef HAVE_FIPS
  6732. #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
  6733. ssl->group[ssl->numGroups++] = WOLFSSL_ECC_X448;
  6734. #endif
  6735. #endif
  6736. #if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES)
  6737. #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
  6738. #ifndef NO_ECC_SECP
  6739. ssl->group[ssl->numGroups++] = WOLFSSL_ECC_SECP384R1;
  6740. #endif
  6741. #endif
  6742. #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
  6743. #ifndef NO_ECC_SECP
  6744. ssl->group[ssl->numGroups++] = WOLFSSL_ECC_SECP521R1;
  6745. #endif
  6746. #endif
  6747. #endif
  6748. /* Add FFDHE supported groups. */
  6749. #ifdef HAVE_FFDHE_2048
  6750. ssl->group[ssl->numGroups++] = WOLFSSL_FFDHE_2048;
  6751. #endif
  6752. #ifdef HAVE_FFDHE_3072
  6753. ssl->group[ssl->numGroups++] = WOLFSSL_FFDHE_3072;
  6754. #endif
  6755. #ifdef HAVE_FFDHE_4096
  6756. ssl->group[ssl->numGroups++] = WOLFSSL_FFDHE_4096;
  6757. #endif
  6758. #ifdef HAVE_FFDHE_6144
  6759. ssl->group[ssl->numGroups++] = WOLFSSL_FFDHE_6144;
  6760. #endif
  6761. #ifdef HAVE_FFDHE_8192
  6762. ssl->group[ssl->numGroups++] = WOLFSSL_FFDHE_8192;
  6763. #endif
  6764. }
  6765. for (i = 0; i < ssl->numGroups; i++)
  6766. if (ssl->group[i] == (word16)group)
  6767. return i;
  6768. return -1;
  6769. }
  6770. /* Set a key share that is supported by the client into extensions.
  6771. *
  6772. * ssl The SSL/TLS object.
  6773. * returns BAD_KEY_SHARE_DATA if no supported group has a key share,
  6774. * 0 if a supported group has a key share and other values indicate an error.
  6775. */
  6776. static int TLSX_KeyShare_SetSupported(WOLFSSL* ssl)
  6777. {
  6778. int ret;
  6779. #ifdef HAVE_SUPPORTED_CURVES
  6780. TLSX* extension;
  6781. SupportedCurve* curve = NULL;
  6782. SupportedCurve* preferredCurve = NULL;
  6783. int preferredRank = WOLFSSL_MAX_GROUP_COUNT;
  6784. int rank;
  6785. extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
  6786. if (extension != NULL)
  6787. curve = (SupportedCurve*)extension->data;
  6788. /* Use server's preference order. */
  6789. for (; curve != NULL; curve = curve->next) {
  6790. if (!TLSX_KeyShare_IsSupported(curve->name))
  6791. continue;
  6792. rank = TLSX_KeyShare_GroupRank(ssl, curve->name);
  6793. if (rank == -1)
  6794. continue;
  6795. if (rank < preferredRank) {
  6796. preferredCurve = curve;
  6797. preferredRank = rank;
  6798. }
  6799. }
  6800. curve = preferredCurve;
  6801. if (curve == NULL)
  6802. return BAD_KEY_SHARE_DATA;
  6803. /* Delete the old key share data list. */
  6804. extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
  6805. if (extension != NULL) {
  6806. TLSX_KeyShare_FreeAll((KeyShareEntry*)extension->data, ssl->heap);
  6807. extension->data = NULL;
  6808. }
  6809. /* Add in the chosen group. */
  6810. ret = TLSX_KeyShare_Use(ssl, curve->name, 0, NULL, NULL);
  6811. if (ret != 0)
  6812. return ret;
  6813. /* Set extension to be in response. */
  6814. extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
  6815. extension->resp = 1;
  6816. #else
  6817. (void)ssl;
  6818. ret = NOT_COMPILED_IN;
  6819. #endif
  6820. return ret;
  6821. }
  6822. /* Ensure there is a key pair that can be used for key exchange.
  6823. *
  6824. * ssl The SSL/TLS object.
  6825. * returns 0 on success and other values indicate failure.
  6826. */
  6827. int TLSX_KeyShare_Establish(WOLFSSL *ssl)
  6828. {
  6829. int ret;
  6830. TLSX* extension;
  6831. KeyShareEntry* clientKSE = NULL;
  6832. KeyShareEntry* serverKSE;
  6833. KeyShareEntry* list = NULL;
  6834. KeyShareEntry* preferredKSE = NULL;
  6835. int preferredRank = WOLFSSL_MAX_GROUP_COUNT;
  6836. int rank;
  6837. /* Find the KeyShare extension if it exists. */
  6838. extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
  6839. if (extension != NULL)
  6840. list = (KeyShareEntry*)extension->data;
  6841. if (extension && extension->resp == 1)
  6842. return 0;
  6843. /* Use server's preference order. */
  6844. for (clientKSE = list; clientKSE != NULL; clientKSE = clientKSE->next) {
  6845. if (clientKSE->ke == NULL)
  6846. continue;
  6847. /* Check consistency now - extensions in any order. */
  6848. if (!TLSX_SupportedGroups_Find(ssl, clientKSE->group))
  6849. return BAD_KEY_SHARE_DATA;
  6850. if ((clientKSE->group & NAMED_DH_MASK) == 0) {
  6851. /* Check max value supported. */
  6852. if (clientKSE->group > WOLFSSL_ECC_MAX) {
  6853. continue;
  6854. }
  6855. #ifdef OPENSSL_EXTRA
  6856. /* Check if server supports group. */
  6857. if (ssl->ctx->disabledCurves & ((word32)1 << clientKSE->group))
  6858. continue;
  6859. #endif
  6860. }
  6861. if (!TLSX_KeyShare_IsSupported(clientKSE->group))
  6862. continue;
  6863. rank = TLSX_KeyShare_GroupRank(ssl, clientKSE->group);
  6864. if (rank == -1)
  6865. continue;
  6866. if (rank < preferredRank) {
  6867. preferredKSE = clientKSE;
  6868. preferredRank = rank;
  6869. }
  6870. }
  6871. clientKSE = preferredKSE;
  6872. /* No supported group found - send HelloRetryRequest. */
  6873. if (clientKSE == NULL) {
  6874. ret = TLSX_KeyShare_SetSupported(ssl);
  6875. /* Return KEY_SHARE_ERROR to indicate HelloRetryRequest required. */
  6876. if (ret == 0)
  6877. return KEY_SHARE_ERROR;
  6878. return ret;
  6879. }
  6880. list = NULL;
  6881. /* Generate a new key pair. */
  6882. ret = TLSX_KeyShare_New(&list, clientKSE->group, ssl->heap, &serverKSE);
  6883. if (ret != 0)
  6884. return ret;
  6885. if (clientKSE->key == NULL) {
  6886. ret = TLSX_KeyShare_GenKey(ssl, serverKSE);
  6887. if (ret != 0)
  6888. return ret;
  6889. }
  6890. else {
  6891. serverKSE->key = clientKSE->key;
  6892. serverKSE->keyLen = clientKSE->keyLen;
  6893. serverKSE->pubKey = clientKSE->pubKey;
  6894. serverKSE->pubKeyLen = clientKSE->pubKeyLen;
  6895. clientKSE->key = NULL;
  6896. clientKSE->pubKey = NULL;
  6897. }
  6898. serverKSE->ke = clientKSE->ke;
  6899. serverKSE->keLen = clientKSE->keLen;
  6900. clientKSE->ke = NULL;
  6901. clientKSE->keLen = 0;
  6902. TLSX_KeyShare_FreeAll((KeyShareEntry*)extension->data, ssl->heap);
  6903. extension->data = (void *)serverKSE;
  6904. extension->resp = 1;
  6905. return 0;
  6906. }
  6907. /* Derive the shared secret of the key exchange.
  6908. *
  6909. * ssl The SSL/TLS object.
  6910. * returns 0 on success and other values indicate failure.
  6911. */
  6912. int TLSX_KeyShare_DeriveSecret(WOLFSSL *ssl)
  6913. {
  6914. int ret;
  6915. TLSX* extension;
  6916. KeyShareEntry* list = NULL;
  6917. /* Find the KeyShare extension if it exists. */
  6918. extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
  6919. if (extension != NULL)
  6920. list = (KeyShareEntry*)extension->data;
  6921. if (list == NULL)
  6922. return KEY_SHARE_ERROR;
  6923. /* Calculate secret. */
  6924. ret = TLSX_KeyShare_Process(ssl, list);
  6925. if (ret != 0)
  6926. return ret;
  6927. return ret;
  6928. }
  6929. #define KS_FREE_ALL TLSX_KeyShare_FreeAll
  6930. #define KS_GET_SIZE TLSX_KeyShare_GetSize
  6931. #define KS_WRITE TLSX_KeyShare_Write
  6932. #define KS_PARSE TLSX_KeyShare_Parse
  6933. #else
  6934. #define KS_FREE_ALL(a, b)
  6935. #define KS_GET_SIZE(a, b) 0
  6936. #define KS_WRITE(a, b, c) 0
  6937. #define KS_PARSE(a, b, c, d) 0
  6938. #endif /* WOLFSSL_TLS13 */
  6939. /******************************************************************************/
  6940. /* Pre-Shared Key */
  6941. /******************************************************************************/
  6942. #if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
  6943. /* Free the pre-shared key dynamic data.
  6944. *
  6945. * list The linked list of key share entry objects.
  6946. * heap The heap used for allocation.
  6947. */
  6948. static void TLSX_PreSharedKey_FreeAll(PreSharedKey* list, void* heap)
  6949. {
  6950. PreSharedKey* current;
  6951. while ((current = list) != NULL) {
  6952. list = current->next;
  6953. XFREE(current->identity, heap, DYNAMIC_TYPE_TLSX);
  6954. XFREE(current, heap, DYNAMIC_TYPE_TLSX);
  6955. }
  6956. (void)heap;
  6957. }
  6958. /* Get the size of the encoded pre shared key extension.
  6959. *
  6960. * list The linked list of pre-shared key extensions.
  6961. * msgType The type of the message this extension is being written into.
  6962. * returns the number of bytes of the encoded pre-shared key extension or
  6963. * SANITY_MSG_E to indicate invalid message type.
  6964. */
  6965. static int TLSX_PreSharedKey_GetSize(PreSharedKey* list, byte msgType,
  6966. word16* pSz)
  6967. {
  6968. if (msgType == client_hello) {
  6969. /* Length of identities + Length of binders. */
  6970. word16 len = OPAQUE16_LEN + OPAQUE16_LEN;
  6971. while (list != NULL) {
  6972. /* Each entry has: identity, ticket age and binder. */
  6973. len += OPAQUE16_LEN + list->identityLen + OPAQUE32_LEN +
  6974. OPAQUE8_LEN + list->binderLen;
  6975. list = list->next;
  6976. }
  6977. *pSz += len;
  6978. return 0;
  6979. }
  6980. if (msgType == server_hello) {
  6981. *pSz += OPAQUE16_LEN;
  6982. return 0;
  6983. }
  6984. return SANITY_MSG_E;
  6985. }
  6986. /* The number of bytes to be written for the binders.
  6987. *
  6988. * list The linked list of pre-shared key extensions.
  6989. * msgType The type of the message this extension is being written into.
  6990. * returns the number of bytes of the encoded pre-shared key extension or
  6991. * SANITY_MSG_E to indicate invalid message type.
  6992. */
  6993. int TLSX_PreSharedKey_GetSizeBinders(PreSharedKey* list, byte msgType,
  6994. word16* pSz)
  6995. {
  6996. word16 len;
  6997. if (msgType != client_hello)
  6998. return SANITY_MSG_E;
  6999. /* Length of all binders. */
  7000. len = OPAQUE16_LEN;
  7001. while (list != NULL) {
  7002. len += OPAQUE8_LEN + list->binderLen;
  7003. list = list->next;
  7004. }
  7005. *pSz = len;
  7006. return 0;
  7007. }
  7008. /* Writes the pre-shared key extension into the output buffer - binders only.
  7009. * Assumes that the the output buffer is big enough to hold data.
  7010. *
  7011. * list The linked list of key share entries.
  7012. * output The buffer to write into.
  7013. * msgType The type of the message this extension is being written into.
  7014. * returns the number of bytes written into the buffer.
  7015. */
  7016. int TLSX_PreSharedKey_WriteBinders(PreSharedKey* list, byte* output,
  7017. byte msgType, word16* pSz)
  7018. {
  7019. PreSharedKey* current = list;
  7020. word16 idx = 0;
  7021. word16 lenIdx;
  7022. word16 len;
  7023. if (msgType != client_hello)
  7024. return SANITY_MSG_E;
  7025. /* Skip length of all binders. */
  7026. lenIdx = idx;
  7027. idx += OPAQUE16_LEN;
  7028. while (current != NULL) {
  7029. /* Binder data length. */
  7030. output[idx++] = current->binderLen;
  7031. /* Binder data. */
  7032. XMEMCPY(output + idx, current->binder, current->binderLen);
  7033. idx += current->binderLen;
  7034. current = current->next;
  7035. }
  7036. /* Length of the binders. */
  7037. len = idx - lenIdx - OPAQUE16_LEN;
  7038. c16toa(len, output + lenIdx);
  7039. *pSz = idx;
  7040. return 0;
  7041. }
  7042. /* Writes the pre-shared key extension into the output buffer.
  7043. * Assumes that the the output buffer is big enough to hold data.
  7044. *
  7045. * list The linked list of key share entries.
  7046. * output The buffer to write into.
  7047. * msgType The type of the message this extension is being written into.
  7048. * returns the number of bytes written into the buffer.
  7049. */
  7050. static int TLSX_PreSharedKey_Write(PreSharedKey* list, byte* output,
  7051. byte msgType, word16* pSz)
  7052. {
  7053. if (msgType == client_hello) {
  7054. PreSharedKey* current = list;
  7055. word16 idx = 0;
  7056. word16 lenIdx;
  7057. word16 len;
  7058. int ret;
  7059. /* Write identites only. Binders after HMACing over this. */
  7060. lenIdx = idx;
  7061. idx += OPAQUE16_LEN;
  7062. while (current != NULL) {
  7063. /* Identity length */
  7064. c16toa(current->identityLen, output + idx);
  7065. idx += OPAQUE16_LEN;
  7066. /* Identity data */
  7067. XMEMCPY(output + idx, current->identity, current->identityLen);
  7068. idx += current->identityLen;
  7069. /* Obfuscated ticket age. */
  7070. c32toa(current->ticketAge, output + idx);
  7071. idx += OPAQUE32_LEN;
  7072. current = current->next;
  7073. }
  7074. /* Length of the identites. */
  7075. len = idx - lenIdx - OPAQUE16_LEN;
  7076. c16toa(len, output + lenIdx);
  7077. /* Don't include binders here.
  7078. * The binders are based on the hash of all the ClientHello data up to
  7079. * and include the identities written above.
  7080. */
  7081. ret = TLSX_PreSharedKey_GetSizeBinders(list, msgType, &len);
  7082. if (ret < 0)
  7083. return ret;
  7084. *pSz += idx + len;
  7085. }
  7086. else if (msgType == server_hello) {
  7087. word16 i;
  7088. /* Find the index of the chosen identity. */
  7089. for (i=0; list != NULL && !list->chosen; i++)
  7090. list = list->next;
  7091. if (list == NULL)
  7092. return BUILD_MSG_ERROR;
  7093. /* The index of the identity chosen by the server from the list supplied
  7094. * by the client.
  7095. */
  7096. c16toa(i, output);
  7097. *pSz += OPAQUE16_LEN;
  7098. }
  7099. else
  7100. return SANITY_MSG_E;
  7101. return 0;
  7102. }
  7103. /* Parse the pre-shared key extension.
  7104. * Different formats in different messages.
  7105. *
  7106. * ssl The SSL/TLS object.
  7107. * input The extension data.
  7108. * length The length of the extension data.
  7109. * msgType The type of the message this extension is being parsed from.
  7110. * returns 0 on success and other values indicate failure.
  7111. */
  7112. static int TLSX_PreSharedKey_Parse(WOLFSSL* ssl, byte* input, word16 length,
  7113. byte msgType)
  7114. {
  7115. TLSX* extension;
  7116. PreSharedKey* list;
  7117. if (msgType == client_hello) {
  7118. int ret;
  7119. word16 len;
  7120. word16 idx = 0;
  7121. TLSX_Remove(&ssl->extensions, TLSX_PRE_SHARED_KEY, ssl->heap);
  7122. /* Length of identities and of binders. */
  7123. if ((int)(length - idx) < OPAQUE16_LEN + OPAQUE16_LEN)
  7124. return BUFFER_E;
  7125. /* Length of identities. */
  7126. ato16(input + idx, &len);
  7127. idx += OPAQUE16_LEN;
  7128. if (len < MIN_PSK_ID_LEN || length - idx < len)
  7129. return BUFFER_E;
  7130. /* Create a pre-shared key object for each identity. */
  7131. while (len > 0) {
  7132. byte* identity;
  7133. word16 identityLen;
  7134. word32 age;
  7135. if (len < OPAQUE16_LEN)
  7136. return BUFFER_E;
  7137. /* Length of identity. */
  7138. ato16(input + idx, &identityLen);
  7139. idx += OPAQUE16_LEN;
  7140. if (len < OPAQUE16_LEN + identityLen + OPAQUE32_LEN ||
  7141. identityLen > MAX_PSK_ID_LEN)
  7142. return BUFFER_E;
  7143. /* Cache identity pointer. */
  7144. identity = input + idx;
  7145. idx += identityLen;
  7146. /* Ticket age. */
  7147. ato32(input + idx, &age);
  7148. idx += OPAQUE32_LEN;
  7149. ret = TLSX_PreSharedKey_Use(ssl, identity, identityLen, age, no_mac,
  7150. 0, 0, 1, NULL);
  7151. if (ret != 0)
  7152. return ret;
  7153. /* Done with this identity. */
  7154. len -= OPAQUE16_LEN + identityLen + OPAQUE32_LEN;
  7155. }
  7156. /* Find the list of identities sent to server. */
  7157. extension = TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY);
  7158. if (extension == NULL)
  7159. return PSK_KEY_ERROR;
  7160. list = (PreSharedKey*)extension->data;
  7161. /* Length of binders. */
  7162. if (idx + OPAQUE16_LEN > length)
  7163. return BUFFER_E;
  7164. ato16(input + idx, &len);
  7165. idx += OPAQUE16_LEN;
  7166. if (len < MIN_PSK_BINDERS_LEN || length - idx < len)
  7167. return BUFFER_E;
  7168. /* Set binder for each identity. */
  7169. while (list != NULL && len > 0) {
  7170. /* Length of binder */
  7171. list->binderLen = input[idx++];
  7172. if (list->binderLen < WC_SHA256_DIGEST_SIZE ||
  7173. list->binderLen > WC_MAX_DIGEST_SIZE)
  7174. return BUFFER_E;
  7175. if (len < OPAQUE8_LEN + list->binderLen)
  7176. return BUFFER_E;
  7177. /* Copy binder into static buffer. */
  7178. XMEMCPY(list->binder, input + idx, list->binderLen);
  7179. idx += list->binderLen;
  7180. /* Done with binder entry. */
  7181. len -= OPAQUE8_LEN + list->binderLen;
  7182. /* Next identity. */
  7183. list = list->next;
  7184. }
  7185. if (list != NULL || len != 0)
  7186. return BUFFER_E;
  7187. return 0;
  7188. }
  7189. if (msgType == server_hello) {
  7190. word16 idx;
  7191. /* Index of identity chosen by server. */
  7192. if (length != OPAQUE16_LEN)
  7193. return BUFFER_E;
  7194. ato16(input, &idx);
  7195. #ifdef WOLFSSL_EARLY_DATA
  7196. ssl->options.pskIdIndex = idx + 1;
  7197. #endif
  7198. /* Find the list of identities sent to server. */
  7199. extension = TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY);
  7200. if (extension == NULL)
  7201. return PSK_KEY_ERROR;
  7202. list = (PreSharedKey*)extension->data;
  7203. /* Mark the identity as chosen. */
  7204. for (; list != NULL && idx > 0; idx--)
  7205. list = list->next;
  7206. if (list == NULL)
  7207. return PSK_KEY_ERROR;
  7208. list->chosen = 1;
  7209. #ifdef HAVE_SESSION_TICKET
  7210. if (list->resumption) {
  7211. /* Check that the session's details are the same as the server's. */
  7212. if (ssl->options.cipherSuite0 != ssl->session.cipherSuite0 ||
  7213. ssl->options.cipherSuite != ssl->session.cipherSuite ||
  7214. ssl->session.version.major != ssl->ctx->method->version.major ||
  7215. ssl->session.version.minor != ssl->ctx->method->version.minor) {
  7216. return PSK_KEY_ERROR;
  7217. }
  7218. }
  7219. #endif
  7220. return 0;
  7221. }
  7222. return SANITY_MSG_E;
  7223. }
  7224. /* Create a new pre-shared key and put it into the list.
  7225. *
  7226. * list The linked list of pre-shared key.
  7227. * identity The identity.
  7228. * len The length of the identity data.
  7229. * heap The memory to allocate with.
  7230. * preSharedKey The new pre-shared key object.
  7231. * returns 0 on success and other values indicate failure.
  7232. */
  7233. static int TLSX_PreSharedKey_New(PreSharedKey** list, byte* identity,
  7234. word16 len, void *heap,
  7235. PreSharedKey** preSharedKey)
  7236. {
  7237. PreSharedKey* psk;
  7238. PreSharedKey** next;
  7239. psk = (PreSharedKey*)XMALLOC(sizeof(PreSharedKey), heap, DYNAMIC_TYPE_TLSX);
  7240. if (psk == NULL)
  7241. return MEMORY_E;
  7242. XMEMSET(psk, 0, sizeof(*psk));
  7243. /* Make a copy of the identity data. */
  7244. psk->identity = (byte*)XMALLOC(len, heap, DYNAMIC_TYPE_TLSX);
  7245. if (psk->identity == NULL) {
  7246. XFREE(psk, heap, DYNAMIC_TYPE_TLSX);
  7247. return MEMORY_E;
  7248. }
  7249. XMEMCPY(psk->identity, identity, len);
  7250. psk->identityLen = len;
  7251. /* Add it to the end and maintain the links. */
  7252. while (*list != NULL) {
  7253. /* Assign to temporary to work around compiler bug found by customer. */
  7254. next = &((*list)->next);
  7255. list = next;
  7256. }
  7257. *list = psk;
  7258. *preSharedKey = psk;
  7259. (void)heap;
  7260. return 0;
  7261. }
  7262. static WC_INLINE byte GetHmacLength(int hmac)
  7263. {
  7264. switch (hmac) {
  7265. #ifndef NO_SHA256
  7266. case sha256_mac:
  7267. return WC_SHA256_DIGEST_SIZE;
  7268. #endif
  7269. #ifdef WOLFSSL_SHA384
  7270. case sha384_mac:
  7271. return WC_SHA384_DIGEST_SIZE;
  7272. #endif
  7273. #ifdef WOLFSSL_SHA512
  7274. case sha512_mac:
  7275. return WC_SHA512_DIGEST_SIZE;
  7276. #endif
  7277. }
  7278. return 0;
  7279. }
  7280. /* Use the data to create a new pre-shared key object in the extensions.
  7281. *
  7282. * ssl The SSL/TLS object.
  7283. * identity The identity.
  7284. * len The length of the identity data.
  7285. * age The age of the identity.
  7286. * hmac The HMAC algorithm.
  7287. * ciphersuite0 The first byte of the ciphersuite to use.
  7288. * ciphersuite The second byte of the ciphersuite to use.
  7289. * resumption The PSK is for resumption of a session.
  7290. * preSharedKey The new pre-shared key object.
  7291. * returns 0 on success and other values indicate failure.
  7292. */
  7293. int TLSX_PreSharedKey_Use(WOLFSSL* ssl, byte* identity, word16 len, word32 age,
  7294. byte hmac, byte cipherSuite0,
  7295. byte cipherSuite, byte resumption,
  7296. PreSharedKey **preSharedKey)
  7297. {
  7298. int ret = 0;
  7299. TLSX* extension;
  7300. PreSharedKey* psk = NULL;
  7301. /* Find the pre-shared key extension if it exists. */
  7302. extension = TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY);
  7303. if (extension == NULL) {
  7304. /* Push new pre-shared key extension. */
  7305. ret = TLSX_Push(&ssl->extensions, TLSX_PRE_SHARED_KEY, NULL, ssl->heap);
  7306. if (ret != 0)
  7307. return ret;
  7308. extension = TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY);
  7309. if (extension == NULL)
  7310. return MEMORY_E;
  7311. }
  7312. /* Try to find the pre-shared key with this identity. */
  7313. psk = (PreSharedKey*)extension->data;
  7314. while (psk != NULL) {
  7315. if ((psk->identityLen == len) &&
  7316. (XMEMCMP(psk->identity, identity, len) == 0)) {
  7317. break;
  7318. }
  7319. psk = psk->next;
  7320. }
  7321. /* Create a new pre-shared key object if not found. */
  7322. if (psk == NULL) {
  7323. ret = TLSX_PreSharedKey_New((PreSharedKey**)&extension->data, identity,
  7324. len, ssl->heap, &psk);
  7325. if (ret != 0)
  7326. return ret;
  7327. }
  7328. /* Update/set age and HMAC algorithm. */
  7329. psk->ticketAge = age;
  7330. psk->hmac = hmac;
  7331. psk->cipherSuite0 = cipherSuite0;
  7332. psk->cipherSuite = cipherSuite;
  7333. psk->resumption = resumption;
  7334. psk->binderLen = GetHmacLength(psk->hmac);
  7335. if (preSharedKey != NULL)
  7336. *preSharedKey = psk;
  7337. return 0;
  7338. }
  7339. #define PSK_FREE_ALL TLSX_PreSharedKey_FreeAll
  7340. #define PSK_GET_SIZE TLSX_PreSharedKey_GetSize
  7341. #define PSK_WRITE TLSX_PreSharedKey_Write
  7342. #define PSK_PARSE TLSX_PreSharedKey_Parse
  7343. #else
  7344. #define PSK_FREE_ALL(a, b)
  7345. #define PSK_GET_SIZE(a, b, c) 0
  7346. #define PSK_WRITE(a, b, c, d) 0
  7347. #define PSK_PARSE(a, b, c, d) 0
  7348. #endif
  7349. /******************************************************************************/
  7350. /* PSK Key Exchange Modes */
  7351. /******************************************************************************/
  7352. #if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
  7353. /* Get the size of the encoded PSK KE modes extension.
  7354. * Only in ClientHello.
  7355. *
  7356. * modes The PSK KE mode bit string.
  7357. * msgType The type of the message this extension is being written into.
  7358. * returns the number of bytes of the encoded PSK KE mode extension.
  7359. */
  7360. static int TLSX_PskKeModes_GetSize(byte modes, byte msgType, word16* pSz)
  7361. {
  7362. if (msgType == client_hello) {
  7363. /* Format: Len | Modes* */
  7364. word16 len = OPAQUE8_LEN;
  7365. /* Check whether each possible mode is to be written. */
  7366. if (modes & (1 << PSK_KE))
  7367. len += OPAQUE8_LEN;
  7368. if (modes & (1 << PSK_DHE_KE))
  7369. len += OPAQUE8_LEN;
  7370. *pSz += len;
  7371. return 0;
  7372. }
  7373. return SANITY_MSG_E;
  7374. }
  7375. /* Writes the PSK KE modes extension into the output buffer.
  7376. * Assumes that the the output buffer is big enough to hold data.
  7377. * Only in ClientHello.
  7378. *
  7379. * modes The PSK KE mode bit string.
  7380. * output The buffer to write into.
  7381. * msgType The type of the message this extension is being written into.
  7382. * returns the number of bytes written into the buffer.
  7383. */
  7384. static int TLSX_PskKeModes_Write(byte modes, byte* output, byte msgType,
  7385. word16* pSz)
  7386. {
  7387. if (msgType == client_hello) {
  7388. /* Format: Len | Modes* */
  7389. int idx = OPAQUE8_LEN;
  7390. /* Write out each possible mode. */
  7391. if (modes & (1 << PSK_KE))
  7392. output[idx++] = PSK_KE;
  7393. if (modes & (1 << PSK_DHE_KE))
  7394. output[idx++] = PSK_DHE_KE;
  7395. /* Write out length of mode list. */
  7396. output[0] = idx - OPAQUE8_LEN;
  7397. *pSz += idx;
  7398. return 0;
  7399. }
  7400. return SANITY_MSG_E;
  7401. }
  7402. /* Parse the PSK KE modes extension.
  7403. * Only in ClientHello.
  7404. *
  7405. * ssl The SSL/TLS object.
  7406. * input The extension data.
  7407. * length The length of the extension data.
  7408. * msgType The type of the message this extension is being parsed from.
  7409. * returns 0 on success and other values indicate failure.
  7410. */
  7411. static int TLSX_PskKeModes_Parse(WOLFSSL* ssl, byte* input, word16 length,
  7412. byte msgType)
  7413. {
  7414. int ret;
  7415. if (msgType == client_hello) {
  7416. /* Format: Len | Modes* */
  7417. int idx = 0;
  7418. word16 len;
  7419. byte modes = 0;
  7420. /* Ensure length byte exists. */
  7421. if (length < OPAQUE8_LEN)
  7422. return BUFFER_E;
  7423. /* Get length of mode list and ensure that is the only data. */
  7424. len = input[0];
  7425. if (length - OPAQUE8_LEN != len)
  7426. return BUFFER_E;
  7427. idx = OPAQUE8_LEN;
  7428. /* Set a bit for each recognized modes. */
  7429. while (len > 0) {
  7430. /* Ignore unrecognized modes. */
  7431. if (input[idx] <= PSK_DHE_KE)
  7432. modes |= 1 << input[idx];
  7433. idx++;
  7434. len--;
  7435. }
  7436. ret = TLSX_PskKeModes_Use(ssl, modes);
  7437. if (ret != 0)
  7438. return ret;
  7439. return 0;
  7440. }
  7441. return SANITY_MSG_E;
  7442. }
  7443. /* Use the data to create a new PSK Key Exchange Modes object in the extensions.
  7444. *
  7445. * ssl The SSL/TLS object.
  7446. * modes The PSK key exchange modes.
  7447. * returns 0 on success and other values indicate failure.
  7448. */
  7449. int TLSX_PskKeModes_Use(WOLFSSL* ssl, byte modes)
  7450. {
  7451. int ret = 0;
  7452. TLSX* extension;
  7453. /* Find the PSK key exchange modes extension if it exists. */
  7454. extension = TLSX_Find(ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES);
  7455. if (extension == NULL) {
  7456. /* Push new PSK key exchange modes extension. */
  7457. ret = TLSX_Push(&ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES, NULL,
  7458. ssl->heap);
  7459. if (ret != 0)
  7460. return ret;
  7461. extension = TLSX_Find(ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES);
  7462. if (extension == NULL)
  7463. return MEMORY_E;
  7464. }
  7465. extension->val = modes;
  7466. return 0;
  7467. }
  7468. #define PKM_GET_SIZE TLSX_PskKeModes_GetSize
  7469. #define PKM_WRITE TLSX_PskKeModes_Write
  7470. #define PKM_PARSE TLSX_PskKeModes_Parse
  7471. #else
  7472. #define PKM_GET_SIZE(a, b, c) 0
  7473. #define PKM_WRITE(a, b, c, d) 0
  7474. #define PKM_PARSE(a, b, c, d) 0
  7475. #endif
  7476. /******************************************************************************/
  7477. /* Post-Handshake Authentication */
  7478. /******************************************************************************/
  7479. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  7480. /* Get the size of the encoded Post-Handshake Authentication extension.
  7481. * Only in ClientHello.
  7482. *
  7483. * msgType The type of the message this extension is being written into.
  7484. * returns the number of bytes of the encoded Post-Handshake Authentication
  7485. * extension.
  7486. */
  7487. static int TLSX_PostHandAuth_GetSize(byte msgType, word16* pSz)
  7488. {
  7489. if (msgType == client_hello) {
  7490. *pSz += 0;
  7491. return 0;
  7492. }
  7493. return SANITY_MSG_E;
  7494. }
  7495. /* Writes the Post-Handshake Authentication extension into the output buffer.
  7496. * Assumes that the the output buffer is big enough to hold data.
  7497. * Only in ClientHello.
  7498. *
  7499. * output The buffer to write into.
  7500. * msgType The type of the message this extension is being written into.
  7501. * returns the number of bytes written into the buffer.
  7502. */
  7503. static int TLSX_PostHandAuth_Write(byte* output, byte msgType, word16* pSz)
  7504. {
  7505. (void)output;
  7506. if (msgType == client_hello) {
  7507. *pSz += 0;
  7508. return 0;
  7509. }
  7510. return SANITY_MSG_E;
  7511. }
  7512. /* Parse the Post-Handshake Authentication extension.
  7513. * Only in ClientHello.
  7514. *
  7515. * ssl The SSL/TLS object.
  7516. * input The extension data.
  7517. * length The length of the extension data.
  7518. * msgType The type of the message this extension is being parsed from.
  7519. * returns 0 on success and other values indicate failure.
  7520. */
  7521. static int TLSX_PostHandAuth_Parse(WOLFSSL* ssl, byte* input, word16 length,
  7522. byte msgType)
  7523. {
  7524. (void)input;
  7525. if (msgType == client_hello) {
  7526. /* Ensure extension is empty. */
  7527. if (length != 0)
  7528. return BUFFER_E;
  7529. ssl->options.postHandshakeAuth = 1;
  7530. return 0;
  7531. }
  7532. return SANITY_MSG_E;
  7533. }
  7534. /* Create a new Post-handshake authentication object in the extensions.
  7535. *
  7536. * ssl The SSL/TLS object.
  7537. * returns 0 on success and other values indicate failure.
  7538. */
  7539. static int TLSX_PostHandAuth_Use(WOLFSSL* ssl)
  7540. {
  7541. int ret = 0;
  7542. TLSX* extension;
  7543. /* Find the PSK key exchange modes extension if it exists. */
  7544. extension = TLSX_Find(ssl->extensions, TLSX_POST_HANDSHAKE_AUTH);
  7545. if (extension == NULL) {
  7546. /* Push new Post-handshake Authentication extension. */
  7547. ret = TLSX_Push(&ssl->extensions, TLSX_POST_HANDSHAKE_AUTH, NULL,
  7548. ssl->heap);
  7549. if (ret != 0)
  7550. return ret;
  7551. }
  7552. return 0;
  7553. }
  7554. #define PHA_GET_SIZE TLSX_PostHandAuth_GetSize
  7555. #define PHA_WRITE TLSX_PostHandAuth_Write
  7556. #define PHA_PARSE TLSX_PostHandAuth_Parse
  7557. #else
  7558. #define PHA_GET_SIZE(a, b) 0
  7559. #define PHA_WRITE(a, b, c) 0
  7560. #define PHA_PARSE(a, b, c, d) 0
  7561. #endif
  7562. /******************************************************************************/
  7563. /* Early Data Indication */
  7564. /******************************************************************************/
  7565. #ifdef WOLFSSL_EARLY_DATA
  7566. /* Get the size of the encoded Early Data Indication extension.
  7567. * In messages: ClientHello, EncryptedExtensions and NewSessionTicket.
  7568. *
  7569. * msgType The type of the message this extension is being written into.
  7570. * returns the number of bytes of the encoded Early Data Indication extension.
  7571. */
  7572. static int TLSX_EarlyData_GetSize(byte msgType, word16* pSz)
  7573. {
  7574. int ret = 0;
  7575. if (msgType == client_hello || msgType == encrypted_extensions)
  7576. *pSz += 0;
  7577. else if (msgType == session_ticket)
  7578. *pSz += OPAQUE32_LEN;
  7579. else
  7580. ret = SANITY_MSG_E;
  7581. return ret;
  7582. }
  7583. /* Writes the Early Data Indicator extension into the output buffer.
  7584. * Assumes that the the output buffer is big enough to hold data.
  7585. * In messages: ClientHello, EncryptedExtensions and NewSessionTicket.
  7586. *
  7587. * maxSz The maximum early data size.
  7588. * output The buffer to write into.
  7589. * msgType The type of the message this extension is being written into.
  7590. * returns the number of bytes written into the buffer.
  7591. */
  7592. static int TLSX_EarlyData_Write(word32 maxSz, byte* output, byte msgType,
  7593. word16* pSz)
  7594. {
  7595. if (msgType == client_hello || msgType == encrypted_extensions)
  7596. return 0;
  7597. else if (msgType == session_ticket) {
  7598. c32toa(maxSz, output);
  7599. *pSz += OPAQUE32_LEN;
  7600. return 0;
  7601. }
  7602. return SANITY_MSG_E;
  7603. }
  7604. /* Parse the Early Data Indicator extension.
  7605. * In messages: ClientHello, EncryptedExtensions and NewSessionTicket.
  7606. *
  7607. * ssl The SSL/TLS object.
  7608. * input The extension data.
  7609. * length The length of the extension data.
  7610. * msgType The type of the message this extension is being parsed from.
  7611. * returns 0 on success and other values indicate failure.
  7612. */
  7613. static int TLSX_EarlyData_Parse(WOLFSSL* ssl, byte* input, word16 length,
  7614. byte msgType)
  7615. {
  7616. if (msgType == client_hello) {
  7617. if (length != 0)
  7618. return BUFFER_E;
  7619. if (ssl->earlyData == expecting_early_data)
  7620. return TLSX_EarlyData_Use(ssl, 0);
  7621. ssl->earlyData = early_data_ext;
  7622. return 0;
  7623. }
  7624. if (msgType == encrypted_extensions) {
  7625. if (length != 0)
  7626. return BUFFER_E;
  7627. /* Ensure the index of PSK identity chosen by server is 0.
  7628. * Index is plus one to handle 'not set' value of 0.
  7629. */
  7630. if (ssl->options.pskIdIndex != 1)
  7631. return PSK_KEY_ERROR;
  7632. return TLSX_EarlyData_Use(ssl, 1);
  7633. }
  7634. if (msgType == session_ticket) {
  7635. word32 maxSz;
  7636. if (length != OPAQUE32_LEN)
  7637. return BUFFER_E;
  7638. ato32(input, &maxSz);
  7639. ssl->session.maxEarlyDataSz = maxSz;
  7640. return 0;
  7641. }
  7642. return SANITY_MSG_E;
  7643. }
  7644. /* Use the data to create a new Early Data object in the extensions.
  7645. *
  7646. * ssl The SSL/TLS object.
  7647. * maxSz The maximum early data size.
  7648. * returns 0 on success and other values indicate failure.
  7649. */
  7650. int TLSX_EarlyData_Use(WOLFSSL* ssl, word32 maxSz)
  7651. {
  7652. int ret = 0;
  7653. TLSX* extension;
  7654. /* Find the early data extension if it exists. */
  7655. extension = TLSX_Find(ssl->extensions, TLSX_EARLY_DATA);
  7656. if (extension == NULL) {
  7657. /* Push new early data extension. */
  7658. ret = TLSX_Push(&ssl->extensions, TLSX_EARLY_DATA, NULL, ssl->heap);
  7659. if (ret != 0)
  7660. return ret;
  7661. extension = TLSX_Find(ssl->extensions, TLSX_EARLY_DATA);
  7662. if (extension == NULL)
  7663. return MEMORY_E;
  7664. }
  7665. extension->resp = 1;
  7666. extension->val = maxSz;
  7667. return 0;
  7668. }
  7669. #define EDI_GET_SIZE TLSX_EarlyData_GetSize
  7670. #define EDI_WRITE TLSX_EarlyData_Write
  7671. #define EDI_PARSE TLSX_EarlyData_Parse
  7672. #else
  7673. #define EDI_GET_SIZE(a, b) 0
  7674. #define EDI_WRITE(a, b, c, d) 0
  7675. #define EDI_PARSE(a, b, c, d) 0
  7676. #endif
  7677. /******************************************************************************/
  7678. /* TLS Extensions Framework */
  7679. /******************************************************************************/
  7680. /** Finds an extension in the provided list. */
  7681. TLSX* TLSX_Find(TLSX* list, TLSX_Type type)
  7682. {
  7683. TLSX* extension = list;
  7684. while (extension && extension->type != type)
  7685. extension = extension->next;
  7686. return extension;
  7687. }
  7688. /** Remove an extension. */
  7689. void TLSX_Remove(TLSX** list, TLSX_Type type, void* heap)
  7690. {
  7691. TLSX* extension = *list;
  7692. TLSX** next = list;
  7693. while (extension && extension->type != type) {
  7694. next = &extension->next;
  7695. extension = extension->next;
  7696. }
  7697. if (extension) {
  7698. *next = extension->next;
  7699. extension->next = NULL;
  7700. TLSX_FreeAll(extension, heap);
  7701. }
  7702. }
  7703. /** Releases all extensions in the provided list. */
  7704. void TLSX_FreeAll(TLSX* list, void* heap)
  7705. {
  7706. TLSX* extension;
  7707. while ((extension = list)) {
  7708. list = extension->next;
  7709. switch (extension->type) {
  7710. #ifdef HAVE_SNI
  7711. case TLSX_SERVER_NAME:
  7712. SNI_FREE_ALL((SNI*)extension->data, heap);
  7713. break;
  7714. #endif
  7715. case TLSX_TRUSTED_CA_KEYS:
  7716. TCA_FREE_ALL((TCA*)extension->data, heap);
  7717. break;
  7718. case TLSX_MAX_FRAGMENT_LENGTH:
  7719. MFL_FREE_ALL(extension->data, heap);
  7720. break;
  7721. case TLSX_EXTENDED_MASTER_SECRET:
  7722. case TLSX_TRUNCATED_HMAC:
  7723. /* Nothing to do. */
  7724. break;
  7725. case TLSX_SUPPORTED_GROUPS:
  7726. EC_FREE_ALL((SupportedCurve*)extension->data, heap);
  7727. break;
  7728. case TLSX_EC_POINT_FORMATS:
  7729. PF_FREE_ALL((PointFormat*)extension->data, heap);
  7730. break;
  7731. case TLSX_STATUS_REQUEST:
  7732. CSR_FREE_ALL((CertificateStatusRequest*)extension->data, heap);
  7733. break;
  7734. case TLSX_STATUS_REQUEST_V2:
  7735. CSR2_FREE_ALL((CertificateStatusRequestItemV2*)extension->data,
  7736. heap);
  7737. break;
  7738. case TLSX_RENEGOTIATION_INFO:
  7739. SCR_FREE_ALL(extension->data, heap);
  7740. break;
  7741. case TLSX_SESSION_TICKET:
  7742. WOLF_STK_FREE(extension->data, heap);
  7743. break;
  7744. case TLSX_QUANTUM_SAFE_HYBRID:
  7745. QSH_FREE_ALL((QSHScheme*)extension->data, heap);
  7746. break;
  7747. case TLSX_APPLICATION_LAYER_PROTOCOL:
  7748. ALPN_FREE_ALL((ALPN*)extension->data, heap);
  7749. break;
  7750. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
  7751. case TLSX_SIGNATURE_ALGORITHMS:
  7752. break;
  7753. #endif
  7754. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  7755. case TLSX_ENCRYPT_THEN_MAC:
  7756. break;
  7757. #endif
  7758. #ifdef WOLFSSL_TLS13
  7759. case TLSX_SUPPORTED_VERSIONS:
  7760. break;
  7761. #ifdef WOLFSSL_SEND_HRR_COOKIE
  7762. case TLSX_COOKIE:
  7763. CKE_FREE_ALL((Cookie*)extension->data, heap);
  7764. break;
  7765. #endif
  7766. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  7767. case TLSX_PRE_SHARED_KEY:
  7768. PSK_FREE_ALL((PreSharedKey*)extension->data, heap);
  7769. break;
  7770. case TLSX_PSK_KEY_EXCHANGE_MODES:
  7771. break;
  7772. #endif
  7773. #ifdef WOLFSSL_EARLY_DATA
  7774. case TLSX_EARLY_DATA:
  7775. break;
  7776. #endif
  7777. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  7778. case TLSX_POST_HANDSHAKE_AUTH:
  7779. break;
  7780. #endif
  7781. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
  7782. case TLSX_SIGNATURE_ALGORITHMS_CERT:
  7783. break;
  7784. #endif
  7785. case TLSX_KEY_SHARE:
  7786. KS_FREE_ALL((KeyShareEntry*)extension->data, heap);
  7787. break;
  7788. #endif
  7789. }
  7790. XFREE(extension, heap, DYNAMIC_TYPE_TLSX);
  7791. }
  7792. (void)heap;
  7793. }
  7794. /** Checks if the tls extensions are supported based on the protocol version. */
  7795. int TLSX_SupportExtensions(WOLFSSL* ssl) {
  7796. return ssl && (IsTLS(ssl) || ssl->version.major == DTLS_MAJOR);
  7797. }
  7798. /** Tells the buffered size of the extensions in a list. */
  7799. static int TLSX_GetSize(TLSX* list, byte* semaphore, byte msgType,
  7800. word16* pLength)
  7801. {
  7802. int ret = 0;
  7803. TLSX* extension;
  7804. word16 length = 0;
  7805. byte isRequest = (msgType == client_hello ||
  7806. msgType == certificate_request);
  7807. while ((extension = list)) {
  7808. list = extension->next;
  7809. /* only extensions marked as response are sent back to the client. */
  7810. if (!isRequest && !extension->resp)
  7811. continue; /* skip! */
  7812. /* ssl level extensions are expected to override ctx level ones. */
  7813. if (!IS_OFF(semaphore, TLSX_ToSemaphore(extension->type)))
  7814. continue; /* skip! */
  7815. /* extension type + extension data length. */
  7816. length += HELLO_EXT_TYPE_SZ + OPAQUE16_LEN;
  7817. switch (extension->type) {
  7818. #ifdef HAVE_SNI
  7819. case TLSX_SERVER_NAME:
  7820. /* SNI only sends the name on the request. */
  7821. if (isRequest)
  7822. length += SNI_GET_SIZE((SNI*)extension->data);
  7823. break;
  7824. #endif
  7825. case TLSX_TRUSTED_CA_KEYS:
  7826. /* TCA only sends the list on the request. */
  7827. if (isRequest)
  7828. length += TCA_GET_SIZE((TCA*)extension->data);
  7829. break;
  7830. case TLSX_MAX_FRAGMENT_LENGTH:
  7831. length += MFL_GET_SIZE(extension->data);
  7832. break;
  7833. case TLSX_EXTENDED_MASTER_SECRET:
  7834. case TLSX_TRUNCATED_HMAC:
  7835. /* always empty. */
  7836. break;
  7837. case TLSX_SUPPORTED_GROUPS:
  7838. length += EC_GET_SIZE((SupportedCurve*)extension->data);
  7839. break;
  7840. case TLSX_EC_POINT_FORMATS:
  7841. length += PF_GET_SIZE((PointFormat*)extension->data);
  7842. break;
  7843. case TLSX_STATUS_REQUEST:
  7844. length += CSR_GET_SIZE(
  7845. (CertificateStatusRequest*)extension->data, isRequest);
  7846. break;
  7847. case TLSX_STATUS_REQUEST_V2:
  7848. length += CSR2_GET_SIZE(
  7849. (CertificateStatusRequestItemV2*)extension->data,
  7850. isRequest);
  7851. break;
  7852. case TLSX_RENEGOTIATION_INFO:
  7853. length += SCR_GET_SIZE((SecureRenegotiation*)extension->data,
  7854. isRequest);
  7855. break;
  7856. case TLSX_SESSION_TICKET:
  7857. length += WOLF_STK_GET_SIZE((SessionTicket*)extension->data,
  7858. isRequest);
  7859. break;
  7860. case TLSX_QUANTUM_SAFE_HYBRID:
  7861. length += QSH_GET_SIZE((QSHScheme*)extension->data, isRequest);
  7862. break;
  7863. case TLSX_APPLICATION_LAYER_PROTOCOL:
  7864. length += ALPN_GET_SIZE((ALPN*)extension->data);
  7865. break;
  7866. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
  7867. case TLSX_SIGNATURE_ALGORITHMS:
  7868. length += SA_GET_SIZE(extension->data);
  7869. break;
  7870. #endif
  7871. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  7872. case TLSX_ENCRYPT_THEN_MAC:
  7873. ret = ETM_GET_SIZE(msgType, &length);
  7874. break;
  7875. #endif /* HAVE_ENCRYPT_THEN_MAC */
  7876. #ifdef WOLFSSL_TLS13
  7877. case TLSX_SUPPORTED_VERSIONS:
  7878. ret = SV_GET_SIZE(extension->data, msgType, &length);
  7879. break;
  7880. #ifdef WOLFSSL_SEND_HRR_COOKIE
  7881. case TLSX_COOKIE:
  7882. ret = CKE_GET_SIZE((Cookie*)extension->data, msgType, &length);
  7883. break;
  7884. #endif
  7885. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  7886. case TLSX_PRE_SHARED_KEY:
  7887. ret = PSK_GET_SIZE((PreSharedKey*)extension->data, msgType,
  7888. &length);
  7889. break;
  7890. case TLSX_PSK_KEY_EXCHANGE_MODES:
  7891. ret = PKM_GET_SIZE(extension->val, msgType, &length);
  7892. break;
  7893. #endif
  7894. #ifdef WOLFSSL_EARLY_DATA
  7895. case TLSX_EARLY_DATA:
  7896. ret = EDI_GET_SIZE(msgType, &length);
  7897. break;
  7898. #endif
  7899. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  7900. case TLSX_POST_HANDSHAKE_AUTH:
  7901. ret = PHA_GET_SIZE(msgType, &length);
  7902. break;
  7903. #endif
  7904. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
  7905. case TLSX_SIGNATURE_ALGORITHMS_CERT:
  7906. length += SAC_GET_SIZE(extension->data);
  7907. break;
  7908. #endif
  7909. case TLSX_KEY_SHARE:
  7910. length += KS_GET_SIZE((KeyShareEntry*)extension->data, msgType);
  7911. break;
  7912. #endif
  7913. }
  7914. /* marks the extension as processed so ctx level */
  7915. /* extensions don't overlap with ssl level ones. */
  7916. TURN_ON(semaphore, TLSX_ToSemaphore(extension->type));
  7917. }
  7918. *pLength += length;
  7919. return ret;
  7920. }
  7921. /** Writes the extensions of a list in a buffer. */
  7922. static int TLSX_Write(TLSX* list, byte* output, byte* semaphore,
  7923. byte msgType, word16* pOffset)
  7924. {
  7925. int ret = 0;
  7926. TLSX* extension;
  7927. word16 offset = 0;
  7928. word16 length_offset = 0;
  7929. byte isRequest = (msgType == client_hello ||
  7930. msgType == certificate_request);
  7931. while ((extension = list)) {
  7932. list = extension->next;
  7933. /* only extensions marked as response are written in a response. */
  7934. if (!isRequest && !extension->resp)
  7935. continue; /* skip! */
  7936. /* ssl level extensions are expected to override ctx level ones. */
  7937. if (!IS_OFF(semaphore, TLSX_ToSemaphore(extension->type)))
  7938. continue; /* skip! */
  7939. /* writes extension type. */
  7940. c16toa(extension->type, output + offset);
  7941. offset += HELLO_EXT_TYPE_SZ + OPAQUE16_LEN;
  7942. length_offset = offset;
  7943. /* extension data should be written internally. */
  7944. switch (extension->type) {
  7945. #ifdef HAVE_SNI
  7946. case TLSX_SERVER_NAME:
  7947. if (isRequest) {
  7948. WOLFSSL_MSG("SNI extension to write");
  7949. offset += SNI_WRITE((SNI*)extension->data, output + offset);
  7950. }
  7951. break;
  7952. #endif
  7953. case TLSX_TRUSTED_CA_KEYS:
  7954. WOLFSSL_MSG("Trusted CA Indication extension to write");
  7955. if (isRequest) {
  7956. offset += TCA_WRITE((TCA*)extension->data, output + offset);
  7957. }
  7958. break;
  7959. case TLSX_MAX_FRAGMENT_LENGTH:
  7960. WOLFSSL_MSG("Max Fragment Length extension to write");
  7961. offset += MFL_WRITE((byte*)extension->data, output + offset);
  7962. break;
  7963. case TLSX_EXTENDED_MASTER_SECRET:
  7964. WOLFSSL_MSG("Extended Master Secret");
  7965. /* always empty. */
  7966. break;
  7967. case TLSX_TRUNCATED_HMAC:
  7968. WOLFSSL_MSG("Truncated HMAC extension to write");
  7969. /* always empty. */
  7970. break;
  7971. case TLSX_SUPPORTED_GROUPS:
  7972. WOLFSSL_MSG("Supported Groups extension to write");
  7973. offset += EC_WRITE((SupportedCurve*)extension->data,
  7974. output + offset);
  7975. break;
  7976. case TLSX_EC_POINT_FORMATS:
  7977. WOLFSSL_MSG("Point Formats extension to write");
  7978. offset += PF_WRITE((PointFormat*)extension->data,
  7979. output + offset);
  7980. break;
  7981. case TLSX_STATUS_REQUEST:
  7982. WOLFSSL_MSG("Certificate Status Request extension to write");
  7983. offset += CSR_WRITE((CertificateStatusRequest*)extension->data,
  7984. output + offset, isRequest);
  7985. break;
  7986. case TLSX_STATUS_REQUEST_V2:
  7987. WOLFSSL_MSG("Certificate Status Request v2 extension to write");
  7988. offset += CSR2_WRITE(
  7989. (CertificateStatusRequestItemV2*)extension->data,
  7990. output + offset, isRequest);
  7991. break;
  7992. case TLSX_RENEGOTIATION_INFO:
  7993. WOLFSSL_MSG("Secure Renegotiation extension to write");
  7994. offset += SCR_WRITE((SecureRenegotiation*)extension->data,
  7995. output + offset, isRequest);
  7996. break;
  7997. case TLSX_SESSION_TICKET:
  7998. WOLFSSL_MSG("Session Ticket extension to write");
  7999. offset += WOLF_STK_WRITE((SessionTicket*)extension->data,
  8000. output + offset, isRequest);
  8001. break;
  8002. case TLSX_QUANTUM_SAFE_HYBRID:
  8003. WOLFSSL_MSG("Quantum-Safe-Hybrid extension to write");
  8004. if (isRequest) {
  8005. offset += QSH_WRITE((QSHScheme*)extension->data, output + offset);
  8006. }
  8007. offset += QSHPK_WRITE((QSHScheme*)extension->data, output + offset);
  8008. offset += QSH_SERREQ(output + offset, isRequest);
  8009. break;
  8010. case TLSX_APPLICATION_LAYER_PROTOCOL:
  8011. WOLFSSL_MSG("ALPN extension to write");
  8012. offset += ALPN_WRITE((ALPN*)extension->data, output + offset);
  8013. break;
  8014. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
  8015. case TLSX_SIGNATURE_ALGORITHMS:
  8016. WOLFSSL_MSG("Signature Algorithms extension to write");
  8017. offset += SA_WRITE(extension->data, output + offset);
  8018. break;
  8019. #endif
  8020. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  8021. case TLSX_ENCRYPT_THEN_MAC:
  8022. WOLFSSL_MSG("Encrypt-Then-Mac extension to write");
  8023. ret = ETM_WRITE(extension->data, output, msgType, &offset);
  8024. break;
  8025. #endif /* HAVE_ENCRYPT_THEN_MAC */
  8026. #ifdef WOLFSSL_TLS13
  8027. case TLSX_SUPPORTED_VERSIONS:
  8028. WOLFSSL_MSG("Supported Versions extension to write");
  8029. ret = SV_WRITE(extension->data, output + offset, msgType, &offset);
  8030. break;
  8031. #ifdef WOLFSSL_SEND_HRR_COOKIE
  8032. case TLSX_COOKIE:
  8033. WOLFSSL_MSG("Cookie extension to write");
  8034. ret = CKE_WRITE((Cookie*)extension->data, output + offset,
  8035. msgType, &offset);
  8036. break;
  8037. #endif
  8038. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  8039. case TLSX_PRE_SHARED_KEY:
  8040. WOLFSSL_MSG("Pre-Shared Key extension to write");
  8041. ret = PSK_WRITE((PreSharedKey*)extension->data, output + offset,
  8042. msgType, &offset);
  8043. break;
  8044. case TLSX_PSK_KEY_EXCHANGE_MODES:
  8045. WOLFSSL_MSG("PSK Key Exchange Modes extension to write");
  8046. ret = PKM_WRITE(extension->val, output + offset, msgType,
  8047. &offset);
  8048. break;
  8049. #endif
  8050. #ifdef WOLFSSL_EARLY_DATA
  8051. case TLSX_EARLY_DATA:
  8052. WOLFSSL_MSG("Early Data extension to write");
  8053. ret = EDI_WRITE(extension->val, output + offset, msgType,
  8054. &offset);
  8055. break;
  8056. #endif
  8057. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  8058. case TLSX_POST_HANDSHAKE_AUTH:
  8059. WOLFSSL_MSG("Post-Handshake Authentication extension to write");
  8060. ret = PHA_WRITE(output + offset, msgType, &offset);
  8061. break;
  8062. #endif
  8063. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
  8064. case TLSX_SIGNATURE_ALGORITHMS_CERT:
  8065. WOLFSSL_MSG("Signature Algorithms extension to write");
  8066. offset += SAC_WRITE(extension->data, output + offset);
  8067. break;
  8068. #endif
  8069. case TLSX_KEY_SHARE:
  8070. WOLFSSL_MSG("Key Share extension to write");
  8071. offset += KS_WRITE((KeyShareEntry*)extension->data,
  8072. output + offset, msgType);
  8073. break;
  8074. #endif
  8075. }
  8076. /* writes extension data length. */
  8077. c16toa(offset - length_offset, output + length_offset - OPAQUE16_LEN);
  8078. /* marks the extension as processed so ctx level */
  8079. /* extensions don't overlap with ssl level ones. */
  8080. TURN_ON(semaphore, TLSX_ToSemaphore(extension->type));
  8081. }
  8082. *pOffset += offset;
  8083. return ret;
  8084. }
  8085. #if defined(HAVE_NTRU) && defined(HAVE_QSH)
  8086. static word32 GetEntropy(unsigned char* out, word32 num_bytes)
  8087. {
  8088. int ret = 0;
  8089. if (gRng == NULL) {
  8090. if ((gRng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL,
  8091. DYNAMIC_TYPE_TLSX)) == NULL)
  8092. return DRBG_OUT_OF_MEMORY;
  8093. wc_InitRng(gRng);
  8094. }
  8095. if (gRngMutex == NULL) {
  8096. if ((gRngMutex = (wolfSSL_Mutex*)XMALLOC(sizeof(wolfSSL_Mutex), NULL,
  8097. DYNAMIC_TYPE_TLSX)) == NULL)
  8098. return DRBG_OUT_OF_MEMORY;
  8099. wc_InitMutex(gRngMutex);
  8100. }
  8101. ret |= wc_LockMutex(gRngMutex);
  8102. ret |= wc_RNG_GenerateBlock(gRng, out, num_bytes);
  8103. ret |= wc_UnLockMutex(gRngMutex);
  8104. if (ret != 0)
  8105. return DRBG_ENTROPY_FAIL;
  8106. return DRBG_OK;
  8107. }
  8108. #endif
  8109. #ifdef HAVE_QSH
  8110. static int TLSX_CreateQSHKey(WOLFSSL* ssl, int type)
  8111. {
  8112. int ret = -1;
  8113. (void)ssl;
  8114. switch (type) {
  8115. #ifdef HAVE_NTRU
  8116. case WOLFSSL_NTRU_EESS439:
  8117. case WOLFSSL_NTRU_EESS593:
  8118. case WOLFSSL_NTRU_EESS743:
  8119. ret = TLSX_CreateNtruKey(ssl, type);
  8120. break;
  8121. #endif
  8122. default:
  8123. WOLFSSL_MSG("Unknown type for creating NTRU key");
  8124. break;
  8125. }
  8126. return ret;
  8127. }
  8128. static int TLSX_AddQSHKey(QSHKey** list, QSHKey* key)
  8129. {
  8130. QSHKey* current;
  8131. if (key == NULL)
  8132. return BAD_FUNC_ARG;
  8133. /* if no public key stored in key then do not add */
  8134. if (key->pub.length == 0 || key->pub.buffer == NULL)
  8135. return 0;
  8136. /* first element to be added to the list */
  8137. current = *list;
  8138. if (current == NULL) {
  8139. *list = key;
  8140. return 0;
  8141. }
  8142. while (current->next) {
  8143. /* can only have one of the key in the list */
  8144. if (current->name == key->name)
  8145. return -1;
  8146. current = (QSHKey*)current->next;
  8147. }
  8148. current->next = (struct QSHKey*)key;
  8149. return 0;
  8150. }
  8151. #if defined(HAVE_NTRU)
  8152. int TLSX_CreateNtruKey(WOLFSSL* ssl, int type)
  8153. {
  8154. int ret = -1;
  8155. int ntruType;
  8156. /* variable declarations for NTRU*/
  8157. QSHKey* temp = NULL;
  8158. byte public_key[1027];
  8159. word16 public_key_len = sizeof(public_key);
  8160. byte private_key[1120];
  8161. word16 private_key_len = sizeof(private_key);
  8162. DRBG_HANDLE drbg;
  8163. if (ssl == NULL)
  8164. return BAD_FUNC_ARG;
  8165. switch (type) {
  8166. case WOLFSSL_NTRU_EESS439:
  8167. ntruType = NTRU_EES439EP1;
  8168. break;
  8169. case WOLFSSL_NTRU_EESS593:
  8170. ntruType = NTRU_EES593EP1;
  8171. break;
  8172. case WOLFSSL_NTRU_EESS743:
  8173. ntruType = NTRU_EES743EP1;
  8174. break;
  8175. default:
  8176. WOLFSSL_MSG("Unknown type for creating NTRU key");
  8177. return -1;
  8178. }
  8179. ret = ntru_crypto_drbg_external_instantiate(GetEntropy, &drbg);
  8180. if (ret != DRBG_OK) {
  8181. WOLFSSL_MSG("NTRU drbg instantiate failed\n");
  8182. return ret;
  8183. }
  8184. if ((ret = ntru_crypto_ntru_encrypt_keygen(drbg, ntruType,
  8185. &public_key_len, NULL, &private_key_len, NULL)) != NTRU_OK)
  8186. return ret;
  8187. if ((ret = ntru_crypto_ntru_encrypt_keygen(drbg, ntruType,
  8188. &public_key_len, public_key, &private_key_len, private_key)) != NTRU_OK)
  8189. return ret;
  8190. ret = ntru_crypto_drbg_uninstantiate(drbg);
  8191. if (ret != NTRU_OK) {
  8192. WOLFSSL_MSG("NTRU drbg uninstantiate failed\n");
  8193. return ret;
  8194. }
  8195. if ((temp = (QSHKey*)XMALLOC(sizeof(QSHKey), ssl->heap,
  8196. DYNAMIC_TYPE_TLSX)) == NULL)
  8197. return MEMORY_E;
  8198. temp->name = type;
  8199. temp->pub.length = public_key_len;
  8200. temp->pub.buffer = (byte*)XMALLOC(public_key_len, ssl->heap,
  8201. DYNAMIC_TYPE_PUBLIC_KEY);
  8202. XMEMCPY(temp->pub.buffer, public_key, public_key_len);
  8203. temp->pri.length = private_key_len;
  8204. temp->pri.buffer = (byte*)XMALLOC(private_key_len, ssl->heap,
  8205. DYNAMIC_TYPE_ARRAYS);
  8206. XMEMCPY(temp->pri.buffer, private_key, private_key_len);
  8207. temp->next = NULL;
  8208. TLSX_AddQSHKey(&ssl->QSH_Key, temp);
  8209. (void)ssl;
  8210. (void)type;
  8211. return ret;
  8212. }
  8213. #endif
  8214. /*
  8215. Used to find a public key from the list of keys
  8216. pubLen length of array
  8217. name input the name of the scheme looking for ie WOLFSSL_NTRU_ESSXXX
  8218. returns a pointer to public key byte* or NULL if not found
  8219. */
  8220. static byte* TLSX_QSHKeyFind_Pub(QSHKey* qsh, word16* pubLen, word16 name)
  8221. {
  8222. QSHKey* current = qsh;
  8223. if (qsh == NULL || pubLen == NULL)
  8224. return NULL;
  8225. *pubLen = 0;
  8226. while(current) {
  8227. if (current->name == name) {
  8228. *pubLen = current->pub.length;
  8229. return current->pub.buffer;
  8230. }
  8231. current = (QSHKey*)current->next;
  8232. }
  8233. return NULL;
  8234. }
  8235. #endif /* HAVE_QSH */
  8236. #ifdef HAVE_SUPPORTED_CURVES
  8237. /* Populates the default supported groups / curves */
  8238. static int TLSX_PopulateSupportedGroups(WOLFSSL* ssl, TLSX** extensions)
  8239. {
  8240. int ret = WOLFSSL_SUCCESS;
  8241. #ifdef WOLFSSL_TLS13
  8242. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  8243. if (ssl->options.resuming && ssl->session.namedGroup != 0) {
  8244. return TLSX_UseSupportedCurve(extensions, ssl->session.namedGroup,
  8245. ssl->heap);
  8246. }
  8247. #endif
  8248. if (ssl->numGroups != 0) {
  8249. int i;
  8250. for (i = 0; i < ssl->numGroups; i++) {
  8251. ret = TLSX_UseSupportedCurve(extensions, ssl->group[i], ssl->heap);
  8252. if (ret != WOLFSSL_SUCCESS)
  8253. return ret;
  8254. }
  8255. return WOLFSSL_SUCCESS;
  8256. }
  8257. #endif /* WOLFSSL_TLS13 */
  8258. #if defined(HAVE_ECC)
  8259. /* list in order by strength, since not all servers choose by strength */
  8260. #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
  8261. #ifndef NO_ECC_SECP
  8262. ret = TLSX_UseSupportedCurve(extensions,
  8263. WOLFSSL_ECC_SECP521R1, ssl->heap);
  8264. if (ret != WOLFSSL_SUCCESS) return ret;
  8265. #endif
  8266. #endif
  8267. #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
  8268. #ifdef HAVE_ECC_BRAINPOOL
  8269. ret = TLSX_UseSupportedCurve(extensions,
  8270. WOLFSSL_ECC_BRAINPOOLP512R1, ssl->heap);
  8271. if (ret != WOLFSSL_SUCCESS) return ret;
  8272. #endif
  8273. #endif
  8274. #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
  8275. #ifndef NO_ECC_SECP
  8276. ret = TLSX_UseSupportedCurve(extensions,
  8277. WOLFSSL_ECC_SECP384R1, ssl->heap);
  8278. if (ret != WOLFSSL_SUCCESS) return ret;
  8279. #endif
  8280. #ifdef HAVE_ECC_BRAINPOOL
  8281. ret = TLSX_UseSupportedCurve(extensions,
  8282. WOLFSSL_ECC_BRAINPOOLP384R1, ssl->heap);
  8283. if (ret != WOLFSSL_SUCCESS) return ret;
  8284. #endif
  8285. #endif
  8286. #endif /* HAVE_ECC */
  8287. #ifndef HAVE_FIPS
  8288. #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
  8289. ret = TLSX_UseSupportedCurve(extensions,
  8290. WOLFSSL_ECC_X448, ssl->heap);
  8291. if (ret != WOLFSSL_SUCCESS) return ret;
  8292. #endif
  8293. #endif /* HAVE_FIPS */
  8294. #if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES)
  8295. #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
  8296. #ifndef NO_ECC_SECP
  8297. ret = TLSX_UseSupportedCurve(extensions,
  8298. WOLFSSL_ECC_SECP256R1, ssl->heap);
  8299. if (ret != WOLFSSL_SUCCESS) return ret;
  8300. #endif
  8301. #ifdef HAVE_ECC_KOBLITZ
  8302. ret = TLSX_UseSupportedCurve(extensions,
  8303. WOLFSSL_ECC_SECP256K1, ssl->heap);
  8304. if (ret != WOLFSSL_SUCCESS) return ret;
  8305. #endif
  8306. #ifdef HAVE_ECC_BRAINPOOL
  8307. ret = TLSX_UseSupportedCurve(extensions,
  8308. WOLFSSL_ECC_BRAINPOOLP256R1, ssl->heap);
  8309. if (ret != WOLFSSL_SUCCESS) return ret;
  8310. #endif
  8311. #endif
  8312. #endif /* HAVE_ECC */
  8313. #ifndef HAVE_FIPS
  8314. #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
  8315. ret = TLSX_UseSupportedCurve(extensions,
  8316. WOLFSSL_ECC_X25519, ssl->heap);
  8317. if (ret != WOLFSSL_SUCCESS) return ret;
  8318. #endif
  8319. #endif /* HAVE_FIPS */
  8320. #if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES)
  8321. #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
  8322. #ifndef NO_ECC_SECP
  8323. ret = TLSX_UseSupportedCurve(extensions,
  8324. WOLFSSL_ECC_SECP224R1, ssl->heap);
  8325. if (ret != WOLFSSL_SUCCESS) return ret;
  8326. #endif
  8327. #ifdef HAVE_ECC_KOBLITZ
  8328. ret = TLSX_UseSupportedCurve(extensions,
  8329. WOLFSSL_ECC_SECP224K1, ssl->heap);
  8330. if (ret != WOLFSSL_SUCCESS) return ret;
  8331. #endif
  8332. #endif
  8333. #ifndef HAVE_FIPS
  8334. #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
  8335. #ifndef NO_ECC_SECP
  8336. ret = TLSX_UseSupportedCurve(extensions,
  8337. WOLFSSL_ECC_SECP192R1, ssl->heap);
  8338. if (ret != WOLFSSL_SUCCESS) return ret;
  8339. #endif
  8340. #ifdef HAVE_ECC_KOBLITZ
  8341. ret = TLSX_UseSupportedCurve(extensions,
  8342. WOLFSSL_ECC_SECP192K1, ssl->heap);
  8343. if (ret != WOLFSSL_SUCCESS) return ret;
  8344. #endif
  8345. #endif
  8346. #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
  8347. #ifndef NO_ECC_SECP
  8348. ret = TLSX_UseSupportedCurve(extensions,
  8349. WOLFSSL_ECC_SECP160R1, ssl->heap);
  8350. if (ret != WOLFSSL_SUCCESS) return ret;
  8351. #endif
  8352. #ifdef HAVE_ECC_SECPR2
  8353. ret = TLSX_UseSupportedCurve(extensions,
  8354. WOLFSSL_ECC_SECP160R2, ssl->heap);
  8355. if (ret != WOLFSSL_SUCCESS) return ret;
  8356. #endif
  8357. #ifdef HAVE_ECC_KOBLITZ
  8358. ret = TLSX_UseSupportedCurve(extensions,
  8359. WOLFSSL_ECC_SECP160K1, ssl->heap);
  8360. if (ret != WOLFSSL_SUCCESS) return ret;
  8361. #endif
  8362. #endif
  8363. #endif /* HAVE_FIPS */
  8364. #endif /* HAVE_ECC */
  8365. #ifndef NO_DH
  8366. /* Add FFDHE supported groups. */
  8367. #ifdef HAVE_FFDHE_8192
  8368. if (8192/8 >= ssl->options.minDhKeySz &&
  8369. 8192/8 <= ssl->options.maxDhKeySz) {
  8370. ret = TLSX_UseSupportedCurve(extensions,
  8371. WOLFSSL_FFDHE_8192, ssl->heap);
  8372. if (ret != WOLFSSL_SUCCESS)
  8373. return ret;
  8374. }
  8375. #endif
  8376. #ifdef HAVE_FFDHE_6144
  8377. if (6144/8 >= ssl->options.minDhKeySz &&
  8378. 6144/8 <= ssl->options.maxDhKeySz) {
  8379. ret = TLSX_UseSupportedCurve(extensions,
  8380. WOLFSSL_FFDHE_6144, ssl->heap);
  8381. if (ret != WOLFSSL_SUCCESS)
  8382. return ret;
  8383. }
  8384. #endif
  8385. #ifdef HAVE_FFDHE_4096
  8386. if (4096/8 >= ssl->options.minDhKeySz &&
  8387. 4096/8 <= ssl->options.maxDhKeySz) {
  8388. ret = TLSX_UseSupportedCurve(extensions,
  8389. WOLFSSL_FFDHE_4096, ssl->heap);
  8390. if (ret != WOLFSSL_SUCCESS)
  8391. return ret;
  8392. }
  8393. #endif
  8394. #ifdef HAVE_FFDHE_3072
  8395. if (3072/8 >= ssl->options.minDhKeySz &&
  8396. 3072/8 <= ssl->options.maxDhKeySz) {
  8397. ret = TLSX_UseSupportedCurve(extensions,
  8398. WOLFSSL_FFDHE_3072, ssl->heap);
  8399. if (ret != WOLFSSL_SUCCESS)
  8400. return ret;
  8401. }
  8402. #endif
  8403. #ifdef HAVE_FFDHE_2048
  8404. if (2048/8 >= ssl->options.minDhKeySz &&
  8405. 2048/8 <= ssl->options.maxDhKeySz) {
  8406. ret = TLSX_UseSupportedCurve(extensions,
  8407. WOLFSSL_FFDHE_2048, ssl->heap);
  8408. if (ret != WOLFSSL_SUCCESS)
  8409. return ret;
  8410. }
  8411. #endif
  8412. #endif
  8413. (void)ssl;
  8414. (void)extensions;
  8415. return ret;
  8416. }
  8417. #endif /* HAVE_SUPPORTED_CURVES */
  8418. #if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
  8419. static const word16 preferredGroup[] = {
  8420. #if defined(HAVE_ECC) && (!defined(NO_ECC256) || \
  8421. defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP) && ECC_MIN_KEY_SZ <= 256
  8422. WOLFSSL_ECC_SECP256R1,
  8423. #endif
  8424. #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
  8425. WOLFSSL_ECC_X25519,
  8426. #endif
  8427. #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
  8428. WOLFSSL_ECC_X448,
  8429. #endif
  8430. #if defined(HAVE_ECC) && (!defined(NO_ECC384) || \
  8431. defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP) && ECC_MIN_KEY_SZ <= 384
  8432. WOLFSSL_ECC_SECP384R1,
  8433. #endif
  8434. #if defined(HAVE_ECC) && (!defined(NO_ECC521) || \
  8435. defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP) && ECC_MIN_KEY_SZ <= 521
  8436. WOLFSSL_ECC_SECP521R1,
  8437. #endif
  8438. #if defined(HAVE_FFDHE_2048)
  8439. WOLFSSL_FFDHE_2048,
  8440. #endif
  8441. #if defined(HAVE_FFDHE_3072)
  8442. WOLFSSL_FFDHE_3072,
  8443. #endif
  8444. #if defined(HAVE_FFDHE_4096)
  8445. WOLFSSL_FFDHE_4096,
  8446. #endif
  8447. #if defined(HAVE_FFDHE_6144)
  8448. WOLFSSL_FFDHE_6144,
  8449. #endif
  8450. #if defined(HAVE_FFDHE_8192)
  8451. WOLFSSL_FFDHE_8192,
  8452. #endif
  8453. };
  8454. #define PREFERRED_GROUP_SZ (sizeof(preferredGroup) / sizeof(*preferredGroup))
  8455. #endif /* WOLFSSL_TLS13 && HAVE_SUPPORTED_CURVES */
  8456. int TLSX_PopulateExtensions(WOLFSSL* ssl, byte isServer)
  8457. {
  8458. int ret = 0;
  8459. byte* public_key = NULL;
  8460. word16 public_key_len = 0;
  8461. #if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
  8462. int usingPSK = 0;
  8463. #endif
  8464. #ifdef HAVE_QSH
  8465. TLSX* extension;
  8466. QSHScheme* qsh;
  8467. QSHScheme* next;
  8468. /* add supported QSHSchemes */
  8469. WOLFSSL_MSG("Adding supported QSH Schemes");
  8470. #endif
  8471. /* server will add extension depending on what is parsed from client */
  8472. if (!isServer) {
  8473. #ifdef HAVE_QSH
  8474. /* test if user has set a specific scheme already */
  8475. if (!ssl->user_set_QSHSchemes) {
  8476. if (ssl->sendQSHKeys && ssl->QSH_Key == NULL) {
  8477. if ((ret = TLSX_CreateQSHKey(ssl, WOLFSSL_NTRU_EESS743)) != 0) {
  8478. WOLFSSL_MSG("Error creating ntru keys");
  8479. return ret;
  8480. }
  8481. if ((ret = TLSX_CreateQSHKey(ssl, WOLFSSL_NTRU_EESS593)) != 0) {
  8482. WOLFSSL_MSG("Error creating ntru keys");
  8483. return ret;
  8484. }
  8485. if ((ret = TLSX_CreateQSHKey(ssl, WOLFSSL_NTRU_EESS439)) != 0) {
  8486. WOLFSSL_MSG("Error creating ntru keys");
  8487. return ret;
  8488. }
  8489. /* add NTRU 256 */
  8490. public_key = TLSX_QSHKeyFind_Pub(ssl->QSH_Key,
  8491. &public_key_len, WOLFSSL_NTRU_EESS743);
  8492. }
  8493. if (TLSX_UseQSHScheme(&ssl->extensions, WOLFSSL_NTRU_EESS743,
  8494. public_key, public_key_len, ssl->heap)
  8495. != WOLFSSL_SUCCESS)
  8496. ret = -1;
  8497. /* add NTRU 196 */
  8498. if (ssl->sendQSHKeys) {
  8499. public_key = TLSX_QSHKeyFind_Pub(ssl->QSH_Key,
  8500. &public_key_len, WOLFSSL_NTRU_EESS593);
  8501. }
  8502. if (TLSX_UseQSHScheme(&ssl->extensions, WOLFSSL_NTRU_EESS593,
  8503. public_key, public_key_len, ssl->heap)
  8504. != WOLFSSL_SUCCESS)
  8505. ret = -1;
  8506. /* add NTRU 128 */
  8507. if (ssl->sendQSHKeys) {
  8508. public_key = TLSX_QSHKeyFind_Pub(ssl->QSH_Key,
  8509. &public_key_len, WOLFSSL_NTRU_EESS439);
  8510. }
  8511. if (TLSX_UseQSHScheme(&ssl->extensions, WOLFSSL_NTRU_EESS439,
  8512. public_key, public_key_len, ssl->heap)
  8513. != WOLFSSL_SUCCESS)
  8514. ret = -1;
  8515. }
  8516. else if (ssl->sendQSHKeys && ssl->QSH_Key == NULL) {
  8517. /* for each scheme make a client key */
  8518. extension = TLSX_Find(ssl->extensions, TLSX_QUANTUM_SAFE_HYBRID);
  8519. if (extension) {
  8520. qsh = (QSHScheme*)extension->data;
  8521. while (qsh) {
  8522. if ((ret = TLSX_CreateQSHKey(ssl, qsh->name)) != 0)
  8523. return ret;
  8524. /* get next now because qsh could be freed */
  8525. next = qsh->next;
  8526. /* find the public key created and add to extension*/
  8527. public_key = TLSX_QSHKeyFind_Pub(ssl->QSH_Key,
  8528. &public_key_len, qsh->name);
  8529. if (TLSX_UseQSHScheme(&ssl->extensions, qsh->name,
  8530. public_key, public_key_len,
  8531. ssl->heap) != WOLFSSL_SUCCESS)
  8532. ret = -1;
  8533. qsh = next;
  8534. }
  8535. }
  8536. }
  8537. #endif
  8538. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  8539. if (!ssl->options.disallowEncThenMac) {
  8540. ret = TLSX_EncryptThenMac_Use(ssl);
  8541. if (ret != 0)
  8542. return ret;
  8543. }
  8544. #endif
  8545. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  8546. defined(HAVE_CURVE448)) && defined(HAVE_SUPPORTED_CURVES)
  8547. if (!ssl->options.userCurves && !ssl->ctx->userCurves) {
  8548. if (TLSX_Find(ssl->ctx->extensions,
  8549. TLSX_SUPPORTED_GROUPS) == NULL) {
  8550. ret = TLSX_PopulateSupportedGroups(ssl, &ssl->extensions);
  8551. if (ret != WOLFSSL_SUCCESS)
  8552. return ret;
  8553. }
  8554. }
  8555. if ((!IsAtLeastTLSv1_3(ssl->version) || ssl->options.downgrade) &&
  8556. TLSX_Find(ssl->ctx->extensions, TLSX_EC_POINT_FORMATS) == NULL &&
  8557. TLSX_Find(ssl->extensions, TLSX_EC_POINT_FORMATS) == NULL) {
  8558. ret = TLSX_UsePointFormat(&ssl->extensions,
  8559. WOLFSSL_EC_PF_UNCOMPRESSED, ssl->heap);
  8560. if (ret != WOLFSSL_SUCCESS)
  8561. return ret;
  8562. }
  8563. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && HAVE_SUPPORTED_CURVES */
  8564. } /* is not server */
  8565. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
  8566. WOLFSSL_MSG("Adding signature algorithms extension");
  8567. if ((ret = TLSX_SetSignatureAlgorithms(&ssl->extensions, ssl, ssl->heap))
  8568. != 0) {
  8569. return ret;
  8570. }
  8571. #else
  8572. ret = 0;
  8573. #endif
  8574. #ifdef WOLFSSL_TLS13
  8575. if (!isServer && IsAtLeastTLSv1_3(ssl->version)) {
  8576. /* Add mandatory TLS v1.3 extension: supported version */
  8577. WOLFSSL_MSG("Adding supported versions extension");
  8578. if ((ret = TLSX_SetSupportedVersions(&ssl->extensions, ssl,
  8579. ssl->heap)) != 0) {
  8580. return ret;
  8581. }
  8582. #if !defined(HAVE_ECC) && !defined(HAVE_CURVE25519) && \
  8583. !defined(HAVE_CURVE448) && defined(HAVE_SUPPORTED_CURVES)
  8584. if (TLSX_Find(ssl->ctx->extensions, TLSX_SUPPORTED_GROUPS) == NULL) {
  8585. /* Put in DH groups for TLS 1.3 only. */
  8586. ret = TLSX_PopulateSupportedGroups(ssl, &ssl->extensions);
  8587. if (ret != WOLFSSL_SUCCESS)
  8588. return ret;
  8589. ret = 0;
  8590. }
  8591. #endif /* !(HAVE_ECC || CURVE25519 || CURVE448) && HAVE_SUPPORTED_CURVES */
  8592. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
  8593. if (ssl->certHashSigAlgoSz > 0) {
  8594. WOLFSSL_MSG("Adding signature algorithms cert extension");
  8595. if ((ret = TLSX_SetSignatureAlgorithmsCert(&ssl->extensions,
  8596. ssl, ssl->heap)) != 0) {
  8597. return ret;
  8598. }
  8599. }
  8600. #endif
  8601. #if defined(HAVE_SUPPORTED_CURVES)
  8602. if (TLSX_Find(ssl->extensions, TLSX_KEY_SHARE) == NULL) {
  8603. word16 namedGroup;
  8604. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  8605. if (ssl->options.resuming && ssl->session.namedGroup != 0)
  8606. namedGroup = ssl->session.namedGroup;
  8607. else
  8608. #endif
  8609. if (PREFERRED_GROUP_SZ == 0) {
  8610. WOLFSSL_MSG("No groups in preference list");
  8611. return KEY_SHARE_ERROR;
  8612. }
  8613. else if (ssl->numGroups > 0) {
  8614. int set = 0;
  8615. int i, j;
  8616. /* Default to first group in supported list. */
  8617. namedGroup = ssl->group[0];
  8618. /* Try to find preferred in supported list. */
  8619. for (i = 0; i < (int)PREFERRED_GROUP_SZ && !set; i++) {
  8620. for (j = 0; j < ssl->numGroups; j++) {
  8621. if (preferredGroup[i] == ssl->group[j]) {
  8622. /* Most preferred that is supported. */
  8623. namedGroup = ssl->group[j];
  8624. set = 1;
  8625. break;
  8626. }
  8627. }
  8628. }
  8629. }
  8630. else {
  8631. /* Choose the most preferred group. */
  8632. namedGroup = preferredGroup[0];
  8633. }
  8634. ret = TLSX_KeyShare_Use(ssl, namedGroup, 0, NULL, NULL);
  8635. if (ret != 0)
  8636. return ret;
  8637. }
  8638. #endif
  8639. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  8640. TLSX_Remove(&ssl->extensions, TLSX_PRE_SHARED_KEY, ssl->heap);
  8641. #endif
  8642. #if defined(HAVE_SESSION_TICKET)
  8643. if (ssl->options.resuming && ssl->session.ticketLen > 0) {
  8644. WOLFSSL_SESSION* sess = &ssl->session;
  8645. word32 milli;
  8646. if (sess->ticketLen > MAX_PSK_ID_LEN) {
  8647. WOLFSSL_MSG("Session ticket length for PSK ext is too large");
  8648. return BUFFER_ERROR;
  8649. }
  8650. /* Determine the MAC algorithm for the cipher suite used. */
  8651. ssl->options.cipherSuite0 = sess->cipherSuite0;
  8652. ssl->options.cipherSuite = sess->cipherSuite;
  8653. ret = SetCipherSpecs(ssl);
  8654. if (ret != 0)
  8655. return ret;
  8656. milli = TimeNowInMilliseconds() - sess->ticketSeen +
  8657. sess->ticketAdd;
  8658. /* Pre-shared key is mandatory extension for resumption. */
  8659. ret = TLSX_PreSharedKey_Use(ssl, sess->ticket, sess->ticketLen,
  8660. milli, ssl->specs.mac_algorithm,
  8661. ssl->options.cipherSuite0,
  8662. ssl->options.cipherSuite, 1,
  8663. NULL);
  8664. if (ret != 0)
  8665. return ret;
  8666. usingPSK = 1;
  8667. }
  8668. #endif
  8669. #ifndef NO_PSK
  8670. if (ssl->options.client_psk_cb != NULL ||
  8671. ssl->options.client_psk_tls13_cb != NULL) {
  8672. /* Default ciphersuite. */
  8673. byte cipherSuite0 = TLS13_BYTE;
  8674. byte cipherSuite = WOLFSSL_DEF_PSK_CIPHER;
  8675. int cipherSuiteFlags = WOLFSSL_CIPHER_SUITE_FLAG_NONE;
  8676. const char* cipherName = NULL;
  8677. if (ssl->options.client_psk_tls13_cb != NULL) {
  8678. ssl->arrays->psk_keySz = ssl->options.client_psk_tls13_cb(
  8679. ssl, ssl->arrays->server_hint,
  8680. ssl->arrays->client_identity, MAX_PSK_ID_LEN,
  8681. ssl->arrays->psk_key, MAX_PSK_KEY_LEN, &cipherName);
  8682. if (GetCipherSuiteFromName(cipherName, &cipherSuite0,
  8683. &cipherSuite, &cipherSuiteFlags) != 0) {
  8684. return PSK_KEY_ERROR;
  8685. }
  8686. }
  8687. else {
  8688. ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
  8689. ssl->arrays->server_hint, ssl->arrays->client_identity,
  8690. MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
  8691. }
  8692. if (ssl->arrays->psk_keySz == 0 ||
  8693. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  8694. return PSK_KEY_ERROR;
  8695. }
  8696. ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0';
  8697. ssl->options.cipherSuite0 = cipherSuite0;
  8698. ssl->options.cipherSuite = cipherSuite;
  8699. (void)cipherSuiteFlags;
  8700. ret = SetCipherSpecs(ssl);
  8701. if (ret != 0)
  8702. return ret;
  8703. ret = TLSX_PreSharedKey_Use(ssl,
  8704. (byte*)ssl->arrays->client_identity,
  8705. (word16)XSTRLEN(ssl->arrays->client_identity),
  8706. 0, ssl->specs.mac_algorithm,
  8707. cipherSuite0, cipherSuite, 0,
  8708. NULL);
  8709. if (ret != 0)
  8710. return ret;
  8711. usingPSK = 1;
  8712. }
  8713. #endif
  8714. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  8715. if (usingPSK) {
  8716. byte modes;
  8717. /* Pre-shared key modes: mandatory extension for resumption. */
  8718. modes = 1 << PSK_KE;
  8719. #if !defined(NO_DH) || defined(HAVE_ECC) || \
  8720. defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  8721. if (!ssl->options.noPskDheKe)
  8722. modes |= 1 << PSK_DHE_KE;
  8723. #endif
  8724. ret = TLSX_PskKeModes_Use(ssl, modes);
  8725. if (ret != 0)
  8726. return ret;
  8727. }
  8728. #endif
  8729. #if defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  8730. if (!isServer && ssl->options.postHandshakeAuth) {
  8731. ret = TLSX_PostHandAuth_Use(ssl);
  8732. if (ret != 0)
  8733. return ret;
  8734. }
  8735. #endif
  8736. }
  8737. #endif
  8738. (void)isServer;
  8739. (void)public_key;
  8740. (void)public_key_len;
  8741. (void)ssl;
  8742. return ret;
  8743. }
  8744. #if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_CLIENT)
  8745. /** Tells the buffered size of extensions to be sent into the client hello. */
  8746. int TLSX_GetRequestSize(WOLFSSL* ssl, byte msgType, word16* pLength)
  8747. {
  8748. int ret = 0;
  8749. word16 length = 0;
  8750. byte semaphore[SEMAPHORE_SIZE] = {0};
  8751. if (!TLSX_SupportExtensions(ssl))
  8752. return 0;
  8753. if (msgType == client_hello) {
  8754. EC_VALIDATE_REQUEST(ssl, semaphore);
  8755. PF_VALIDATE_REQUEST(ssl, semaphore);
  8756. QSH_VALIDATE_REQUEST(ssl, semaphore);
  8757. WOLF_STK_VALIDATE_REQUEST(ssl);
  8758. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
  8759. if (ssl->suites->hashSigAlgoSz == 0)
  8760. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
  8761. #endif
  8762. #if defined(WOLFSSL_TLS13)
  8763. if (!IsAtLeastTLSv1_2(ssl))
  8764. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
  8765. #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
  8766. if (!IsAtLeastTLSv1_3(ssl->version)) {
  8767. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
  8768. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  8769. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
  8770. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PSK_KEY_EXCHANGE_MODES));
  8771. #endif
  8772. #ifdef WOLFSSL_EARLY_DATA
  8773. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
  8774. #endif
  8775. #ifdef WOLFSSL_SEND_HRR_COOKIE
  8776. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
  8777. #endif
  8778. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  8779. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_POST_HANDSHAKE_AUTH));
  8780. #endif
  8781. }
  8782. #endif
  8783. #endif
  8784. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  8785. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  8786. if (!ssl->ctx->cm->ocspStaplingEnabled) {
  8787. /* mark already sent, so it won't send it */
  8788. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
  8789. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
  8790. }
  8791. #endif
  8792. }
  8793. #ifdef WOLFSSL_TLS13
  8794. #ifndef NO_CERTS
  8795. else if (msgType == certificate_request) {
  8796. /* Don't send out any extension except those that are turned off. */
  8797. XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
  8798. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
  8799. TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
  8800. #endif
  8801. /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP,
  8802. * TLSX_CERTIFICATE_AUTHORITIES, OID_FILTERS
  8803. * TLSX_STATUS_REQUEST
  8804. */
  8805. }
  8806. #endif
  8807. #endif
  8808. if (ssl->extensions) {
  8809. ret = TLSX_GetSize(ssl->extensions, semaphore, msgType, &length);
  8810. if (ret != 0)
  8811. return ret;
  8812. }
  8813. if (ssl->ctx && ssl->ctx->extensions) {
  8814. ret = TLSX_GetSize(ssl->ctx->extensions, semaphore, msgType, &length);
  8815. if (ret != 0)
  8816. return ret;
  8817. }
  8818. #ifdef HAVE_EXTENDED_MASTER
  8819. if (msgType == client_hello && ssl->options.haveEMS &&
  8820. (!IsAtLeastTLSv1_3(ssl->version) || ssl->options.downgrade)) {
  8821. length += HELLO_EXT_SZ;
  8822. }
  8823. #endif
  8824. if (length)
  8825. length += OPAQUE16_LEN; /* for total length storage. */
  8826. *pLength += length;
  8827. return ret;
  8828. }
  8829. /** Writes the extensions to be sent into the client hello. */
  8830. int TLSX_WriteRequest(WOLFSSL* ssl, byte* output, byte msgType, word16* pOffset)
  8831. {
  8832. int ret = 0;
  8833. word16 offset = 0;
  8834. byte semaphore[SEMAPHORE_SIZE] = {0};
  8835. if (!TLSX_SupportExtensions(ssl) || output == NULL)
  8836. return 0;
  8837. offset += OPAQUE16_LEN; /* extensions length */
  8838. if (msgType == client_hello) {
  8839. EC_VALIDATE_REQUEST(ssl, semaphore);
  8840. PF_VALIDATE_REQUEST(ssl, semaphore);
  8841. WOLF_STK_VALIDATE_REQUEST(ssl);
  8842. QSH_VALIDATE_REQUEST(ssl, semaphore);
  8843. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
  8844. if (ssl->suites->hashSigAlgoSz == 0)
  8845. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
  8846. #endif
  8847. #ifdef WOLFSSL_TLS13
  8848. if (!IsAtLeastTLSv1_2(ssl))
  8849. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
  8850. #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
  8851. if (!IsAtLeastTLSv1_3(ssl->version)) {
  8852. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
  8853. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  8854. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PSK_KEY_EXCHANGE_MODES));
  8855. #endif
  8856. #ifdef WOLFSSL_EARLY_DATA
  8857. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
  8858. #endif
  8859. #ifdef WOLFSSL_SEND_HRR_COOKIE
  8860. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
  8861. #endif
  8862. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  8863. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_POST_HANDSHAKE_AUTH));
  8864. #endif
  8865. }
  8866. #endif
  8867. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  8868. /* Must write Pre-shared Key extension at the end in TLS v1.3.
  8869. * Must not write out Pre-shared Key extension in earlier versions of
  8870. * protocol.
  8871. */
  8872. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
  8873. #endif
  8874. #endif
  8875. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  8876. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  8877. /* mark already sent, so it won't send it */
  8878. if (!ssl->ctx->cm->ocspStaplingEnabled) {
  8879. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
  8880. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
  8881. }
  8882. #endif
  8883. }
  8884. #ifdef WOLFSSL_TLS13
  8885. #ifndef NO_CERTS
  8886. else if (msgType == certificate_request) {
  8887. /* Don't send out any extension except those that are turned off. */
  8888. XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
  8889. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
  8890. TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
  8891. #endif
  8892. /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP,
  8893. * TLSX_CERTIFICATE_AUTHORITIES, TLSX_OID_FILTERS
  8894. * TLSX_STATUS_REQUEST
  8895. */
  8896. }
  8897. #endif
  8898. #endif
  8899. if (ssl->extensions) {
  8900. ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
  8901. msgType, &offset);
  8902. if (ret != 0)
  8903. return ret;
  8904. }
  8905. if (ssl->ctx && ssl->ctx->extensions) {
  8906. ret = TLSX_Write(ssl->ctx->extensions, output + offset, semaphore,
  8907. msgType, &offset);
  8908. if (ret != 0)
  8909. return ret;
  8910. }
  8911. #ifdef HAVE_EXTENDED_MASTER
  8912. if (msgType == client_hello && ssl->options.haveEMS &&
  8913. (!IsAtLeastTLSv1_3(ssl->version) || ssl->options.downgrade)) {
  8914. WOLFSSL_MSG("EMS extension to write");
  8915. c16toa(HELLO_EXT_EXTMS, output + offset);
  8916. offset += HELLO_EXT_TYPE_SZ;
  8917. c16toa(0, output + offset);
  8918. offset += HELLO_EXT_SZ_SZ;
  8919. }
  8920. #endif
  8921. #ifdef WOLFSSL_TLS13
  8922. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  8923. if (msgType == client_hello && IsAtLeastTLSv1_3(ssl->version)) {
  8924. /* Write out what we can of Pre-shared key extension. */
  8925. TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
  8926. ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
  8927. client_hello, &offset);
  8928. if (ret != 0)
  8929. return ret;
  8930. }
  8931. #endif
  8932. #endif
  8933. if (offset > OPAQUE16_LEN || msgType != client_hello)
  8934. c16toa(offset - OPAQUE16_LEN, output); /* extensions length */
  8935. *pOffset += offset;
  8936. return ret;
  8937. }
  8938. #endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
  8939. #if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_SERVER)
  8940. /** Tells the buffered size of extensions to be sent into the server hello. */
  8941. int TLSX_GetResponseSize(WOLFSSL* ssl, byte msgType, word16* pLength)
  8942. {
  8943. int ret = 0;
  8944. word16 length = 0;
  8945. byte semaphore[SEMAPHORE_SIZE] = {0};
  8946. switch (msgType) {
  8947. #ifndef NO_WOLFSSL_SERVER
  8948. case server_hello:
  8949. PF_VALIDATE_RESPONSE(ssl, semaphore);
  8950. #ifdef WOLFSSL_TLS13
  8951. if (IsAtLeastTLSv1_3(ssl->version)) {
  8952. XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
  8953. TURN_OFF(semaphore,
  8954. TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
  8955. #ifdef HAVE_SUPPORTED_CURVES
  8956. if (!ssl->options.noPskDheKe)
  8957. TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
  8958. #endif
  8959. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  8960. TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
  8961. #endif
  8962. }
  8963. #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
  8964. else {
  8965. #ifdef HAVE_SUPPORTED_CURVES
  8966. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
  8967. #endif
  8968. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  8969. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
  8970. #endif
  8971. }
  8972. #endif
  8973. #endif
  8974. break;
  8975. #ifdef WOLFSSL_TLS13
  8976. case hello_retry_request:
  8977. XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
  8978. TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
  8979. #ifdef HAVE_SUPPORTED_CURVES
  8980. if (!ssl->options.noPskDheKe)
  8981. TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
  8982. #endif
  8983. #ifdef WOLFSSL_SEND_HRR_COOKIE
  8984. TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
  8985. #endif
  8986. break;
  8987. #endif
  8988. #ifdef WOLFSSL_TLS13
  8989. case encrypted_extensions:
  8990. /* Send out all extension except those that are turned on. */
  8991. #ifdef HAVE_ECC
  8992. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
  8993. #endif
  8994. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
  8995. #ifdef HAVE_SESSION_TICKET
  8996. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SESSION_TICKET));
  8997. #endif
  8998. #ifdef HAVE_SUPPORTED_CURVES
  8999. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
  9000. #endif
  9001. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  9002. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
  9003. #endif
  9004. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  9005. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
  9006. #endif
  9007. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  9008. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
  9009. #endif
  9010. #if defined(HAVE_SECURE_RENEGOTIATION)
  9011. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_RENEGOTIATION_INFO));
  9012. #endif
  9013. break;
  9014. #ifdef WOLFSSL_EARLY_DATA
  9015. case session_ticket:
  9016. if (ssl->options.tls1_3) {
  9017. XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
  9018. TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
  9019. }
  9020. break;
  9021. #endif
  9022. #endif
  9023. #endif
  9024. #ifdef WOLFSSL_TLS13
  9025. #ifndef NO_CERTS
  9026. case certificate:
  9027. /* Don't send out any extension except those that are turned off. */
  9028. XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
  9029. TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
  9030. /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP,
  9031. * TLSX_SERVER_CERTIFICATE_TYPE
  9032. */
  9033. break;
  9034. #endif
  9035. #endif
  9036. }
  9037. #ifdef HAVE_QSH
  9038. /* change response if not using TLS_QSH */
  9039. if (!ssl->options.haveQSH) {
  9040. TLSX* ext = TLSX_Find(ssl->extensions, TLSX_QUANTUM_SAFE_HYBRID);
  9041. if (ext)
  9042. ext->resp = 0;
  9043. }
  9044. #endif
  9045. #ifdef HAVE_EXTENDED_MASTER
  9046. if (ssl->options.haveEMS && msgType == server_hello &&
  9047. !IsAtLeastTLSv1_3(ssl->version)) {
  9048. length += HELLO_EXT_SZ;
  9049. }
  9050. #endif
  9051. if (TLSX_SupportExtensions(ssl)) {
  9052. ret = TLSX_GetSize(ssl->extensions, semaphore, msgType, &length);
  9053. if (ret != 0)
  9054. return ret;
  9055. }
  9056. /* All the response data is set at the ssl object only, so no ctx here. */
  9057. if (length || msgType != server_hello)
  9058. length += OPAQUE16_LEN; /* for total length storage. */
  9059. *pLength += length;
  9060. return ret;
  9061. }
  9062. /** Writes the server hello extensions into a buffer. */
  9063. int TLSX_WriteResponse(WOLFSSL *ssl, byte* output, byte msgType, word16* pOffset)
  9064. {
  9065. int ret = 0;
  9066. word16 offset = 0;
  9067. if (TLSX_SupportExtensions(ssl) && output) {
  9068. byte semaphore[SEMAPHORE_SIZE] = {0};
  9069. switch (msgType) {
  9070. #ifndef NO_WOLFSSL_SERVER
  9071. case server_hello:
  9072. PF_VALIDATE_RESPONSE(ssl, semaphore);
  9073. #ifdef WOLFSSL_TLS13
  9074. if (IsAtLeastTLSv1_3(ssl->version)) {
  9075. XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
  9076. TURN_OFF(semaphore,
  9077. TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
  9078. #ifdef HAVE_SUPPORTED_CURVES
  9079. if (!ssl->options.noPskDheKe)
  9080. TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
  9081. #endif
  9082. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  9083. TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
  9084. #endif
  9085. }
  9086. #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
  9087. else {
  9088. #ifdef HAVE_SUPPORTED_CURVES
  9089. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
  9090. #endif
  9091. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  9092. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
  9093. #endif
  9094. }
  9095. #endif
  9096. #endif
  9097. break;
  9098. #ifdef WOLFSSL_TLS13
  9099. case hello_retry_request:
  9100. XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
  9101. TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
  9102. #ifdef HAVE_SUPPORTED_CURVES
  9103. if (!ssl->options.noPskDheKe)
  9104. TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
  9105. #endif
  9106. /* Cookie is written below as last extension. */
  9107. break;
  9108. #endif
  9109. #ifdef WOLFSSL_TLS13
  9110. case encrypted_extensions:
  9111. /* Send out all extension except those that are turned on. */
  9112. #ifdef HAVE_ECC
  9113. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
  9114. #endif
  9115. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
  9116. #ifdef HAVE_SESSION_TICKET
  9117. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SESSION_TICKET));
  9118. #endif
  9119. #ifdef HAVE_SUPPORTED_CURVES
  9120. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
  9121. #endif
  9122. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  9123. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
  9124. #endif
  9125. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  9126. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
  9127. #endif
  9128. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  9129. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
  9130. #endif
  9131. #if defined(HAVE_SECURE_RENEGOTIATION)
  9132. TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_RENEGOTIATION_INFO));
  9133. #endif
  9134. break;
  9135. #ifdef WOLFSSL_EARLY_DATA
  9136. case session_ticket:
  9137. if (ssl->options.tls1_3) {
  9138. XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
  9139. TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
  9140. }
  9141. break;
  9142. #endif
  9143. #endif
  9144. #endif
  9145. #ifdef WOLFSSL_TLS13
  9146. #ifndef NO_CERTS
  9147. case certificate:
  9148. /* Don't send out any extension except those that are turned
  9149. * off. */
  9150. XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
  9151. TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
  9152. /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP,
  9153. * TLSX_SERVER_CERTIFICATE_TYPE
  9154. */
  9155. break;
  9156. #endif
  9157. #endif
  9158. }
  9159. offset += OPAQUE16_LEN; /* extensions length */
  9160. ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
  9161. msgType, &offset);
  9162. if (ret != 0)
  9163. return ret;
  9164. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_SEND_HRR_COOKIE)
  9165. if (msgType == hello_retry_request) {
  9166. XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
  9167. TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
  9168. ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
  9169. msgType, &offset);
  9170. if (ret != 0)
  9171. return ret;
  9172. }
  9173. #endif
  9174. #ifdef HAVE_EXTENDED_MASTER
  9175. if (ssl->options.haveEMS && msgType == server_hello &&
  9176. !IsAtLeastTLSv1_3(ssl->version)) {
  9177. WOLFSSL_MSG("EMS extension to write");
  9178. c16toa(HELLO_EXT_EXTMS, output + offset);
  9179. offset += HELLO_EXT_TYPE_SZ;
  9180. c16toa(0, output + offset);
  9181. offset += HELLO_EXT_SZ_SZ;
  9182. }
  9183. #endif
  9184. if (offset > OPAQUE16_LEN || msgType != server_hello)
  9185. c16toa(offset - OPAQUE16_LEN, output); /* extensions length */
  9186. }
  9187. if (pOffset)
  9188. *pOffset += offset;
  9189. return ret;
  9190. }
  9191. #endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_SERVER */
  9192. #ifdef WOLFSSL_TLS13
  9193. int TLSX_ParseVersion(WOLFSSL* ssl, byte* input, word16 length, byte msgType,
  9194. int* found)
  9195. {
  9196. int ret = 0;
  9197. int offset = 0;
  9198. *found = 0;
  9199. while (offset < (int)length) {
  9200. word16 type;
  9201. word16 size;
  9202. if (offset + (2 * OPAQUE16_LEN) > length) {
  9203. ret = BUFFER_ERROR;
  9204. break;
  9205. }
  9206. ato16(input + offset, &type);
  9207. offset += HELLO_EXT_TYPE_SZ;
  9208. ato16(input + offset, &size);
  9209. offset += OPAQUE16_LEN;
  9210. if (offset + size > length) {
  9211. ret = BUFFER_ERROR;
  9212. break;
  9213. }
  9214. if (type == TLSX_SUPPORTED_VERSIONS) {
  9215. *found = 1;
  9216. WOLFSSL_MSG("Supported Versions extension received");
  9217. ret = SV_PARSE(ssl, input + offset, size, msgType);
  9218. break;
  9219. }
  9220. offset += size;
  9221. }
  9222. return ret;
  9223. }
  9224. #endif
  9225. /** Parses a buffer of TLS extensions. */
  9226. int TLSX_Parse(WOLFSSL* ssl, byte* input, word16 length, byte msgType,
  9227. Suites *suites)
  9228. {
  9229. int ret = 0;
  9230. word16 offset = 0;
  9231. byte isRequest = (msgType == client_hello ||
  9232. msgType == certificate_request);
  9233. #ifdef HAVE_EXTENDED_MASTER
  9234. byte pendingEMS = 0;
  9235. #endif
  9236. #if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
  9237. int pskDone = 0;
  9238. #endif
  9239. if (!ssl || !input || (isRequest && !suites))
  9240. return BAD_FUNC_ARG;
  9241. while (ret == 0 && offset < length) {
  9242. word16 type;
  9243. word16 size;
  9244. #if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
  9245. if (msgType == client_hello && pskDone)
  9246. return PSK_KEY_ERROR;
  9247. #endif
  9248. if (length - offset < HELLO_EXT_TYPE_SZ + OPAQUE16_LEN)
  9249. return BUFFER_ERROR;
  9250. ato16(input + offset, &type);
  9251. offset += HELLO_EXT_TYPE_SZ;
  9252. ato16(input + offset, &size);
  9253. offset += OPAQUE16_LEN;
  9254. if (offset + size > length)
  9255. return BUFFER_ERROR;
  9256. switch (type) {
  9257. #ifdef HAVE_SNI
  9258. case TLSX_SERVER_NAME:
  9259. WOLFSSL_MSG("SNI extension received");
  9260. #ifdef WOLFSSL_DEBUG_TLS
  9261. WOLFSSL_BUFFER(input + offset, size);
  9262. #endif
  9263. #if defined(WOLFSSL_TLS13) && defined(HAVE_SNI)
  9264. if (IsAtLeastTLSv1_3(ssl->version) &&
  9265. msgType != client_hello &&
  9266. msgType != server_hello &&
  9267. msgType != encrypted_extensions) {
  9268. return EXT_NOT_ALLOWED;
  9269. }
  9270. else if (!IsAtLeastTLSv1_3(ssl->version) &&
  9271. msgType == encrypted_extensions) {
  9272. return EXT_NOT_ALLOWED;
  9273. }
  9274. #endif
  9275. ret = SNI_PARSE(ssl, input + offset, size, isRequest);
  9276. break;
  9277. #endif
  9278. case TLSX_TRUSTED_CA_KEYS:
  9279. WOLFSSL_MSG("Trusted CA extension received");
  9280. #ifdef WOLFSSL_DEBUG_TLS
  9281. WOLFSSL_BUFFER(input + offset, size);
  9282. #endif
  9283. #if defined(WOLFSSL_TLS13) && defined(HAVE_TRUSTED_CA)
  9284. if (IsAtLeastTLSv1_3(ssl->version) &&
  9285. msgType != client_hello &&
  9286. msgType != encrypted_extensions) {
  9287. return EXT_NOT_ALLOWED;
  9288. }
  9289. #endif
  9290. ret = TCA_PARSE(ssl, input + offset, size, isRequest);
  9291. break;
  9292. case TLSX_MAX_FRAGMENT_LENGTH:
  9293. WOLFSSL_MSG("Max Fragment Length extension received");
  9294. #ifdef WOLFSSL_DEBUG_TLS
  9295. WOLFSSL_BUFFER(input + offset, size);
  9296. #endif
  9297. #if defined(WOLFSSL_TLS13) && defined(HAVE_MAX_FRAGMENT)
  9298. if (IsAtLeastTLSv1_3(ssl->version) &&
  9299. msgType != client_hello &&
  9300. msgType != encrypted_extensions) {
  9301. return EXT_NOT_ALLOWED;
  9302. }
  9303. else if (!IsAtLeastTLSv1_3(ssl->version) &&
  9304. msgType == encrypted_extensions) {
  9305. return EXT_NOT_ALLOWED;
  9306. }
  9307. #endif
  9308. ret = MFL_PARSE(ssl, input + offset, size, isRequest);
  9309. break;
  9310. case TLSX_TRUNCATED_HMAC:
  9311. WOLFSSL_MSG("Truncated HMAC extension received");
  9312. #ifdef WOLFSSL_DEBUG_TLS
  9313. WOLFSSL_BUFFER(input + offset, size);
  9314. #endif
  9315. #if defined(WOLFSSL_TLS13) && defined(HAVE_TRUNCATED_HMAC)
  9316. if (IsAtLeastTLSv1_3(ssl->version))
  9317. break;
  9318. #endif
  9319. ret = THM_PARSE(ssl, input + offset, size, isRequest);
  9320. break;
  9321. case TLSX_SUPPORTED_GROUPS:
  9322. WOLFSSL_MSG("Supported Groups extension received");
  9323. #ifdef WOLFSSL_DEBUG_TLS
  9324. WOLFSSL_BUFFER(input + offset, size);
  9325. #endif
  9326. #if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
  9327. if (IsAtLeastTLSv1_3(ssl->version) &&
  9328. msgType != client_hello &&
  9329. msgType != server_hello &&
  9330. msgType != encrypted_extensions) {
  9331. return EXT_NOT_ALLOWED;
  9332. }
  9333. else if (!IsAtLeastTLSv1_3(ssl->version) &&
  9334. msgType == encrypted_extensions) {
  9335. return EXT_NOT_ALLOWED;
  9336. }
  9337. #endif
  9338. ret = EC_PARSE(ssl, input + offset, size, isRequest);
  9339. break;
  9340. case TLSX_EC_POINT_FORMATS:
  9341. WOLFSSL_MSG("Point Formats extension received");
  9342. #ifdef WOLFSSL_DEBUG_TLS
  9343. WOLFSSL_BUFFER(input + offset, size);
  9344. #endif
  9345. #if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
  9346. if (IsAtLeastTLSv1_3(ssl->version))
  9347. break;
  9348. #endif
  9349. ret = PF_PARSE(ssl, input + offset, size, isRequest);
  9350. break;
  9351. case TLSX_STATUS_REQUEST:
  9352. WOLFSSL_MSG("Certificate Status Request extension received");
  9353. #ifdef WOLFSSL_DEBUG_TLS
  9354. WOLFSSL_BUFFER(input + offset, size);
  9355. #endif
  9356. #if defined(WOLFSSL_TLS13) && defined(HAVE_CERTIFICATE_STATUS_REQUEST)
  9357. if (IsAtLeastTLSv1_3(ssl->version) &&
  9358. msgType != client_hello &&
  9359. msgType != certificate_request &&
  9360. msgType != certificate) {
  9361. break;
  9362. }
  9363. #endif
  9364. ret = CSR_PARSE(ssl, input + offset, size, isRequest);
  9365. break;
  9366. case TLSX_STATUS_REQUEST_V2:
  9367. WOLFSSL_MSG("Certificate Status Request v2 extension received");
  9368. #ifdef WOLFSSL_DEBUG_TLS
  9369. WOLFSSL_BUFFER(input + offset, size);
  9370. #endif
  9371. #if defined(WOLFSSL_TLS13) && defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  9372. if (IsAtLeastTLSv1_3(ssl->version) &&
  9373. msgType != client_hello &&
  9374. msgType != certificate_request &&
  9375. msgType != certificate) {
  9376. return EXT_NOT_ALLOWED;
  9377. }
  9378. #endif
  9379. ret = CSR2_PARSE(ssl, input + offset, size, isRequest);
  9380. break;
  9381. #ifdef HAVE_EXTENDED_MASTER
  9382. case HELLO_EXT_EXTMS:
  9383. WOLFSSL_MSG("Extended Master Secret extension received");
  9384. #ifdef WOLFSSL_DEBUG_TLS
  9385. WOLFSSL_BUFFER(input + offset, size);
  9386. #endif
  9387. #if defined(WOLFSSL_TLS13)
  9388. if (IsAtLeastTLSv1_3(ssl->version))
  9389. break;
  9390. #endif
  9391. if (size != 0)
  9392. return BUFFER_ERROR;
  9393. #ifndef NO_WOLFSSL_SERVER
  9394. if (isRequest)
  9395. ssl->options.haveEMS = 1;
  9396. #endif
  9397. pendingEMS = 1;
  9398. break;
  9399. #endif
  9400. case TLSX_RENEGOTIATION_INFO:
  9401. WOLFSSL_MSG("Secure Renegotiation extension received");
  9402. #ifdef WOLFSSL_DEBUG_TLS
  9403. WOLFSSL_BUFFER(input + offset, size);
  9404. #endif
  9405. #if defined(WOLFSSL_TLS13) && defined(HAVE_SECURE_RENEGOTIATION)
  9406. if (IsAtLeastTLSv1_3(ssl->version))
  9407. break;
  9408. #endif
  9409. ret = SCR_PARSE(ssl, input + offset, size, isRequest);
  9410. break;
  9411. case TLSX_SESSION_TICKET:
  9412. WOLFSSL_MSG("Session Ticket extension received");
  9413. #ifdef WOLFSSL_DEBUG_TLS
  9414. WOLFSSL_BUFFER(input + offset, size);
  9415. #endif
  9416. #if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)
  9417. if (IsAtLeastTLSv1_3(ssl->version) &&
  9418. msgType != client_hello) {
  9419. return EXT_NOT_ALLOWED;
  9420. }
  9421. #endif
  9422. ret = WOLF_STK_PARSE(ssl, input + offset, size, isRequest);
  9423. break;
  9424. case TLSX_QUANTUM_SAFE_HYBRID:
  9425. WOLFSSL_MSG("Quantum-Safe-Hybrid extension received");
  9426. #ifdef WOLFSSL_DEBUG_TLS
  9427. WOLFSSL_BUFFER(input + offset, size);
  9428. #endif
  9429. #if defined(WOLFSSL_TLS13) && defined(HAVE_QSH)
  9430. if (IsAtLeastTLSv1_3(ssl->version))
  9431. break;
  9432. #endif
  9433. ret = QSH_PARSE(ssl, input + offset, size, isRequest);
  9434. break;
  9435. case TLSX_APPLICATION_LAYER_PROTOCOL:
  9436. WOLFSSL_MSG("ALPN extension received");
  9437. #ifdef WOLFSSL_DEBUG_TLS
  9438. WOLFSSL_BUFFER(input + offset, size);
  9439. #endif
  9440. #if defined(WOLFSSL_TLS13) && defined(HAVE_ALPN)
  9441. if (IsAtLeastTLSv1_3(ssl->version) &&
  9442. msgType != client_hello &&
  9443. msgType != server_hello &&
  9444. msgType != encrypted_extensions) {
  9445. return EXT_NOT_ALLOWED;
  9446. }
  9447. else if (!IsAtLeastTLSv1_3(ssl->version) &&
  9448. msgType == encrypted_extensions) {
  9449. return EXT_NOT_ALLOWED;
  9450. }
  9451. #endif
  9452. ret = ALPN_PARSE(ssl, input + offset, size, isRequest);
  9453. break;
  9454. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
  9455. case TLSX_SIGNATURE_ALGORITHMS:
  9456. WOLFSSL_MSG("Signature Algorithms extension received");
  9457. #ifdef WOLFSSL_DEBUG_TLS
  9458. WOLFSSL_BUFFER(input + offset, size);
  9459. #endif
  9460. if (!IsAtLeastTLSv1_2(ssl))
  9461. break;
  9462. #ifdef WOLFSSL_TLS13
  9463. if (IsAtLeastTLSv1_3(ssl->version) &&
  9464. msgType != client_hello &&
  9465. msgType != certificate_request) {
  9466. return EXT_NOT_ALLOWED;
  9467. }
  9468. #endif
  9469. ret = SA_PARSE(ssl, input + offset, size, isRequest, suites);
  9470. break;
  9471. #endif
  9472. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  9473. case TLSX_ENCRYPT_THEN_MAC:
  9474. WOLFSSL_MSG("Encrypt-Then-Mac extension received");
  9475. /* Ignore for TLS 1.3+ */
  9476. if (IsAtLeastTLSv1_3(ssl->version))
  9477. break;
  9478. ret = ETM_PARSE(ssl, input + offset, size, msgType);
  9479. break;
  9480. #endif /* HAVE_ENCRYPT_THEN_MAC */
  9481. #ifdef WOLFSSL_TLS13
  9482. case TLSX_SUPPORTED_VERSIONS:
  9483. WOLFSSL_MSG("Skipping Supported Versions - already processed");
  9484. #ifdef WOLFSSL_DEBUG_TLS
  9485. WOLFSSL_BUFFER(input + offset, size);
  9486. #endif
  9487. break;
  9488. #ifdef WOLFSSL_SEND_HRR_COOKIE
  9489. case TLSX_COOKIE:
  9490. WOLFSSL_MSG("Cookie extension received");
  9491. #ifdef WOLFSSL_DEBUG_TLS
  9492. WOLFSSL_BUFFER(input + offset, size);
  9493. #endif
  9494. if (!IsAtLeastTLSv1_3(ssl->version))
  9495. break;
  9496. if (msgType != client_hello &&
  9497. msgType != hello_retry_request) {
  9498. return EXT_NOT_ALLOWED;
  9499. }
  9500. ret = CKE_PARSE(ssl, input + offset, size, msgType);
  9501. break;
  9502. #endif
  9503. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  9504. case TLSX_PRE_SHARED_KEY:
  9505. WOLFSSL_MSG("Pre-Shared Key extension received");
  9506. #ifdef WOLFSSL_DEBUG_TLS
  9507. WOLFSSL_BUFFER(input + offset, size);
  9508. #endif
  9509. if (!IsAtLeastTLSv1_3(ssl->version))
  9510. break;
  9511. if (msgType != client_hello && msgType != server_hello)
  9512. return EXT_NOT_ALLOWED;
  9513. ret = PSK_PARSE(ssl, input + offset, size, msgType);
  9514. pskDone = 1;
  9515. break;
  9516. case TLSX_PSK_KEY_EXCHANGE_MODES:
  9517. WOLFSSL_MSG("PSK Key Exchange Modes extension received");
  9518. #ifdef WOLFSSL_DEBUG_TLS
  9519. WOLFSSL_BUFFER(input + offset, size);
  9520. #endif
  9521. if (!IsAtLeastTLSv1_3(ssl->version))
  9522. break;
  9523. if (msgType != client_hello)
  9524. return EXT_NOT_ALLOWED;
  9525. ret = PKM_PARSE(ssl, input + offset, size, msgType);
  9526. break;
  9527. #endif
  9528. #ifdef WOLFSSL_EARLY_DATA
  9529. case TLSX_EARLY_DATA:
  9530. WOLFSSL_MSG("Early Data extension received");
  9531. #ifdef WOLFSSL_DEBUG_TLS
  9532. WOLFSSL_BUFFER(input + offset, size);
  9533. #endif
  9534. if (!IsAtLeastTLSv1_3(ssl->version))
  9535. break;
  9536. if (msgType != client_hello && msgType != session_ticket &&
  9537. msgType != encrypted_extensions) {
  9538. return EXT_NOT_ALLOWED;
  9539. }
  9540. if (!IsAtLeastTLSv1_3(ssl->version) &&
  9541. (msgType == session_ticket ||
  9542. msgType == encrypted_extensions)) {
  9543. return EXT_NOT_ALLOWED;
  9544. }
  9545. ret = EDI_PARSE(ssl, input + offset, size, msgType);
  9546. break;
  9547. #endif
  9548. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  9549. case TLSX_POST_HANDSHAKE_AUTH:
  9550. WOLFSSL_MSG("Post Handshake Authentication extension received");
  9551. #ifdef WOLFSSL_DEBUG_TLS
  9552. WOLFSSL_BUFFER(input + offset, size);
  9553. #endif
  9554. if (!IsAtLeastTLSv1_3(ssl->version))
  9555. break;
  9556. if (msgType != client_hello)
  9557. return EXT_NOT_ALLOWED;
  9558. ret = PHA_PARSE(ssl, input + offset, size, msgType);
  9559. break;
  9560. #endif
  9561. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
  9562. case TLSX_SIGNATURE_ALGORITHMS_CERT:
  9563. WOLFSSL_MSG("Signature Algorithms extension received");
  9564. #ifdef WOLFSSL_DEBUG_TLS
  9565. WOLFSSL_BUFFER(input + offset, size);
  9566. #endif
  9567. if (!IsAtLeastTLSv1_3(ssl->version))
  9568. break;
  9569. if (msgType != client_hello &&
  9570. msgType != certificate_request) {
  9571. return EXT_NOT_ALLOWED;
  9572. }
  9573. if (!IsAtLeastTLSv1_3(ssl->version) &&
  9574. msgType == certificate_request) {
  9575. return EXT_NOT_ALLOWED;
  9576. }
  9577. ret = SAC_PARSE(ssl, input + offset, size, isRequest);
  9578. break;
  9579. #endif
  9580. case TLSX_KEY_SHARE:
  9581. WOLFSSL_MSG("Key Share extension received");
  9582. #ifdef WOLFSSL_DEBUG_TLS
  9583. WOLFSSL_BUFFER(input + offset, size);
  9584. #endif
  9585. #ifdef HAVE_SUPPORTED_CURVES
  9586. if (!IsAtLeastTLSv1_3(ssl->version))
  9587. break;
  9588. if (msgType != client_hello && msgType != server_hello &&
  9589. msgType != hello_retry_request) {
  9590. return EXT_NOT_ALLOWED;
  9591. }
  9592. #endif
  9593. ret = KS_PARSE(ssl, input + offset, size, msgType);
  9594. break;
  9595. #endif
  9596. default:
  9597. WOLFSSL_MSG("Unknown TLS extension type");
  9598. }
  9599. /* offset should be updated here! */
  9600. offset += size;
  9601. }
  9602. #ifdef HAVE_EXTENDED_MASTER
  9603. if (!isRequest && ssl->options.haveEMS && !pendingEMS)
  9604. ssl->options.haveEMS = 0;
  9605. #endif
  9606. if (ret == 0)
  9607. ret = SNI_VERIFY_PARSE(ssl, isRequest);
  9608. if (ret == 0)
  9609. ret = TCA_VERIFY_PARSE(ssl, isRequest);
  9610. return ret;
  9611. }
  9612. /* undefining semaphore macros */
  9613. #undef IS_OFF
  9614. #undef TURN_ON
  9615. #undef SEMAPHORE_SIZE
  9616. #endif /* HAVE_TLS_EXTENSIONS */
  9617. #ifndef NO_WOLFSSL_CLIENT
  9618. WOLFSSL_METHOD* wolfTLS_client_method(void)
  9619. {
  9620. return wolfTLS_client_method_ex(NULL);
  9621. }
  9622. WOLFSSL_METHOD* wolfTLS_client_method_ex(void* heap)
  9623. {
  9624. WOLFSSL_METHOD* method =
  9625. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  9626. heap, DYNAMIC_TYPE_METHOD);
  9627. (void)heap;
  9628. WOLFSSL_ENTER("TLS_client_method_ex");
  9629. if (method) {
  9630. #if defined(WOLFSSL_TLS13)
  9631. InitSSL_Method(method, MakeTLSv1_3());
  9632. #elif !defined(WOLFSSL_NO_TLS12)
  9633. InitSSL_Method(method, MakeTLSv1_2());
  9634. #elif !defined(NO_OLD_TLS)
  9635. InitSSL_Method(method, MakeTLSv1_1());
  9636. #elif defined(WOLFSSL_ALLOW_TLSV10)
  9637. InitSSL_Method(method, MakeTLSv1());
  9638. #else
  9639. #error No TLS version enabled!
  9640. #endif
  9641. method->downgrade = 1;
  9642. method->side = WOLFSSL_CLIENT_END;
  9643. }
  9644. return method;
  9645. }
  9646. #ifndef NO_OLD_TLS
  9647. #ifdef WOLFSSL_ALLOW_TLSV10
  9648. WOLFSSL_METHOD* wolfTLSv1_client_method(void)
  9649. {
  9650. return wolfTLSv1_client_method_ex(NULL);
  9651. }
  9652. WOLFSSL_METHOD* wolfTLSv1_client_method_ex(void* heap)
  9653. {
  9654. WOLFSSL_METHOD* method =
  9655. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  9656. heap, DYNAMIC_TYPE_METHOD);
  9657. (void)heap;
  9658. WOLFSSL_ENTER("TLSv1_client_method_ex");
  9659. if (method)
  9660. InitSSL_Method(method, MakeTLSv1());
  9661. return method;
  9662. }
  9663. #endif /* WOLFSSL_ALLOW_TLSV10 */
  9664. WOLFSSL_METHOD* wolfTLSv1_1_client_method(void)
  9665. {
  9666. return wolfTLSv1_1_client_method_ex(NULL);
  9667. }
  9668. WOLFSSL_METHOD* wolfTLSv1_1_client_method_ex(void* heap)
  9669. {
  9670. WOLFSSL_METHOD* method =
  9671. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  9672. heap, DYNAMIC_TYPE_METHOD);
  9673. (void)heap;
  9674. WOLFSSL_ENTER("TLSv1_1_client_method_ex");
  9675. if (method)
  9676. InitSSL_Method(method, MakeTLSv1_1());
  9677. return method;
  9678. }
  9679. #endif /* !NO_OLD_TLS */
  9680. #ifndef WOLFSSL_NO_TLS12
  9681. WOLFSSL_ABI
  9682. WOLFSSL_METHOD* wolfTLSv1_2_client_method(void)
  9683. {
  9684. return wolfTLSv1_2_client_method_ex(NULL);
  9685. }
  9686. WOLFSSL_METHOD* wolfTLSv1_2_client_method_ex(void* heap)
  9687. {
  9688. WOLFSSL_METHOD* method =
  9689. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  9690. heap, DYNAMIC_TYPE_METHOD);
  9691. (void)heap;
  9692. WOLFSSL_ENTER("TLSv1_2_client_method_ex");
  9693. if (method)
  9694. InitSSL_Method(method, MakeTLSv1_2());
  9695. return method;
  9696. }
  9697. #endif /* WOLFSSL_NO_TLS12 */
  9698. #ifdef WOLFSSL_TLS13
  9699. /* The TLS v1.3 client method data.
  9700. *
  9701. * returns the method data for a TLS v1.3 client.
  9702. */
  9703. WOLFSSL_ABI
  9704. WOLFSSL_METHOD* wolfTLSv1_3_client_method(void)
  9705. {
  9706. return wolfTLSv1_3_client_method_ex(NULL);
  9707. }
  9708. /* The TLS v1.3 client method data.
  9709. *
  9710. * heap The heap used for allocation.
  9711. * returns the method data for a TLS v1.3 client.
  9712. */
  9713. WOLFSSL_METHOD* wolfTLSv1_3_client_method_ex(void* heap)
  9714. {
  9715. WOLFSSL_METHOD* method = (WOLFSSL_METHOD*)
  9716. XMALLOC(sizeof(WOLFSSL_METHOD), heap,
  9717. DYNAMIC_TYPE_METHOD);
  9718. (void)heap;
  9719. WOLFSSL_ENTER("TLSv1_3_client_method_ex");
  9720. if (method)
  9721. InitSSL_Method(method, MakeTLSv1_3());
  9722. return method;
  9723. }
  9724. #endif /* WOLFSSL_TLS13 */
  9725. #ifdef WOLFSSL_DTLS
  9726. WOLFSSL_METHOD* wolfDTLS_client_method(void)
  9727. {
  9728. return wolfDTLS_client_method_ex(NULL);
  9729. }
  9730. WOLFSSL_METHOD* wolfDTLS_client_method_ex(void* heap)
  9731. {
  9732. WOLFSSL_METHOD* method =
  9733. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  9734. heap, DYNAMIC_TYPE_METHOD);
  9735. (void)heap;
  9736. WOLFSSL_ENTER("DTLS_client_method_ex");
  9737. if (method) {
  9738. #if !defined(WOLFSSL_NO_TLS12)
  9739. InitSSL_Method(method, MakeDTLSv1_2());
  9740. #elif !defined(NO_OLD_TLS)
  9741. InitSSL_Method(method, MakeDTLSv1());
  9742. #else
  9743. #error No DTLS version enabled!
  9744. #endif
  9745. method->downgrade = 1;
  9746. method->side = WOLFSSL_CLIENT_END;
  9747. }
  9748. return method;
  9749. }
  9750. #ifndef NO_OLD_TLS
  9751. WOLFSSL_METHOD* wolfDTLSv1_client_method(void)
  9752. {
  9753. return wolfDTLSv1_client_method_ex(NULL);
  9754. }
  9755. WOLFSSL_METHOD* wolfDTLSv1_client_method_ex(void* heap)
  9756. {
  9757. WOLFSSL_METHOD* method =
  9758. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  9759. heap, DYNAMIC_TYPE_METHOD);
  9760. (void)heap;
  9761. WOLFSSL_ENTER("DTLSv1_client_method_ex");
  9762. if (method)
  9763. InitSSL_Method(method, MakeDTLSv1());
  9764. return method;
  9765. }
  9766. #endif /* NO_OLD_TLS */
  9767. #ifndef WOLFSSL_NO_TLS12
  9768. WOLFSSL_METHOD* wolfDTLSv1_2_client_method(void)
  9769. {
  9770. return wolfDTLSv1_2_client_method_ex(NULL);
  9771. }
  9772. WOLFSSL_METHOD* wolfDTLSv1_2_client_method_ex(void* heap)
  9773. {
  9774. WOLFSSL_METHOD* method =
  9775. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  9776. heap, DYNAMIC_TYPE_METHOD);
  9777. (void)heap;
  9778. WOLFSSL_ENTER("DTLSv1_2_client_method_ex");
  9779. if (method)
  9780. InitSSL_Method(method, MakeDTLSv1_2());
  9781. (void)heap;
  9782. return method;
  9783. }
  9784. #endif /* !WOLFSSL_NO_TLS12 */
  9785. #endif /* WOLFSSL_DTLS */
  9786. #endif /* NO_WOLFSSL_CLIENT */
  9787. /* EITHER SIDE METHODS */
  9788. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
  9789. #ifndef NO_OLD_TLS
  9790. #ifdef WOLFSSL_ALLOW_TLSV10
  9791. /* Gets a WOLFSL_METHOD type that is not set as client or server
  9792. *
  9793. * Returns a pointer to a WOLFSSL_METHOD struct
  9794. */
  9795. WOLFSSL_METHOD* wolfTLSv1_method(void)
  9796. {
  9797. return wolfTLSv1_method_ex(NULL);
  9798. }
  9799. WOLFSSL_METHOD* wolfTLSv1_method_ex(void* heap)
  9800. {
  9801. WOLFSSL_METHOD* m;
  9802. WOLFSSL_ENTER("TLSv1_method");
  9803. #ifndef NO_WOLFSSL_CLIENT
  9804. m = wolfTLSv1_client_method_ex(heap);
  9805. #else
  9806. m = wolfTLSv1_server_method_ex(heap);
  9807. #endif
  9808. if (m != NULL) {
  9809. m->side = WOLFSSL_NEITHER_END;
  9810. }
  9811. return m;
  9812. }
  9813. #endif /* WOLFSSL_ALLOW_TLSV10 */
  9814. /* Gets a WOLFSL_METHOD type that is not set as client or server
  9815. *
  9816. * Returns a pointer to a WOLFSSL_METHOD struct
  9817. */
  9818. WOLFSSL_METHOD* wolfTLSv1_1_method(void)
  9819. {
  9820. return wolfTLSv1_1_method_ex(NULL);
  9821. }
  9822. WOLFSSL_METHOD* wolfTLSv1_1_method_ex(void* heap)
  9823. {
  9824. WOLFSSL_METHOD* m;
  9825. WOLFSSL_ENTER("TLSv1_1_method");
  9826. #ifndef NO_WOLFSSL_CLIENT
  9827. m = wolfTLSv1_1_client_method_ex(heap);
  9828. #else
  9829. m = wolfTLSv1_1_server_method_ex(heap);
  9830. #endif
  9831. if (m != NULL) {
  9832. m->side = WOLFSSL_NEITHER_END;
  9833. }
  9834. return m;
  9835. }
  9836. #endif /* !NO_OLD_TLS */
  9837. #ifndef WOLFSSL_NO_TLS12
  9838. /* Gets a WOLFSL_METHOD type that is not set as client or server
  9839. *
  9840. * Returns a pointer to a WOLFSSL_METHOD struct
  9841. */
  9842. WOLFSSL_METHOD* wolfTLSv1_2_method(void)
  9843. {
  9844. return wolfTLSv1_2_method_ex(NULL);
  9845. }
  9846. WOLFSSL_METHOD* wolfTLSv1_2_method_ex(void* heap)
  9847. {
  9848. WOLFSSL_METHOD* m;
  9849. WOLFSSL_ENTER("TLSv1_2_method");
  9850. #ifndef NO_WOLFSSL_CLIENT
  9851. m = wolfTLSv1_2_client_method_ex(heap);
  9852. #else
  9853. m = wolfTLSv1_2_server_method_ex(heap);
  9854. #endif
  9855. if (m != NULL) {
  9856. m->side = WOLFSSL_NEITHER_END;
  9857. }
  9858. return m;
  9859. }
  9860. #endif /* !WOLFSSL_NO_TLS12 */
  9861. #ifdef WOLFSSL_TLS13
  9862. /* Gets a WOLFSL_METHOD type that is not set as client or server
  9863. *
  9864. * Returns a pointer to a WOLFSSL_METHOD struct
  9865. */
  9866. WOLFSSL_METHOD* wolfTLSv1_3_method(void)
  9867. {
  9868. return wolfTLSv1_3_method_ex(NULL);
  9869. }
  9870. WOLFSSL_METHOD* wolfTLSv1_3_method_ex(void* heap)
  9871. {
  9872. WOLFSSL_METHOD* m;
  9873. WOLFSSL_ENTER("TLSv1_3_method");
  9874. #ifndef NO_WOLFSSL_CLIENT
  9875. m = wolfTLSv1_3_client_method_ex(heap);
  9876. #else
  9877. m = wolfTLSv1_3_server_method_ex(heap);
  9878. #endif
  9879. if (m != NULL) {
  9880. m->side = WOLFSSL_NEITHER_END;
  9881. }
  9882. return m;
  9883. }
  9884. #endif /* WOLFSSL_TLS13 */
  9885. #ifdef WOLFSSL_DTLS
  9886. WOLFSSL_METHOD* wolfDTLS_method(void)
  9887. {
  9888. return wolfDTLS_method_ex(NULL);
  9889. }
  9890. WOLFSSL_METHOD* wolfDTLS_method_ex(void* heap)
  9891. {
  9892. WOLFSSL_METHOD* m;
  9893. WOLFSSL_ENTER("DTLS_method_ex");
  9894. #ifndef NO_WOLFSSL_CLIENT
  9895. m = wolfDTLS_client_method_ex(heap);
  9896. #else
  9897. m = wolfDTLS_server_method_ex(heap);
  9898. #endif
  9899. if (m != NULL) {
  9900. m->side = WOLFSSL_NEITHER_END;
  9901. }
  9902. return m;
  9903. }
  9904. #ifndef NO_OLD_TLS
  9905. WOLFSSL_METHOD* wolfDTLSv1_method(void)
  9906. {
  9907. return wolfDTLSv1_method_ex(NULL);
  9908. }
  9909. WOLFSSL_METHOD* wolfDTLSv1_method_ex(void* heap)
  9910. {
  9911. WOLFSSL_METHOD* m;
  9912. WOLFSSL_ENTER("DTLSv1_method_ex");
  9913. #ifndef NO_WOLFSSL_CLIENT
  9914. m = wolfDTLSv1_client_method_ex(heap);
  9915. #else
  9916. m = wolfDTLSv1_server_method_ex(heap);
  9917. #endif
  9918. if (m != NULL) {
  9919. m->side = WOLFSSL_NEITHER_END;
  9920. }
  9921. return m;
  9922. }
  9923. #endif /* !NO_OLD_TLS */
  9924. #ifndef WOLFSSL_NO_TLS12
  9925. WOLFSSL_METHOD* wolfDTLSv1_2_method(void)
  9926. {
  9927. return wolfDTLSv1_2_method_ex(NULL);
  9928. }
  9929. WOLFSSL_METHOD* wolfDTLSv1_2_method_ex(void* heap)
  9930. {
  9931. WOLFSSL_METHOD* m;
  9932. WOLFSSL_ENTER("DTLSv1_2_method");
  9933. #ifndef NO_WOLFSSL_CLIENT
  9934. m = wolfDTLSv1_2_client_method_ex(heap);
  9935. #else
  9936. m = wolfDTLSv1_2_server_method_ex(heap);
  9937. #endif
  9938. if (m != NULL) {
  9939. m->side = WOLFSSL_NEITHER_END;
  9940. }
  9941. return m;
  9942. }
  9943. #endif /* !WOLFSSL_NO_TLS12 */
  9944. #endif /* WOLFSSL_DTLS */
  9945. #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
  9946. #ifndef NO_WOLFSSL_SERVER
  9947. WOLFSSL_METHOD* wolfTLS_server_method(void)
  9948. {
  9949. return wolfTLS_server_method_ex(NULL);
  9950. }
  9951. WOLFSSL_METHOD* wolfTLS_server_method_ex(void* heap)
  9952. {
  9953. WOLFSSL_METHOD* method =
  9954. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  9955. heap, DYNAMIC_TYPE_METHOD);
  9956. (void)heap;
  9957. WOLFSSL_ENTER("TLS_server_method_ex");
  9958. if (method) {
  9959. #if defined(WOLFSSL_TLS13)
  9960. InitSSL_Method(method, MakeTLSv1_3());
  9961. #elif !defined(WOLFSSL_NO_TLS12)
  9962. InitSSL_Method(method, MakeTLSv1_2());
  9963. #elif !defined(NO_OLD_TLS)
  9964. InitSSL_Method(method, MakeTLSv1_1());
  9965. #elif defined(WOLFSSL_ALLOW_TLSV10)
  9966. InitSSL_Method(method, MakeTLSv1());
  9967. #else
  9968. #error No TLS version enabled!
  9969. #endif
  9970. method->downgrade = 1;
  9971. method->side = WOLFSSL_SERVER_END;
  9972. }
  9973. return method;
  9974. }
  9975. #ifndef NO_OLD_TLS
  9976. #ifdef WOLFSSL_ALLOW_TLSV10
  9977. WOLFSSL_METHOD* wolfTLSv1_server_method(void)
  9978. {
  9979. return wolfTLSv1_server_method_ex(NULL);
  9980. }
  9981. WOLFSSL_METHOD* wolfTLSv1_server_method_ex(void* heap)
  9982. {
  9983. WOLFSSL_METHOD* method =
  9984. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  9985. heap, DYNAMIC_TYPE_METHOD);
  9986. (void)heap;
  9987. WOLFSSL_ENTER("TLSv1_server_method_ex");
  9988. if (method) {
  9989. InitSSL_Method(method, MakeTLSv1());
  9990. method->side = WOLFSSL_SERVER_END;
  9991. }
  9992. return method;
  9993. }
  9994. #endif /* WOLFSSL_ALLOW_TLSV10 */
  9995. WOLFSSL_METHOD* wolfTLSv1_1_server_method(void)
  9996. {
  9997. return wolfTLSv1_1_server_method_ex(NULL);
  9998. }
  9999. WOLFSSL_METHOD* wolfTLSv1_1_server_method_ex(void* heap)
  10000. {
  10001. WOLFSSL_METHOD* method =
  10002. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  10003. heap, DYNAMIC_TYPE_METHOD);
  10004. (void)heap;
  10005. WOLFSSL_ENTER("TLSv1_1_server_method_ex");
  10006. if (method) {
  10007. InitSSL_Method(method, MakeTLSv1_1());
  10008. method->side = WOLFSSL_SERVER_END;
  10009. }
  10010. return method;
  10011. }
  10012. #endif /* !NO_OLD_TLS */
  10013. #ifndef WOLFSSL_NO_TLS12
  10014. WOLFSSL_ABI
  10015. WOLFSSL_METHOD* wolfTLSv1_2_server_method(void)
  10016. {
  10017. return wolfTLSv1_2_server_method_ex(NULL);
  10018. }
  10019. WOLFSSL_METHOD* wolfTLSv1_2_server_method_ex(void* heap)
  10020. {
  10021. WOLFSSL_METHOD* method =
  10022. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  10023. heap, DYNAMIC_TYPE_METHOD);
  10024. (void)heap;
  10025. WOLFSSL_ENTER("TLSv1_2_server_method_ex");
  10026. if (method) {
  10027. InitSSL_Method(method, MakeTLSv1_2());
  10028. method->side = WOLFSSL_SERVER_END;
  10029. }
  10030. return method;
  10031. }
  10032. #endif /* !WOLFSSL_NO_TLS12 */
  10033. #ifdef WOLFSSL_TLS13
  10034. /* The TLS v1.3 server method data.
  10035. *
  10036. * returns the method data for a TLS v1.3 server.
  10037. */
  10038. WOLFSSL_ABI
  10039. WOLFSSL_METHOD* wolfTLSv1_3_server_method(void)
  10040. {
  10041. return wolfTLSv1_3_server_method_ex(NULL);
  10042. }
  10043. /* The TLS v1.3 server method data.
  10044. *
  10045. * heap The heap used for allocation.
  10046. * returns the method data for a TLS v1.3 server.
  10047. */
  10048. WOLFSSL_METHOD* wolfTLSv1_3_server_method_ex(void* heap)
  10049. {
  10050. WOLFSSL_METHOD* method =
  10051. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  10052. heap, DYNAMIC_TYPE_METHOD);
  10053. (void)heap;
  10054. WOLFSSL_ENTER("TLSv1_3_server_method_ex");
  10055. if (method) {
  10056. InitSSL_Method(method, MakeTLSv1_3());
  10057. method->side = WOLFSSL_SERVER_END;
  10058. }
  10059. return method;
  10060. }
  10061. #endif /* WOLFSSL_TLS13 */
  10062. #ifdef WOLFSSL_DTLS
  10063. WOLFSSL_METHOD* wolfDTLS_server_method(void)
  10064. {
  10065. return wolfDTLS_server_method_ex(NULL);
  10066. }
  10067. WOLFSSL_METHOD* wolfDTLS_server_method_ex(void* heap)
  10068. {
  10069. WOLFSSL_METHOD* method =
  10070. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  10071. heap, DYNAMIC_TYPE_METHOD);
  10072. (void)heap;
  10073. WOLFSSL_ENTER("DTLS_server_method_ex");
  10074. if (method) {
  10075. #if !defined(WOLFSSL_NO_TLS12)
  10076. InitSSL_Method(method, MakeDTLSv1_2());
  10077. #elif !defined(NO_OLD_TLS)
  10078. InitSSL_Method(method, MakeDTLSv1());
  10079. #else
  10080. #error No DTLS version enabled!
  10081. #endif
  10082. method->downgrade = 1;
  10083. method->side = WOLFSSL_SERVER_END;
  10084. }
  10085. return method;
  10086. }
  10087. #ifndef NO_OLD_TLS
  10088. WOLFSSL_METHOD* wolfDTLSv1_server_method(void)
  10089. {
  10090. return wolfDTLSv1_server_method_ex(NULL);
  10091. }
  10092. WOLFSSL_METHOD* wolfDTLSv1_server_method_ex(void* heap)
  10093. {
  10094. WOLFSSL_METHOD* method =
  10095. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  10096. heap, DYNAMIC_TYPE_METHOD);
  10097. (void)heap;
  10098. WOLFSSL_ENTER("DTLSv1_server_method_ex");
  10099. if (method) {
  10100. InitSSL_Method(method, MakeDTLSv1());
  10101. method->side = WOLFSSL_SERVER_END;
  10102. }
  10103. return method;
  10104. }
  10105. #endif /* !NO_OLD_TLS */
  10106. #ifndef WOLFSSL_NO_TLS12
  10107. WOLFSSL_METHOD* wolfDTLSv1_2_server_method(void)
  10108. {
  10109. return wolfDTLSv1_2_server_method_ex(NULL);
  10110. }
  10111. WOLFSSL_METHOD* wolfDTLSv1_2_server_method_ex(void* heap)
  10112. {
  10113. WOLFSSL_METHOD* method =
  10114. (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
  10115. heap, DYNAMIC_TYPE_METHOD);
  10116. WOLFSSL_ENTER("DTLSv1_2_server_method_ex");
  10117. (void)heap;
  10118. if (method) {
  10119. InitSSL_Method(method, MakeDTLSv1_2());
  10120. method->side = WOLFSSL_SERVER_END;
  10121. }
  10122. (void)heap;
  10123. return method;
  10124. }
  10125. #endif /* !WOLFSSL_NO_TLS12 */
  10126. #endif /* WOLFSSL_DTLS */
  10127. #endif /* NO_WOLFSSL_SERVER */
  10128. #endif /* NO_TLS */
  10129. #endif /* WOLFCRYPT_ONLY */